/*
Theme Name: CCAS-Homepage-V20 12Nov2026
Theme URI: https://ccasex.com
Author: Contact Centre Association of Singapore
Author URI: https://ccasex.com
Version: 20.2
Requires PHP: 7.4
Text Domain: ccas-homepage
Description: Official CCAS homepage theme. Content sourced from the verified, forensically-confirmed-clean pre-incident database export. Brand colours, logos and Poppins typography per the official CCAS brand guideline (Association Blue #047CC4, Service Light #CFE9F5, Anchor Grey #2B2B2B, Crest White #FFFFFF). v11/V2 folded Symposium 2026 in as an internal page. V3 added page-membership.php and page-our-members.php. V4 added page-data-protection-policy.php and restructured the primary nav into dropdowns. V4a fixes the Data Protection Policy page never actually rendering live. V5 adds page-contact.php: a Contact form deliberately NOT built on Fluent Forms/WPForms — submissions are validated, emailed to the Secretariat via wp_mail(), and never stored in the database. Nonce + honeypot + IP rate-limit (transient only, no message content stored). V5a adds three enhancements: Cloudflare Turnstile CAPTCHA (self-disables until real site/secret keys are set), a thank-you auto-reply email to the visitor ("we'll get back to you within 5 business days"), and an explicit From header on both outgoing emails. V5b (same day) bakes in the real Turnstile Site Key/Secret Key from Andrew's "CCAS Captcha" Cloudflare widget (Managed mode, ccas.org.sg + www.ccas.org.sg) — CCAS_TURNSTILE_ENABLED now evaluates true, so the widget is live. V5c (same day) corrects the Membership tier pricing Andrew flagged as wrong: Individual S$175/yr (S$100 joining fee), Associate S$405/yr (S$380 joining fee), Corporate S$825/yr (S$380 joining fee), GST updated from 8% to 9% across all tiers to match the Symposium page. V5d (same day) corrects the Individual tier's one-time joining fee a second time: S$100 -> S$110 (annual fee, Associate/Corporate figures, and GST unchanged from V5c). V6 (same day) adds page-membership-signup.php: a single Membership Sign-Up form covering all three tiers via a dropdown (pre-selected from the Membership page's Apply buttons via ?tier=individual/associate/corporate, still editable), same mail-only/no-storage pattern and Turnstile widget as Contact. Organisation/Company Name and Job Title are required for every tier so the Secretariat can vet who's applying before approving; a visible notice and the applicant's acknowledgement email both state the application is not a membership confirmation. See page-membership-signup.php and ccas_handle_membership_signup_submit() in functions.php.

V7 (13 Aug 2026) — built from the V6 base above, adds three things in one pass: (1) a teaser video in a new #symp-watch section between the Symposium page's Hero and About, sourced from an earlier microsite iteration and supplied directly by Andrew (see the Media-Library note below for how the video is actually delivered — this changed same day); (2) Secretariat notification emails for all three forms (Contact, Membership Sign-Up, and the new Symposium Register form below) now send as an HTML table — row-per-submission, one header row of field labels plus one data row of values — so the Secretariat can copy/paste each notification straight into a spreadsheet, since nothing is stored in the database; applicant-facing thank-you/acknowledgement emails stay plain text. See ccas_notification_table() in functions.php. (3) A new "Register Your Interest" form inline in the Symposium page's #symp-register section (replacing the old "Register Now" mailto button) — collects Name, Designation, Organisation, Email, Contact Number and a ticket-count dropdown (1-5 or "More than 5"), with a PDPA consent checkbox and an approval-style notice that this doesn't confirm registration or ticket allocation. Handler: ccas_handle_symposium_register_submit() in functions.php; new "sr-" prefixed CSS classes below. Also worth noting: the live site has moved hosts, from Hostinger to Vodien (confirmed by Andrew, still live at ccas.org.sg, Google Workspace mail unaffected) — the SPF-mismatch mail-deliverability issue flagged for Hostinger applies identically here and remains unresolved by Andrew's explicit choice for now. (Note: this build was first packaged as "CCAS-Homepage-V3.0 13Aug2026" per an initial instruction to restart the version-label sequence; renamed same day back to the original sequential VN-DDMonYYYY convention, continuing on from V6, after Andrew hit an "expired link" error uploading the V3.0-named zip and asked to revert the naming.)

Also same day: the "expired link" error turned out to actually be Vodien's PHP upload-size limit rejecting the ~9.5MB zip (WordPress surfaces an over-limit POST as a misleading nonce-expired message, not a clear file-size error) — confirmed by successfully uploading a much smaller old zip (V6, ~1.8MB) with no issue. Fix: the ~35MB/~7.5MB-compressed teaser video is no longer bundled into the theme zip at all. Instead, page-symposium.php now reads the video (and, optionally, a poster image) via get_theme_mod(), set through a new Appearance -> Customize -> "Symposium 2026 Video" section (ccas_symposium_video_customizer() in functions.php) that uses WordPress's native Media Library upload control — Andrew uploads the video there directly, no new theme zip needed to change it in future. The #symp-watch section hides itself entirely until a video URL is set (same self-disabling pattern as Turnstile), so nothing ships broken in the meantime. This is a deliberate one-off exception to the theme's usual "no Media Library" pattern, made specifically because of the upload-size constraint — everything else in the theme is unchanged. Theme zip dropped from ~9.5MB back down to ~2MB, well under typical host limits.
V8 (25 Aug 2026) adds three things: (1) Google Workspace SMTP relay for wp_mail() — fixes the SPF-mismatch bug flagged since V5a/V5b where applicant-facing acknowledgement emails (Contact, Membership Sign-Up, Symposium Register) were failing to deliver because the host's raw PHP mail() sent as `From: secretariat@ccas.org.sg`, a domain whose SPF record only authorises Google Workspace. Self-disabling until a Google Workspace App Password is supplied — see ccas_configure_smtp() in functions.php for full activation steps. (2) The Events page now separates Upcoming (a placeholder card when nothing is scheduled) from Past Events; the "From Firefighting to Growth" webinar (21 Aug) has moved to Past Events now that its date has passed, with copy switched to past tense and its registration CTA removed. (3) A new "Speakers" section on the Symposium page, between Programme and the Panel Highlight — displays the new speakers-only poster (cropped from the full event poster, no QR code) with the same click-to-enlarge lightbox already used for event posters.
V8a (25 Aug 2026, same day) adds Wiz.AI as a new Community Sponsor for the Symposium 2026, under Zoom. New "Community" tier introduced (sponsor-logo--community, max-height 30px) — the smallest tier yet, sitting below Visionary (42px), since Community is the lowest sponsorship level. Logo cropped tight to its artwork before adding, per the theme's standing sponsor-logo convention. Wiz.AI's logo is centred within its column (Andrew flagged it reading as left-aligned/unbalanced at this smaller size) — other tiers unchanged, still left-aligned as before.
V8b (25 Aug 2026, same day) bakes in the real Google Workspace App Password for secretariat@ccas.org.sg — CCAS_SMTP_ENABLED now evaluates true, so wp_mail() is live-routing through Google Workspace's SMTP servers for every outgoing email sitewide. This is the SMTP fix described under V8 actually taking effect; no other code changed.
V8c (25 Aug 2026, same day) makes Zoom's and Wiz.AI's sponsor logos and name headings clickable, linking out to zoom.us and www.wiz.ai respectively (new tab), with a hover state (logo fades, name underlines). ServiceNow and Toku left unchanged — Andrew confirmed their existing inline-link-in-blurb pattern is fine as-is.
V8d (25 Aug 2026, same day) links "WIZ.AI" at the start of its blurb text to www.wiz.ai, matching the existing ServiceNow/Toku inline-link-in-blurb pattern.
V8e (25 Aug 2026, same day) fixes a spot Andrew caught: the homepage's own "Upcoming Events" preview card (front-page.php, separate and independently hardcoded from page-events.php) was still showing the now-past Firefighting webinar with its "Contact Secretariat to Register" CTA, since the Events-page fix in V8 never touched this section. Replaced with the same "New events coming soon" placeholder treatment, styled to match this card's white/dashed-border look, with a "View All Events" link through to the real Events page.
V8f (25 Aug 2026, same day) fixes a stale-copy mismatch Andrew caught on a live-site review: the Panel Debate section's meta line still read "11:30 – 12:30 · Panellists to be announced" — leftover placeholder text that never got updated when the Programme table's actual slot (16:00, 45 minutes) was finalised, or when the three Panel Debate panellists (Angela Yeo, Jasmine Gunaratnam, Steven Khor) were confirmed on the new speakers poster. Now reads "16:00 – 16:45 · Panellists: Angela Yeo (Trust Bank), Jasmine Gunaratnam (AIG Asia Pacific Insurance), Steven Khor (Tech Mahindra)", matching both the Programme table and the poster.
V9 (25 Aug 2026) — new naming convention starting here per Andrew's instruction: version number bumps (V9, V10, ...) rather than the old sequential-letter suffixes; same-day iterations on the same version now use the date as the differentiator instead of a letter suffix (e.g. a second V9 patch today would still say "25Aug2026" rather than becoming "V9a"). This build adds homepage hero photos: a standalone "Homepage Photos" admin page (own top-level wp-admin menu, NOT under Appearance → Customize) where Andrew can upload up to 5 photos directly from the Media Library. Deliberately stored as a plain wp_option (ccas_hero_photos) rather than a Customizer theme_mod — a direct fix for the exact problem hit earlier today, where the Symposium video's Customizer setting silently reset on every theme zip swap because theme_mods are keyed to the active theme's stylesheet folder name, which this project's own versioning convention changes on every patch. A plain option has no such dependency, so hero photos now survive theme updates indefinitely. Front-end behaviour: 0 photos set renders the original plain hero exactly as before (fully self-disabling, zero risk to the existing site); 1 photo renders a static full-width photo background with smaller text sized to suit; 2-5 photos adds a 5-second crossfade rotation with dot indicators, plus a hover-reveal effect (overlay lightens, photo does a subtle zoom, text fades down, and rotation pauses) on desktop pointer devices — all confirmed against Andrew's approved mock-up before building.
Same day (25 Aug 2026), later: adds mobile/tablet-specific hero heights. The hero photo section was a fixed 440px tall regardless of screen width, which meant on a phone (~390px wide) the crop ratio was nearly square (~0.9:1) — badly cropping any wide-composed photo down to a narrow center sliver. Now steps down to 380px at ≤900px (tablet, ~2.0:1) and 300px at ≤600px (phone, ~1.3:1). Desktop is unchanged. Per Andrew's direction, same-day iterations on this build now keep the same folder/zip name (V9 25Aug2026) rather than getting a letter suffix — the date is the differentiator, and re-uploading the same-named zip should let WordPress prompt to replace it in place instead of adding yet another theme folder.
Same day (25 Aug 2026), later still: temporarily hides the Symposium page's Speakers poster section, per Andrew's request. Not deleted — wrapped behind a new CCAS_SHOW_SPEAKERS_POSTER constant (defaulted false) in functions.php, so it's a one-word flip back to true whenever it's ready to return, no rebuild needed.
Same day (25 Aug 2026), later still: the Symposium Speakers poster section is switched back on, using Andrew's updated poster (Web_Poster_V2.png — same 7 speakers, Zack Chan's organisation corrected to "FairPrice Group"). CCAS_SHOW_SPEAKERS_POSTER left in place as a named toggle (now true) rather than removed, so it can be hidden again in one step if ever needed.
29 Aug 2026: Symposium Early Bird pricing updated per Andrew — the "Register by 31 Aug 2026" deadline and the S$580 Standard rate are removed; CCAS Members now see a single Early Bird S$500 rate marked "Extended till further notice." Non-Members rate (S$1,200) unchanged.
01 Sep 2026: label updated to today's date (still "V9" — no version bump, since the actual code content is unchanged from the last build; this is purely bringing the folder/zip name in line with the real calendar date after a few days' gap between sessions).
01 Sep 2026, corrected: Andrew clarified the Standard S$580 rate should stay — only the "From 1 Sep 2026" date note was meant to be removed, not the whole line. Standard S$580 restored under CCAS Members, sitting below Early Bird (now marked "Extended till further notice", no date attached to either rate).
V10 (1 Sep 2026) — Events becomes a proper Custom Post Type. Previously, adding or editing any event meant hand-editing page-events.php and shipping a new theme zip; this is what caused the "From Firefighting to Growth" webinar to sit in Upcoming for days after its date had passed, twice. Now: Events → Add New in wp-admin, exactly like writing any normal post — Title, the standard content editor, Featured Image as the poster, plus a small "Event Details" box (Event Date, Event Time, Platform/Venue). Event Date is the ONLY thing that decides Upcoming vs. Past — computed fresh on every page load, nothing to toggle or remember. Registration is always an automatic "Contact Secretariat to Register" mailto button built from the event title, per Andrew's "keep it simple" instruction — no field needed. Both page-events.php and the homepage's "Don't miss what's next" card now pull from this CPT dynamically instead of hardcoded content; the homepage card shows the single soonest upcoming event, or the "New events coming soon" placeholder if none exists. The previous hardcoded Firefighting webinar is migrated automatically on first load (one-time, idempotent) into a real Event post — including sideloading its existing poster into the Media Library as its Featured Image — so nothing visibly changes for site visitors during the switch, and from this point on it's just an ordinary, editable/deletable post like any other event.
Same day (1 Sep 2026): Symposium Speakers poster updated to Web_Poster_V3.png — Zack Chan (Lead Customer Service, FairPrice Group) removed from the lineup, confirmed intentional by Andrew. Now 6 speakers: Gerry Chng, Kwan Wei Jie, Angela Yeo, Jasmine Gunaratnam, Steven Khor, Darrel Ang.
03 Sep 2026: label corrected to today's actual date (still "V10" — no functional changes, this is purely bringing the folder/zip name in line with the real calendar date).
Same day (3 Sep 2026), bugfix: the Firefighting seed function ran twice live, creating two duplicate "From Firefighting to Growth" event posts — the option-flag "run once" guard alone wasn't a fully atomic safeguard against near-simultaneous requests. Added a second, independent check (query for an existing post with that exact title before inserting) so this can't happen again regardless of the cause. Andrew needs to manually delete one of the two duplicate posts already created on the live site — this fix only prevents a third one, it doesn't clean up the existing duplicate.
Same day (3 Sep 2026), Events CPT refined per Andrew's feedback after testing: (1) the rich content editor is removed entirely — replaced with a plain-text Description textarea in the Event Details meta box, so there's no way to accidentally change font colours or insert images/media that could skew the homepage card layout; the Featured Image remains the only image an event needs. (2) Registration is no longer always-mailto — a new radio choice lets Andrew pick "Contact Secretariat" (unchanged default) or "Registration Link" (reveals a URL field, e.g. for a Luma event page), with the button label and destination adjusting automatically. (3) The homepage's "Don't miss what's next" card now shows a trimmed ~30-word excerpt of the description rather than the full text, so a longer event (with an agenda, say) doesn't stretch that section — the Events page itself still shows the full description. Also fixes a real bug found during testing: the Firefighting auto-migration ran twice live, creating a duplicate post — a second, independent title-based check now guards against this regardless of cause; Andrew needed to manually delete the extra duplicate once, this only prevents a third one.
Same day (3 Sep 2026): adds an optional "Sub-Header" field to the Event Details meta box — a short italic tagline shown right under the event title, above the description (e.g. "The evolution of customer experience"). Shows on both the Events page (Upcoming and Past) and the homepage card. Leave blank to skip it — most events won't need one.
Same day (3 Sep 2026): homepage "Don't miss what's next" card's CTA changed from a register/mailto button to a single "View Event →" button linking to the Events page — Andrew's call that homepage visitors are unlikely to register straight from a preview card, so it now nudges toward learning more instead. The old duplicate "View All Events" text link was removed since it pointed to the same place. Registration itself is unaffected — it still lives on the actual Events page.
Same day (3 Sep 2026): the homepage's "Don't miss what's next" card now rotates through up to 5 upcoming events (previously it only ever showed the single soonest one, staying static even if more than one event was upcoming). With exactly 1 upcoming event, behaviour is unchanged — a static card, no rotation UI. With 2+, it swaps between full event cards (poster, title, sub-header, excerpt, meta, View Event button) every 5 seconds, with dot indicators showing how many are in the queue. Uses a display:none/grid swap rather than a crossfade, since each event's card can be a different height (varying description length, presence of a poster) — an opacity crossfade would have risked an awkward overlap; a clean swap avoids that regardless of content length.
Same day (3 Sep 2026), important bugfix: found and fixed the actual root cause of the homepage rotation appearing broken (both events showing at once instead of one hiding). The theme's own wp_enqueue_style() call was passing a hardcoded '1.0.0' as the cache-busting version — never tied to the real style.css Version header, which has been correctly bumped on every change. Since same-day patches reuse the same theme folder name (Andrew's convention), the CSS file's URL was byte-identical across every re-upload today, so browsers had zero reason to ever re-fetch a fresh copy — confirmed not fixable by cache-busting the page URL itself, since that's a separately cached asset request. Fixed by tying the version to wp_get_theme()->get('Version') instead, so every real style.css change (i.e. every future Version bump) now correctly forces browsers to fetch the new CSS. Applied the same fix to the nav.js script enqueue for consistency, so this can't recur there either.
Same day (3 Sep 2026): fixes the homepage event rotator visibly resizing every time it swapped between events of different content lengths (a longer description, or one missing a poster, made the whole section jump taller/shorter every 5 seconds — distracting, per Andrew). JS now measures every card's natural height on load (briefly, invisibly, within a single synchronous script tick) and locks the wrapper to the tallest one; cards then crossfade via opacity instead of a display swap, and each card is vertically centred within that fixed-height box (rather than pinned to the top) so a shorter event doesn't look off-balance with dead space hanging below it. Falls back gracefully to the plain single-card display if JavaScript is unavailable.
Same day (3 Sep 2026), bugfix: the fixed-height rotator was still visibly resizing — root cause was the height measurement running before poster images had actually finished loading, so any card whose image hadn't loaded yet got measured too short, then grew once the image arrived. Measurement now waits for the page's full "load" event (not just DOM-ready) so every poster image has its real rendered height before the wrapper height gets locked in, with a readyState check so it still runs immediately if the page had already finished loading by the time the script executed.
Same day (3 Sep 2026), found the actual root cause: the wrapper-height lock (previous fix) only accounted for the TEXT column's varying length — the poster image itself was still sized with height:auto, meaning each event's photo rendered at its own natural aspect ratio. Since different events' posters genuinely have different proportions (one closer to square, one more portrait, from Andrew's real test events), the poster area itself was the visibly-resizing "box" on every swap, independent of the already-fixed overall section height. Fixed by giving the poster a fixed 4:5 aspect-ratio box with object-fit:cover (crops to fill consistently) instead of sizing to the image's own natural proportions — every event's poster now renders at an identical size/shape regardless of the uploaded photo's actual dimensions. Confirmed with Andrew that page/browser caching was not the cause (ruled out via incognito, hard refresh, and a fresh cache-busting query string) before concluding this was a genuine remaining code gap.
10 Sep 2026: label updated to today's actual date (a week's gap since the last session — no functional changes from that alone). Symposium Speakers poster updated to Web_Poster_V4.png — Jasmine Gunaratnam removed, Zack Chan re-added (both confirmed intentional by Andrew). Now 6 speakers: Gerry Chng, Kwan Wei Jie, Angela Yeo, Darrel Ang, Steven Khor, Zack Chan.
V12 (10 Sep 2026) — adds the GCX Awards page (page-awards.php), applied automatically to a WordPress Page with the slug "awards". Covers the CCAS Global Customer Experience Excellence Awards 2026, the renamed successor to the 25-year-old CCAS Contact Centre International Awards. Structured around where the 2026 cycle actually is: nominations, templates, submissions and judging are done, so the page leads with the one live action left — booking a seat at the Gala Dinner on 6 November at Marina Bay Sands — then works backwards into reference material that stays useful year-round (categories with the judges' definitions, the CX Centre seat-size rule, the cycle timeline, past winners). A live countdown to the Gala Dinner sits in the hero and hides itself automatically once the date passes.

Four sections are controlled from a new standalone "GCX Awards" admin page (own top-level wp-admin menu, dashicons-awards) and each stays completely hidden on the live site until it has content AND has been ticked to show: (1) Judges poster, (2) Awards Results poster plus an optional results PDF — release on the night of the Gala Dinner, (3) the highlight reel of last year's Gala Dinner, and (4) the Gala Dinner booking block itself, including its Early Bird and Standard seat prices and a booking URL (blank falls back to a pre-filled mailto to awards@ccas.org.sg, same pattern as the Events CPT's "Contact Secretariat"). Also on that admin page: the Past Results archive — add a year, give it a label, point it at a PDF or image in the Media Library. Adding 2027's results next year needs no code change and no theme zip.

All of it stored in ONE plain wp_option (ccas_gcx_awards), deliberately NOT a Customizer theme_mod, for the same reason as the V9 hero photos: theme_mods are keyed to the active theme's stylesheet folder name, which this project's versioning convention changes on every patch, so a theme_mod silently resets on every upload. The highlight reel takes a YouTube or Vimeo URL (rendered as a privacy-friendly youtube-nocookie / Vimeo player iframe) or a Media Library MP4 — deliberately never bundled into the theme zip, which is what caused the failed ~9.5MB upload back in August. Every section self-disables when empty, so nothing ships broken. New nav entry "GCX Awards 2026" added to ccas_default_nav_fallback() after CX Symposium 2026; if a real menu is set under Appearance → Menus, the fallback does not run and the Awards page has to be added to that menu by hand. Styling lives in style.css under "GCX AWARDS PAGE", scoped to .awards-page with "gcx-" prefixed class names and its own local navy/gold custom properties, so it cannot collide with the rest of the site.

Same day (10 Sep 2026), revised per Andrew's answers on the four open points. (1) Gala Dinner booking is no longer a link/mailto button — it is now an inline "Request your seats" form in #gcx-gala, built to the same mail-only, nothing-stored pattern as Membership Sign-Up and Symposium Register ("do it like what you did for my membership, straight to an email"), with nonce, honeypot, per-IP rate limit, Turnstile, PDPA consent checkbox, an HTML-table notification and an applicant acknowledgement. The one difference from the other forms: the notification goes to awards@ccas.org.sg rather than secretariat@ (the Awards Secretariat runs its own inbox), with From left as the SMTP-authorised secretariat@ account and Reply-To pointing back to Awards. The seat dropdown is built around 10-per-table seating (1-9 seats, 1 table, more than 1 table) rather than a plain ticket count, plus an optional notes field for seating and dietary requests. Handler: ccas_handle_awards_book_submit(). The "Booking link" admin field and the mailto helpers are gone with it. The Gala section is now a dark navy band with a white form card, matching the site's established registration pattern on #symp-register, with the seat rates moved into the left column. (2) The Awards timeline is now behind its own show/hide toggle, defaulted OFF: every 2026 milestone has passed, and the timeline poster and the Call For Entry deck disagree on nomination, template and submission dates (poster: 2 Mar / 31 Mar / 14 Apr / 23 Apr / 22 May; deck: 5 Mar / 16 Apr / 24 Apr / 30 Apr / 4 Jun). Andrew's call was to leave it, so nothing disputed gets published; the dates are still hardcoded in page-awards.php and want correcting before the 2027 cycle switches this back on. (3) Past Winners is likewise behind its own toggle, defaulted OFF, while Andrew consolidates the back catalogue — the archive rows can be filled in from wp-admin now and the whole section published later, and the hero's "Past Winners" button hides with it. (4) The highlight reel is an MP4 Andrew already has, so the admin help text now leads with the Media Library route and warns that the same PHP upload limit which rejected the 9.5MB theme zip in August applies there too (roughly 8MB), with unlisted YouTube as the fallback rather than fighting the host limit.

Same day (10 Sep 2026), categories condensed. Andrew's read: the categories section was too long, and with 2026 judging finished the judges' full definitions are not doing any work on the page. They are not deleted, since they matter again the moment the 2027 Call For Entry opens. Instead, the category data has moved out of the template into ccas_gcx_categories() in functions.php as a single source, and the section now renders from it in one of two ways depending on a new "Full definitions" toggle in wp-admin (defaulted OFF): condensed, as a two-column list of category names with their seat bands and New-for-2026 tags; or expanded, as the previous accordion rows carrying every definition plus the CX Centre seat-size explainer. That takes roughly 3,000px off the page height. The condensed list is deliberately borderless rows rather than an enclosed grid of cells, because a group with an odd number of categories left a blank tile at the end that read as a missing item. Group headings are also regrouped and renamed (Corporate: Organisation & Programme / Capability & Innovation, Mystery Shopper Programme, Individual: Leadership / Frontline & Specialist / Long Service), and the section lead now states the real count: 24 categories, 34 awarded titles once seat bands are counted. Also fixed here: the seat-band tag was written with HTML entities and passed through esc_html(), so it rendered literally as "UNDER 20 &MIDDOT; 20&NDASH;100" on the page; it now uses real characters. Separately, em dashes have been taken out of all visitor-facing and wp-admin copy across the Awards page, to match Andrew's house style (British/Singapore English, plain and direct, no em dashes); code comments are unchanged.

Same day (10 Sep 2026), countdown given a running effect per Andrew. Two changes. First, a Seconds cell joins Days/Hours/Minutes and the timer now ticks every second rather than every 30, so something in the panel is always moving; all four cells still sit on one row at phone width. Second, every value change animates: the old number slides out through the top of its cell while the new one rises in from below, done with two absolutely-positioned spans inside an overflow-hidden cell and a pair of .42s keyframes, with the outgoing node removed on a timer so the cells cannot accumulate stale spans. On first paint each figure counts up from zero over 750ms with an ease-out curve, so the panel arrives already in motion. Visitors with prefers-reduced-motion set skip both the count-up and the slide and simply get the numbers, and the same media query disables the keyframes in CSS. Numbers are tabular-nums so the cells do not jitter as digits change width.

V13 (11 Sep 2026) — adds the AI Summit as the third marquee event, restructures the navigation, and unifies the mechanics shared by all three event pages. Supersedes the V12 zip, which was never deployed; deploy this one instead.

(1) New page-aisummit.php, applied to a Page with the slug "ai-summit". The 2027 edition is not planned out yet, so while the "Coming soon" state is on it works as a holding page: it states what is known, says plainly that the rest is to be confirmed, recaps the 2026 edition, and collects interest. Andrew's steer was a menu entry that is honest about the state rather than a dead "coming soon" link that spends a click and returns nothing; the 2026 edition had a paying audience, so the list is worth building before the full page exists. Register-interest form uses the same mail-only, nothing-stored pattern as every other form on the site (nonce, honeypot, per-IP rate limit, Turnstile, PDPA consent), emailing secretariat@ccas.org.sg with an acknowledgement to the visitor. Handler: ccas_handle_ais_interest_submit(). A new "AI Summit" admin page (own top-level menu, lightbulb icon, one wp_option ccas_ai_summit) controls the menu entry, the coming-soon state, the interest form, and the When / Venue / Theme lines, so none of those need a theme zip to change.

(2) AI Summit identity, taken from the real 2026 collateral rather than invented: ground is the deep violet #37187D running into #692090, sampled from 2026 AI Summit Poster R2.png; accent is the electric cyan #00BBDE from that poster's "Secure Your Seat" bracket; the signature device is the existing lightbulb-and-circuit mark with "Make It Real", added at assets/aisummit/. The poster's yellow starburst is a pricing promo device and is deliberately not part of the core palette. That completes the set: Symposium charcoal and blue, GCX Awards navy and gold, AI Summit violet and cyan, with CCAS blue still present in the chrome of all three.

(3) Navigation restructured. Sponsors & Partners is followed by a single Events dropdown containing All Events, CX Symposium 2026, GCX Awards 2026 and AI Summit 2027 (with a small "Coming soon" tag), replacing the three separate top-level event entries. That takes the top level from eight items to six and, more to the point, stops the nav growing by one every time an event edition is added. The AI Summit entry hides entirely when its menu toggle is off.

(4) Event mechanics unified, per the design-system decision recorded in the project. A new shared token block (--evt-rhythm, --evt-radius, --evt-tint, --evt-border, --evt-muted, --evt-body, --evt-eyebrow-*) is declared once for .symposium-page, .awards-page and .aisummit-page together, and both existing pages now consume it instead of their own hardcoded values: section rhythm is 90px everywhere (Symposium was a mix of 80/84/90, Awards was 76), card and panel radius is 10px everywhere (Awards was 12 and 14), eyebrows are 11px at 0.2em (Symposium was 10.5px), and the light band is one shared #F7FBFD. Applied to the page wrappers rather than by renaming classes, so the existing symp- and gcx- class names are untouched and the diff stays small. Each event still sets only its three identity levers. page-aisummit.php is built on these tokens from the start, which is the pattern any future event page should follow. The homepage is deliberately NOT included here — it is still on the old 100px rhythm, 8px radius and 13px eyebrow, and harmonising it is its own separate change so any regression is obviously attributable.

Same day (11 Sep 2026): the three event entries in the Events dropdown now only render when their Page actually exists and is published (ccas_page_is_live()). Two reasons. Activating a new theme build before creating the matching Page previously put a live menu item on the site that led straight to a 404, which would have happened to GCX Awards and AI Summit on this very deployment. And setting a Page back to Draft left the menu pointing at nothing. So after testing, hiding the AI Summit is now either one tick (wp-admin -> AI Summit -> Menu entry) to drop it from the menu while the page stays reachable by direct URL, or setting the Page to Draft, which removes the menu entry and the page together. The two are independent and can be used in either combination.

Same day (11 Sep 2026), size cut after an install failure. The V13 upload failed on Vodien with "The package could not be installed. The theme is missing the style.css stylesheet." The zip itself was verified correct (single top-level folder, style.css present at its root), which points at the upload or the extraction on the host rather than the package. To take the size variable off the table entirely, the bundled Firefighting event poster (assets/events/firefighting-to-growth-poster.png, 769KB, over a third of the whole zip) has been removed. It was only ever needed by ccas_seed_firefighting_event() for the one-time migration in V10, that seed already ran on the live site and set ccas_events_seeded, the event now carries its own Media Library attachment, and the seed already guards the file with file_exists() so its absence changes nothing. Zip drops from about 2.21MB to roughly 1.5MB, comfortably below the 2.03MB V11 zip that is known to install on this host. No code, markup or styling changed.

Same day (11 Sep 2026), two fixes from Andrew's first test pass on the live site.

(1) The AI Summit page rendered as a bare title with no content. Cause: the template was named page-aisummit.php while the Page's slug is "ai-summit". WordPress matches page-{slug}.php character for character, so with no hyphen it never matched and the request fell through to the generic page.php. Renamed to page-ai-summit.php, with a note in its header that the hyphen is load-bearing. Nothing else about the page changed. Worth remembering for any future event page: the filename has to mirror the slug exactly.

(2) Dropdown menus closed the instant the pointer moved toward them, which made them nearly unusable. The submenu sits 18px below its parent so it lands flush with the nav's bottom padding, and that 18px was dead, unhoverable space: crossing it dropped :hover on the parent and display:none fired immediately, with no tolerance for a wobble. This has been present since the dropdowns went in on 10 Aug and affected About Us and Membership too; the new four-item Events dropdown just made it obvious. Fixed with CSS only, no JS. A transparent bridge element now spans the gap, rendered only while the parent is hovered or focused so it never sits over the page otherwise. And the reveal moved off display:none onto visibility/opacity, which allows the hide to be delayed: leaving holds for 120ms before fading and only drops visibility at 280ms, while arriving is still instant. Keyboard focus-within behaviour is unchanged, prefers-reduced-motion drops the slide, and the mobile breakpoint still renders submenus inline and always open.

V14 (22 Sep 2026) adds a new wp-admin page, Event Speakers, so the Symposium speakers poster can be changed from wp-admin without a new theme zip. Pick the poster from the Media Library, tick Show, save. Stored in its own plain wp_option (ccas_speakers), keyed by event, so it survives theme uploads and is ready to take the AI Summit 2027 poster later. If no poster is picked, the page falls back to the poster bundled in the theme, which this build updates to the latest version (7 speakers, Michael Clark of CrayonIQ added). The old CCAS_SHOW_SPEAKERS_POSTER constant is replaced by the Show tick box. Speaker cards (individual name/title/photo entries) are deliberately not built yet. Also: Alison Yuen removed from Meet the Team, and the Executive Committee, now six people, is laid out 3 + 3 on desktop (2 per row on mobile, unchanged).

V17 05Oct2026 (style.css 17.0), one month before the Symposium: (1) Running countdown in the Symposium page hero (days, hours, minutes, seconds to 5 Nov 2026 09:00 Singapore time), reusing the GCX Awards roll animation in Symposium blue; shows 'Happening now' during the event and removes itself after 17:30. (2) Days-only 'N days to go' line in the homepage Symposium band, counted by the Singapore calendar; 'Happening today' on the day, gone after. (3) Both have their own tick box on wp-admin -> Event Speakers -> Display (default on); event start/end live in ccas_speakers_events(). (4) Symposium Early Bird removed at Andrew's request: CCAS Members rate now reads S$580 only. Rollback: V16a 29Sep2026.
V18 23Oct2026 (style.css 18.0): GCX Awards judge profiles. New wp-admin -> GCX Awards -> Judges page (own wp_option ccas_gcx_judges, survives theme uploads): add, remove and drag-to-reorder judges with photo, name, judging role, job title, organisation, bio (150 words max) and LinkedIn; Feature tick box for the Chairlady; Show tick box and a Cards / Poster / Both choice. The Judges Show tick box and poster moved here from the main GCX Awards page and carry over their saved values. Pre-filled with the 2026 panel from the judges poster (Shirin Anne Wan as Chairlady plus 12 judges), with headshots cropped from it in assets/judges/. On /awards/ the section is navy with the Chairlady in her own column beside a 4-across grid (3 at tablet, 2 on phones); judges with a bio open a profile drawer with a Book Gala Dinner seats button. Same build also adds the AI Summit 2027 page (page-ai-summit.php, rebuilt from the signed-off AI Summit 2027 website brief of 23 Oct 2026, kept unpublished): sticky in-page bar, hero, theme, at a glance, five topic cards in the brief's colour code, format, agenda, speakers, passes, who attends, sponsor tiers and benefits, speaking slot rules, key dates, next steps, key terms, past editions, About CCAS, FAQ and contact, all in the brief's wording. Event Speakers gains an 'AI Summit 2027' event (agenda skeleton from the brief, Until times, a Topic per row shown as a tag on rows and speaker cards, no placeholder speakers). wp-admin -> AI Summit now holds the brief's to-be-confirmed items (date and venue line, tagline, hero note, Early Bird dates, registration link, prospectus PDF) with the brief's fallback text, plus a new Sponsor enquiry form (mail-only to secretariat@ccas.org.sg); the register-interest form now asks for designation. /aisummit2027 redirects to the page once it is published. Rollback: V17 05Oct2026.
V18a 27Oct2026 (style.css 18.1): judge cards now open a profile when they have a LinkedIn link but no bio (before, only a bio made a card clickable); the About heading hides when there is no bio. Rollback: V18 23Oct2026. Same-day patch 18.2: wp-admin -> AI Summit gains a Sections list to show or hide each part of the AI Summit 2027 page (and the parts of the Sponsor section); hidden sections also drop out of the sticky bar.
V16a 29Sep2026 (style.css 16.4, date label moved on from 25Sep2026): Sponsors & Partners Zoom logo replaced with Zoom's supplied 2026 file (Zoom_Logo_Bloom_RGB, sent by Constance Tan 23 Sep), resized to the same 705px width. Visually near-identical to the old file; Zoom asked for the current version to be used.
V16a 25Sep2026 patch (style.css 16.3): speaker bios capped at 150 words (live word counter in wp-admin, Save blocked while any bio is over, trimmed on save as a backstop, and any longer bio already saved is cut to 150 words with an ellipsis on the page). Profile drawer: LinkedIn link and Register your interest button each on their own line.
V16a 25Sep2026 patch (style.css 16.2): Event Speakers admin script now waits for page load. WordPress loads jquery-ui-sortable in the footer, so the inline script's .sortable() call threw before the speaker pickers were drawn, leaving 'Speakers' empty and drag-to-reorder dead. Init moved into jQuery(function(){}), pickers drawn before sortable, sortable guarded.
V16a 25Sep2026 (variant of V16, style.css 16.1): same editor, but the built-in programme is exactly the V15 programme with no speakers linked, so activating it changes nothing on the page. Kenneth stays as detail text on the Chairman rows; the Featured Panel line keeps the V15 panellists until they are linked in the programme. Adds 'Reset programme to the V15 version' and 'Reset speakers to the built-in list' buttons, which drop the saved copy so the built-in one is read again (needed if anything was saved while V16 was active). Rollback: V15 25Sep2026.
V16 25Sep2026: Symposium speaker profiles and programme editor. wp-admin -> Event Speakers now has three tabs. Speakers: each person once (name, organisation, job title, photo, bio, LinkedIn, show-on-cards tick). Programme: the day's rows (time, row type, label, title, talk title, detail) with speakers picked from the Speakers tab by id, '+ New speaker' inline, drag to reorder, sort by time. Display: speakers section as cards, poster (the V14 behaviour) or hidden; 'To be announced' card; programme on/off and speaker links. All stored in the existing ccas_speakers wp_option (V14 'show' and 'poster' keys still honoured). Until first save the page reads built-in defaults: today's line-up and the 19-row programme that was hardcoded in page-symposium.php. The Speakers section stays on Poster until Andrew switches it to cards. Front end: programme rows show speaker chips; speaker cards (3/2/1 across) labelled from their programme slot; panellists in a dark strip; right-hand profile drawer (Esc/scrim to close); Featured Panel meta line now built from the data. Headshots for six speakers cropped from their individual posters, bundled in assets/speakers/people/ and referenced as 'theme:<file>' tokens so they survive folder renames. Rollback: V15 25Sep2026.
V15 25Sep2026 (same V15, fixes only): (1) Homepage hero buttons did nothing once hero photos were set. The photo-variant CSS carried pointer-events: none on .btn-primary and .btn-outline, so both 'Explore CCAS' and 'Regional CX Symposium 2026' ignored clicks. Removed, buttons raised above the overlay, and the misleading cursor: pointer on the whole hero dropped. (2) Sponsors & Partners: Zoom Gold Sponsor write-up replaced with Zoom's new supplied copy, links now go to zoom.com.
V15 24Sep2026 (same V15, fix only): the Homepage Photos picker saved WordPress's 1024px 'large' copy of each photo, which the full-width hero then stretched to 1300 to 1900px wide (plus the 1.06 hover zoom), so every photo looked low quality. It now saves the full-size image (WordPress caps uploads at 2560px). Photos already saved keep their old small URL until they are re-picked in wp-admin -> Homepage Photos. Nothing else changed.
V15 (23 Sep 2026) brings the homepage onto the same mechanics as the three event pages, per Andrew's approved mockup (homepage-harmonise-mockup.html, all five changes kept). Scoped to body.home only, so interior pages (Membership, Our Members, Sponsors, Meet the Team) are untouched. (1) Section spacing 100px to 90px (the stats strip keeps its own padding). (2) Eyebrow labels 13px/2px to 11px/0.2em. (3) Section headings 34px fixed to clamp(26px,3vw,38px) at line-height 1.2, with the event pages' 36x3px blue divider underneath (new .hp-divider after each h2.section-title in front-page.php). (4) Card corners 8px to 10px on the stats box, Mission/Vision box and offer cards; stat hover tiles 6px to 7px. (5) The Offers band moves from Service Light #CFE9F5 to the event tint #F7FBFD with #DAEDF8-outlined cards, so it no longer merges with the Upcoming Events band below it, which stays Service Light. Hero, nav, footer, events rotator, Symposium banner, buttons and all copy unchanged.
V14 23Sep2026 (same V14, dated today per Andrew) builds the GCX Awards Past Winners section, covering 2016 to 2025 (Andrew's call: from 2016, ten years, leaving out the cut-off 2014 file and the less consistent early years). It sits in the existing, previously empty Past Winners slot between Categories and Enquiries, so nothing else on the page changes. A row of year buttons (newest first) and one panel: the picked year's cover thumbnail, its label, and a gold "View YEAR results (PDF)" button. The PDF always opens in a new tab and never loads with the page; thumbnails are small JPGs and the hidden years' thumbnails are lazy-loaded. Dark navy band like the highlight reel. The archive rows on wp-admin -> GCX Awards gain a "Cover thumbnail" image picker next to the Results PDF (thumbnail optional: without one a plain navy card with the year shows). The section and the hero's Past Winners button still stay hidden until Show is ticked AND at least one row is filled. Also: an after_switch_theme hook now copies the Symposium teaser video Customizer settings across theme folder renames, so the video cannot silently drop off after a new zip is activated.
V19 (7 Nov 2026) — Events everywhere agree. Feedback after the Symposium and Gala: AI Summit 2027 sat below two finished events in the Events dropdown and All Events still said "New events coming soon", because the three flagship pages (Symposium, GCX Awards, AI Summit) were never part of the Events listing. (1) New ccas_flagship_events() registry in functions.php feeds the Events dropdown (All Events, then upcoming flagship events soonest first, then past ones most recent first), the /events/ page (flagship cards merged by date into Upcoming and Past, see ccas_flagship_card()) and the homepage Upcoming card. AI Summit 2027 orders by a new "Provisional date" on wp-admin -> AI Summit (never shown; default 22 Apr 2027). (2) Appearance -> Menus, which the theme has supported since V4, gets a safety net for hand-built menus: items pointing at unpublished pages are dropped, and the CSS class `coming-soon` (or the AI Summit's own toggle) adds the Coming soon pill. (3) .nav-tag finally gets CSS: the Coming soon tag had been plain text since V18. (4) AI Summit page: video section between the hero and About (wp-admin -> AI Summit -> Video; Media Library file or YouTube/Vimeo link, hidden until set), using the same embed renderer as the GCX highlight reel. New CSS: .nav-tag, .event-card--flagship, .flagship-panel, .flagship-tag, .btn-secondary, #ais-watch.
V19 19.1 (same day): the homepage hero's second button follows the soonest upcoming flagship event from the same registry (AI Summit 2027 now) instead of the hardcoded Symposium link.
V20 (12 Nov 2026): Meet the Team job titles and companies updated. Kenneth Chong: Director, Copilot and Agents (Asia), Microsoft. Shirin Anne Wan: Zscaler -> Dynatrace (job title unchanged). Jonathan Mondon: Head of Revenue, Activeo. Elliot Ang: Associate Director, TDCX. No other changes.
V20 20.1 (same day): corrected against the Secretariat's list. Elliot Ang: Assistant Director, TDCX (not Associate Director). Vivien Ong: Founder, Lead Trainer & Coach, uSpark Solutions. Bernard Yeo: Director, Customer Success, Zscaler.
V20 20.2 (same day): confirmed list from the Secretariat. Jonathan Mondon: company Activeo -> Toku. Shirin Anne Wan: Customer Success APJ, Dynatrace. Kenneth Chong: company shown as Microsoft.
*/



  @font-face {
    font-family: 'Poppins';
    font-style: normal;
    font-weight: 300;
    font-display: swap;
    src: url('assets/fonts/Poppins-Light.ttf') format('truetype');
  }
  @font-face {
    font-family: 'Poppins';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url('assets/fonts/Poppins-Regular.ttf') format('truetype');
  }
  @font-face {
    font-family: 'Poppins';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url('assets/fonts/Poppins-Medium.ttf') format('truetype');
  }
  @font-face {
    font-family: 'Poppins';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('assets/fonts/Poppins-SemiBold.ttf') format('truetype');
  }
  @font-face {
    font-family: 'Poppins';
    font-style: normal;
    font-weight: 700;
    font-display: swap;
    src: url('assets/fonts/Poppins-Bold.ttf') format('truetype');
  }
  @font-face {
    font-family: 'Poppins';
    font-style: normal;
    font-weight: 800;
    font-display: swap;
    src: url('assets/fonts/Poppins-ExtraBold.ttf') format('truetype');
  }


  :root {
    --blue: #047CC4;
    --light: #CFE9F5;
    --grey: #2B2B2B;
    --white: #FFFFFF;
  }

  * { box-sizing: border-box; margin: 0; padding: 0; }

  body {
    font-family: 'Poppins', 'Calibri', Arial, sans-serif;
    color: var(--grey);
    background: var(--white);
    line-height: 1.6;
  }

  a { text-decoration: none; color: inherit; }
  ul { list-style: none; }

  .mockup-banner {
    background: #fff3cd;
    color: #664d03;
    text-align: center;
    font-size: 13px;
    padding: 8px 16px;
    font-weight: 500;
    border-bottom: 1px solid #ffe69c;
  }

  .wrap { max-width: 1180px; margin: 0 auto; padding: 0 32px; }

  /* NAV */
  nav {
    background: var(--grey);
    padding: 18px 0;
    position: relative;
  }
  /* Nav sizing note (v10a): the wrap is widened to 1320px for the nav only, and
     nav links are set to white-space: nowrap. Previously the link set was too
     wide for the 1180px wrap, so items wrapped onto two lines ("About / Us")
     and the whole menu overflowed, visually colliding with the logo. If more
     nav items are added later and it crowds again, reduce the gap below before
     reducing the font size — the links are already at a sensible minimum.

     Updated 10 Aug 2026 (Membership page added, 9th top-level item — "Our
     Members" deliberately kept OUT of the top nav for exactly this reason,
     see functions.php). Two things had to change, found by measuring actual
     rendered box widths at a 1280px viewport (the narrowest width this site
     is checked at — mobile nav takes over below 900px) rather than eyeballing
     a screenshot:
     1) A real latent bug, present on every page sharing this header even
        before Membership was added: "Become a Member" had no
        white-space: nowrap, unlike the nav links. Flex items shrink to fit
        their container down to their own min-content width — for the links
        that floor is the full (nowrap) text, but for the button it was just
        its widest single word ("Become"), so once the row got tight the
        browser squeezed the button into a ~90px box and wrapped its label
        across three lines instead of shrinking something else. Fixed by
        pinning the logo and the button to flex-shrink: 0 with
        white-space: nowrap on the button, so neither can be squeezed below
        its real content width.
     2) With both pinned, the 9-item link row plus button genuinely no
        longer fit within the 1280px viewport (measured ~80px overflow past
        the viewport edge, not just the padding edge — nowrap alone just
        traded "wraps ugly" for "clips off the right edge"). Closed the gap
        with three small cuts rather than one big one: wrap gap 40->14px,
        the two internal nav gaps 26->10px each, nav-link font-size
        15->14px, and the button's own padding tightened for the nav
        context only (18px sides instead of 24px — other .btn-primary
        buttons elsewhere on the site are untouched). Re-measured after via
        bounding boxes (not eyeballed): the logo<->nav-menu gap now sits at
        ~87px, well above its 14px minimum, meaning there's real slack —
        space-between just parks that slack in the middle and pins the
        button flush against the right padding edge, which is the correct,
        non-overflowing resting state, not a sign of a tight fit. If another
        nav item is ever added, redo this same bounding-box measurement
        (check whether the logo<->nav-menu gap is still above its CSS
        minimum) rather than eyeballing a screenshot — that's what caught
        the original overflow. */
  nav .wrap {
    display: flex;
    align-items: center;
    justify-content: space-between;
    max-width: 1320px;
    gap: 14px;
  }
  nav .wrap > a { flex-shrink: 0; }
  nav img.logo { height: 38px; display: block; }
  nav .nav-menu { display: flex; align-items: center; gap: 10px; }
  nav ul.navlinks { display: flex; gap: 10px; align-items: center; }
  nav .nav-menu > a.btn-primary { white-space: nowrap; flex-shrink: 0; padding: 11px 18px; }
  nav ul.navlinks a {
    color: var(--white);
    font-weight: 500;
    font-size: 14px;
    opacity: 0.9;
    white-space: nowrap;
  }
  nav ul.navlinks a:hover { opacity: 1; color: var(--blue); }

  /* Dropdown submenus (Andrew, 10 Aug 2026): "About Us" and "Membership" are
     now parents with one level of children ("What We Offer"/"Meet the Team",
     and "Our Members" respectively), wired through WordPress's native menu
     system (wp_nav_menu depth increased 1->2 in header.php) so this also
     renders correctly for a menu built by hand under Appearance -> Menus —
     WP's default walker adds class="menu-item-has-children" to a parent <li>
     and wraps its children in <ul class="sub-menu"> on its own, no custom
     walker needed. Both parent links stay clickable (About Us still goes to
     #about) — the dropdown is an add-on affordance, not a replacement.
     Desktop: CSS-only hover/focus reveal, no JS. Mobile (<=900px): the
     submenu is always expanded/indented inline, no second tap required —
     see the mobile override further down. Net effect: top-level nav items
     dropped from 9 to 7, which is why this fits more comfortably than the
     bounding-box-measured tight fit documented above; that measurement is
     now conservative headroom rather than the live constraint. */
  nav ul.navlinks li { position: relative; }
  nav ul.navlinks li.menu-item-has-children > a {
    display: inline-flex;
    align-items: center;
    gap: 5px;
  }
  nav ul.navlinks li.menu-item-has-children > a::after {
    content: '';
    width: 0;
    height: 0;
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
    border-top: 4px solid currentColor;
    opacity: 0.7;
  }
  /* The submenu sits 18px below the parent so it lands flush with the nav's
     own bottom padding. That 18px was dead, unhoverable space: the moment the
     pointer entered it the parent lost :hover and the menu vanished instantly,
     which made the dropdowns nearly unusable (Andrew, 11 Sep 2026). Two fixes,
     both CSS-only. First, a transparent bridge spanning the gap, rendered only
     while the parent is hovered so it never sits over the page otherwise.
     Second, the reveal moved off display:none onto visibility/opacity so the
     hide can be delayed, giving roughly a quarter-second of grace for the
     pointer to cross or wobble. */
  nav ul.navlinks li.menu-item-has-children::before {
    content: '';
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
    height: 20px;
  }
  nav ul.navlinks li.menu-item-has-children:hover::before,
  nav ul.navlinks li.menu-item-has-children:focus-within::before {
    display: block;
  }
  nav ul.navlinks .sub-menu {
    display: block;
    visibility: hidden;
    opacity: 0;
    transform: translateY(-6px);
    /* Leaving: hold for 120ms, fade out, and only drop visibility at 280ms. */
    transition: opacity .16s ease .12s, transform .16s ease .12s, visibility 0s linear .28s;
    position: absolute;
    top: 100%;
    left: 0;
    margin-top: 18px;
    min-width: 200px;
    background: var(--grey);
    border-top: 2px solid var(--blue);
    box-shadow: 0 16px 28px rgba(0,0,0,0.32);
    padding: 6px 0;
    z-index: 30;
  }
  nav ul.navlinks li.menu-item-has-children:hover > .sub-menu,
  nav ul.navlinks li.menu-item-has-children:focus-within > .sub-menu {
    visibility: visible;
    opacity: 1;
    transform: translateY(0);
    /* Arriving: no delay at all. */
    transition: opacity .16s ease, transform .16s ease, visibility 0s;
  }
  @media (prefers-reduced-motion: reduce) {
    nav ul.navlinks .sub-menu { transform: none; transition: visibility 0s linear .28s; }
    nav ul.navlinks li.menu-item-has-children:hover > .sub-menu,
    nav ul.navlinks li.menu-item-has-children:focus-within > .sub-menu {
      transform: none; transition: visibility 0s;
    }
  }
  nav ul.navlinks .sub-menu li { width: 100%; }
  nav ul.navlinks .sub-menu a {
    display: block;
    padding: 12px 20px;
    font-size: 14px;
    white-space: nowrap;
    opacity: 0.9;
  }
  nav ul.navlinks .sub-menu a:hover {
    opacity: 1;
    color: var(--blue);
    background: rgba(255,255,255,0.06);
  }

  /* Mobile nav toggle (hamburger) — hidden on desktop, shown under 900px */
  .nav-toggle {
    display: none;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    width: 34px;
    height: 34px;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    z-index: 20;
  }
  .nav-toggle span {
    display: block;
    width: 100%;
    height: 2px;
    background: var(--white);
    border-radius: 2px;
    transition: transform 0.25s ease, opacity 0.2s ease;
  }
  nav.nav-open .nav-toggle span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
  nav.nav-open .nav-toggle span:nth-child(2) { opacity: 0; }
  nav.nav-open .nav-toggle span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

  .btn-primary {
    background: var(--blue);
    color: var(--white);
    padding: 11px 24px;
    border-radius: 4px;
    font-weight: 600;
    font-size: 14px;
    display: inline-block;
  }
  .btn-outline {
    border: 1.5px solid var(--white);
    color: var(--white);
    padding: 10px 22px;
    border-radius: 4px;
    font-weight: 600;
    font-size: 14px;
    display: inline-block;
  }

  /* HERO */
  header.hero {
    background: var(--grey);
    color: var(--white);
    padding: 90px 0 100px;
  }
  header.hero .eyebrow {
    text-transform: uppercase;
    letter-spacing: 2px;
    font-size: 13px;
    font-weight: 600;
    color: var(--blue);
    margin-bottom: 18px;
  }
  header.hero h1 {
    font-size: 48px;
    font-weight: 800;
    max-width: 780px;
    line-height: 1.2;
    margin-bottom: 24px;
  }
  header.hero p.lead {
    font-size: 18px;
    font-weight: 300;
    max-width: 620px;
    opacity: 0.88;
    margin-bottom: 36px;
  }
  header.hero .cta-row { display: flex; gap: 16px; }

  /* HERO — photo variant (V9, 25 Aug 2026). Only applied when Andrew has
     uploaded at least one hero photo via wp-admin → Homepage Photos; see
     the ccas_hero_photos_admin_page() comment in functions.php for why
     this is a plain wp_option rather than a Customizer setting. With zero
     photos set, header.hero above renders exactly as it always has. */
  header.hero.hero--photo {
    padding: 0;
    position: relative;
    overflow: hidden;
    height: 440px;
  }
  header.hero.hero--photo .hero-slide {
    position: absolute;
    inset: 0;
    background-size: cover;
    background-position: center;
    opacity: 0;
    transform: scale(1);
    transition: opacity 1.4s ease, transform 6s ease;
  }
  header.hero.hero--photo .hero-slide.active { opacity: 1; }
  header.hero.hero--photo:hover .hero-slide.active { transform: scale(1.06); }
  header.hero.hero--photo .hero-overlay {
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg, rgba(43,43,43,.5) 0%, rgba(43,43,43,.82) 70%, rgba(43,43,43,.93) 100%);
    display: flex;
    align-items: flex-end;
    z-index: 2;
    transition: background 0.5s ease;
  }
  header.hero.hero--photo:hover .hero-overlay {
    background: linear-gradient(180deg, rgba(43,43,43,.15) 0%, rgba(43,43,43,.35) 70%, rgba(43,43,43,.55) 100%);
  }
  header.hero.hero--photo .hero-inner {
    padding: 0 0 44px;
    text-align: center;
    width: 100%;
    transition: opacity 0.5s ease;
  }
  header.hero.hero--photo:hover .hero-inner { opacity: 0.55; }
  header.hero.hero--photo .eyebrow { letter-spacing: 1.8px; font-size: 11.5px; margin-bottom: 10px; }
  header.hero.hero--photo h1 { font-size: 30px; line-height: 1.25; max-width: 680px; margin: 0 auto 12px; }
  header.hero.hero--photo p.lead { font-size: 14px; max-width: 560px; margin: 0 auto 22px; line-height: 1.6; }
  header.hero.hero--photo .cta-row { justify-content: center; flex-wrap: wrap; gap: 14px; }
  header.hero.hero--photo .btn-primary,
  header.hero.hero--photo .btn-outline { padding: 10px 22px; font-size: 13px; position: relative; z-index: 3; }
  header.hero.hero--photo .hero-dots {
    position: absolute;
    bottom: 16px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: 7px;
    z-index: 3;
  }
  header.hero.hero--photo .hero-dots span {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: rgba(255,255,255,.35);
    transition: background .3s ease;
  }
  header.hero.hero--photo .hero-dots span.active { background: #fff; }
  @media (max-width: 600px) {
    header.hero.hero--photo { height: 300px; }
  }

  /* STATS */
  section.stats {
    background: var(--white);
    padding: 0;
    margin-top: -56px;
  }
  .stats-inner {
    background: var(--white);
    border-radius: 8px;
    box-shadow: 0 12px 40px rgba(0,0,0,0.08);
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    padding: 40px 20px;
  }
  .stat {
    text-align: center;
    padding: 12px 20px;
    border-radius: 6px;
    cursor: default;
    transition: transform 0.25s ease, box-shadow 0.25s ease;
  }
  .stat:hover {
    transform: scale(1.08);
    box-shadow: 0 8px 24px rgba(4,124,196,0.16);
  }
  .stat .num { font-size: 38px; font-weight: 800; color: var(--blue); transition: color 0.25s ease; }
  .stat:hover .num { color: #035f99; }
  .stat .label { font-size: 14px; font-weight: 500; margin-top: 6px; color: var(--grey); }
  .stat + .stat { border-left: 1px solid #eee; }

  /* SECTION GENERIC */
  section { padding: 100px 0; }
  .eyebrow-block {
    text-transform: uppercase;
    letter-spacing: 2px;
    font-size: 13px;
    font-weight: 600;
    color: var(--blue);
    margin-bottom: 14px;
  }
  h2.section-title {
    font-size: 34px;
    font-weight: 700;
    margin-bottom: 28px;
    max-width: 720px;
  }
  h3.section-title {
    font-size: 34px;
    font-weight: 700;
    margin-bottom: 28px;
    max-width: 720px;
  }

  /* ABOUT */
  section.about .about-grid {
    display: grid;
    grid-template-columns: 1.1fr 0.9fr;
    gap: 64px;
    align-items: start;
  }
  section.about p { margin-bottom: 18px; font-size: 15.5px; font-weight: 400; }
  section.about .about-side {
    background: var(--light);
    border-radius: 8px;
    padding: 36px;
  }
  section.about .about-side h4 {
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    font-weight: 600;
    color: var(--blue);
    margin-bottom: 10px;
  }
  section.about .about-side p { font-size: 15px; margin-bottom: 24px; }
  section.about .about-side p:last-child { margin-bottom: 0; }
  section.about .about-side strong { color: var(--grey); }

  /* OFFERS */
  section.offers { background: var(--light); }
  .offers-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 28px;
    margin-top: 44px;
  }
  .offer-card {
    background: var(--white);
    border-radius: 8px;
    padding: 32px 28px;
  }
  .offer-card h4 {
    font-size: 18px;
    font-weight: 700;
    margin-bottom: 12px;
  }
  .offer-card h4::before {
    content: "— ";
    color: var(--blue);
  }
  .offer-card p { font-size: 14.5px; font-weight: 400; opacity: 0.85; }
  .offer-card-link { display: inline-block; margin-top: 14px; font-weight: 600; font-size: 13.5px; color: var(--blue); }
  .offer-card-link:hover { text-decoration: underline; }

  /* SYMPOSIUM CTA */
  section.symp {
    background: var(--grey);
    color: var(--white);
    text-align: center;
  }
  section.symp .date-pill {
    display: inline-block;
    background: rgba(4,124,196,0.18);
    border: 1px solid rgba(4,124,196,0.5);
    color: var(--light);
    padding: 8px 18px;
    border-radius: 20px;
    font-size: 13px;
    font-weight: 500;
    margin-bottom: 24px;
  }
  section.symp .eyebrow-block { justify-content: center; }
  section.symp h2 {
    font-size: 42px;
    font-weight: 800;
    max-width: 700px;
    margin: 0 auto 16px;
  }
  section.symp h2 span { color: var(--blue); }
  section.symp p {
    max-width: 560px;
    margin: 0 auto 34px;
    opacity: 0.85;
    font-weight: 300;
    font-size: 16px;
  }

  /* Days to go (V17, 5 Oct 2026): days only, in the homepage Symposium band */
  section.symp .symp-days { display: flex; align-items: baseline; justify-content: center; gap: 12px; margin: -6px auto 30px; }
  section.symp .symp-days[hidden] { display: none; }
  section.symp .symp-days-num { font-size: 56px; font-weight: 800; line-height: 1; color: var(--white); font-variant-numeric: tabular-nums; }
  section.symp .symp-days-lbl { font-size: 13px; font-weight: 600; letter-spacing: .18em; text-transform: uppercase; color: var(--light); }
  section.symp .symp-days.is-today .symp-days-lbl { font-size: 15px; background: rgba(4,124,196,.25); border: 1px solid rgba(4,124,196,.55); border-radius: 100px; padding: 9px 22px; color: var(--white); }
  @media (max-width: 600px) { section.symp .symp-days-num { font-size: 44px; } }

  /* PAGE HERO (interior pages, e.g. Events) */
  header.page-hero {
    background: var(--grey);
    color: var(--white);
    padding: 70px 0 60px;
    text-align: center;
  }
  header.page-hero .eyebrow {
    text-transform: uppercase;
    letter-spacing: 2px;
    font-size: 13px;
    font-weight: 600;
    color: var(--blue);
    margin-bottom: 14px;
  }
  header.page-hero h1 { font-size: 40px; font-weight: 800; margin-bottom: 16px; }
  header.page-hero p.lead {
    font-size: 16px;
    font-weight: 300;
    max-width: 620px;
    margin: 0 auto;
    opacity: 0.85;
  }

  /* EVENTS */
  section.event-listing { background: var(--light); padding: 80px 0 100px; }
  .listing-subhead {
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: #035f97;
    margin: 0 0 20px;
  }
  .events-placeholder {
    background: var(--white);
    border: 2px dashed #b9d8ea;
    border-radius: 10px;
    padding: 56px 40px;
    text-align: center;
    margin-bottom: 56px;
  }
  .events-placeholder-icon {
    width: 56px;
    height: 56px;
    margin: 0 auto 18px;
    border-radius: 50%;
    background: var(--light);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 26px;
  }
  .events-placeholder h3 { font-size: 20px; font-weight: 700; margin: 0 0 8px; color: var(--grey); }
  .events-placeholder p { font-size: 14.5px; color: #5e6b73; margin: 0 auto; max-width: 440px; }
  .event-card--past { filter: grayscale(45%); opacity: 0.9; }
  .past-event-tag {
    display: inline-block;
    background: #8a8a8a;
    color: var(--white);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 1px;
    padding: 4px 10px;
    border-radius: 20px;
    margin-bottom: 14px;
  }
  .event-card {
    background: var(--white);
    border-radius: 10px;
    overflow: hidden;
    display: grid;
    grid-template-columns: 420px 1fr;
    align-items: start;
    box-shadow: 0 12px 40px rgba(0,0,0,0.06);
    margin-bottom: 56px;
  }
  .event-card .poster-link {
    display: block;
    position: relative;
    margin: 40px 0 40px 40px;
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 8px 24px rgba(0,0,0,0.12);
    transition: transform 0.2s ease, box-shadow 0.2s ease;
  }
  .event-card .poster-link:hover {
    transform: scale(1.02);
    box-shadow: 0 12px 32px rgba(0,0,0,0.18);
  }
  .event-card .poster-link::after {
    content: "🔍 Click to view full size";
    position: absolute;
    left: 0; right: 0; bottom: 0;
    background: rgba(43,43,43,0.82);
    color: var(--white);
    font-size: 12px;
    font-weight: 600;
    text-align: center;
    padding: 8px 0;
    opacity: 0;
    transition: opacity 0.2s ease;
  }
  .event-card .poster-link:hover::after { opacity: 1; }
  .event-card .event-poster {
    width: 100%;
    height: auto;
    object-fit: contain;
    display: block;
  }
  .event-card .event-info { padding: 44px 40px; }
  .event-card .event-info h2 { font-size: 28px; font-weight: 700; margin-bottom: 4px; }
  .event-card .event-info .event-subheader { font-size: 15.5px; font-style: italic; color: var(--blue); margin: 0 0 16px; opacity: 0.9; }
  .event-card .event-info p { font-size: 15px; margin-bottom: 16px; opacity: 0.85; }
  .event-card .event-info p strong { color: var(--grey); opacity: 1; }
  .event-meta {
    display: flex;
    gap: 32px;
    margin: 24px 0 28px;
    padding: 20px 0;
    border-top: 1px solid #e5e5e5;
    border-bottom: 1px solid #e5e5e5;
  }
  .event-meta > div { display: flex; flex-direction: column; gap: 4px; }
  .event-meta .meta-label {
    text-transform: uppercase;
    letter-spacing: 1px;
    font-size: 11px;
    font-weight: 600;
    color: var(--blue);
  }
  .event-meta span:last-child { font-size: 14.5px; font-weight: 600; }

  /* HOME EVENTS PREVIEW */
  section.home-events { background: var(--light); }
  .home-events-placeholder {
    background: var(--white);
    border: 2px dashed #b9d8ea;
    border-radius: 10px;
    padding: 56px 40px;
    text-align: center;
  }
  .home-events-placeholder h3 { font-size: 20px; font-weight: 700; margin: 0 0 8px; color: var(--grey); }
  .home-events-placeholder p { font-size: 14.5px; color: #5e6b73; margin: 0 auto 18px; max-width: 440px; }
  .home-events-placeholder .view-all-link { font-weight: 600; font-size: 14px; color: var(--blue); }
  .home-events-placeholder .view-all-link:hover { text-decoration: underline; }
  .home-event-rotator { position: relative; max-width: 920px; }
  .home-event-card {
    display: none;
    background: var(--white);
    border-radius: 10px;
    overflow: hidden;
    grid-template-columns: 260px 1fr;
    align-items: start;
    box-shadow: 0 12px 40px rgba(0,0,0,0.06);
    max-width: 920px;
  }
  .home-event-card.active { display: grid; }
  /* Used briefly by JS to measure every card's natural height (all shown
     in-flow, stacked) before switching to the fixed-height crossfade
     below — never visible to the user, happens in a single script tick. */
  .home-event-rotator.measuring .home-event-card {
    display: grid !important;
    position: static !important;
    opacity: 1 !important;
    visibility: visible !important;
  }
  /* Once JS has measured the tallest card and set an explicit min-height
     on .home-event-rotator (inline style), every card becomes absolutely
     positioned and stacked on top of each other, with only the active
     one visible — so swapping between events of different lengths never
     changes the section's height or causes a layout jump. Without JS,
     this class is never added and the plain display:none/grid swap above
     is what runs instead (still correct, just without the extra polish). */
  .home-event-rotator.rotator-ready .home-event-card {
    display: grid !important;
    position: absolute;
    top: 50%;
    left: 0;
    width: 100%;
    transform: translateY(-50%);
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.5s ease;
    pointer-events: none;
  }
  .home-event-rotator.rotator-ready .home-event-card.active {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
  }
  .home-event-dots {
    display: flex;
    justify-content: center;
    gap: 8px;
    margin-top: 20px;
  }
  .home-event-dots span {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: rgba(4,124,196,0.25);
    transition: background 0.3s ease;
  }
  .home-event-dots span.active { background: var(--blue); }
  .home-event-card .poster-link {
    display: block;
    position: relative;
    margin: 28px 0 28px 28px;
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 8px 24px rgba(0,0,0,0.12);
    transition: transform 0.2s ease, box-shadow 0.2s ease;
    aspect-ratio: 4 / 5;
  }
  .home-event-card .poster-link:hover {
    transform: scale(1.03);
    box-shadow: 0 12px 32px rgba(0,0,0,0.18);
  }
  .home-event-card .poster-link::after {
    content: "🔍 View full size";
    position: absolute;
    left: 0; right: 0; bottom: 0;
    background: rgba(43,43,43,0.82);
    color: var(--white);
    font-size: 11px;
    font-weight: 600;
    text-align: center;
    padding: 6px 0;
    opacity: 0;
    transition: opacity 0.2s ease;
  }
  .home-event-card .poster-link:hover::after { opacity: 1; }
  .home-event-card .event-poster { width: 100%; height: 100%; object-fit: cover; display: block; }
  .home-event-card .home-event-info { padding: 32px 32px 32px 28px; }
  .home-event-card .home-event-info h3 { font-size: 22px; font-weight: 700; margin-bottom: 4px; }
  .home-event-card .home-event-info .event-subheader { font-size: 14px; font-style: italic; color: var(--blue); margin: 0 0 12px; opacity: 0.9; }
  .home-event-card .home-event-info p { font-size: 14.5px; margin-bottom: 16px; opacity: 0.85; }
  .home-event-card .home-event-info p strong { color: var(--grey); opacity: 1; }
  .home-event-card .event-meta { margin: 16px 0 22px; padding: 16px 0; }
  .home-event-card .home-event-actions { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
  .home-event-card .view-all-link { font-weight: 600; font-size: 14px; color: var(--blue); }
  .home-event-card .view-all-link:hover { text-decoration: underline; }

  /* LIGHTBOX */
  .lightbox {
    position: fixed;
    inset: 0;
    background: rgba(20,20,20,0.92);
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.25s ease, visibility 0.25s ease;
    z-index: 9999;
    padding: 40px;
  }
  .lightbox.active { opacity: 1; visibility: visible; }
  .lightbox img {
    max-width: 90vw;
    max-height: 85vh;
    border-radius: 6px;
    box-shadow: 0 20px 60px rgba(0,0,0,0.5);
    transform: scale(0.96);
    transition: transform 0.25s ease;
  }
  .lightbox.active img { transform: scale(1); }
  .lightbox-close {
    position: absolute;
    top: 24px;
    right: 32px;
    background: none;
    border: none;
    color: var(--white);
    font-size: 36px;
    line-height: 1;
    cursor: pointer;
    opacity: 0.85;
    transition: opacity 0.2s ease;
  }
  .lightbox-close:hover { opacity: 1; }
  body.lightbox-open { overflow: hidden; }

  /* CONTACT / FOOTER */
  footer {
    background: var(--white);
    padding: 70px 0 40px;
    border-top: 1px solid #eee;
  }
  footer .footer-grid {
    display: grid;
    grid-template-columns: 1.2fr 1fr 1fr;
    gap: 40px;
    margin-bottom: 48px;
  }
  footer img.logo { height: 34px; margin-bottom: 16px; }
  footer p { font-size: 14px; opacity: 0.75; max-width: 320px; }
  footer h5 {
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    font-weight: 600;
    color: var(--blue);
    margin-bottom: 16px;
  }
  footer ul li { margin-bottom: 10px; font-size: 14.5px; }
  footer ul li a:hover { color: var(--blue); }
  footer .bottom-bar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 10px 24px;
    padding-top: 28px;
    border-top: 1px solid #eee;
    font-size: 13px;
    opacity: 0.6;
  }
  footer .bottom-bar-link { color: var(--grey); }
  footer .bottom-bar-link:hover { color: var(--blue); text-decoration: underline; }

  @media (max-width: 900px) {
    .nav-toggle { display: flex; }
    nav .nav-menu {
      display: none;
      position: absolute;
      top: 100%;
      left: 0;
      right: 0;
      z-index: 40; /* found 10 Aug 2026 while adding submenus: with no z-index
        set, this panel is a positioned-but-z-index:auto descendant, so once
        the submenu items made it tall enough to reach into header.hero's
        (non-positioned) box, the two painted with an ambiguous/incorrect
        order and hero's text showed through the open mobile drawer instead
        of being fully hidden by it. A previously-latent gap, not something
        the dropdown work itself caused. */
      flex-direction: column;
      align-items: stretch;
      gap: 0;
      background: var(--grey);
      padding: 6px 0 22px;
      box-shadow: 0 16px 28px rgba(0,0,0,0.32);
    }
    nav.nav-open .nav-menu { display: flex; }
    nav .nav-menu ul.navlinks { flex-direction: column; gap: 0; width: 100%; }
    nav .nav-menu ul.navlinks li { width: 100%; }
    nav .nav-menu ul.navlinks a {
      display: block;
      padding: 15px 32px;
      border-bottom: 1px solid rgba(255,255,255,0.08);
    }
    nav .nav-menu .btn-primary { margin: 18px 32px 0; text-align: center; }
    /* Submenus: always expanded/indented inline on mobile, no second tap —
       overrides the desktop hover-only display:none above. */
    nav ul.navlinks li.menu-item-has-children > a::after { display: none; }
    nav ul.navlinks li.menu-item-has-children::before { display: none; }
    nav ul.navlinks .sub-menu {
      display: block;
      visibility: visible;
      opacity: 1;
      transform: none;
      transition: none;
      position: static;
      margin-top: 0;
      background: rgba(0,0,0,0.15);
      border-top: none;
      box-shadow: none;
      padding: 0;
    }
    nav ul.navlinks .sub-menu a {
      padding: 13px 32px 13px 48px;
      font-size: 13px;
      border-bottom: 1px solid rgba(255,255,255,0.08);
    }
    header.hero h1 { font-size: 32px; }
    /* Hero photo variant — shorter on tablet/mobile so a fixed height
       doesn't crop wide photos down to a near-square sliver on narrower
       screens. Desktop stays at 440px (see header.hero.hero--photo above);
       this only affects the photo-background hero, not the plain
       0-photos version, which already had no height constraint at all. */
    header.hero.hero--photo { height: 380px; }
    .stats-inner { grid-template-columns: 1fr; gap: 24px; }
    .stat + .stat { border-left: none; border-top: 1px solid #eee; padding-top: 24px; }
    section.about .about-grid { grid-template-columns: 1fr; }
    .offers-grid { grid-template-columns: 1fr; }
    footer .footer-grid { grid-template-columns: 1fr; }
    header.page-hero h1 { font-size: 30px; }
    .event-card { grid-template-columns: 1fr; }
    .event-card .poster-link { max-width: 320px; margin: 32px auto 0; }
    .event-card .event-info { padding: 32px 24px; }
    .event-meta { flex-wrap: wrap; gap: 20px; }
    .home-event-card { grid-template-columns: 1fr; max-width: 100%; }
    .home-event-card .poster-link { max-width: 260px; margin: 24px auto 0; }
    .home-event-card .home-event-info { padding: 24px 20px; }
    .lightbox-close { top: 14px; right: 18px; font-size: 30px; }
  }

  /* MEET THE TEAM */
  section.team-listing { padding: 80px 0 100px; }
  .team-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 8px 8px;
    margin-top: 28px;
  }
  .team-grid--lead { margin-bottom: 56px; }
  /* V14: six-person Executive Committee sits as 3 + 3 on desktop. The 900px rule below still drops it to 2 per row. */
  .team-grid--three { grid-template-columns: repeat(3, 1fr); max-width: 780px; margin-left: auto; margin-right: auto; }
  .team-divider { border-top: 1px solid #e5e5e5; margin: 0 0 56px; }
  .team-card { text-align: center; padding: 16px 10px; }
  .team-photo {
    width: 130px;
    height: 130px;
    border-radius: 50%;
    object-fit: cover;
    object-position: center 10%;
    border: 4px solid var(--blue);
    margin: 0 auto 14px;
    display: block;
    cursor: pointer;
    transition: transform 0.3s ease, box-shadow 0.3s ease;
  }
  .team-photo--sm { width: 110px; height: 110px; }
  .team-photo:hover { transform: scale(1.08); box-shadow: 0 8px 24px rgba(4,124,196,0.32); }
  .team-role {
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 1.4px;
    text-transform: uppercase;
    color: var(--blue);
    margin-bottom: 4px;
  }
  .team-name { font-size: 15px; font-weight: 700; color: var(--grey); margin-bottom: 4px; }
  .team-title { font-size: 12.5px; color: #555; line-height: 1.5; margin-bottom: 12px; min-height: 54px; }
  .team-linkedin {
    display: inline-block;
    font-size: 11px;
    font-weight: 600;
    color: var(--blue);
    border: 1px solid var(--blue);
    padding: 5px 14px;
    border-radius: 20px;
  }
  .team-linkedin:hover { background: var(--blue); color: var(--white); }

  @media (max-width: 900px) {
    .team-grid { grid-template-columns: repeat(2, 1fr); gap: 24px 8px; }
  }

  /* SPONSORS & PARTNERS */
  section.sponsor-section { padding: 70px 0 20px; }
  section.sponsor-section--alt { padding-top: 20px; }
  section.sponsor-section .section-title { margin-bottom: 8px; }
  .sponsor-entry {
    display: grid;
    grid-template-columns: 260px 1fr;
    gap: 40px;
    align-items: center;
    padding: 40px 0;
    border-bottom: 1px solid #eee;
  }
  .sponsor-entry:last-child { border-bottom: none; }
  .sponsor-logo-placeholder {
    border: 2px dashed var(--blue);
    border-radius: 8px;
    background: var(--light);
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    min-height: 120px;
    padding: 20px;
  }
  .sponsor-logo-placeholder span {
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.04em;
    color: var(--blue);
    line-height: 1.5;
  }
  .sponsor-logo {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 120px;
    padding: 10px;
  }
  .sponsor-logo img {
    width: auto;
    height: auto;
    object-fit: contain;
  }
  a.sponsor-logo { text-decoration: none; transition: opacity 0.2s ease; }
  a.sponsor-logo:hover { opacity: 0.75; }
  .sponsor-name-heading a { color: var(--grey); text-decoration: none; }
  .sponsor-name-heading a:hover { color: var(--blue); text-decoration: underline; }
  /* Tier-based logo sizing — sized primarily by HEIGHT (max-height), not
     width, so logos with very different natural shapes (a flat wordmark vs.
     a squarer icon+wordmark lockup) still read as the same visual size
     within a tier. max-width is a safety rail only — it just stops an
     unusually wide/flat logo (e.g. a long wordmark) from overflowing the
     260px logo column; object-fit: contain always preserves each logo's own
     aspect ratio regardless of which limit is hit.
     Source logo files must be cropped tight to their own visible artwork
     (no extra baked-in blank canvas around them) — this only produces
     consistent sizing if the files themselves don't already differ in how
     much padding they carry.
     Add new tiers here as needed (e.g. --bronze) and apply the matching
     class to that sponsor's .sponsor-logo div — higher tiers should get a
     taller max-height so they read as bigger. */
  .sponsor-logo--gold img { max-width: 230px; max-height: 100px; }
  .sponsor-logo--silver img { max-width: 230px; max-height: 60px; }
  .sponsor-logo--visionary img { max-width: 230px; max-height: 42px; }
  .sponsor-logo--community img { max-width: 200px; max-height: 30px; }
  .sponsor-logo--community { justify-content: center; }
  .sponsor-tier {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--blue);
    margin-bottom: 8px;
  }
  .sponsor-name-heading { font-size: 21px; font-weight: 700; margin-bottom: 12px; }
  .sponsor-blurb { font-size: 14.5px; color: #555; line-height: 1.75; }
  .sponsor-blurb a { color: var(--blue); font-weight: 600; }

  /* GENERIC PAGE (page.php fallback) */
  section.generic-page { padding: 70px 0 100px; }
  section.generic-page .entry-content { max-width: 780px; font-size: 15.5px; line-height: 1.8; }
  section.generic-page .entry-content p { margin-bottom: 18px; }
  section.generic-page .entry-content h2 { font-size: 26px; font-weight: 700; margin: 36px 0 16px; }
  section.generic-page .entry-content h3 { font-size: 20px; font-weight: 700; margin: 28px 0 14px; }
  section.generic-page .entry-content ul,
  section.generic-page .entry-content ol { margin: 0 0 18px 22px; }
  section.generic-page .entry-content ul { list-style: disc; }
  section.generic-page .entry-content ol { list-style: decimal; }
  section.generic-page .entry-content a { color: var(--blue); text-decoration: underline; }
  section.generic-page .entry-content img { border-radius: 8px; margin: 20px 0; }


  /* 404 / NOT FOUND
     Added v10. Pairs with 404.php. Before this existed, unmatched URLs fell
     through to the homepage with an HTTP 200 (soft 404) — bad for SEO and it
     made 403s render as the homepage, which made security testing ambiguous. */
  header.page-hero.error-hero { padding: 80px 0 70px; }
  header.page-hero.error-hero .error-actions {
    display: flex;
    gap: 16px;
    justify-content: center;
    margin-top: 30px;
    flex-wrap: wrap;
  }

  section.error-help { padding: 60px 0 90px; text-align: center; }
  section.error-help .error-help-intro {
    font-size: 15px;
    font-weight: 600;
    color: var(--grey);
    margin-bottom: 20px;
  }
  ul.error-links {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 10px 28px;
    margin: 0 0 34px;
    padding: 0;
  }
  ul.error-links a {
    color: var(--blue);
    font-weight: 600;
    font-size: 15px;
  }
  ul.error-links a:hover { text-decoration: underline; }
  section.error-help .error-contact { font-size: 14.5px; font-weight: 300; }
  section.error-help .error-contact a { color: var(--blue); text-decoration: underline; }

  @media (max-width: 600px) {
    header.page-hero.error-hero .error-actions { flex-direction: column; align-items: center; }
    header.page-hero.error-hero .error-actions a { width: 100%; max-width: 280px; text-align: center; }
    ul.error-links { flex-direction: column; gap: 12px; }
  }

  @media (max-width: 900px) {
    .sponsor-entry { grid-template-columns: 1fr; gap: 20px; text-align: center; }
    .sponsor-logo-placeholder { max-width: 260px; margin: 0 auto; }
    .sponsor-logo { justify-content: center; }
  }

  /* ============================================================
     EVENT PAGE MECHANICS (V12, 11 Sep 2026)
     One definition of the things that must NOT vary between the three
     marquee event pages: Symposium, GCX Awards and AI Summit. Each event
     still sets its own ground, accent and signature device — those are the
     only three levers an event gets. Everything below is shared, so the
     pages read as titles in one series rather than three separate builds.

     Applied to the page wrappers rather than to renamed classes, so the
     existing symp- and gcx- class names keep working untouched. New event
     pages should consume these tokens directly.
     ============================================================ */

  .symposium-page,
  .awards-page,
  .aisummit-page {
    --evt-rhythm:   90px;   /* vertical section padding */
    --evt-rhythm-sm: 56px;  /* the same, at phone width */
    --evt-radius:   10px;   /* cards, panels, posters, form cards */
    --evt-radius-sm: 7px;   /* inputs, small chips */
    --evt-tint:     #F7FBFD; /* the shared light band */
    --evt-border:   #DAEDF8;
    --evt-muted:    #5e8099;
    --evt-body:     #40566a;
    --evt-eyebrow-size: 11px;
    --evt-eyebrow-track: .2em;
  }

  /* ============================================================
     SYMPOSIUM PAGE (v11)
     Ported from the standalone ccas-symp2026 microsite theme so the
     Symposium content lives inside the main site (page-symposium.php),
     sharing this theme's nav/footer instead of the microsite's own.
     Every selector below is scoped under .symposium-page so it can never
     collide with the rest of the site's CSS — all class names specific to
     this page are prefixed "symp-". Custom properties needed only here
     (blue-dark, blue-deep, off-white, border, muted) are scoped the same
     way rather than added to the global :root. Reuses the site's existing
     --blue / --light / --grey / --white tokens directly (values match the
     ones the microsite theme hardcoded).
     ============================================================ */

  .symposium-page {
    --blue-dark: #035f97;
    --blue-deep: #02487A;
    --off-white: var(--evt-tint);
    --border:    var(--evt-border);
    --muted:     var(--evt-muted);
  }
  .symposium-page .wrap { max-width: 1140px; padding: 0 36px; }
  .symposium-page img { display: block; max-width: 100%; }

  .symposium-page .symp-eyebrow { font-size: var(--evt-eyebrow-size); font-weight: 600; letter-spacing: var(--evt-eyebrow-track); text-transform: uppercase; color: var(--blue); display: block; margin-bottom: 14px; }
  .symposium-page .symp-eyebrow--light { color: var(--light); opacity: .8; }
  .symposium-page .symp-sec-title { font-size: clamp(26px,3vw,38px); font-weight: 700; line-height: 1.2; color: var(--grey); }
  .symposium-page .symp-sec-title--light { color: var(--white); }
  .symposium-page .symp-divider { width: 36px; height: 3px; background: var(--blue); border-radius: 2px; margin: 20px 0; }
  .symposium-page .symp-divider--light { background: rgba(255,255,255,.3); }
  .symposium-page .symp-divider--center { margin: 20px auto; }
  .symposium-page .symp-lead { font-size: 16px; font-weight: 300; line-height: 1.8; color: var(--muted); max-width: 640px; }
  .symposium-page .symp-btn { display: inline-block; padding: 13px 30px; border-radius: 4px; font-size: 13.5px; font-weight: 600; letter-spacing: .04em; border: 2px solid transparent; cursor: pointer; transition: background .2s, color .2s, transform .15s; }
  .symposium-page .symp-btn:hover { transform: translateY(-1px); }
  .symposium-page .symp-btn--blue { background: var(--blue); color: var(--white); }
  .symposium-page .symp-btn--blue:hover { background: var(--blue-dark); }
  .symposium-page .symp-btn--outline { background: transparent; color: var(--white); border-color: rgba(255,255,255,.45); }
  .symposium-page .symp-btn--outline:hover { background: rgba(255,255,255,.1); border-color: var(--white); }

  /* HERO */
  .symposium-page #symp-hero { min-height: 90vh; background: var(--grey); display: flex; align-items: center; position: relative; overflow: hidden; padding: var(--evt-rhythm) 0; }
  .symposium-page .symp-hero-grid { position: absolute; inset: 0; background-image: linear-gradient(rgba(4,124,196,.07) 1px,transparent 1px), linear-gradient(90deg,rgba(4,124,196,.07) 1px,transparent 1px); background-size: 56px 56px; }
  .symposium-page .symp-hero-glow { position: absolute; top: -160px; right: -140px; width: 700px; height: 700px; border-radius: 50%; background: radial-gradient(circle,rgba(4,124,196,.3) 0%,transparent 68%); }
  .symposium-page .symp-hero-glow-2 { position: absolute; bottom: -200px; left: -120px; width: 560px; height: 560px; border-radius: 50%; background: radial-gradient(circle,rgba(4,124,196,.15) 0%,transparent 68%); }
  .symposium-page .symp-hero-content { position: relative; z-index: 2; }
  .symposium-page .symp-hero-pill { display: inline-flex; align-items: center; gap: 9px; background: rgba(4,124,196,.2); border: 1px solid rgba(4,124,196,.45); border-radius: 100px; padding: 6px 18px 6px 8px; margin-bottom: 36px; }
  .symposium-page .symp-hero-pill .symp-pulse { width: 8px; height: 8px; background: var(--blue); border-radius: 50%; animation: symp-pulse 2.2s infinite; }
  @keyframes symp-pulse { 0%,100%{opacity:1;transform:scale(1);} 50%{opacity:.4;transform:scale(.8);} }
  .symposium-page .symp-hero-pill span { font-size: 12px; font-weight: 500; color: var(--light); letter-spacing: .05em; }
  .symposium-page .symp-hero-kicker { font-size: 11px; font-weight: 600; letter-spacing: .2em; text-transform: uppercase; color: rgba(255,255,255,.4); display: block; margin-bottom: 18px; }
  .symposium-page .symp-hero-hl { font-size: clamp(40px,7vw,80px); font-weight: 900; line-height: .98; color: var(--white); letter-spacing: -.02em; margin-bottom: 6px; }
  .symposium-page .symp-hero-hl .hl2 { color: var(--blue); display: block; }
  .symposium-page .symp-hero-sub { font-size: clamp(14px,1.8vw,19px); font-weight: 300; color: rgba(255,255,255,.5); margin-bottom: 40px; letter-spacing: .08em; }
  .symposium-page .symp-hero-actions { display: flex; gap: 14px; flex-wrap: wrap; margin-bottom: 60px; }
  .symposium-page .symp-hero-meta { padding-top: 36px; border-top: 1px solid rgba(255,255,255,.09); display: flex; gap: 48px; flex-wrap: wrap; }
  .symposium-page .symp-hero-meta-item .lbl { font-size: 9.5px; font-weight: 600; letter-spacing: .17em; text-transform: uppercase; color: rgba(255,255,255,.3); display: block; margin-bottom: 5px; }
  .symposium-page .symp-hero-meta-item .val { font-size: 14px; font-weight: 500; color: rgba(255,255,255,.85); }

  /* WATCH — added 13 Aug 2026, teaser video section between Hero and About */
  .symposium-page #symp-watch { padding: var(--evt-rhythm) 0; background: var(--white); text-align: center; }
  .symposium-page .symp-watch-inner { max-width: 860px; margin: 0 auto; }
  .symposium-page .symp-watch-sub { font-size: 15px; font-weight: 300; color: var(--muted); margin: 6px 0 32px; }
  .symposium-page .symp-video-frame {
    border-radius: var(--evt-radius);
    overflow: hidden;
    background: #000;
    box-shadow: 0 20px 50px rgba(2,72,122,0.18);
  }
  .symposium-page .symp-video-frame video { width: 100%; height: auto; display: block; aspect-ratio: 16 / 9; }

  /* ABOUT */
  .symposium-page #symp-about { padding: var(--evt-rhythm) 0; background: var(--off-white); }
  .symposium-page .symp-about-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: start; }
  .symposium-page .symp-about-body { font-size: 15.5px; font-weight: 300; line-height: 1.85; color: var(--muted); margin-top: 8px; }
  .symposium-page .symp-about-body + .symp-about-body { margin-top: 18px; }
  .symposium-page .symp-about-body strong { font-weight: 600; color: var(--grey); }
  .symposium-page .symp-stat-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--border); border: 1px solid var(--border); border-radius: 10px; overflow: hidden; }
  .symposium-page .symp-stat-cell { background: var(--white); padding: 32px 28px; }
  .symposium-page .symp-stat-cell.symp-hero-stat { grid-column: 1/-1; background: var(--blue); }
  .symposium-page .symp-stat-num { font-size: 48px; font-weight: 900; line-height: 1; color: var(--grey); margin-bottom: 6px; }
  .symposium-page .symp-stat-num sup { font-size: 22px; vertical-align: top; margin-top: 12px; display: inline-block; }
  .symposium-page .symp-stat-cell.symp-hero-stat .symp-stat-num { color: var(--white); }
  .symposium-page .symp-stat-lbl { font-size: 12px; font-weight: 500; color: var(--muted); line-height: 1.45; }
  .symposium-page .symp-stat-cell.symp-hero-stat .symp-stat-lbl { color: rgba(255,255,255,.65); }

  /* PILLARS */
  .symposium-page #symp-pillars { padding: var(--evt-rhythm) 0; background: var(--white); }
  .symposium-page .symp-pillars-hdr { max-width: 640px; margin-bottom: 52px; }
  .symposium-page .symp-pillars-r1 { display: grid; grid-template-columns: repeat(3,1fr); gap: 20px; margin-bottom: 20px; }
  .symposium-page .symp-pillars-r2 { display: grid; grid-template-columns: repeat(2,1fr); gap: 20px; max-width: 760px; margin: 0 auto; }
  .symposium-page .symp-pillar { border: 1px solid var(--border); border-radius: 10px; padding: 32px 28px; position: relative; overflow: hidden; transition: border-color .22s, box-shadow .22s; }
  .symposium-page .symp-pillar::after { content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 3px; background: var(--blue); transform: scaleX(0); transform-origin: left; transition: transform .3s; }
  .symposium-page .symp-pillar:hover { border-color: rgba(4,124,196,.3); box-shadow: 0 6px 32px rgba(4,124,196,.09); }
  .symposium-page .symp-pillar:hover::after { transform: scaleX(1); }
  .symposium-page .symp-pillar-num { font-size: 10px; font-weight: 700; letter-spacing: .17em; text-transform: uppercase; color: var(--blue); margin-bottom: 10px; }
  .symposium-page .symp-pillar-title { font-size: 19px; font-weight: 700; color: var(--grey); margin-bottom: 6px; line-height: 1.25; }
  .symposium-page .symp-pillar-tag { font-size: 12.5px; font-weight: 500; color: var(--blue); margin-bottom: 16px; font-style: italic; }
  .symposium-page .symp-pillar-q { font-size: 14px; font-weight: 600; color: var(--grey); line-height: 1.45; margin-bottom: 14px; border-left: 2px solid var(--light); padding-left: 14px; }
  .symposium-page .symp-pillar-desc { font-size: 13.5px; font-weight: 300; color: var(--muted); line-height: 1.75; }
  .symposium-page .symp-pillar-qs { margin-top: 18px; display: flex; flex-direction: column; gap: 8px; }
  .symposium-page .symp-pillar-qi { font-size: 12.5px; font-weight: 300; color: var(--muted); padding-left: 14px; position: relative; line-height: 1.5; }
  .symposium-page .symp-pillar-qi::before { content: '\2014'; position: absolute; left: 0; color: var(--blue); font-weight: 600; }

  /* PROGRAMME */
  .symposium-page #symp-programme { padding: var(--evt-rhythm) 0; background: var(--grey); }
  .symposium-page .symp-prog-hdr { margin-bottom: 44px; }
  .symposium-page .symp-prog-list { border-radius: 8px; overflow: hidden; border: 1px solid rgba(255,255,255,.07); }
  .symposium-page .symp-prog-row { display: grid; grid-template-columns: 110px 1fr auto; gap: 28px; padding: 20px 26px; border-bottom: 1px solid rgba(255,255,255,.06); align-items: start; transition: background .18s; }
  .symposium-page .symp-prog-row:last-child { border-bottom: none; }
  .symposium-page .symp-prog-row:hover { background: rgba(255,255,255,.03); }
  .symposium-page .symp-prog-row.symp-keynote { background: rgba(4,124,196,.09); }
  .symposium-page .symp-prog-row.symp-keynote:hover { background: rgba(4,124,196,.14); }
  .symposium-page .symp-prog-row.symp-featured { background: rgba(4,124,196,.16); }
  .symposium-page .symp-prog-time { font-size: 13px; font-weight: 600; color: var(--blue); padding-top: 2px; }
  .symposium-page .symp-prog-type { font-size: 9.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: rgba(255,255,255,.3); margin-bottom: 4px; }
  .symposium-page .symp-prog-row.symp-keynote .symp-prog-type, .symposium-page .symp-prog-row.symp-featured .symp-prog-type { color: rgba(207,233,245,.55); }
  .symposium-page .symp-prog-title { font-size: 15px; font-weight: 600; color: rgba(255,255,255,.88); line-height: 1.4; margin-bottom: 3px; }
  .symposium-page .symp-prog-title em { font-style: italic; font-weight: 400; }
  .symposium-page .symp-prog-detail { font-size: 12.5px; color: rgba(255,255,255,.38); font-weight: 300; }
  .symposium-page .symp-prog-badge { display: inline-block; font-size: 10px; font-weight: 600; padding: 4px 12px; border-radius: 100px; white-space: nowrap; margin-top: 2px; }
  .symposium-page .symp-badge-k { background: rgba(4,124,196,.25); color: var(--light); border: 1px solid rgba(4,124,196,.45); }
  .symposium-page .symp-badge-p { background: rgba(207,233,245,.1); color: var(--light); border: 1px solid rgba(207,233,245,.2); }
  .symposium-page .symp-badge-b { background: rgba(255,255,255,.06); color: rgba(255,255,255,.3); }
  .symposium-page .symp-badge-f { background: rgba(4,124,196,.35); color: #b3dbf5; border: 1px solid rgba(4,124,196,.55); }

  /* PANEL */
  /* SPEAKERS — added 25 Aug 2026, sits between Programme and Panel Highlight */
  .symposium-page #symp-speakers { padding: var(--evt-rhythm) 0; background: var(--off-white); }
  .symposium-page .symp-speakers-head { text-align: center; max-width: 640px; margin: 0 auto 36px; }
  .symposium-page .symp-speakers-lead { font-size: 15.5px; line-height: 1.6; color: var(--muted); margin: 0; }
  .symposium-page .symp-poster-link {
    display: block;
    position: relative;
    max-width: 640px;
    margin: 0 auto;
    border-radius: var(--evt-radius);
    overflow: hidden;
    box-shadow: 0 10px 30px rgba(4,124,196,0.18);
    cursor: zoom-in;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
  }
  .symposium-page .symp-poster-link:hover { transform: scale(1.015); box-shadow: 0 14px 38px rgba(4,124,196,0.26); }
  .symposium-page .symp-poster-link img { display: block; width: 100%; height: auto; }
  .symposium-page .symp-poster-link::after {
    content: "🔍 Click to view full size";
    position: absolute; left: 0; right: 0; bottom: 0;
    background: rgba(43,43,43,0.82);
    color: var(--white);
    font-size: 12px; font-weight: 600; text-align: center;
    padding: 9px 0; opacity: 0; transition: opacity 0.2s ease;
  }
  .symposium-page .symp-poster-link:hover::after { opacity: 1; }

  .symposium-page #symp-panel { padding: var(--evt-rhythm) 0; background: var(--blue-deep); position: relative; overflow: hidden; }
  .symposium-page .symp-panel-glow { position: absolute; top: -120px; right: -80px; width: 500px; height: 500px; border-radius: 50%; background: radial-gradient(circle,rgba(255,255,255,.06) 0%,transparent 70%); }
  .symposium-page .symp-panel-inner { position: relative; z-index: 2; }
  .symposium-page .symp-panel-title { font-size: clamp(24px,3.5vw,40px); font-weight: 800; color: var(--white); line-height: 1.15; margin-bottom: 26px; }
  .symposium-page .symp-panel-title em { font-style: normal; color: var(--light); }
  .symposium-page .symp-panel-pts { display: flex; flex-direction: column; gap: 14px; margin-bottom: 32px; }
  .symposium-page .symp-panel-pt { display: flex; gap: 14px; align-items: flex-start; }
  .symposium-page .symp-panel-pt .dash { font-size: 14px; font-weight: 700; color: var(--blue); flex-shrink: 0; padding-top: 1px; }
  .symposium-page .symp-panel-pt p { font-size: 15px; font-weight: 300; color: rgba(255,255,255,.65); line-height: 1.65; }
  .symposium-page .symp-panel-meta { font-size: 12px; font-weight: 500; color: rgba(255,255,255,.3); letter-spacing: .08em; }

  /* SPONSOR US */
  .symposium-page #symp-sponsor { background: var(--white); padding: var(--evt-rhythm) 0 calc(var(--evt-rhythm) - 30px); }
  .symposium-page .symp-sponsor-hdr { text-align: center; margin-bottom: 44px; }
  .symposium-page .symp-sponsor-lead { max-width: 640px; margin: 0 auto 28px; }
  .symposium-page .symp-why-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 24px; margin-bottom: 56px; }
  .symposium-page .symp-why-card { background: var(--off-white); border: 1px solid var(--border); border-radius: var(--evt-radius); padding: 28px 28px 24px; border-top: 4px solid var(--blue); }
  .symposium-page .symp-why-num { font-size: 11px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase; color: var(--blue); margin-bottom: 12px; }
  .symposium-page .symp-why-title { font-size: 18px; font-weight: 700; color: var(--grey); margin-bottom: 4px; }
  .symposium-page .symp-why-tag { font-size: 12px; font-style: italic; color: var(--blue); margin-bottom: 12px; }
  .symposium-page .symp-why-desc { font-size: 13px; color: #555; line-height: 1.65; }
  .symposium-page .symp-tiers { margin-bottom: 44px; }
  .symposium-page .symp-tiers-title { font-size: 20px; font-weight: 700; text-align: center; margin-bottom: 28px; color: var(--grey); }
  .symposium-page .symp-tiers-scroll { overflow-x: auto; }
  .symposium-page .symp-tiers-table { width: 100%; border-collapse: collapse; font-size: 13px; min-width: 640px; }
  .symposium-page .symp-th-benefit { text-align: left; padding: 12px 14px; background: var(--grey); color: var(--white); font-weight: 600; border-radius: 8px 0 0 0; }
  .symposium-page .symp-th-tier { padding: 12px 10px; color: var(--white); font-weight: 700; text-align: center; }
  .symposium-page .symp-th-tier span { font-size: 11px; font-weight: 400; }
  .symposium-page .symp-th-platinum { background: var(--blue); }
  .symposium-page .symp-th-gold { background: #9A7200; }
  .symposium-page .symp-th-silver { background: #607080; }
  .symposium-page .symp-th-bronze { background: #8B5A2B; }
  .symposium-page .symp-th-community { background: #1A7A5E; border-radius: 0 8px 0 0; }
  .symposium-page .symp-td-benefit { padding: 10px 14px; color: #444; border-bottom: 1px solid #eee; }
  .symposium-page .symp-td-tier { padding: 10px; text-align: center; border-bottom: 1px solid #eee; }
  .symposium-page .symp-val-yes { color: var(--blue); font-weight: 700; }
  .symposium-page .symp-val-no { color: #ccc; }
  .symposium-page .symp-val-text { color: var(--grey); font-weight: 400; }
  .symposium-page .symp-row-alt { background: #f8f9fb; }
  .symposium-page .symp-tiers-footnote { font-size: 11px; color: #aaa; text-align: center; margin-top: 12px; }
  .symposium-page .symp-sponsor-cta { background: var(--blue); border-radius: var(--evt-radius); padding: 44px 40px; }
  .symposium-page .symp-sponsor-cta-inner { text-align: center; margin-bottom: 32px; }
  .symposium-page .symp-sponsor-cta-inner h3 { font-size: 22px; font-weight: 700; color: var(--white); margin-bottom: 8px; }
  .symposium-page .symp-sponsor-cta-inner p { color: rgba(255,255,255,.8); font-size: 14px; max-width: 540px; margin: 0 auto; }
  .symposium-page .symp-sponsor-cta-inner a { color: var(--white); font-weight: 600; }
  .symposium-page .symp-sponsor-cta-btn { text-align: center; }
  .symposium-page .symp-sponsor-cta-btn a { display: inline-block; background: var(--white); color: var(--blue); font-size: 15px; font-weight: 700; padding: 14px 40px; border-radius: 8px; }

  /* REGISTER */
  .symposium-page #symp-register { padding: var(--evt-rhythm) 0; background: var(--blue); position: relative; overflow: hidden; }
  .symposium-page .symp-reg-bg { position: absolute; inset: 0; background-image: linear-gradient(rgba(255,255,255,.04) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.04) 1px,transparent 1px); background-size: 48px 48px; }
  /* Stacked layout (intro block, then a full-width white form card below) —
     changed 13 Aug 2026 from the old 2-column intro/button grid, to make
     room for the inline Register Your Interest form (was previously just a
     single "Register Now" button linking to a mailto). */
  .symposium-page .symp-reg-inner { position: relative; z-index: 2; }
  .symposium-page .symp-reg-title { font-size: clamp(26px,4vw,42px); font-weight: 800; color: var(--white); line-height: 1.12; margin-bottom: 16px; }
  .symposium-page .symp-reg-sub { font-size: 16px; font-weight: 300; color: rgba(255,255,255,.68); line-height: 1.7; max-width: 640px; margin-bottom: 8px; }
  .symposium-page .symp-reg-includes { font-size: 13px; font-weight: 300; color: rgba(255,255,255,.85); margin-bottom: 32px; }
  .symposium-page .symp-reg-rates { display: flex; gap: 32px; flex-wrap: wrap; margin-bottom: 48px; }
  .symposium-page .symp-rate-lbl { font-size: 9.5px; font-weight: 600; letter-spacing: .15em; text-transform: uppercase; color: rgba(255,255,255,.4); margin-bottom: 4px; }
  .symposium-page .symp-rate-val { font-size: 20px; font-weight: 800; color: var(--white); margin-bottom: 2px; }
  .symposium-page .symp-rate-note { display: block; font-size: 11px; font-weight: 400; color: rgba(255,255,255,.55); margin-top: 2px; }

  /* Register Your Interest form — inline card, "sr-" prefixed classes
     (added 13 Aug 2026), same field/consent/notice pattern as the
     Membership Sign-Up form's "ms-" classes, styled to sit on the blue
     #symp-register background instead of the light Membership page. */
  .symposium-page .sr-form-card {
    background: var(--white);
    border-radius: var(--evt-radius);
    padding: 40px 36px;
    max-width: 720px;
    box-shadow: 0 24px 60px rgba(2,72,122,.25);
  }
  .symposium-page .sr-form-title { font-size: 20px; font-weight: 700; color: var(--grey); margin-bottom: 6px; }
  .symposium-page .sr-form-sub { font-size: 13.5px; font-weight: 300; color: var(--muted); line-height: 1.6; margin-bottom: 26px; }

  .symposium-page .sr-field { margin-bottom: 20px; }
  .symposium-page .sr-field label {
    display: block;
    font-size: 13px;
    font-weight: 600;
    margin-bottom: 6px;
    color: var(--grey);
  }
  .symposium-page .sr-field label .req { color: var(--blue); }
  .symposium-page .sr-field input[type="text"],
  .symposium-page .sr-field input[type="email"],
  .symposium-page .sr-field input[type="tel"],
  .symposium-page .sr-field select {
    width: 100%;
    padding: 12px 14px;
    border: 1.5px solid #e2e2e2;
    border-radius: 6px;
    font-family: inherit;
    font-size: 14.5px;
    color: var(--grey);
    background: var(--white);
  }
  .symposium-page .sr-field input:focus,
  .symposium-page .sr-field select:focus { outline: none; border-color: var(--blue); }

  .symposium-page .sr-field-row { display: flex; gap: 16px; }
  .symposium-page .sr-field-row .sr-field { flex: 1; }

  /* Honeypot field — same off-screen technique as Contact's .cc-hp and
     Membership's .ms-hp; not display:none, since some spam bots skip that. */
  .symposium-page .sr-hp {
    position: absolute;
    left: -9999px;
    top: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
  }

  .symposium-page .sr-turnstile-field { margin-bottom: 18px; }

  .symposium-page .sr-consent-row {
    display: flex;
    gap: 10px;
    align-items: flex-start;
    font-size: 13px;
    color: #444;
    line-height: 1.5;
    margin: 22px 0 8px;
  }
  .symposium-page .sr-consent-row input { margin-top: 3px; }
  .symposium-page .sr-consent-row a { color: var(--blue); text-decoration: underline; }

  .symposium-page .sr-form-card button.btn-primary { border: none; cursor: pointer; font-family: inherit; font-size: 14.5px; width: 100%; }

  .symposium-page .sr-approval-notice {
    margin-top: 18px;
    padding: 12px 14px;
    background: #FFF6E5;
    border: 1px solid #F0D9A6;
    border-radius: 8px;
    font-size: 13px;
    font-weight: 600;
    color: #8a6415;
    text-align: center;
    line-height: 1.5;
  }

  .symposium-page .sr-privacy-note { font-size: 12px; color: #888; margin-top: 16px; line-height: 1.6; }
  .symposium-page .sr-privacy-note a { color: var(--blue); text-decoration: underline; }

  /* VENUE */
  .symposium-page #symp-venue { padding: var(--evt-rhythm) 0; background: var(--off-white); }
  .symposium-page .symp-venue-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: start; }
  .symposium-page .symp-venue-map { border-radius: 10px; overflow: hidden; aspect-ratio: 4/3; background: var(--light); border: 1px solid var(--border); margin-top: 24px; }
  .symposium-page .symp-venue-rows { margin-top: 64px; }
  .symposium-page .symp-venue-row { display: flex; gap: 16px; padding: 16px 0; border-bottom: 1px solid var(--border); }
  .symposium-page .symp-venue-row:first-child { border-top: 1px solid var(--border); }
  .symposium-page .symp-venue-icon { font-size: 16px; flex-shrink: 0; padding-top: 1px; }
  .symposium-page .symp-venue-row-lbl { font-size: 9.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--muted); opacity: .65; margin-bottom: 3px; }
  .symposium-page .symp-venue-row-val { font-size: 14px; color: var(--grey); line-height: 1.5; }
  .symposium-page .symp-venue-row-val strong { font-weight: 600; }
  .symposium-page .symp-venue-directions { margin-top: 26px; }

  /* ===== COUNTDOWN (V17, 5 Oct 2026) =====
     Hero counter. Same roll mechanics as the GCX Awards counter, in the
     Symposium's blue and left-aligned to match this page's hero. */
  .symposium-page .symp-countdown { margin: -8px 0 36px; }
  .symposium-page .symp-cd-cells { display: flex; flex-wrap: wrap; gap: 10px 14px; }
  .symposium-page .symp-cd-cell { min-width: 84px; padding: 12px 14px 10px; border: 1px solid rgba(4,124,196,.45); border-radius: var(--evt-radius); background: rgba(4,124,196,.14); text-align: center; }
  .symposium-page .symp-cd-num { position: relative; display: block; height: 1.05em; overflow: hidden; font-size: 34px; font-weight: 800; line-height: 1.05; color: var(--white); font-variant-numeric: tabular-nums; }
  .symposium-page .symp-cd-digit { position: absolute; left: 0; right: 0; top: 0; display: block; text-align: center; }
  .symposium-page .symp-cd-digit--in  { animation: sympRollIn .42s cubic-bezier(.22,.8,.3,1) both; }
  .symposium-page .symp-cd-digit--out { animation: sympRollOut .42s cubic-bezier(.22,.8,.3,1) both; }
  @keyframes sympRollIn  { from { transform: translateY(105%); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
  @keyframes sympRollOut { from { transform: translateY(0); opacity: 1; } to { transform: translateY(-105%); opacity: 0; } }
  @media (prefers-reduced-motion: reduce) {
    .symposium-page .symp-cd-digit--in, .symposium-page .symp-cd-digit--out { animation: none; }
  }
  .symposium-page .symp-cd-lbl { display: block; margin-top: 6px; font-size: 10px; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: var(--light); opacity: .8; }
  .symposium-page .symp-cd-note { margin-top: 12px; font-size: 12px; letter-spacing: .1em; text-transform: uppercase; color: rgba(255,255,255,.5); }
  .symposium-page .symp-cd-live { display: inline-flex; align-items: center; gap: 10px; font-size: 15px; font-weight: 600; color: var(--white); background: rgba(4,124,196,.25); border: 1px solid rgba(4,124,196,.55); border-radius: 100px; padding: 9px 20px 9px 12px; }
  .symposium-page .symp-cd-live .symp-pulse { width: 10px; height: 10px; background: #6CC3F5; border-radius: 50%; animation: symp-pulse 2.2s infinite; }
  .symposium-page .symp-countdown [hidden] { display: none; }
  @media (max-width: 600px) {
    .symposium-page .symp-cd-cells { gap: 8px; }
    .symposium-page .symp-cd-cell { min-width: 0; flex: 1 1 64px; padding: 10px 6px 8px; }
    .symposium-page .symp-cd-num { font-size: 24px; }
    .symposium-page .symp-cd-lbl { font-size: 9px; letter-spacing: .1em; }
  }

  /* ===== SPEAKER CARDS, PROGRAMME PEOPLE, PROFILE DRAWER (V16, 25 Sep 2026) =====
     Built from wp-admin -> Event Speakers. Scoped to .symposium-page like the
     rest of the Symposium styles. */
  .symposium-page .symp-spk-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
  .symposium-page .symp-spk-card { display: grid; grid-template-columns: 96px 1fr; gap: 18px; align-items: center; text-align: left; background: var(--white); border: 1px solid var(--border); border-radius: var(--evt-radius); padding: 18px; font: inherit; color: inherit; cursor: pointer; transition: transform .2s, box-shadow .2s, border-color .2s; width: 100%; }
  .symposium-page .symp-spk-card:hover { transform: translateY(-3px); box-shadow: 0 10px 24px rgba(4,124,196,.12); border-color: #b7dcf2; }
  .symposium-page .symp-spk-card:focus-visible, .symposium-page .symp-spk-chip:focus-visible, .symposium-page .symp-prog-person:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
  .symposium-page .symp-spk-card.is-static { cursor: default; }
  .symposium-page .symp-spk-card.is-static:hover { transform: none; box-shadow: none; border-color: var(--border); }
  .symposium-page .symp-spk-av { width: 96px; height: 96px; border-radius: 50%; object-fit: cover; display: flex; align-items: center; justify-content: center; flex-shrink: 0; background: linear-gradient(135deg, var(--blue-deep), var(--blue)); color: var(--white); font-weight: 700; font-size: 28px; }
  .symposium-page .symp-spk-av--tba { background: #EEF2F5; color: #9CA3AF; border: 2px dashed #cbd5e1; }
  .symposium-page .symp-spk-av--sm { width: 40px; height: 40px; font-size: 13px; }
  .symposium-page .symp-spk-av--xs { width: 26px; height: 26px; font-size: 10px; }
  .symposium-page .symp-spk-body { display: flex; flex-direction: column; min-width: 0; }
  .symposium-page .symp-spk-tag { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; font-weight: 700; color: var(--blue); margin-bottom: 4px; }
  .symposium-page .symp-spk-name { font-weight: 700; color: var(--grey); font-size: 17px; line-height: 1.3; }
  .symposium-page .symp-spk-role { font-size: 13px; color: var(--muted); line-height: 1.4; margin-top: 3px; }
  .symposium-page .symp-spk-org { font-size: 13px; color: var(--blue); font-weight: 600; margin-top: 3px; }
  .symposium-page .symp-spk-talk { font-size: 13px; color: var(--grey); font-style: italic; line-height: 1.4; margin-top: 8px; }
  .symposium-page .symp-spk-panel { margin-top: 28px; background: var(--grey); border-radius: var(--evt-radius); padding: 24px 28px; display: grid; grid-template-columns: 1fr auto; gap: 22px; align-items: center; }
  .symposium-page .symp-spk-panel-eyebrow { display: block; font-size: 10.5px; letter-spacing: .18em; text-transform: uppercase; font-weight: 600; color: var(--light); margin-bottom: 6px; }
  .symposium-page .symp-spk-panel-title { margin: 0; font-size: 19px; line-height: 1.35; color: var(--white); font-weight: 700; }
  .symposium-page .symp-spk-panel-title em { font-weight: 400; }
  .symposium-page .symp-spk-panel-people { display: flex; flex-wrap: wrap; gap: 10px; }
  .symposium-page .symp-spk-chip { display: flex; align-items: center; gap: 10px; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.14); border-radius: 40px; padding: 5px 16px 5px 5px; color: var(--white); font: inherit; text-align: left; cursor: pointer; }
  .symposium-page .symp-spk-chip:hover { background: rgba(4,124,196,.3); }
  .symposium-page .symp-spk-chip.is-static { cursor: default; }
  .symposium-page .symp-spk-chip.is-static:hover { background: rgba(255,255,255,.06); }
  .symposium-page .symp-spk-chip > span { font-size: 13px; font-weight: 600; line-height: 1.25; }
  .symposium-page .symp-spk-chip small { display: block; font-size: 11px; font-weight: 400; color: rgba(255,255,255,.55); }
  .symposium-page .symp-prog-who { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
  .symposium-page .symp-prog-person { display: inline-flex; align-items: center; gap: 8px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.12); border-radius: 30px; padding: 3px 12px 3px 3px; color: rgba(255,255,255,.85); font: inherit; font-size: 12.5px; cursor: pointer; }
  .symposium-page button.symp-prog-person:hover { border-color: var(--blue); background: rgba(4,124,196,.2); }
  .symposium-page span.symp-prog-person { cursor: default; }
  .symposium-page .symp-prog-person small { font-size: 11px; color: rgba(255,255,255,.45); }
  /* Drawer (sits outside the section flow; fixed to the viewport) */
  .symp-spk-drawer-wrap { position: fixed; inset: 0; z-index: 1000; }
  .symp-spk-scrim { position: absolute; inset: 0; background: rgba(0,0,0,.45); opacity: 0; transition: opacity .25s; }
  .symp-spk-drawer { position: absolute; top: 0; right: 0; bottom: 0; width: min(440px, 100%); background: #fff; overflow: auto; transform: translateX(100%); transition: transform .26s ease; box-shadow: -10px 0 30px rgba(0,0,0,.15); outline: none; font-family: 'Poppins', sans-serif; }
  .symp-spk-drawer-wrap.is-open .symp-spk-scrim { opacity: 1; }
  .symp-spk-drawer-wrap.is-open .symp-spk-drawer { transform: none; }
  html.symp-spk-lock { overflow: hidden; }
  .symp-spk-dh { background: #2B2B2B; color: #fff; padding: 34px 28px 26px; position: relative; }
  .symp-spk-x { position: absolute; top: 14px; right: 16px; width: 36px; height: 36px; border-radius: 50%; border: 0; background: rgba(255,255,255,.1); color: #fff; font-size: 22px; line-height: 1; cursor: pointer; }
  .symp-spk-d-photo img, .symp-spk-d-init { width: 112px; height: 112px; border-radius: 50%; object-fit: cover; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #02487A, #047CC4); color: #fff; font-weight: 700; font-size: 34px; margin-bottom: 16px; }
  .symp-spk-d-tag { display: block; font-size: 10.5px; letter-spacing: .16em; text-transform: uppercase; font-weight: 700; color: #CFE9F5; margin-bottom: 4px; }
  .symp-spk-d-name { margin: 0; font-size: 22px; font-weight: 700; color: #fff; line-height: 1.25; }
  .symp-spk-d-role { font-size: 13.5px; color: #CFE9F5; margin-top: 4px; line-height: 1.45; }
  .symp-spk-db { padding: 22px 28px 40px; }
  .symp-spk-k { font-size: 10.5px; letter-spacing: .16em; text-transform: uppercase; color: #047CC4; font-weight: 700; margin-top: 18px; }
  .symp-spk-v, .symp-spk-d-bio { font-size: 14.5px; color: #2B2B2B; line-height: 1.6; margin: 4px 0 0; }
  .symp-spk-d-li[hidden] { display: none; }
  .symp-spk-d-li { display: block; width: fit-content; margin-top: 16px; font-size: 13px; color: #047CC4; font-weight: 600; }
  .symp-spk-d-cta { display: block; width: fit-content; margin-top: 26px; background: #047CC4; color: #fff; text-decoration: none; padding: 12px 26px; border-radius: 4px; font-weight: 600; font-size: 13.5px; }
  @media (max-width: 960px) {
    .symposium-page .symp-spk-grid { grid-template-columns: 1fr 1fr; }
    .symposium-page .symp-spk-panel { grid-template-columns: 1fr; }
  }
  @media (max-width: 600px) {
    .symposium-page .symp-spk-grid { grid-template-columns: 1fr; }
    .symposium-page .symp-spk-card { grid-template-columns: 72px 1fr; padding: 14px; }
    .symposium-page .symp-spk-card .symp-spk-av { width: 72px; height: 72px; font-size: 22px; }
    .symposium-page .symp-spk-panel { padding: 20px; }
  }


  /* SYMPOSIUM PAGE — RESPONSIVE */
  @media (max-width: 960px) {
    .symposium-page .symp-about-grid,
    .symposium-page .symp-venue-grid { grid-template-columns: 1fr; gap: 44px; }
    .symposium-page .symp-pillars-r1 { grid-template-columns: 1fr 1fr; }
    .symposium-page .symp-pillars-r2 { grid-template-columns: 1fr; max-width: 100%; }
    .symposium-page .symp-prog-row { grid-template-columns: 90px 1fr; }
    .symposium-page .symp-prog-badge { display: none; }
    .symposium-page .symp-why-grid { grid-template-columns: 1fr; }
    .symposium-page .sr-form-card { padding: 30px 22px; }
  }
  @media (max-width: 600px) {
    .symposium-page .symp-pillars-r1 { grid-template-columns: 1fr; }
    .symposium-page .symp-stat-grid { grid-template-columns: 1fr; }
    .symposium-page .symp-stat-cell.symp-hero-stat { grid-column: 1; }
    .symposium-page #symp-hero { min-height: 0; padding: calc(var(--evt-rhythm-sm) + 8px) 0 var(--evt-rhythm-sm); }
    .symposium-page .sr-field-row { flex-direction: column; gap: 0; }
  }

  /* ============================================================
     MEMBERSHIP PAGE (slug: membership) and OUR MEMBERS PAGE
     (slug: our-members) — added 10 Aug 2026. Uses the site's
     existing tokens/classes directly (no scoped wrapper needed,
     unlike the ported Symposium page) since both were built fresh
     for this theme rather than adapted from another design system.
     ============================================================ */

  /* Shared light CTA band — used at the bottom of both pages to
     cross-link Membership <-> Our Members. */
  section.section-cta-light { background: var(--light); text-align: center; }
  section.section-cta-light .eyebrow-block { justify-content: center; }
  section.section-cta-light h2.section-title { margin: 0 auto 24px; }
  .btn-outline--dark { border-color: var(--blue); color: var(--blue); }
  .btn-outline--dark:hover { background: var(--blue); color: var(--white); }

  /* MEMBERSHIP — intro copy */
  section.membership-intro { padding-bottom: 30px; }
  section.membership-intro p { font-size: 15.5px; max-width: 760px; margin-bottom: 18px; }
  section.membership-intro p:last-child { margin-bottom: 0; }

  /* MEMBERSHIP — activities & benefits */
  section.membership-details { background: var(--light); }
  .membership-details-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 28px;
    margin-top: 44px;
  }
  .membership-detail-card { background: var(--white); border-radius: 8px; padding: 32px 28px; }
  .membership-detail-card h3 { font-size: 18px; font-weight: 700; margin-bottom: 16px; }
  .membership-detail-card h4 {
    font-size: 12.5px;
    text-transform: uppercase;
    letter-spacing: 1.4px;
    font-weight: 600;
    color: var(--blue);
    margin: 20px 0 8px;
  }
  .membership-detail-card h4:first-of-type { margin-top: 0; }
  .membership-detail-card ul { list-style: disc; padding-left: 20px; }
  .membership-detail-card li { font-size: 14.5px; margin-bottom: 6px; opacity: 0.85; line-height: 1.5; }

  /* MEMBERSHIP — tier cards */
  section.membership-tiers { padding-top: 90px; }
  .tier-cards {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 28px;
    margin-top: 44px;
    align-items: stretch;
  }
  .tier-card {
    border: 1px solid #eee;
    border-radius: 10px;
    padding: 32px 26px;
    display: flex;
    flex-direction: column;
  }
  .tier-card--individual { background: var(--white); }
  .tier-card--associate { background: var(--white); border-color: var(--light); }
  .tier-card--corporate { background: var(--blue); border-color: var(--blue); color: var(--white); }
  .tier-badge {
    display: inline-block;
    align-self: flex-start;
    padding: 6px 16px;
    border-radius: 20px;
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
  }
  .tier-card--individual .tier-badge { background: var(--grey); color: var(--white); }
  .tier-card--associate .tier-badge { background: var(--light); color: var(--blue); }
  .tier-card--corporate .tier-badge { background: var(--white); color: var(--blue); }
  .tier-list { list-style: disc; padding-left: 18px; margin-bottom: 20px; flex-grow: 1; }
  .tier-list li { font-size: 14px; margin-bottom: 8px; line-height: 1.5; }
  .tier-card--corporate .tier-list { opacity: 0.95; }
  .tier-price { margin-bottom: 6px; }
  .tier-price .amount { font-size: 32px; font-weight: 800; }
  .tier-price .period { font-size: 13px; font-weight: 500; opacity: 0.7; margin-left: 4px; }
  .tier-footnote { font-size: 11.5px; opacity: 0.7; line-height: 1.5; margin-bottom: 22px; }
  .tier-card--corporate .tier-footnote { opacity: 0.85; }
  .tier-cta { text-align: center; }
  .tier-cta .btn-primary { width: 100%; text-align: center; }
  .tier-card--corporate .tier-cta .btn-primary { background: var(--white); color: var(--blue); }
  .tier-note { font-size: 12.5px; opacity: 0.65; text-align: center; margin-top: 30px; }

  /* OUR MEMBERS — roster grid */
  section.members-wall .members-category { margin-bottom: 56px; }
  section.members-wall .members-category:last-child { margin-bottom: 0; }
  .members-category-intro { font-size: 14px; opacity: 0.7; margin-top: -18px; margin-bottom: 4px; max-width: 640px; }
  .members-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin-top: 24px;
  }
  .member-pill {
    background: var(--white);
    border: 1px solid #eee;
    border-radius: 6px;
    padding: 12px 16px;
    font-size: 13.5px;
    color: var(--grey);
  }
  .members-note { font-size: 12.5px; opacity: 0.65; font-style: italic; margin-top: 36px; }

  @media (max-width: 900px) {
    .membership-details-grid { grid-template-columns: 1fr; }
    .tier-cards { grid-template-columns: 1fr; }
    .members-grid { grid-template-columns: 1fr 1fr; }
  }
  @media (max-width: 560px) {
    .members-grid { grid-template-columns: 1fr; }
  }

  /* CONTACT PAGE */
  section.contact-page { background: var(--light); padding: 90px 0 110px; }
  .contact-grid {
    display: grid;
    grid-template-columns: 1.3fr 1fr;
    gap: 32px;
    align-items: start;
  }
  .contact-form-card,
  .contact-info-card {
    border-radius: 10px;
    padding: 36px 32px;
  }
  .contact-form-card { background: var(--white); }
  .contact-info-card { background: var(--grey); color: var(--white); }
  .contact-info-card h3 { font-size: 18px; font-weight: 700; margin-bottom: 18px; }
  .contact-info-card ul { margin-bottom: 24px; }
  .contact-info-card li { font-size: 14.5px; margin-bottom: 10px; opacity: 0.9; }
  .contact-info-card li a { color: var(--white); text-decoration: underline; }
  .contact-info-card .contact-info-note { font-size: 12.5px; opacity: 0.7; line-height: 1.6; }
  .contact-info-card .contact-info-note a { color: var(--light); }

  .cc-field { margin-bottom: 20px; }
  .cc-field label {
    display: block;
    font-size: 13px;
    font-weight: 600;
    margin-bottom: 6px;
    color: var(--grey);
  }
  .cc-field input[type="text"],
  .cc-field input[type="email"],
  .cc-field select,
  .cc-field textarea {
    width: 100%;
    padding: 12px 14px;
    border: 1.5px solid #e2e2e2;
    border-radius: 6px;
    font-family: inherit;
    font-size: 14.5px;
    color: var(--grey);
    background: var(--white);
  }
  .cc-field textarea { min-height: 150px; resize: vertical; }
  .cc-field input:focus,
  .cc-field select:focus,
  .cc-field textarea:focus { outline: none; border-color: var(--blue); }

  /* Honeypot field — visually hidden off-screen rather than display:none,
     since some spam bots specifically skip display:none fields. Real users
     never see or reach it. */
  .cc-hp {
    position: absolute;
    left: -9999px;
    top: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
  }

  .cc-turnstile-field { margin-bottom: 18px; }
  .contact-form-card button.btn-primary { border: none; cursor: pointer; font-family: inherit; font-size: 14.5px; }
  .form-banner {
    padding: 14px 18px;
    border-radius: 6px;
    font-size: 14px;
    font-weight: 500;
    margin-bottom: 24px;
  }
  .form-banner--success { background: #e6f7ec; color: #1b6b3a; border: 1px solid #b8e6c8; }
  .form-banner--error { background: #fdecea; color: #a3251f; border: 1px solid #f5c2c0; }
  .contact-form-privacy { font-size: 12px; opacity: 0.6; margin-top: 16px; line-height: 1.6; }
  .contact-form-privacy a { color: var(--blue); text-decoration: underline; }

  @media (max-width: 900px) {
    .contact-grid { grid-template-columns: 1fr; }
  }

  /* MEMBERSHIP SIGN-UP PAGE (slug: membership-signup) — added 12 Aug 2026.
     Same mail-only/no-storage form pattern as the Contact page; kept as its
     own "ms-" prefixed class set (rather than reusing "cc-") so each form's
     styles stay self-contained, matching how Symposium ("symp-") and the
     Membership tier cards ("tier-") are each scoped separately. */
  section.membership-signup-page { background: var(--light); padding: 90px 0 110px; }
  .ms-grid {
    display: grid;
    grid-template-columns: 1.3fr 1fr;
    gap: 32px;
    align-items: start;
  }
  .ms-form-card,
  .ms-info-card {
    border-radius: 10px;
    padding: 36px 32px;
  }
  .ms-form-card { background: var(--white); }
  .ms-info-card { background: var(--grey); color: var(--white); }
  .ms-info-card h3 { font-size: 18px; font-weight: 700; margin-bottom: 18px; }
  .ms-info-card ul { margin-bottom: 24px; list-style: disc; padding-left: 18px; }
  .ms-info-card li { font-size: 14.5px; margin-bottom: 10px; opacity: 0.9; line-height: 1.5; }
  .ms-info-card .ms-info-note { font-size: 12.5px; opacity: 0.7; line-height: 1.6; }
  .ms-info-card .ms-info-note a { color: var(--light); }

  .ms-field { margin-bottom: 20px; }
  .ms-field label {
    display: block;
    font-size: 13px;
    font-weight: 600;
    margin-bottom: 6px;
    color: var(--grey);
  }
  .ms-field label .req { color: var(--blue); }
  .ms-field label .opt { font-weight: 400; color: #999; }
  .ms-field input[type="text"],
  .ms-field input[type="email"],
  .ms-field input[type="tel"],
  .ms-field select,
  .ms-field textarea {
    width: 100%;
    padding: 12px 14px;
    border: 1.5px solid #e2e2e2;
    border-radius: 6px;
    font-family: inherit;
    font-size: 14.5px;
    color: var(--grey);
    background: var(--white);
  }
  .ms-field textarea { min-height: 120px; resize: vertical; }
  .ms-field input:focus,
  .ms-field select:focus,
  .ms-field textarea:focus { outline: none; border-color: var(--blue); }

  .ms-field-row { display: flex; gap: 16px; }
  .ms-field-row .ms-field { flex: 1; }

  .ms-tier-hint {
    margin-top: 8px;
    font-size: 12.5px;
    padding: 10px 12px;
    background: var(--light);
    border-radius: 6px;
    color: #035f96;
    display: none;
  }
  .ms-tier-hint.show { display: block; }

  /* Honeypot field — same off-screen technique as the Contact form's .cc-hp;
     not display:none, since some spam bots specifically skip that. */
  .ms-hp {
    position: absolute;
    left: -9999px;
    top: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
  }

  .ms-turnstile-field { margin-bottom: 18px; }

  .ms-consent-row {
    display: flex;
    gap: 10px;
    align-items: flex-start;
    font-size: 13px;
    color: #444;
    line-height: 1.5;
    margin: 22px 0 8px;
  }
  .ms-consent-row input { margin-top: 3px; }
  .ms-consent-row a { color: var(--blue); text-decoration: underline; }

  .ms-form-card button.btn-primary { border: none; cursor: pointer; font-family: inherit; font-size: 14.5px; width: 100%; }

  .ms-approval-notice {
    margin-top: 18px;
    padding: 12px 14px;
    background: #FFF6E5;
    border: 1px solid #F0D9A6;
    border-radius: 8px;
    font-size: 13px;
    font-weight: 600;
    color: #8a6415;
    text-align: center;
    line-height: 1.5;
  }

  .ms-privacy-note { font-size: 12px; opacity: 0.6; margin-top: 16px; line-height: 1.6; }
  .ms-privacy-note a { color: var(--blue); text-decoration: underline; }

  @media (max-width: 900px) {
    .ms-grid { grid-template-columns: 1fr; }
    .ms-field-row { flex-direction: column; gap: 0; }
  }



  /* ============================================================
     GCX AWARDS PAGE (V12)
     Styles for page-awards.php — the CCAS Global Customer Experience
     Excellence Awards 2026. Every selector below is scoped under
     .awards-page so it can never collide with the rest of the site's
     CSS; all class names specific to this page are prefixed "gcx-".
     Custom properties needed only here (the deep navy the awards
     branding uses, plus the gold accent taken from the awards
     collateral) are scoped the same way rather than added to the
     global :root. Reuses the site's existing --blue / --light /
     --grey / --white tokens directly.
     ============================================================ */

  .awards-page {
    /* The three levers: ground, accent, and the lockup device in the hero. */
    --navy:      #02305A;   /* ground */
    --navy-deep: #011E3C;
    --gold:      #D9B36C;   /* accent */
    --gold-soft: #F0DCB4;
    --blue-dark: #035f97;
    /* Everything else comes from the shared event mechanics above. */
    --off-white: var(--evt-tint);
    --border:    var(--evt-border);
    --muted:     var(--evt-muted);
    font-family: 'Poppins', 'Calibri', Arial, sans-serif;
  }

  .awards-page .wrap { max-width: 1140px; padding: 0 36px; }
  .awards-page img { display: block; max-width: 100%; }

  .awards-page .gcx-eyebrow { font-size: var(--evt-eyebrow-size); font-weight: 600; letter-spacing: var(--evt-eyebrow-track); text-transform: uppercase; color: var(--blue); display: block; margin-bottom: 14px; }
  .awards-page .gcx-sec-title { font-size: clamp(26px,3vw,38px); font-weight: 700; line-height: 1.2; color: var(--grey); }
  .awards-page .gcx-divider { width: 36px; height: 3px; background: var(--blue); border-radius: 2px; margin: 20px 0; }
  .awards-page .gcx-lead { font-size: 15.5px; line-height: 1.75; color: var(--muted); max-width: 720px; }
  .awards-page .gcx-body { font-size: 15px; line-height: 1.8; color: #40566a; margin-bottom: 16px; }
  .awards-page .gcx-sec-hdr { margin-bottom: 40px; }
  .awards-page .gcx-center { text-align: center; margin-top: 28px; }

  /* Buttons */
  .awards-page .gcx-btn {
    display: inline-block;
    padding: 13px 26px;
    border-radius: 6px;
    font-size: 14px;
    font-weight: 600;
    text-decoration: none;
    line-height: 1.2;
    transition: transform .18s ease, background .18s ease, color .18s ease, box-shadow .18s ease;
  }
  .awards-page .gcx-btn:hover { transform: translateY(-2px); }
  .awards-page .gcx-btn--gold { background: var(--gold); color: #2A1E06; box-shadow: 0 6px 18px rgba(217,179,108,.28); }
  .awards-page .gcx-btn--gold:hover { background: var(--gold-soft); }
  .awards-page .gcx-btn--outline { border: 1.5px solid rgba(255,255,255,.5); color: var(--white); }
  .awards-page .gcx-btn--outline:hover { border-color: var(--white); background: rgba(255,255,255,.1); }
  .awards-page .gcx-btn--full { display: block; width: 100%; text-align: center; }

  /* HERO */
  .awards-page #gcx-hero {
    position: relative;
    overflow: hidden;
    background: radial-gradient(circle at 20% 10%, #063E70 0%, var(--navy) 45%, var(--navy-deep) 100%);
    padding: 88px 0 76px;
    color: var(--white);
  }
  .awards-page .gcx-hero-glow,
  .awards-page .gcx-hero-glow-2 {
    position: absolute;
    border-radius: 50%;
    pointer-events: none;
    filter: blur(70px);
  }
  .awards-page .gcx-hero-glow { width: 460px; height: 460px; top: -160px; right: -90px; background: rgba(4,124,196,.38); }
  .awards-page .gcx-hero-glow-2 { width: 380px; height: 380px; bottom: -180px; left: -80px; background: rgba(217,179,108,.16); }
  .awards-page .gcx-hero-content { position: relative; z-index: 2; text-align: center; }
  .awards-page .gcx-hero-logo { width: 100%; max-width: 340px; margin: 0 auto 30px; height: auto; opacity: .92; }
  .awards-page .gcx-hero-hl { font-size: clamp(30px,4.4vw,54px); font-weight: 800; line-height: 1.12; letter-spacing: -.5px; }
  .awards-page .gcx-hero-hl .hl2 { color: var(--gold); }
  .awards-page .gcx-hero-sub { margin: 20px auto 0; max-width: 640px; font-size: 15.5px; line-height: 1.75; color: rgba(255,255,255,.8); }

  /* Countdown */
  .awards-page .gcx-countdown {
    display: flex;
    justify-content: center;
    align-items: flex-end;
    flex-wrap: wrap;
    gap: 10px 18px;
    margin: 34px auto 0;
  }
  .awards-page .gcx-cd-cell {
    min-width: 78px;
    padding: 12px 14px;
    border: 1px solid rgba(255,255,255,.18);
    border-radius: 10px;
    background: rgba(255,255,255,.06);
  }
  .awards-page .gcx-cd-num {
    position: relative;
    display: block;
    height: 1.05em;
    overflow: hidden;
    font-size: 30px;
    font-weight: 800;
    line-height: 1.05;
    color: var(--gold);
    font-variant-numeric: tabular-nums;
  }
  .awards-page .gcx-cd-digit {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    display: block;
    text-align: center;
  }
  .awards-page .gcx-cd-digit--in  { animation: gcxRollIn .42s cubic-bezier(.22,.8,.3,1) both; }
  .awards-page .gcx-cd-digit--out { animation: gcxRollOut .42s cubic-bezier(.22,.8,.3,1) both; }

  @keyframes gcxRollIn {
    from { transform: translateY(105%); opacity: 0; }
    to   { transform: translateY(0);    opacity: 1; }
  }
  @keyframes gcxRollOut {
    from { transform: translateY(0);     opacity: 1; }
    to   { transform: translateY(-105%); opacity: 0; }
  }

  @media (prefers-reduced-motion: reduce) {
    .awards-page .gcx-cd-digit--in,
    .awards-page .gcx-cd-digit--out { animation: none; }
  }

  .awards-page .gcx-cd-note { width: 100%; font-size: 12px; letter-spacing: .1em; text-transform: uppercase; color: rgba(255,255,255,.55); }

  .awards-page .gcx-hero-eyebrow { color: var(--gold); margin-bottom: 10px; }
  /* Results preview: top of the PDF, faded, expandable (V18) */
  .awards-page .gcx-res-prev { position: relative; max-width: 860px; margin: 34px auto 0; border-radius: var(--evt-radius); overflow: hidden; background: #0b1220; box-shadow: 0 18px 48px rgba(0,0,0,.35); max-height: 900px; }
  .awards-page .gcx-res-prev.is-open { max-height: none; }
  .awards-page .gcx-res-pages canvas { display: block; width: 100%; height: auto; }
  .awards-page .gcx-res-prev.is-ready .gcx-res-fallback { display: none; }
  .awards-page .gcx-res-fallback img { width: 100%; height: auto; }
  .awards-page .gcx-res-card { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; min-height: 280px; padding: 40px 20px; text-decoration: none; color: var(--white); background: var(--navy-deep); }
  .awards-page .gcx-res-card span { font-size: 12px; letter-spacing: .16em; text-transform: uppercase; color: var(--gold); }
  .awards-page .gcx-res-card strong { font-size: 34px; font-weight: 800; }
  .awards-page .gcx-res-card em { font-style: normal; font-size: 14px; color: rgba(255,255,255,.75); text-decoration: underline; text-underline-offset: 3px; }
  .awards-page .gcx-res-fade { position: absolute; left: 0; right: 0; bottom: 0; height: 140px; background: linear-gradient(to bottom, rgba(1,30,60,0), rgba(1,30,60,.95)); pointer-events: none; }
  .awards-page .gcx-res-prev:not(.is-ready) .gcx-res-fade, .awards-page .gcx-res-prev.is-open .gcx-res-fade { display: none; }
  .awards-page .gcx-res-more { margin-top: 16px; }
  .awards-page button.gcx-res-toggle { background: transparent; font-family: inherit; cursor: pointer; }
  @media (max-width: 600px) { .awards-page .gcx-res-prev { max-height: 560px; } }
  .awards-page .gcx-poster-link.gcx-hero-poster { margin: 34px auto 0; max-width: 820px; box-shadow: 0 18px 48px rgba(0,0,0,.35); }
  .awards-page .gcx-hero-actions { display: flex; justify-content: center; flex-wrap: wrap; gap: 12px; margin-top: 34px; }

  .awards-page .gcx-hero-meta {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 1px;
    margin-top: 46px;
    background: rgba(255,255,255,.14);
    border: 1px solid rgba(255,255,255,.14);
    border-radius: 10px;
    overflow: hidden;
    text-align: left;
  }
  .awards-page .gcx-hero-meta-item { background: var(--navy); padding: 18px 20px; }
  .awards-page .gcx-hero-meta-item .lbl { display: block; font-size: 10px; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); margin-bottom: 7px; }
  .awards-page .gcx-hero-meta-item .val { display: block; font-size: 14px; font-weight: 600; color: var(--white); line-height: 1.45; }

  /* Shared section rhythm */
  .awards-page section { padding: var(--evt-rhythm) 0; }
  .awards-page #gcx-hero { padding: calc(var(--evt-rhythm) + 10px) 0 var(--evt-rhythm); }
  .awards-page #gcx-results,
  .awards-page #gcx-categories { background: var(--off-white); }

  /* Posters (Results, Judges) */
  .awards-page .gcx-poster-link {
    display: block;
    position: relative;
    max-width: 780px;
    margin: 0 auto;
    border-radius: var(--evt-radius);
    overflow: hidden;
    box-shadow: 0 14px 40px rgba(2,48,90,.16);
    cursor: zoom-in;
  }
  .awards-page .gcx-poster-link img { width: 100%; height: auto; }
  .awards-page .gcx-poster-hint {
    position: absolute;
    right: 14px;
    bottom: 14px;
    padding: 6px 12px;
    border-radius: 999px;
    background: rgba(2,48,90,.78);
    color: var(--white);
    font-size: 11px;
    letter-spacing: .06em;
    opacity: 0;
    transition: opacity .2s ease;
  }
  .awards-page .gcx-poster-link:hover .gcx-poster-hint { opacity: 1; }


  /* JUDGES (V18, 23 Oct 2026): navy band, featured Chairlady column + grid,
     profile drawer. Driven by wp-admin -> GCX Awards -> Judges. */
  .awards-page #gcx-judges { background: var(--navy); color: var(--white); }
  .awards-page #gcx-judges .gcx-eyebrow { color: var(--gold); }
  .awards-page #gcx-judges .gcx-sec-title { color: var(--white); }
  .awards-page #gcx-judges .gcx-lead { color: rgba(255,255,255,.72); }
  .awards-page .gcx-jdg.has-feat { display: grid; grid-template-columns: 230px minmax(0,1fr); gap: 36px; align-items: center; }
  .awards-page .gcx-jdg-feat { display: grid; gap: 28px; padding-right: 36px; border-right: 1px solid rgba(217,179,108,.35); }
  .awards-page .gcx-jdg-grid { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 30px 14px; }
  .awards-page .gcx-jdg-card { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 2px; background: none; border: 0; padding: 12px 6px 14px; margin: 0; border-radius: var(--evt-radius); font: inherit; color: inherit; cursor: pointer; width: 100%; transition: background .2s; }
  .awards-page button.gcx-jdg-card:hover, .awards-page button.gcx-jdg-card:focus-visible { background: rgba(255,255,255,.06); outline: none; }
  .awards-page button.gcx-jdg-card:focus-visible { box-shadow: 0 0 0 2px var(--gold); }
  .awards-page .gcx-jdg-card.is-static { cursor: default; }
  .awards-page .gcx-jdg-av { width: 112px; height: 112px; border-radius: 50%; object-fit: cover; border: 2px solid var(--gold); background: var(--navy-deep); margin-bottom: 12px; transition: transform .2s; }
  .awards-page button.gcx-jdg-card:hover .gcx-jdg-av { transform: scale(1.04); }
  .awards-page .gcx-jdg-av--init { display: flex; align-items: center; justify-content: center; color: var(--gold); font-weight: 700; font-size: 30px; }
  .awards-page .gcx-jdg-card--feat .gcx-jdg-av { width: 176px; height: 176px; font-size: 44px; }
  .awards-page .gcx-jdg-name { font-size: 15px; font-weight: 600; line-height: 1.3; color: var(--white); }
  .awards-page .gcx-jdg-card--feat .gcx-jdg-name { font-size: 19px; }
  .awards-page .gcx-jdg-role { font-size: 12px; font-weight: 500; color: var(--gold); margin-bottom: 4px; }
  .awards-page .gcx-jdg-card--feat .gcx-jdg-role { font-size: 13.5px; }
  .awards-page .gcx-jdg-title { font-size: 12px; line-height: 1.4; color: rgba(255,255,255,.82); }
  .awards-page .gcx-jdg-org { font-size: 12px; line-height: 1.4; color: #9FD0EE; margin-top: 2px; }
  .awards-page .gcx-jdg-more { font-size: 11px; letter-spacing: .06em; color: var(--gold-soft); margin-top: 8px; opacity: 0; transition: opacity .2s; }
  .awards-page button.gcx-jdg-card:hover .gcx-jdg-more, .awards-page button.gcx-jdg-card:focus-visible .gcx-jdg-more { opacity: 1; }
  .awards-page .gcx-jdg-poster-lbl { margin: 56px 0 14px; text-align: center; font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: rgba(255,255,255,.6); }
  .awards-page .gcx-poster-link--sm { max-width: 560px; }
  @media (max-width: 960px) {
    .awards-page .gcx-jdg.has-feat { grid-template-columns: 1fr; gap: 28px; }
    .awards-page .gcx-jdg-feat { padding: 0 0 28px; border-right: 0; border-bottom: 1px solid rgba(217,179,108,.35); justify-items: center; }
    .awards-page .gcx-jdg-feat .gcx-jdg-card { max-width: 280px; }
    .awards-page .gcx-jdg-grid { grid-template-columns: repeat(3, minmax(0,1fr)); }
  }
  @media (max-width: 600px) {
    .awards-page .gcx-jdg-grid { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 22px 8px; }
    .awards-page .gcx-jdg-av { width: 92px; height: 92px; font-size: 24px; }
    .awards-page .gcx-jdg-card--feat .gcx-jdg-av { width: 144px; height: 144px; }
    .awards-page .gcx-jdg-more { opacity: 1; }
  }
  .gcx-jdg-drawer-wrap { position: fixed; inset: 0; z-index: 1000; }
  .gcx-jdg-scrim { position: absolute; inset: 0; background: rgba(1,30,60,.55); opacity: 0; transition: opacity .25s; }
  .gcx-jdg-drawer { position: absolute; top: 0; right: 0; bottom: 0; width: min(440px, 100%); background: #fff; overflow: auto; transform: translateX(100%); transition: transform .26s ease; box-shadow: -10px 0 30px rgba(0,0,0,.2); outline: none; font-family: 'Poppins', sans-serif; }
  .gcx-jdg-drawer-wrap.is-open .gcx-jdg-scrim { opacity: 1; }
  .gcx-jdg-drawer-wrap.is-open .gcx-jdg-drawer { transform: none; }
  html.gcx-jdg-lock { overflow: hidden; }
  .gcx-jdg-dh { background: #011E3C; color: #fff; padding: 34px 28px 26px; position: relative; border-bottom: 3px solid #D9B36C; }
  .gcx-jdg-x { position: absolute; top: 14px; right: 16px; width: 36px; height: 36px; border-radius: 50%; border: 0; background: rgba(255,255,255,.1); color: #fff; font-size: 22px; line-height: 1; cursor: pointer; }
  .gcx-jdg-d-photo img, .gcx-jdg-d-init { width: 112px; height: 112px; border-radius: 50%; object-fit: cover; display: flex; align-items: center; justify-content: center; border: 2px solid #D9B36C; background: #02305A; color: #D9B36C; font-weight: 700; font-size: 34px; margin-bottom: 16px; }
  .gcx-jdg-d-tag { display: block; font-size: 10.5px; letter-spacing: .16em; text-transform: uppercase; font-weight: 700; color: #D9B36C; margin-bottom: 4px; }
  .gcx-jdg-d-name { margin: 0; font-size: 22px; font-weight: 700; color: #fff; line-height: 1.25; }
  .gcx-jdg-d-role { font-size: 13.5px; color: #CFE9F5; margin-top: 4px; line-height: 1.45; }
  .gcx-jdg-db { padding: 22px 28px 40px; }
  .gcx-jdg-k { font-size: 10.5px; letter-spacing: .16em; text-transform: uppercase; color: #02305A; font-weight: 700; }
  .gcx-jdg-d-bio { font-size: 14.5px; color: #2B2B2B; line-height: 1.6; margin: 6px 0 0; white-space: pre-line; }
  .gcx-jdg-d-li[hidden], .gcx-jdg-k[hidden], .gcx-jdg-d-bio[hidden] { display: none; }
  .gcx-jdg-d-li { display: block; width: fit-content; margin-top: 16px; font-size: 13px; color: #047CC4; font-weight: 600; }
  .gcx-jdg-d-cta { display: block; width: fit-content; margin-top: 26px; background: #D9B36C; color: #011E3C; text-decoration: none; padding: 12px 26px; border-radius: 4px; font-weight: 600; font-size: 13.5px; }

  /* GALA — dark section with a light form card, matching the site's
     established registration pattern (#symp-register). */
  .awards-page #gcx-gala {
    background: radial-gradient(circle at 12% 0%, #063E70 0%, var(--navy) 55%, var(--navy-deep) 100%);
    color: var(--white);
  }
  .awards-page .gcx-eyebrow--light { color: var(--gold); }
  .awards-page .gcx-sec-title--light { color: var(--white); }
  .awards-page .gcx-divider--gold { background: var(--gold); }
  .awards-page .gcx-gala-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 54px; align-items: start; }
  .awards-page .gcx-gala-sub { font-size: 15.5px; line-height: 1.75; color: rgba(255,255,255,.78); max-width: 520px; }
  .awards-page .gcx-gala-facts { list-style: none; margin: 24px 0 0; padding: 0; }
  .awards-page .gcx-gala-facts li {
    position: relative;
    padding-left: 24px;
    margin-bottom: 10px;
    font-size: 14.5px;
    line-height: 1.6;
    color: rgba(255,255,255,.82);
  }
  .awards-page .gcx-gala-facts li::before {
    content: '';
    position: absolute;
    left: 0;
    top: 8px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--gold);
  }

  .awards-page .gcx-rates { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 26px; }
  .awards-page .gcx-rate {
    flex: 1 1 180px;
    padding: 16px 18px;
    border: 1px solid rgba(255,255,255,.18);
    border-radius: 10px;
    background: rgba(255,255,255,.06);
  }
  .awards-page .gcx-rate:first-child { border-color: rgba(217,179,108,.5); background: rgba(217,179,108,.1); }
  .awards-page .gcx-rate-lbl { font-size: 10.5px; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.6); margin-bottom: 8px; }
  .awards-page .gcx-rate-val { font-size: 22px; font-weight: 800; color: var(--white); }
  .awards-page .gcx-rate:first-child .gcx-rate-val { color: var(--gold); }
  .awards-page .gcx-rate-val span { font-size: 11.5px; font-weight: 500; color: rgba(255,255,255,.55); margin-left: 4px; }
  .awards-page .gcx-rate-note { margin-top: 12px; font-size: 11.5px; color: rgba(255,255,255,.5); }

  .awards-page .gcx-gala-tie { margin-top: 26px; font-size: 13.5px; line-height: 1.7; color: rgba(255,255,255,.62); }
  .awards-page .gcx-gala-tie a { color: var(--gold-soft); text-decoration: underline; }

  /* Booking form card */
  .awards-page .gcx-form-card {
    background: var(--white);
    border-radius: var(--evt-radius);
    padding: 34px 32px;
    box-shadow: 0 18px 48px rgba(0,0,0,.28);
    color: var(--grey);
  }
  .awards-page .gcx-form-title { font-size: 20px; font-weight: 700; color: var(--navy); }
  .awards-page .gcx-form-sub { margin: 10px 0 24px; font-size: 13.5px; line-height: 1.7; color: var(--muted); }

  .awards-page .gcx-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

  .awards-page .gcx-field { margin-bottom: 18px; }
  .awards-page .gcx-field label {
    display: block;
    margin-bottom: 7px;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--navy);
  }
  .awards-page .gcx-field label .req { color: var(--blue); }
  .awards-page .gcx-field label .opt { font-weight: 400; color: var(--muted); font-size: 11.5px; }
  .awards-page .gcx-field input[type="text"],
  .awards-page .gcx-field input[type="email"],
  .awards-page .gcx-field input[type="tel"],
  .awards-page .gcx-field select,
  .awards-page .gcx-field textarea {
    width: 100%;
    padding: 11px 13px;
    border: 1px solid var(--border);
    border-radius: 7px;
    font-family: inherit;
    font-size: 14px;
    color: var(--grey);
    background: var(--white);
  }
  .awards-page .gcx-field textarea { resize: vertical; line-height: 1.6; }
  .awards-page .gcx-field input:focus,
  .awards-page .gcx-field select:focus,
  .awards-page .gcx-field textarea:focus { outline: 2px solid var(--blue); outline-offset: 1px; border-color: var(--blue); }
  .awards-page .gcx-field-row { display: flex; gap: 16px; }
  .awards-page .gcx-field-row .gcx-field { flex: 1; }

  .awards-page .gcx-turnstile-field { margin-bottom: 18px; }

  .awards-page .gcx-consent-row { display: flex; gap: 10px; align-items: flex-start; margin-bottom: 20px; }
  .awards-page .gcx-consent-row input { margin-top: 3px; flex-shrink: 0; }
  .awards-page .gcx-consent-row label { font-size: 12.5px; line-height: 1.6; color: var(--muted); font-weight: 400; margin: 0; }
  .awards-page .gcx-consent-row a { color: var(--blue); text-decoration: underline; }

  .awards-page .gcx-form button.gcx-btn { border: none; cursor: pointer; font-family: inherit; }

  .awards-page .gcx-approval-notice {
    margin-top: 18px;
    padding: 12px 14px;
    background: #FFF6E5;
    border: 1px solid #F0D9A6;
    border-radius: 8px;
    font-size: 12.5px;
    font-weight: 600;
    color: #8a6415;
    text-align: center;
    line-height: 1.55;
  }
  .awards-page .gcx-privacy-note { margin-top: 16px; font-size: 11.5px; line-height: 1.65; color: var(--muted); }
  .awards-page .gcx-privacy-note a { color: var(--blue); text-decoration: underline; }

  /* HIGHLIGHT REEL */
  .awards-page #gcx-reel { background: var(--navy-deep); color: var(--white); }
  .awards-page .gcx-reel-inner { max-width: 900px; margin: 0 auto; text-align: center; }
  .awards-page #gcx-reel .gcx-eyebrow { color: var(--gold); }
  .awards-page #gcx-reel .gcx-sec-title { color: var(--white); }
  .awards-page .gcx-reel-sub { margin: 14px 0 30px; font-size: 15px; color: rgba(255,255,255,.7); }
  .awards-page .gcx-video-frame {
    position: relative;
    aspect-ratio: 16 / 9;
    border-radius: var(--evt-radius);
    overflow: hidden;
    background: #000;
    box-shadow: 0 18px 48px rgba(0,0,0,.45);
  }
  .awards-page .gcx-video-frame iframe,
  .awards-page .gcx-video-frame video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
    object-fit: cover;
  }

  /* ABOUT */
  .awards-page .gcx-about-grid { display: grid; grid-template-columns: 1.15fr .85fr; gap: 56px; align-items: start; }
  .awards-page .gcx-signature { margin-top: 30px; padding-top: 22px; border-top: 1px solid var(--border); }
  .awards-page .gcx-sig-name { font-size: 20px; font-weight: 700; color: var(--navy); }
  .awards-page .gcx-sig-role { margin-top: 5px; font-size: 12.5px; color: var(--muted); }

  .awards-page .gcx-stat-grid { display: grid; gap: 14px; }
  .awards-page .gcx-stat-cell {
    padding: 24px 24px;
    border: 1px solid var(--border);
    border-radius: var(--evt-radius);
    background: var(--white);
  }
  .awards-page .gcx-stat-cell--hero { background: var(--navy); border-color: var(--navy); }
  .awards-page .gcx-stat-num { font-size: 40px; font-weight: 800; line-height: 1; color: var(--blue); }
  .awards-page .gcx-stat-cell--hero .gcx-stat-num { color: var(--gold); }
  .awards-page .gcx-stat-num sup { font-size: .5em; top: -.6em; }
  .awards-page .gcx-stat-lbl { margin-top: 10px; font-size: 13px; line-height: 1.6; color: var(--muted); }
  .awards-page .gcx-stat-cell--hero .gcx-stat-lbl { color: rgba(255,255,255,.75); }

  /* WHAT'S NEW */
  .awards-page .gcx-two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
  .awards-page .gcx-panel {
    padding: 30px 30px;
    border: 1px solid var(--border);
    border-radius: var(--evt-radius);
    background: var(--white);
  }
  .awards-page .gcx-panel--new { border-color: rgba(217,179,108,.6); background: #FFFCF5; }
  .awards-page .gcx-panel-title { font-size: 18px; font-weight: 700; color: var(--navy); margin-bottom: 18px; }
  .awards-page .gcx-tick-list { list-style: none; margin: 0; padding: 0; }
  .awards-page .gcx-tick-list li {
    position: relative;
    padding-left: 26px;
    margin-bottom: 13px;
    font-size: 14px;
    line-height: 1.7;
    color: #40566a;
  }
  .awards-page .gcx-tick-list li::before {
    content: '';
    position: absolute;
    left: 2px;
    top: 8px;
    width: 9px;
    height: 9px;
    border-radius: 2px;
    background: var(--blue);
  }
  .awards-page .gcx-panel--new .gcx-tick-list li::before { background: var(--gold); }
  .awards-page .gcx-note {
    margin-top: 26px;
    padding: 16px 20px;
    border-left: 3px solid var(--blue);
    background: var(--off-white);
    border-radius: 0 8px 8px 0;
    font-size: 13.5px;
    line-height: 1.7;
    color: var(--muted);
  }
  .awards-page .gcx-note a { color: var(--blue); text-decoration: underline; }

  /* CATEGORIES */
  .awards-page .gcx-group-title {
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--navy);
    margin: 44px 0 18px;
    padding-bottom: 12px;
    border-bottom: 1px solid var(--border);
  }
  .awards-page .gcx-group-title:first-of-type { margin-top: 0; }
  /* Condensed category list — the default view. Names only, no expansion.
     Deliberately borderless rows rather than an enclosed grid of cells: with
     an odd number of categories in a group, a filled cell grid leaves a blank
     tile at the end that reads as a missing item. */
  .awards-page .gcx-cat-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    column-gap: 36px;
  }
  .awards-page .gcx-cat-item {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 6px 12px;
    padding: 13px 2px;
    border-bottom: 1px solid var(--border);
    font-size: 14px;
    line-height: 1.5;
  }
  .awards-page .gcx-cat-name { font-weight: 600; color: var(--navy); }

  .awards-page .gcx-cat-grid { display: grid; gap: 10px; }
  .awards-page .gcx-cat {
    border: 1px solid var(--border);
    border-radius: 10px;
    background: var(--white);
    overflow: hidden;
    transition: border-color .18s ease, box-shadow .18s ease;
  }
  .awards-page .gcx-cat[open] { border-color: #B9DDF3; box-shadow: 0 8px 24px rgba(2,48,90,.07); }
  .awards-page .gcx-cat--new { border-color: rgba(217,179,108,.55); }
  .awards-page .gcx-cat summary {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px 14px;
    padding: 17px 46px 17px 22px;
    position: relative;
    cursor: pointer;
    font-size: 14.5px;
    font-weight: 600;
    color: var(--navy);
    list-style: none;
  }
  .awards-page .gcx-cat summary::-webkit-details-marker { display: none; }
  .awards-page .gcx-cat summary::after {
    content: '';
    position: absolute;
    right: 22px;
    top: 50%;
    width: 8px;
    height: 8px;
    margin-top: -6px;
    border-right: 2px solid var(--blue);
    border-bottom: 2px solid var(--blue);
    transform: rotate(45deg);
    transition: transform .2s ease;
  }
  .awards-page .gcx-cat[open] summary::after { transform: rotate(-135deg); margin-top: -2px; }
  .awards-page .gcx-cat summary:hover { background: var(--off-white); }
  .awards-page .gcx-cat-tag {
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--muted);
    padding: 4px 10px;
    border-radius: 999px;
    background: var(--off-white);
    border: 1px solid var(--border);
  }
  .awards-page .gcx-cat-tag--new { color: #7A5A16; background: #FFF6E4; border-color: rgba(217,179,108,.6); }
  .awards-page .gcx-cat > p {
    padding: 0 22px 20px;
    font-size: 14px;
    line-height: 1.75;
    color: #40566a;
  }
  .awards-page .gcx-cat > p + p { padding-top: 0; }

  .awards-page .gcx-callout {
    margin-top: 44px;
    padding: 30px 32px;
    border: 1px solid var(--border);
    border-radius: var(--evt-radius);
    background: var(--white);
  }
  .awards-page .gcx-callout-title { font-size: 17px; font-weight: 700; color: var(--navy); margin-bottom: 12px; }
  .awards-page .gcx-callout p { font-size: 14px; line-height: 1.75; color: #40566a; margin-bottom: 14px; }
  .awards-page .gcx-callout-foot { margin: 14px 0 0; font-weight: 600; color: var(--navy); }

  /* TIMELINE */
  .awards-page #gcx-timeline { background: var(--white); }
  .awards-page .gcx-timeline { list-style: none; margin: 0; padding: 0; position: relative; }
  .awards-page .gcx-timeline::before {
    content: '';
    position: absolute;
    left: 149px;
    top: 10px;
    bottom: 10px;
    width: 2px;
    background: var(--border);
  }
  .awards-page .gcx-tl-item {
    display: grid;
    grid-template-columns: 130px 1fr;
    gap: 40px;
    padding: 14px 0;
    position: relative;
  }
  .awards-page .gcx-tl-item::before {
    content: '';
    position: absolute;
    left: 144px;
    top: 22px;
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background: var(--white);
    border: 2px solid var(--blue);
    z-index: 1;
  }
  .awards-page .gcx-tl-item--feature::before { background: var(--gold); border-color: var(--gold); box-shadow: 0 0 0 5px rgba(217,179,108,.22); }
  .awards-page .gcx-tl-date { text-align: right; font-size: 13px; font-weight: 700; color: var(--blue); padding-top: 3px; }
  .awards-page .gcx-tl-item--feature .gcx-tl-date { color: #8A6415; }
  .awards-page .gcx-tl-title { font-size: 15px; font-weight: 600; color: var(--grey); }
  .awards-page .gcx-tl-item--feature .gcx-tl-title { font-size: 17px; color: var(--navy); }
  .awards-page .gcx-tl-meta { margin-top: 4px; font-size: 12.5px; color: var(--muted); }

  /* ARCHIVE — Past Winners (V14 23Sep2026). Dark navy band like the
     highlight reel: year buttons plus one panel, fixed height whichever
     year is picked. */
  .awards-page #gcx-archive { background: var(--navy-deep); color: var(--white); }
  .awards-page #gcx-archive .gcx-eyebrow { color: var(--gold); }
  .awards-page #gcx-archive .gcx-sec-title { color: var(--white); }
  .awards-page #gcx-archive .gcx-lead { color: rgba(255,255,255,.72); }
  .awards-page .gcx-arc-years { display: none; }
  .awards-page .gcx-arc.is-tabs .gcx-arc-years {
    display: flex; gap: 8px; overflow-x: auto; padding: 2px 2px 8px; margin-bottom: 22px;
    scrollbar-width: thin; -webkit-overflow-scrolling: touch;
  }
  .awards-page .gcx-arc-yr {
    flex: 0 0 auto; font: 600 14px/1 Poppins, Calibri, Arial, sans-serif;
    padding: 11px 17px; border-radius: 6px; cursor: pointer;
    border: 1px solid rgba(217,179,108,.45); background: transparent; color: var(--gold-soft);
    transition: border-color .15s, background .15s, color .15s;
  }
  .awards-page .gcx-arc-yr:hover { border-color: var(--gold); }
  .awards-page .gcx-arc-yr:focus-visible { outline: 2px solid var(--gold-soft); outline-offset: 2px; }
  .awards-page .gcx-arc-yr[aria-selected="true"] { background: var(--gold); border-color: var(--gold); color: #2a1e06; }
  .awards-page .gcx-arc-panel {
    display: grid; grid-template-columns: 200px 1fr; gap: 32px; align-items: center;
    background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.1);
    border-radius: var(--evt-radius); padding: 26px; margin-bottom: 16px;
  }
  .awards-page .gcx-arc.is-tabs .gcx-arc-panel { margin-bottom: 0; }
  .awards-page .gcx-arc.is-tabs .gcx-arc-panel[data-hidden] { display: none; }
  .awards-page .gcx-arc-cover {
    display: block; aspect-ratio: 400 / 566; border-radius: var(--evt-radius-sm); overflow: hidden;
    border: 1px solid rgba(217,179,108,.5); box-shadow: 0 6px 18px rgba(0,0,0,.35); background: var(--navy);
    transition: transform .2s;
  }
  .awards-page .gcx-arc-cover:hover { transform: translateY(-2px); }
  .awards-page .gcx-arc-cover img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: top; }
  .awards-page .gcx-arc-cover-ph {
    display: flex; flex-direction: column; justify-content: space-between; height: 100%; padding: 16px;
    background: linear-gradient(160deg, #0b4476, var(--navy));
  }
  .awards-page .gcx-arc-cover-ph .t { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; color: var(--gold-soft); line-height: 1.5; }
  .awards-page .gcx-arc-cover-ph .y { font-size: 40px; font-weight: 700; color: var(--gold); line-height: 1; }
  .awards-page .gcx-arc-title { font-size: 24px; font-weight: 700; color: var(--white); margin: 0 0 4px; }
  .awards-page .gcx-arc-label { font-size: 13.5px; color: var(--gold-soft); margin: 0 0 14px; }
  .awards-page .gcx-arc-text { font-size: 14.5px; line-height: 1.7; color: rgba(255,255,255,.72); margin: 0 0 22px; max-width: 520px; }
  .awards-page .gcx-arc-meta { display: inline-block; margin-left: 12px; font-size: 12px; color: rgba(255,255,255,.55); }

  .awards-page .gcx-empty {
    padding: 32px;
    border: 1px dashed #B9DDF3;
    border-radius: var(--evt-radius);
    background: var(--white);
    text-align: center;
  }
  .awards-page .gcx-empty p { font-size: 14px; line-height: 1.75; color: var(--muted); margin-bottom: 8px; }
  .awards-page .gcx-empty p:last-child { margin-bottom: 0; }
  .awards-page .gcx-empty a { color: var(--blue); text-decoration: underline; }

  /* ENQUIRIES */
  .awards-page #gcx-contact { background: var(--white); padding-bottom: calc(var(--evt-rhythm) + 14px); }
  .awards-page .gcx-contact-card {
    background: radial-gradient(circle at 15% 0%, #063E70 0%, var(--navy) 55%, var(--navy-deep) 100%);
    border-radius: var(--evt-radius);
    padding: 44px 42px;
    color: var(--white);
  }
  .awards-page .gcx-contact-card .gcx-sec-title { color: var(--white); }
  .awards-page .gcx-contact-card .gcx-lead { color: rgba(255,255,255,.75); margin-top: 12px; }
  .awards-page .gcx-contact-rows { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 30px; }
  .awards-page .gcx-contact-row {
    display: block;
    padding: 18px 20px;
    border: 1px solid rgba(255,255,255,.18);
    border-radius: 10px;
    background: rgba(255,255,255,.06);
    text-decoration: none;
    transition: background .18s ease, border-color .18s ease;
  }
  .awards-page .gcx-contact-row:hover { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.36); }
  .awards-page .gcx-contact-lbl { display: block; font-size: 10px; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); margin-bottom: 7px; }
  .awards-page .gcx-contact-val { display: block; font-size: 14.5px; font-weight: 600; color: var(--white); }

  @media (max-width: 980px) {
    .awards-page .gcx-gala-grid,
    .awards-page .gcx-about-grid,
    .awards-page .gcx-two-col { grid-template-columns: 1fr; gap: 34px; }
    .awards-page .gcx-hero-meta { grid-template-columns: repeat(2, 1fr); }
    .awards-page .gcx-contact-rows { grid-template-columns: 1fr; }
  }

  @media (max-width: 640px) {
    .awards-page section { padding: var(--evt-rhythm-sm) 0; }
    .awards-page #gcx-hero { padding: calc(var(--evt-rhythm-sm) + 8px) 0 var(--evt-rhythm-sm); }
    .awards-page .wrap { padding: 0 22px; }
    .awards-page .gcx-hero-meta { grid-template-columns: 1fr; }
    .awards-page .gcx-hero-actions .gcx-btn { width: 100%; text-align: center; }
    .awards-page .gcx-countdown { gap: 8px 10px; }
    .awards-page .gcx-cd-cell { min-width: 0; flex: 1 1 68px; padding: 10px 8px; }
    .awards-page .gcx-cd-num { font-size: 22px; }
    .awards-page .gcx-form-card { padding: 26px 22px; }
    .awards-page .gcx-field-row { flex-direction: column; gap: 0; }
    .awards-page .gcx-contact-card { padding: 32px 24px; }
    .awards-page .gcx-callout { padding: 24px 22px; }
    .awards-page .gcx-panel { padding: 24px 22px; }

    .awards-page .gcx-timeline::before { left: 5px; }
    .awards-page .gcx-tl-item { grid-template-columns: 1fr; gap: 4px; padding-left: 28px; }
    .awards-page .gcx-tl-item::before { left: 0; top: 18px; }
    .awards-page .gcx-tl-date { text-align: left; }

    .awards-page .gcx-arc-panel { grid-template-columns: 1fr; gap: 20px; padding: 20px; }
    .awards-page .gcx-arc-cover { max-width: 170px; }
    .awards-page .gcx-arc-meta { display: block; margin: 10px 0 0; }

    .awards-page .gcx-cat-list { grid-template-columns: 1fr; }
    .awards-page .gcx-cat-item { padding: 12px 2px; }
    .awards-page .gcx-cat summary { padding: 15px 40px 15px 18px; }
    .awards-page .gcx-cat > p { padding: 0 18px 18px; }
  }


  /* ============================================================
     AI SUMMIT 2027 PAGE (V18, 23 Oct 2026)
     page-ai-summit.php, rebuilt from the signed-off AI Summit 2027
     website brief. Base is the CCAS master palette, as the brief asks:
     Association Blue #047CC4, Service Light #CFE9F5, Anchor Grey
     #2B2B2B, Crest White. The AI Summit violet from past editions is the
     hero ground only. Topic cards and agenda rows follow the brief's
     fixed colour code. Shared rhythm, radius and eyebrow come from the
     --evt-* tokens. Class prefix "ax-", scoped to .aisummit-page.
     ============================================================ */

  .aisummit-page {
    --ax-blue:   #047CC4;
    --ax-light:  #CFE9F5;
    --ax-grey:   #2B2B2B;
    --ax-white:  #FFFFFF;
    --ax-violet: #37187D;
    --ax-violet-deep: #1F0E4A;
    --ax-tint:   var(--evt-tint);
    --ax-border: var(--evt-border);
    --ax-body:   #3d4a56;
    font-family: 'Poppins', 'Calibri', Arial, sans-serif;
    color: var(--ax-grey);
  }
  .aisummit-page .wrap { max-width: 1140px; padding: 0 36px; }
  .aisummit-page img { display: block; max-width: 100%; }
  .aisummit-page section { padding: var(--evt-rhythm) 0; scroll-margin-top: 64px; }
  .aisummit-page .ax-tint { background: var(--ax-tint); }

  .aisummit-page .ax-eyebrow { display: block; font-size: var(--evt-eyebrow-size); font-weight: 600; letter-spacing: var(--evt-eyebrow-track); text-transform: uppercase; color: var(--ax-blue); margin-bottom: 14px; }
  .aisummit-page .ax-eyebrow--light { color: var(--ax-light); }
  .aisummit-page .ax-hdr { margin-bottom: 40px; }
  .aisummit-page .ax-title { font-size: clamp(26px, 3vw, 38px); font-weight: 800; line-height: 1.2; color: var(--ax-grey); margin: 0; }
  .aisummit-page .ax-title--light { color: var(--ax-white); }
  .aisummit-page .ax-divider { width: 36px; height: 3px; background: var(--ax-blue); border-radius: 2px; margin: 20px 0; }
  .aisummit-page .ax-lead { font-size: 15.5px; line-height: 1.75; color: var(--ax-body); max-width: 760px; margin: 0; }
  .aisummit-page .ax-lead a { color: var(--ax-blue); font-weight: 600; }
  .aisummit-page .ax-big { font-size: clamp(18px, 2vw, 22px); font-weight: 600; line-height: 1.5; color: var(--ax-grey); max-width: 760px; margin: 0; }
  .aisummit-page .ax-sub { font-size: 20px; font-weight: 700; color: var(--ax-grey); margin: 64px 0 20px; }
  .aisummit-page .ax-sub--sm { font-size: 15px; font-weight: 600; margin: 40px 0 14px; }
  .aisummit-page .ax-note { font-size: 13.5px; line-height: 1.6; color: var(--ax-body); margin: 16px 0 0; }
  .aisummit-page .ax-center { text-align: center; margin-top: 22px; }

  /* Buttons */
  .aisummit-page .ax-btn { display: inline-flex; align-items: center; justify-content: center; padding: 14px 26px; border-radius: 6px; font-size: 14.5px; font-weight: 600; text-decoration: none; border: 2px solid transparent; cursor: pointer; font-family: inherit; line-height: 1.2; transition: background .2s, color .2s, border-color .2s; }
  .aisummit-page .ax-btn--blue { background: var(--ax-blue); color: var(--ax-white); }
  .aisummit-page .ax-btn--blue:hover { background: #0369a6; }
  .aisummit-page .ax-btn--ghost { border-color: rgba(255,255,255,.7); color: var(--ax-white); }
  .aisummit-page .ax-btn--ghost:hover { background: var(--ax-white); color: var(--ax-violet-deep); }
  .aisummit-page .ax-btn--line { border-color: var(--ax-blue); color: var(--ax-blue); background: var(--ax-white); }
  .aisummit-page .ax-btn--line:hover { background: var(--ax-blue); color: var(--ax-white); }
  .aisummit-page .ax-btn--sm { padding: 9px 16px; font-size: 13px; }
  .aisummit-page .ax-btn--full { width: 100%; }
  .aisummit-page .ax-btn-row { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 24px; }

  /* 1. Sticky top bar */
  .aisummit-page .ax-bar { position: sticky; top: 0; z-index: 50; background: var(--ax-white); border-bottom: 1px solid var(--ax-border); box-shadow: 0 2px 12px rgba(43,43,43,.06); }
  .aisummit-page .ax-bar .wrap { display: flex; align-items: center; gap: 18px; min-height: 60px; }
  .aisummit-page .ax-bar-name { font-weight: 800; font-size: 15px; color: var(--ax-grey); text-decoration: none; white-space: nowrap; }
  .aisummit-page .ax-bar-links { display: flex; gap: 4px; flex: 1; justify-content: center; }
  .aisummit-page .ax-bar-links a { font-size: 13.5px; font-weight: 500; color: var(--ax-grey); text-decoration: none; padding: 8px 10px; border-radius: 6px; white-space: nowrap; }
  .aisummit-page .ax-bar-links a:hover, .aisummit-page .ax-bar-links a.is-on { color: var(--ax-blue); background: var(--ax-tint); }
  .aisummit-page .ax-bar-btns { display: flex; gap: 8px; flex-shrink: 0; }

  /* 2. Hero */
  .aisummit-page .ax-hero { background: var(--ax-violet-deep); background-image: radial-gradient(ellipse at 85% 20%, rgba(4,124,196,.35), transparent 55%), radial-gradient(ellipse at 10% 100%, rgba(105,32,144,.55), transparent 60%); color: var(--ax-white); padding: calc(var(--evt-rhythm) + 10px) 0 var(--evt-rhythm); }
  .aisummit-page .ax-hero-grid { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 48px; align-items: center; }
  .aisummit-page .ax-hero-hl { font-size: clamp(40px, 6vw, 72px); font-weight: 800; line-height: 1.05; margin: 0 0 22px; color: var(--ax-white); letter-spacing: -.01em; }
  .aisummit-page .ax-hero-when { font-size: 18px; font-weight: 600; color: var(--ax-light); margin: 0 0 14px; }
  .aisummit-page .ax-hero-line { font-size: 17px; line-height: 1.65; color: rgba(255,255,255,.86); margin: 0 0 30px; max-width: 560px; }
  .aisummit-page .ax-hero-btns { display: flex; flex-wrap: wrap; gap: 12px; }
  .aisummit-page .ax-hero-note { font-size: 13.5px; color: rgba(255,255,255,.7); margin: 16px 0 0; }
  .aisummit-page .ax-hero-art svg { width: 100%; max-width: 380px; height: auto; display: block; margin: 0 auto; }
  .aisummit-page .ax-beam { transform-origin: 180px 142px; animation: ax-tilt 7s ease-in-out infinite; }
  @keyframes ax-tilt { 0%, 100% { transform: rotate(-6deg); } 50% { transform: rotate(4deg); } }
  @media (prefers-reduced-motion: reduce) { .aisummit-page .ax-beam { animation: none; transform: rotate(-3deg); } }

  /* 3. Theme */
  .aisummit-page .ax-theme { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr); gap: 48px; align-items: start; }
  .aisummit-page .ax-theme-block { background: var(--ax-grey); color: var(--ax-white); border-radius: var(--evt-radius); padding: 36px 32px; }
  .aisummit-page .ax-theme-title { font-size: clamp(28px, 3.2vw, 40px); font-weight: 800; line-height: 1.15; margin: 0; color: var(--ax-white); }
  .aisummit-page .ax-theme-tag { font-size: 16px; color: var(--ax-light); margin: 14px 0 0; }
  .aisummit-page .ax-theme-copy p { font-size: 16px; line-height: 1.8; color: var(--ax-body); margin: 0 0 16px; }
  .aisummit-page .ax-theme-copy strong { color: var(--ax-grey); }

  /* 4. Stats */
  .aisummit-page .ax-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }
  .aisummit-page .ax-stats--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 640px; margin-bottom: 24px; }
  .aisummit-page .ax-stat { background: var(--ax-white); border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 26px 24px; }
  .aisummit-page .ax-stat-num { font-size: 52px; font-weight: 800; line-height: 1; color: var(--ax-blue); margin-bottom: 12px; }
  .aisummit-page .ax-stat-lbl { font-size: 14.5px; line-height: 1.55; color: var(--ax-body); }

  /* 5. Topics: title Anchor Grey, hook Association Blue, questions Service Light */
  .aisummit-page .ax-topics { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 18px; }
  .aisummit-page .ax-topic { grid-column: span 2; display: flex; flex-direction: column; border-radius: var(--evt-radius); overflow: hidden; border: 1px solid var(--ax-border); }
  .aisummit-page .ax-topic:nth-child(4) { grid-column: 2 / span 2; }
  .aisummit-page .ax-topic-title { background: var(--ax-grey); color: var(--ax-white); font-size: 17px; font-weight: 700; line-height: 1.35; margin: 0; padding: 20px 22px; }
  .aisummit-page .ax-topic-n { color: var(--ax-light); }
  .aisummit-page .ax-topic-hook { background: var(--ax-blue); color: var(--ax-white); font-size: 15px; line-height: 1.55; margin: 0; padding: 16px 22px; }
  .aisummit-page .ax-topic-qs { background: var(--ax-light); color: var(--ax-grey); margin: 0; padding: 18px 22px 20px 42px; flex: 1; }
  .aisummit-page .ax-topic-qs li { font-size: 14px; line-height: 1.6; margin-bottom: 8px; }
  .aisummit-page .ax-topic-qs li:last-child { margin-bottom: 0; }
  .aisummit-page .ax-key { display: flex; flex-wrap: wrap; gap: 8px 22px; margin-top: 20px; font-size: 13px; color: var(--ax-body); }
  .aisummit-page .ax-key span { display: inline-flex; align-items: center; gap: 8px; }
  .aisummit-page .ax-key-sw { width: 16px; height: 16px; border-radius: 3px; display: inline-block; border: 1px solid rgba(0,0,0,.08); }
  .aisummit-page .ax-key-sw--grey { background: var(--ax-grey); }
  .aisummit-page .ax-key-sw--blue { background: var(--ax-blue); }
  .aisummit-page .ax-key-sw--light { background: var(--ax-light); }

  /* Cards */
  .aisummit-page .ax-cards { display: grid; gap: 18px; }
  .aisummit-page .ax-cards--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .aisummit-page .ax-cards--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .aisummit-page .ax-cards--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .aisummit-page .ax-card { background: var(--ax-white); border: 1px solid var(--ax-border); border-top: 4px solid var(--ax-blue); border-radius: var(--evt-radius); padding: 24px 24px 22px; }
  .aisummit-page .ax-card-title { font-size: 16.5px; font-weight: 700; line-height: 1.35; color: var(--ax-grey); margin: 0 0 10px; }
  .aisummit-page .ax-card p { font-size: 14.5px; line-height: 1.65; color: var(--ax-body); margin: 0; }

  /* 7. Agenda: a table on desktop, a timeline on mobile */
  .aisummit-page .ax-agenda { border: 1px solid var(--ax-border); border-radius: var(--evt-radius); overflow: hidden; }
  .aisummit-page .ax-ag-row { display: grid; grid-template-columns: 150px minmax(0, 1fr) 240px; gap: 18px; align-items: center; padding: 14px 22px; border-top: 1px solid var(--ax-border); background: var(--ax-white); }
  .aisummit-page .ax-ag-head { border-top: 0; background: var(--ax-tint); font-size: 11px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--ax-body); padding-top: 12px; padding-bottom: 12px; }
  .aisummit-page .ax-ag-time { font-size: 14px; font-weight: 600; color: var(--ax-blue); font-variant-numeric: tabular-nums; }
  .aisummit-page .ax-ag-sess { display: flex; flex-direction: column; gap: 3px; }
  .aisummit-page .ax-ag-title { font-size: 15px; font-weight: 600; color: var(--ax-grey); }
  .aisummit-page .ax-ag-label { font-size: 12.5px; color: var(--ax-body); }
  .aisummit-page .ax-ag-topic { align-self: flex-start; font-size: 11px; font-weight: 600; color: var(--ax-blue); background: var(--ax-light); border-radius: 999px; padding: 3px 10px; }
  .aisummit-page .ax-ag-who { font-size: 13.5px; color: var(--ax-body); display: flex; flex-wrap: wrap; gap: 6px; }
  .aisummit-page .ax-ag-ph { font-style: italic; }
  .aisummit-page .ax-ag-person { font: inherit; font-weight: 600; color: var(--ax-grey); background: none; border: 0; padding: 0; text-align: left; }
  .aisummit-page button.ax-ag-person { cursor: pointer; color: var(--ax-blue); text-decoration: underline; text-underline-offset: 3px; }
  .aisummit-page .ax-ag-person small { font-weight: 400; color: var(--ax-body); }
  .aisummit-page .ax-ag-row.is-break { background: var(--ax-grey); border-top-color: var(--ax-grey); }
  .aisummit-page .ax-ag-row.is-break .ax-ag-time, .aisummit-page .ax-ag-row.is-break .ax-ag-title { color: var(--ax-white); }
  .aisummit-page .ax-ag-row.is-panel { background: var(--ax-blue); border-top-color: var(--ax-blue); }
  .aisummit-page .ax-ag-row.is-panel .ax-ag-time, .aisummit-page .ax-ag-row.is-panel .ax-ag-title, .aisummit-page .ax-ag-row.is-panel .ax-ag-who, .aisummit-page .ax-ag-row.is-panel .ax-ag-label { color: var(--ax-white); }
  .aisummit-page .ax-ag-row.is-panel .ax-ag-person, .aisummit-page .ax-ag-row.is-panel .ax-ag-person small { color: var(--ax-white); }
  .aisummit-page .ax-ag-row.is-plain { background: var(--ax-tint); }

  /* 8. Speakers */
  .aisummit-page .ax-spk-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
  .aisummit-page .ax-spk { display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: 16px; align-items: center; text-align: left; background: var(--ax-white); border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 18px; font: inherit; color: inherit; cursor: pointer; width: 100%; transition: border-color .2s, box-shadow .2s; }
  .aisummit-page button.ax-spk:hover, .aisummit-page button.ax-spk:focus-visible { border-color: var(--ax-blue); box-shadow: 0 8px 24px rgba(4,124,196,.12); outline: none; }
  .aisummit-page .ax-spk.is-static { cursor: default; }
  .aisummit-page .ax-spk-av { width: 88px; height: 88px; border-radius: 50%; object-fit: cover; background: var(--ax-blue); }
  .aisummit-page .symp-spk-av--init.ax-spk-av { display: flex; align-items: center; justify-content: center; color: var(--ax-white); font-weight: 700; font-size: 26px; }
  .aisummit-page .ax-spk-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
  .aisummit-page .ax-spk-topic { align-self: flex-start; font-size: 11px; font-weight: 600; color: var(--ax-blue); background: var(--ax-light); border-radius: 999px; padding: 3px 10px; margin-bottom: 4px; }
  .aisummit-page .ax-spk-name { font-size: 16px; font-weight: 700; color: var(--ax-grey); }
  .aisummit-page .ax-spk-role { font-size: 13px; line-height: 1.45; color: var(--ax-body); }
  .aisummit-page .ax-spk-org { font-size: 13px; font-weight: 600; color: var(--ax-blue); }
  .aisummit-page .ax-poster { display: block; max-width: 780px; margin: 0 auto; border-radius: var(--evt-radius); overflow: hidden; }
  .ax-drawer .symp-spk-dh { background: var(--ax-grey, #2B2B2B); }
  .ax-drawer .symp-spk-d-cta { background: #047CC4; }

  /* 9. Tickets */
  .aisummit-page .ax-passes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; max-width: 820px; }
  .aisummit-page .ax-pass { border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 28px 28px 24px; background: var(--ax-white); }
  .aisummit-page .ax-pass--eb { border: 2px solid var(--ax-blue); }
  .aisummit-page .ax-pass-name { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--ax-blue); margin-bottom: 8px; }
  .aisummit-page .ax-pass-price { font-size: 40px; font-weight: 800; color: var(--ax-grey); line-height: 1.1; }
  .aisummit-page .ax-pass-price span, .aisummit-page .ax-tier-price span { font-size: 13px; font-weight: 500; color: var(--ax-body); }
  .aisummit-page .ax-pass-when { font-size: 14px; line-height: 1.55; color: var(--ax-body); margin-top: 10px; }

  /* Forms */
  .aisummit-page .ax-form-wrap { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); gap: 40px; align-items: start; margin-top: 56px; padding-top: 48px; border-top: 1px solid var(--ax-border); scroll-margin-top: 72px; }
  .aisummit-page .ax-form-title { font-size: 22px; font-weight: 800; color: var(--ax-grey); margin: 0 0 10px; }
  .aisummit-page .ax-form-intro p { font-size: 15px; line-height: 1.7; color: var(--ax-body); margin: 0; }
  .aisummit-page .ax-form-card { background: var(--ax-white); border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 28px; box-shadow: 0 10px 30px rgba(43,43,43,.06); }
  .aisummit-page .ax-field { margin-bottom: 16px; }
  .aisummit-page .ax-field-row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
  .aisummit-page .ax-field label { display: block; font-size: 13px; font-weight: 600; color: var(--ax-grey); margin-bottom: 6px; }
  .aisummit-page .ax-field .req { color: #c0392b; }
  .aisummit-page .ax-field .opt { font-weight: 400; color: var(--ax-body); font-size: 12px; margin-left: 4px; }
  .aisummit-page .ax-field input, .aisummit-page .ax-field select { width: 100%; box-sizing: border-box; padding: 11px 12px; border: 1px solid #c9d8e3; border-radius: var(--evt-radius-sm); font: inherit; font-size: 14.5px; background: var(--ax-white); color: var(--ax-grey); }
  .aisummit-page .ax-field input:focus, .aisummit-page .ax-field select:focus { outline: none; border-color: var(--ax-blue); box-shadow: 0 0 0 3px rgba(4,124,196,.15); }
  .aisummit-page .ax-consent { display: flex; gap: 10px; align-items: flex-start; margin: 6px 0 18px; font-size: 13px; line-height: 1.55; color: var(--ax-body); }
  .aisummit-page .ax-consent input { margin-top: 3px; flex-shrink: 0; }
  .aisummit-page .ax-consent a, .aisummit-page .ax-privacy a { color: var(--ax-blue); }
  .aisummit-page .ax-privacy { font-size: 12.5px; color: var(--ax-body); margin: 12px 0 0; }
  .aisummit-page .ax-hp { position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden; }

  /* 10. Who attends */
  .aisummit-page .ax-charts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
  .aisummit-page .ax-chart { background: var(--ax-white); border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 24px; }
  .aisummit-page .ax-chart-title { font-size: 15px; font-weight: 700; margin: 0 0 16px; color: var(--ax-grey); }
  .aisummit-page .ax-bar-row { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr) 40px; gap: 12px; align-items: center; margin-bottom: 12px; }
  .aisummit-page .ax-bar-lbl { font-size: 13px; line-height: 1.35; color: var(--ax-grey); }
  .aisummit-page .ax-bar-track { height: 12px; background: var(--ax-tint); border-radius: 6px; overflow: hidden; }
  .aisummit-page .ax-bar-fill { display: block; height: 100%; background: var(--ax-blue); border-radius: 6px; }
  .aisummit-page .ax-bar-val { font-size: 13px; font-weight: 600; color: var(--ax-grey); text-align: right; font-variant-numeric: tabular-nums; }
  .aisummit-page .ax-split { display: flex; margin-top: 24px; border-radius: var(--evt-radius); overflow: hidden; font-size: 13.5px; font-weight: 600; }
  .aisummit-page .ax-split span { padding: 14px 18px; white-space: nowrap; }
  .aisummit-page .ax-split-a { background: var(--ax-grey); color: var(--ax-white); }
  .aisummit-page .ax-split-b { background: var(--ax-blue); color: var(--ax-white); text-align: right; }
  .aisummit-page .ax-source { font-size: 13px; color: var(--ax-body); margin: 12px 0 0; }

  /* 11. Sponsor */
  .aisummit-page .ax-tiers { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
  .aisummit-page .ax-tier { border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 28px 26px; background: var(--ax-white); }
  .aisummit-page .ax-tier--top { background: var(--ax-blue); border-color: var(--ax-blue); color: var(--ax-white); }
  .aisummit-page .ax-tier-name { font-size: 13px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--ax-blue); }
  .aisummit-page .ax-tier-price { font-size: 34px; font-weight: 800; margin: 8px 0 4px; color: var(--ax-grey); }
  .aisummit-page .ax-tier-places { font-size: 13.5px; font-weight: 600; color: var(--ax-body); margin-bottom: 14px; }
  .aisummit-page .ax-tier p { font-size: 14.5px; line-height: 1.6; color: var(--ax-body); margin: 0; }
  .aisummit-page .ax-tier--top .ax-tier-name, .aisummit-page .ax-tier--top .ax-tier-price, .aisummit-page .ax-tier--top .ax-tier-price span, .aisummit-page .ax-tier--top .ax-tier-places, .aisummit-page .ax-tier--top p { color: var(--ax-white); }
  .aisummit-page .ax-table-wrap { border: 1px solid var(--ax-border); border-radius: var(--evt-radius); overflow: hidden; }
  .aisummit-page .ax-table { width: 100%; border-collapse: collapse; font-size: 14px; }
  .aisummit-page .ax-table th, .aisummit-page .ax-table td { padding: 13px 16px; text-align: left; border-top: 1px solid var(--ax-border); vertical-align: top; }
  .aisummit-page .ax-table thead th { border-top: 0; background: var(--ax-grey); color: var(--ax-white); font-weight: 600; font-size: 13px; }
  .aisummit-page .ax-table thead th.is-top { background: var(--ax-blue); }
  .aisummit-page .ax-table tbody th { font-weight: 500; color: var(--ax-grey); width: 34%; }
  .aisummit-page .ax-table tbody tr:nth-child(even) { background: var(--ax-tint); }
  .aisummit-page .ax-table td { color: var(--ax-body); }
  .aisummit-page .ax-table td.is-top { font-weight: 600; color: var(--ax-grey); }
  .aisummit-page .ax-list { margin: 0; padding-left: 20px; }
  .aisummit-page .ax-list li { font-size: 15px; line-height: 1.7; color: var(--ax-body); margin-bottom: 6px; }
  .aisummit-page .ax-dodont { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin-top: 24px; }
  .aisummit-page .ax-do, .aisummit-page .ax-dont { border-radius: var(--evt-radius); padding: 22px 24px; }
  .aisummit-page .ax-do { background: var(--ax-light); }
  .aisummit-page .ax-dont { background: var(--ax-tint); border: 1px solid var(--ax-border); }
  .aisummit-page .ax-do h4, .aisummit-page .ax-dont h4 { font-size: 15px; font-weight: 700; margin: 0 0 12px; color: var(--ax-grey); }
  .aisummit-page .ax-do ul, .aisummit-page .ax-dont ul { margin: 0; padding: 0; list-style: none; }
  .aisummit-page .ax-do li, .aisummit-page .ax-dont li { position: relative; padding-left: 26px; font-size: 14px; line-height: 1.55; margin-bottom: 9px; color: var(--ax-grey); }
  .aisummit-page .ax-do li::before { content: "✓"; position: absolute; left: 0; color: var(--ax-blue); font-weight: 700; }
  .aisummit-page .ax-dont li::before { content: "✕"; position: absolute; left: 0; color: #b03a2e; font-weight: 700; }
  .aisummit-page .ax-dates { list-style: none; margin: 0; padding: 0; border-left: 2px solid var(--ax-light); }
  .aisummit-page .ax-dates li { display: grid; grid-template-columns: 180px minmax(0, 1fr); gap: 16px; padding: 10px 0 10px 22px; position: relative; font-size: 14.5px; }
  .aisummit-page .ax-dates li::before { content: ""; position: absolute; left: -7px; top: 16px; width: 12px; height: 12px; border-radius: 50%; background: var(--ax-white); border: 2px solid var(--ax-blue); }
  .aisummit-page .ax-dates li.is-event::before { background: var(--ax-blue); }
  .aisummit-page .ax-date { font-weight: 700; color: var(--ax-grey); }
  .aisummit-page .ax-date-what { color: var(--ax-body); }
  .aisummit-page .ax-steps { margin: 0; padding: 0; list-style: none; counter-reset: ax; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
  .aisummit-page .ax-steps li { counter-increment: ax; background: var(--ax-tint); border-radius: var(--evt-radius); padding: 22px 22px 20px; font-size: 14.5px; line-height: 1.6; color: var(--ax-body); }
  .aisummit-page .ax-steps li::before { content: counter(ax); display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 50%; background: var(--ax-blue); color: var(--ax-white); font-weight: 700; margin-bottom: 12px; }
  .aisummit-page .ax-steps strong { color: var(--ax-grey); }
  .aisummit-page .ax-terms { margin-top: 48px; border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 0 24px; }
  .aisummit-page .ax-terms summary { cursor: pointer; font-weight: 700; font-size: 16px; padding: 18px 0; color: var(--ax-grey); }
  .aisummit-page .ax-terms[open] summary { border-bottom: 1px solid var(--ax-border); margin-bottom: 16px; }
  .aisummit-page .ax-terms .ax-list { padding-bottom: 18px; }

  /* 12. Past editions */
  .aisummit-page .ax-tags { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
  .aisummit-page .ax-tags li { font-size: 13.5px; font-weight: 500; color: var(--ax-grey); background: var(--ax-white); border: 1px solid var(--ax-border); border-radius: 999px; padding: 6px 14px; }

  /* 13. CCAS year */
  .aisummit-page .ax-year { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; position: relative; }
  .aisummit-page .ax-year::before { content: ""; position: absolute; left: 0; right: 0; top: 17px; height: 2px; background: var(--ax-light); }
  .aisummit-page .ax-year li { position: relative; padding: 0 16px 0 0; font-size: 14px; line-height: 1.55; color: var(--ax-body); }
  .aisummit-page .ax-year-n { position: relative; display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 50%; background: var(--ax-white); border: 2px solid var(--ax-light); color: var(--ax-grey); font-weight: 700; margin-bottom: 12px; }
  .aisummit-page .ax-year li.is-on { color: var(--ax-grey); }
  .aisummit-page .ax-year li.is-on .ax-year-n { background: var(--ax-blue); border-color: var(--ax-blue); color: var(--ax-white); }

  /* 14. FAQ */
  .aisummit-page .ax-faq { max-width: 820px; }
  .aisummit-page .ax-faq details { background: var(--ax-white); border: 1px solid var(--ax-border); border-radius: var(--evt-radius); padding: 0 22px; margin-bottom: 10px; }
  .aisummit-page .ax-faq summary { cursor: pointer; font-weight: 600; font-size: 15.5px; padding: 17px 0; color: var(--ax-grey); }
  .aisummit-page .ax-faq p { font-size: 15px; line-height: 1.7; color: var(--ax-body); margin: 0 0 18px; }

  /* 15. Contact */
  .aisummit-page #ais-contact { padding-bottom: calc(var(--evt-rhythm) + 14px); }
  .aisummit-page .ax-contact { background: var(--ax-grey); border-radius: var(--evt-radius); padding: 40px; }
  .aisummit-page .ax-contact-rows { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 24px; }
  .aisummit-page .ax-contact-row { display: flex; flex-direction: column; gap: 4px; padding: 16px 18px; border-radius: var(--evt-radius-sm); background: rgba(255,255,255,.06); text-decoration: none; border: 1px solid rgba(255,255,255,.1); transition: background .2s; }
  .aisummit-page .ax-contact-row:hover { background: rgba(4,124,196,.35); }
  .aisummit-page .ax-contact-row .lbl { font-size: 12px; color: var(--ax-light); }
  .aisummit-page .ax-contact-row .val { font-size: 15.5px; font-weight: 600; color: var(--ax-white); word-break: break-word; }

  /* Responsive */
  @media (max-width: 1100px) {
    .aisummit-page .ax-bar-links { display: none; }
    .aisummit-page .ax-bar .wrap { justify-content: space-between; }
  }
  @media (max-width: 960px) {
    .aisummit-page .ax-hero-grid, .aisummit-page .ax-theme, .aisummit-page .ax-form-wrap, .aisummit-page .ax-charts { grid-template-columns: 1fr; gap: 32px; }
    .aisummit-page .ax-hero-art { order: -1; }
    .aisummit-page .ax-hero-art svg { max-width: 240px; margin: 0; }
    .aisummit-page .ax-stats, .aisummit-page .ax-cards--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .aisummit-page .ax-topics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .aisummit-page .ax-topic, .aisummit-page .ax-topic:nth-child(4) { grid-column: auto; }
    .aisummit-page .ax-cards--3, .aisummit-page .ax-tiers, .aisummit-page .ax-steps { grid-template-columns: 1fr; }
    .aisummit-page .ax-spk-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .aisummit-page .ax-ag-row { grid-template-columns: 130px minmax(0, 1fr) 180px; }
  }
  @media (max-width: 700px) {
    .aisummit-page .wrap { padding: 0 16px; }
    .aisummit-page section { padding: var(--evt-rhythm-sm) 0; }
    .aisummit-page .ax-bar-name { display: none; }
    .aisummit-page .ax-bar-btns { width: 100%; }
    .aisummit-page .ax-bar-btns .ax-btn { flex: 1; }
    .aisummit-page .ax-stats, .aisummit-page .ax-stats--2, .aisummit-page .ax-cards--2, .aisummit-page .ax-cards--4, .aisummit-page .ax-topics, .aisummit-page .ax-passes, .aisummit-page .ax-dodont, .aisummit-page .ax-spk-grid, .aisummit-page .ax-field-row, .aisummit-page .ax-contact-rows { grid-template-columns: 1fr; }
    .aisummit-page .ax-stat-num { font-size: 42px; }
    /* Agenda becomes a timeline */
    .aisummit-page .ax-agenda { border: 0; border-left: 2px solid var(--ax-light); border-radius: 0; overflow: visible; margin-left: 6px; }
    .aisummit-page .ax-ag-head { display: none; }
    .aisummit-page .ax-ag-row { grid-template-columns: 1fr; gap: 4px; border-top: 0; padding: 12px 14px; margin: 0 0 8px 16px; border-radius: var(--evt-radius-sm); position: relative; }
    .aisummit-page .ax-ag-row::before { content: ""; position: absolute; left: -24px; top: 18px; width: 12px; height: 12px; border-radius: 50%; background: var(--ax-white); border: 2px solid var(--ax-blue); }
    .aisummit-page .ax-ag-row:not(.is-break):not(.is-panel):not(.is-plain) { border: 1px solid var(--ax-border); }
    .aisummit-page .ax-ag-time { font-size: 12.5px; }
    .aisummit-page .ax-ag-who:empty { display: none; }
    /* Benefits table becomes one card per benefit */
    .aisummit-page .ax-table-wrap { border: 0; }
    .aisummit-page .ax-table thead { display: none; }
    .aisummit-page .ax-table, .aisummit-page .ax-table tbody, .aisummit-page .ax-table tr, .aisummit-page .ax-table th, .aisummit-page .ax-table td { display: block; width: auto; }
    .aisummit-page .ax-table tr { border: 1px solid var(--ax-border); border-radius: var(--evt-radius-sm); margin-bottom: 10px; overflow: hidden; background: var(--ax-white) !important; }
    .aisummit-page .ax-table tbody th { width: auto; background: var(--ax-grey); color: var(--ax-white); border-top: 0; font-weight: 600; }
    .aisummit-page .ax-table td { display: grid; grid-template-columns: 110px minmax(0, 1fr); gap: 10px; padding: 10px 16px; }
    .aisummit-page .ax-table td::before { content: attr(data-tier); font-weight: 600; color: var(--ax-blue); }
    .aisummit-page .ax-dates li { grid-template-columns: 1fr; gap: 2px; }
    .aisummit-page .ax-year { grid-template-columns: 1fr; gap: 14px; }
    .aisummit-page .ax-year::before { left: 17px; right: auto; top: 0; bottom: 0; width: 2px; height: auto; }
    .aisummit-page .ax-year li { display: grid; grid-template-columns: 36px minmax(0, 1fr); gap: 14px; align-items: center; padding: 0; }
    .aisummit-page .ax-year-n { margin: 0; }
    .aisummit-page .ax-split span { padding: 12px 10px; font-size: 12.5px; }
    .aisummit-page .ax-contact { padding: 28px 20px; }
    .aisummit-page .ax-form-card { padding: 22px 18px; }
    .aisummit-page .ax-bar-row { grid-template-columns: minmax(0, 1fr) 40px; }
    .aisummit-page .ax-bar-track { grid-column: 1 / -1; grid-row: 2; }
  }

  /* ===== HOMEPAGE HARMONISATION (V15, 23 Sep 2026) =====
     Brings the homepage onto the event pages' mechanics (--evt-* values),
     scoped to body.home so no interior page changes. */
  body.home section:not(.stats) { padding: 90px 0; }
  body.home .eyebrow-block { font-size: 11px; letter-spacing: .2em; }
  body.home h2.section-title { font-size: clamp(26px,3vw,38px); line-height: 1.2; margin-bottom: 0; }
  .hp-divider { display: none; }
  body.home .hp-divider { display: block; width: 36px; height: 3px; background: var(--blue); border-radius: 2px; margin: 20px 0 32px; }
  body.home .offers-grid { margin-top: 0; }
  body.home .stats-inner,
  body.home section.about .about-side,
  body.home .offer-card { border-radius: 10px; }
  body.home .stat { border-radius: 7px; }
  body.home section.offers { background: #F7FBFD; }
  body.home .offer-card { border: 1px solid #DAEDF8; }

  /* ===== V19 07Nov2026: Coming soon pill in the menu (markup since V18, no CSS until now) ===== */
  nav ul.navlinks .nav-tag {
    display: inline-block; margin-left: 8px; padding: 2px 8px; border-radius: 100px;
    font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; line-height: 1.5;
    background: rgba(4,124,196,.22); border: 1px solid rgba(4,124,196,.55); color: var(--white); vertical-align: middle;
  }

  /* ===== V19 07Nov2026: flagship event cards on /events/ and the homepage ===== */
  .flagship-panel {
    margin: 40px 0 40px 40px; border-radius: 8px; min-height: 300px;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 18px;
    padding: 36px 28px; text-align: center; color: var(--white); box-shadow: 0 8px 24px rgba(0,0,0,.12);
    transition: transform .2s ease, box-shadow .2s ease;
  }
  .flagship-panel:hover { transform: scale(1.02); box-shadow: 0 12px 32px rgba(0,0,0,.18); }
  .flagship-panel img { max-width: 220px; max-height: 120px; width: auto; height: auto; display: block; }
  .flagship-panel .fp-when { font-size: 13px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; opacity: .9; }
  .flagship-panel--aisummit { background: linear-gradient(145deg, #37187D 0%, #692090 60%, #1F0E4A 100%); }
  .flagship-panel--aisummit .fp-when { color: #7FE3F4; }
  .flagship-panel--awards { background: linear-gradient(145deg, #02305A 0%, #011E3C 100%); }
  .flagship-panel--awards .fp-when { color: #D9B36C; }
  .flagship-tag {
    display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: 1px; padding: 4px 10px;
    border-radius: 20px; margin: 0 6px 14px 0; color: var(--white); background: var(--blue); vertical-align: top;
  }
  .flagship-tag--aisummit { background: #692090; }
  .flagship-tag--awards { background: #02305A; }
  .flagship-tag--coming { background: #e9f4fb; color: #035f97; border: 1px solid #b9d8ea; }
  .event-card--flagship .past-event-tag { margin-right: 6px; }
  .btn-secondary {
    display: inline-block; padding: 10px 22px; border-radius: 4px; border: 1.5px solid var(--blue);
    color: var(--blue); font-weight: 600; font-size: 14px; margin-left: 10px;
  }
  .btn-secondary:hover { background: var(--blue); color: var(--white); }
  .home-event-card .flagship-panel { margin: 28px 0 28px 28px; min-height: 240px; }
  .home-event-card .flagship-panel img { max-width: 180px; max-height: 96px; }
  .home-event-card .flagship-tag { font-size: 10px; margin-bottom: 10px; }
  @media (max-width: 900px) {
    .flagship-panel, .home-event-card .flagship-panel { margin: 24px 24px 0; min-height: 220px; }
    .btn-secondary { margin: 10px 0 0; }
  }

  /* ===== V19 07Nov2026: AI Summit video section ===== */
  .aisummit-page #ais-watch { text-align: center; }
  .aisummit-page .ax-watch-inner { max-width: 900px; margin: 0 auto; }
  .aisummit-page .ax-watch-sub { font-size: 15px; font-weight: 300; color: var(--ax-muted, #5e6b73); margin: 10px 0 30px; }
  .aisummit-page .ax-video-frame {
    position: relative; aspect-ratio: 16 / 9; border-radius: var(--evt-radius, 10px); overflow: hidden;
    background: #000; box-shadow: 0 18px 48px rgba(31,14,74,.35);
  }
  .aisummit-page .ax-video-frame iframe,
  .aisummit-page .ax-video-frame video { position: absolute; inset: 0; width: 100%; height: 100%; display: block; border: 0; }
