/* ASSETS_V1: the shared site styles, served as one cached file (was inline in every page). Source of truth: edit HERE. */

        :root {
            --primary: #005A8B; --secondary: #003f61; --accent: #D35400;
            --text-dark: #333333; --text-muted: #666666; --bg-light: #f4f6f8; 
            /* PAGEBG_V1 (Mario, 2026-10-16: "make the light background ... a bit darker and bluer", picked B):
               the page itself. --bg-light stays the pale fill used INSIDE white cards. */
            --page-bg: #dfe7f0;
            --pass-green: #28a745; --fail-grey: #e74c3c; --font-main: 'Montserrat', sans-serif;
            /* CARD3D_V1 (Mario, 2026-10-16: "fix the shadows between boxes and make the boxes
               look more 3d effect"). The old shadow was a single soft 15px blur at 5% — almost
               invisible against the page, so two stacked cards read as one flat slab with a gap.
               Three layers now, which is what gives depth: a tight contact shadow right under the
               card, a mid shadow for the lift, and a wide soft one for the ambient. The top
               highlight (inset, white) catches the light on the upper edge the way a real raised
               surface does, and it is what sells the 3D more than the shadow does. */
            --shadow-base:
                0 1px 2px rgba(16, 38, 56, 0.07),
                0 4px 10px rgba(16, 38, 56, 0.07),
                0 14px 32px rgba(16, 38, 56, 0.09),
                inset 0 1px 0 rgba(255, 255, 255, 0.85);
            --shadow-hover:
                0 2px 4px rgba(16, 38, 56, 0.09),
                0 10px 22px rgba(16, 38, 56, 0.11),
                0 26px 54px rgba(16, 38, 56, 0.14),
                inset 0 1px 0 rgba(255, 255, 255, 0.9);
            --card-radius: 8px;
        }
        
        /* Site-wide horizontal-overflow clamp. The old rule put overflow-x:hidden on body
           ONLY — that does not reliably stop the page from panning sideways on mobile
           (html stays the scroller), which left a blank gutter on the right. Clamp BOTH
           html and body. Use overflow-x: clip (not hidden) so we don't create a scroll
           container that would break the sticky <nav>; keep the hidden value first as a
           fallback for browsers without clip support. */
        html {
            max-width: 100%;
            overflow-x: hidden;
            overflow-x: clip;
        }
        body {
            font-family: var(--font-main);
            margin: 0;
            padding: 0;
            background: var(--page-bg);
            color: var(--text-dark);
            line-height: 1.6;
            scroll-behavior: smooth;
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
            max-width: 100%;
            overflow-x: hidden;
            overflow-x: clip;
        }
        
        input, textarea { 
            -webkit-user-select: text; 
            -moz-user-select: text; 
            -ms-user-select: text; 
            user-select: text; 
        }
        
        img { user-select: none; pointer-events: none; -webkit-user-drag: none; }

        .pre-animate { opacity: 0; transform: translateY(60px); transition: opacity 1.8s cubic-bezier(0.22, 1, 0.36, 1), transform 1.8s cubic-bezier(0.22, 1, 0.36, 1); will-change: opacity, transform; }
        .pre-animate.visible { opacity: 1; transform: translateY(0); }

        /* GLOBAL NAV STYLES */
        .top-social-bar { background: #111; padding: 6px 40px; display: flex; justify-content: flex-end; align-items: center; border-bottom: 2px solid var(--accent); }
        .top-social-bar a { color: #aaa; text-decoration: none; margin-left: 20px; font-size: 1.1em; transition: 0.2s; }
        .top-social-bar a:hover { color: var(--accent); }

        nav { background: var(--secondary); padding: 12px 40px; display: flex; justify-content: space-between; align-items: center; position: sticky; top: 0; z-index: 5000; box-shadow: 0 2px 10px rgba(0,0,0,0.3); }
        .logo { display: flex; align-items: center; height: 100%; }
        .logo img { height: 100px; width: auto; pointer-events: auto; transition: 0.3s; cursor: pointer; display: block; margin: 0; }
        .logo:hover img { transform: scale(1.05); filter: drop-shadow(0 0 15px rgba(0, 170, 255, 0.8)); }

        .nav-links { display: flex; flex-direction: column; align-items: flex-end; gap: 0; }
        .nav-social-bar { display: flex; gap: 14px; align-items: center; padding: 0 0 6px 0; }
        .nav-social-bar a { color: white; font-size: 1em; text-decoration: none; transition: 0.2s; opacity: 0.9; }
        .nav-social-bar a:hover { color: var(--accent); opacity: 1; transform: translateY(-1px); }
        .nav-menu-items { display: flex; gap: 20px; align-items: center; }
        .dropdown { position: relative; display: inline-block; }
        .dropbtn { background: none; border: none; color: white; font-family: var(--font-main); font-size: 0.85em; font-weight: 800; text-transform: uppercase; letter-spacing: 1px; cursor: pointer; padding: 15px 10px; transition: 0.2s;}
        .nav-menu-items > a { color: white; text-decoration: none; font-size: 0.85em; font-weight: 800; text-transform: uppercase; letter-spacing: 1px; padding: 10px; transition: 0.2s;}
        .nav-menu-items > a:hover, .dropbtn:hover { color: var(--accent); }
        .nav-auth { display: flex; gap: 10px; align-items: center; margin-left: 10px; }
        .nav-pro-gear { background: #f39c12 !important; margin-right: 10px; }
        .nav-btn.nav-shops { background: #fff !important; color: var(--primary) !important; }
        .nav-btn.nav-shops:hover { color: var(--primary) !important; filter: brightness(0.94); }
        /* GROUPSEAT_V2: the desktop header only has room for this button from 1440px (measured: the
           menu needs ~1157px and has ~viewport-268; at 1280 it pushed every menu label onto two lines).
           Between 1051 and 1439 the same link sits in the Support menu instead; the phone drawer
           (1050 and under) shows the button itself. */
        .nav-shops-alt { display: none !important; }
        @media (min-width: 1051px) and (max-width: 1439px) {
            .nav-btn.nav-shops { display: none !important; }
            .nav-shops-alt { display: block !important; }
        }
        .nav-login { background: transparent !important; border: 2px solid var(--accent); }
        .nav-loggedin { margin-left: 10px; }
        .account-btn { color: white !important; display: flex; align-items: center; gap: 8px; }
        .account-icon { font-size: 1.5em; color: var(--accent); }
        .account-caret { font-size: 0.8em; }
        .account-dropdown { min-width: 200px; right: 0; left: auto !important; }
        .account-header { padding: 15px 20px; background: var(--bg-light); border-bottom: 1px solid #eee; font-size: 0.85em; color: var(--text-muted); font-weight: 800; text-transform: uppercase; letter-spacing: 0.5px; }
        .signout-link { color: var(--fail-grey) !important; }
        
        .dropdown-content { display: none; position: absolute; background-color: white; min-width: 280px; width: max-content; box-shadow: 0px 15px 35px rgba(0,0,0,0.2); z-index: 6000; border-radius: 6px; overflow: hidden; top: 100%; left: 0; opacity: 0; transform: translateY(-6px); transition: opacity 0.2s ease, transform 0.2s ease; pointer-events: none;}
        .dropdown-content a { color: var(--text-dark) !important; padding: 15px 20px; text-decoration: none; display: block; border-bottom: 1px solid #eee; font-size: 0.9em; font-weight: 600; text-transform: none; text-align: left; white-space: nowrap;}
        .dropdown-content a:hover { background-color: var(--bg-light); color: var(--primary) !important; }
        /* GIFTCODE_V1: the gift sits under the five tests, marked off so it does not read as a
           sixth one. Orange like every other "this costs money" control on the site. */
        /* APPGO_V1: the "study on the go" block. Renders only when site.app.live is true. */
        .appgo { text-align: left; }
        .appgo h2 { text-align: center; }
        .appgo-lede { text-align: center; max-width: 760px; margin: 0 auto 26px; color: var(--text-muted); font-size: 1.1em; line-height: 1.6; }
        .appgo-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-bottom: 22px; }
        .appgo-item { background: var(--bg-light, #f7f9fb); border-radius: 12px; padding: 20px; box-sizing: border-box; }
        .appgo-item i { color: var(--accent); font-size: 1.4em; display: block; margin-bottom: 10px; }
        .appgo-item b { display: block; color: var(--primary); font-size: 1.05em; margin-bottom: 5px; }
        .appgo-item span { color: #444; line-height: 1.55; font-size: .97em; }
        .appgo-upgrade { display: flex; gap: 12px; align-items: flex-start; background: rgba(211,84,0,.07); border-left: 4px solid var(--accent); border-radius: 10px; padding: 16px 18px; margin-bottom: 22px; line-height: 1.6; box-sizing: border-box; }
        .appgo-upgrade i { color: var(--accent); margin-top: 3px; }
        .appgo-cta { display: flex; align-items: center; justify-content: center; gap: 10px; max-width: 420px; margin: 0 auto; min-height: 54px; padding: 14px 24px; border-radius: 10px; background: var(--primary); color: #fff !important; font-weight: 800; text-transform: uppercase; letter-spacing: .5px; text-decoration: none; box-sizing: border-box; }
        .appgo-cta:hover { filter: brightness(1.1); }
        /* GIFTROW_V1: no margin above this row. A margin is OUTSIDE the link, so the 7px of white
           sat between ASE B6's divider and the gift row, the highlight stopped short of the top of
           the row, and the divider read as a hidden line. The row is a full card like the other
           five; what sets it apart is the orange icon and a resting tint, not a gap. */
        .dropdown-content a.dropdown-gift { color: var(--accent) !important; font-weight: 800; background-color: rgba(211,84,0,.055); }
        .dropdown-content a.dropdown-gift i { color: var(--accent); }
        .dropdown-content a.dropdown-gift:hover { background-color: rgba(211,84,0,.14); color: var(--accent) !important; }
        .dropdown-content i { margin-right: 12px; width: 20px; text-align: center; color: var(--primary); }
        /* DESKTOP: hover-to-open. Tiny .15s delay before close so users can move cursor onto the menu */
        @media (min-width: 1051px) {
            .dropdown:hover > .dropdown-content,
            .dropdown:focus-within > .dropdown-content {
                display: block;
                opacity: 1;
                transform: translateY(0);
                pointer-events: auto;
                transition-delay: 0s;
            }
            .dropdown > .dropdown-content { transition-delay: 0.15s; }
            .dropdown:hover > .dropbtn,
            .dropdown:focus-within > .dropbtn { color: var(--accent); }
        }
        
        /* "show" used by mobile (tap-toggle) and as override on desktop when JS forces open */
        .dropdown-content.show { display: block !important; opacity: 1 !important; transform: translateY(0) !important; pointer-events: auto !important; }
        
        .auth-container { display: flex; align-items: center; gap: 10px; margin-left: 10px; flex-direction: row;}
        .nav-btn { background: var(--accent); color: white !important; padding: 8px 20px !important; border-radius: 30px; transition: 0.2s; text-decoration: none; font-weight: 800; text-transform: uppercase; font-size: 0.85em; border: none; cursor: pointer; display: inline-block;}
        .nav-btn:hover { background: #b94a00; }
        
        #headerUserName { color: white; font-weight: 900; font-size: 0.85em; text-transform: uppercase; letter-spacing: 1px; line-height: 1; display: none;}

        .hamburger-menu { display: none; }
        .hamburger:hover { color: var(--accent); }

        /* FOOTER STYLES */
        footer { width: 100%; clear: both; box-sizing: border-box; background: #111; color: #aaa; padding: 80px 20px 30px 20px; font-size: 0.95em; border-top: 5px solid var(--primary); margin-top: auto;}
        .footer-grid { max-width: 1100px; margin: 0 auto; display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 40px; margin-bottom: 50px; width: 100%; box-sizing: border-box;}
        /* min-width:0 lets the grid tracks shrink to their fr proportions on mobile. Without
           it the first (2fr) column refused to shrink below the Google Translate widget's
           intrinsic width (~300px), pushing the other columns off the right edge. Keeps the
           intended 3-column footer on phones — it just sizes correctly now. */
        .footer-col { min-width: 0; }
        .footer-col h4 { color: white; font-size: 1.3em; margin-bottom: 20px; font-weight: 800; text-transform: uppercase; letter-spacing: 1px;}
        .footer-col a { color: #aaa; text-decoration: none; display: block; margin-bottom: 12px; transition: 0.2s; font-weight: 600;}
        /* PHONESWEEP2_V1: hover changes colour only. The 5px padding-left nudge moved the box on hover (CLAUDE.md rule 34d). */
        .footer-col a:hover { color: white; }
        .footer-bottom { max-width: 1100px; margin: 0 auto; text-align: center; padding-top: 30px; border-top: 1px solid #333; font-size: 0.9em; width: 100%; box-sizing: border-box;}
        /* PHONESWEEP2_V1: the trademark line (inline .85em) and the language button read 11.6px on desktop. */
        .footer-bottom div[style*="0.85em"] { font-size: max(0.85em, 0.75rem) !important; }
        .footer-translate-bar #ftLangBtn { font-size: max(0.95em, 0.75rem); }
        .footer-social { display: flex; gap: 14px; margin-top: 18px; align-items: center; }
        /* Fixed width on each link so different glyph widths (LinkedIn vs Reddit alien etc.)
           don't produce uneven visual gaps. Each link is a centered 32px box. */
        .footer-social a { color: #aaa; font-size: 1.5em; transition: 0.2s; padding: 0; margin: 0; width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; text-align: center;}
        .footer-social a:hover { color: var(--accent); }
        /* MOBILE FOOTER: always stays 3 columns (Brand / Quick Links / Legal). Just shrinks the type. */
        @media (max-width: 900px) {
            .footer-grid { grid-template-columns: 2fr 1fr 1fr; gap: 24px 16px; }
            .footer-col h4 { font-size: 1.05em; margin-bottom: 14px; }
            .footer-col a { font-size: 0.92em; margin-bottom: 9px; }
            .footer-col p { font-size: 0.95em; line-height: 1.55; }
            footer { padding: 60px 16px 26px 16px; }
        }
        @media (max-width: 560px) {
            .footer-grid { gap: 18px 12px; margin-bottom: 30px; }
            /* PHONESWEEP2_V1: still three columns, but nothing under the 12px floor and every link a
               44px tap target (CLAUDE.md rule 18a). Measured at 375px before: links 10.4px and 17px
               tall, headings 11.2px, the trademark line 8.8px, and the eight social icons squeezed
               to 11px wide each because the row could not wrap inside a 168px column. Sizes are in
               rem so the footer's own .9em does not compound them back under the floor. */
            .footer-col h4 { font-size: 0.75rem; margin-bottom: 4px; letter-spacing: 0.5px; }
            .footer-col a { font-size: 0.75rem; margin-bottom: 0; min-height: 44px; display: flex; align-items: center; line-height: 1.3; }
            .footer-col p { font-size: 0.75rem; }
            .footer-social a { font-size: 1.15em; width: 44px; height: 44px; flex-shrink: 0; }
            .footer-social { gap: 2px; flex-wrap: wrap; }
            footer { padding: 44px 12px 22px 12px; font-size: 0.9em; }
            .footer-bottom { font-size: 0.75rem; padding-top: 22px; }
            .footer-bottom div[style*="0.85em"] { font-size: 0.75rem !important; line-height: 1.5 !important; }
            .footer-translate-bar .ft-label { font-size: 0.75rem; }
            .footer-translate-bar #ftLangBtn { min-height: 44px; font-size: 0.75rem; }
        }
        @media (max-width: 380px) {
            .footer-grid { gap: 14px 8px; }
        }

       @media (max-width: 1050px) {
            /* Bulletproof Mobile Nav Alignment */
            nav { display: flex !important; flex-direction: row !important; justify-content: space-between !important; align-items: center !important; width: 100% !important; box-sizing: border-box !important; padding: 15px 25px !important; }
            .logo a { display: inline-block !important; width: auto !important; flex: 0 1 auto !important; }
            .logo img { height: 60px !important; margin: 0 !important; }
            
            /* THIS CREATES A SOLID BLUE BUTTON SO IT CANNOT BE INVISIBLE */
            .hamburger-menu { display: flex !important; align-items: center !important; justify-content: center !important; position: static !important; margin: 0 !important; background-color: var(--primary) !important; color: white !important; font-size: 1.5em !important; cursor: pointer !important; width: 45px !important; height: 45px !important; border-radius: 6px !important; }
            
            .top-social-bar { justify-content: center; }
            .hero h1 { font-size: 2.2em; }
            .nav-links { display: none !important; }
            
            /* THIS TELLS THE MENU HOW TO OPEN WHEN CLICKED */
            /* MENUSCROLL_V1 (Mario, 2026-10-06: "can't see the logout button if user has purchased
               all 5 modules"). The drawer had NO height limit, so an account with five ASE portal
               links grew it past the bottom of the phone and Sign Out sat below the screen with no
               way to reach it. The drawer is capped to the viewport and scrolls instead.
               ⚠ 100dvh, not 100vh: on iOS Safari 100vh is the height WITHOUT the browser bars, so a
               100vh cap still hides the last row behind the address bar — exactly the reported bug.
               The 100vh line stays first as the fallback for browsers with no dvh.
               ⚠ z-index 10001, not 9999: the cookie banner is position:fixed at 10000, so for a
               student who has not answered it yet the banner sat ON TOP of the bottom of this
               drawer and swallowed the Sign Out tap. Measured with elementFromPoint, not guessed.
               The drawer is a deliberate tap, so it belongs above the banner. */
            .nav-links.active { display: flex !important; flex-direction: column; position: absolute; top: 100%; right: 0; left: auto; width: auto; min-width: 260px; background: var(--secondary); padding: 20px; box-sizing: border-box; align-items: flex-end; gap: 15px; border-top: 2px solid var(--primary); z-index: 10001; border-bottom-left-radius: 8px; box-shadow: -5px 10px 20px rgba(0,0,0,0.3); max-height: calc(100vh - 86px); max-height: calc(100dvh - 86px); overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }
            .nav-links.active .nav-social-bar { width: 100%; justify-content: flex-end; padding-bottom: 12px; border-bottom: 1px solid rgba(255,255,255,0.15); margin-bottom: 6px; }
            .nav-links.active .nav-social-bar a { color: white; font-size: 1.25em; }
            .nav-links.active .nav-menu-items { flex-direction: column; gap: 12px; width: 100%; align-items: flex-end; }
            .nav-links.active .dropdown { width: 100%; text-align: right; }
            .nav-links.active .dropbtn { width: 100%; text-align: right; padding: 10px 0; }
            .nav-links.active .dropdown-content { position: relative; min-width: 100%; max-width: 100%; width: auto; box-shadow: none; border-left: 2px solid var(--accent); display: none; margin-top: 10px; opacity: 1; transform: none; pointer-events: auto; transition: none; }
            /* Phones: the full ASE test names must wrap, or width:max-content pushes the start of each label off-screen. */
            .nav-links.active .dropdown-content a { white-space: normal; }
            .nav-links.active .dropdown-content.show { display: block !important; }
            .nav-links.active #loggedOutNav, .nav-links.active #loggedInNav { width: 100%; justify-content: flex-end; margin: 0 !important; }
            .nav-links.active #loggedInNav .dropbtn { justify-content: flex-end !important; text-align: right !important; width: 100% !important; }
            /* hide the now-redundant top social bar on mobile since we have icons in the nav drawer */
            .top-social-bar { display: none; }
        
        /* GLOBAL LOGO SPACING FIX */
        nav { 
            padding-top: 10px !important; 
            padding-bottom: 10px !important; 
            align-items: center !important; 
        }
        .logo, .logo a { 
            display: flex !important; 
            align-items: center !important; 
            margin: 0 !important; 
            height: 100% !important; 
        }
        .logo img { 
            margin: 0 !important; 
            padding: 0 !important; 
            display: block !important;
        }
    }

    /* ===== COOKIE CONSENT BANNER ===== */
    #cookieBanner { position: fixed; bottom: 0; left: 0; right: 0; background: white; color: var(--text-dark); padding: 22px 28px; box-shadow: 0 -8px 30px rgba(0,0,0,0.18); z-index: 10000; display: none; flex-wrap: wrap; gap: 20px; align-items: center; justify-content: space-between; border-top: 4px solid var(--primary); font-family: var(--font-main); }
    #cookieBanner.visible { display: flex; }
    #cookieBanner .cb-text { flex: 1 1 360px; min-width: 0; }
    #cookieBanner .cb-text h4 { margin: 0 0 6px 0; font-size: 1.05em; font-weight: 900; color: var(--primary); }
    #cookieBanner .cb-text p { margin: 0; font-size: 0.88em; line-height: 1.5; color: var(--text-muted); font-weight: 500; }
    #cookieBanner .cb-text a { color: var(--primary); text-decoration: underline; display: inline-block; padding: 15px 4px; margin: -15px 0; } /* TAP44_COOKIE_V1: a 15px-tall inline link is not a tap target; pad it to 44px and pull the padding back out of the line */
    #cookieBanner .cb-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
    #cookieBanner .cb-btn { border: none; padding: 11px 18px; border-radius: 6px; font-weight: 800; font-size: 0.85em; cursor: pointer; font-family: var(--font-main); text-transform: uppercase; letter-spacing: 0.5px; transition: 0.2s; }
    #cookieBanner .cb-btn.accept { background: var(--pass-green); color: white; }
    #cookieBanner .cb-btn.accept:hover { background: #218838; }
    #cookieBanner .cb-btn.reject { background: white; color: var(--text-dark); border: 1px solid var(--border-color); }
    #cookieBanner .cb-btn.reject:hover { background: #f4f6f8; }
    #cookieBanner .cb-btn.customize { background: transparent; color: var(--primary); text-decoration: underline; padding: 11px 6px; }
    #cookieCustomize { display: none; flex-basis: 100%; padding-top: 18px; margin-top: 4px; border-top: 1px solid var(--border-color); }
    #cookieCustomize.show { display: block; }
    #cookieCustomize .cb-options { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; margin-bottom: 14px; }
    #cookieCustomize .cb-option { background: #f8fbff; border: 1px solid var(--border-color); border-radius: 8px; padding: 12px 14px; }
    #cookieCustomize .cb-option label { display: flex; align-items: flex-start; gap: 8px; cursor: pointer; font-size: 0.85em; font-weight: 600; color: var(--text-dark); }
    #cookieCustomize .cb-option label input { margin-top: 3px; }
    #cookieCustomize .cb-option label.locked { opacity: 0.7; cursor: not-allowed; }
    #cookieCustomize .cb-option .desc { font-size: 0.75em; color: var(--text-muted); margin-top: 4px; line-height: 1.4; font-weight: 500; }
    #cookieReopener { position: fixed; bottom: 14px; left: 14px; background: white; color: var(--primary); border: 1px solid var(--border-color); border-radius: 50%; width: 38px; height: 38px; cursor: pointer; box-shadow: 0 4px 10px rgba(0,0,0,0.12); display: none; align-items: center; justify-content: center; z-index: 9000; font-size: 1.1em; }
    #cookieReopener.visible { display: flex; }
    #cookieReopener:hover { background: var(--primary); color: white; }
    /* PHONE CONSENT BANNER. Measured at 375x812 it stood 485px tall — 60% of the
       screen — and was the first thing every new mobile visitor saw, burying the
       hero completely. Two causes: full-size text stacked in a column, and three
       buttons sharing one flex row so narrow that "Reject Non-Essential" wrapped
       onto three lines (69px tall) while "Accept All" took two.
       Fixed with tighter type and a real 2-column grid: Reject and Accept share
       the top row at EQUAL width (neither is made more prominent than the other),
       Customize spans the row beneath. max-height + scroll is a backstop so the
       banner can never take the whole screen on a short device. Every choice is
       still present and nothing is hidden behind a scroll on a normal phone. */
    @media (max-width: 600px) {
        #cookieBanner { padding: 14px 16px 16px; flex-direction: column; align-items: stretch; gap: 12px; max-height: 62vh; overflow-y: auto; }
        /* THE ACTUAL CAUSE of the 485px banner: .cb-text carries flex:1 1 360px,
           which is a width basis on the desktop row but becomes a 360px HEIGHT
           basis the moment this query flips the container to a column — so the
           text block reserved 360px and left a huge blank gap above the buttons.
           Let it size to its own content instead. */
        #cookieBanner .cb-text { flex: 0 0 auto; }
        #cookieBanner .cb-text h4 { font-size: 0.95em; margin-bottom: 5px; }
        #cookieBanner .cb-text p { font-size: 0.78em; line-height: 1.45; }
        #cookieBanner .cb-actions { width: 100%; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
        /* PHONESWEEP2_V1: the three choices were 11.5px text in 36-40px boxes. 12px and a 44px
           minimum, the same two-row grid, so the banner grows by about 12px in all. */
        #cookieBanner .cb-btn { padding: 10px 6px; font-size: 0.75rem; letter-spacing: 0.2px; line-height: 1.25; min-height: 44px; }
        #cookieBanner .cb-actions .cb-btn.reject { grid-row: 1; grid-column: 1; }
        #cookieBanner .cb-actions .cb-btn.accept { grid-row: 1; grid-column: 2; }
        #cookieBanner .cb-actions .cb-btn.customize { grid-row: 2; grid-column: 1 / -1; padding: 10px 6px; }
        #cookieCustomize .cb-options { grid-template-columns: 1fr; gap: 8px; }
        #cookieCustomize .cb-btn.accept { width: 100%; }
    }
    /* ====== EMBED MODE — when ?embed=1 is on the URL (e.g. the gear page loaded
       in the simulator's iframe), hide the site chrome so the page slots cleanly
       inside the parent app. Header, footer, cookie banner + reopener all hide. */
    html.embed-mode header, body.embed-mode header,
    html.embed-mode footer, body.embed-mode footer,
    html.embed-mode #cookieBanner, body.embed-mode #cookieBanner,
    html.embed-mode #cookieReopener, body.embed-mode #cookieReopener,
    html.embed-mode .site-header, body.embed-mode .site-header,
    html.embed-mode .site-footer, body.embed-mode .site-footer { display: none !important; }
    html.embed-mode body, body.embed-mode { padding-top: 0 !important; }
    html.embed-mode main, body.embed-mode main { padding-top: 0 !important; margin-top: 0 !important; }
    
/* FREEPRACTICE_V3: the interactive free practice test (free-practice-widget.njk), same look as the module sampler. */
.fpw { padding: 32px 28px; box-sizing: border-box; border-top: 6px solid var(--accent); }
.fpw .test-header-row h2 { color: var(--primary); font-size: 1.5em; font-weight: 900; margin: 0 0 8px; }
.fpw .fpw-lead { margin: 0 0 16px; color: var(--text-muted); font-weight: 600; line-height: 1.5; }
.fpw .fpw-cat { font-size: 0.8em; font-weight: 800; letter-spacing: .04em; text-transform: uppercase; color: var(--accent); margin-bottom: 6px; min-height: 1em; }
.fpw .q-text { font-size: 1.2em; margin-bottom: 15px; line-height: 1.45; font-weight: 800; color: var(--text-dark); white-space: pre-line; }
.fpw .opt-btn { display: block; width: 100%; text-align: left; padding: 12px 16px; margin-bottom: 10px; border: 2px solid #eaeaea; background: #fff; border-radius: 8px; font-size: 1.02em; font-weight: 600; cursor: pointer; transition: .15s; font-family: inherit; color: var(--text-dark); box-sizing: border-box; min-height: 44px; line-height: 1.4; }
.fpw .opt-btn .opt-letter { display: inline-block; min-width: 26px; height: 26px; line-height: 26px; text-align: center; border-radius: 50%; background: var(--primary); color: #fff; font-weight: 900; font-size: 0.85em; margin-right: 8px; }
.fpw .opt-btn:hover:not(.locked) { border-color: var(--primary); background: #f8fbff; }
.fpw .opt-btn.selected { border-color: var(--primary); background: rgba(0,90,139,.06); font-weight: 800; }
.fpw .opt-btn.eliminated { text-decoration: line-through; opacity: .45; }
.fpw .opt-btn.locked { cursor: default; }
.fpw .opt-btn.correct { border-color: #5cb85c; background: rgba(92,184,92,.12); }
.fpw .opt-btn.incorrect { border-color: #e74c3c; background: rgba(231,76,60,.10); }
.fpw .fpw-fb { margin-top: 14px; padding: 18px 20px; border-radius: 8px; border-left: 6px solid var(--accent); background: #fff5f0; box-sizing: border-box; }
.fpw .fpw-fb.is-right { background: rgba(92,184,92,.12); border-left-color: #5cb85c; }
.fpw .fpw-fb.is-wrong { background: #fff5f0; border-left-color: #e74c3c; }
.fpw .fpw-fb h3 { margin: 0 0 8px; font-size: 1.15em; font-weight: 900; color: var(--text-dark); }
.fpw .fpw-fb.is-right h3 i { color: #5cb85c; } .fpw .fpw-fb.is-wrong h3 i { color: #e74c3c; }
.fpw .fpw-fb p { margin: 0; font-size: 1.02em; line-height: 1.55; font-weight: 500; color: var(--text-dark); }
.fpw .test-nav { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-top: 18px; border-top: 2px solid #f0f2f5; padding-top: 14px; flex-wrap: wrap; }
.fpw .fpw-count { font-weight: 800; color: var(--text-muted); }
.fpw .nav-btn-group { display: flex; gap: 10px; }
.fpw .nav-action-btn { padding: 12px 22px; min-height: 44px; font-size: 1em; font-weight: 800; border-radius: 6px; cursor: pointer; border: none; background: var(--primary); color: #fff; font-family: inherit; transition: .2s; }
.fpw .nav-action-btn:disabled { opacity: .5; cursor: not-allowed; background: #ccc; color: #333; }
.fpw .btn-secondary { background: #f4f6f8; color: var(--text-dark); border: 1px solid #ccc; }
.fpw .fpw-done { text-align: center; }
.fpw .fpw-done h2 { color: var(--primary); font-weight: 900; margin: 14px 0 8px; }
.fpw .fpw-done p { font-weight: 600; line-height: 1.55; max-width: 640px; margin: 0 auto 14px; }
.fpw .fpw-cta { display: inline-block; min-height: 44px; line-height: 44px; padding: 0 26px; margin: 6px; text-decoration: none; }
.fpw .score-circle { width: 130px; height: 130px; margin: 0 auto; background: var(--primary); color: #fff; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 2.4em; font-weight: 900; }
@media (max-width: 600px) { .fpw { padding: 22px 16px; } .fpw .test-nav { flex-direction: column; align-items: stretch; } .fpw .nav-btn-group { width: 100%; } .fpw .nav-btn-group .nav-action-btn { flex: 1; } }
