/*! ============================================================================
 * Idea Factory — SHARED SITE STYLES  (v1.2.0)
 * DO NOT EDIT IN WEBFLOW. Source of truth = GitHub repo idea-factory-umd/idea-factory-site.
 * Loaded site-wide via jsDelivr <link> in Project Settings > Custom Code (Head).
 * Layers (cascade order): v1 base (logo, stages, audience, proof, manifesto, news,
 * events, hero base) -> content-grow -> nav/dropdown/hero-word/footer -> CSE modal.
 * ========================================================================== */

/* ===== base layer (logo hover, stages, find-your-way-in, proof, manifesto, news, events) ===== */
/* ============================================================
   Idea Factory — custom motion & styling for Webflow
   ------------------------------------------------------------
   Host this file (e.g. GitHub + jsDelivr) and load it in Webflow
   site/page custom code (head):
     <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/<user>/<repo>@<ver>/idea-factory.css">

   Every rule keys off a CLASS you assign in the Webflow Designer.
   Swapping an image/photo through Webflow's "Replace image" keeps
   the class, so the motion carries over automatically.
   ============================================================ */

/* ---- shared easing tokens ---- */
:root {
  --if-ease-glide:  cubic-bezier(0.16, 1, 0.3, 1);          /* smooth decelerate (news/date zoom) */
  --if-ease-spring: cubic-bezier(0.34, 1.7, 0.5, 1);        /* overshoot spring (glyphs, audience) */
  --if-ease-window: cubic-bezier(0.34, 1.56, 0.64, 1);      /* window twinkle overshoot */
  --if-dur-zoom:    720ms;
}

/* ============================================================
   0. TYPOGRAPHY — one supplemental safety line only (2026-07-01)
   Design system = two faces: Interstate (sans) + Georgia (serif); Arial
   must never render. The tagline (.if-tag-p -> Georgia) and the hero lead
   (.if-hero-lead -> Interstate) are now set NATIVELY in the Webflow
   Designer — they are intentionally NOT in this file anymore.
   The single line below is the only exception: Webflow's built-in
   body{Arial} default has no MCP style handle ("body" not found), so this
   guarantees nothing falls back to Arial suite-wide. TO GO FULLY NATIVE:
   set the Body (All Pages) tag font to Interstate in the Designer, then
   delete this line.
   ============================================================ */
/* ---- FONT: Interstate + weight-matched Overpass fallback (Polish/CE support) — 2026-07-02 ----
   Adobe's Interstate web cut lacks the Polish nasal/accented glyphs (Ą Ę Ż Ć Ń Ś Ź). This adds a
   self-hosted Overpass (open-source, same Highway-Gothic DNA) as a PER-CHARACTER fallback: English/
   Latin still renders in Interstate (first in the stack); only the glyphs Interstate lacks fall
   through to Overpass — instead of a mismatched Arial. Fully invisible: no UI control, no Designer
   change, nothing to publish per page — it just lives here in the shared file, suite-wide.
   WEIGHT-MATCHED so a swapped-in Polish letter matches its Interstate neighbours (measured ink-mass):
     OverpassFB 400 -> Overpass wght 330  (= Interstate 400, ratio 1.00)
     OverpassFB 500 -> Overpass wght 520  (= Interstate 500 Medium, ratio 1.00)
     OverpassFB 700 -> Overpass wght 780  (= Interstate 700, ratio 1.00)
     OverpassFB 800 -> Overpass wght 900, then outline-emboldened (dilated ~20u/2000em) to reach
                       Interstate 800 (ratio 1.00). Overpass's native max (900) only got 0.89; the
                       overpass-pl-800.woff2 file has genuinely thickened outlines to close the gap.
   The Adobe kit now ships 400/500/700/800 (500 = the Medium added for the Georgia-adjacent link text).
   A 300 request has no Interstate face -> renders Interstate 400; OverpassFB likewise has no 300, so
   its 300 falls to the 400 face too — matched behaviour at every weight.
   size-adjust:102.7% matches Overpass's x-height to Interstate. Dial a weight: re-instance the file. */
@font-face{font-family:'OverpassFB';src:url('overpass-pl-400.woff2') format('woff2');font-weight:400;font-display:swap;size-adjust:102.7%;}
@font-face{font-family:'OverpassFB';src:url('overpass-pl-500.woff2') format('woff2');font-weight:500;font-display:swap;size-adjust:102.7%;}
@font-face{font-family:'OverpassFB';src:url('overpass-pl-700.woff2') format('woff2');font-weight:700;font-display:swap;size-adjust:102.7%;}
@font-face{font-family:'OverpassFB';src:url('overpass-pl-800.woff2') format('woff2');font-weight:800;font-display:swap;size-adjust:102.7%;}
:root{--if-sans:Interstate,'OverpassFB',"Helvetica Neue",Arial,sans-serif;--if-serif:Georgia,"Times New Roman",serif;}
/* ⭐ FUTURE-PROOF (2026-07-02): every custom class is `if-`-prefixed (project convention, §3), so we
   apply the sans + Overpass-fallback stack to ALL if- classes — present AND any newly created one —
   plus body. A brand-new class therefore CANNOT miss the Polish fallback (it no longer depends on a
   hand-maintained list). The 6 Georgia (serif) classes are the only exceptions; they are
   restored on the next line (declared AFTER, same specificity, so serif wins). Non-if selectors are
   untouched: webflow-icons (`.w-icon-` classes), the Google-CSE `.gs-` and `.gsc-` result text, forms.
   To ADD a serif class in future, append it to the exception line; sans needs no maintenance. */
body,[class^="if-"],[class*=" if-"]{font-family:var(--if-sans)!important;}
.if-aud-intro,.if-event-row-meta,.if-input,.if-mani-p,.if-prog-desc,.if-tag-p{font-family:var(--if-serif)!important;}
/* BOLD inside serif (Georgia) body copy -> weight-matched Interstate that melds with Georgia
   (weight 700 + letter-spacing -0.4px, the if-inline-link tuning from §20). Color INHERITS (stays
   black) because this is emphasis, not a link. Fires automatically on any <strong>/<b> the user
   bolds in the Designer inside these serif classes — no per-element class needed. A direct rule on
   the child beats the parent's inherited Georgia; the broad if- sans rule already agrees on family.
   To cover a NEW serif class, append its `b,strong` pair here. (Non-if serif: premise-lead,
   syn-loop-txt, move-desc, cta-fine are the native-Georgia body classes.) */
.if-aud-intro b,.if-aud-intro strong,.if-event-row-meta b,.if-event-row-meta strong,
.if-mani-p b,.if-mani-p strong,.if-prog-desc b,.if-prog-desc strong,.if-tag-p b,.if-tag-p strong,
.premise-lead b,.premise-lead strong,.syn-loop-txt b,.syn-loop-txt strong,
.move-desc b,.move-desc strong,.cta-fine b,.cta-fine strong{
  font-family:var(--if-sans);font-weight:700;letter-spacing:-0.4px;
}
/* Nav dropdown caret is a Webflow icon glyph (.w-icon-dropdown-toggle) that also carries an if- class
   (.if-toggle-caret) — the broad if- rule above would force Interstate onto it and render tofu, so keep
   the icon font. Any future icon element that also has an if- class must be added here too. */
.if-toggle-caret{font-family:"webflow-icons"!important;}

/* ============================================================
   1. HERO reading highlight  (JS drives .if-hero-word opacity)
   ============================================================ */
.if-hero-word { transition: opacity 0.28s ease-out; }
.if-hero-h1.is-settling .if-hero-word { transition-duration: 0.95s; } /* gentle final fade-up */
.if-hero-h1.font-pending { visibility: hidden; }                       /* font-load gate */

/* ============================================================
   2. MANIFESTO sentence lift  (JS toggles classes)
   ============================================================
   The real .if-manifesto-line rules live further down, in the big "nav / dropdowns /
   hero-word / footer hovers" block - found 2026-09-09 that THIS section used to
   redeclare the exact same selectors with DIFFERENT values (0.55s/var(--if-ease-glide)
   here vs the live 0.37s/cubic-bezier further down), and since equal-specificity CSS
   ties resolve by source order, this earlier copy NEVER actually applied - it was
   provably dead weight the whole time, confirmed via a real browser measurement, not
   assumed. Removed rather than left to confuse a future reader (or a future edit that
   "fixes" this copy again without knowing it's inert). The live copy's own will-change
   bug is fixed at its actual location - see that block for the note. */
/* Manifesto: "where ideas get built." starts black and turns red only when its line is
   highlighted by the grow, then HOLDS red (if-lit-red added by the JS on lift, never removed).
   color:inherit keeps it black at rest even before the native red is republished. */
.if-mani-red{color:inherit;transition:color .45s ease;}
.if-mani-red.if-lit-red{color:#e21833;}
/* Read-line: footer-CTA-style word-by-word read on any .if-readline heading. Words dim then
   brighten one-by-one; the wrapped accent (.if-mani-red child) reddens as it is reached and holds.
   Only opacity here — the accent color transition lives on .if-mani-red above. */
.if-rl-word{transition:opacity 0.28s cubic-bezier(0.22,1,0.36,1);}
.rl-settling .if-rl-word{transition-duration:2.4s;transition-timing-function:ease-out;}
/* Walk-the-Factory wayfinding bar (About): parent-hover-child reveal — box turns white
   (native :hover), the greyscale glyph goes full-colour and the label darkens. Can't be a
   native Designer style (parent hover targeting a child), so it lives here. */
.if-walk-item:hover .if-walk-glyph,.if-walk-item.is-current .if-walk-glyph{filter:none;}
.if-walk-item:hover .if-walk-num,.if-walk-item.is-current .if-walk-num{color:#e21833;}
.if-walk-item:hover .if-walk-name,.if-walk-item.is-current .if-walk-name{color:#111111;}
/* "Current" state (walk-spy JS adds .is-current to the button whose linked stage is scrolled into
   view): full colour (via the combinators above) PLUS a red left bar that stays on regardless of
   hover. A hovered-but-not-current item is full colour too (native :hover, background only) but
   has NO bar — the bar is what marks the current item; hovering it just keeps the bar.
   NOTE: .if-walk-item.is-current's OWN background/box-shadow/border-left is a NATIVE Designer
   combo class (create_style, parent if-walk-item) — same element, so Webflow CAN represent it
   directly (matches the if-backtotop.is-visible precedent). Only the cross-element cascade above
   (parent class recolouring the child glyph/num/name) has to live here — Webflow has no way to
   make one element's class restyle a *different* element. */
/* Walk bar is one slim row (matches the red nav height); on narrow widths it scrolls
   horizontally instead of wrapping — hide the scrollbar so the pinned bar stays clean. */
.if-walk-row{scrollbar-width:none;-ms-overflow-style:none;}
.if-walk-row::-webkit-scrollbar{display:none;}
/* Walk bar STACKS once the one-row buttons can't shrink further (~880px, measured with real
   Interstate): the label goes inline ("WALK THE FACTORY | Jump to a stage ›") on its own full-width
   row, then the four buttons become two full-width rows of two (2x2). Custom breakpoint (Webflow only
   offers 991/767/479) + the "|" pseudo-element → this must live in the shared file, not the Designer.
   Full-bleed BOTH edges here (base already bleeds right; add left) so the button rows span edge-to-edge. */
@media (max-width:880px){
  .if-walk-row{flex-wrap:wrap;margin-left:calc(50% - 50vw);}
  .if-walk-label{flex-basis:100%;flex-direction:row;align-items:baseline;justify-content:flex-start;padding:8px 24px;}
  .if-walk-label-sub{margin-top:0;}
  .if-walk-label-sub::before{content:"|";margin:0 .55em;color:#c9c9c9;font-weight:400;}
  .if-walk-item{flex-basis:50%;border-top:1px solid #e6e6e6;padding-left:12px;padding-right:12px;justify-content:center;}
  .if-walk-glyph{width:28px;height:28px;}
  .if-walk-name{font-size:12px;}
}
/* Walk-the-Factory bar DUPLICATE (MIPS-Apply, program-page-mips-apply-walkcopy-*): every class
   renamed so this copy can be restyled independently of the About-page original above. Same
   parent-hover-child reveal + custom-breakpoint stacking, ported verbatim under the new names. */
.program-page-mips-apply-walkcopy-item:hover .program-page-mips-apply-walkcopy-glyph,.program-page-mips-apply-walkcopy-item.program-page-mips-apply-walkcopy-current .program-page-mips-apply-walkcopy-glyph{filter:none;}
.program-page-mips-apply-walkcopy-item:hover .program-page-mips-apply-walkcopy-num,.program-page-mips-apply-walkcopy-item.program-page-mips-apply-walkcopy-current .program-page-mips-apply-walkcopy-num{color:#e21833;}
.program-page-mips-apply-walkcopy-item:hover .program-page-mips-apply-walkcopy-name,.program-page-mips-apply-walkcopy-item.program-page-mips-apply-walkcopy-current .program-page-mips-apply-walkcopy-name{color:#111111;}
/* The small dot marker before each walkcopy item is grey at rest AND on hover — it lights up
   red ONLY for the current item, making it its own distinct "you are here" cue (separate from
   the hover-brightens-everything behavior above). Scoped to inside a walkcopy-item so the base
   .program-page-mips-apply-tl-dot-page-nav class's own color stays untouched anywhere else it's used. */
.program-page-mips-apply-walkcopy-item .program-page-mips-apply-tl-dot-page-nav{background-color:#9a9a9a;}
.program-page-mips-apply-walkcopy-item.program-page-mips-apply-walkcopy-current .program-page-mips-apply-tl-dot-page-nav{background-color:#e21833;}
.program-page-mips-apply-walkcopy-row{scrollbar-width:none;-ms-overflow-style:none;}
.program-page-mips-apply-walkcopy-row::-webkit-scrollbar{display:none;}
/* Responsive stacking (3-col Tablet, 2-col Phone-Horizontal) is now handled by NATIVE Designer
   medium/small breakpoint overrides on program-page-mips-apply-walkcopy-item, per HARD RULE #2 —
   the old custom @media(880px) block that used to live here (mirroring the About-page original
   above) has been removed; it would otherwise conflict with the native breakpoints in the
   767-880px range. */

/* Hides the gold "Apply" CTA (.if-give-btn-solid) from the MIPS mobile/hamburger dropdown ONLY —
   desktop and every other spinoff's identical button are untouched (the combo class below is
   MIPS-only). A plain native display:none on the combo can't win here: the in-site st0 layout
   embed carries `.if-navmenu .if-give-btn-solid{display:block!important}` (same (0,2,0)
   specificity, but !important — which beats a non-important rule regardless of specificity, and
   Webflow's Designer style panel has no way to mark a property !important). Fix = the same
   out-specify technique already used against this embed elsewhere in this file (see the nav
   current-marker rules, §13 in CLAUDE.md): one class higher specificity (0,3,0) + !important of
   our own beats the embed's (0,2,0) + !important outright, regardless of source order. */
@media screen and (max-width:991px){
  .if-navmenu .if-give-btn-solid.program-page-mips-navbtn-hidemobile{display:none!important;}
}

/* ============================================================
   3. STAGE photo + headline  (JS sets transform/opacity inline)
   ============================================================ */
.if-stage-photo { transform-origin: 38% 36%; backface-visibility: hidden; }
.if-stage-text  { }
/* .if-stage-photo/.if-stage-text: NOT the "will-change managed by JS" fix this project already
   shipped for the CURRENT stage-parallax generation (.if-stage-photo-pos, in the later consolidated
   block below) - these are the LEGACY selectors, kept only as an alias per this file's own "never
   delete a class name, alias it" rule (a spinoff could still carry the old markup). Found here 2026-
   09-09 with a genuine, still-live, permanent will-change on .if-stage-text (the legacy class exists
   here in the CSS but .if-stage-photo currently matches nothing on any live page - .if-stage-text,
   however, is NOT namespaced the same way and this exact selector is shared with the aliased current
   effect's own target, so it was silently pinning a compositor layer on Home's stage headline this
   whole time, even after the B3 fix was believed complete). Removed; the JS module already manages
   will-change dynamically for whichever image/text elements it actually finds. */

/* ============================================================
   4. NEWS photo hover-zoom  (CSS only — image-agnostic)
   In Webflow use normal Image elements: put overflow:hidden on the
   image's WRAPPER and class the wrapper `.if-news-photo`.
   ============================================================ */
.if-news-photo { overflow: hidden; }
.if-news-photo img {
  display: block; width: 100%; height: 100%; object-fit: cover;
  transition: transform var(--if-dur-zoom) var(--if-ease-glide);
}
.if-news-card:hover .if-news-photo img { transform: scale(1.11); will-change: transform; }

/* ============================================================
   5. EVENT date hover-zoom  (CSS only)
   ============================================================ */
.if-event-date {
  transition: transform var(--if-dur-zoom) var(--if-ease-glide); transform-origin: center center;
}
.if-event-feat:hover .if-event-date { transform: scale(1.11); }   /* featured: big day+month */
.if-event-datetext {
  display: inline-flex; flex-direction: column; align-items: center;
  transition: transform var(--if-dur-zoom) var(--if-ease-glide); transform-origin: center center;
}
.if-event-row:hover .if-event-datetext { transform: scale(1.12); } /* agenda: text only, box still */

/* ============================================================
   6. GLYPH spring-up hover
   The four colored stage boxes stay fixed; only the glyph inside
   each springs up and scales with an overshoot curve.
   Assign .if-stage-cell to the <a> wrapper and .if-stage-glyph
   to the glyph <img> or <svg> inside it.
   ============================================================ */
.if-stage-cell { transform: none !important; }  /* box never lifts */
.if-stage-glyph,
.if-stage-cell > img,
.if-stage-cell > svg {
  transition: transform 520ms var(--if-ease-spring);
  transform-origin: center;
}
.if-stage-cell:hover .if-stage-glyph,
.if-stage-cell:hover > img,
.if-stage-cell:hover > svg {
  transform: scale(1.32);
  will-change: transform;
}

/* ============================================================
   7. AUDIENCE CELL lift + text grow  (CSS only)
   The whole card lifts (grows + drop shadow) on hover, matching
   the news/program card family (.if-nfeat/.if-nrow/.if-prog-card).
   The title h3 AND the description paragraph inside additionally
   grow together, anchored left so they grow in place.
   Assign .if-aud-cell to each audience card <a>.
   ============================================================ */
.if-aud-cell {
  transition: box-shadow 320ms cubic-bezier(0.22,1,0.36,1), transform 320ms cubic-bezier(0.34,1.55,0.42,1);
}
.if-aud-cell:hover {
  transform: scale(1.035);
  box-shadow: 0 12px 32px rgba(0,0,0,0.16);
  position: relative;
  z-index: 2;
  will-change: transform, box-shadow;
}
.if-aud-cell h3,
.if-aud-cell .if-aud-desc {
  transition: transform 520ms var(--if-ease-glide);
  transform-origin: left center;
}
.if-aud-cell:hover h3,
.if-aud-cell:hover .if-aud-desc {
  transform: scale(1.12);
  will-change: transform;
}

/* ============================================================
   8. LOGO hover: scale lift  (CSS only)
   Quick snap in (110ms, decisive easeOut), slow easeInOutQuint
   release (420ms). Targets the logo by position — the direct
   img/svg child of the .if-logo-link wrapper. The legacy
   .if-logo-mark class selector is kept as a harmless fallback.
   .if-logo-img-hdr added 2026-09-10: the current, correct logo
   implementation is a plain div painted via that class's own
   background-image (see if-logo-img-hdr's own Designer style) —
   ASPIRE/MIPS/Minor apply it alongside .if-logo-mark on one element,
   but Ventures/CBSCF/I-Corps needed it re-applied standalone (an
   MCP tool limitation prevents assigning 2 independent classes to
   one element in one call), so this selector must match it alone too.
   Assign .if-logo-link to each logo <a>/<span> wrapper.
   ============================================================ */
.if-logo-link > img,
.if-logo-link > svg,
.if-logo-mark,
.if-logo-img-hdr {
  transition: transform 420ms cubic-bezier(0.83, 0, 0.17, 1);
  transform-origin: center;
}
.if-logo-link:hover > img,
.if-logo-link:hover > svg,
.if-logo-link:hover .if-logo-mark,
.if-logo-link:hover .if-logo-img-hdr {
  transition-duration: 110ms;
  transition-timing-function: cubic-bezier(0.3, 0, 0.2, 1);
  transform: scale(1.05);
  will-change: transform;
}

/* ============================================================
   9. NAV DROPDOWN sublink text grow  (CSS only)
   The visible label text within each dropdown item grows slightly
   on hover, anchored left so surrounding layout doesn't shift.
   Assign .if-nav-sublink to the dropdown <a> and
   .if-nav-sublink-text to a <span> wrapping its label text.
   ============================================================ */
.if-nav-sublink-text {
  display: inline-block;
  transform-origin: left center;
  transition: transform 200ms ease-out;
}
.if-nav-sublink:hover .if-nav-sublink-text { transform: scale(1.07); }

/* ============================================================
   11. GOLD ACCENT BARS
   The 16px gold vertical bar that appears in the identity band
   (header) and runs the full height of the footer and proof
   section, aligned to the container's right edge.

   Header bar: starts at mid-logo height, runs to band bottom;
     top is set dynamically by JS (initHeaderGoldBar).
   Footer bar: runs from top to the Give button's baseline;
     height is set dynamically by JS (initFooterGoldBar).
   Proof bar: runs from section top to ~52px above the bottom.

   The bevelled angle (~10°, 2.8px over 16px) mirrors the angle
   of the logo's gold "window" top edge.
   ============================================================ */
.if-header-gold-bar {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  /* top is set by initHeaderGoldBar() in idea-factory.js */
  background: #ffd200;
  clip-path: polygon(0 0, 100% 2.8px, 100% 100%, 0 100%); /* bevelled top */
}

.if-footer-gold-bar {
  position: absolute;
  top: 0; right: 0;
  width: 16px;
  /* height is set by initFooterGoldBar() in idea-factory.js */
  height: 70%; /* fallback until JS measures */
  background: #ffd200;
  pointer-events: none;
  clip-path: polygon(0 0, 100% 0, 100% calc(100% - 2.8px), 0 100%); /* bevelled bottom */
  z-index: 3;
}

.if-proof-gold-bar {
  position: absolute;
  top: 0; right: 0;
  width: 16px;
  height: calc(100% - 52px); /* terminates above section bottom, within the padding */
  background: #ffd200;
  pointer-events: none;
  clip-path: polygon(0 0, 100% 0, 100% calc(100% - 2.8px), 0 100%); /* bevelled bottom */
  z-index: 3;
}

/* ============================================================
   12. Reduced motion — show final state, never animate
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  /* Original effects */
  .if-hero-word, .if-manifesto-line  { opacity: 1 !important; transform: none !important; }
  .if-stage-photo, .if-stage-photo-pos, .if-stage-text { transform: none !important; opacity: 1 !important; }
  .if-hero-h1.font-pending           { visibility: visible !important; }
  .if-news-photo img                 { transition: none !important; }
  .if-event-date, .if-event-datetext { transition: none !important; }
  /* New effects */
  .if-stage-glyph, .if-stage-cell > img, .if-stage-cell > svg,
  .if-aud-cell h3,
  .if-logo-link > img, .if-logo-link > svg, .if-logo-mark, .if-logo-img-hdr,
  .if-logo-window,
  .if-nav-sublink-text { transition: none !important; animation: none !important; transform: none !important; }
}

/* ===== content-grow hover ===== */
.if-flag-btn:hover .if-grow-inner{transform:scale(1.07)}.if-btn-primary:hover .if-grow-inner{transform:scale(1.06)}.program-page-ventures-hero-btn:hover .if-grow-inner{transform:scale(1.06)}.program-page-cbscf-impprev-btn:hover .if-grow-inner{transform:scale(1.06)}.program-page-cbscf-criteria-btn:hover .if-grow-inner{transform:scale(1.06)}.program-page-cbscf-apply-submitbtn:hover .if-grow-inner{transform:scale(1.06)}
.program-page-ventures-next-box:hover .program-page-ventures-next-textwrap{transform:scale(1.04)}
.program-page-ventures-hours-box-btn:hover .program-page-ventures-hours-box-btn-textwrap{transform:scale(1.04)}
.program-page-ventures-impact-more-cell-link:hover .program-page-ventures-impact-more-cell-textwrap{transform:scale(1.06)}
.program-page-cbscf-impact-more2-cell-link:hover .program-page-cbscf-impact-more2-cell-textwrap{transform:scale(1.06)}

/* ===== NAV CURRENT-PAGE MARKERS + ROLLOVERS — CLASS-DRIVEN & PORTABLE =====
   These rules key ONLY off: (a) the site nav container (.if-navmenu / .if-navroot),
   (b) Webflow's native .w--current (auto-applied to the link whose href matches the page
   being viewed), and (c) the nav class contract below — NEVER off a specific href, page id,
   element id, text, or item position. So when you reorder items, retarget links, or build
   whole new menus in a spin-off, the markers follow automatically. (Webflow will NOT compile
   a hand-made .w--current combo — unused-in-Designer — so these live here, not in Designer.)
   `.if-dd-wrap:has(.w--current)` fires for ANY dropdown holding the current page, not one
   named dropdown.

   NAV CLASS CONTRACT — put these classes on a nav item and it "just works":
     top-level link ...... .if-nav-link      dropdown wrapper .... .if-dd-wrap
     dropdown toggle ..... .if-ddtoggle       dropdown list ....... .if-dd-list
     dropdown sub-item ... .if-nav-sublink
   Easiest way to stay in contract: DUPLICATE an existing classed item instead of dragging
   in a raw element. SAFETY NET: each rule below also matches by position + Webflow's own
   nav classes (w-nav / w-dropdown*), scoped inside .if-navmenu, so even a raw un-if-classed
   item still gets the correct marker. */

/* TOP-LEVEL current link — dark-red fill + gold underline.
   Hook: .if-nav-link.w--current. Net: any current <a> in the menu that is NOT a dropdown
   sub-item (i.e. not inside a dropdown list). Excludes .if-give-btn-solid: a same-page
   anchor href (e.g. "#how-to-apply") resolves to "the current page" just like a real page
   link, so Webflow marks it current too — but that class is a solid branded CTA button, not
   a plain nav link, so it must never take the current-page look. Also excludes
   .if-navlink-text (2026-09-10): a dropdown TOGGLE whose own label is itself a direct link
   (e.g. Ventures' "Incubator") gets .w--current on that inner <a> too, since its href also
   resolves to the current page — but marking the TOGGLE is redundant/wrong when the
   dropdown's own sub-item (.if-nav-sublink) already carries the real "you are here" marker;
   the toggle still gets its own separate gold-underline cue below (:has(.w--current)). */
.if-nav-link.w--current,
.if-navmenu a.w--current:not(.if-nav-sublink):not(.if-dd-list a):not(.w-dropdown-list a):not(.if-give-btn-solid):not(.if-navlink-text){
  background-color:#a40f23;border-bottom-color:#ffd200;
}
/* DROPDOWN sub-item current — red left bar marks the current page inside the dropdown
   (the item's hover still operates over it). Also neutralizes Webflow's default blue link
   color. Mobile re-colors the label red below.
   Hook: .if-nav-sublink.w--current. Net: any current <a> inside a dropdown list.
   The bar is drawn as a SOLID ::before, NOT an inset box-shadow: a box-shadow on the row
   renders a faint red fringe around the WHOLE row when the row scales on hover (a GPU
   compositing artifact, visible on Retina/real hardware). A solid pseudo-element can't. */
.if-nav-sublink.w--current,
.if-navmenu .if-dd-list a.w--current,
.if-navmenu .w-dropdown-list a.w--current{
  color:#1a1a1a;position:relative;
}
.if-nav-sublink.w--current::before,
.if-navmenu .if-dd-list a.w--current::before,
.if-navmenu .w-dropdown-list a.w--current::before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:#e21833;pointer-events:none;
}
/* Suppress any box-shadow on the current sub-item on hover (e.g. the in-site st0
   !important red-bar-on-hover) so the scaling row can't fringe; the ::before bar stays.
   Doubled .if-navmenu out-specifies st0's (0,3,0)!important rule. */
.if-navmenu.if-navmenu .if-nav-sublink.w--current:hover,
.if-navmenu.if-navmenu .if-dd-list a.w--current:hover,
.if-navmenu.if-navmenu .w-dropdown-list a.w--current:hover{
  box-shadow:none !important;
}
/* DESKTOP: when a dropdown holds the current page, gold-underline its TOGGLE in the red
   bar (closed-state cue — this is the underline UNDER THE TERM in the red menu, a separate
   thing from the dropdown box's top edge). The white dropdown box (.if-dd-list) has NO gold
   top line anymore — removed 2026-07-02 per user (it read inconsistently: shown on
   non-current dropdowns, hidden on the current one). */
@media screen and (min-width:992px){
  .if-dd-wrap:has(.w--current) .if-ddtoggle,
  .if-navmenu .w-dropdown:has(.w--current) .w-dropdown-toggle{border-bottom-color:#ffd200;}
  /* either/or: once THIS dropdown opens (hover or .if-open), drop the toggle underline —
     the red bar on the current sub-item is the indicator instead. */
  .if-dd-wrap:has(.w--current):hover .if-ddtoggle,
  .if-dd-wrap:has(.w--current).if-open .if-ddtoggle,
  .if-navmenu .w-dropdown:has(.w--current):hover .w-dropdown-toggle,
  .if-navmenu .w-dropdown:has(.w--current).w--open .w-dropdown-toggle{border-bottom-color:transparent;}
}
/* MOBILE (hamburger, white menu) — user-approved 2026-07-01:
   • HOVER (any item) = brand-red text + grow (scale), NO gold hatch, NO background.
   • CURRENT page = red left bar (::before) with NORMAL (non-red) text — red is a HOVER-ONLY
     color here. The bar is the "you are here" cue; hovering the current item also reddens it.
   NOTE: the in-site st0 embed has a !important hover rule at `.if-navmenu …:hover` (0,3,0) that
   sets a red left-bar + `transform:none`. Doubling `.if-navmenu` here → (0,4,0) out-specifies it,
   so ours win (grow + no bar on hover) without touching st0. Marker uses ::before (not box-shadow)
   so it survives the hover `box-shadow:none` and can't fringe when the row scales. */
@media screen and (max-width:991px){
  /* CURRENT marker: red left bar via ::before; text matches its normal siblings (not red). */
  .if-navmenu.if-navmenu .if-nav-link.w--current,
  .if-navmenu.if-navmenu .if-nav-sublink.w--current,
  .if-navmenu.if-navmenu a.w--current:not(.if-give-btn-solid):not(.if-navlink-text){
    background-color:transparent !important;
    background-image:none !important;
    border-bottom-color:#e6e6e6 !important;
    box-shadow:none !important;
    position:relative;
  }
  .if-navmenu.if-navmenu .if-nav-link.w--current{color:#000 !important;}          /* top-level: black */
  .if-navmenu.if-navmenu .if-nav-sublink.w--current{color:#7f7f7f !important;}    /* sub-item: gray */
  /* (kept at specificity (0,4,0) so the :hover rule below wins the tie and reddens on hover) */
  /* .if-navlink-text excluded here too (2026-09-10): see the desktop rule's comment above —
     a dropdown toggle that's also a direct link (Ventures' "Incubator") must not get this
     red left bar; its dropdown's own current sub-item already carries the real marker. */
  .if-navmenu.if-navmenu a.w--current:not(.if-give-btn-solid):not(.if-navlink-text)::before{
    content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:#e21833;pointer-events:none;
  }
  /* HOVER = GROW ONLY (no red, no hatch, no background). The grow is on the INNER text
     (.if-mtext) — the ORIGINAL smooth mobile grow — NOT the whole row. Scaling the full-width
     anchor fought st0's own .if-mtext scale (double transform) and snapped back wildly; the
     anchor is left un-scaled (st0's resting `transform:none`) so only the text grows, smoothly.
     Per-type colors cancel st0's hover darkening so nothing shifts but the text size. */
  .if-navmenu.if-navmenu .if-nav-link:hover,
  .if-navmenu.if-navmenu .w-dropdown-toggle:hover,
  .if-navmenu.if-navmenu .if-nav-sublink:hover{
    box-shadow:none !important;
    background-color:transparent !important;
    background-image:none !important;
  }
  .if-navmenu.if-navmenu .if-nav-link:hover .if-mtext,
  .if-navmenu.if-navmenu .w-dropdown-toggle:hover .if-mtext,
  .if-navmenu.if-navmenu .if-nav-sublink:hover .if-mtext{
    transform:scale(1.07) !important;transform-origin:left center !important;
  }
  .if-navmenu.if-navmenu .if-nav-link:hover,
  .if-navmenu.if-navmenu .w-dropdown-toggle:hover{color:#000 !important;}     /* top-level/toggle stay black */
  .if-navmenu.if-navmenu .if-nav-sublink:hover{color:#7f7f7f !important;}     /* sub-item stays gray */
}

/* Desktop only: the shared JS (module "nav") wraps every nav-link's text in an inner
   <span class="if-mtext"> at runtime. As a plain child of an inline-flex .if-nav-link it
   becomes its own nested flex item, sized independently of the outer box — which can leave
   the outer box measuring one thing while the text wraps against another. display:contents
   removes the span's own box so its text is the outer box's direct sizing content again,
   matching the un-wrapped markup. Mobile (≤991px) overrides this back to inline-block below,
   where a real box is needed for the hover-scale transform. */
@media screen and (min-width:992px){
  .if-navmenu .if-mtext{display:contents;}
}

/* ===== MOBILE MENU — STRUCTURAL STABILITY, SITEWIDE (2026‑07‑24) =====
   Found: About's hamburger menu diverged from Home's — dropdown sub-items
   (News/About) collapsed instead of staying always-visible (so the current-page
   marker above couldn't be seen without tapping first), the search icon sat at
   the wrong position, and some links rendered as centered pills instead of
   full-width left-aligned rows. Home's own per-page embed happened to still
   carry a `!important` override that masked this; About's copy of that embed
   never had it, so the two pages silently diverged — and every future page
   duplicated from either would inherit whichever behavior its source page had.
   Root cause: .if-dd-wrap/.if-dd-list ARE real Webflow Dropdown widgets —
   Webflow's own `.w-dropdown-list{display:none}` is toggled via JS/inline style,
   which ONLY an `!important` CSS rule can beat; a plain native Designer style
   property cannot (it has no !important option and loses the cascade tie).
   That makes "always-expanded dropdown" a genuine Webflow-can't-do-this-natively
   case (same family as the hover-grow .if-mtext rules above) — so it belongs
   HERE, in the one shared, sitewide file, not copy-pasted per page. Every page
   that loads idea-factory.css — current or newly duplicated — now gets the
   identical, correct behavior from this single source. */
@media screen and (max-width:991px){
  .if-navmenu .if-dd-wrap{display:block !important;position:static !important;width:100% !important;}
  .if-navmenu .if-dd-list{
    display:block !important;position:static !important;opacity:1 !important;
    overflow:visible !important;box-shadow:none !important;background-color:transparent !important;
    min-width:0 !important;width:100% !important;transform:none !important;
  }
  .if-navmenu .if-toggle-caret{display:none !important;}
  .if-navmenu .if-nav-link,
  .if-navmenu .w-dropdown-toggle,
  .if-navmenu .if-nav-sublink{text-align:left !important;}
  .if-navmenu .if-msearch{
    background-position:right 14px center !important;
    background-repeat:no-repeat !important;
    background-size:18px 18px !important;
  }
}

/* ===== nav / dropdowns / hero-word / footer hovers ===== */
.if-navbar,.if-navbar-in,.if-header{overflow:visible !important;}.if-navbar-in{flex-wrap:nowrap !important;}.if-dd-wrap .if-dd-list{display:none;}.if-dd-wrap.if-open .if-dd-list,.if-dd-wrap:hover .if-dd-list,.if-dd-list:hover{display:block !important;}.if-dd-list{z-index:1000 !important;overflow:hidden;}.if-toggle-caret{transition:transform .18s ease;}.if-dd-wrap.if-open .if-toggle-caret,.if-dd-wrap:hover .if-toggle-caret{transform:rotate(180deg);}.if-nav-sublink{transition:transform .18s ease, background-color .15s ease;transform-origin:left center;}.if-nav-sublink:hover{transform:scale(1.07);}.if-search-input{background-position:right 14px center !important;background-repeat:no-repeat !important;background-size:18px 18px !important;}.if-search-realinput{flex:1 1 auto;min-width:0;background:transparent;border:0;outline:0;margin:0;padding:0;font:inherit;color:#1a1a1a;line-height:1.2;-webkit-appearance:none;appearance:none;}.if-search-realinput::placeholder{color:#7f7f7f;opacity:1;}.if-search-realinput::-webkit-search-cancel-button{-webkit-appearance:none;}.if-cse-overlay{position:fixed;inset:0;z-index:99999;display:none;background:rgba(0,0,0,0.55);padding:6vh 16px;overflow:auto;}.if-cse-overlay.if-open{display:block;}.if-cse-modal{max-width:760px;margin:0 auto;background:#fff;border-radius:6px;box-shadow:0 24px 60px rgba(0,0,0,0.3);padding:20px 22px 30px;position:relative;}.if-cse-head{font-family:"Interstate","Helvetica Neue",Arial,sans-serif;font-weight:800;font-size:18px;line-height:1.2;margin:0 44px 14px 0;color:#1a1a1a;word-break:break-word;}.if-cse-loading{font-family:"Interstate","Helvetica Neue",Arial,sans-serif;font-size:14px;color:#7f7f7f;padding:8px 0;}.if-cse-close{position:absolute;top:10px;right:10px;width:36px;height:36px;border:0;background:transparent;font-size:28px;line-height:1;color:#7f7f7f;cursor:pointer;border-radius:4px;}.if-cse-close:hover{color:#e21833;background:#f4f2f0;}.if-hdr-goldcol{margin-left:0 !important;}.if-hero-word{transition:opacity .28s cubic-bezier(0.22,1,0.36,1),color .45s ease;}.if-hero-word-red.if-lit-red{color:#e21833;}.if-hero-h1.hero-settling .if-hero-word{transition-duration:2.4s;transition-timing-function:ease-out;}.if-btn-primary{transition:background .15s ease,border-color .15s ease,color .15s ease,transform .15s ease !important;}.if-btn-primary:hover{background:#c2142b !important;border-color:#c2142b !important;}.if-btn-primary:active{background:#a40f23 !important;border-color:#a40f23 !important;transform:translateY(1px);}.if-grow-box:hover .if-grow-inner{transform:scale(1.06);}.program-page-mips-impact-archivebtn-gap:hover .if-grow-inner{transform:scale(1.06);}.program-page-mips-impact-closing-cta-btn:hover .if-grow-inner{transform:scale(1.06);}.if-backtotop-arrow{transition:transform .22s cubic-bezier(0.22,1,0.36,1);transform-origin:center center;}.if-backtotop:hover .if-backtotop-arrow{transform:rotate(-45deg) scale(1.3);}.if-btn-outline-light{transition:background-color 220ms cubic-bezier(0.22,1,0.36,1),color 220ms cubic-bezier(0.22,1,0.36,1),border-color 220ms cubic-bezier(0.22,1,0.36,1);}.if-btn-outline-light:hover{background-color:#fff;color:#e21833;border-color:#fff;}.if-btn-outline-red{transition:background-color 220ms cubic-bezier(0.22,1,0.36,1),color 220ms cubic-bezier(0.22,1,0.36,1),border-color 220ms cubic-bezier(0.22,1,0.36,1);}.if-btn-outline-red:hover{background-color:#e21833;color:#fff;border-color:#e21833;}.if-hover-grow{transition:transform 220ms cubic-bezier(0.22,1,0.36,1);}.if-hover-grow:hover{transform:scale(1.05);will-change:transform;}.if-hover-grow-t{display:inline-block;transition:transform 220ms cubic-bezier(0.22,1,0.36,1);transform-origin:center center;}.if-hover-grow:hover .if-hover-grow-t{transform:scale(1.04);will-change:transform;}.if-foot-accent{background-image:linear-gradient(90deg,#ffd200 0%,#ffd200 50%,#fff 50%,#fff 70%,#e21833 70%,#e21833 100%)!important;background-repeat:repeat-x!important;background-size:100% 100%!important;}.if-foot-accent-1,.if-foot-accent-2,.if-foot-accent-3{display:none!important;}.if-manifesto-line{display:inline-block;transform-origin:left center;transition:transform 0.37s cubic-bezier(0.16,1,0.3,1),text-shadow 0.37s cubic-bezier(0.16,1,0.3,1),opacity 0.37s cubic-bezier(0.16,1,0.3,1);/*will-change managed by the manifesto-lift JS around its one-shot sequence only, not permanent - B3, 2026-09-09*/}.if-manifesto-line.is-lift{transform:translateY(-3px) scale(1.11);text-shadow:0 9px 16px rgba(0,0,0,0.30);position:relative;z-index:2;}.if-manifesto.is-dimming .if-manifesto-line{opacity:0.86;}.if-manifesto.is-dimming .if-manifesto-line.is-lift{opacity:1;}.if-stage-photo-pos{transform-origin:38% 36%;backface-visibility:hidden;}.if-stage-text{transform-origin:right center;}.if-news-photo{overflow:hidden;}.if-news-photo .if-img-cover{transition:transform 720ms cubic-bezier(0.16,1,0.3,1);}.if-ncard:hover .if-news-photo .if-img-cover{transform:scale(1.11);will-change:transform;}.if-nfeat{overflow:hidden;transition:box-shadow 320ms cubic-bezier(0.22,1,0.36,1),transform 320ms cubic-bezier(0.34,1.55,0.42,1);}.if-nfeat:hover{transform:scale(1.035);box-shadow:0 12px 32px rgba(0,0,0,0.16);position:relative;z-index:2;will-change:transform,box-shadow;}.if-news-cardtext{transition:transform 320ms cubic-bezier(0.34,1.55,0.42,1);transform-origin:center center;}.if-nfeat:hover .if-news-cardtext{transform:scale(1.05);will-change:transform;}.if-nrow{overflow:hidden;transition:box-shadow 320ms cubic-bezier(0.22,1,0.36,1),transform 320ms cubic-bezier(0.34,1.55,0.42,1);}.if-nrow:hover{transform:scale(1.035);box-shadow:0 12px 32px rgba(0,0,0,0.16);position:relative;z-index:2;will-change:transform,box-shadow;}.if-nrowtext{transition:transform 320ms cubic-bezier(0.34,1.55,0.42,1);transform-origin:center center;}.if-nrow:hover .if-nrowtext{transform:scale(1.05);will-change:transform;}.program-page-mips-contact-staff-card:hover .program-page-mips-contact-staff-inner{transform:scale(1.05);}.if-event-feat{transition:box-shadow 320ms cubic-bezier(0.22,1,0.36,1),transform 320ms cubic-bezier(0.34,1.55,0.42,1);}.if-event-feat:hover{transform:scale(1.035);box-shadow:0 12px 32px rgba(0,0,0,0.16);position:relative;z-index:2;will-change:transform,box-shadow;}.if-event-feat-top,.if-event-feat>div:last-child{transition:transform 320ms cubic-bezier(0.34,1.55,0.42,1);transform-origin:center center;}.if-event-feat:hover .if-event-feat-top,.if-event-feat:hover>div:last-child{transform:scale(1.035);will-change:transform;}.if-event-feat-top>div{display:flex;align-items:baseline;gap:10px;transition:transform 720ms cubic-bezier(0.16,1,0.3,1);transform-origin:center center;}.if-event-feat:hover .if-event-feat-top>div{transform:scale(1.11);will-change:transform;}.if-event-row{transition:box-shadow 320ms cubic-bezier(0.22,1,0.36,1),transform 320ms cubic-bezier(0.34,1.55,0.42,1);}.if-event-row:hover{background-color:#ffffff;transform:scale(1.035);box-shadow:0 12px 32px rgba(0,0,0,0.16);position:relative;z-index:2;will-change:transform,box-shadow;}.if-event-rowtext{transition:transform 320ms cubic-bezier(0.34,1.55,0.42,1);transform-origin:center center;}.if-event-row:hover .if-event-rowtext{transform:scale(1.035);will-change:transform;}.if-eachip-black,.if-eachip-gold,.if-eachip-red{transition:transform 720ms cubic-bezier(0.16,1,0.3,1);transform-origin:center center;}.if-event-row:hover .if-eachip-black,.if-event-row:hover .if-eachip-gold,.if-event-row:hover .if-eachip-red{transform:scale(1.06);will-change:transform;}.if-eadatetext{transition:transform 720ms cubic-bezier(0.16,1,0.3,1);transform-origin:center center;}.if-event-row:hover .if-eadatetext{transform:scale(1.06);will-change:transform;}.if-event-chev{transition:transform 240ms cubic-bezier(0.22,1,0.36,1);}.if-event-row:hover .if-event-chev{transform:translateX(4px);will-change:transform;}
.program-page-mips-projects-round-card:hover .program-page-mips-projects-round-top,.program-page-mips-projects-round-card:hover .program-page-mips-projects-round-num{transform:scale(1.05);}.if-foot-cta-word{transition:opacity 0.28s cubic-bezier(0.22,1,0.36,1),color .45s ease;color:#fff;}.if-foot-cta-gold.if-lit-gold{color:#ffd200;}.if-foot-cta-head.cta-settling .if-foot-cta-word{transition-duration:2.4s;transition-timing-function:ease-out;}@media screen and (min-width:992px){.if-navmenu{max-height:64px;transition:max-height .4s cubic-bezier(.4,0,.2,1),opacity .4s cubic-bezier(.4,0,.2,1);}.if-navmenu.if-nav-tucked{max-height:0;opacity:0;overflow:hidden;pointer-events:none;}.if-nav-companion,.program-page-mips-apply-walkcopy-sec{max-height:64px;transition:max-height .4s cubic-bezier(.4,0,.2,1),opacity .4s cubic-bezier(.4,0,.2,1),padding-top .4s cubic-bezier(.4,0,.2,1),padding-bottom .4s cubic-bezier(.4,0,.2,1);}.if-nav-companion.if-nav-tucked,.program-page-mips-apply-walkcopy-sec.if-nav-tucked{max-height:0;padding-top:0;padding-bottom:0;opacity:0;overflow:hidden;pointer-events:none;}}.if-botnav-hide{display:none!important;}

/* GOLD hero read-word — a first-class parallel to the red one. A word marked if-hero-word-gold is
   lit with if-lit-gold by the hero-reader JS (exactly like if-hero-word-red -> if-lit-red) and held
   at full opacity; the color transition comes from .if-hero-word. White at rest, fades to gold on
   read, then holds. Reusable: put `if-hero-word if-hero-word-gold` on any headline word. */
.if-hero-word-gold.if-lit-gold{color:#ffd200;}

/* ===== CSE search modal ===== */
.gsc-results-wrapper-overlay{position:static!important;top:auto!important;left:auto!important;right:auto!important;bottom:auto!important;width:auto!important;height:auto!important;max-height:none!important;margin:0!important;padding:0!important;box-shadow:none!important;border:0!important;border-radius:0!important;background:transparent!important;z-index:auto!important;opacity:1!important;visibility:visible!important;transition:none!important;}.gsc-modal-background-image,.gsc-modal-background-image-visible{display:none!important;opacity:0!important;}.gsc-results-close-btn,.gsc-results-close-btn-visible{display:none!important;}.if-cse-overlay{background:rgba(0,0,0,0.78)!important;}.if-cse-overlay,.if-cse-overlay *{scrollbar-width:none!important;-ms-overflow-style:none!important;}.if-cse-overlay::-webkit-scrollbar,.if-cse-overlay *::-webkit-scrollbar{width:0!important;height:0!important;display:none!important;}.if-cse-modal{border-top:0!important;border-radius:6px 0 6px 6px!important;padding:20px 42px 30px 22px!important;overflow:visible!important;}.if-cse-modal::after{content:'';position:absolute;top:0;right:0;bottom:var(--gold-bottom,30px);width:14px;background:#ffd200;clip-path:polygon(0 0,100% 0,100% calc(100% - 2.5px),0 100%);z-index:3;}.if-cse-modal::before{content:'';position:absolute;top:0;left:0;right:0;height:4px;background:#e21833;border-radius:6px 0 0 0;z-index:4;}.if-cse-head{font-family:'Interstate','Helvetica Neue',Arial,sans-serif!important;font-weight:800!important;font-size:22px!important;color:#e21833!important;letter-spacing:.01em;margin:0 26px 0 0!important;padding-bottom:14px;border-bottom:1px solid #ececec;word-break:break-word;}.if-cse-close{right:26px!important;z-index:5!important;}.if-cse-close:hover{background:transparent!important;}.if-msearch:focus-within{box-shadow:inset 0 -2px 0 #e21833!important;border-bottom-color:#1a1a1a!important;outline:none!important;}.if-foot-logolink,.if-umd-wordmark-link{transition:transform .22s cubic-bezier(.22,1,.36,1);}.if-foot-logolink:hover,.if-umd-wordmark-link:hover{transform:scale(1.05);will-change:transform;}.if-umd-wordmark-link{display:inline-block;text-decoration:none;line-height:0;cursor:pointer;}.if-cse-modal .gsc-above-wrapper-area{padding:14px 0 2px!important;border:0!important;}.if-cse-modal .gsc-result-info{color:#7f7f7f!important;font-family:'Interstate','Helvetica Neue',Arial,sans-serif!important;font-size:13px!important;padding-left:0!important;}.if-cse-modal .gsc-orderby-label,.if-cse-modal .gsc-selected-option-container{color:#7f7f7f!important;font-family:'Interstate','Helvetica Neue',Arial,sans-serif!important;}.if-cse-modal .gsc-webResult.gsc-result{padding:16px 14px!important;margin:0 -14px!important;border:0!important;border-bottom:1px solid #ececec!important;}.if-cse-modal .gsc-webResult.gsc-result:hover{background:#faf9f8!important;}.if-cse-modal a.gs-title,.if-cse-modal .gs-title,.if-cse-modal a.gs-title *{font-family:'Interstate','Helvetica Neue',Arial,sans-serif!important;font-size:18px!important;font-weight:600!important;color:#1a1a1a!important;text-decoration:none!important;line-height:1.3!important;}.if-cse-modal a.gs-title:hover,.if-cse-modal a.gs-title:hover *{color:#e21833!important;text-decoration:underline!important;}.if-cse-modal .gs-visibleUrl,.if-cse-modal .gs-visibleUrl-long,.if-cse-modal .gs-visibleUrl-short{color:#e21833!important;font-family:'Interstate','Helvetica Neue',Arial,sans-serif!important;font-size:13px!important;}.if-cse-modal .gs-snippet{font-family:Georgia,'Times New Roman',serif!important;color:#444!important;font-size:14px!important;line-height:1.55!important;}.if-cse-modal .gs-snippet b{color:#1a1a1a!important;}.if-cse-modal .gsc-cursor-page{color:#e21833!important;font-family:'Interstate','Helvetica Neue',Arial,sans-serif!important;}.if-cse-modal .gsc-cursor-current-page{color:#1a1a1a!important;font-weight:800!important;}

/* ===== Students program directory — filter + card grid (behavior/decorative layer) =====
   Base visual styles are Webflow Designer classes (if-prog-*, if-filter-*). This block holds
   the parts Webflow can't express natively: the striped photo placeholder, the news-card-style
   lift on hover, the filter-pill hover/current(is-active) colors, and the responsive columns.
   The filter itself is class-driven JS in idea-factory.js (keys off .if-filter-pill[data-filter]
   and .if-prog-card[data-tags]). */
.if-prog-photo{background-image:repeating-linear-gradient(135deg,#e9e9e9 0,#e9e9e9 10px,#f4f4f4 10px,#f4f4f4 20px);}
.if-prog-photo img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;transition:transform 320ms cubic-bezier(0.22,1,0.36,1);}
.if-prog-card{transition:transform 240ms cubic-bezier(0.22,1,0.36,1),box-shadow 240ms cubic-bezier(0.22,1,0.36,1),opacity .2s ease;}
/* Card hover = ONE center-pinned ZOOM of the whole card (no translate/lift, no separate per-child
   scales) so the photo, text and card all grow together in every direction with NO directional
   movement — the photo/text gap is preserved because they scale as a single unit.
   will-change is applied ONLY on hover (not permanently at rest) — a page with many cards in a
   grid (e.g. 11 program cards) would otherwise force that many persistent compositor layers at
   all times, which is wasted overhead especially on hardware without GPU acceleration. */
.if-prog-card:hover{transform:scale(1.03);box-shadow:0 14px 34px rgba(0,0,0,0.14);position:relative;z-index:2;will-change:transform,box-shadow;}
/* The photo image gets a little extra center-pinned zoom, clipped to its frame (overflow:hidden),
   for a news-card feel — contained, so it adds no directional movement. */
.if-prog-card:hover .if-prog-photo img{transform:scale(1.04);}
/* Body text grows WITHIN if-prog-body via the JS-inserted .if-prog-bodyinner wrapper: scaling the
   wrapper (center-pinned, default origin) grows the content inside the body without moving the body's
   own perimeter. The wrapper re-hosts the body's flex column + gap so rest layout is unchanged. */
.if-prog-bodyinner{display:flex;flex-direction:column;gap:12px;flex-grow:1;transition:transform 240ms cubic-bezier(0.22,1,0.36,1);}
.if-prog-card:hover .if-prog-bodyinner{transform:scale(1.03);will-change:transform;}
.if-prog-hidden{display:none !important;}
/* Filter switch is a JS-driven soft cross-dissolve (program-filter module): the visible cards fade
   out together, the grid re-lays-out while everything is invisible (so nothing is ever seen sliding
   between positions), then the matching set fades back in with a whisper of scale. The JS sets
   inline transitions and clears them on cleanup, so nothing here overrides the card hover-lift.
   Reduced-motion falls back to instant show/hide (no motion). */
.if-prog-em{color:#e21833;font-style:normal;}
/* Filter pills — no "current" shown until the JS adds .is-active on first interaction; current
   HOVER = red text + red border (outline). CURRENT/is-active = solid red fill + white text
   (2026-07-02: stronger than the old red outline, which read spindly; the design used a BLACK
   fill but that was too harsh — brand-red fill matches the primary CTA buttons). is-active is
   declared after :hover so hovering the current pill keeps the red fill. */
.if-filter-pill{transition:color .2s ease,border-color .2s ease,background-color .2s ease;-webkit-tap-highlight-color:transparent;user-select:none;}
.if-filter-pill:hover{color:#e21833;border-color:#e21833;}
.if-filter-pill.is-active{background-color:#e21833;border-color:#e21833;color:#fff;}
@media screen and (max-width:991px){.if-prog-grid{grid-template-columns:repeat(2,1fr) !important;}}
@media screen and (max-width:640px){.if-prog-grid{grid-template-columns:1fr !important;}}
/* program-page-aspire: submission-card PDF download icon — crossfade on hover.
   background-image can't be transitioned (hard cut), so the link stacks two overlaid <img>s
   (normal + hover state) and we crossfade their opacity. Because the two icons' strokes don't
   line up exactly, dissolving them (rather than instant-swapping) reads smooth — rapid but graceful.
   Parent-hover-child, so it can't be native; the resting opacity/stacking/size are native. */
.program-page-aspire-card-dl-normal,.program-page-aspire-card-dl-hover{transition:opacity 0.18s ease;}
.program-page-aspire-card-dl:hover .program-page-aspire-card-dl-normal{opacity:0;}
.program-page-aspire-card-dl:hover .program-page-aspire-card-dl-hover{opacity:1;}
/* MIPS Statement-of-Interest pages: the Formstack embed briefly renders in its raw,
   unstyled form before idea-factory.js's ff-form-iframe-css module reaches in and
   fixes it, producing a visible flash/jump. #iFrameWrapper is the embed's own host-page
   wrapper div (from Formstack's own embed code, not ours) — starting it invisible and
   fading it in only once the JS module confirms styling is applied (see idea-factory.js)
   turns that flash into a smooth reveal. A hard fallback in the JS force-reveals it
   after ~6s regardless, so the form can never get stuck permanently invisible if the
   styling pass ever fails to fire for any reason.*/
#iFrameWrapper{opacity:0;transition:opacity 0.4s ease;}
#iFrameWrapper.if-ff-ready{opacity:1;}

/* MIPS "Round" pages: chart tables are pasted in as raw HTML/CSS via an HtmlEmbed
   (from an external table-generator tool, not a Webflow element), so their header-
   row styling is baked into the embed's own <style> block and completely outside
   Webflow's native styling system — the Designer has no way to reach into an
   embed's markup at all. That generator gives every export the SAME boilerplate
   base rule ".tg th{...}" for header cells, but a DIFFERENT randomly-generated
   per-table class (e.g. "tg-sqty") for the color — so targeting the random class
   would only fix the one table it was copied from. Targeting the boilerplate
   ".tg th" instead is genuinely portable: it's identical across every export from
   this tool, so this one rule covers every current AND future one of these embeds
   with zero further action needed, matching the ask ("the coding should be the
   same in all of them"). !important is required since the embed's own per-table
   class (".tg .tg-xxxx") is more specific than a bare ".tg th" and would otherwise
   still win the cascade. Swaps the tool's default pale-blue header fill for the
   site's own established gold "hatch" pattern (the same repeating-linear-gradient
   already used for the alternating-row highlight on the MIPS Projects page). */
.tg th{background-color:rgba(255,210,0,0.7)!important;background-image:repeating-linear-gradient(170deg,rgba(255,255,255,.55) 0,rgba(255,255,255,.55) .5px,transparent .5px,transparent 2.5px)!important;}

/* nav-toggle-js closed-state padding fix: the in-site layout embed forces
   ".if-navmenu{padding-bottom:30px!important}" at <=991px on every page (part of
   the open-menu look Webflow's native Navbar pages rely on). That !important beats
   any plain Designer-authored padding on the if-navmenu-js combo, so a page using
   the JS-driven toggle (idea-factory.js "nav-toggle-js") still showed a 30px sliver
   of the first link peeking through even at max-height:0. Needs its own !important
   to win, scoped to the two-class closed selector only; the three-class open
   selector is more specific so it wins back the normal 30px once genuinely open. */
@media screen and (max-width:991px){
  .if-navmenu.if-navmenu-js{padding-bottom:0!important;}
  .if-navmenu.if-navmenu-js.is-nav-open{padding-bottom:30px!important;}
}

/* Ventures header lockup responsive fix: the in-site layout embed carries a legacy,
   site-wide !important rule (".if-id-band > .if-id-tagline{display:none!important}"
   at <=575px, predating the idea-factory.js "header-name-fit" module's own
   continuous shrink-to-fit system) that unconditionally hard-hides the ENTIRE
   logo/program-name/tagline area below 575px, regardless of what header-name-fit
   has already done to make it fit. That's the opposite of the intended behavior
   (the piece should shrink, never vanish). Beat it the same way every other
   embed-!important conflict on this site is beaten (see the nav-toggle-js fix
   just above): a MORE SPECIFIC selector (class-doubled) with our own !important,
   loaded after the embed in the DOM so it wins regardless of !important-vs-
   !important source-order ties. */
@media screen and (max-width:575px){
  .if-id-band > .if-id-tagline.if-id-tagline{display:flex!important;}
}

/* NOTE: the Ventures bottom-nav tricolor accent bar's gradient/repeat/size used to live
   here as shared CSS, but Webflow DOES support native gradient backgrounds - there was no
   real platform limitation forcing it into the shared file. Moved to a native Designer
   style on .program-page-ventures-botnav-accent (2026-08-26) so it renders correctly in
   the Designer canvas, not just published. Only the scroll-driven background-position
   itself stays in JS (idea-factory.js "botnav-accent-scroll") - background-position can't
   be scroll-bound natively, and an animation is inherently invisible in a static canvas
   snapshot regardless, so that's the one genuine, unavoidable exception. See idea-factory.js
   for the matching module (1/3 the footer's rate, opposite direction, same technique as
   the footer's own .if-foot-accent bar - which still uses the shared-CSS approach and
   would benefit from the same native conversion if it's ever revisited).
*/

/* Ventures bottom-nav "current page" marker - bolder weight on whichever link matches the
   current page. This CAN'T be done natively: Webflow's Designer has no way to select/style
   .w--current directly (it's a runtime-only marker the platform adds to a link whose href
   matches the current page - never a real, applicable combo class in the Designer), so the
   compiler won't emit a hand-made .w--current rule. Same reason the site's main nav
   current-page styling already lives here (see the older nav .w--current rules above).
   program-page-ventures-botnav-link is page-specific to Ventures-Home, so this is safely
   scoped - no other page's nav is affected. Same rule mirrored for CBSCF's own bottom-nav
   link class below (each spinoff gets its own scoped rule, not a shared one, so tuning one
   spinoff's current-link weight can never touch another's). */
.program-page-ventures-botnav-link.w--current{font-weight:700;}
.program-page-cbscf-botnav-link.w--current{font-weight:700;}

/* I-Corps news card hover: text grows within the box in addition to the box growing
   (matching if-nfeat/if-news-cardtext and if-nrow/if-nrowtext elsewhere on the site).
   Parent-hover-child, so it can't be a native Webflow pseudo - box-level hover/transition
   and the text wrapper's own transition/transform-origin are native (set directly in the
   Designer on program-page-icorps-home-news-card / -news-body); only this cross-element
   rule needs to live here. Shared by I-Corps-Home and I-Corps-News (same class names). */
.program-page-icorps-home-news-card:hover .program-page-icorps-home-news-body{transform:scale(1.03);will-change:transform;}

/* I-Corps-Mentors CTA cards (Slides/PDF/Form): text grows within the card in addition to the
   card growing, same double-grow mechanism as the news cards above. Parent-hover-child, so it
   can't be a native Webflow pseudo - the card's own lift/shadow/gold-hatch hover and the inner
   wrapper's transition/transform-origin are both native (set directly in the Designer on
   program-page-icorps-mentors-rescard / icorps-mentors-cta-inner); only this cross-element
   rule needs to live here. User-set ratio (102%) - card itself set to scale(1.02) natively. */
.program-page-icorps-mentors-rescard:hover .icorps-mentors-cta-inner{transform:scale(1.02);will-change:transform;}
