/* =========================================================
   BOTIXBO — real site design system
   Ported verbatim from the Next.js app's app/botixbo.css so the WordPress
   build renders from the same CSS as the live site rather than an
   approximation of it. Do not hand-edit: re-run build_css.py, otherwise
   this drifts out of sync with the source.

   Only deviation: the two next/font variables (--font-jakarta,
   --font-plex-mono) are resolved to their Google Fonts equivalents,
   since next/font isn't available here.
   ========================================================= */

.botixbo{
  --font-jakarta: 'Plus Jakarta Sans';
  --font-plex-mono: 'IBM Plex Mono';
}


/* ---------- botixbo.css ---------- */
/* Botixbo homepage design system — adapted from supplied reference build.
   Fonts come from next/font (see layout.tsx) instead of a Google Fonts <link>. */
.botixbo{
  --blue:#2563EB;
  --blue-2:#3B82F6;
  --blue-deep:#1D4ED8;
  --blue-soft:#EAF1FE;
  --navy:#0F1B3D;
  --navy-2:#15254c;
  --ink:#1E293B;
  --heading:#0F172A;
  --muted:#64748B;
  --muted-2:#94A3B8;
  --bg:#FFFFFF;
  --soft:#F6F9FC;
  --line:#E7EDF5;
  --green:#0D9488;
  --disp: var(--font-jakarta), sans-serif;
  --body: var(--font-jakarta), sans-serif;
  --mono: var(--font-jakarta), sans-serif;
  --maxw:1200px;
  --ease:cubic-bezier(.22,.61,.36,1);
  font-family:var(--body);background:var(--bg);color:var(--ink);line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden;
}
.botixbo *{margin:0;padding:0;box-sizing:border-box}
.botixbo a{color:inherit;text-decoration:none}
.botixbo :focus-visible{outline:2px solid var(--blue-2);outline-offset:3px;border-radius:4px}
.botixbo .hero :focus-visible,.botixbo .projects :focus-visible,.botixbo .finalcta :focus-visible,.botixbo footer :focus-visible{outline-color:#fff}
.botixbo img{max-width:100%;display:block}
.botixbo .wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}
.botixbo h1,.botixbo h2,.botixbo h3,.botixbo h4{font-family:var(--disp);line-height:1.14;letter-spacing:-.01em;color:var(--heading)}
.botixbo .section{padding:96px 0}
.botixbo .center{text-align:center}
.botixbo .eyebrow{font-family:var(--mono);font-size:12.5px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--blue)}
.botixbo .sec-title{font-size:clamp(34px,4.4vw,56px);font-weight:700;letter-spacing:-.01em}
.botixbo .sec-title.blue{color:var(--blue)}
.botixbo .sec-sub{color:var(--muted);font-size:clamp(16.5px,1.3vw,19px);line-height:1.6;max-width:620px;margin:16px auto 0}
.botixbo .head{margin-bottom:52px}

/* reveal */
.botixbo .reveal{opacity:0;transform:translateY(26px);transition:opacity .8s var(--ease),transform .8s var(--ease)}
.botixbo .reveal.in{opacity:1;transform:none}
.botixbo .d1{transition-delay:.08s}.botixbo .d2{transition-delay:.16s}.botixbo .d3{transition-delay:.24s}.botixbo .d4{transition-delay:.32s}.botixbo .d5{transition-delay:.4s}

/* buttons */
.botixbo .btn{font-family:var(--body);font-weight:500;font-size:14.5px;padding:12px 22px;border-radius:10px;cursor:pointer;border:none;transition:transform .25s var(--ease),box-shadow .25s var(--ease),background .25s,background-position .35s var(--ease);display:inline-flex;align-items:center;gap:8px;white-space:nowrap}
.botixbo .btn-primary{background:linear-gradient(135deg,var(--blue-2),var(--blue) 55%,var(--blue-deep));background-size:160% 160%;background-position:0% 50%;color:#fff;box-shadow:0 8px 22px rgba(37,99,235,.28)}
.botixbo .btn-primary:hover{background-position:100% 50%;transform:translateY(-2px);box-shadow:0 12px 30px rgba(37,99,235,.36)}
.botixbo .btn-outline{background:rgba(255,255,255,.06);color:#fff;border:1px solid rgba(255,255,255,.5)}
.botixbo .btn-outline:hover{background:rgba(255,255,255,.14);transform:translateY(-2px)}
.botixbo .btn-lightoutline{background:#fff;color:var(--blue);border:1px solid var(--line)}
.botixbo .btn-lightoutline:hover{border-color:var(--blue);transform:translateY(-2px)}

/* ============ NAV ============ */
/* Solid, self-contained bar — sits above the hero as its own block rather
   than floating transparently over the video. */
/* position:sticky is inert here because the .botixbo wrapper's overflow-x:hidden
   (line 42) computes overflow-y to auto per spec, making .botixbo the nearest
   scrolling ancestor for sticky purposes; position:fixed is unaffected by that
   and is compensated for below via .botixbo's padding-top so content doesn't jump. */
.botixbo header{position:fixed;top:0;left:0;right:0;z-index:100;background:#fff;box-shadow:0 1px 0 var(--line),0 6px 24px rgba(15,23,42,.04)}
.botixbo{padding-top:88px}
#platform,#journey,#services,#impact,#media,#proposal-form{scroll-margin-top:88px}
.botixbo .nav{display:flex;align-items:center;height:88px;gap:40px}
.botixbo .logo{display:flex;align-items:center;flex-shrink:0}
.botixbo .logo .lockup{position:relative;height:52px;width:176px;flex-shrink:0}
.botixbo .logo .lockup img{object-fit:contain;object-position:left center}
.botixbo .nav-links{display:flex;gap:22px;align-items:center;flex:1}
.botixbo header .btn-primary{flex-shrink:0}
.botixbo .navi{position:relative;display:flex;align-items:center}
.botixbo .nav-links a{font-size:15.5px;color:var(--ink);font-weight:500;transition:color .25s;position:relative;display:flex;align-items:center;white-space:nowrap}
.botixbo .nav-links a::after{content:"";position:absolute;left:0;bottom:-30px;height:2px;width:0;background:var(--blue);transition:width .3s var(--ease)}
.botixbo .nav-links a:hover{color:var(--blue)}
.botixbo .nav-links a:hover::after{width:100%}
.botixbo .navi-menu{display:none;position:absolute;top:100%;left:0;padding-top:16px;z-index:50}
.botixbo .navi:hover .navi-menu,.botixbo .navi:focus-within .navi-menu{display:block}
.botixbo .navi-menu a{display:block;padding:10px 16px;font-size:13.5px;font-weight:450;color:var(--ink);border-radius:8px;white-space:nowrap}
.botixbo .navi-menu a:hover{background:var(--blue-soft);color:var(--blue)}
.botixbo .navi-menu a::after{display:none}
.botixbo .navi-menu{background:#fff;border:1px solid var(--line);border-radius:14px;padding:8px;box-shadow:0 20px 40px -20px rgba(15,23,42,.25);min-width:220px}
.botixbo .nav-toggle{display:none;background:none;border:none;cursor:pointer;color:var(--ink)}
.botixbo .mnav{display:none;flex-direction:column;background:#fff;border-top:1px solid var(--line);box-shadow:0 16px 30px -18px rgba(15,23,42,.15)}
.botixbo .mnav.open{display:flex}
.botixbo .mnav a{padding:16px 28px;font-size:16px;font-weight:500;color:var(--ink);border-bottom:1px solid var(--line)}
.botixbo .mnav-group:last-child > a{border-bottom:none}
.botixbo .mnav-sub{display:flex;flex-direction:column;background:var(--blue-soft, #f4f7ff)}
.botixbo .mnav-sub a{padding:12px 28px 12px 44px;font-size:14px;font-weight:450;color:var(--muted);border-bottom:1px solid var(--line)}
.botixbo .mnav-sub a:last-child{border-bottom:none}

/* ============ HERO (full-screen video, left-aligned copy) ============ */
.botixbo .hero{position:relative;height:calc(100vh - 88px);min-height:640px;display:flex;align-items:center;overflow:hidden;background:#0a0a0a}
.botixbo .hero-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}
/* Diagonal, multi-stop scrim — darkest behind the copy on the left, sheer
   over the video on the right so the footage still reads clearly, plus a
   soft bottom fade so the hero doesn't cut into the next section abruptly. */
.botixbo .hero-overlay{position:absolute;inset:0;z-index:1;background:
  linear-gradient(100deg,rgba(8,9,11,.78) 0%,rgba(8,9,11,.52) 32%,rgba(8,9,11,.18) 58%,rgba(8,9,11,.08) 100%),
  linear-gradient(0deg,rgba(8,9,11,.65) 0%,transparent 22%)}
.botixbo .hero .wrap{position:relative;z-index:2;width:100%}
.botixbo .hero-copy{max-width:720px;opacity:0;animation:botixbo-up .7s var(--ease) .1s forwards}
.botixbo .hero-eyebrow{display:flex;align-items:center;gap:10px;color:rgba(255,255,255,.82);font-size:13px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;margin-bottom:24px}
.botixbo .hero-eyebrow::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--blue-2);box-shadow:0 0 0 4px rgba(59,130,246,.25);flex-shrink:0}
.botixbo .hero h1{font-size:clamp(56px,7.8vw,90px);font-weight:800;line-height:.94;letter-spacing:-.02em;color:#fff;text-shadow:0 8px 40px rgba(0,0,0,.45);text-transform:uppercase}
.botixbo .hero h1 span.blue{background:linear-gradient(100deg,var(--blue-2),#8ab4ff 60%,var(--blue-2));background-clip:text;-webkit-background-clip:text;color:transparent}
@keyframes botixbo-up{to{opacity:1;transform:none}}
.botixbo .hero .lead{color:rgba(255,255,255,.82);font-size:18px;line-height:1.6;font-weight:400;max-width:460px;margin:26px 0 0;opacity:0;animation:botixbo-up .8s var(--ease) .38s forwards}
.botixbo .hero-cta{display:flex;gap:14px;flex-wrap:wrap;margin-top:34px;opacity:0;animation:botixbo-up .8s var(--ease) .5s forwards}
.botixbo .hero .btn{padding:16px 30px;font-size:15.5px;font-weight:600}
.botixbo .hero .btn-primary{box-shadow:0 12px 28px -8px rgba(37,99,235,.55)}
.botixbo .hero .btn-primary:hover{box-shadow:0 16px 34px -8px rgba(37,99,235,.65)}
.botixbo .hero .btn-primary svg{transition:transform .3s var(--ease)}
.botixbo .hero .btn-primary:hover svg{transform:translateX(3px)}
.botixbo .hero .btn-outline{background:rgba(255,255,255,.05);color:#fff;border:1px solid rgba(255,255,255,.35);backdrop-filter:blur(6px)}
.botixbo .hero .btn-outline:hover{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.55)}
.botixbo .vid-ctrl{position:absolute;right:32px;top:50%;transform:translateY(-50%);z-index:3;width:50px;height:50px;border-radius:50%;border:1px solid rgba(255,255,255,.3);background:rgba(0,0,0,.3);backdrop-filter:blur(8px);color:#fff;cursor:pointer;display:grid;place-items:center;transition:all .3s var(--ease);box-shadow:0 8px 24px -8px rgba(0,0,0,.5)}
.botixbo .vid-ctrl:hover{background:rgba(0,0,0,.48);border-color:rgba(255,255,255,.5);transform:translateY(-50%) scale(1.08)}
.botixbo .vid-ctrl svg{width:18px;height:18px}
.botixbo .hero-scroll{position:absolute;left:50%;bottom:28px;transform:translateX(-50%);z-index:3;display:flex;flex-direction:column;align-items:center;gap:8px;color:rgba(255,255,255,.7);font-size:11.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;transition:color .25s var(--ease);animation:hero-bob 2.6s ease-in-out infinite}
.botixbo .hero-scroll:hover{color:#fff}
.botixbo .hero-scroll svg{width:16px;height:16px}
@keyframes hero-bob{0%,100%{transform:translateX(-50%) translateY(0)}50%{transform:translateX(-50%) translateY(6px)}}
.botixbo .hero-strip{margin-top:46px;padding-top:30px;border-top:1px solid rgba(255,255,255,.14);opacity:0;animation:botixbo-up .8s var(--ease) .62s forwards}
.botixbo .hero-strip .row{display:flex;flex-wrap:wrap;gap:10px 12px}
.botixbo .hstag{display:flex;align-items:center;gap:8px;color:rgba(255,255,255,.92);font-size:13.5px;font-weight:600;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);border-radius:999px;padding:7px 15px 7px 7px;backdrop-filter:blur(6px);transition:background .25s var(--ease),border-color .25s var(--ease),transform .25s var(--ease)}
.botixbo .hstag:hover{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.3);transform:translateY(-2px)}
.botixbo .hstag .hs-ico{width:22px;height:22px;border-radius:50%;background:linear-gradient(135deg,var(--blue),var(--blue-2));display:grid;place-items:center;flex-shrink:0;box-shadow:0 2px 8px -2px rgba(37,99,235,.6)}
.botixbo .hstag svg{width:12px;height:12px;stroke:#fff}

/* ============ AUDIENCE ============ */
/* Deliberate section-background rhythm — every section below alternates
   white/soft against its neighbors so boundaries stay visible. The shared
   .tech class (used for its icon-tile styling) is NOT relied on for
   background color here since three unrelated sections share it. */
#platform{background:var(--soft)}
#technologies{background:#fff}
#school-solutions{background:var(--soft)}
#journey{background:#fff}
#school-testimonials{background:var(--soft)}
/* Reconciliation-phase override: on the live homepage this section was
   repositioned to sit between "impact" (solid blue) and "media" (also
   var(--soft)) -- a spot the original alternating white/soft rhythm above
   never anticipated. Left as var(--soft) it read as one continuous block
   with "media" right below it. #id + .class beats the bare #id rule on
   specificity, so this doesn't touch the original rule or any other
   section using it. */
#school-testimonials.ptestimonial{background:#fff}
#student-testimonials{background:#fff}
/* The team replaced that rebuilt section's content with their own
   hand-written HTML/JS carousel (real testimonials, real photos) via
   Elementor's raw-HTML code view, wrapped in its own <section id=
   "testimonials"> rather than "school-testimonials" -- this targets that
   actual live id. Background-color alternation alone doesn't separate it
   from "school-solutions" above, which is also plain white -- two white
   sections in a row still read as one, whatever color this one becomes.
   A visible divider line (the same var(--line) border already used for
   the mobile nav and this card's own internal nav) fixes that regardless
   of what color either neighbor is. */
#testimonials{
  background:var(--soft);
  border-top:1px solid var(--line);
  /* This section renders inside Elementor's boxed (max-width) column, which
     would otherwise constrain the grey background to that content width
     with visible side margins. Break out to a true full-bleed band while
     leaving the card/content inside (.wrap, max-width:var(--maxw)) exactly
     as positioned. */
  width:100vw;
  margin-left:calc(50% - 50vw);
  margin-right:calc(50% - 50vw);
}
#testimonials .eyebrow,#school-testimonials .eyebrow,#student-testimonials .eyebrow{font-size:28px}
.botixbo .cards4{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
.botixbo .acard{background:var(--bg);border:1px solid var(--line);border-radius:16px;padding:30px 26px 26px;transition:transform .3s var(--ease),box-shadow .3s var(--ease),border-color .3s}
.botixbo .acard:hover{transform:translateY(-4px);box-shadow:0 16px 36px -22px rgba(37,99,235,.24);border-color:rgba(37,99,235,.2)}
.botixbo .acard .ico{width:48px;height:48px;border-radius:12px;display:grid;place-items:center;margin-bottom:18px}
.botixbo .acard:nth-child(1) .ico{background:var(--blue-soft)}.botixbo .acard:nth-child(1) .ico svg{stroke:#2563EB}
.botixbo .acard:nth-child(2) .ico{background:#E7F6EF}.botixbo .acard:nth-child(2) .ico svg{stroke:#10B981}
.botixbo .acard:nth-child(3) .ico{background:#F1EBFE}.botixbo .acard:nth-child(3) .ico svg{stroke:#8B5CF6}
.botixbo .acard:nth-child(4) .ico{background:#FDF0E5}.botixbo .acard:nth-child(4) .ico svg{stroke:#F59E0B}
.botixbo .acard .ico svg{width:24px;height:24px}
.botixbo .acard h3{font-size:clamp(19px,2vw,22px);font-weight:700;margin-bottom:14px}
.botixbo .acard ul{list-style:none;margin-bottom:20px}
.botixbo .acard ul li{font-size:15.5px;color:var(--muted);padding:5px 0 5px 18px;position:relative}
.botixbo .acard ul li::before{content:"";position:absolute;left:0;top:11px;width:5px;height:5px;border-radius:50%;background:var(--muted-2)}
.botixbo .acard .link{font-size:14px;font-weight:600;color:var(--blue);display:inline-flex;align-items:center;gap:6px;transition:gap .25s;background:none;border:none;cursor:pointer;font-family:var(--body)}
.botixbo .acard:hover .link{gap:11px}

/* ============ TECHNOLOGY EXPLORER (hover list + large visual) ============ */
.botixbo .tech{background:var(--soft)}
.botixbo .tex{display:grid;grid-template-columns:.85fr 1.15fr;gap:16px;align-items:stretch;margin-top:12px}
.botixbo .tex-list{display:flex;flex-direction:column;gap:6px}
.botixbo .tex-item{display:flex;align-items:center;gap:15px;background:transparent;border:1px solid transparent;border-radius:14px;padding:16px 18px;text-align:left;cursor:pointer;transition:all .3s var(--ease)}
.botixbo .tex-item:hover,.botixbo .tex-item:focus-visible{background:#fff;border-color:var(--line)}
.botixbo .tex-item.active{background:#fff;border-color:rgba(37,99,235,.25);box-shadow:0 16px 34px -22px rgba(37,99,235,.35)}
.botixbo .tex-item .tico{width:46px;height:46px;border-radius:12px;background:linear-gradient(135deg,var(--blue-soft),#D2E3FD);display:grid;place-items:center;flex-shrink:0;transition:background .3s var(--ease)}
.botixbo .tex-item.active .tico{background:linear-gradient(135deg,var(--blue-2),var(--blue-deep))}
.botixbo .tex-item .tico svg{width:22px;height:22px;stroke:var(--blue);transition:stroke .3s var(--ease)}
.botixbo .tex-item.active .tico svg{stroke:#fff}
.botixbo .tex-item-text h4{font-size:18px;font-weight:600;color:var(--heading)}
.botixbo .tex-item-text span{font-size:13.5px;color:var(--muted-2)}
.botixbo .tex-visual{position:relative;border-radius:20px;overflow:hidden;min-height:420px;box-shadow:0 30px 60px -28px rgba(15,23,42,.3)}
.botixbo .tex-visual-tint{position:absolute;inset:0;background:linear-gradient(0deg,rgba(8,9,11,.82) 0%,rgba(8,9,11,.15) 55%,transparent 80%)}
.botixbo .tex-visual-copy{position:absolute;left:0;right:0;bottom:0;padding:32px;color:#fff}
.botixbo .tex-visual-copy h3{font-size:clamp(24px,2.4vw,30px);font-weight:700;margin-bottom:10px;color:#fff;text-shadow:0 2px 12px rgba(0,0,0,.4)}
.botixbo .tex-visual-copy p{font-size:16px;color:rgba(255,255,255,.85);max-width:440px;line-height:1.65}

/* ============ BRAND STATEMENT (editorial, no cards) ============ */
.botixbo .brand-stmt{background:#fff;position:relative;overflow:hidden;padding-top:72px;padding-bottom:72px}
.botixbo .brand-stmt::before{content:"“";position:absolute;top:-40px;left:-10px;font-family:var(--disp);font-size:340px;line-height:1;color:var(--blue);opacity:.05;pointer-events:none;user-select:none}
.botixbo .brand-stmt-grid{position:relative;display:grid;grid-template-columns:1.1fr .9fr;gap:64px;align-items:center}
.botixbo .brand-stmt-h{font-size:clamp(34px,4vw,52px);font-weight:700;line-height:1.18;letter-spacing:-.01em;color:var(--heading)}
.botixbo .brand-stmt-side{padding:28px 0 28px 40px;border-left:1px solid var(--line)}
.botixbo .brand-stmt-eyebrow{font-family:var(--mono);font-size:12px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--blue);display:block;margin-bottom:16px}
.botixbo .brand-stmt-p{font-size:clamp(17px,1.4vw,20px);line-height:1.7;color:var(--muted)}
.botixbo .brand-stmt-rule{display:block;width:64px;height:3px;border-radius:2px;background:linear-gradient(90deg,var(--blue),var(--blue-2));margin-top:28px}

/* ============ SPLIT SCHOOL ============ */
.botixbo .split{display:grid;grid-template-columns:1fr 1.05fr;gap:54px;align-items:center}
.botixbo .split-copy h2{font-size:clamp(34px,4vw,54px);font-weight:700;margin-top:14px;letter-spacing:-.01em}
.botixbo .split-copy>p{color:var(--muted);margin-top:14px;font-size:clamp(16px,1.2vw,18px);line-height:1.7}
.botixbo .feat{display:grid;grid-template-columns:1fr 1fr;gap:10px 22px;margin:26px 0 30px;list-style:none}
.botixbo .feat li{font-size:14.5px;color:var(--ink);display:flex;align-items:center;gap:10px}
.botixbo .feat li svg{width:20px;height:20px;stroke:#fff;background:var(--blue);border-radius:50%;padding:4px;flex-shrink:0}
.botixbo .lab{height:420px;border-radius:20px;overflow:hidden;position:relative;border:1px solid var(--line);box-shadow:0 30px 60px -34px rgba(37,99,235,.35)}
.botixbo .lab img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.botixbo .lab-tint{position:absolute;inset:0;background:linear-gradient(180deg,rgba(15,23,42,.05),rgba(15,23,42,.55))}
.botixbo .lab-badge{position:absolute;top:22px;left:22px;font-size:13px;font-weight:600;color:var(--blue);background:#fff;border:1px solid var(--line);padding:7px 13px;border-radius:999px;box-shadow:0 6px 16px -8px rgba(37,99,235,.4);z-index:2}
.botixbo .lab-scan{position:absolute;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,var(--blue-2),transparent);top:0;animation:botixbo-scan 4s linear infinite;opacity:.7;z-index:2}
@keyframes botixbo-scan{0%{top:0}100%{top:100%}}

/* ============ JOURNEY ============ */
.botixbo .jcards{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
.botixbo .jcard{border:1px solid var(--line);border-radius:20px;overflow:hidden;background:#fff;transition:transform .35s var(--ease),box-shadow .35s var(--ease)}
.botixbo .jcard:hover{transform:translateY(-6px);box-shadow:0 24px 50px -26px rgba(37,99,235,.3)}
.botixbo .jcard .top{height:140px;position:relative;display:grid;place-items:center;overflow:hidden}
.botixbo .jcard .top img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.botixbo .jcard .top .tint{position:absolute;inset:0;z-index:1}
.botixbo .jcard:nth-child(1) .top .tint{background:linear-gradient(150deg,rgba(59,130,246,.55),rgba(29,78,216,.65))}
.botixbo .jcard:nth-child(2) .top .tint{background:linear-gradient(150deg,rgba(16,185,129,.55),rgba(4,120,87,.65))}
.botixbo .jcard:nth-child(3) .top .tint{background:linear-gradient(150deg,rgba(139,92,246,.55),rgba(109,40,217,.65))}
.botixbo .jcard .top svg{width:44px;height:44px;stroke:#fff;position:relative;z-index:2}
.botixbo .jcard .body{padding:26px 24px}
.botixbo .jcard .cls{font-size:13px;font-weight:600;color:var(--blue);letter-spacing:.08em;text-transform:uppercase}
.botixbo .jcard h3{font-size:22px;font-weight:700;margin:9px 0 9px}
.botixbo .jcard p{font-size:15.5px;color:var(--muted);line-height:1.6}
.botixbo .jcard .checks{list-style:none;margin-top:18px}
.botixbo .jcard .checks li{font-size:14px;color:var(--ink);font-weight:500;display:flex;align-items:center;gap:10px;padding:5px 0}
.botixbo .jcard .checks li .dot{width:18px;height:18px;border-radius:50%;background:var(--blue-soft);display:grid;place-items:center;flex-shrink:0}
.botixbo .jcard .checks li svg{width:11px;height:11px;stroke:var(--blue);flex-shrink:0}

/* ============ PROJECTS ============ */
.botixbo .projects{background:var(--navy);color:#fff;position:relative;overflow:hidden}
.botixbo .projects .grid-bg{position:absolute;inset:0;background-image:linear-gradient(rgba(148,163,184,.08) 1px,transparent 1px),linear-gradient(90deg,rgba(148,163,184,.08) 1px,transparent 1px);background-size:44px 44px;mask-image:linear-gradient(#000,transparent);-webkit-mask-image:linear-gradient(#000,transparent)}
.botixbo .projects .sec-title{color:#fff}.botixbo .projects .sec-sub{color:rgba(226,232,240,.7)}
.botixbo .projects .head{display:flex;justify-content:space-between;align-items:flex-end;text-align:left;margin-bottom:40px;position:relative;z-index:2}
.botixbo .projects .head .sec-sub{margin:12px 0 0}
.botixbo .projects .head .more{font-size:14px;font-weight:600;color:var(--blue-2);display:inline-flex;align-items:center;gap:7px;white-space:nowrap;background:none;border:none;cursor:pointer;font-family:var(--body)}
.botixbo .pgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;position:relative;z-index:2}
.botixbo .pcard{border-radius:16px;overflow:hidden;border:1px solid rgba(148,163,184,.16);background:rgba(255,255,255,.03);transition:all .35s var(--ease);cursor:pointer}
.botixbo .pcard:hover{transform:translateY(-5px);border-color:var(--blue);box-shadow:0 28px 56px -28px rgba(0,0,0,.6)}
.botixbo .pcard .pv{height:186px;position:relative;overflow:hidden}
.botixbo .pcard .pv img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s var(--ease)}
.botixbo .pcard:hover .pv img{transform:scale(1.08)}
.botixbo .pcard .pv .tint{position:absolute;inset:0;background:linear-gradient(180deg,rgba(15,23,42,.1),rgba(15,23,42,.55))}
.botixbo .pcard .pb{padding:18px 20px;display:flex;justify-content:space-between;align-items:center}
.botixbo .pcard .pb h4{font-size:15.5px;font-weight:600;color:#fff}
.botixbo .pcard .pb .meta{font-size:13px;color:#c2cbd9;margin-top:3px}
.botixbo .pcard .pb .arrow{width:32px;height:32px;border-radius:50%;border:1px solid rgba(148,163,184,.24);display:grid;place-items:center;transition:all .3s var(--ease);flex-shrink:0}
.botixbo .pcard:hover .pb .arrow{background:var(--blue);border-color:var(--blue)}
.botixbo .pcard .pb .arrow svg{width:16px;height:16px;stroke:#fff}

/* ============ SERVICES ============ */
/* Full-bleed accent section with elevated white cards — borrowed from
   terastamp.org's "Everything You Need, All in One Place" block. */
.botixbo .services{position:relative;background:linear-gradient(155deg,var(--blue-2),var(--blue-deep));overflow:hidden}
.botixbo .services::before{content:"";position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.08) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.08) 1px,transparent 1px);background-size:36px 36px;mask-image:radial-gradient(120% 90% at 50% 0%,#000,transparent 75%)}
.botixbo .services .sec-title{color:#fff}
.botixbo .services .sec-title.blue{color:#fff}
.botixbo .services .eyebrow{color:rgba(255,255,255,.85)}
.botixbo .services .sec-sub{color:rgba(255,255,255,.78)}
.botixbo .sgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;position:relative;z-index:2}
.botixbo .scard{background:#fff;border-radius:16px;padding:28px 26px 26px;transition:all .3s var(--ease);box-shadow:0 20px 40px -22px rgba(11,21,38,.35)}
.botixbo .scard:hover{transform:translateY(-6px)}
.botixbo .scard .sico{width:44px;height:44px;border-radius:12px;background:linear-gradient(135deg,var(--blue-soft),#D2E3FD);display:grid;place-items:center;margin-bottom:16px}
.botixbo .scard .sico svg{width:22px;height:22px;stroke:var(--blue)}
.botixbo .scard h4{font-size:19px;font-weight:700;margin-bottom:8px}
.botixbo .scard p{font-size:15.5px;color:var(--muted);line-height:1.6}

/* ============ IMPACT ============ */
.botixbo .impact-inner{display:grid;grid-template-columns:.9fr 1.1fr;gap:52px;align-items:center}
.botixbo .impact h2{font-size:clamp(30px,3.8vw,44px);font-weight:700;letter-spacing:-.01em}
.botixbo .reasons{list-style:none;margin-top:24px}
.botixbo .reasons li{display:flex;align-items:center;gap:14px;padding:14px 0;border-bottom:1px solid var(--line);font-size:16px;font-weight:500;color:var(--ink);transition:padding-left .25s var(--ease)}
.botixbo .reasons li:hover{padding-left:6px}
.botixbo .reasons li .n{font-size:13px;font-weight:700;color:var(--blue);width:26px}
.botixbo .reasons li .check{margin-left:auto;width:26px;height:26px;border-radius:50%;background:var(--blue-soft);display:grid;place-items:center;flex-shrink:0;transition:background .25s var(--ease)}
.botixbo .reasons li:hover .check{background:var(--blue)}
.botixbo .reasons li svg{width:14px;height:14px;stroke:var(--blue);transition:stroke .25s var(--ease)}
.botixbo .reasons li:hover svg{stroke:#fff}
.botixbo .stats{background:linear-gradient(140deg,var(--blue),var(--blue-deep));border-radius:22px;padding:44px;display:grid;grid-template-columns:1fr 1fr;gap:34px 30px;position:relative;overflow:hidden;box-shadow:0 34px 70px -30px rgba(37,99,235,.55)}
.botixbo .stats::before{content:"";position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.09) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.09) 1px,transparent 1px);background-size:30px 30px;mask-image:radial-gradient(circle at 80% 10%,#000,transparent 72%)}
.botixbo .stat{position:relative;z-index:2}
.botixbo .stat .sico{width:40px;height:40px;border-radius:11px;background:rgba(255,255,255,.16);display:grid;place-items:center;margin-bottom:13px}
.botixbo .stat .sico svg{width:20px;height:20px;stroke:#fff}
.botixbo .stat .num{font-family:var(--disp);font-weight:800;font-size:clamp(38px,3.4vw,52px);color:#fff;line-height:1}
.botixbo .stat .lbl{font-size:13.5px;color:rgba(255,255,255,.85);margin-top:5px}

/* ============ TESTIMONIALS ============ */
.botixbo .tgrid-single{max-width:960px;margin:0 auto}
.botixbo .tgrid-students{display:grid;grid-template-columns:1fr 1fr;gap:24px;max-width:960px;margin:0 auto}
.botixbo .tcard{border:1px solid var(--line);border-radius:18px;padding:36px;background:#fff;box-shadow:0 16px 36px -26px rgba(15,23,42,.2);transition:all .3s var(--ease)}
.botixbo .tcard.featured{display:flex;gap:32px;padding:44px;background:#fff;box-shadow:0 30px 64px -30px rgba(15,23,42,.28);border-color:transparent}
.botixbo .feat-photo{position:relative;width:200px;flex-shrink:0;border-radius:16px;overflow:hidden}
.botixbo .feat-body{display:flex;flex-direction:column;min-width:0}
.botixbo .tcard.featured .body-q{font-size:clamp(22px,2.1vw,28px);line-height:1.45;font-weight:600;margin:10px 0 24px;color:var(--heading)}
.botixbo .tcard.featured .quote{font-size:64px}
.botixbo .feat-nav{display:flex;align-items:center;justify-content:space-between;margin-top:auto;padding-top:20px;border-top:1px solid var(--line)}
.botixbo .feat-count{font-size:13.5px;font-weight:600;color:var(--muted-2);letter-spacing:.06em}
.botixbo .feat-arrows{display:flex;gap:8px}
.botixbo .feat-arrows button{width:34px;height:34px;border-radius:50%;border:1px solid var(--line);background:#fff;display:grid;place-items:center;color:var(--ink);cursor:pointer;transition:all .25s var(--ease)}
.botixbo .feat-arrows button:hover{background:var(--blue);border-color:var(--blue);color:#fff}
.botixbo .feat-arrows svg{width:16px;height:16px}
.botixbo .tcard:hover{transform:translateY(-5px);box-shadow:0 20px 42px -24px rgba(15,23,42,.2)}
.botixbo .tcard .quote{font-family:var(--disp);font-size:56px;line-height:.5;color:var(--blue);opacity:.28;height:24px}
.botixbo .tcard .body-q{font-size:18.5px;line-height:1.5;font-weight:500;color:var(--ink);margin:10px 0 22px}
.botixbo .tperson{display:flex;align-items:center;gap:13px}
.botixbo .avatar{width:54px;height:54px;border-radius:50%;display:grid;place-items:center;font-family:var(--disp);font-weight:700;color:#fff;font-size:15px;overflow:hidden;position:relative}
.botixbo .avatar img{width:100%;height:100%;object-fit:cover}
.botixbo .avatar.a{background:linear-gradient(135deg,#2563eb,#8b5cf6)}
.botixbo .avatar.b{background:linear-gradient(135deg,#0891b2,#0e7490)}
.botixbo .tperson .who{font-weight:600;font-size:15.5px;color:var(--heading)}
.botixbo .tperson .role{font-size:13.5px;color:var(--muted-2);line-height:1.4}

/* ============ MEDIA COVERAGE ============ */
.botixbo .media{background:var(--soft)}
.botixbo .press-row{display:flex;flex-wrap:wrap;justify-content:center;gap:14px;margin-bottom:44px}
.botixbo .press{display:flex;align-items:center;gap:10px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px 22px;transition:all .3s var(--ease)}
.botixbo .press:hover{border-color:var(--blue);transform:translateY(-3px);box-shadow:0 14px 30px -18px rgba(37,99,235,.4)}
.botixbo .press .p-mark{width:30px;height:30px;border-radius:8px;background:linear-gradient(135deg,var(--blue),var(--blue-2));display:grid;place-items:center;color:#fff;font-family:var(--disp);font-weight:800;font-size:14px;flex-shrink:0}
.botixbo .press .p-name{font-family:var(--disp);font-weight:700;font-size:15px;color:var(--heading);white-space:nowrap}
.botixbo .m-meta{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--muted-2)}
.botixbo .m-meta .pill{background:var(--blue-soft);color:var(--blue);font-weight:600;padding:4px 10px;border-radius:999px;font-size:12px}

/* Featured story — large split card */
.botixbo .media-featured{display:grid;grid-template-columns:1.2fr 1fr;gap:0;background:#fff;border-radius:20px;overflow:hidden;box-shadow:0 30px 60px -32px rgba(15,23,42,.25);margin-bottom:24px}
.botixbo .mf-image{position:relative;min-height:340px}
.botixbo .mf-body{padding:44px 40px;display:flex;flex-direction:column;justify-content:center}
.botixbo .mf-body h3{font-size:clamp(24px,2.6vw,32px);font-weight:700;line-height:1.3;margin:14px 0 14px}
.botixbo .mf-body p{font-size:16px;color:var(--muted);line-height:1.65;margin-bottom:20px}
.botixbo .mf-outlet{display:block;font-family:var(--disp);font-weight:700;font-size:14px;color:var(--heading);margin-bottom:16px}
.botixbo .mf-body .link{font-size:14.5px;font-weight:600;color:var(--blue);display:inline-flex;align-items:center;gap:6px;width:fit-content}

/* Secondary stories — editorial list rows */
.botixbo .media-list{display:flex;flex-direction:column;gap:16px}
.botixbo .ml-item{display:flex;gap:20px;padding:22px;background:#fff;border:1px solid var(--line);border-radius:16px;transition:all .3s var(--ease)}
.botixbo .ml-item:hover{border-color:var(--blue);box-shadow:0 16px 34px -24px rgba(37,99,235,.3)}
.botixbo .ml-thumb{position:relative;width:96px;height:96px;border-radius:12px;overflow:hidden;flex-shrink:0}
.botixbo .ml-body{min-width:0}
.botixbo .ml-body h4{font-size:17px;font-weight:700;line-height:1.35;margin:8px 0 6px}
.botixbo .ml-body p{font-size:14.5px;color:var(--muted);line-height:1.55;margin-bottom:8px}
.botixbo .ml-outlet{font-size:13px;color:var(--muted-2);font-weight:600}
.botixbo .ml-outlet .link{font-size:13px;font-weight:600;color:var(--blue)}

/* ============ TRUST ============ */
.botixbo .trust{padding:64px 0;background:#fff}
.botixbo .trust .lbl{text-align:center;font-size:13px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--muted-2);margin-bottom:34px}
.botixbo .marquee{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}
.botixbo .marquee-track{display:flex;gap:56px;width:max-content;animation:botixbo-march 28s linear infinite}
.botixbo .marquee:hover .marquee-track{animation-play-state:paused}
@keyframes botixbo-march{to{transform:translateX(-50%)}}
.botixbo .brand{font-family:var(--disp);font-weight:700;font-size:18px;color:#9aa8bd;display:flex;align-items:center;gap:9px;white-space:nowrap;transition:color .3s,opacity .3s;opacity:.75}
.botixbo .brand:hover{color:var(--blue);opacity:1}
.botixbo .brand .b{width:26px;height:26px;border-radius:7px;background:linear-gradient(135deg,#cbd5e1,#9aa8bd);display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700;transition:background .3s}
.botixbo .brand:hover .b{background:linear-gradient(135deg,var(--blue),var(--blue-2))}

/* ============ RESOURCES ============ */
.botixbo .res-grid{display:grid;grid-template-columns:1fr 1fr;gap:48px}
.botixbo .books{display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:26px;perspective:1200px}
.botixbo .books .book{width:180px !important;max-width:180px !important;aspect-ratio:3/4.6 !important;flex:0 0 auto !important;}
.botixbo .book .book-cover img{object-position:top}
.botixbo .book{aspect-ratio:3/4;border-radius:3px 10px 10px 3px;position:relative;overflow:visible;display:flex;flex-direction:column;justify-content:flex-end;padding:16px 14px;cursor:pointer;transform:rotateY(-14deg);transform-style:preserve-3d;transition:transform .4s var(--ease),box-shadow .4s var(--ease);box-shadow:6px 10px 24px -8px rgba(15,23,42,.4),-1px 0 0 rgba(0,0,0,.15) inset}
.botixbo .book:hover{transform:rotateY(-4deg) translateY(-6px)}
.botixbo .book::before{content:"";position:absolute;inset:0;border-radius:inherit;background-image:linear-gradient(100deg,rgba(255,255,255,.32) 0%,rgba(255,255,255,.05) 18%,transparent 32%),linear-gradient(rgba(255,255,255,.12) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.12) 1px,transparent 1px);background-size:100% 100%,18px 18px,18px 18px}
.botixbo .book::after{content:"";position:absolute;top:2px;bottom:2px;right:-6px;width:6px;border-radius:0 3px 3px 0;background:repeating-linear-gradient(180deg,#f4f4f4 0 2px,#e2e2e2 2px 3px);transform:translateZ(-1px);box-shadow:2px 0 4px -1px rgba(0,0,0,.2)}
.botixbo .book:nth-child(1){background:linear-gradient(160deg,#f59e0b,#b45309)}
.botixbo .book:nth-child(2){background:linear-gradient(160deg,#10b981,#047857)}
.botixbo .book:nth-child(3){background:linear-gradient(160deg,#3b82f6,#1d4ed8)}
.botixbo .book:nth-child(4){background:linear-gradient(160deg,#8b5cf6,#6d28d9)}
.botixbo .book .bt{position:relative;color:#fff;font-family:var(--disp);font-weight:700;font-size:14px;line-height:1.25}
.botixbo .book .book-cover{position:absolute;inset:0;z-index:0;border-radius:inherit;overflow:hidden;aspect-ratio:auto !important}
.botixbo .book .book-cover img{width:100%;height:100%;object-fit:cover;border-radius:inherit}
.botixbo .book .book-cover::after{content:"";position:absolute;inset:0;background:linear-gradient(0deg,rgba(0,0,0,.75) 0%,rgba(0,0,0,.35) 45%,rgba(0,0,0,.05) 75%)}
.botixbo .book .bt,.botixbo .book .bs{z-index:1;text-shadow:0 1px 3px rgba(0,0,0,.5)}
.botixbo .book .bs{position:relative;color:rgba(255,255,255,.9);font-size:12px;margin-top:5px;text-transform:uppercase;letter-spacing:.06em;font-weight:600}
.botixbo .article{display:flex;align-items:center;gap:16px;border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:14px;transition:all .3s var(--ease);cursor:pointer;background:var(--soft)}
.botixbo .article:hover{border-color:var(--blue);transform:translateX(6px)}
.botixbo .article-thumb{position:relative;width:72px;height:72px;border-radius:10px;overflow:hidden;flex-shrink:0}
.botixbo .article-body{min-width:0}
.botixbo .article .cat{font-size:12.5px;font-weight:600;color:var(--blue);letter-spacing:.06em;text-transform:uppercase}
.botixbo .article h4{font-size:18px;font-weight:700;margin:6px 0 4px;line-height:1.35}
.botixbo .article p{font-size:15px;color:var(--muted);line-height:1.55}
.botixbo .article-more{display:inline-block;margin-top:6px;font-size:13px;font-weight:600;color:var(--blue)}

/* ============ FINAL CTA ============ */
.botixbo .finalcta{position:relative;overflow:hidden;background:linear-gradient(135deg,var(--blue-deep),var(--navy));padding:96px 0}
.botixbo .finalcta .grid-bg{position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.07) 1px,transparent 1px);background-size:40px 40px;mask-image:radial-gradient(80% 100% at 50% 50%,#000,transparent)}
/* Large faint brand mark in the corner — same watermark trick used on
   whizlancer.com. mix-blend-mode:screen keeps the JPEG's white background
   from reading as a hard box on the dark section; only the mark glows through. */
.botixbo .finalcta-inner{position:relative;z-index:2;text-align:center;max-width:720px;margin:0 auto}
.botixbo .finalcta h2{font-size:clamp(36px,5vw,58px);font-weight:800;color:#fff;letter-spacing:-.01em}
.botixbo .finalcta p{color:rgba(226,232,240,.85);font-size:clamp(17px,1.5vw,19px);margin:22px 0 34px;line-height:1.6}
.botixbo .finalcta .hero-cta{justify-content:center;animation:none;opacity:1}
.botixbo .finalcta .btn-white{background:#fff;color:var(--blue);padding:16px 30px;font-size:15.5px;font-weight:600;box-shadow:0 12px 28px -10px rgba(0,0,0,.35)}
.botixbo .finalcta .btn-white:hover{background:#f1f5ff;transform:translateY(-2px);box-shadow:0 16px 34px -10px rgba(0,0,0,.4)}
.botixbo .finalcta-inner::before{content:"";display:block;width:56px;height:3px;border-radius:2px;background:linear-gradient(90deg,var(--blue-2),#8ab4ff);margin:0 auto 26px}

/* ============ FOOTER ============ */
.botixbo footer{position:relative;background:var(--navy);color:#fff;padding:70px 0 30px;overflow:hidden}
.botixbo footer::before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,var(--blue-2),transparent)}
.botixbo footer::after{content:"";position:absolute;top:-180px;left:50%;transform:translateX(-50%);width:600px;height:360px;background:radial-gradient(closest-side,rgba(59,130,246,.12),transparent);pointer-events:none}
.botixbo footer .wrap{position:relative;z-index:1}
.botixbo .foot-cta{display:flex;align-items:center;justify-content:space-between;gap:32px;flex-wrap:wrap;background:linear-gradient(135deg,rgba(37,99,235,.18),rgba(59,130,246,.05));border:1px solid rgba(59,130,246,.28);border-radius:20px;padding:38px 42px;margin-bottom:56px}
.botixbo .foot-cta-eyebrow{display:block;font-family:var(--mono);font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--blue-2);margin-bottom:10px}
.botixbo .foot-cta-text h3{font-family:var(--disp);font-size:24px;font-weight:800;color:#fff;max-width:480px;line-height:1.3}
.botixbo .foot-cta-actions{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.botixbo .foot-cta-actions .btn-ghost-invert{display:inline-flex;align-items:center;gap:9px;padding:14px 24px;border-radius:12px;border:1px solid rgba(255,255,255,.24);color:#fff;font-weight:600;font-size:14px;white-space:nowrap;transition:all .3s var(--ease)}
.botixbo .foot-cta-actions .btn-ghost-invert svg{width:16px;height:16px;flex-shrink:0}
.botixbo .foot-cta-actions .btn-ghost-invert:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.45);transform:translateY(-2px)}
.botixbo .foot-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr 1fr;gap:34px}
.botixbo .foot-brand .logo{color:#fff;margin-bottom:18px}
.botixbo .foot-brand p{font-size:14px;color:rgba(226,232,240,.6);max-width:280px}
.botixbo .socials{display:flex;gap:11px;margin-top:22px}
.botixbo .socials a{width:38px;height:38px;border-radius:10px;border:1px solid rgba(148,163,184,.2);display:grid;place-items:center;transition:all .3s var(--ease)}
.botixbo .socials a:hover{background:linear-gradient(135deg,var(--blue-2),var(--blue-deep));border-color:transparent;transform:translateY(-3px)}
.botixbo .socials a svg{width:17px;height:17px;stroke:#e2e8f0}
.botixbo .socials .social-unconfigured{width:38px;height:38px;border-radius:10px;border:1px solid rgba(148,163,184,.1);display:grid;place-items:center;opacity:.35;cursor:default}
.botixbo .socials .social-unconfigured svg{width:17px;height:17px;stroke:#e2e8f0}
.botixbo .fcol h5{font-family:var(--disp);font-size:14px;font-weight:700;margin-bottom:16px;color:#fff}
.botixbo .fcol a{display:block;font-size:13.5px;color:rgba(226,232,240,.6);padding:5px 0;transition:color .25s}
.botixbo .fcol a:hover{color:var(--blue-2)}
.botixbo .fcol-contact .fcontact-row{display:flex;align-items:center;gap:10px;font-size:13.5px;color:rgba(226,232,240,.65);padding:7px 0}
.botixbo .fcol-contact .ficon{width:16px;height:16px;flex-shrink:0;color:var(--blue-2)}
.botixbo .fcol-contact a.fcontact-row:hover{color:var(--blue-2)}
.botixbo .foot-bottom{display:flex;justify-content:space-between;align-items:center;margin-top:52px;padding-top:24px;border-top:1px solid rgba(148,163,184,.14);font-size:13px;color:rgba(226,232,240,.5);flex-wrap:wrap;gap:12px}
.botixbo .foot-bottom .links{display:flex;gap:22px}
.botixbo .foot-bottom a:hover{color:#fff}

/* ============ RESPONSIVE ============ */
@media(max-width:1000px){
  .botixbo .cards4{grid-template-columns:1fr 1fr}
  .botixbo .tex{grid-template-columns:1fr}
  .botixbo .tex-visual{min-height:280px;order:-1}
  .botixbo .split{grid-template-columns:1fr;gap:36px}
  .botixbo .jcards,.botixbo .pgrid,.botixbo .sgrid{grid-template-columns:1fr 1fr}
  .botixbo .impact-inner{grid-template-columns:1fr;gap:38px}
  .botixbo .tgrid-students{grid-template-columns:1fr}
  .botixbo .tcard.featured{flex-direction:column}
  .botixbo .feat-photo{width:100%;height:200px}
  .botixbo .media-featured{grid-template-columns:1fr}
  .botixbo .mf-image{min-height:220px}
  .botixbo .mf-body{padding:32px 28px}
  .botixbo .ml-item{flex-direction:column}
  .botixbo .ml-thumb{width:100%;height:160px}
  .botixbo .res-grid{grid-template-columns:1fr}
  .botixbo .foot-grid{grid-template-columns:1fr 1fr}
  .botixbo .projects .head{flex-direction:column;align-items:flex-start;gap:14px}
}
/* Mobile Responsiveness Audit: the desktop nav (logo + 6 links + CTA
   button) doesn't fit below ~1100px — below that, .nav-links silently
   overflows the header and gets clipped by .botixbo's global
   overflow-x:hidden (no scrollbar, items just vanish with no visual
   cue). Measured empirically: the "Request a Lab Proposal" button was
   invisible from 640px all the way to 1024px, and "Resources" was
   clipped below 900px — the entire tablet range had a broken header.
   Switching to the hamburger menu at 1100px instead of 640px closes
   that gap. */
@media(max-width:1100px){
  .botixbo .nav-links{display:none}.botixbo .nav-toggle{display:block}
}
@media(max-width:640px){
  .botixbo .section{padding:70px 0}
  .botixbo .cards4,.botixbo .jcards,.botixbo .pgrid,.botixbo .sgrid,.botixbo .books{grid-template-columns:1fr}
  .botixbo .stats{grid-template-columns:1fr}
  .botixbo .feat{grid-template-columns:1fr}
  .botixbo .foot-cta{flex-direction:column;align-items:flex-start;padding:30px 26px}
  .botixbo .foot-cta-actions{width:100%}
  .botixbo .foot-cta-actions .btn,.botixbo .foot-cta-actions .btn-ghost-invert{width:100%;justify-content:center}
  .botixbo .foot-grid{grid-template-columns:1fr 1fr}
  .botixbo .wrap{padding:0 20px}
  .botixbo .hero h1{font-size:clamp(38px,12vw,54px)}
  .botixbo .brand-stmt-grid{grid-template-columns:1fr;gap:28px}
  /* Mobile Responsiveness Audit: with nav-links hidden (see the 1100px
     rule above), the header row's only remaining flex children were the
     176px logo, the "Request a Proposal" button and the hamburger
     toggle, still separated by the desktop .nav{gap:40px}. That fixed
     ~480px minimum row width pushed the toggle button itself off-screen
     — genuinely inaccessible — on real phones at 375/390/414px CSS
     width. Hiding the header CTA (the Hero section immediately below
     already repeats the identical "Request a Lab Proposal" CTA) and
     tightening the gap guarantees the hamburger always fits. */
  .botixbo .nav{gap:14px}
  .botixbo header .btn-primary{display:none}
}
@media(prefers-reduced-motion:reduce){
  .botixbo *{animation:none!important;transition:none!important}
  .botixbo .reveal{opacity:1;transform:none}
  .botixbo .hero-copy,.botixbo .hero .lead,.botixbo .hero-cta,.botixbo .hero-strip{opacity:1;animation:none}
}

/* ---------- program.css ---------- */
/* Program detail-page template styles (Phase 4A).
   Reuses app/botixbo.css's CSS custom properties, .wrap/.section/.eyebrow/
   .sec-title/.btn/.finalcta/.reveal primitives, and is scoped under the
   same .botixbo class — it never redefines or overrides a homepage rule,
   only adds new classes for /programs/[slug]. Do not import this on the
   homepage. */

.botixbo .pbreadcrumb{padding:22px 0 0}
.botixbo .pbreadcrumb ol{display:flex;flex-wrap:wrap;align-items:center;gap:8px;list-style:none;font-size:13.5px;color:var(--muted)}
.botixbo .pbreadcrumb a{color:var(--muted);transition:color .2s}
.botixbo .pbreadcrumb a:hover{color:var(--blue)}
.botixbo .pbreadcrumb li[aria-current="page"]{color:var(--heading);font-weight:600}
.botixbo .pbreadcrumb .sep{color:var(--muted-2)}

/* ---------------------------------------------------------------------- */
/* Hero */
.botixbo .phero{position:relative;padding:38px 0 76px;overflow:hidden;background:linear-gradient(180deg,#fff 0%,var(--soft) 100%)}
.botixbo .phero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center;margin-top:28px}
.botixbo .phero-copy .eyebrow{margin-bottom:14px}
.botixbo .phero h1{font-size:clamp(40px,5.6vw,66px);font-weight:800;letter-spacing:-.02em}
.botixbo .phero-sub{font-family:var(--disp);font-size:clamp(18px,1.7vw,22px);font-weight:600;color:var(--blue);margin-top:10px}
.botixbo .phero-copy p.lede{color:var(--muted);font-size:17px;line-height:1.7;max-width:52ch;margin-top:18px}
.botixbo .phero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:30px}
.botixbo .phero-bands{display:flex;flex-wrap:wrap;gap:10px;margin-top:34px}
.botixbo .phero-bands .pill{background:var(--blue-soft);color:var(--blue);font-weight:600;padding:7px 14px;border-radius:999px;font-size:13px}
.botixbo .phero-media{position:relative;border-radius:22px;overflow:hidden;aspect-ratio:4/5;box-shadow:0 30px 60px -20px rgba(15,27,61,.28)}
.botixbo .phero-media img{width:100%;height:100%;object-fit:cover}
@media (max-width:920px){
  .botixbo .phero-grid{grid-template-columns:1fr;gap:36px}
  .botixbo .phero-media{aspect-ratio:16/10;order:-1}
}

/* ---------------------------------------------------------------------- */
/* Editorial two-column (What is / School implementation) */
.botixbo .peditorial{padding:88px 0}
.botixbo .peditorial-grid{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center}
.botixbo .peditorial-grid.reverse .peditorial-media{order:2}
.botixbo .peditorial-media{position:relative;border-radius:20px;overflow:hidden;aspect-ratio:5/4;box-shadow:0 24px 50px -18px rgba(15,27,61,.22)}
.botixbo .peditorial-media img{width:100%;height:100%;object-fit:cover}
.botixbo .peditorial-copy h2{font-size:clamp(28px,3.2vw,40px);font-weight:800;letter-spacing:-.01em;margin-bottom:18px}
.botixbo .peditorial-copy p{color:var(--muted);font-size:16.5px;line-height:1.75;margin-bottom:14px}
.botixbo .peditorial-copy p:last-child{margin-bottom:0}
@media (max-width:920px){
  .botixbo .peditorial-grid{grid-template-columns:1fr;gap:32px}
  .botixbo .peditorial-grid.reverse .peditorial-media{order:-1}
}

/* ---------------------------------------------------------------------- */
/* Who is this for — three age bands, editorial not pricing-card */
.botixbo .pbands{padding:80px 0;background:var(--soft)}
.botixbo .pbands-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden}
.botixbo .pband{background:#fff;padding:36px 32px}
.botixbo .pband .pband-range{font-family:var(--mono);font-size:12.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--blue)}
.botixbo .pband h3{font-size:21px;font-weight:700;margin:10px 0 12px}
.botixbo .pband p{color:var(--muted);font-size:15px;line-height:1.7}
@media (max-width:820px){.botixbo .pbands-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* What students learn — clean topic list, not cards */
.botixbo .ptopics{padding:88px 0}
.botixbo .ptopics-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:44px}
.botixbo .ptopic{display:flex;align-items:center;gap:12px;padding:18px 20px;border:1px solid var(--line);border-radius:14px;font-weight:600;font-size:15px;color:var(--heading);transition:border-color .2s,transform .2s}
.botixbo .ptopic:hover{border-color:var(--blue);transform:translateY(-2px)}
.botixbo .ptopic-dot{flex-shrink:0;width:9px;height:9px;border-radius:50%;background:var(--blue)}
@media (max-width:920px){.botixbo .ptopics-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:520px){.botixbo .ptopics-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Learning journey — 4-step progression */
.botixbo .pjourney{padding:88px 0;background:var(--navy);color:#fff}
.botixbo .pjourney .eyebrow{color:#8ab4ff}
.botixbo .pjourney .sec-title{color:#fff}
.botixbo .pjourney-track{display:grid;grid-template-columns:repeat(4,1fr);gap:0;margin-top:56px;position:relative}
.botixbo .pjourney-step{position:relative;padding:0 22px}
.botixbo .pjourney-step:not(:last-child)::after{content:"";position:absolute;top:22px;right:-2px;width:calc(100% - 44px);height:2px;background:linear-gradient(90deg,rgba(255,255,255,.35),rgba(255,255,255,.08))}
.botixbo .pjourney-num{width:44px;height:44px;border-radius:50%;background:linear-gradient(135deg,var(--blue-2),var(--blue-deep));display:flex;align-items:center;justify-content:center;font-family:var(--mono);font-weight:700;font-size:15px;margin-bottom:22px;position:relative;z-index:1}
.botixbo .pjourney-step h3{font-size:19px;font-weight:700;margin-bottom:10px}
.botixbo .pjourney-step p{color:rgba(255,255,255,.68);font-size:14.5px;line-height:1.65;margin-bottom:14px}
.botixbo .pjourney-meta{font-size:12.5px;color:rgba(255,255,255,.5)}
.botixbo .pjourney-meta strong{color:rgba(255,255,255,.85);font-weight:600}
.botixbo .pjourney-meta+.pjourney-meta{margin-top:6px}
@media (max-width:920px){
  .botixbo .pjourney-track{grid-template-columns:1fr;gap:36px}
  .botixbo .pjourney-step:not(:last-child)::after{display:none}
}

/* ---------------------------------------------------------------------- */
/* Projects students build */
.botixbo .pprojects{padding:88px 0}
.botixbo .pprojects-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px;margin-top:44px}
.botixbo .pproject-card{border-radius:18px;overflow:hidden;border:1px solid var(--line);transition:transform .25s var(--ease),box-shadow .25s var(--ease)}
.botixbo .pproject-card:hover{transform:translateY(-4px);box-shadow:0 20px 40px -18px rgba(15,27,61,.24)}
.botixbo .pproject-media{position:relative;aspect-ratio:4/3}
.botixbo .pproject-media img{width:100%;height:100%;object-fit:cover}
.botixbo .pproject-body{padding:20px 22px 24px}
.botixbo .pproject-body h3{font-size:17.5px;font-weight:700;margin-bottom:6px}
.botixbo .pproject-body p{color:var(--muted);font-size:14px;line-height:1.6;margin-bottom:12px}
.botixbo .pproject-meta{display:flex;flex-wrap:wrap;gap:8px}
.botixbo .pproject-meta .pill{background:var(--blue-soft);color:var(--blue);font-weight:600;padding:4px 10px;border-radius:999px;font-size:12px}
@media (max-width:920px){.botixbo .pprojects-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:600px){.botixbo .pprojects-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Technologies & equipment */
.botixbo .pequip{padding:80px 0;background:var(--soft)}
.botixbo .pequip-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:14px;margin-top:44px}
.botixbo .pequip-item{background:#fff;border:1px solid var(--line);border-radius:14px;padding:22px 14px;text-align:center;font-weight:600;font-size:13.5px;color:var(--heading)}
@media (max-width:920px){.botixbo .pequip-grid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:560px){.botixbo .pequip-grid{grid-template-columns:repeat(2,1fr)}}

/* ---------------------------------------------------------------------- */
/* Skills & outcomes */
.botixbo .poutcomes{padding:88px 0}
.botixbo .poutcomes-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-top:44px}
.botixbo .poutcome{padding:26px 22px;border-radius:16px;background:linear-gradient(160deg,var(--blue-soft),#fff)}
.botixbo .poutcome h3{font-size:16px;font-weight:700;color:var(--heading)}
@media (max-width:920px){.botixbo .poutcomes-grid{grid-template-columns:repeat(2,1fr)}}

/* ---------------------------------------------------------------------- */
/* Program format table */
.botixbo .pformat{padding:80px 0;background:var(--soft)}
.botixbo .pformat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;margin-top:44px}
.botixbo .pformat-item{background:#fff;padding:26px 28px}
.botixbo .pformat-item dt{font-family:var(--mono);font-size:11.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.botixbo .pformat-item dd{font-size:17px;font-weight:700;color:var(--heading);margin-top:8px}
@media (max-width:820px){.botixbo .pformat-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* School implementation */
.botixbo .pschool{padding:88px 0}
.botixbo .pschool-inner{background:linear-gradient(135deg,var(--navy),var(--navy-2));border-radius:26px;padding:64px 56px;color:#fff;display:grid;grid-template-columns:1.2fr .8fr;gap:48px;align-items:center}
.botixbo .pschool h2{font-size:clamp(26px,3vw,36px);font-weight:800;margin-bottom:16px}
.botixbo .pschool p{color:rgba(255,255,255,.72);font-size:15.5px;line-height:1.7;margin-bottom:10px}
.botixbo .pschool-list{display:flex;flex-wrap:wrap;gap:10px;margin:22px 0 0}
.botixbo .pschool-list .pill{background:rgba(255,255,255,.1);color:#fff;font-weight:600;padding:7px 14px;border-radius:999px;font-size:13px;border:1px solid rgba(255,255,255,.16)}
.botixbo .pschool-cta{display:flex;justify-content:flex-end}
@media (max-width:820px){
  .botixbo .pschool-inner{grid-template-columns:1fr;padding:44px 30px}
  .botixbo .pschool-cta{justify-content:flex-start}
}

/* ---------------------------------------------------------------------- */
/* Testimonial */
.botixbo .ptestimonial{padding:88px 0}
.botixbo .ptestimonial-card{max-width:760px;margin:44px auto 0;text-align:center;padding:48px 40px;border-radius:22px;background:var(--blue-soft)}
.botixbo .ptestimonial-quote{font-family:var(--disp);font-size:clamp(19px,2.1vw,25px);font-weight:600;line-height:1.5;color:var(--heading)}
.botixbo .ptestimonial-quote::before{content:"\201C";color:var(--blue)}
.botixbo .ptestimonial-quote::after{content:"\201D";color:var(--blue)}
.botixbo .ptestimonial-person{display:flex;align-items:center;justify-content:center;gap:14px;margin-top:26px}
/* Extra .ptestimonial-card ancestor qualifier (not just .ptestimonial-avatar)
   is required here: convert_all.py's shared bridge preamble emits
   ".botixbo .elementor-widget-image{margin:0 !important}" at equal
   two-class specificity, loaded after this file, so a same-specificity
   !important rule here would lose on source order alone. */
.botixbo .ptestimonial-card .ptestimonial-avatar{width:52px !important;height:52px;border-radius:50%;overflow:hidden;position:relative;flex-shrink:0;margin:26px auto 0 !important}
.botixbo .ptestimonial-avatar img{width:100% !important;height:100%;object-fit:cover}
.botixbo .ptestimonial-name{font-weight:700;font-size:15px;color:var(--heading);margin-top:10px}
.botixbo .ptestimonial-role{font-size:13.5px;color:var(--muted)}
/* Native-widget testimonial carousel: each slide is its own inner section
   (ptestimonial-slide-0/1/2), toggled by adding/removing is-hidden via JS
   (see footer.php) rather than an inline style, so the hide/show state
   lives in Elementor's own "CSS Classes" field and can't be stripped by
   an editor typing into the quote/name/role text next to it. */
.botixbo .ptestimonial-slide.is-hidden{display:none}
/* Elementor adds "elementor-editor-active" to the preview iframe's <body>
   only while editing (never on the live public page) -- exactly the hook
   this needs: without this override, "is-hidden" also hides slides 2 and
   3 inside the editor itself, so there was no way for anyone to click
   into them and edit that content. Shown dimmed + outlined here so it
   stays obvious which slide is the one visitors actually land on first. */
body.elementor-editor-active .botixbo .ptestimonial-slide.is-hidden{
  display:block !important;
  opacity:.55;
  outline:2px dashed var(--blue);
  outline-offset:-2px;
}

/* ---------------------------------------------------------------------- */
/* Related programs */
.botixbo .prelated{padding:88px 0;background:var(--soft)}
.botixbo .prelated-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:44px}
.botixbo .prelated-card{background:#fff;border-radius:16px;overflow:hidden;border:1px solid var(--line);transition:transform .25s var(--ease),box-shadow .25s var(--ease)}
.botixbo .prelated-card:hover{transform:translateY(-4px);box-shadow:0 18px 36px -18px rgba(15,27,61,.22)}
.botixbo .prelated-media{position:relative;aspect-ratio:16/10}
.botixbo .prelated-media img{width:100%;height:100%;object-fit:cover}
.botixbo .prelated-body{padding:16px 18px 20px}
.botixbo .prelated-body h3{font-size:15.5px;font-weight:700;margin-bottom:4px}
.botixbo .prelated-body p{color:var(--muted);font-size:13px;line-height:1.55}
@media (max-width:920px){.botixbo .prelated-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.botixbo .prelated-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* FAQ */
.botixbo .pfaq{padding:88px 0}
.botixbo .pfaq-list{max-width:820px;margin:44px auto 0}
.botixbo .pfaq-item{border-bottom:1px solid var(--line)}
.botixbo .pfaq-item summary{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:22px 4px;font-weight:700;font-size:16.5px;color:var(--heading);cursor:pointer;list-style:none}
.botixbo .pfaq-item summary::-webkit-details-marker{display:none}
.botixbo .pfaq-item summary .picon{flex-shrink:0;width:22px;height:22px;display:flex;align-items:center;justify-content:center;color:var(--blue);transition:transform .25s var(--ease)}
.botixbo .pfaq-item[open] summary .picon{transform:rotate(45deg)}
.botixbo .pfaq-item p{color:var(--muted);font-size:15px;line-height:1.7;padding:0 4px 22px}

/* ---------------------------------------------------------------------- */
/* Final CTA — reuses .finalcta from botixbo.css; only page-specific tweak: */
.botixbo .pfinalcta-note{color:rgba(255,255,255,.55);font-size:13.5px;margin-top:22px}

/* ---------- solution.css ---------- */
/* Solution detail-page template styles (Phase 4B).
   Reuses app/botixbo.css's CSS custom properties + primitives, and reuses
   app/program.css's generic .peditorial/.pbands/.ptopics/.pequip/
   .ptestimonial/.prelated/.pfaq/.finalcta patterns (both are imported
   together on /solutions/[slug]) rather than duplicating them. This file
   only adds the pieces genuinely new to the Solution page: the "What
   Botixbo Provides" pillar system, the implementation timeline, and the
   student-experience section. Scoped under .botixbo, never touches
   botixbo.css or program.css. */

/* ---------------------------------------------------------------------- */
/* What Botixbo Provides — 8-pillar system */
.botixbo .swhat{padding:88px 0;background:var(--soft)}
.botixbo .swhat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:44px}
.botixbo .swhat-item{background:#fff;border:1px solid var(--line);border-radius:16px;padding:28px 24px}
.botixbo .swhat-item .swhat-icon{width:44px;height:44px;border-radius:12px;background:var(--blue-soft);color:var(--blue);display:flex;align-items:center;justify-content:center;margin-bottom:16px}
.botixbo .swhat-item h3{font-size:16.5px;font-weight:700;margin-bottom:8px}
.botixbo .swhat-item p{color:var(--muted);font-size:13.5px;line-height:1.6}
@media (max-width:920px){.botixbo .swhat-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.botixbo .swhat-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Implementation process — numbered timeline */
.botixbo .sprocess{padding:88px 0}
.botixbo .sprocess-list{max-width:820px;margin:48px auto 0}
.botixbo .sprocess-item{display:grid;grid-template-columns:64px 1fr;gap:24px;position:relative;padding-bottom:40px}
.botixbo .sprocess-item:last-child{padding-bottom:0}
.botixbo .sprocess-item::before{content:"";position:absolute;left:31px;top:56px;bottom:0;width:2px;background:var(--line)}
.botixbo .sprocess-item:last-child::before{display:none}
.botixbo .sprocess-num{width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--blue-2),var(--blue-deep));color:#fff;display:flex;align-items:center;justify-content:center;font-family:var(--mono);font-weight:700;font-size:17px;flex-shrink:0;position:relative;z-index:1}
.botixbo .sprocess-body h3{font-size:19px;font-weight:700;margin-bottom:6px;padding-top:12px}
.botixbo .sprocess-body p{color:var(--muted);font-size:15px;line-height:1.65}
@media (max-width:560px){
  .botixbo .sprocess-item{grid-template-columns:48px 1fr;gap:16px}
  .botixbo .sprocess-num{width:48px;height:48px;font-size:14px}
  .botixbo .sprocess-item::before{left:23px}
}

/* ---------------------------------------------------------------------- */
/* Teacher enablement + Support — editorial with pill list (reuses .pschool
   look from program.css's navy CTA band, but as a lighter two-column). */
.botixbo .steacher{padding:88px 0;background:var(--navy);color:#fff}
.botixbo .steacher-grid{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:center}
.botixbo .steacher .eyebrow{color:#8ab4ff}
.botixbo .steacher h2{font-size:clamp(26px,3vw,38px);font-weight:800;margin-bottom:16px}
.botixbo .steacher p{color:rgba(255,255,255,.7);font-size:15.5px;line-height:1.7;margin-bottom:18px}
.botixbo .steacher-list{display:flex;flex-direction:column;gap:12px}
.botixbo .steacher-list li{display:flex;align-items:center;gap:10px;font-weight:600;font-size:14.5px}
.botixbo .steacher-list svg{flex-shrink:0;color:#8ab4ff}
@media (max-width:920px){.botixbo .steacher-grid{grid-template-columns:1fr;gap:32px}}

/* ---------------------------------------------------------------------- */
/* Student experience — verb chips + imagery */
.botixbo .sstudent{padding:88px 0}
.botixbo .sstudent-grid{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:center}
.botixbo .sstudent-media{position:relative;border-radius:20px;overflow:hidden;aspect-ratio:5/4;box-shadow:0 24px 50px -18px rgba(15,27,61,.22)}
.botixbo .sstudent-media img{width:100%;height:100%;object-fit:cover}
.botixbo .sstudent-verbs{display:flex;flex-wrap:wrap;gap:12px}
.botixbo .sstudent-verbs span{font-family:var(--disp);font-size:18px;font-weight:700;color:var(--heading);padding:10px 0}
.botixbo .sstudent-verbs span:not(:last-child)::after{content:"→";color:var(--blue-2);margin-left:12px;font-weight:400}
@media (max-width:920px){.botixbo .sstudent-grid{grid-template-columns:1fr;gap:32px}}

/* ---------------------------------------------------------------------- */
/* Support / AMC — simple checklist grid */
.botixbo .ssupport{padding:80px 0;background:var(--soft)}
.botixbo .ssupport-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:44px}
.botixbo .ssupport-item{background:#fff;border:1px solid var(--line);border-radius:14px;padding:22px 24px;display:flex;align-items:flex-start;gap:12px}
.botixbo .ssupport-item svg{flex-shrink:0;color:var(--blue);margin-top:2px}
.botixbo .ssupport-item span{font-weight:600;font-size:14.5px;color:var(--heading)}
@media (max-width:820px){.botixbo .ssupport-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Curriculum progression — Foundation → Exploration → Application → Innovation */
.botixbo .scurriculum{padding:88px 0;background:var(--soft)}
.botixbo .scurriculum-track{display:grid;grid-template-columns:repeat(4,1fr);gap:0;margin-top:44px}
.botixbo .scurriculum-step{position:relative;padding:0 20px;text-align:left}
.botixbo .scurriculum-step:not(:last-child)::after{content:"";position:absolute;top:19px;right:-2px;width:calc(100% - 40px);height:2px;background:var(--line)}
.botixbo .scurriculum-num{width:38px;height:38px;border-radius:50%;background:#fff;border:2px solid var(--blue);color:var(--blue);display:flex;align-items:center;justify-content:center;font-family:var(--mono);font-weight:700;font-size:13px;margin-bottom:18px;position:relative;z-index:1}
.botixbo .scurriculum-step h3{font-size:16.5px;font-weight:700;margin-bottom:8px}
.botixbo .scurriculum-step p{color:var(--muted);font-size:13.5px;line-height:1.6}
@media (max-width:820px){
  .botixbo .scurriculum-track{grid-template-columns:1fr;gap:28px}
  .botixbo .scurriculum-step:not(:last-child)::after{display:none}
}

/* Related services strip (compact, no imagery) */
.botixbo .sservices{padding:80px 0}
.botixbo .sservices-grid{display:flex;flex-wrap:wrap;gap:14px;margin-top:44px}
.botixbo .sservice-pill{display:flex;flex-direction:column;gap:4px;padding:18px 22px;border:1px solid var(--line);border-radius:14px;min-width:220px;flex:1;transition:border-color .2s,transform .2s}
.botixbo .sservice-pill:hover{border-color:var(--blue);transform:translateY(-2px)}
.botixbo .sservice-pill strong{font-size:15px;color:var(--heading)}
.botixbo .sservice-pill span{font-size:13px;color:var(--muted)}

/* ---------------------------------------------------------------------- */
/* Case studies / school implementation strip */
.botixbo .scases{padding:88px 0}
.botixbo .scases-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:44px}
@media (max-width:920px){.botixbo .scases-grid{grid-template-columns:1fr}}

/* ---------- location-detail.css ---------- */
/* Location detail-page + directory styles (Phase 4E).
   Reuses app/botixbo.css's variables + primitives, and program.css's
   .peditorial/.pbands/.pformat-grid/.prelated/.pfaq/.finalcta,
   solution.css's .ssupport, and project-detail.css's .pinfo (all imported
   together on /locations/[slug] and /locations/). This file only adds the
   metrics strip, the DEMO-badged school card, and the directory grid.
   Scoped under .botixbo, never touches botixbo.css or the other template
   stylesheets. */

/* ---------------------------------------------------------------------- */
/* Local impact metrics — reuses .pformat-grid's definition-list look */
.botixbo .lmetrics{padding:70px 0;background:var(--soft)}
.botixbo .lmetrics-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;margin-top:36px}
.botixbo .lmetrics-item{background:#fff;padding:26px 20px;text-align:center}
.botixbo .lmetrics-item dd{font-family:var(--disp);font-size:28px;font-weight:800;color:var(--blue)}
.botixbo .lmetrics-item dt{font-family:var(--mono);font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-top:6px}
@media (max-width:820px){.botixbo .lmetrics-grid{grid-template-columns:repeat(2,1fr)}}

/* ---------------------------------------------------------------------- */
/* Schools & institutions — with an explicit DEMO / unverified badge */
.botixbo .lschools{padding:88px 0}
.botixbo .lschools-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:44px}
.botixbo .lschool-card{display:flex;align-items:center;gap:16px;padding:22px;border:1px solid var(--line);border-radius:16px}
.botixbo .lschool-logo{width:52px;height:52px;border-radius:10px;overflow:hidden;position:relative;flex-shrink:0;background:var(--soft)}
.botixbo .lschool-logo img{width:100%;height:100%;object-fit:contain}
.botixbo .lschool-body strong{display:block;font-size:15px;color:var(--heading)}
.botixbo .lschool-body span{font-size:12.5px;color:var(--muted)}
.botixbo .lschool-badge{display:inline-block;margin-top:4px;font-family:var(--mono);font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#b45309;background:#fef3c7;padding:2px 8px;border-radius:999px}
@media (max-width:920px){.botixbo .lschools-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Locations directory (/locations/) */
.botixbo .ldirectory{padding:120px 0 100px}
.botixbo .ldirectory-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px;margin-top:48px}
.botixbo .ldirectory-card{position:relative;border:1px solid var(--line);border-radius:18px;overflow:hidden;transition:transform .25s var(--ease),box-shadow .25s var(--ease)}
.botixbo .ldirectory-card:hover{transform:translateY(-4px);box-shadow:0 20px 40px -18px rgba(15,27,61,.22)}
.botixbo .ldirectory-link{color:inherit;text-decoration:none}
.botixbo .ldirectory-link:focus-visible{outline:2px solid var(--blue);outline-offset:3px}
.botixbo .ldirectory-link::after{content:"";position:absolute;inset:0;z-index:1}
.botixbo .ldirectory-media{position:relative;aspect-ratio:16/9}
.botixbo .ldirectory-media img{width:100%;height:100%;object-fit:cover}
.botixbo .ldirectory-body{padding:22px 24px}
.botixbo .ldirectory-body h2{font-size:19px;font-weight:700;margin-bottom:4px}
.botixbo .ldirectory-body .state{font-size:13px;color:var(--muted);margin-bottom:10px}
.botixbo .ldirectory-body p{font-size:14px;color:var(--muted);line-height:1.6;margin-bottom:14px}
.botixbo .ldirectory-tags{display:flex;flex-wrap:wrap;gap:6px}
.botixbo .ldirectory-tags .pill{background:var(--blue-soft);color:var(--blue);font-weight:600;padding:4px 10px;border-radius:999px;font-size:11.5px}
.botixbo .ldirectory-empty{text-align:center;color:var(--muted);font-size:15px;padding:60px 0}
@media (max-width:920px){.botixbo .ldirectory-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:600px){.botixbo .ldirectory-grid{grid-template-columns:1fr}}

/* ---------- service.css ---------- */
/* Service detail-page template styles (Phase 4C).
   Reuses app/botixbo.css's variables + primitives, and app/program.css's
   .peditorial/.ptopics/.pequip/.pbands/.pjourney-esque patterns and
   app/solution.css's .sprocess/.ssupport (all three are imported together
   on /services/[slug]). This file only adds what's genuinely new to the
   Service page: the deliverables strip (deliberately distinct from the
   Solution page's 8-pillar card grid, per the Phase 4C brief) and the
   optional CSR/Government/Workshops impact cards. Scoped under .botixbo,
   never touches botixbo.css, program.css or solution.css. */

/* ---------------------------------------------------------------------- */
/* What Botixbo Delivers — numbered inline strip, deliberately distinct
   from the Solution page's 8-pillar card grid (.swhat). */
.botixbo .sdeliver{padding:88px 0;background:var(--navy);color:#fff}
.botixbo .sdeliver .eyebrow{color:#8ab4ff}
.botixbo .sdeliver .sec-title{color:#fff}
.botixbo .sdeliver-list{display:flex;flex-wrap:wrap;gap:0;margin-top:48px;border-top:1px solid rgba(255,255,255,.14)}
.botixbo .sdeliver-item{flex:1 1 220px;display:flex;align-items:center;gap:14px;padding:22px 20px;border-bottom:1px solid rgba(255,255,255,.14);border-right:1px solid rgba(255,255,255,.14)}
.botixbo .sdeliver-num{font-family:var(--mono);font-size:13px;font-weight:700;color:#8ab4ff;flex-shrink:0}
.botixbo .sdeliver-item span:last-child{font-weight:600;font-size:15px}

/* ---------------------------------------------------------------------- */
/* CSR / Government / Workshops — optional impact cards, each independently
   omitted when its WordPress field is blank. */
.botixbo .simpact{padding:88px 0}
.botixbo .simpact-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:44px}
.botixbo .simpact-card{background:var(--soft);border-radius:18px;padding:32px 28px}
.botixbo .simpact-card h3{font-size:18px;font-weight:700;margin-bottom:12px}
.botixbo .simpact-card p{color:var(--muted);font-size:14.5px;line-height:1.7}
.botixbo .simpact-card a{display:inline-flex;align-items:center;gap:6px;margin-top:16px;font-weight:600;font-size:14px;color:var(--blue)}
@media (max-width:920px){.botixbo .simpact-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Who We Work With — pill row, not pricing cards. */
.botixbo .swho{padding:60px 0;background:var(--soft)}
.botixbo .swho-list{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px}
.botixbo .swho-list .pill{background:#fff;border:1px solid var(--line);color:var(--heading);font-weight:600;padding:10px 20px;border-radius:999px;font-size:14px}

/* ---------- project-detail.css ---------- */
/* Project/Case Study detail-page template styles (Phase 4D).
   Reuses app/botixbo.css's variables + primitives, and app/program.css's
   .peditorial/.pequip/.ptestimonial/.prelated/.pfaq/.finalcta and
   app/solution.css's .sprocess (used here for the variable-length
   Learning/Implementation Journey) — all four are imported together on
   /projects/[slug]. This file only adds what's genuinely new: the gallery
   grid, the outcome callout, and the school/location info card. Scoped
   under .botixbo, never touches botixbo.css, program.css, solution.css or
   service.css. */

/* ---------------------------------------------------------------------- */
/* Gallery */
.botixbo .pgallery{padding:88px 0;background:var(--soft)}
.botixbo .pgallery-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:44px}
.botixbo .pgallery-item{position:relative;aspect-ratio:4/3;border-radius:14px;overflow:hidden}
.botixbo .pgallery-item img{width:100%;height:100%;object-fit:cover;transition:transform .4s var(--ease)}
.botixbo .pgallery-item:hover img{transform:scale(1.04)}
@media (max-width:820px){.botixbo .pgallery-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:520px){.botixbo .pgallery-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Outcome callout — deliberately distinct treatment since this is the
   most important, most fact-checked section on the page. */
.botixbo .poutcome-block{padding:88px 0}
.botixbo .poutcome-card{max-width:760px;margin:0 auto;padding:40px 44px;border-radius:20px;border:1.5px solid var(--blue);background:var(--blue-soft)}
.botixbo .poutcome-card .eyebrow{margin-bottom:12px}
.botixbo .poutcome-card p{font-size:17px;line-height:1.7;color:var(--heading);font-weight:500}

/* ---------------------------------------------------------------------- */
/* School / Location info card */
.botixbo .pinfo{padding:60px 0}
.botixbo .pinfo-card{display:flex;align-items:center;gap:20px;padding:24px 28px;border:1px solid var(--line);border-radius:16px;max-width:640px;margin:0 auto}
.botixbo .pinfo-logo{width:56px;height:56px;border-radius:12px;overflow:hidden;position:relative;flex-shrink:0;background:var(--soft)}
.botixbo .pinfo-logo img{width:100%;height:100%;object-fit:contain}
.botixbo .pinfo-body strong{display:block;font-size:16px;color:var(--heading)}
.botixbo .pinfo-body span{font-size:13.5px;color:var(--muted)}

/* ---------- resource.css ---------- */
/* Resources/Blog styles (Phase 4F).
   Reuses app/botixbo.css's variables + primitives (.wrap/.section/.eyebrow/
   .sec-title/.btn/.pill/.reveal) and app/program.css's .pbreadcrumb/.pfaq/
   .prelated (imported together on /resources and /resources/[slug]).
   This file adds the index hero, featured-article card, resource card
   grid, category nav, pagination, and the narrow article reading layout +
   TOC + author box. Scoped under .botixbo, never touches botixbo.css or
   the other template stylesheets. */

/* ---------------------------------------------------------------------- */
/* Index hero */
.botixbo .rhero{padding:70px 0 20px;text-align:center}
.botixbo .rhero h1{font-size:clamp(38px,5vw,58px);font-weight:800;letter-spacing:-.02em}
.botixbo .rhero p{color:var(--muted);font-size:17px;max-width:560px;margin:16px auto 0}

/* Category nav */
.botixbo .rcatnav{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin:32px 0 8px}
.botixbo .rcatnav a{font-family:var(--mono);font-size:12.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;padding:8px 16px;border-radius:999px;border:1px solid var(--line);color:var(--muted);transition:all .2s}
.botixbo .rcatnav a:hover,.botixbo .rcatnav a.active{color:#fff;background:var(--blue);border-color:var(--blue)}

/* ---------------------------------------------------------------------- */
/* Featured article — one strong card, not a grid */
.botixbo .rfeatured{padding:56px 0 40px}
.botixbo .rfeatured-card{display:grid;grid-template-columns:1.1fr .9fr;gap:0;border-radius:22px;overflow:hidden;border:1px solid var(--line);transition:box-shadow .3s var(--ease)}
.botixbo .rfeatured-card:hover{box-shadow:0 24px 50px -20px rgba(15,27,61,.24)}
.botixbo .rfeatured-media{position:relative;min-height:320px}
.botixbo .rfeatured-media img{width:100%;height:100%;object-fit:cover}
.botixbo .rfeatured-body{padding:44px 40px;display:flex;flex-direction:column;justify-content:center}
.botixbo .rfeatured-body .pill{align-self:flex-start;margin-bottom:14px}
.botixbo .rfeatured-body h2{font-size:clamp(22px,2.6vw,32px);font-weight:800;letter-spacing:-.01em;margin-bottom:12px}
.botixbo .rfeatured-body p{color:var(--muted);font-size:15.5px;line-height:1.7;margin-bottom:18px}
.botixbo .rmeta{display:flex;flex-wrap:wrap;gap:14px;font-size:12.5px;color:var(--muted-2);font-family:var(--mono)}
@media (max-width:820px){
  .botixbo .rfeatured-card{grid-template-columns:1fr}
  .botixbo .rfeatured-media{min-height:220px}
  .botixbo .rfeatured-body{padding:30px 26px}
}

/* ---------------------------------------------------------------------- */
/* Resource grid */
.botixbo .rgrid-section{padding:20px 0 80px}
.botixbo .rgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px;margin-top:32px}
.botixbo .rcard{border-radius:18px;overflow:hidden;border:1px solid var(--line);transition:transform .25s var(--ease),box-shadow .25s var(--ease)}
.botixbo .rcard:hover{transform:translateY(-4px);box-shadow:0 20px 40px -18px rgba(15,27,61,.22)}
.botixbo .rcard-media{position:relative;aspect-ratio:16/10}
.botixbo .rcard-media img{width:100%;height:100%;object-fit:cover}
.botixbo .rcard-body{padding:20px 22px 24px}
.botixbo .rcard-body .pill{margin-bottom:10px}
.botixbo .rcard-body h3{font-size:17px;font-weight:700;line-height:1.35;margin-bottom:8px}
.botixbo .rcard-body p{color:var(--muted);font-size:13.5px;line-height:1.6;margin-bottom:12px}
@media (max-width:920px){.botixbo .rgrid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:600px){.botixbo .rgrid{grid-template-columns:1fr}}

/* Pagination */
.botixbo .rpagination{display:flex;justify-content:center;gap:10px;margin-top:48px}
.botixbo .rpagination a,.botixbo .rpagination span{min-width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:10px;border:1px solid var(--line);font-weight:600;font-size:14px;color:var(--heading)}
.botixbo .rpagination a:hover{border-color:var(--blue);color:var(--blue)}
.botixbo .rpagination .current{background:var(--blue);color:#fff;border-color:var(--blue)}

.botixbo .rempty{text-align:center;color:var(--muted);padding:60px 0}

/* ---------------------------------------------------------------------- */
/* Article reading layout — narrower than marketing pages */
.botixbo .rarticle-hero{padding:44px 0 8px}
.botixbo .rarticle-head{max-width:760px;margin:0 auto;text-align:center}
.botixbo .rarticle-head .pill{margin-bottom:16px}
.botixbo .rarticle-head h1{font-size:clamp(30px,4vw,46px);font-weight:800;letter-spacing:-.02em;line-height:1.15}
.botixbo .rarticle-head .excerpt{color:var(--muted);font-size:17px;line-height:1.7;margin:18px 0}
.botixbo .rarticle-meta{display:flex;flex-wrap:wrap;justify-content:center;gap:18px;font-size:13px;color:var(--muted-2);font-family:var(--mono);margin-top:8px}

.botixbo .rarticle-media{max-width:920px;margin:36px auto 0;border-radius:20px;overflow:hidden;position:relative;aspect-ratio:16/9}
.botixbo .rarticle-media img{width:100%;height:100%;object-fit:cover}

.botixbo .rarticle-body{max-width:720px;margin:0 auto;padding:56px 0}
.botixbo .rarticle-body h2{font-size:26px;font-weight:800;margin:44px 0 16px;letter-spacing:-.01em;scroll-margin-top:100px}
.botixbo .rarticle-body h3{font-size:20px;font-weight:700;margin:32px 0 12px}
.botixbo .rarticle-body p{font-size:17px;line-height:1.85;color:var(--ink);margin-bottom:20px}
.botixbo .rarticle-body ul,.botixbo .rarticle-body ol{margin:0 0 20px 22px;font-size:17px;line-height:1.85;color:var(--ink)}
.botixbo .rarticle-body li{margin-bottom:8px}
.botixbo .rarticle-body a{color:var(--blue);text-decoration:underline;text-underline-offset:3px}
.botixbo .rarticle-body blockquote{border-left:3px solid var(--blue);padding:4px 0 4px 22px;margin:28px 0;font-style:italic;color:var(--ink-soft);font-size:18px}
.botixbo .rarticle-body img{border-radius:14px;margin:28px 0}
.botixbo .rarticle-body table{width:100%;border-collapse:collapse;margin:24px 0;font-size:15px}
.botixbo .rarticle-body table th,.botixbo .rarticle-body table td{border:1px solid var(--line);padding:10px 14px;text-align:left}

/* Table of contents */
.botixbo .rtoc{max-width:720px;margin:0 auto 40px;padding:24px 28px;border:1px solid var(--line);border-radius:16px;background:var(--soft)}
.botixbo .rtoc-title{font-family:var(--mono);font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:12px}
.botixbo .rtoc ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
.botixbo .rtoc a{color:var(--ink);font-size:14.5px;font-weight:500}
.botixbo .rtoc a:hover{color:var(--blue)}

/* Author box */
.botixbo .rauthor{max-width:720px;margin:0 auto 48px;display:flex;align-items:center;gap:16px;padding:22px 26px;border:1px solid var(--line);border-radius:16px}
.botixbo .rauthor-avatar{width:52px;height:52px;border-radius:50%;overflow:hidden;position:relative;flex-shrink:0;background:var(--soft)}
.botixbo .rauthor-avatar img{width:100%;height:100%;object-fit:cover}
.botixbo .rauthor-body strong{display:block;font-size:15.5px;color:var(--heading)}
.botixbo .rauthor-body p{font-size:13.5px;color:var(--muted);margin-top:2px}

/* Category page header */
.botixbo .rcat-hero{padding:70px 0 20px;text-align:center}
.botixbo .rcat-hero h1{font-size:clamp(32px,4.4vw,48px);font-weight:800}
.botixbo .rcat-hero p{color:var(--muted);font-size:16px;max-width:560px;margin:14px auto 0}

/* ---------- company.css ---------- */
/* About / Contact / Careers styles (Phase 4I).
   Reuses app/botixbo.css's variables + primitives, app/program.css's
   .pbreadcrumb/.peditorial/.pbands/.ptopics/.prelated/.finalcta (imported
   together on /about, /contact, /careers). This file adds the demo badge,
   the contact form, the contact-options grid, and the job list/detail
   layout. Scoped under .botixbo, never touches botixbo.css or the other
   template stylesheets. */

.botixbo .demo-badge{display:inline-block;font-family:var(--mono);font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#b45309;background:#fef3c7;padding:3px 10px;border-radius:999px;margin-left:10px;vertical-align:middle}

/* ---------------------------------------------------------------------- */
/* Generic compact hero, reused by all three pages */
.botixbo .chero{padding:70px 0 20px}
.botixbo .chero-inner{max-width:720px}
.botixbo .chero h1{font-size:clamp(36px,4.8vw,54px);font-weight:800;letter-spacing:-.02em}
.botixbo .chero .lede{color:var(--muted);font-size:17px;line-height:1.7;margin-top:16px;max-width:60ch}

/* Beliefs / why-work list — clean check list, not cards */
.botixbo .cbeliefs{padding:70px 0;background:var(--soft)}
.botixbo .cbeliefs-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-top:36px;max-width:820px}
.botixbo .cbelief{display:flex;align-items:flex-start;gap:12px;font-size:16px;font-weight:600;color:var(--heading)}
.botixbo .cbelief svg{flex-shrink:0;color:var(--blue);margin-top:3px}
@media (max-width:700px){.botixbo .cbeliefs-grid{grid-template-columns:1fr}}

/* Ecosystem link grid */
.botixbo .cecosystem{padding:80px 0}
.botixbo .cecosystem-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:36px}
.botixbo .cecosystem-link{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border:1px solid var(--line);border-radius:14px;font-weight:700;font-size:15.5px;color:var(--heading);transition:border-color .2s,transform .2s}
.botixbo .cecosystem-link:hover{border-color:var(--blue);transform:translateY(-2px);color:var(--blue)}
@media (max-width:820px){.botixbo .cecosystem-grid{grid-template-columns:1fr}}

/* ---------------------------------------------------------------------- */
/* Contact options */
.botixbo .coptions{padding:70px 0;background:var(--soft)}
.botixbo .coptions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:18px;margin-top:36px}
.botixbo .coption{background:#fff;border:1px solid var(--line);border-radius:14px;padding:22px 24px}
.botixbo .coption strong{display:block;font-size:15px;color:var(--heading);margin-bottom:6px}
.botixbo .coption a{color:var(--blue);font-weight:600;font-size:14.5px}

/* Contact form */
.botixbo .cform-section{padding:70px 0}
.botixbo .cform{position:relative;max-width:760px;margin:40px auto 0;display:grid;grid-template-columns:1fr 1fr;gap:20px 22px;background:#fff;border:1px solid var(--line);border-radius:24px;padding:46px 48px;box-shadow:0 30px 70px -40px rgba(15,23,42,.25)}
.botixbo .cform::before{content:"";position:absolute;top:0;left:24px;right:24px;height:3px;border-radius:0 0 3px 3px;background:linear-gradient(90deg,var(--blue-2),var(--blue) 55%,var(--blue-deep))}
.botixbo .cform .full{grid-column:1/-1}
.botixbo .cfield label{display:block;font-size:12.5px;font-weight:700;letter-spacing:.02em;color:var(--heading);margin-bottom:8px}
.botixbo .cfield input,.botixbo .cfield select,.botixbo .cfield textarea{width:100%;padding:13px 16px;border:1.5px solid var(--line);border-radius:12px;font-family:var(--body);font-size:15px;color:var(--ink);background:var(--soft);transition:border-color .2s,box-shadow .2s,background .2s}
.botixbo .cfield input:focus,.botixbo .cfield select:focus,.botixbo .cfield textarea:focus{outline:none;border-color:var(--blue);background:#fff;box-shadow:0 0 0 4px var(--blue-soft)}
.botixbo .cfield textarea{resize:vertical;min-height:130px}
.botixbo .cfield select{appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563EB' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;background-size:16px;padding-right:40px}
.botixbo .cfield .err{color:#b91c1c;font-size:12.5px;margin-top:5px}
.botixbo .cfield input[aria-invalid="true"],.botixbo .cfield textarea[aria-invalid="true"]{border-color:#b91c1c}
.botixbo .cform-submit{grid-column:1/-1;display:flex;align-items:center;flex-wrap:wrap;gap:16px;margin-top:8px}
.botixbo .cform-submit .btn{padding:15px 34px;border-radius:12px;font-weight:700;font-size:15px}
.botixbo .cform-status{font-size:14px;font-weight:600}
.botixbo .cform-status.success{color:#15803d}
.botixbo .cform-status.error{color:#b91c1c}
.botixbo .honeypot{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
@media (max-width:600px){.botixbo .cform{grid-template-columns:1fr;padding:32px 26px;border-radius:20px}}

/* ---------------------------------------------------------------------- */
/* Job list */
.botixbo .cjobs{padding:20px 0 80px}
.botixbo .cjobs-empty{text-align:center;color:var(--muted);padding:50px 30px;border:1px dashed var(--line);border-radius:16px;max-width:560px;margin:36px auto 0}
.botixbo .cjobs-list{display:flex;flex-direction:column;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:16px;overflow:hidden;margin-top:36px}
.botixbo .cjob-item{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:22px 26px;background:#fff}
.botixbo .cjob-item h3{font-size:16.5px;font-weight:700;margin-bottom:4px}
.botixbo .cjob-meta{font-size:13px;color:var(--muted)}
.botixbo .cjob-cta{flex-shrink:0;font-weight:600;font-size:14px;color:var(--blue);white-space:nowrap}
@media (max-width:600px){.botixbo .cjob-item{flex-direction:column;align-items:flex-start}}

/* Job detail */
.botixbo .cjobdetail{padding:44px 0 80px}
.botixbo .cjobdetail-body{max-width:720px;margin:0 auto}
.botixbo .cjobdetail-meta{display:flex;flex-wrap:wrap;gap:10px;margin:18px 0 30px}
.botixbo .cjobdetail-section{margin-bottom:30px}
.botixbo .cjobdetail-section h2{font-size:20px;font-weight:700;margin-bottom:12px}
.botixbo .cjobdetail-section ul{margin:0 0 0 20px;color:var(--muted);font-size:15.5px;line-height:1.8}
.botixbo .cjobdetail-section p{color:var(--muted);font-size:15.5px;line-height:1.8}

/* =========================================================
   ELEMENTOR PASS-THROUGH  (raw-markup sections only)
   Sections still held as a single HTML block are self-contained — each
   <section> handles its own full-bleed background and inner .wrap width,
   exactly as on the real site — so Elementor's section/column/widget
   wrappers must not add a second layout layer on top. Flatten them.

   Scoped to .bx-raw so converted sections, which rely on Elementor's own
   structure, are left alone. !important is the layer's whole job:
   Elementor's stylesheet is enqueued after the theme's, so its
   `.elementor-widget:not(:last-child){margin-block-end:20px}` and
   `.elementor-section-boxed > .elementor-container{max-width:1140px}`
   would otherwise win and reintroduce spacing/width of their own.
   ========================================================= */
.botixbo .elementor-section.bx-raw,
.botixbo .elementor-section.bx-raw > .elementor-container,
.botixbo .bx-raw .elementor-container,
.botixbo .bx-raw .elementor-column,
.botixbo .bx-raw .elementor-column-wrap,
.botixbo .bx-raw .elementor-widget-wrap,
.botixbo .bx-raw .elementor-widget,
.botixbo .bx-raw .elementor-widget-container,
.botixbo .bx-raw .elementor-element{
  display:block;
  width:100%;
  max-width:none !important;
  margin:0 !important;
  padding:0 !important;
  flex:none;
}

/* =========================================================
   ELEMENTOR EDITOR VISIBILITY
   Content fades in via `.reveal`, which starts at opacity:0 and is
   switched on by an IntersectionObserver as the visitor scrolls. Inside
   Elementor's canvas that observer never fires (and re-rendered widgets
   lose their listeners), so every section looked blank while editing.
   Force the finished state whenever the editor is active — this affects
   the editor only, never the front end.
   ========================================================= */
body.elementor-editor-active .botixbo .reveal{
  opacity:1 !important;
  transform:none !important;
}
body.elementor-editor-active .botixbo .hero-video{ opacity:1; }

/* Decorative layers that sit on top of a photo (gradient tint, scan line,
   badge) cover it completely, so in the canvas every click landed on them
   and the Image widget underneath could not be selected. They are not
   interactive, so let clicks pass through to the picture while editing. */
body.elementor-editor-active .botixbo .bx-overlay{ pointer-events:none; }

/* In edit mode Elementor drops an .elementor-background-overlay into every
   section and column. It is absolutely positioned, and because the chrome
   reset below takes position:relative off the widget wrappers it no longer
   has their stacking contexts to sit behind — so it paints over the widgets
   and swallows the clicks meant for them. It is decorative (the front end
   renders none of these), so put it back behind and let clicks through. */
body.elementor-editor-active .botixbo .elementor-background-overlay{
  pointer-events:none;
  z-index:0;
}

/* The explorer's two-column grid, re-pointed at Elementor's container
   (the .tex rule itself would otherwise land on the section, one level
   above the columns it needs to lay out). */
.botixbo .elementor-section.bx-tex > .elementor-container{
  display:grid !important;
  grid-template-columns:.85fr 1.15fr;
  gap:16px;
  align-items:stretch;
  margin-top:12px;
}
.botixbo .elementor-section.bx-tex > .elementor-container > .elementor-column{
  width:100% !important;
}
@media (max-width:860px){
  .botixbo .elementor-section.bx-tex > .elementor-container{grid-template-columns:1fr;}
  .botixbo .elementor-section.bx-tex > .elementor-container > .tex-visual{order:-1;}
}

/* =========================================================
   TECH EXPLORER — stacked photos
   The panel shows a different photo per technology. The original markup
   did that by rewriting one <img>'s src, which meant only one of the
   eight could ever be an Image widget. All eight now sit stacked in the
   panel and the script switches which is visible, so each is editable
   while the crossfade looks the same as before.
   ========================================================= */
.botixbo .tex-visual .tex-shot{
  position:absolute;
  inset:0;
  opacity:0;
  transition:opacity .35s ease;
  z-index:0;
  pointer-events:none;
}
.botixbo .tex-visual .tex-shot.is-active{ opacity:1; }
.botixbo .tex-visual .tex-shot > .elementor-widget-container,
.botixbo .tex-visual .tex-shot figure{ width:100%; height:100%; margin:0; }
.botixbo .tex-visual .tex-shot img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  max-width:none;
  display:block;
}
/* The tint and caption sit above the photos. */
.botixbo .tex-visual .bx-overlay{ position:static; z-index:2; }

/* In the editor the photos are stacked and all but one are transparent,
   so only the top one could be clicked. Lay them out as a strip there —
   every photo stays reachable, and hovering a technology in the list
   still previews it exactly as a visitor would see it. */
body.elementor-editor-active .botixbo .tex-visual{
  min-height:0;
  display:flex;
  flex-wrap:wrap;
  gap:6px;
  padding:6px;
  background:rgba(15,23,42,.04);
}
body.elementor-editor-active .botixbo .tex-visual .tex-shot{
  position:relative;
  inset:auto;
  opacity:1;
  pointer-events:auto;
  flex:0 0 calc(25% - 6px);
  height:96px;
  border-radius:8px;
  overflow:hidden;
}
body.elementor-editor-active .botixbo .tex-visual .bx-overlay{ display:none; }
/* The explorer's own <section> is split into three so each list item can
   own its widgets (Elementor only nests one inner section deep). The
   three carry the original section's 96px padding between them. */
.botixbo .elementor-section.bx-tech-head{ padding:96px 0 0; }
.botixbo .elementor-section.bx-tex{ padding:0; }
.botixbo .elementor-section.bx-tech-cta{ padding:32px 0 96px; }
/* .head carries a 52px bottom margin to separate it from the content it
   introduces; under the button there is nothing to separate from. */
.botixbo .bx-tech-cta .head{ margin-bottom:0; }

/* =========================================================
   SCHOOLS — a scrolling row of logo cards
   One row that marches sideways, with each school on a card and its logo
   shown large. The run is authored once and cloned at runtime so the loop
   is seamless without a logo ever needing to be uploaded twice.
   ========================================================= */
.botixbo .elementor-section.bx-logorow > .elementor-container{
  display:flex !important;
  gap:20px;
  /* beats the generic inner-section rule, which pins containers to 100% */
  width:max-content !important;
  max-width:none !important;
  align-items:stretch;
  animation:botixbo-march 34s linear infinite;
}
.botixbo .elementor-section.bx-logorow:hover > .elementor-container{
  animation-play-state:paused;
}
.botixbo .elementor-column.brand{
  /* the strip's rule kept each entry on one line; in a card the name has
     to wrap instead, or it spills past the card */
  white-space:normal;
  width:210px !important;
  flex:0 0 210px !important;
  display:flex;
  flex-direction:column;
  align-items:center;
  /* pack from the top so every logo sits on the same line regardless of
     how many lines its school name runs to */
  justify-content:flex-start;
  gap:14px;
  background:#fff;
  border:1px solid var(--line);
  border-radius:18px;
  padding:26px 18px;
  transition:transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s;
}
.botixbo .elementor-column.brand:hover{
  transform:translateY(-4px);
  border-color:rgba(37,99,235,.28);
  box-shadow:0 18px 40px -24px rgba(15,23,42,.28);
}
.botixbo .elementor-column.brand > .elementor-widget-wrap{ display:contents; }
/* a fixed band for the mark keeps the row of logos aligned */
.botixbo .brand .brand-logo{
  height:96px;
  display:flex;
  align-items:center;
  justify-content:center;
  width:100%;
}
.botixbo .brand .brand-logo img{
  height:76px;
  width:auto;
  max-width:100%;
  object-fit:contain;
  display:block;
}
.botixbo .brand .brand-name{width:100%;}
.botixbo .brand .brand-name .elementor-heading-title{
  /* the widget renders a <span>; text-align does nothing until it is a
     block box */
  display:block;
  font-family:var(--body);
  font-weight:600;
  font-size:13px;
  line-height:1.35;
  color:var(--muted);
  text-align:center;
  white-space:normal;
  overflow-wrap:anywhere;
  max-width:100%;
}

/* While editing, stop the row and wrap it so every card can be clicked —
   a moving target cannot be. */
body.elementor-editor-active .botixbo .bx-logorow > .elementor-container{
  animation:none !important;
  width:100% !important;
  flex-wrap:wrap;
}
body.elementor-editor-active .botixbo .marquee{
  -webkit-mask-image:none;
  mask-image:none;
  overflow:visible;
}

/* =========================================================
   FAQ — one editable widget per question and answer
   The source markup wrapped each entry in <details>/<summary>, which is a
   single block and so a single HTML widget. Splitting question and answer
   into their own widgets makes them editable, and the open/close behaviour
   moves here and to the click handler in botixbo-real.js. The rendered
   result keeps the original's rules, padding and rotating plus sign.
   ========================================================= */
.botixbo .elementor-section.bx-faqlist > .elementor-container{
  display:block !important;
  max-width:820px !important;
  margin:44px auto 0 !important;
}
.botixbo .elementor-column.pfaq-item{
  width:100% !important;
  display:block;
  border-bottom:1px solid var(--line);
}
.botixbo .elementor-column.pfaq-item > .elementor-widget-wrap{ display:block; }
.botixbo .pfaq-item .pfaq-q .elementor-heading-title{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:16px;
  padding:22px 4px;
  font-weight:700;
  font-size:16.5px;
  line-height:1.4;
  color:var(--heading);
  cursor:pointer;
}
/* stands in for the inline <svg> plus sign the summary used to carry */
.botixbo .pfaq-item .pfaq-q .elementor-heading-title::after{
  content:"";
  flex-shrink:0;
  width:22px;
  height:22px;
  background:
    linear-gradient(var(--blue),var(--blue)) center/12px 2.2px no-repeat,
    linear-gradient(var(--blue),var(--blue)) center/2.2px 12px no-repeat;
  transition:transform .25s var(--ease);
}
.botixbo .pfaq-item.is-open .pfaq-q .elementor-heading-title::after{
  transform:rotate(45deg);
}
.botixbo .pfaq-item .pfaq-a{
  display:grid;
  /* a bare 0fr track keeps an automatic content minimum and so never
     collapses; minmax(0,…) removes that floor */
  grid-template-rows:minmax(0, 0fr);
  /* the paragraph overflows the zero-height track rather than shrinking
     with it, so the clip has to sit on the collapsing element itself */
  overflow:hidden;
  transition:grid-template-rows .28s var(--ease);
}
.botixbo .pfaq-item.is-open .pfaq-a{ grid-template-rows:minmax(0, 1fr); }
/* This Elementor build omits .elementor-widget-container, so the clip has
   to go on whatever the widget's direct child turns out to be — without it
   the answer text spilled out over the questions below. A grid item also
   defaults to min-height:auto and refuses to shrink below its content. */
.botixbo .pfaq-item .pfaq-a > *{
  overflow:hidden;
  min-height:0;
}
.botixbo .pfaq-item .pfaq-a p{
  color:var(--muted);
  font-size:15px;
  line-height:1.7;
  padding:0 4px 22px;
  margin:0;
}
/* every answer stays visible while editing, so each one can be clicked */
body.elementor-editor-active .botixbo .pfaq-item .pfaq-a{ grid-template-rows:minmax(0, 1fr); }

/* Cosmetic parity: an Image widget centres its picture by default, and the
   photo panel needs no flex context of its own since its children are
   absolutely positioned. */
.botixbo .elementor-widget-image{ text-align:start; }
.botixbo .elementor-column.tex-visual{ display:block; }

/* The list: a column per technology, stacked. */
.botixbo .elementor-section.bx-texlist > .elementor-container{
  display:flex !important;
  flex-direction:column;
  gap:6px;
}
.botixbo .elementor-section.bx-texlist > .elementor-container > .elementor-column{
  width:100% !important;
}
/* Each item was one <button> laying out icon | name / tagline. It is now a
   column of three widgets, so rebuild that arrangement as a grid: the
   widget wrappers step out of the way with display:contents and the three
   widgets become the grid items themselves. */
.botixbo .elementor-column.tex-item{
  display:grid;
  grid-template-columns:46px 1fr;
  grid-template-rows:auto auto;
  align-items:center;
  /* the source rule's `gap:15px` was a flex gap between icon and text; as a
     grid it would also space the two rows apart, so only the column gap
     carries over */
  column-gap:15px;
  row-gap:0;
  padding:16px 18px;
  border:1px solid transparent;
  border-radius:14px;
  background:transparent;
  cursor:pointer;
  transition:background .3s var(--ease), border-color .3s var(--ease), box-shadow .3s var(--ease);
}
.botixbo .elementor-column.tex-item > .elementor-widget-wrap{ display:contents; }
.botixbo .tex-item .tex-ico{ grid-column:1; grid-row:1 / 3; }
.botixbo .tex-item .tex-name{ grid-column:2; grid-row:1; align-self:end; }
.botixbo .tex-item .tex-tag{ grid-column:2; grid-row:2; align-self:start; }
.botixbo .tex-item:hover{ background:#fff; border-color:var(--line); }
.botixbo .elementor-column.tex-item.active{
  background:#fff;
  border-color:rgba(37,99,235,.25);
  box-shadow:0 16px 34px -22px rgba(37,99,235,.35);
}
.botixbo .tex-item .tex-name .elementor-heading-title{
  font-size:18px; font-weight:600; color:var(--heading); margin:0;
}
.botixbo .tex-item .tex-tag span{ font-size:13.5px; color:var(--muted-2); }
.botixbo .tex-item.active .tico{
  background:linear-gradient(135deg,var(--blue-2),var(--blue-deep));
}
.botixbo .tex-item.active .tico svg{ stroke:#fff; }

/* The panel keeps its own positioning context for the stacked photos and
   captions. The generic chrome reset further down sets top-level columns
   to position:static; this selector matches that one plus the class, so
   it wins regardless of order — without it the gradient tint resolves
   against a far outer ancestor and covers the whole section. */
.botixbo .elementor-top-section > .elementor-container > .elementor-column.tex-visual,
.botixbo .elementor-column.tex-visual{
  position:relative;
  border-radius:20px;
  overflow:hidden;
  min-height:420px;
  box-shadow:0 30px 60px -28px rgba(15,23,42,.3);
}
/* One caption per technology, stacked with the photos. */
.botixbo .tex-visual .tex-copy{
  position:absolute;
  left:0; right:0; bottom:0;
  padding:32px;
  color:#fff;
  z-index:3;
  opacity:0;
  transition:opacity .35s ease;
  pointer-events:none;
}
.botixbo .tex-visual .tex-copy.is-active{ opacity:1; }
.botixbo .tex-visual .tex-copy h3{
  font-size:clamp(24px,2.4vw,30px);
  font-weight:700;
  margin-bottom:10px;
  color:#fff;
  text-shadow:0 2px 12px rgba(0,0,0,.4);
}
.botixbo .tex-visual .tex-copy p{
  font-size:16px;
  color:rgba(255,255,255,.85);
  max-width:440px;
  line-height:1.65;
  margin:0;
}
.botixbo .tex-visual .bx-overlay .tex-visual-tint{ z-index:2; }

/* Editing: the captions are stacked and all but one transparent, so show
   the active one only and let the photo strip above stay clickable. */
body.elementor-editor-active .botixbo .tex-visual .tex-copy{
  position:relative;
  opacity:1;
  pointer-events:auto;
  padding:10px 12px;
  color:var(--ink);
  background:#fff;
  border-radius:8px;
  margin-top:6px;
}
body.elementor-editor-active .botixbo .tex-visual .tex-copy h3{
  color:var(--heading); text-shadow:none; font-size:15px; margin-bottom:4px;
}
body.elementor-editor-active .botixbo .tex-visual .tex-copy p{
  color:var(--muted); font-size:13px;
}

/* =========================================================
   ELEMENTOR CHROME GEOMETRY  (all sections)
   Elementor's own defaults add geometry the design system never asked
   for: 10px padding inside every populated column
   (.elementor-element-populated) and a 20px gap under every widget.
   The design system supplies all spacing itself, so zero them out
   everywhere inside the wrapper rather than compensating per section.
   ========================================================= */
/* The parent Hello Elementor theme sets line-height:1.5 on button elements.
   The design never asked for that — on the real site a <button> styled as
   .btn simply inherits the body's 1.6 — so hand inheritance back. */
.botixbo button{ line-height:inherit; }

.botixbo .elementor-widget-wrap{padding:0 !important;}
.botixbo .elementor-widget:not(:last-child){margin-block-end:0 !important;}
.botixbo .elementor-container{padding-top:0; padding-bottom:0;}

/* Elementor sets position:relative on its wrappers. The design's photo
   panels are `position:absolute; inset:0` and expect their own container
   (.lab, .pv, .top …) to be the positioning context — with Elementor's
   wrapper in between they resolve against that instead, collapse to zero
   height and the picture disappears. Keep the chrome out of the way. */
.botixbo .elementor-widget-wrap,
.botixbo .elementor-widget,
.botixbo .elementor-widget-container,
.botixbo .elementor-top-section > .elementor-container,
.botixbo .elementor-top-section > .elementor-container > .elementor-column{position:static;}

/* The legacy theme stylesheet custom.css styles `.eyebrow` for the OLD
   site's design and does it unscoped (custom.css lines 68-73), so it
   reaches every ported page. Two of its declarations are not overridden
   by the design's own `.botixbo .eyebrow` rule, because that rule never
   needed to set them:

     display:inline-flex  — gives the eyebrow a line box of its own inside
                            the text widget, adding ~8px under every
                            section heading (69px on the longest page);
     ::before             — draws an 18x2px blue dash before the label
                            that the real site does not have.

   Both are visible on the homepage and the Solutions pages too, not just
   Services. Reset them rather than editing custom.css, so the legacy
   theme file stays byte-identical for anything outside .botixbo.
   .hero-eyebrow and .brand-stmt-eyebrow are different classes and keep
   their own markers. */
.botixbo .eyebrow{display:block;}
.botixbo .eyebrow::before{content:none;}

/* ---------------------------------------------------------- touch targets
   A full-matrix sweep (320px to 1920px, every ported page) found no
   sideways scroll and nothing running off the edge at any width. What it
   did find was links in the shared chrome that are too small to hit
   reliably on a phone: the breadcrumb trail at 17px tall, the footer's
   legal row at 21px, and the "Explore ..." card links at 22px. The
   accessible floor is 24x24 (WCAG 2.5.8 Target Size (Minimum)).

   These measure the same on the Next.js site — the design has always been
   this way, so this is a deliberate improvement rather than a porting fix.
   Everything here is behind a max-width query, so desktop geometry is
   untouched and the pixel comparison against the original still holds at
   1280px and above.

   The breadcrumb links stay inline and take padding instead of a
   min-height: padding grows an inline element's clickable box without
   adding to the line box, so the trail keeps its exact position. */
@media (max-width:820px){
  /* The breadcrumb trail's <nav class="breadcrumbs"> wrapper does not
     survive conversion — the <ol> ends up directly inside a text widget —
     so it has to be matched through the list instead of that class.
     Ordered lists are otherwise almost unused in the page copy, and the
     padding only grows an inline link's hit box, so a stray match is
     harmless. */
  .botixbo ol > li > a{padding-block:6px;}
  .botixbo .foot-bottom .links a,
  .botixbo a.link{min-height:24px; display:inline-flex; align-items:center;}
  /* the hero's scroll cue is the only sub-12px text left on any page */
  .botixbo .hero-scroll span{font-size:12px;}
}

/* ------------------------------------------------- collapsed margins
   In the source markup the closing call to action is three siblings in
   one div: the heading, a paragraph with margin-bottom:34px, and the
   button row with margin-top:34px. Adjacent vertical margins collapse, so
   the real gap between the paragraph and the buttons is 34px, not 68.

   Elementor puts each of those in its own widget wrapper, and a margin
   cannot collapse through a wrapper — so both margins apply and the
   section comes out exactly 34px too tall. It measured +34 at every one
   of the fourteen widths tested, which is what makes the cause certain.

   Zeroing the button row's top margin restores the collapsed result. The
   paragraph keeps its own margin, so the 34px gap is still there. Scoped
   to .finalcta: the hero uses .hero-cta too, but the hero is left as raw
   markup, where the margins still collapse on their own. */
.botixbo .finalcta .hero-cta{margin-top:0 !important;}

/* The Explore-the-Technologies section closes with
   `<div class="head center" style="margin-top:32px">` holding one button.
   `.head` carries margin-bottom:52px, which in the original sits between
   that button and the section's 96px bottom padding.

   The explorer was rebuilt as three top-level Elementor sections so its
   photos and captions could each be edited, and the closing block became
   the third. A top-level section is not a `.head` div, so the 52px went
   with it — which is the whole of this section's 52px shortfall, measured
   identically at every width. Put it back inside the section, ahead of
   the padding, exactly where the margin used to sit. */
.botixbo .bx-tech-cta > .elementor-container{margin-bottom:52px;}

/* ------------------------------------------------------ mobile hero
   `.hero` is `height:calc(100vh - 88px); min-height:640px;
   overflow:hidden`. On a phone that resolves to 640px, but the hero's
   content — headline, paragraph, two buttons, the tag strip and the
   scroll cue — measures 767px. The extra 127px is simply clipped: the
   first line of the headline is cut off at the top, and the tag strip
   runs underneath the "Explore Botixbo" scroll label.

   This is in the design, so the Next.js site does exactly the same. It is
   a deliberate WordPress-only correction, like the Teacher Training
   button: the pixel comparison will report the hero as taller than the
   original on phones, and that is the intended result.

   Desktop is untouched — above 820px the hero keeps its viewport-height
   behaviour. overflow stays hidden so the background video, which is
   absolutely positioned to the hero's box, is still clipped to it; only
   the height constraint is lifted so the content sets it. The extra
   bottom padding keeps the absolutely-positioned scroll cue clear of the
   tag strip. */
@media (max-width:820px){
  .botixbo .hero{height:auto; min-height:0; padding-block:72px 104px;}
}
/* Same fix as above, but keyed on viewport HEIGHT rather than width: on a
   wide-but-short laptop screen (e.g. 1366x768) the eyebrow line and the
   second row of hero tag pills were getting clipped top/bottom by the
   fixed height:calc(100vh - 88px) box, since align-items:center plus
   overflow:hidden split the overflow evenly between both edges. */
@media (min-width:821px) and (max-height:820px){
  .botixbo .hero{height:auto; min-height:calc(100vh - 88px); padding-block:56px 48px;}
}
@media (max-width:640px){
  /* The tag strip (AI · Robotics · STEM · IoT · XR · Coding · Drones ·
     Astronomy) wraps to three rows on a phone and repeats what the
     Explore-the-Technologies section covers properly further down, so it
     is dropped here. With it gone the hero needs far less bottom room —
     the leftover padding was showing as a grey band under the video,
     because the video only covers the hero's box and the padding sat
     below it against the section's own dark background. */
  .botixbo .hero-strip{display:none !important;}
  .botixbo .hero{padding-block:56px 96px !important;}

  /* Hero copy centred on phones. Left-aligned, the headline breaks across
     three ragged lines and the two buttons sit at different widths hard
     against the left edge, with the rest of the row empty — centring
     settles all of it and matches every other section on the phone
     layout. The buttons are stretched to a common width so they read as
     a pair rather than two different shapes. */
  .botixbo .hero-copy,
  .botixbo .hero-copy h1,
  .botixbo .hero-copy .lead,
  .botixbo .hero-eyebrow{text-align:left !important;}
  .botixbo .hero-eyebrow{justify-content:flex-start !important;}
  .botixbo .hero-cta{
    flex-direction:column !important; align-items:stretch !important;
    gap:12px !important;
  }
  .botixbo .hero-cta .btn{justify-content:center !important; width:100% !important;}

  /* Hero typography for phones.

     At 47px "FUTURE-READY" is wider than the 353px of usable width, so it
     broke at its own hyphen and the headline read as four ragged lines
     ending "FUTURE- / READY". Sizing it so that word fits on one line is
     what fixes the shape — not nudging the line-height. */
  .botixbo .hero h1{
    font-size:clamp(30px,8.4vw,36px) !important;
    line-height:1.0 !important;
    letter-spacing:-.03em !important;
  }
  /* the lead ran five lines across the full width and collided with the
     play/pause control; a narrower measure reads better and keeps clear */
  .botixbo .hero .lead,
  .botixbo .hero-copy p{
    font-size:15.5px !important; line-height:1.55 !important;
    max-width:none !important; margin:18px 0 0 !important;
    color:rgba(255,255,255,.88) !important;
  }
  .botixbo .hero-eyebrow{font-size:11px !important; margin-bottom:18px !important;}

  /* The control sat in the middle of the paragraph. Put it in the corner,
     where it is out of the reading line but still obviously a control. */
  .botixbo .vid-ctrl{
    top:auto !important; left:auto !important;
    right:14px !important; bottom:14px !important;
    transform:none !important; width:40px !important; height:40px !important;
    z-index:4 !important;
  }

  /* White text over live video is only legible by luck — the footage runs
     from a dark robot to a bright classroom wall. A scrim fixes the
     contrast without dimming the video everywhere equally: strongest top
     and bottom, lightest through the middle where the picture shows. */
  .botixbo .hero::after{
    content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
    background:
      linear-gradient(180deg,
        rgba(9,17,38,.86) 0%, rgba(9,17,38,.60) 38%,
        rgba(9,17,38,.72) 72%, rgba(9,17,38,.92) 100%),
      linear-gradient(90deg, rgba(9,17,38,.80) 0%, rgba(9,17,38,.12) 78%);
  }
  .botixbo .hero > .elementor-container,
  .botixbo .hero .hero-copy,
  .botixbo .hero .hero-scroll{position:relative; z-index:2;}
  /* the video is absolutely positioned to the hero, so it must cover the
     whole box at any height rather than leaving a strip at the bottom */
  .botixbo .hero-video,
  .botixbo .hero > video{
    width:100% !important; height:100% !important; object-fit:cover !important;
  }
}

/* ==================================================== PHONE LAYOUT
   A deliberate redesign of the homepage for small screens. The design's
   own phone rules collapse every grid to a single column, which turned
   the page into roughly thirty screens of scrolling: the four impact
   figures became one tall blue slab, the three book covers each filled
   the width at a 3:4 ratio, and the six press logos stacked one per row.

   These rules only apply at 640px and below; nothing here changes the
   tablet or desktop layout.

   Where a block was converted into an Elementor section, its columns sit
   inside .elementor-container rather than directly inside the block, so
   each rule names both — that way it works whether the element is still
   a plain div or is now a section. */
@media (max-width:640px){
  /* tighter vertical rhythm — 96px between sections is a desktop measure */
  .botixbo .section{padding:52px 0 !important;}
  .botixbo .finalcta{padding:64px 0 !important;}
  .botixbo .trust{padding:40px 0 !important;}

  /* impact figures: a 2x2 block instead of one tall column */
  .botixbo .stats,
  .botixbo .stats > .elementor-container{
    grid-template-columns:1fr 1fr !important;
    gap:26px 18px !important;
  }
  .botixbo .stats{padding:28px 22px !important; border-radius:18px;}
  .botixbo .stat .sico{width:34px !important; height:34px !important; margin-bottom:9px !important;}
  .botixbo .stat .sico svg{width:17px !important; height:17px !important;}

  /* books: a shelf of three, not three full-width covers */
  .botixbo .books,
  .botixbo .books > .elementor-container{
    grid-template-columns:repeat(3,1fr) !important;
    gap:11px !important;
  }
  .botixbo .book{padding:10px 9px !important; transform:none !important;}
  .botixbo .book .bt{font-size:11px !important; line-height:1.25 !important;}
  .botixbo .book .bs{font-size:9.5px !important; letter-spacing:.06em !important;}

  /* press logos: two per row */
  .botixbo .press-row,
  .botixbo .press-row > .elementor-container{
    display:grid !important;
    grid-template-columns:1fr 1fr !important;
    gap:10px !important;
  }
  .botixbo .press-row{margin-bottom:28px !important;}
  /* The press cards size to their own content, so in a half-width column
     the longer mastheads ("Business Standard") run past the edge. Make
     each fill its column and let the name wrap inside it. */
  .botixbo .press{
    width:100% !important; min-width:0 !important;
    justify-content:flex-start !important;
    padding:10px 11px !important; gap:8px !important;
    font-size:11.5px !important; line-height:1.25 !important;
  }
  .botixbo .press *{min-width:0 !important;}
  .botixbo .press > :first-child{flex:0 0 auto !important;}
  .botixbo .press .p-name{
    overflow-wrap:anywhere !important; white-space:normal !important;
  }

  /* Technology list: two per row rather than eight stacked.
     The generated bridge already styles this container as a flex column
     with `.botixbo .elementor-section.bx-texlist > .elementor-container`,
     and that carries !important — so this has to match its specificity to
     win. `.tex-list` itself is left alone: it holds the single inner
     section, and making it a grid put that section in one half-width
     column and squashed it. */
  .botixbo .elementor-section.bx-texlist > .elementor-container{
    display:grid !important;
    grid-template-columns:1fr 1fr !important;
    gap:8px !important;
    align-content:start !important;
  }
  /* A grid item defaults to min-width:auto, so a long label like
     "Artificial Intelligence" pushes its track wider than the screen —
     which is what ran this list off the edge at 320 and 360px. */
  .botixbo .elementor-section.bx-texlist > .elementor-container
    > .elementor-column{width:auto !important; min-width:0 !important;}
  .botixbo .tex-item,
  .botixbo .tex-item *{min-width:0 !important;}
  .botixbo .tex-item .tex-name,
  .botixbo .tex-item h4{overflow-wrap:anywhere !important;}
  /* Redesigned for phones as a grid of tiles rather than a list of rows.
     As rows, each item put a centred icon beside a label that wrapped to
     two lines and a tag line that wrapped to three — 150px per item, and
     nothing lined up with anything else.

     As tiles: icon above a short label, centred, every tile the same
     height. The tag ("Build · Program · Run") is dropped here, not lost —
     the panel directly above already shows the selected technology's full
     description, so on a phone the tag was saying it twice. */
  .botixbo .tex-item{
    display:flex !important; flex-direction:column !important;
    align-items:center !important; justify-content:center !important;
    text-align:center !important; gap:9px !important;
    padding:14px 8px !important; min-height:106px !important;
    background:#fff !important;
    border:1px solid var(--line) !important; border-radius:14px !important;
  }
  .botixbo .tex-item.active{
    border-color:var(--blue) !important;
    box-shadow:0 8px 20px -12px rgba(37,99,235,.55) !important;
  }
  /* the icon sits in a full-width widget wrapper, so it has to be
     centred itself — the tile's align-items cannot reach inside it */
  .botixbo .tex-ico{
    margin:0 !important; display:flex !important; justify-content:center !important;
  }
  .botixbo .tex-ico .tico{width:38px !important; height:38px !important;}
  .botixbo .tex-ico svg{width:18px !important; height:18px !important;}
  .botixbo .tex-name h4{
    font-size:12.5px !important; line-height:1.2 !important; font-weight:600 !important;
  }
  .botixbo .tex-tag{display:none !important;}

  /* "One Ecosystem. Endless Possibilities." cards — centred on phones.
     At full width the left-aligned icon, heading, bullet list and link
     all start at the same edge with a lot of empty space to their right,
     which reads as unfinished. Centring the whole card, bullets included,
     matches the centred section heading above it. */
  .botixbo .acard{text-align:center !important;}
  .botixbo .acard > *{margin-inline:auto !important;}
  .botixbo .acard .aico,
  .botixbo .acard [class*="ico"]{
    display:flex !important; justify-content:center !important;
    margin-inline:auto !important;
  }
  .botixbo .acard ul,
  .botixbo .acard ol{
    list-style:none !important; padding-left:0 !important;
    display:inline-block !important; text-align:center !important;
  }
  /* Each bullet is an absolutely-positioned dot at the list item's left
     edge. Once the text is centred the item is still full width, so the
     dot stays pinned far left and the gap to the text changes with every
     line — which reads as ragged. Drop the dots and let the centred text
     carry the list. */
  .botixbo .acard li{
    display:block !important; padding-left:0 !important;
    text-align:center !important;
  }
  .botixbo .acard li::before{display:none !important;}
  .botixbo .acard .link,
  .botixbo .acard a{justify-content:center !important;}

  /* article and media cards carry desktop-sized padding */
  .botixbo .mf-body{padding:22px 20px !important;}
  .botixbo .article{padding:11px !important; gap:12px !important;}
}

/* ================================================== MOBILE MENU PANEL
   The drawer carries all 43 links — six top-level items plus every
   Solutions, Programs and Services child — which makes it 1902px tall.
   Because it sits in the normal flow it pushes the page down, so the
   lower 27 links are only reachable by scrolling the whole page through
   the menu: about three screenfuls on a phone, with the page content
   stranded underneath.

   Turn it into a panel instead: pinned under the header, never taller
   than the screen, and scrolled on its own. The links stay exactly as
   they are — this changes how the menu is presented, not what it holds.

   Applied at the same 1100px breakpoint that switches to the burger, so
   the panel and the burger always appear together. Only `.open` is
   positioned, so the closed state is untouched. */
@media (max-width:1100px){
  /* Header alignment.
     `.nav` is a flex row whose justify-content is the initial value, so
     with the desktop links and CTA hidden the burger simply followed the
     logo — it sat at x=210 on a 393px screen, crowded against the
     wordmark with 150px of empty space to its right. Push it to the far
     edge, where a menu control belongs. */
  .botixbo .nav{justify-content:space-between !important;}
  .botixbo .nav-toggle{
    margin-left:auto !important;
    /* was 26x33 — below the 44px comfortable touch target */
    width:44px !important; height:44px !important;
    display:grid !important; place-items:center !important;
    /* No negative margin here. Pulling the button 10px right to make the
       icon "optically" meet the gutter left the header measurably
       lopsided — 20px of inset on the logo side against 10px on the
       burger side at every width below 1280. The button box lines up
       with the gutter; the icon sits centred inside it, which is what
       the desktop row does too. */
  }

  .botixbo .mnav.open{
    position:fixed !important;
    left:0; right:0; top:var(--bx-header-h,88px);
    max-height:calc(100dvh - var(--bx-header-h,88px));
    overflow-y:auto;
    -webkit-overflow-scrolling:touch;
    overscroll-behavior:contain;   /* stop scroll chaining to the page */
    z-index:60;
    padding-bottom:env(safe-area-inset-bottom,0px);
    box-shadow:0 24px 48px -24px rgba(15,23,42,.45);
  }
  /* 100dvh is ignored by older iOS Safari, which would leave the panel
     taller than the screen again — vh is the fallback there. */
  @supports not (height:100dvh){
    .botixbo .mnav.open{max-height:calc(100vh - var(--bx-header-h,88px));}
  }

  /* --- group cards -----------------------------------------------
     Each section is a card rather than a full-bleed row: an icon tile,
     the label, and a chevron pinned to the right edge so it is obvious
     the row opens rather than navigates. Open cards tint blue and join
     onto their sub-list, so the expanded section reads as one block. */
  .botixbo .mnav.open{
    display:flex; flex-direction:column; gap:10px;
    padding:12px 14px 0;
    background:var(--bg,#f6f9fc);
  }
  .botixbo .mnav-group{
    /* the panel is a flex column, so without this the cards shrink to
       share the height and their labels get clipped mid-word */
    flex:0 0 auto;
    border:1px solid var(--line);
    border-radius:14px;
    background:#fff;
    overflow:hidden;
  }
  .botixbo .mnav-row{
    display:flex; align-items:center; justify-content:space-between;
    border-bottom:0;
  }
  .botixbo .mnav-group > .mnav-row > a{
    flex:1 1 auto; min-width:0;
    display:flex !important; align-items:center; gap:13px;
    border-bottom:0 !important;
    font-size:16px !important; font-weight:700 !important;
    padding:14px 4px 14px 14px !important;
  }
  .botixbo .mnav-ico{
    flex:0 0 40px; width:40px; height:40px;
    display:grid; place-items:center;
    border-radius:11px;
    background:var(--blue-soft,#e8f0ff);
    color:var(--blue,#2563eb);
  }
  .botixbo .mnav-ico svg{width:20px; height:20px;}
  .botixbo .mnav-exp{
    flex:0 0 52px; width:52px; align-self:center;
    height:44px;
    display:grid; place-items:center;
    /* the theme paints bare <button>s with the brand fill — this control
       is an icon, so the fill has to be cleared explicitly rather than
       relying on `background:none` losing the cascade */
    background:transparent !important;
    border:0 !important; box-shadow:none !important;
    color:var(--muted-2,#94a3b8); cursor:pointer;
    -webkit-tap-highlight-color:transparent;
  }
  .botixbo .mnav-exp svg{
    width:20px; height:20px;
    transition:transform .22s var(--ease,ease);
  }
  .botixbo .mnav-group.is-open{
    border-color:rgba(37,99,235,.28);
    background:var(--blue-soft,#e8f0ff);
  }
  .botixbo .mnav-group.is-open > .mnav-row > a{color:var(--ink) !important;}
  .botixbo .mnav-group.is-open .mnav-ico{background:rgba(37,99,235,.16);}
  .botixbo .mnav-group.is-open .mnav-exp{color:var(--blue,#2563eb);}
  .botixbo .mnav-group.is-open .mnav-exp svg{transform:rotate(180deg);}

  /* Collapsed by default.
     The grid `minmax(0,0fr)` trick only collapses a single child: this
     list has eight <a> siblings, so seven of them land in implicit auto
     rows and keep their full height — the menu looked collapsed in the
     markup while still rendering all 43 links. Take the sub-list out of
     layout entirely instead, which is unambiguous. */
  .botixbo .mnav-group > .mnav-sub{display:none !important;}
  .botixbo .mnav-group.is-open > .mnav-sub{
    display:flex !important;
    background:transparent !important;
    padding:0 0 6px;
  }
  .botixbo .mnav-sub a{
    display:flex !important; align-items:center; gap:12px;
    padding:11px 14px !important;
    font-size:14.5px !important; font-weight:500 !important;
    color:var(--muted) !important;
    border-bottom:1px solid rgba(37,99,235,.10) !important;
  }
  .botixbo .mnav-sub a:last-child{border-bottom:0 !important;}
  /* the section's own landing page, first in its list */
  .botixbo .mnav-sub .mnav-overview{
    color:var(--blue,#2563eb) !important; font-weight:600 !important;
  }
  /* the row is the expand control now, so it should feel tappable and
     not offer a text cursor over the label */
  .botixbo .mnav-row{cursor:pointer; -webkit-tap-highlight-color:transparent;}
  .botixbo .mnav-group > .mnav-row > a{cursor:pointer;}
  .botixbo .mnav-sub .mnav-ico{
    flex:0 0 26px; width:26px; height:26px;
    background:transparent; border-radius:0;
  }
  .botixbo .mnav-sub .mnav-ico svg{width:18px; height:18px;}

  .botixbo .mnav-cta{padding:14px 0 20px;}
  .botixbo .mnav-cta .btn{
    display:flex !important; width:100% !important;
    justify-content:center !important; border-bottom:0 !important;
  }
}

/* ================================================== CARD LINK OVERLAY
   The converter turns each direct child of a layout container into an
   Elementor column, and a column is always a <div> — so a card written as
   `<a class="prelated-card" href=…>` kept its class and lost its href.
   The cards still looked and hovered like cards and did nothing at all
   when clicked: measured on the live site, 0 of 7 linked on
   /programs/robotics/ against 3 of 7 in the original, and 0 of 6 and
   0 of 7 on the Solutions and Services pages.

   card_links.py re-adds the link as a stretched overlay inside the card.
   These rules give that overlay its box. Not scoped to a page family —
   the fault is in the shared converter, so the repair belongs everywhere
   a card grid holds anchors. */
.botixbo .elementor-column.rcard,
.botixbo .elementor-column.prelated-card,
.botixbo .elementor-column.pproject-card,
.botixbo .elementor-column.scases-card,
.botixbo .elementor-column.ldirectory-card,
.botixbo .elementor-column.sservice-pill{ position:relative; }
/* z-index rather than source order: .rcard-media and .prelated-media are
   already position:relative, so without it the media box paints over the
   overlay and the top half of the card stays unclickable. */
.botixbo .bx-cardlink{
  position:absolute;
  inset:0;
  z-index:4;
  border-radius:inherit;
}

/* ------------------------------------------- direct-child selectors
   `.botixbo .split-copy>p` (botixbo.css:182) styles the paragraph in the
   "Turn Your School Into a Place of Innovation" block. Elementor wraps
   every widget, so that paragraph is no longer a direct child of
   .split-copy and the rule stops matching — the copy fell back to
   16px/25.6px with no top margin instead of 17.28px/29.376px with 14px,
   which wrapped it to two lines instead of three and left the section
   31px short.

   Restated as a descendant selector. A sweep of all six stylesheets found
   only two direct-child rules; the other is `.mnav-group:last-child > a`
   in the mobile nav, which is left as raw markup and still matches. */
.botixbo .split-copy p{
  color:var(--muted); margin-top:14px;
  font-size:clamp(16px,1.2vw,18px); line-height:1.7;
}

/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-brand-stmt-grid{display:block !important;}
.botixbo .elementor-section.bx-brand-stmt-grid > .elementor-container{display:grid; grid-template-columns:1.1fr .9fr; gap:64px; align-items:center !important;}
.botixbo .elementor-section.bx-brand-stmt-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:640px){.botixbo .elementor-section.bx-brand-stmt-grid > .elementor-container{grid-template-columns:1fr !important;gap:28px !important;}}
.botixbo .elementor-section.bx-cards4{display:block !important;}
.botixbo .elementor-section.bx-cards4 > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-cards4 > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-cards4 > .elementor-container{grid-template-columns:1fr 1fr !important;}}
@media(max-width:640px){.botixbo .elementor-section.bx-cards4 > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-impact-inner{display:block !important;}
.botixbo .elementor-section.bx-impact-inner > .elementor-container{display:grid; grid-template-columns:.9fr 1.1fr; gap:52px; align-items:center !important;}
.botixbo .elementor-section.bx-impact-inner > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-impact-inner > .elementor-container{grid-template-columns:1fr !important;gap:38px !important;}}
.botixbo .elementor-section.bx-jcards{display:block !important;}
.botixbo .elementor-section.bx-jcards > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:24px !important;}
.botixbo .elementor-section.bx-jcards > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-jcards > .elementor-container{grid-template-columns:1fr 1fr !important;}}
@media(max-width:640px){.botixbo .elementor-section.bx-jcards > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-media-featured{display:block !important;}
.botixbo .elementor-section.bx-media-featured > .elementor-container{display:grid; grid-template-columns:1.2fr 1fr; gap:0 !important;}
.botixbo .elementor-section.bx-media-featured > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-media-featured > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-media-list{display:block !important;}
.botixbo .elementor-section.bx-media-list > .elementor-container{display:flex; flex-direction:column; gap:16px !important;}
.botixbo .elementor-section.bx-media-list > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-pgrid{display:block !important;}
.botixbo .elementor-section.bx-pgrid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:20px !important;}
.botixbo .elementor-section.bx-pgrid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-pgrid > .elementor-container{grid-template-columns:1fr 1fr !important;}}
@media(max-width:640px){.botixbo .elementor-section.bx-pgrid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-press-row{display:block !important;}
.botixbo .elementor-section.bx-press-row > .elementor-container{display:flex; flex-wrap:wrap; justify-content:center; gap:14px !important;}
.botixbo .elementor-section.bx-press-row > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-projects-head{display:block !important;}
.botixbo .elementor-section.bx-projects-head > .elementor-container{display:flex; justify-content:space-between; align-items:flex-end !important;}
.botixbo .elementor-section.bx-projects-head > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-res-grid{display:block !important;}
.botixbo .elementor-section.bx-res-grid > .elementor-container{display:grid; grid-template-columns:1fr 1fr; gap:48px !important;}
.botixbo .elementor-section.bx-res-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-res-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-sgrid{display:block !important;}
.botixbo .elementor-section.bx-sgrid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:20px !important;}
.botixbo .elementor-section.bx-sgrid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-sgrid > .elementor-container{grid-template-columns:1fr 1fr !important;}}
@media(max-width:640px){.botixbo .elementor-section.bx-sgrid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-split{display:block !important;}
.botixbo .elementor-section.bx-split > .elementor-container{display:grid; grid-template-columns:1fr 1.05fr; gap:54px; align-items:center !important;}
.botixbo .elementor-section.bx-split > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:1000px){.botixbo .elementor-section.bx-split > .elementor-container{grid-template-columns:1fr !important;gap:36px !important;}}
.botixbo .elementor-column.mf-body > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.ml-item > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.press > .elementor-widget-wrap{display:contents;}
.botixbo .bx-s01,
.botixbo .bx-s01 .elementor-heading-title{margin-top:32px !important;}
.botixbo .bx-s02,
.botixbo .bx-s02 .elementor-heading-title{text-align:center !important; margin-bottom:8px !important; font-size:28px !important;}
.botixbo .bx-s03,
.botixbo .bx-s03 .elementor-heading-title{margin-top:12px !important;}
.botixbo .bx-s04,
.botixbo .bx-s04 .elementor-heading-title{font-size:clamp(28px,3.4vw,40px) !important; margin-top:12px !important;}
.botixbo .elementor-widget-image.pv{position:relative;}
.botixbo .elementor-widget-image.pv > .elementor-widget-container,
.botixbo .elementor-widget-image.pv figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.pv img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.pv::after{content:"";position:absolute;inset:0;z-index:1;;}
.botixbo .elementor-widget-image.ml-thumb{position:relative;width:96px;height:96px;border-radius:12px;overflow:hidden;flex-shrink:0;}
.botixbo .elementor-widget-image.ml-thumb{position:relative;}
.botixbo .elementor-widget-image.ml-thumb > .elementor-widget-container,
.botixbo .elementor-widget-image.ml-thumb figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.ml-thumb img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .btn .elementor-button{font-family:var(--body) !important; font-weight:500 !important; font-size:14.5px !important; padding:12px 22px !important; border-radius:10px !important; cursor:pointer !important; border:none !important; transition:transform .25s var(--ease),box-shadow .25s var(--ease),background .25s,background-position .35s var(--ease) !important; display:inline-flex !important; align-items:center !important; gap:8px !important; white-space:nowrap !important;}
.botixbo .btn-lightoutline .elementor-button{background:#fff !important; color:var(--blue) !important; border:1px solid var(--line) !important;}
.botixbo .btn-lightoutline .elementor-button:hover,
.botixbo .btn-lightoutline:hover .elementor-button{border-color:var(--blue) !important; transform:translateY(-2px) !important;}
.botixbo .btn-primary .elementor-button{background:linear-gradient(135deg,var(--blue-2),var(--blue) 55%,var(--blue-deep)) !important; background-size:160% 160% !important; background-position:0% 50% !important; color:#fff !important; box-shadow:0 8px 22px rgba(37,99,235,.28) !important;}
.botixbo .btn-primary .elementor-button:hover,
.botixbo .btn-primary:hover .elementor-button{background-position:100% 50% !important; transform:translateY(-2px) !important; box-shadow:0 12px 30px rgba(37,99,235,.36) !important;}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-ldirectory-grid{display:block !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-pbands-grid{display:block !important;}
.botixbo .elementor-section.bx-pbands-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:1px !important;}
.botixbo .elementor-section.bx-pbands-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:820px){.botixbo .elementor-section.bx-pbands-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-peditorial-grid{display:block !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{display:grid; grid-template-columns:1fr 1fr; gap:64px; align-items:center !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{grid-template-columns:1fr !important;gap:32px !important;}}
.botixbo .elementor-section.bx-pequip-grid{display:block !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container{display:grid; grid-template-columns:repeat(6,1fr); gap:14px !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(3,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
.botixbo .elementor-section.bx-phero-grid{display:block !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container{display:grid; grid-template-columns:1.05fr .95fr; gap:56px; align-items:center !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-phero-grid > .elementor-container{grid-template-columns:1fr !important;gap:36px !important;}}
.botixbo .elementor-section.bx-pprojects-grid{display:block !important;}
.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-pprojects-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-prelated-grid{display:block !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-scases-grid{display:block !important;}
.botixbo .elementor-section.bx-scases-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-scases-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-scases-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-scurriculum-track{display:block !important;}
.botixbo .elementor-section.bx-scurriculum-track > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:0 !important;}
.botixbo .elementor-section.bx-scurriculum-track > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:820px){.botixbo .elementor-section.bx-scurriculum-track > .elementor-container{grid-template-columns:1fr !important;gap:28px !important;}}
.botixbo .elementor-section.bx-sservices-grid{display:block !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container{display:flex; flex-wrap:wrap; gap:14px !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-sstudent-grid{display:block !important;}
.botixbo .elementor-section.bx-sstudent-grid > .elementor-container{display:grid; grid-template-columns:1fr 1fr; gap:56px; align-items:center !important;}
.botixbo .elementor-section.bx-sstudent-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-sstudent-grid > .elementor-container{grid-template-columns:1fr !important;gap:32px !important;}}
.botixbo .elementor-section.bx-ssupport-grid{display:block !important;}
.botixbo .elementor-section.bx-ssupport-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:18px !important;}
.botixbo .elementor-section.bx-ssupport-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:820px){.botixbo .elementor-section.bx-ssupport-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-steacher-grid{display:block !important;}
.botixbo .elementor-section.bx-steacher-grid > .elementor-container{display:grid; grid-template-columns:1fr 1fr; gap:56px; align-items:center !important;}
.botixbo .elementor-section.bx-steacher-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-steacher-grid > .elementor-container{grid-template-columns:1fr !important;gap:32px !important;}}
.botixbo .elementor-section.bx-swhat-grid{display:block !important;}
.botixbo .elementor-section.bx-swhat-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-swhat-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-swhat-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-swhat-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-column.sservice-pill > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.ssupport-item > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.steacher-list > .elementor-widget-wrap{display:contents;}
.botixbo .bx-l01,
.botixbo .bx-l01 .elementor-heading-title{text-align:left !important;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;aspect-ratio:16/9;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;}
.botixbo .elementor-widget-image.ldirectory-media > .elementor-widget-container,
.botixbo .elementor-widget-image.ldirectory-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.ldirectory-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.prelated-media{position:relative;aspect-ratio:16/10;}
.botixbo .elementor-widget-image.prelated-media{position:relative;}
.botixbo .elementor-widget-image.prelated-media > .elementor-widget-container,
.botixbo .elementor-widget-image.prelated-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.prelated-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.pproject-media{position:relative;aspect-ratio:4/3;}
.botixbo .elementor-widget-image.pproject-media{position:relative;}
.botixbo .elementor-widget-image.pproject-media > .elementor-widget-container,
.botixbo .elementor-widget-image.pproject-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.pproject-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .btn .elementor-button{font-family:var(--body) !important; font-weight:500 !important; font-size:14.5px !important; padding:12px 22px !important; border-radius:10px !important; cursor:pointer !important; border:none !important; transition:transform .25s var(--ease),box-shadow .25s var(--ease),background .25s,background-position .35s var(--ease) !important; display:inline-flex !important; align-items:center !important; gap:8px !important; white-space:nowrap !important;}
.botixbo .btn-outline .elementor-button{background:rgba(255,255,255,.06) !important; color:#fff !important; border:1px solid rgba(255,255,255,.5) !important;}
.botixbo .btn-outline .elementor-button:hover,
.botixbo .btn-outline:hover .elementor-button{background:rgba(255,255,255,.14) !important; transform:translateY(-2px) !important;}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-ldirectory-grid{display:block !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-pequip-grid{display:block !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container{display:grid; grid-template-columns:repeat(6,1fr); gap:14px !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(3,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
.botixbo .elementor-section.bx-phero-bands{display:block !important;}
.botixbo .elementor-section.bx-phero-bands > .elementor-container{display:flex; flex-wrap:wrap; gap:10px !important;}
.botixbo .elementor-section.bx-phero-bands > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-phero-grid{display:block !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container{display:grid; grid-template-columns:1.05fr .95fr; gap:56px; align-items:center !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-phero-grid > .elementor-container{grid-template-columns:1fr !important;gap:36px !important;}}
.botixbo .elementor-section.bx-prelated-grid{display:block !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-ptopics-grid{display:block !important;}
.botixbo .elementor-section.bx-ptopics-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:14px !important;}
.botixbo .elementor-section.bx-ptopics-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-ptopics-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:520px){.botixbo .elementor-section.bx-ptopics-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-sdeliver-list{display:block !important;}
.botixbo .elementor-section.bx-sdeliver-list > .elementor-container{display:flex; flex-wrap:wrap; gap:0 !important;}
.botixbo .elementor-section.bx-sdeliver-list > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-ssupport-grid{display:block !important;}
.botixbo .elementor-section.bx-ssupport-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:18px !important;}
.botixbo .elementor-section.bx-ssupport-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:820px){.botixbo .elementor-section.bx-ssupport-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-swho-list{display:block !important;}
.botixbo .elementor-section.bx-swho-list > .elementor-container{display:flex; flex-wrap:wrap; justify-content:center; gap:12px !important;}
.botixbo .elementor-section.bx-swho-list > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-column.ptopic > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.sdeliver-item > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.ssupport-item > .elementor-widget-wrap{display:contents;}
.botixbo .bx-v01,
.botixbo .bx-v01 .elementor-heading-title{margin-top:32px !important; margin-bottom:0 !important;}
.botixbo .elementor-section.bx-v02 > .elementor-container{justify-content:center !important;}
.botixbo .elementor-section.bx-v03{background:var(--soft) !important;}
.botixbo .bx-v04,
.botixbo .bx-v04 .elementor-heading-title{margin-top:8px !important; margin-bottom:0 !important;}
.botixbo .elementor-section.bx-v05{background:#fff !important;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;aspect-ratio:16/9;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;}
.botixbo .elementor-widget-image.ldirectory-media > .elementor-widget-container,
.botixbo .elementor-widget-image.ldirectory-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.ldirectory-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.prelated-media{position:relative;aspect-ratio:16/10;}
.botixbo .elementor-widget-image.prelated-media{position:relative;}
.botixbo .elementor-widget-image.prelated-media > .elementor-widget-container,
.botixbo .elementor-widget-image.prelated-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.prelated-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .btn .elementor-button{font-family:var(--body) !important; font-weight:500 !important; font-size:14.5px !important; padding:12px 22px !important; border-radius:10px !important; cursor:pointer !important; border:none !important; transition:transform .25s var(--ease),box-shadow .25s var(--ease),background .25s,background-position .35s var(--ease) !important; display:inline-flex !important; align-items:center !important; gap:8px !important; white-space:nowrap !important;}
.botixbo .btn-lightoutline .elementor-button{background:#fff !important; color:var(--blue) !important; border:1px solid var(--line) !important;}
.botixbo .btn-lightoutline .elementor-button:hover,
.botixbo .btn-lightoutline:hover .elementor-button{border-color:var(--blue) !important; transform:translateY(-2px) !important;}
.botixbo .btn-outline .elementor-button{background:rgba(255,255,255,.06) !important; color:#fff !important; border:1px solid rgba(255,255,255,.5) !important;}
.botixbo .btn-outline .elementor-button:hover,
.botixbo .btn-outline:hover .elementor-button{background:rgba(255,255,255,.14) !important; transform:translateY(-2px) !important;}

/* ---------------------------------------------------------------- .bx-svc
   Services-only corrections. Every selector below is scoped to .bx-svc,
   the class build_services.py puts on each Services top-level section, so
   these rules cannot reach the homepage or the Solutions pages. */

/* The legacy theme file custom.css carries a bare `.eyebrow{display:
   inline-flex}` rule (custom.css line 68). On the Next.js pages .eyebrow is
   an ordinary block <p>; in Elementor the inline-flex box sits in a line
   box of its own inside the text-editor widget, and the line box's leading
   adds 8px under every section heading. With 16 sections on the longest
   Services page that alone accounted for a 69px overrun. Restore the
   block box the design actually uses.

   NOTE FOR THE COORDINATOR: the same 8px-per-section drift exists on the
   Solutions pages for the same reason. Dropping the `display` declaration
   from custom.css line 68 would fix both at once — I have not done that,
   because it would change signed-off pages. */
.botixbo .bx-svc .elementor-widget-text-editor > .eyebrow{ display:block; }

/* The converter splices away a bare `.wrap` div, because Elementor's own
   .elementor-container is already styled to behave as .wrap. It cannot
   splice one when the source puts another class on the same element —
   `<div class="wrap phero-grid">` in ServiceTemplate's hero, and the same
   pattern in several other sections. The `wrap` class then rides along on
   the inner section while Elementor's container emulates .wrap as well, so
   the 28px gutter is applied twice and the row is 56px narrower than the
   original. That re-flows the hero copy and shrinks the hero image, which
   was the whole of the hero's 33px height error.

   The outer top-level section's container already supplies the gutter, so
   drop it from the inner pair. */
.botixbo .bx-svc .elementor-inner-section.wrap,
.botixbo .bx-svc .elementor-inner-section.wrap > .elementor-container{
  max-width:none !important;
  padding-left:0 !important;
  padding-right:0 !important;
}

/* Restore the trailing arrow on buttons that carried one in the source (see
   tag_icon_buttons above). It is the same 16x16 path ServiceTemplate's
   ArrowIcon draws, painted through a mask so it picks up the button's own
   currentColor and follows every hover state for free.

   NOTE FOR THE COORDINATOR: the Solutions pages drop this arrow too — e.g.
   the "Explore Teacher Training" button on /solutions/ai-robotics-lab is
   24px narrower than the Next.js original for exactly this reason. The fix
   is deliberately scoped to .bx-svc so it cannot change those pages; the
   real fix would be icon support in convert_all.py's button emitter, which
   I have left to you. */
.botixbo .bx-svc .bx-btn-arrow .elementor-button-content-wrapper::after{
  content:"";
  flex:0 0 16px;
  width:16px;
  height:16px;
  background-color:currentColor;
  -webkit-mask:var(--bx-arrow) center / 16px 16px no-repeat;
  mask:var(--bx-arrow) center / 16px 16px no-repeat;
}
.botixbo .bx-svc .bx-btn-arrow{
  --bx-arrow:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>');
}

/* See build_services.py: deliberate WordPress-only correction. */
.botixbo .bx-svc.bx-v03 .elementor-button{
  background:#fff !important; color:var(--blue) !important;
  border:1px solid var(--line) !important;
}
.botixbo .bx-svc.bx-v03 .elementor-button:hover{
  background:#fff !important; border-color:var(--blue) !important;
}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-ldirectory-grid{display:block !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-pbands-grid{display:block !important;}
.botixbo .elementor-section.bx-pbands-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:1px !important;}
.botixbo .elementor-section.bx-pbands-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:820px){.botixbo .elementor-section.bx-pbands-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-peditorial-grid{display:block !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{display:grid; grid-template-columns:1fr 1fr; gap:64px; align-items:center !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{grid-template-columns:1fr !important;gap:32px !important;}}
.botixbo .elementor-section.bx-pequip-grid{display:block !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container{display:grid; grid-template-columns:repeat(6,1fr); gap:14px !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(3,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
.botixbo .elementor-section.bx-phero-grid{display:block !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container{display:grid; grid-template-columns:1.05fr .95fr; gap:56px; align-items:center !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-phero-grid > .elementor-container{grid-template-columns:1fr !important;gap:36px !important;}}
.botixbo .elementor-section.bx-pjourney-track{display:block !important;}
.botixbo .elementor-section.bx-pjourney-track > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:0 !important;}
.botixbo .elementor-section.bx-pjourney-track > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pjourney-track > .elementor-container{grid-template-columns:1fr !important;gap:36px !important;}}
.botixbo .elementor-section.bx-poutcomes-grid{display:block !important;}
.botixbo .elementor-section.bx-poutcomes-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:18px !important;}
.botixbo .elementor-section.bx-poutcomes-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-poutcomes-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
.botixbo .elementor-section.bx-pprojects-grid{display:block !important;}
.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-pprojects-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-prelated-grid{display:block !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-pschool-inner{display:block !important;}
.botixbo .elementor-section.bx-pschool-inner > .elementor-container{display:grid; grid-template-columns:1.2fr .8fr; gap:48px; align-items:center !important;}
.botixbo .elementor-section.bx-pschool-inner > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:820px){.botixbo .elementor-section.bx-pschool-inner > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-ptopics-grid{display:block !important;}
.botixbo .elementor-section.bx-ptopics-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:14px !important;}
.botixbo .elementor-section.bx-ptopics-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-ptopics-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:520px){.botixbo .elementor-section.bx-ptopics-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-column.pschool-cta > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.ptopic > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;aspect-ratio:16/9;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;}
.botixbo .elementor-widget-image.ldirectory-media > .elementor-widget-container,
.botixbo .elementor-widget-image.ldirectory-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.ldirectory-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.pproject-media{position:relative;aspect-ratio:4/3;}
.botixbo .elementor-widget-image.pproject-media{position:relative;}
.botixbo .elementor-widget-image.pproject-media > .elementor-widget-container,
.botixbo .elementor-widget-image.pproject-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.pproject-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.prelated-media{position:relative;aspect-ratio:16/10;}
.botixbo .elementor-widget-image.prelated-media{position:relative;}
.botixbo .elementor-widget-image.prelated-media > .elementor-widget-container,
.botixbo .elementor-widget-image.prelated-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.prelated-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .btn .elementor-button{font-family:var(--body) !important; font-weight:500 !important; font-size:14.5px !important; padding:12px 22px !important; border-radius:10px !important; cursor:pointer !important; border:none !important; transition:transform .25s var(--ease),box-shadow .25s var(--ease),background .25s,background-position .35s var(--ease) !important; display:inline-flex !important; align-items:center !important; gap:8px !important; white-space:nowrap !important;}
.botixbo .btn-outline .elementor-button{background:rgba(255,255,255,.06) !important; color:#fff !important; border:1px solid rgba(255,255,255,.5) !important;}
.botixbo .btn-outline .elementor-button:hover,
.botixbo .btn-outline:hover .elementor-button{background:rgba(255,255,255,.14) !important; transform:translateY(-2px) !important;}

/* ---------------------------------------------------------------- .bx-prg
   Programs-only corrections. Every selector below is scoped to .bx-prg,
   the class build_programs.py puts on each Programs top-level section, so
   these rules cannot reach the homepage, the Solutions pages or the
   Services pages. */

/* The legacy theme file custom.css carries a bare `.eyebrow{display:
   inline-flex}` rule (custom.css line 68). On the Next.js pages .eyebrow is
   an ordinary block <p>; in Elementor the inline-flex box sits in a line
   box of its own inside the text-editor widget, and the line box's leading
   adds ~8px under every section heading — which compounds over the 12-14
   sections a Programs detail page carries. Restore the block box the
   design actually uses. (Same root cause as the .bx-svc rule in
   bridge-services.css.) */
.botixbo .bx-prg .elementor-widget-text-editor > .eyebrow{ display:block; }

/* The converter splices away a bare `.wrap` div, because Elementor's own
   .elementor-container is already styled to behave as .wrap. It cannot
   splice one when the source puts another class on the same element —
   e.g. `<div class="wrap phero-grid">` in ProgramTemplate's hero. The
   `wrap` class then rides along on the inner section while Elementor's
   container emulates .wrap as well, so the 28px gutter is applied twice
   and the row comes out 56px narrower than the original.

   The outer top-level section's container already supplies the gutter, so
   drop it from the inner pair.

   Exception: .pschool-inner is the one .wrap on these pages that replaces
   the gutter with padding of its own (program.css:131 — `padding:64px
   56px` on the dark panel). Zeroing its sides would strip the panel's real
   padding, and it also has to span the full 1200px the .wrap gives it on
   the Next.js page rather than the 1144px left inside the outer gutter —
   so for that one section the gutter comes off the OUTER container
   instead, which is handled by the rule below. */
.botixbo .bx-prg .elementor-inner-section.wrap:not(.pschool-inner),
.botixbo .bx-prg .elementor-inner-section.wrap:not(.pschool-inner) > .elementor-container{
  max-width:none !important;
  padding-left:0 !important;
  padding-right:0 !important;
}
.botixbo .bx-prg.pschool > .elementor-container{
  padding-left:0 !important;
  padding-right:0 !important;
}

/* The Next.js app loads Tailwind's preflight (app/globals.css imports
   "tailwindcss"), whose reset makes every <svg> a block box:
       svg,video,canvas,audio,iframe,embed,object{display:block;
                                                  vertical-align:middle}
   WordPress has no such reset, so an inline <svg> that sits in normal flow
   — the 16px tick in each .poutcome card, for one — generates a line box
   of its own and adds ~10px to every card it appears in. Restore the
   reference behaviour for these pages only. */
.botixbo .bx-prg svg{ display:block; vertical-align:middle; }

/* The FAQ question is a <summary> on the Next.js page and a heading widget
   here (build_programs_faq.py, reusing build_faq.py so the accordion
   behaviour and classes match the Solutions/Services pages). The shared
   rule in bridge.css gives it line-height:1.4, and Elementor's heading
   picks up the design's -0.01em heading tracking; a <summary> has neither,
   so it renders 26.4px tall with normal tracking. Restore both, scoped to
   .bx-prg so the signed-off Solutions and Services FAQs are untouched. */
.botixbo .bx-prg .pfaq-item .pfaq-q .elementor-heading-title{
  line-height:1.6;
  letter-spacing:normal;
}

/* Restore the trailing arrow on buttons that carried one in the source
   (see tag_icon_buttons above). Same 16x16 path the template's ArrowIcon
   draws, painted through a mask so it picks up the button's own
   currentColor and follows every hover state for free. */
.botixbo .bx-prg .bx-btn-arrow .elementor-button-content-wrapper::after{
  content:"";
  flex:0 0 16px;
  width:16px;
  height:16px;
  background-color:currentColor;
  -webkit-mask:var(--bx-arrow) center / 16px 16px no-repeat;
  mask:var(--bx-arrow) center / 16px 16px no-repeat;
}
.botixbo .bx-prg .bx-btn-arrow{
  --bx-arrow:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>');
}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-prelated-grid{display:block !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-rgrid{display:block !important;}
.botixbo .elementor-section.bx-rgrid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-rgrid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-rgrid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-rgrid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-sservices-grid{display:block !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container{display:flex; flex-wrap:wrap; gap:14px !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-column.sservice-pill > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-section.bx-a01{margin-top:22px !important;}
.botixbo .elementor-widget-image.rcard-media{position:relative;aspect-ratio:16/10;}
.botixbo .elementor-widget-image.rcard-media{position:relative;}
.botixbo .elementor-widget-image.rcard-media > .elementor-widget-container,
.botixbo .elementor-widget-image.rcard-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.rcard-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.rarticle-media{max-width:920px;margin:36px auto 0;border-radius:20px;overflow:hidden;position:relative;aspect-ratio:16/9;}
.botixbo .elementor-widget-image.rarticle-media{position:relative;}
.botixbo .elementor-widget-image.rarticle-media > .elementor-widget-container,
.botixbo .elementor-widget-image.rarticle-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.rarticle-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.prelated-media{position:relative;aspect-ratio:16/10;}
.botixbo .elementor-widget-image.prelated-media{position:relative;}
.botixbo .elementor-widget-image.prelated-media > .elementor-widget-container,
.botixbo .elementor-widget-image.prelated-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.prelated-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}

/* ---------------------------------------------------------------- .bx-res
   Resources-only corrections. Every selector below is scoped to .bx-res. */

/* The legacy theme file custom.css carries a bare `.eyebrow{display:
   inline-flex}` rule (custom.css line 68). On the Next.js pages .eyebrow is
   an ordinary block <p>; in Elementor the inline-flex box sits in a line
   box of its own inside the text-editor widget, and the line box's leading
   adds ~8px under every section heading. Restore the block box the design
   actually uses. (Same root cause as the .bx-svc rule in
   bridge-services.css and the .bx-prg rule in bridge-programs.css.) */
.botixbo .bx-res .elementor-widget-text-editor > .eyebrow{ display:block; }

/* The Next.js app loads Tailwind's preflight (app/globals.css imports
   "tailwindcss"), whose reset makes every <svg> a block box:
       svg,video,canvas,audio,iframe,embed,object{display:block;
                                                  vertical-align:middle}
   WordPress has no such reset, so an inline <svg> sitting in normal flow
   generates a line box of its own and adds ~10px to whatever contains it.
   Restore the reference behaviour for these pages only. */
.botixbo .bx-res svg{ display:block; vertical-align:middle; }

/* The converter splices away a bare `.wrap` div but cannot splice one that
   carries another class too, so the `wrap` class rides along on the inner
   section while Elementor's container emulates .wrap as well — the 28px
   gutter applied twice, the row 56px narrower than the original. The outer
   top-level section's container already supplies the gutter. */
.botixbo .bx-res .elementor-inner-section.wrap,
.botixbo .bx-res .elementor-inner-section.wrap > .elementor-container{
  max-width:none !important;
  padding-left:0 !important;
  padding-right:0 !important;
}

/* Restore the trailing arrow on buttons that carried one in the source
   (see tag_icon_buttons above). Same 16x16 path the template's ArrowIcon
   draws, painted through a mask so it picks up the button's own
   currentColor and follows every hover state for free. */
.botixbo .bx-res .bx-btn-arrow .elementor-button-content-wrapper::after{
  content:"";
  flex:0 0 16px;
  width:16px;
  height:16px;
  background-color:currentColor;
  -webkit-mask:var(--bx-arrow) center / 16px 16px no-repeat;
  mask:var(--bx-arrow) center / 16px 16px no-repeat;
}
.botixbo .bx-res .bx-btn-arrow{
  --bx-arrow:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>');
}

/* The bare <section> ResourceArticleTemplate wraps the article body in
   carries no class, so nothing outranks custom.css's
   `:not(.botixbo) > .elementor-top-section{padding:var(--space-9) 0}` —
   96px top and bottom that the Next.js page does not render (see
   build_resources.py). Put it back to zero. The class is only ever put on
   sections whose source had no class at all, so no design rule competes
   with it, and it is deliberately written at the same specificity as the
   leaking rule rather than higher, so any section that does carry a design
   class keeps that class's padding. */
.botixbo .bx-res-plain.elementor-top-section{
  padding-top:0;
  padding-bottom:0;
}

/* bridge.css zeroes every native widget's margin with !important
   (`.botixbo .elementor-widget-image{margin:0 !important}`) so widget
   spacing comes from the design's own rules. The article's featured image
   is the one place on these pages where the design puts the spacing on the
   image element itself — `.rarticle-media{margin:36px auto 0}`
   (resource.css:71) — so the generated class rule for it loses to that
   !important and the hero comes out 36px short. Replay just the margin. */
.botixbo .bx-res .elementor-widget-image.rarticle-media{
  margin:36px auto 0 !important;
}

/* Article headings carry the id extractTableOfContents() stamped on them
   and the .rtoc list links to it (restore_heading_ids() puts it back, since
   a heading widget keeps only the Title text). Elementor renders that id on
   the widget's wrapper <div>, not on the <h2>, so the design's
   `.rarticle-body h2{scroll-margin-top:100px}` (resource.css:75) no longer
   applies to the element the browser scrolls to and every TOC jump lands
   with the heading under the sticky header. Put the offset on the element
   that is now the scroll target. */
.botixbo .bx-res .rarticle-body .elementor-widget-heading{
  scroll-margin-top:100px;
}

/* The Resources index's featured card is an <a> that wraps a whole card of
   text, and it stays raw markup (it is itself the grid, so the converter
   cannot make columns of it without losing the link). The legacy theme
   file custom.css carries a blanket `a:hover{color:#336}`; on the Next.js
   page nothing of the sort exists, so the card's heading and copy shift
   from --ink to #333366 on hover in WordPress only. The design sets no
   colour on this card at all — it inherits — so restore that. */
.botixbo .bx-res .rfeatured-card:hover{ color:inherit; }

/* -------------------------------------------------- card link overlay
   The stretched anchor demote_card_anchors() puts inside each card, so the
   card keeps the href the source <a> carried once the converter has
   replaced that <a> with a column <div>. The card column needs a
   positioning context; .rcard-media and .prelated-media are already
   position:relative, so the overlay is given a higher z-index than the
   media box rather than relying on source order. */
.botixbo .bx-res .elementor-column.rcard,
.botixbo .bx-res .elementor-column.prelated-card,
.botixbo .bx-res .elementor-column.sservice-pill{ position:relative; }
.botixbo .bx-res .bx-cardlink{
  position:absolute;
  inset:0;
  z-index:4;
  border-radius:inherit;
}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-ldirectory-grid{display:block !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-peditorial-grid{display:block !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{display:grid; grid-template-columns:1fr 1fr; gap:64px; align-items:center !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{grid-template-columns:1fr !important;gap:32px !important;}}
.botixbo .elementor-section.bx-pequip-grid{display:block !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container{display:grid; grid-template-columns:repeat(6,1fr); gap:14px !important;}
.botixbo .elementor-section.bx-pequip-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(3,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-pequip-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
.botixbo .elementor-section.bx-phero-bands{display:block !important;}
.botixbo .elementor-section.bx-phero-bands > .elementor-container{display:flex; flex-wrap:wrap; gap:10px !important;}
.botixbo .elementor-section.bx-phero-bands > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-phero-grid{display:block !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container{display:grid; grid-template-columns:1.05fr .95fr; gap:56px; align-items:center !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-phero-grid > .elementor-container{grid-template-columns:1fr !important;gap:36px !important;}}
.botixbo .elementor-section.bx-prelated-grid{display:block !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-sservices-grid{display:block !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container{display:flex; flex-wrap:wrap; gap:14px !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-column.sservice-pill > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-section.bx-j01{background:var(--soft) !important;}
.botixbo .elementor-section.bx-j02 > .elementor-container{justify-content:center !important;}
.botixbo .elementor-section.bx-j03{background:#fff !important;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;aspect-ratio:16/9;}
.botixbo .elementor-widget-image.ldirectory-media{position:relative;}
.botixbo .elementor-widget-image.ldirectory-media > .elementor-widget-container,
.botixbo .elementor-widget-image.ldirectory-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.ldirectory-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.prelated-media{position:relative;aspect-ratio:16/10;}
.botixbo .elementor-widget-image.prelated-media{position:relative;}
.botixbo .elementor-widget-image.prelated-media > .elementor-widget-container,
.botixbo .elementor-widget-image.prelated-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.prelated-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}

/* ---------------------------------------------------------------- .bx-prj
   Projects-only corrections. Every selector below is scoped to .bx-prj,
   the class build_projects.py puts on each Projects top-level section, so
   these rules cannot reach the homepage, the Solutions pages, the
   Services pages or the Programs pages. */

/* The legacy theme file custom.css carries a bare `.eyebrow{display:
   inline-flex}` rule (custom.css line 68). On the Next.js pages .eyebrow is
   an ordinary block <p>; in Elementor the inline-flex box sits in a line
   box of its own inside the text-editor widget, and the line box's leading
   adds ~8px under every section heading. Restore the block box the design
   actually uses. (Same root cause as the .bx-svc rule in
   bridge-services.css and the .bx-prg rule in bridge-programs.css.) */
.botixbo .bx-prj .elementor-widget-text-editor > .eyebrow{ display:block; }

/* The converter splices away a bare `.wrap` div, because Elementor's own
   .elementor-container is already styled to behave as .wrap. It cannot
   splice one when the source puts another class on the same element —
   ProjectTemplate has exactly two, `<div class="wrap phero-grid">` and
   `<div class="wrap peditorial-grid">`. The `wrap` class then rides along
   on the inner section while Elementor's container emulates .wrap as
   well, so the 28px gutter is applied twice and the row comes out 56px
   narrower than the original. The outer top-level section's container
   already supplies the gutter, so drop it from the inner pair.

   Unlike the Programs pages there is no .pschool-inner exception here:
   neither of the two composite wraps on these pages replaces the gutter
   with padding of its own. */
.botixbo .bx-prj .elementor-inner-section.wrap,
.botixbo .bx-prj .elementor-inner-section.wrap > .elementor-container{
  max-width:none !important;
  padding-left:0 !important;
  padding-right:0 !important;
}

/* The Next.js app loads Tailwind's preflight (app/globals.css imports
   "tailwindcss"), whose reset makes every <svg> a block box:
       svg,video,canvas,audio,iframe,embed,object{display:block;
                                                  vertical-align:middle}
   WordPress has no such reset, so an inline <svg> that sits in normal flow
   — the 18px .picon tick in each .pequip / .sservice-pill row, for one —
   generates a line box of its own and adds height to every card it
   appears in. Restore the reference behaviour for these pages only. */
.botixbo .bx-prj svg{ display:block; vertical-align:middle; }

/* build_css.py:550 carries a GLOBAL correction
       .botixbo .finalcta .hero-cta{margin-top:0 !important;}
   whose comment explains exactly when it applies: the closing call to
   action is three siblings — heading, a paragraph with margin-bottom:34px,
   and the button row with margin-top:34px. In the source those adjacent
   margins collapse to one 34px gap; Elementor's per-widget wrappers stop
   them collapsing, so both apply and the section comes out 34px too tall.
   Zeroing the button row's top margin restores the collapsed result.

   ProjectTemplate's closing CTA has only TWO siblings — heading and button
   row, no paragraph (ProjectTemplate.tsx:466-486). Nothing collapses in
   the source, so .hero-cta's own 34px margin-top (botixbo.css:101) is the
   real gap, and the global rule deletes it: every Projects detail page
   measured its .finalcta exactly 34px short, on all five pages, with every
   other section matching to the pixel. Put the 34px back for these pages
   only. The higher-specificity .bx-prj.finalcta compound beats the global
   rule, and .bx-prj exists on no other page family, so the homepage /
   Solutions / Services / Programs CTAs — which do have the paragraph and
   do need the global rule — are untouched. */
.botixbo .bx-prj.finalcta .hero-cta{ margin-top:34px !important; }

/* Restore the trailing arrow on buttons that carried one in the source
   (see tag_icon_buttons above). Same 16x16 path the template's ArrowIcon
   draws, painted through a mask so it picks up the button's own
   currentColor and follows every hover state for free. */
.botixbo .bx-prj .bx-btn-arrow .elementor-button-content-wrapper::after{
  content:"";
  flex:0 0 16px;
  width:16px;
  height:16px;
  background-color:currentColor;
  -webkit-mask:var(--bx-arrow) center / 16px 16px no-repeat;
  mask:var(--bx-arrow) center / 16px 16px no-repeat;
}
.botixbo .bx-prj .bx-btn-arrow{
  --bx-arrow:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>');
}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-cbeliefs-grid{display:block !important;}
.botixbo .elementor-section.bx-cbeliefs-grid > .elementor-container{display:grid; grid-template-columns:repeat(2,1fr); gap:16px !important;}
.botixbo .elementor-section.bx-cbeliefs-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:700px){.botixbo .elementor-section.bx-cbeliefs-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-cjobs-list{display:block !important;}
.botixbo .elementor-section.bx-cjobs-list > .elementor-container{display:flex; flex-direction:column; gap:1px !important;}
.botixbo .elementor-section.bx-cjobs-list > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-column.cbelief > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.cjob-item > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-section.bx-r01{margin:36px auto 0 !important;}

/* ---------------------------------------------------------------- .bx-car
   Careers-only corrections. Every selector below is scoped to .bx-car. */

/* company.css carries four "class tag" descendant selectors
   (.chero h1, .cjob-item h3, .cjob-meta, .cjobdetail-section h2) that none
   of convert_all.py's rule extractors capture: load_class_rules keys on a
   single class, load_compound_layout_rules only keeps `.A .B` pairs whose
   body sets display:grid/flex, and there is no extractor at all for
   `.class tag{...}` typography. So the native "Sales Executive" H1
   (rendered by an Elementor heading widget) and the raw-HTML "Responsibilities"
   H2 / job-list H3s / job-meta lines (preserved verbatim inside html
   widgets, original classes intact) never picked up their font-size or
   font-weight and fell back to Elementor/browser defaults. Confirmed via
   compare-careers.mjs: every WP-only typography row traced back to one of
   these four selectors. Replayed verbatim, scoped to .bx-car — !important
   because elementor-post-N.css, widget-heading.min.css and
   base-desktop.css all load AFTER botixbo-real.css in wp_head and set
   .elementor-heading-title's font-size/weight from the Kit's global H1
   default, which otherwise wins the cascade on source order alone even
   though these rules are more specific ancestor-qualified selectors. */
.botixbo .chero.bx-car h1{font-size:clamp(36px,4.8vw,54px) !important;font-weight:800 !important;letter-spacing:-.02em}
.botixbo .bx-car .cjob-item h3{font-size:16.5px !important;font-weight:700 !important;margin-bottom:4px}
.botixbo .bx-car .cjob-meta{font-size:13px !important;color:var(--muted)}
.botixbo .bx-car .cjobdetail-section h2{font-size:20px !important;font-weight:700 !important;margin-bottom:12px}
/* .cjob-cta is a single class, not a class+tag selector, but it still
   never got auto-detected because it is only ever used on an <a> preserved
   verbatim inside a raw html widget (the converter's automatic class-rule
   replay only looks at classes on elements it actually parsed into native
   widgets). Same root cause as the four rules above; found the same way,
   via compare-careers.mjs showing "View Role"/"Apply" at browser-default
   styling instead of company.css's real button-link treatment. */
.botixbo .bx-car .cjob-cta{font-weight:600 !important;font-size:14px !important;color:var(--blue) !important;white-space:nowrap}
.botixbo .bx-car .cjobdetail-section p{color:var(--muted) !important;font-size:15.5px !important;line-height:1.8}
.botixbo .bx-car .cjobdetail-section ul{margin:0 0 0 20px;color:var(--muted) !important;font-size:15.5px !important;line-height:1.8}
/* Same auto-detection gap for the apply-form labels (.cfield label) and
   the honeypot anti-spam field (.honeypot) — both preserved verbatim
   inside a raw html widget on the Careers index's #apply section. */
.botixbo .bx-car .cfield label{display:block !important;font-size:13.5px !important;font-weight:600 !important;line-height:1.6 !important;color:var(--heading);margin-bottom:6px}
.botixbo .bx-car .honeypot{position:absolute !important;left:-9999px !important;width:1px !important;height:1px !important;overflow:hidden !important}

/* The legacy theme file custom.css carries a bare `.eyebrow{display:
   inline-flex}` rule (custom.css line 68). On the Next.js pages .eyebrow is
   an ordinary block <p>; in Elementor the inline-flex box sits in a line
   box of its own inside the text-editor widget, and the line box's leading
   adds ~8px under every section heading. Restore the block box the design
   actually uses. (Same root cause as the .bx-svc rule in
   bridge-services.css, .bx-prg in bridge-programs.css and .bx-res in
   bridge-resources.css.) */
.botixbo .bx-car .elementor-widget-text-editor > .eyebrow{ display:block; }

/* The Next.js app loads Tailwind's preflight (app/globals.css imports
   "tailwindcss"), whose reset makes every <svg> a block box. WordPress has
   no such reset, so an inline <svg> (the CheckIcon in .cbelief, the
   ArrowIcon in buttons the converter left as raw markup) sitting in normal
   flow generates a line box of its own and adds to whatever contains it.
   Restore the reference behaviour for these pages only. */
.botixbo .bx-car svg{ display:block; vertical-align:middle; }

/* The converter splices away a bare `.wrap` div but cannot splice one that
   carries another class too (e.g. `wrap chero-inner`), so `wrap` rides
   along on the inner section while Elementor's container emulates .wrap as
   well — the 28px gutter applied twice, the row 56px narrower than the
   original. The outer top-level section's container already supplies the
   gutter. */
.botixbo .bx-car .elementor-inner-section.wrap,
.botixbo .bx-car .elementor-inner-section.wrap > .elementor-container{
  max-width:none !important;
  padding-left:0 !important;
  padding-right:0 !important;
}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-ldirectory-grid{display:block !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-ldirectory-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-lschools-grid{display:block !important;}
.botixbo .elementor-section.bx-lschools-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:20px !important;}
.botixbo .elementor-section.bx-lschools-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-lschools-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-peditorial-grid{display:block !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{display:grid; grid-template-columns:1fr 1fr; gap:64px; align-items:center !important;}
.botixbo .elementor-section.bx-peditorial-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-peditorial-grid > .elementor-container{grid-template-columns:1fr !important;gap:32px !important;}}
.botixbo .elementor-section.bx-phero-grid{display:block !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container{display:grid; grid-template-columns:1.05fr .95fr; gap:56px; align-items:center !important;}
.botixbo .elementor-section.bx-phero-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-phero-grid > .elementor-container{grid-template-columns:1fr !important;gap:36px !important;}}
.botixbo .elementor-section.bx-pprojects-grid{display:block !important;}
.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:26px !important;}
.botixbo .elementor-section.bx-pprojects-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:600px){.botixbo .elementor-section.bx-pprojects-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-prelated-grid{display:block !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container{display:grid; grid-template-columns:repeat(4,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-prelated-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:repeat(2,1fr) !important;}}
@media(max-width:560px){.botixbo .elementor-section.bx-prelated-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-scases-grid{display:block !important;}
.botixbo .elementor-section.bx-scases-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:22px !important;}
.botixbo .elementor-section.bx-scases-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:920px){.botixbo .elementor-section.bx-scases-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-sservices-grid{display:block !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container{display:flex; flex-wrap:wrap; gap:14px !important;}
.botixbo .elementor-section.bx-sservices-grid > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-column.lschool-card > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.sservice-pill > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-section.bx-o01{background:#fff !important;}
.botixbo .elementor-section.bx-o02{background:var(--soft) !important;}
.botixbo .elementor-widget-image.prelated-media{position:relative;aspect-ratio:16/10;}
.botixbo .elementor-widget-image.prelated-media{position:relative;}
.botixbo .elementor-widget-image.prelated-media > .elementor-widget-container,
.botixbo .elementor-widget-image.prelated-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.prelated-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}
.botixbo .elementor-widget-image.pproject-media{position:relative;aspect-ratio:4/3;}
.botixbo .elementor-widget-image.pproject-media{position:relative;}
.botixbo .elementor-widget-image.pproject-media > .elementor-widget-container,
.botixbo .elementor-widget-image.pproject-media figure{width:100%;height:100%;margin:0;}
.botixbo .elementor-widget-image.pproject-media img{position:absolute;inset:0;width:100% !important;height:100% !important;object-fit:cover;max-width:none;}

/* ---------------------------------------------------------------- .bx-loc
   Locations-only corrections. Every selector below is scoped to .bx-loc,
   the class build_locations.py puts on each Locations top-level section,
   so these rules cannot reach the homepage, the Solutions pages, the
   Services pages, the Programs pages, the Projects pages or the
   Resources pages. */

/* The legacy theme file custom.css carries a bare `.eyebrow{display:
   inline-flex}` rule (custom.css line 68). On the Next.js pages .eyebrow is
   an ordinary block <p>; in Elementor the inline-flex box sits in a line
   box of its own inside the text-editor widget, and the line box's leading
   adds ~8px under every section heading. Restore the block box the design
   actually uses. (Same root cause as the .bx-prj rule in
   bridge-projects.css and the .bx-prg rule in bridge-programs.css.) */
.botixbo .bx-loc .elementor-widget-text-editor > .eyebrow{ display:block; }

/* The Next.js app loads Tailwind's preflight (app/globals.css imports
   "tailwindcss"), whose reset makes every <svg> a block box:
       svg,video,canvas,audio,iframe,embed,object{display:block;
                                                  vertical-align:middle}
   WordPress has no such reset, so an inline <svg> that sits in normal flow
   generates a line box of its own and adds height to every card it
   appears in. Restore the reference behaviour for these pages only. */
.botixbo .bx-loc svg{ display:block; vertical-align:middle; }

/* The converter splices away a bare `.wrap` div, because Elementor's own
   .elementor-container is already styled to behave as .wrap. It cannot
   splice one when the source puts another class on the same element —
   LocationTemplate has `<div class="wrap phero-grid">` and `<div
   class="wrap peditorial-grid">`. The `wrap` class then rides along on
   the inner section while Elementor's container emulates .wrap as well,
   so the 28px gutter is applied twice and the row comes out 56px
   narrower than the original — which reflows the hero/editorial copy
   onto extra lines and measured +75px on phero and +29px on peditorial
   before this fix. Same root cause and fix as the .bx-prj rule in
   bridge-projects.css; the outer top-level section's container already
   supplies the gutter, so drop it from the inner pair. */
.botixbo .bx-loc .elementor-inner-section.wrap,
.botixbo .bx-loc .elementor-inner-section.wrap > .elementor-container{
  max-width:none !important;
  padding-left:0 !important;
  padding-right:0 !important;
}

/* build_css.py:550 carries a GLOBAL correction
       .botixbo .finalcta .hero-cta{margin-top:0 !important;}
   whose comment explains exactly when it applies: the closing call to
   action is three siblings — heading, a paragraph with margin-bottom:34px,
   and the button row with margin-top:34px — which collapse to one 34px
   gap in the source; Elementor's per-widget wrappers stop them
   collapsing, so both apply and the section comes out 34px too tall.
   Zeroing the button row's top margin restores the collapsed result.

   LocationTemplate's closing CTA has only TWO siblings — heading and
   button row, no paragraph — exactly like ProjectTemplate's. Nothing
   collapses in the source, so .hero-cta's own 34px margin-top
   (botixbo.css:101) is the real gap, and the global rule deletes it:
   every Locations detail page measured its .finalcta exactly 34px short.
   Put the 34px back for these pages only, mirroring the .bx-prj rule in
   bridge-projects.css. */
.botixbo .bx-loc.finalcta .hero-cta{ margin-top:34px !important; }

/* Restore the trailing arrow on buttons that carried one in the source
   (see tag_icon_buttons above). Same 16x16 path the template's ArrowIcon
   draws, painted through a mask so it picks up the button's own
   currentColor and follows every hover state for free. */
.botixbo .bx-loc .bx-btn-arrow .elementor-button-content-wrapper::after{
  content:"";
  flex:0 0 16px;
  width:16px;
  height:16px;
  background-color:currentColor;
  -webkit-mask:var(--bx-arrow) center / 16px 16px no-repeat;
  mask:var(--bx-arrow) center / 16px 16px no-repeat;
}
.botixbo .bx-loc .bx-btn-arrow{
  --bx-arrow:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>');
}


/* =========================================================
   NATIVE-WIDGET BRIDGE (generated)
   Sections converted from raw markup into native Elementor widgets lose
   the real site's wrapper divs — Elementor supplies .elementor-container
   and .elementor-column instead. These rules re-point the design
   system's own layout rules at that chrome, so the rendered geometry
   matches the hand-written markup. Regenerate with convert_all.py.
   ========================================================= */
/* Stands in for the source markup's <div class="wrap">. Elementor's
   container is a flex box with no width of its own, so without width:100%
   it shrink-wraps its content instead of centring a fixed measure inside
   a full-bleed section. */
.botixbo .elementor-inner-section > .elementor-container{
  max-width:none !important;
  width:100% !important;
  padding:0 !important;
}
.botixbo .elementor-top-section:not(.bx-raw) > .elementor-container{
  width:100% !important;
  max-width:1200px !important;
  margin-inline:auto !important;
  padding:0 28px !important;
}
.botixbo .elementor-widget-heading,
.botixbo .elementor-widget-text-editor,
.botixbo .elementor-widget-image,
.botixbo .elementor-widget-button{margin:0 !important;}
/* A Heading widget puts its custom class on the wrapper, not on the tag, so
   a size set by a class like .sec-title has to reach the heading by
   inheritance. Only size and weight are passed down: font-family,
   line-height, letter-spacing and colour all come from the design's own
   `h1,h2,h3,h4` rule, and inheriting those would replace its heading
   metrics with the body text's. */
.botixbo .elementor-heading-title{
  font-size:inherit;
  font-weight:inherit;
  color:inherit;
}
/* Colour reaches the heading by inheritance too, so give the wrapper the
   design's default heading colour. A class that sets its own colour —
   .sec-title.blue, or a .sec-title inside the dark .services band — is more
   specific than this and still wins, and now actually reaches the tag. */
.botixbo .elementor-widget-heading{ color:var(--heading); }
.botixbo .elementor-widget-image img{width:auto; max-width:100%;}
.botixbo .bx-flat{display:contents;}

/* Image widgets standing in for next/image "fill" pictures. The source
   markup positioned the <img> itself; Elementor wraps it, so the wrapper
   takes over the absolute box and everything inside stretches to it. The
   picture then behaves exactly as before while remaining swappable from
   the media library. */
.botixbo .elementor-widget-image.bx-fill{
  position:absolute;
  inset:0;
  z-index:0;
}
.botixbo .elementor-widget-image.bx-fill .elementor-widget-container,
.botixbo .elementor-widget-image.bx-fill figure,
.botixbo .elementor-widget-image.bx-fill a{
  width:100%;
  height:100%;
  margin:0;
}
.botixbo .elementor-widget-image.bx-fill img{
  width:100% !important;
  height:100% !important;
  object-fit:cover;
  display:block;
  max-width:none;
}

/* Elementor's Button widget renders its own skinned <a class="elementor-button">
   and puts any custom class on the wrapper instead, so the design system's
   .btn/.link rules never reach the anchor. Strip the skin, then replay those
   rules onto the anchor from the wrapper (generated below). */
/* Elementor's kit paints .elementor-button with the global accent colour
   from a stylesheet enqueued after the theme's, so the reset needs
   !important on the paint properties to win. */
.botixbo .elementor-button{
  background:none !important;
  border:none !important;
  border-radius:0;
  padding:0;
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
  line-height:inherit;
  color:inherit;
  text-align:inherit;
  fill:currentColor;
}
.botixbo .elementor-button .elementor-button-content-wrapper{
  display:inline-flex; align-items:center; gap:inherit;
}
/* The design class (.btn, .btn-primary …) sits on Elementor's widget
   wrapper, which is the only hook available for targeting the anchor
   inside it — but that also makes the design paint the wrapper itself,
   drawing a second, full-width button behind the real one. Keep the
   wrapper as a pure hook: no paint, no box, shrink to its content. */
.botixbo .elementor-widget-button{
  display:inline-block;
  width:auto;
  background:none !important;
  border:none !important;
  padding:0 !important;
  box-shadow:none !important;
  transform:none !important;
}

.botixbo .elementor-section.bx-cbeliefs-grid{display:block !important;}
.botixbo .elementor-section.bx-cbeliefs-grid > .elementor-container{display:grid; grid-template-columns:repeat(2,1fr); gap:16px !important;}
.botixbo .elementor-section.bx-cbeliefs-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:700px){.botixbo .elementor-section.bx-cbeliefs-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-cecosystem-grid{display:block !important;}
.botixbo .elementor-section.bx-cecosystem-grid > .elementor-container{display:grid; grid-template-columns:repeat(3,1fr); gap:16px !important;}
.botixbo .elementor-section.bx-cecosystem-grid > .elementor-container > .elementor-column{width:100% !important;}
@media(max-width:820px){.botixbo .elementor-section.bx-cecosystem-grid > .elementor-container{grid-template-columns:1fr !important;}}
.botixbo .elementor-section.bx-coptions-grid{display:block !important;}
.botixbo .elementor-section.bx-coptions-grid > .elementor-container{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:18px !important;}
.botixbo .elementor-section.bx-coptions-grid > .elementor-container > .elementor-column{width:100% !important;}
.botixbo .elementor-section.bx-mlist{display:block !important;}
.botixbo .elementor-section.bx-mlist > .elementor-container{display:flex; flex-direction:column; gap:1px !important;}
.botixbo .elementor-section.bx-mlist > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-section.bx-phero-bands{display:block !important;}
.botixbo .elementor-section.bx-phero-bands > .elementor-container{display:flex; flex-wrap:wrap; gap:10px !important;}
.botixbo .elementor-section.bx-phero-bands > .elementor-container > .elementor-column{width:auto !important;}
.botixbo .elementor-column.cbelief > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.cecosystem-link > .elementor-widget-wrap{display:contents;}
.botixbo .elementor-column.mitem > .elementor-widget-wrap{display:contents;}
.botixbo .bx-m01,
.botixbo .bx-m01 .elementor-heading-title{max-width:760px !important;}
.botixbo .elementor-section.bx-m02{margin:36px auto 0 !important;}
.botixbo .elementor-section.bx-m03{background:var(--soft) !important;}
.botixbo .elementor-section.bx-m04 > .elementor-container{justify-content:center !important;}

/* -------------------------------------------------------------- .bx-misc
   About/Contact/Privacy/Terms/Books/Media corrections. Every selector
   below is scoped to .bx-misc. */

/* custom.css:68 carries a bare `.eyebrow{display:inline-flex}` with no
   scoping. On the Next.js pages .eyebrow is an ordinary block <p>; inside
   a text-editor widget the inline-flex box gets a line box of its own and
   its leading adds spurious height under every section heading. Same root
   cause as the .bx-svc/.bx-prg/.bx-res rule in the other bridges. */
.botixbo .bx-misc .elementor-widget-text-editor > .eyebrow{ display:block; }

/* The Next.js app loads Tailwind's preflight (app/globals.css imports
   "tailwindcss"), which resets every <svg> to display:block. WordPress has
   no such reset, so an inline <svg> in normal flow (ArrowIcon on the
   Ecosystem links, the belief-list check icons, the objective-list icons)
   gets its own line box and adds a few px wherever it sits. Restore the
   reference behaviour for these pages only. */
.botixbo .bx-misc svg{ display:block; vertical-align:middle; }

/* -------------------------------------------------- card link overlay
   The stretched anchor demote_card_anchors() puts inside each card, once
   the converter has replaced the source <a> with a column <div>. Needs a
   positioning context on the column itself. */
.botixbo .bx-misc .elementor-column.cecosystem-link,
.botixbo .bx-misc .elementor-column.mitem{ position:relative; }
.botixbo .bx-misc .bx-cardlink{
  position:absolute;
  inset:0;
  z-index:4;
  border-radius:inherit;
}

/* ------------------------------------------------ missing typography
   company.css/book.css/media.css carry "class tag" descendant selectors
   (.chero h1, .peditorial-copy h2, .bhero h1/p, .mhero h1/p, .mitem-body
   h3) and html-embedded single classes (.coption strong/a, .bempty) that
   none of convert_all.py's rule extractors capture — the same gap found
   and fixed for Careers (see build_careers.py's FIXUPS comment for the
   full explanation). Confirmed via compare-misc.mjs: every WP-only
   typography row traced back to one of these selectors. !important
   because elementor-post-N.css / widget-heading.min.css / base-desktop.css
   all load after botixbo-real.css and set default heading/paragraph
   typography from the Kit, which otherwise wins on source order alone.
   .chero/.bhero/.mhero coexist with .bx-misc on the SAME section element
   (confirmed by reading out/misc-*.json), so these must be compound
   selectors (no space) rather than descendant selectors, or they never
   match at all — this exact mistake was made and caught once already
   for Careers' ".chero h1" rule. */
.botixbo .chero.bx-misc h1{font-size:clamp(36px,4.8vw,54px) !important;font-weight:800 !important;letter-spacing:-.02em}
.botixbo .bx-misc .peditorial-copy h2{font-size:clamp(28px,3.2vw,40px) !important;font-weight:800 !important;letter-spacing:-.01em;margin-bottom:18px}
/* "Our Mission"/"Our Vision" on About are bare <h3> with no wrapping
   class of their own — on the real site they simply inherit ordinary
   body text (Tailwind's preflight resets h1-h6 font-size/weight to
   inherit); confirmed by finding no ".peditorial-copy h3" rule anywhere
   in program.css/company.css. Elementor's own Kit default for an
   unstyled heading widget is 28px/500, so without this the two h3s render
   as small headings instead of plain paragraph-weight text. */
.botixbo .bx-misc .peditorial-copy h3{font-size:16px !important;font-weight:400 !important}
.botixbo .bx-misc .coption strong{display:block !important;font-size:15px !important;color:var(--heading);margin-bottom:6px}
.botixbo .bx-misc .coption a{color:var(--blue) !important;font-weight:600 !important;font-size:14.5px !important}
.botixbo .bhero.bx-misc h1{font-size:clamp(38px,5vw,58px) !important;font-weight:800 !important;letter-spacing:-.02em}
.botixbo .bhero.bx-misc p{color:var(--muted) !important;font-size:17px !important;max-width:560px;margin:16px auto 0}
.botixbo .bx-misc .bempty{text-align:center;color:var(--muted) !important;padding:60px 0}
.botixbo .mhero.bx-misc h1{font-size:clamp(34px,4.4vw,50px) !important;font-weight:800 !important;letter-spacing:-.02em}
.botixbo .mhero.bx-misc p{color:var(--muted) !important;font-size:16px !important;max-width:520px;margin:14px auto 0}
.botixbo .bx-misc .mitem-body h3{font-size:16px !important;font-weight:700 !important;margin:4px 0;line-height:1.4}
.botixbo .bx-misc .mfeatured-outlet span{font-weight:700 !important;font-size:14px !important;color:var(--heading)}
.botixbo .bx-misc .mdemo-badge{display:inline-block;font-family:var(--mono);font-size:10px !important;font-weight:700 !important;letter-spacing:.08em;text-transform:uppercase;color:#b45309 !important;background:#fef3c7;padding:3px 9px;border-radius:999px;margin-left:8px;vertical-align:middle}
.botixbo .bx-misc .mfeatured-body h2{font-size:clamp(20px,2.4vw,28px) !important;font-weight:800 !important;letter-spacing:-.01em;margin-bottom:10px;line-height:1.3}
.botixbo .bx-misc .mfeatured-body p{color:var(--muted) !important;font-size:14.5px !important;line-height:1.65;margin-bottom:16px}
.botixbo .bx-misc .mitem-logo{width:44px;height:44px;flex-shrink:0;border-radius:8px;overflow:hidden;position:relative;background:var(--soft);display:flex;align-items:center;justify-content:center;font-weight:700 !important;font-size:13px !important;color:var(--muted) !important}
.botixbo .bx-misc .mitem-meta{font-size:12.5px !important;color:var(--muted-2) !important}

/* ======================= PHONE LAYOUT — INNER PAGES
   The Solutions, Services and Programs templates. Their grids already
   collapse to one column on a phone, so the problem is not structure —
   it is spacing. Every section carries 80-88px of padding top and bottom,
   and each grid adds a 44-56px top margin, so a twelve-section page spends
   well over 2000px on gaps alone before any content.

   Two changes: tighten that rhythm, and keep the genuinely compact items
   (topic chips, feature tiles, related cards) two-up rather than letting
   them stack full-width, which is what made these pages feel endless.

   Everything is behind 640px; tablet and desktop geometry is untouched. */
@media (max-width:640px){
  .botixbo .phero{padding:26px 0 44px !important;}
  .botixbo .peditorial,
  .botixbo .ptopics,
  .botixbo .pjourney,
  .botixbo .pprojects,
  .botixbo .poutcomes,
  .botixbo .pschool,
  .botixbo .ptestimonial,
  .botixbo .prelated,
  .botixbo .pfaq,
  .botixbo .pbands,
  .botixbo .pequip,
  .botixbo .pformat,
  .botixbo .swhat,
  .botixbo .scurriculum,
  .botixbo .steacher,
  .botixbo .sstudent,
  .botixbo .ssupport,
  .botixbo .scases,
  .botixbo .sprocess,
  .botixbo .sdeliver,
  .botixbo .swho,
  .botixbo .simpact,
  .botixbo .ldirectory{padding:48px 0 !important;}

  /* grids sit 44-56px below their heading on desktop; far too much when
     the heading is already only a line or two from the top of the screen */
  .botixbo .ptopics-grid,
  .botixbo .pequip-grid,
  .botixbo .pprojects-grid,
  .botixbo .poutcomes-grid,
  .botixbo .prelated-grid,
  .botixbo .swhat-grid,
  .botixbo .ssupport-grid,
  .botixbo .scases-grid{margin-top:26px !important;}
  .botixbo .pjourney-track{margin-top:30px !important; gap:24px !important;}
  .botixbo .scurriculum-track{margin-top:28px !important; gap:20px !important;}
  .botixbo .phero-bands{margin-top:22px !important;}
  .botixbo .phero-cta{margin-top:22px !important;}

  /* Compact items stay two-up. A topic chip is a dot and two words; a
     full-width row per chip is what turned these lists into screenfuls. */
  .botixbo .ptopics-grid,
  .botixbo .ptopics-grid > .elementor-container,
  .botixbo .elementor-section.bx-ptopics-grid > .elementor-container{
    grid-template-columns:1fr 1fr !important;
    gap:10px !important;
  }
  .botixbo .ptopic{padding:13px 12px !important; font-size:13.5px !important; gap:9px !important;}
  .botixbo .swhat-grid,
  .botixbo .swhat-grid > .elementor-container,
  .botixbo .elementor-section.bx-swhat-grid > .elementor-container{
    grid-template-columns:1fr 1fr !important;
    gap:10px !important;
  }
  /* a grid item defaults to min-width:auto, so a long label widens its
     track past the screen — the same fault the homepage tech list had */
  .botixbo .ptopic, .botixbo .ptopic *,
  .botixbo .swhat-card, .botixbo .swhat-card *{min-width:0 !important;}

  /* the dark school panel's inner padding is still desktop-sized */
  .botixbo .pschool-inner{padding:32px 20px !important;}

  /* equipment chips read fine three-up at this size and halve the rows */
  .botixbo .pequip-grid,
  .botixbo .pequip-grid > .elementor-container,
  .botixbo .elementor-section.bx-pequip-grid > .elementor-container{
    grid-template-columns:repeat(3,1fr) !important;
    gap:8px !important;
  }
  .botixbo .pequip-item{padding:10px 8px !important; font-size:11.5px !important;}
  .botixbo .pequip-item, .botixbo .pequip-item *{min-width:0 !important;}

  /* poutcomes-grid goes two-up at 920px and has no smaller breakpoint, so
     on a 320px screen the two tracks cannot fit and the cards ran off the
     right edge — measured on eight Programs pages. One column below 420. */
  .botixbo .poutcome, .botixbo .poutcome *{min-width:0 !important;}
  .botixbo .poutcome{padding:18px 16px !important;}

  /* Related-programme cards were the single largest use of height across
     all 29 pages (30,000px summed). At one column each card is a
     353x220 image plus its body — roughly 310px per card, four to six
     cards per page. Two-up halves the rows and shortens each one. */
  .botixbo .prelated-grid,
  .botixbo .prelated-grid > .elementor-container,
  .botixbo .elementor-section.bx-prelated-grid > .elementor-container{
    grid-template-columns:1fr 1fr !important;
    gap:12px !important;
  }
  .botixbo .prelated-body{padding:11px 12px 14px !important;}
  .botixbo .prelated-body h3{font-size:13.5px !important; line-height:1.25 !important;}
  .botixbo .prelated-body p{font-size:12px !important; line-height:1.45 !important;}
  .botixbo .prelated-card, .botixbo .prelated-card *{min-width:0 !important;}

  /* the testimonial card keeps its 48px/40px desktop padding on a phone */
  .botixbo .ptestimonial-card{
    padding:26px 20px !important; margin-top:26px !important; border-radius:18px !important;
  }
  .botixbo .ptestimonial-quote{font-size:17px !important; line-height:1.45 !important;}
  .botixbo .ptestimonial-person{margin-top:18px !important; gap:11px !important;}
  .botixbo .ptestimonial-avatar{width:42px !important; height:42px !important;}

  /* Below 420px two columns of outcome cards genuinely do not fit — each
     card carries 16px of padding a side and the headings do not
     hyphenate, which is what pushed them off the right edge. */
  @media (max-width:420px){
    .botixbo .poutcomes-grid,
    .botixbo .poutcomes-grid > .elementor-container,
    .botixbo .elementor-section.bx-poutcomes-grid > .elementor-container{
      grid-template-columns:1fr !important;
    }
  }

  /* headings and leads carry desktop measures into a 353px column */
  .botixbo .phero-title{line-height:1.06 !important;}
  .botixbo .sec-title{line-height:1.14 !important;}
  .botixbo .sec-sub{font-size:15px !important; line-height:1.55 !important;}
}

/* The ported design styles every dropdown link as a single-line list row:
   `.botixbo .navi-menu a{display:block;padding:10px 16px;white-space:nowrap}`.
   That selector is (0,2,1) and `.botixbo .mm-card` is only (0,2,0), so it
   won — the card descriptions refused to wrap, the grid overflowed its
   track and the promo column was painted over the second column of cards.
   Reset it here, and scope the card rules through .navi-mega so they are
   (0,3,0) and outrank it. */
.botixbo .navi-mega a:not(.mm-cta){
  white-space:normal;
  /* padding is intentionally NOT reset here: .mm-card sets its own
     16px/18px and is (0,3,0). This reset rule is (0,3,1) - the .mm-cta
     class stashed inside :not() plus the bare "a" type selector both
     add to its specificity - so a padding:0 here would beat .mm-card's
     own padding and win, which is exactly what happened: every card
     rendered with zero padding until this was removed. */
  border-radius:inherit;
  font-weight:inherit;
}
.botixbo .navi-mega a:not(.mm-cta):hover{background:none;}
/* .mm-cta is excluded above rather than reset and rebuilt: it is a real
   .btn.btn-primary, so leaving it alone keeps the site's own button —
   gradient, shadow, hover lift — instead of a second copy of those
   values here that would drift from the design. */
.botixbo .navi-mega a.mm-cta{white-space:nowrap;}

/* ===================================================== MEGA MENU
   Solutions / Programs / Services. Replaces the 220px-wide list
   dropdown with the panel design: eyebrow, heading and lead on the
   left, a two-up card grid under them, and a promo column on the right.

   Only these three groups get it (.navi-mega); Impact and Resources keep
   the simple list, which suits two and one entries respectively.

   The panel is centred on the viewport rather than aligned to its
   trigger: at 1100px a 1140px panel hung off the right edge when opened
   from "Services". Centring is also why it needs position:fixed — an
   absolutely-positioned panel is trapped in the header's 1200px wrap.
   ------------------------------------------------------------------ */
.botixbo .navi-menu.navi-mega{
  position:fixed;
  top:var(--bx-header-h,88px);
  left:50%;
  transform:translateX(-50%);
  width:min(1180px, calc(100vw - 48px));
  max-height:calc(100dvh - var(--bx-header-h,88px) - 24px);
  overflow-y:auto;
  padding:0;
  border-radius:18px;
  border:1px solid var(--line);
  background:#fff;
  box-shadow:0 40px 80px -40px rgba(15,23,42,.42);
}
@supports not (height:100dvh){
  .botixbo .navi-menu.navi-mega{
    max-height:calc(100vh - var(--bx-header-h,88px) - 24px);
  }
}

/* The trigger and the panel no longer touch, so the pointer would leave
   .navi crossing the gap and the panel would close. A transparent bridge
   across the gap keeps :hover alive without shifting the layout. */
.botixbo .navi:has(.navi-mega)::after{
  content:"";
  position:absolute;
  top:100%;
  left:-24px; right:-24px;
  height:18px;
}

.botixbo .mm{
  display:grid;
  grid-template-columns:minmax(0,1.72fr) minmax(0,1fr);
  gap:0;
  align-items:stretch;
}
.botixbo .mm-main{padding:30px 30px 32px; min-width:0;}

.botixbo .mm-eyebrow{
  font-family:var(--mono);
  font-size:11px; font-weight:500; letter-spacing:.15em;
  text-transform:uppercase; color:var(--muted-2, #94a3b8);
  margin:0 0 10px;
}
.botixbo .mm-title{
  font-family:var(--disp);
  font-size:26px; font-weight:700; letter-spacing:-.02em;
  color:var(--heading, #0f172a); margin:0;
}
.botixbo .mm-lead{
  font-size:14.5px; line-height:1.5; color:var(--muted);
  margin:8px 0 0; max-width:60ch;
}

.botixbo .mm-grid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:12px;
  margin-top:22px;
}
/* 2 columns, not 3. A true 3-up layout was tried (compact icon, tighter
   padding, smaller type) and "School Competitions" / "Government
   Projects" still wrapped to two lines at every width the panel's own
   max-width allows - there simply isn't enough room in a 3-way split of
   this panel for both of those titles to stay on one line without
   shrinking the cards to look visibly smaller than the ones above them.
   2 columns is the layout that keeps every title on one line at every
   width, which is what was asked for. */
.botixbo .mm-grid-3{grid-template-columns:1fr 1fr;}

/* Two different treatments for a trailing card alone in the final row:

   Programs' "AR / VR / MR" (9 items in a 2-column grid) spans the full
   row as one wide card - icon, text and arrow on one line - matching the
   reference supplied for it.

   Services' "Government Projects" (3rd of 3 in Partnerships) instead
   stays centred at the same half-width its siblings use, which is how it
   already looked and was confirmed to be correct as-is.

   The Partnerships grid element carries BOTH classes
   (`class="mm-grid mm-grid-3"`), so the plain rule needs :not(.mm-grid-3)
   to reach only the main .mm-grid - otherwise it would also match the
   Partnerships grid and fight the more specific .mm-grid-3 rule below. */
.botixbo .navi-mega .mm-grid:not(.mm-grid-3) > .mm-card:last-child:nth-child(odd){
  grid-column:1 / -1;
}
.botixbo .navi-mega .mm-grid-3 > .mm-card:last-child:nth-child(odd){
  grid-column:1 / -1;
  max-width:calc(50% - 6px);
  justify-self:center;
}

/* Each card is a real anchor, so the whole tile is one tab stop and one
   click target — no overlay trick needed here. */
.botixbo .navi-mega .mm-card{
  display:grid;
  grid-template-columns:auto minmax(0,1fr) auto;
  align-items:start;
  gap:14px;
  padding:16px 18px;
  border:1px solid var(--line);
  border-radius:13px;
  background:#fff;
  text-decoration:none;
  transition:border-color .2s var(--ease,ease), transform .2s var(--ease,ease),
             box-shadow .2s var(--ease,ease);
}
.botixbo .navi-mega .mm-card:hover{
  border-color:rgba(37,99,235,.35);
  transform:translateY(-2px);
  box-shadow:0 14px 28px -18px rgba(15,23,42,.3);
}
.botixbo .mm-ico{
  width:46px; height:46px; border-radius:13px;
  display:grid; place-items:center; flex-shrink:0;
  /* the tile sits on the first text line, not the middle of a two-line
     card - which is what the design shows and what looked misaligned */
  align-self:start;
}
.botixbo .mm-ico svg{width:23px; height:23px;}
.botixbo .mm-txt{display:block; min-width:0;}
.botixbo .mm-txt strong{
  display:block;
  font-family:var(--disp);
  font-size:15.5px; font-weight:700; line-height:1.3;
  color:var(--heading, #0f172a);
}
/* The real shortDescriptions run to a full sentence or two; the design
   shows one or two lines, so clamp rather than truncate the source. */
.botixbo .mm-desc{
  display:-webkit-box;
  -webkit-line-clamp:2;
  -webkit-box-orient:vertical;
  overflow:hidden;
  margin-top:4px;
  font-size:13px; line-height:1.5; color:var(--muted);
}
.botixbo .mm-go{
  width:18px; height:18px; color:var(--blue);
  /* Always shown. Revealing it on hover meant a visitor could not tell a
     card was a link until the pointer was already on it, and it made the
     row look unfinished against the design. */
  align-self:center;
  flex-shrink:0;
  transition:transform .2s var(--ease,ease);
}
.botixbo .navi-mega .mm-card:hover .mm-go{transform:translateX(3px);}

.botixbo .mm-sublabel{
  font-family:var(--mono);
  font-size:10.5px; font-weight:500; letter-spacing:.14em;
  text-transform:uppercase; color:var(--muted-2, #94a3b8);
  margin:20px 0 10px;
  padding-top:16px;
  border-top:1px solid var(--line);
}

/* ---- promo column ----
   A real photo (each panel's own --mm-photo custom property, set inline
   per menu in build_megamenu.py) sits behind a gradient that keeps the
   text legible over the top-left of the image while the photo itself
   stays visible lower-right, same composition as the reference posters.
   Layered as two background-images rather than a separate overlay
   element, since nothing here needs to be an independent DOM node. */
.botixbo .mm-side{
  position:relative;
  padding:28px 26px 0;
  background-image:
    linear-gradient(135deg,
      rgba(238,244,255,.97) 0%, rgba(238,244,255,.92) 38%,
      rgba(238,244,255,.55) 62%, rgba(238,244,255,.22) 100%),
    var(--mm-photo);
  background-size:cover, cover;
  background-position:center, center;
  border-left:1px solid var(--line);
  border-radius:0 18px 18px 0;
  display:flex; flex-direction:column;
  justify-content:space-between;
  min-width:0;
  overflow:hidden;
}
.botixbo .mm-side-top{position:relative; z-index:1;}
.botixbo .mm-side-title{
  font-family:var(--disp);
  font-size:27px; font-weight:700; line-height:1.16; letter-spacing:-.02em;
  color:var(--heading, #0f172a); margin:0;
}
/* Every heading line is its own <span> now (build_megamenu.py writes
   one per line of the design's heading, 2 or 3 depending on the menu),
   stacked with display:block rather than joined by <br> - simpler to
   colour a middle line blue without a second element. */
.botixbo .mm-side-title span{display:block;}
.botixbo .mm-side-title span.mm-side-blue{color:var(--blue);}
.botixbo .mm-side-lead{
  font-size:13.5px; line-height:1.55; color:var(--muted);
  margin:10px 0 18px;
}
.botixbo .navi-mega .mm-cta{
  align-self:flex-start;
  display:inline-flex; align-items:center; gap:8px;
  font-size:14px;
}
.botixbo .navi-mega .mm-cta svg{width:16px; height:16px;}

/* Handwritten annotation - a real Google Font (Caveat), not a scripted
   approximation, giving the panel the same informal, marker-pen note the
   reference posters carry ("Labs that Inspire" etc). Sits under the CTA,
   tilted slightly so it reads as an annotation rather than body copy. */
.botixbo .mm-note{
  display:flex; align-items:flex-start; gap:6px;
  margin-top:16px;
  font-family:'Caveat', cursive;
  font-size:20px; font-weight:700; line-height:1.15;
  color:var(--blue); transform:rotate(-3deg);
  max-width:70%;
}
.botixbo .mm-note-arrow{
  width:34px; height:26px; flex-shrink:0; margin-top:6px;
  color:var(--blue); opacity:.8;
}

/* Stat strip - the site's own verified figures (see build_megamenu.py's
   STATS table), in the icon+number+label format the reference posters
   use for their (unverified) numbers. Sits on its own light band at the
   foot of the panel so it reads clearly over the photograph beneath it. */
.botixbo .mm-stats{
  position:relative; z-index:1;
  display:flex; align-items:flex-start;
  gap:0;
  margin-top:20px;
  padding:16px 0 18px;
  border-top:1px solid rgba(15,23,42,.08);
  background:rgba(255,255,255,.72);
  backdrop-filter:blur(2px);
}
.botixbo .mm-stat{
  flex:1 1 0;
  display:flex; flex-direction:column; align-items:flex-start;
  gap:3px;
  padding:0 12px;
  border-left:1px solid rgba(15,23,42,.1);
}
.botixbo .mm-stat:first-child{border-left:0;}
.botixbo .mm-stat-ico{
  width:26px; height:26px; margin-bottom:2px;
  display:flex; align-items:center; justify-content:center;
  color:var(--blue);
}
.botixbo .mm-stat-ico svg{width:18px; height:18px;}
.botixbo .mm-stat-num{
  font-family:var(--disp); font-size:19px; font-weight:800;
  color:var(--heading, #0f172a); line-height:1;
}
.botixbo .mm-stat-label{
  font-size:11px; line-height:1.3; color:var(--muted);
  font-weight:500;
}

/* ---- icon tones, matching the design's coloured tiles ---- */
.botixbo .mm-ico.t-blue{background:#e8efff; color:#2563eb;}
.botixbo .mm-ico.t-violet{background:#f1ebfe; color:#7c3aed;}
.botixbo .mm-ico.t-green{background:#e6f6ef; color:#0f9d63;}
.botixbo .mm-ico.t-amber{background:#fdf1e3; color:#d97706;}
.botixbo .mm-ico.t-pink{background:#fdeaf2; color:#db2777;}
.botixbo .mm-ico.t-teal{background:#e4f5f7; color:#0e90a8;}

/* ---- laptop: the promo column is the first thing to give ---- */
@media (max-width:1365px){
  .botixbo .navi-menu.navi-mega{width:min(1080px, calc(100vw - 36px));}
  .botixbo .mm{grid-template-columns:minmax(0,1.75fr) minmax(0,1fr);}
  .botixbo .mm-side-title{font-size:22px;}
  .botixbo .mm-title{font-size:21px;}
}
/* ---- small laptop: drop the promo column, keep the cards two-up ---- */
@media (max-width:1200px){
  .botixbo .navi-menu.navi-mega{width:calc(100vw - 32px);}
  .botixbo .mm{grid-template-columns:minmax(0,1fr);}
  .botixbo .mm-side{
    border-left:0; border-top:1px solid var(--line);
    border-radius:0 0 18px 18px;
    /* bottom stays 0, same reasoning as the base rule: .mm-stats supplies
       its own vertical padding so the strip's band reaches the edge */
    padding:20px 24px 0;
  }
  .botixbo .mm-grid-3{grid-template-columns:1fr 1fr;}
}

/* ==========================================================
   MEGA MENU — POLISH OVERRIDE (user-authored, folded into the
   canonical theme source so future automated redeploys no longer
   silently revert it — see BOTIXBO_MEGAMENU_MERGE_REPORT.md).
   Stats-bar icon/number layout (mm-stat-ico/mm-stat-num) intentionally
   NOT applied here: it assumes new fill-based stat icons paired with
   placeholder marketing numbers (500+/100K+); this site's stat icons
   are stroke-based and show real, verified counts (11/9/8/9), so
   forcing fill:currentColor;stroke:none would render them blank/wrong.
   ========================================================== */

.botixbo{
  --mm-note-size:17px;
  --mm-lead-color:#3b4a5f;
}

.botixbo .navi-menu.navi-mega{
  top:calc(var(--bx-header-h,88px) - 2px) !important;
}

.botixbo .navi:has(.navi-mega)::after{
  top:100% !important;
  height:32px !important;
}

.botixbo .mm-side{
  background-image:
    linear-gradient(to bottom, rgba(255,255,255,.16) 0%, rgba(255,255,255,.07) 24%, rgba(255,255,255,0) 44%),
    var(--mm-photo) !important;
  background-color:transparent !important;
  background-repeat:no-repeat !important;
  background-size:cover !important;
  background-position:center center !important;
}

.botixbo .mm-side::before{
  background:linear-gradient(to bottom, rgba(255,255,255,.10) 0%, rgba(255,255,255,0) 44%) !important;
  opacity:1 !important;
  pointer-events:none !important;
}

.botixbo .navi-mega .mm-go{
  display:block !important;
  width:20px !important;
  height:20px !important;
  flex:0 0 20px !important;
  color:#1677f9 !important;
  opacity:1 !important;
  visibility:visible !important;
}

.botixbo .navi-mega .mm-card{
  grid-template-columns:46px minmax(0,1fr) 20px !important;
  align-items:center !important;
}

.botixbo .mm-grid-3{
  display:grid !important;
  grid-template-columns:repeat(3,minmax(0,1fr)) !important;
  gap:12px !important;
  width:100% !important;
}

.botixbo .mm-grid-3 > .mm-card,
.botixbo .mm-grid-3 > .mm-card:last-child:nth-child(odd){
  width:auto !important;
  min-width:0 !important;
  max-width:none !important;
  grid-column:auto !important;
  justify-self:stretch !important;
}

.botixbo .navi-mega .mm-ico.ic-blue{background:#e6f0ff !important}
.botixbo .navi-mega .mm-ico.ic-violet{background:#f0e9ff !important}
.botixbo .navi-mega .mm-ico.ic-yellow{background:#fff5d1 !important}
.botixbo .navi-mega .mm-ico.ic-orange{background:#ffeedb !important}
.botixbo .navi-mega .mm-ico.ic-green{background:#e0f7e9 !important}
.botixbo .navi-mega .mm-ico.ic-pink{background:#ffe5eb !important}
.botixbo .navi-mega .mm-ico.ic-teal{background:#dcf7f2 !important}
.botixbo .navi-mega .mm-ico.ic-cyan{background:#dcf3fb !important}

.botixbo .navi-mega .mm-ico svg{
  transform:scale(1.05) !important;
  transform-origin:center !important;
}

.botixbo .nav-links > .navi:nth-child(1) .mm-note,
.botixbo .nav-links > .navi:nth-child(3) .mm-note{
  font-size:var(--mm-note-size) !important;
  line-height:1.2 !important;
}

.botixbo .mm-side .mm-side-lead{
  color:var(--mm-lead-color) !important;
}

/* .mm-side uses justify-content:space-between, which pins the stats bar
   to the very bottom of the panel — as tall as the left card grid (up to
   4 rows for Solutions). On short viewports the panel's own max-height/
   overflow-y:auto then clips mid-row through the stats bar, which looks
   like it's overlapping the page behind it. Pulling stats up with a fixed
   gap instead keeps it comfortably inside the visible area. */
.botixbo .mm-side{justify-content:flex-start !important;}
.botixbo .mm-stats{margin-top:auto !important;}

/* Stats bar layout — now safe to apply: stat icons above were swapped to
   fill-based SVGs (cap/people/trophy) to match this rule's fill:currentColor
   expectation, while keeping the real, verified numbers/labels intact. */
.botixbo .mm-stats{
  display:grid !important;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1.3fr) !important;
  align-items:center !important;
  gap:0 14px !important;
  width:100% !important;
  padding:10px 7px !important;
  background:#fff !important;
  border-top:1px solid rgba(15,23,42,.07) !important;
  border-radius:12px 12px 0 0 !important;
  box-sizing:border-box !important;
}

.botixbo .mm-stat{
  min-width:0 !important;
  display:grid !important;
  grid-template-columns:30px minmax(0,1fr) !important;
  grid-template-rows:auto auto !important;
  column-gap:10px !important;
  row-gap:1px !important;
  align-items:center !important;
  padding:2px 10px !important;
  border-left:0 !important;
}

.botixbo .mm-stat-ico{
  grid-column:1 !important;
  grid-row:1 / span 2 !important;
  width:30px !important;
  height:30px !important;
  margin:0 !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  color:#1677f9 !important;
}
.botixbo .mm-stat-ico svg{
  width:30px !important;
  height:30px !important;
  fill:currentColor !important;
  stroke:none !important;
}

.botixbo .mm-stat-num{
  grid-column:2 !important;
  grid-row:1 !important;
  display:block !important;
  margin:0 !important;
  font-size:16px !important;
  line-height:1.15 !important;
  font-weight:700 !important;
  color:#0f172a !important;
  white-space:nowrap !important;
}
.botixbo .mm-stat-num.mm-stat-num-text{
  font-size:13.5px !important;
  letter-spacing:-.1px !important;
}
.botixbo .mm-stat:last-child{
  padding-right:4px !important;
}
.botixbo .mm-stat-label{
  grid-column:2 !important;
  grid-row:2 !important;
  display:block !important;
  margin:0 !important;
  font-size:12px !important;
  line-height:1.2 !important;
  font-weight:500 !important;
  color:#64748b !important;
  white-space:normal !important;
}


/* Elementor's own per-page CSS sets .elementor-widget-heading
   .elementor-heading-title to the global kit color, at the same
   specificity as our wrapper-level dark-section overrides above and
   loaded after them, so it was winning ties and leaving headings in
   dark sections dark-on-dark. Re-declaring the same overrides one
   level deeper, reaching .elementor-heading-title directly, restores
   the intended white text without touching the wrapper rules. */
.botixbo .sdeliver .sec-title .elementor-heading-title{color:#fff}
.botixbo .services .sec-title .elementor-heading-title{color:#fff}
.botixbo .services .sec-title.blue .elementor-heading-title{color:#fff}
.botixbo .projects .sec-title .elementor-heading-title{color:#fff}
.botixbo .pjourney .sec-title .elementor-heading-title{color:#fff}

/* Human-readable HTML sitemap page (/sitemap/, post 811). Styles Rank
   Math's default HTML Sitemap module output to match the site's design
   system, since Rank Math ships no styling of its own for these classes. */
body.page-id-811 h1{max-width:var(--maxw);margin:0 auto;padding:56px 28px 4px;font-size:clamp(32px,4.5vw,52px);font-weight:800}
body.page-id-811 .rank-math-html-sitemap{max-width:var(--maxw);margin:0 auto;padding:12px 28px 96px}
body.page-id-811 .rank-math-html-sitemap__title{font-family:var(--mono);font-size:12.5px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--blue);margin:20px 0 24px}
body.page-id-811 .rank-math-html-sitemap__section>.rank-math-html-sitemap__list{list-style:none;display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:28px 32px;align-items:start}
body.page-id-811 .rank-math-html-sitemap__link{color:var(--ink);text-decoration:none;transition:color .2s;display:inline-block;padding:2px 0}
body.page-id-811 .rank-math-html-sitemap__link:hover{color:var(--blue)}
body.page-id-811 .rank-math-html-sitemap__section>.rank-math-html-sitemap__list>.rank-math-html-sitemap__item>.rank-math-html-sitemap__link{font-weight:700;font-size:15px;color:var(--heading)}
body.page-id-811 .rank-math-html-sitemap__item .rank-math-html-sitemap__list{list-style:none;margin-top:10px;display:flex;flex-direction:column;gap:8px}
body.page-id-811 .rank-math-html-sitemap__item .rank-math-html-sitemap__list .rank-math-html-sitemap__link{color:var(--muted);font-size:13.5px;font-weight:400}
@media(max-width:600px){
  body.page-id-811 h1{padding:40px 20px 4px}
  body.page-id-811 .rank-math-html-sitemap{padding:8px 20px 72px}
}

/* === BOOKS SHELF RESPONSIVE FIX — 2026-10-01 === */
/* ── Homepage "Learning Beyond the Lab" book shelf — responsive fix ──────────
   .books is an Elementor SECTION, so its only child is .elementor-container;
   the three .book columns live inside that. The earlier rules put the grid on
   the section itself (and used repeat(4,1fr) for three books), so they never
   governed the covers — meanwhile .book kept a hard width:180px !important at
   every breakpoint. Below ~1100px three 180px covers stop fitting and wrap
   into a vertical stack. This applies the same section/container pattern that
   .bx-res-grid already uses, and makes the cover width fluid. */
.botixbo .elementor-section.books{display:block !important;}
.botixbo .elementor-section.books > .elementor-container{
  display:grid !important;
  grid-template-columns:repeat(3,minmax(0,1fr)) !important;
  align-items:start;
  gap:18px !important;
  width:100%;
}
.botixbo .elementor-section.books > .elementor-container > .elementor-column.book{
  width:100% !important;
  max-width:180px !important;
  min-width:0 !important;
  flex:0 0 auto !important;
}
@media(max-width:1100px){
  .botixbo .elementor-section.books > .elementor-container{gap:14px !important;}
  .botixbo .elementor-section.books > .elementor-container > .elementor-column.book{max-width:none !important;}
}
@media(max-width:480px){
  .botixbo .elementor-section.books > .elementor-container{gap:10px !important;}
}

/* === FOOTER RESPONSIVE FIX — 2026-10-01 === */
/* ── Footer responsive fix ──────────────────────────────────────────────
   .foot-grid has FIVE children (.foot-brand + 4x .fcol) but collapses to a
   2-column grid at <=1000px and stays 2-up all the way down to phones. With
   five items in two columns the last one ("Contact") is orphaned beside an
   empty half, and the shorter brand block leaves a tall ragged gap before
   the next row. Below ~400px the narrow columns also wrapped link labels
   ("AI & Robotics Labs", "Composite Skill Lab") onto two lines.
   Giving the brand its own full-width row turns the four link columns into a
   clean 2x2 at every width below the 5-column desktop layout, and widens
   each column enough that the labels fit on one line. */
@media(max-width:1000px){
  .botixbo .foot-grid > .foot-brand{grid-column:1 / -1;}
  .botixbo .foot-brand p{max-width:none;}
}
@media(max-width:640px){
  .botixbo .foot-grid{grid-template-columns:1fr 1fr; gap:30px 20px;}
}

/* === HEADER LOGO RESPONSIVE FIX — 2026-10-01 === */
/* ── Header logo responsive fix ─────────────────────────────────────────
   .logo .lockup is a fixed 176x52 box at EVERY width, with no media query
   reducing it. Since the logo image is position:absolute/width:100% inside
   that box, it never scales down: at 430px it occupies 41% of the screen,
   at 390px 45%, and at 360px 49% - nearly half the viewport. Step the box
   down on phones. Aspect ratio is preserved (object-fit:contain already
   letterboxes the image, so the logo itself is never distorted).
   .nav height is deliberately left alone - sticky-header scroll offsets
   elsewhere in this file depend on it. */
@media(max-width:640px){
  .botixbo header .logo .lockup{width:150px; height:45px;}
}
@media(max-width:400px){
  .botixbo header .logo .lockup{width:134px; height:40px;}
}
