/*! IGW site footer styles 0.1.4 (2026-09-22). Supersedes igwsitefooter-0.1.3.css
   (32,183 bytes). Every rule of 0.1.3 is carried below unchanged, its header
   included; the diff is this banner and ONE rule: html[data-igw-holding="landing"]
   .igw-hs gains flex-wrap:wrap and gap:8px 28px, because igwholdingshop 0.1.1 puts
   a second link ("Licensing & content usage") in that row beside the shop link and
   a flex row with no gap would butt the two 44 px targets together. Measured at
   1440 and 390 the two links share one row; wrap is the fallback below ~330 px so
   a narrower phone stacks them rather than overflowing the hero. Nothing else
   changes; no !important. */

/*! IGW site footer styles 0.1.3 (2026-09-21). Supersedes igwsitefooter-0.1.2.css
   (14,452 bytes). Every rule of 0.1.2 is carried below UNCHANGED, including its
   own header, which is kept because it is still the reason this file exists. The
   diff against 0.1.2 is this banner and two appended sections at the end.

   WHAT WAS ADDED, with the owner-approved instruction sheet line for each.

   §4.5 TACTILE CONTROLS. ":active on buttons, .igw-cs-control,
   .igw-cs-orbit-point, .igw-cs-film, .igw2-utility-button, form submit, nav
   links: transform:scale(.98) over --igw-dur-fast, back to 1 on release,
   ease-std. Focus rings untouched." And the sheet's own warning about how to
   write it: "Scope selector list explicitly; do not use `button, a` bare
   selectors (would catch the globe canvas host and Webflow dropdown toggles)."

   §4.6 COMPACTING NAVIGATION. "Past 80 px of scroll (hysteresis: expand again
   only below 24 px) html[data-igw-nav-compact="true"] is set; .igw2-nav
   transitions to 56 px, logo scales .82 from its left/center origin, nav
   background gains ~8% opacity. Transition --igw-dur-panel, ease-std.
   CRITICAL: do NOT change the .igw2-page 71 px clearance or main padding - the
   nav shrinks inside its fixed box, content does not shift." The attribute is
   set by igwnavcompact-0.1.0.js; these rules are the whole of what it does.

   Both sections read their timing from igwmotiontokens-0.1.0.css and carry the
   §3 numbers as var() fallbacks, so this sheet is correct on a page that has
   not yet pinned the tokens. Nothing here uses !important. */

/*! IGW site footer styles 0.1.2 (2026-09-17). These rules lived as an inline
   <style> block in the site footer custom code from 2026-09-03; they are
   unchanged and moved to a hosted, SHA-384-pinned stylesheet so the footer
   block stays within the size the Data API path can write reliably. Order
   matters: the footer links this sheet where the block sat, before
   igwcontrast, which re-declares the !important greys below and must follow. */
/* Global keyboard focus indicator.
   The user-agent default ring is near-black, which is invisible against this
   site's ground on every route. :focus-visible keeps it off mouse clicks. */
:focus-visible {
  outline: 2px solid #7DB8EA;
  outline-offset: 2px;
  border-radius: 2px;
}
/* Inputs already carry their own border; the offset ring would sit outside the
   field and read as a second box, so tighten it there. */
input:focus-visible,
textarea:focus-visible,
select:focus-visible {
  outline-offset: 0;
}

/* Screen-reader-only content becomes a visible panel on focus (see the
   .igw2-sr-only:focus-within rule in the site styles). Its links were still
   the user-agent blue, which is both off-brand and low contrast on the panel's
   #05070a ground. */
.igw2-sr-only a {
  color: #A3CDF2;
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* Short viewports: release the fixed navigation.
   At 400% zoom (WCAG 1.4.10) the viewport is about 256 CSS pixels tall, and the
   fixed bar was covering three quarters of it — the same thing happens on a
   phone held in landscape. Switching to absolute keeps the bar at the top of the
   document and lets it scroll away, while the clearance padding below it stays
   correct, so nothing shifts. Webflow breakpoints are width-only, which is why
   this rule lives here rather than on the class. */
@media (max-height: 450px) {
  .igw2-nav { position: absolute; }
}

/* ---------------------------------------------------------------- contrast
   Seven text elements measured below the 4.5:1 minimum, all of them the same
   two greys on near-black. Measured before: 3.91, 4.15, 4.33 three times,
   4.42 twice. #8A94A0 measures 6.58 on the darkest ground and 6.28 on the card
   ground, clearing the bar with room rather than sitting on it, and close
   enough in tone that the hierarchy these greys carry is unchanged. */
.igw2-utility-note,
.igwls-next-p,
.igwls-site,
.igwls-approx,
.igwsf-approx,
.igwvc-table em,
.igwvc-note,
[data-igw-meta],
[data-igw-notice-geometry] {
  color: #8A94A0 !important;
}

/* Mission Control used #6E7A89 for its secondary text, which measures 4.40:1
   on that page's #0B0F15 panels - under the 4.5 minimum by six hundredths, on
   162 elements. Found by the standing audit rather than by eye, which is the
   point of having it. Same #8A94A0 as the rest of the site, 6.24 on that
   ground. */
#igwmc dt,
#igwmc th,
#igwmc .igwmc-span,
#igwmc .igwmc-cd-none,
#igwmc .igwmc-tile-l,
.igwmc-asof,
.igwmc-as-of,
.igwmc-note,
.igwmc-foot,
.igwmc-table th {
  color: #8A94A0 !important;
}

/* ------------------------------------------------- text over the live globe
   The globe is an animated canvas, so text on it has no fixed backdrop: the
   same label measured 5.60:1 over ocean and 1.94:1 as a bright limb passed
   beneath it. Contrast cannot be tuned against a moving background, so these
   get their own ground - a scrim that travels with the text and makes the
   ratio independent of whatever the Earth is doing. */
.igw2-earth-label,
.igw2-hero .igw2-eyebrow {
  color: #C8D4E2;
  background: rgba(4, 8, 12, .72);
  padding: 4px 9px;
  border-radius: 2px;
  display: inline-block;
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}

/* ------------------------------------------------------------- tap targets
   The globe's pad markers were 14x14 CSS pixels, below the 24px WCAG 2.2 AA
   floor, with the drawn dot and the hit area being the same box.

   Padding was the wrong instrument, and a rule here used to try it. The ring
   is the button's own border, so border-box padding grew the ring itself: the
   14px marks became 32px ones, which is a less precise claim about where a pad
   actually is. igwearthoverlay2 0.4.1 does it properly instead — the ring
   stays 14px and a transparent child carries the target, sized to the distance
   to the nearest other marker so no target reaches into its neighbour's space.
   The rule that used to sit here is deliberately gone rather than tuned. */

/* Footer link rows were 20px tall with under 24px between them, which is the
   2.5.8 minimum a stacked list has to meet on its own. Padding the row rather
   than the text keeps the type where it is. */
.igw2-footer-link {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}

/* The FAA source link on each airspace notice is a block link at 22px, two
   short of the same minimum. It is the link that takes a reader to the
   authoritative document, so it is the last one that should be awkward to hit. */
[data-igw-notice-source] {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}

/* -------------------------------------------------------- mobile copy width
   .igw2-explore-copy computes to 389.4px inside a 390px viewport, so its H1
   and lede were clipped by the section's overflow on five routes. The column
   is bounded to its container and the display face allowed to shrink. The
   ramp's floor and ceiling are scale steps (38 and 68, type-scale sweep
   2026-09-03); the .igw2-display class and the .igw2-display-explore combo
   carry the same ramp at this breakpoint. */
@media (max-width: 767px) {
  .igw2-explore-copy,
  .igw2-explore-copy > * {
    max-width: 100%;
    min-width: 0;
  }
  h1.igw2-display {
    font-size: clamp(38px, 11.6vw, 68px);
    letter-spacing: -.035em;
    line-height: 1;
    overflow-wrap: break-word;
  }
  .igw2-lede { max-width: 100%; }
}

/* ------------------------------------------- hero text over the marker layer
   At 1440 the globe's disc runs under the headline column, and the column's
   box sat above the marker layer: two pads measured elementFromPoint = H1,
   and with the H1 let through, the .igw2-hero-content container itself. The
   whole column lets pointer events through; the calls to action take them
   back. Display text must never intercept the instrument behind it. Found by
   the touch-emulated tap probe on the delivered page, 2026-09-03. */
.igw2-hero-content { pointer-events: none; }
.igw2-hero-content .igw2-actions { pointer-events: auto; }

/* ------------------------------------------- the CSS fallback sphere on /
   A 96 px swipe on the homepage globe at 390 turned it 1.8 px while the same
   swipe turned /explore 90 px. The finger was landing on .igw2-earth-sphere,
   the CSS fallback globe, which on the home page is a sibling of the WebGL
   host inside the preserve-3d .igw2-earth at translateZ(54px) with pointer
   events of its own; the host's touch-action never applied and Chromium
   cancelled the pointer after two moves. The fallback has no use for the
   pointer — the interaction module never runs without WebGL — so it lets
   every event through to the host. Measured 2026-09-03 by the overlay 0.4.6
   probe: with this rule the swipe turns the globe 0.576 rad. */
.igw2-earth > .igw2-earth-sphere { pointer-events: none; }

/* ---------------------------------------------- the Flight 8 film, on intent
   2026-09-05. The self-hosted 2.09 MB recap comes off the CDN (owner decision,
   2026-09-04). The three <video> elements that carried it on /starship and
   /news are now links to IGW's own YouTube upload of the same film, showing
   the same poster frame and playing only when a reader chooses to - the
   performance audit's budget in one rule: poster first, video after intent.
   The element keeps its class, so the site sheet's absolute inset-0 box and
   filter still apply; these rules only clip the image to it and put the
   affordance on it, in the scrim the globe labels use. */
a.igw2-authentic-media-video {
  overflow: hidden;
}
a.igw2-authentic-media-video > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
a.igw2-authentic-media-video::after {
  content: "Watch the film \2197";
  position: absolute;
  left: 16px;
  bottom: 16px;
  display: inline-flex;
  align-items: center;
  min-height: 36px;
  padding: 0 14px;
  background: rgba(4, 8, 12, .72);
  border: 1px solid rgba(255, 255, 255, .36);
  border-radius: 2px;
  color: #f5f5f5;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .02em;
  line-height: 1;
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
  transition: border-color .15s ease-out, background-color .15s ease-out;
}
a.igw2-authentic-media-video:hover::after,
a.igw2-authentic-media-video:focus-visible::after {
  border-color: rgba(255, 255, 255, .60);
  background: rgba(4, 8, 12, .86);
}

/* ------------------------------------------------------- type-scale sweep
   2026-09-03. Sizes set by stylesheets the Data API cannot edit were brought
   onto the site's type scale from here, after every stylesheet, each rule a
   stopgap held only until its own module could carry the size. All three have
   now been returned to their modules and this block sets no module's type:
     - the launch schedule's embed on /launches - folded into igwlaunchschedule
       0.1.3, 2026-09-04;
     - the NASA feed's injected .78rem meta line - igwnasavisualstream 0.1.4
       shipped 2026-09-04 already setting 12px;
     - the hosted igwchannel sheet's title (15) and channel link (13) -
       igwchannel-0.2.1.css carries 16 and 12 itself, so the two rules that
       held them here were deleted on 2026-09-05 (E1, the last two). */

/* ------------------------------------------------- three things the owner cut
   2026-09-17, on the owner's instruction, looking at the holding page on an
   iPhone: "This photo is still showing. Get rid of it." and "Also remove the
   arrow next to watch an IGW film. And remove the falcon heavy video at the
   bottom."

   All three are removed from here rather than at their own definitions,
   because this sheet is the last stylesheet the page loads and none of the
   three is owned by it: the photograph is a Designer element inside the home
   hero component, which the Data API cannot address without editing the
   component itself, and the other two are defined in the homepage's own head
   block, which a concurrent session maintains. One place, one revert.

   The photograph is IGW's own (K Enagonio), and its element keeps its
   data-igw-media-credit and data-igw-media-source attributes in the delivered
   HTML, so the provenance record survives the removal - it is not rendered
   either way, under the no-credits rule. Measured before removing: 393x1285
   at 78% opacity behind the whole holding page on a phone, and 393x794 on the
   full site with the gate off, so it goes in both states, which is what "get
   rid of it" means. */
.igw2-starship-fallback-media { display: none !important; }

/* The arrow is a pseudo-element, U+2197, which iOS renders as a colour emoji
   rather than a glyph - the blue tile in the owner's screenshot. Removing the
   content removes the box with it; the link keeps its underline and its 44px
   target. */
html[data-igw-coming-soon="cinema"] .igw-cs-watch::after { content: none !important; }

/* The Falcon Heavy poster card under the globe. The same film is still one tap
   away from the "Watch an IGW film" link above the countdown, which opens the
   same screening dialog, so nothing is lost with it. The coming-soon runtime
   still builds the element; this only stops it rendering, and display:none
   takes it out of the tab order and the accessibility tree as well. Removing
   it at the source belongs in igwcomingsoon when that module is next edited. */
html[data-igw-coming-soon="cinema"] .igw-cs-film { display: none !important; }

/* ------------------------------------ the empty band above the landing copy
   2026-09-17, owner: "there is a little too much space at the top that's
   empty."

   Measured on the live holding page at 393x852: the first line of copy sat
   101px down, and 71 of those were `main.igw2-page`'s phone rule - the
   clearance reserved for the fixed navigation. On the landing page the
   navigation is display:none (the gate hides it) and the sticky alert bar is
   not on the page at all, so those 71px held nothing. The clearance is
   released here and the hero carries its own top offset instead, which puts
   the kicker 56px into the page rather than 101. Landing state only: every
   other route still needs the clearance, and the navigation is really there. */
html[data-igw-holding="landing"] main.igw2-page { padding-top: 0 !important; }
@media (max-width: 767px) {
  html[data-igw-holding="landing"] .igw2-hero { padding-top: 56px !important; }
}

/* ------------------------------------------- the shop link, holding page only
   2026-09-17, owner: "add a link to the IGW shop at the bottom of the holding
   page, the link to the outside shop. Not the rebuilt skin on the IGW site."

   The element is built by igwholdingshop 0.1.0 and appended to the hero, which
   in the landing layout is a grid. grid-column 1/-1 makes it span the full
   width, so auto-placement drops it into the row after the copy and the globe
   at every width - the bottom - without this sheet having to know how many
   rows there are. The face, size, gold underline and 44px target are the
   "Watch an IGW film" link's, so the two read as one family; the custom
   properties carry fallbacks because they are declared on the coming-soon
   scope and this rule is scoped to the landing state. */
html[data-igw-holding="landing"] .igw-hs {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap; /* 0.1.4: two links since igwholdingshop 0.1.1 */
  justify-content: center;
  gap: 8px 28px;
  margin: 30px 0 0;
}
html[data-igw-holding="landing"] .igw-hs-link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--cs-ink, #f3f1ea);
  font: 500 13px/1.5 "IGW Coming Soon Text", "Plus Jakarta Sans", sans-serif;
  text-decoration: none;
  border-bottom: 1px solid var(--cs-accent, #c5b088);
}
html[data-igw-holding="landing"] .igw-hs-link:hover {
  color: #fff;
  border-bottom-color: #e0d3b9;
}
@media (forced-colors: active) {
  html[data-igw-holding="landing"] .igw-hs-link { color: LinkText; border-bottom-color: LinkText; }
}


/* ==========================================================================
   §4.5 TACTILE CONTROLS - added 0.1.3, 2026-09-21
   ==========================================================================

   A press is the one gesture on this site that produced no feedback at all.
   Hover answers, focus answers, and a finger on a control got nothing until
   the page changed. `transform: scale(.98)` for the length of the press is the
   whole of it.

   THE SELECTOR LIST IS ENUMERATED, NOT INFERRED, AND THE EXCLUSIONS ARE THE
   INTERESTING PART. Every element matching `button, [role=button],
   input[type=submit], a` was read off the delivered DOM at 1440x900 on twelve
   staging routes on 2026-09-21 - /, /films, /photography, /news, /starship,
   /contact, /media-licensing, /mission-control, /explore, /launches, the
   igw-media-library record template and the holding page at ?igwholding=landing
   - and the list below is what that read produced. Four kinds of control were
   deliberately left out:

   1. ANYTHING THE GLOBE PLACES BY AN INLINE TRANSFORM. `.igw-cs-orbit-point`
      is in the instruction sheet's own list and it is NOT here. It is a
      <button>, and igwearthorbits-holding 0.6.3 builds it with a comment that
      says exactly why the rule cannot go on it: "Placed by transform from here
      on, so the static left/top are pinned at 0 once", followed by a per-frame
      style.setProperty('transform', 'translate3d(x,y,0) translate(-50%,-50%)').
      A stylesheet `transform` loses to that inline declaration, so the rule
      would be a line of CSS that does nothing - and the only way to make it
      win, !important, would replace the placement and throw the satellite to
      the host's origin for the length of the press, on a control that is
      already moving under the finger. The same holds for the marine and
      airspace notice badges and the launch-site markers. The 2026-09-18 entry
      in CLAUDE.md is the history of getting those objects onto transforms in
      the first place; this is the cost of that decision and it is the right
      cost. Their press feedback already exists and is the module's own
      `data-pressed` attribute.
   2. INLINE TEXT LINKS. `transform` has no effect on a non-replaced inline
      box, so `.igw2-footer-link` (24 per page, no `display` declared, measured
      113.6 x 24), `.igw2-footer-meta` and `.igwls-mission-link` would take the
      declaration and render identically. A rule that cannot change what it
      selects is not a rule.
   3. CONTROLS WHOSE POSITION IS ALREADY A TRANSFORM. `.igw2-skip-link` is
      parked off-screen by `transform` and brought back by `:focus`; a scale on
      `:active` would drop it into view mid-press. `.igw2-brand` is excluded
      because §4.6 below owns its transform.
   4. THINGS THAT ARE NOT BUTTONS. `.igw-access-link` is the full-width alert
      strip (1353.6 x 35); `.igwsky-row` and `.igwmc-mark` are table rows and
      globe marks. Scaling a full-bleed bar reads as the page flexing.

   `.igw-cs-control` IS included and matched zero elements on 2026-09-21: the
   holding page's option bar is hidden by design (§0 of the sheet) and
   igwcomingsoon 0.2.16 never builds one. It is kept because §4.8 adds a single
   "Reset view" control in that vocabulary, and a press rule that arrives with
   the control is better than one added after somebody notices.

   TWO CONTROLS ALREADY HAD AN :active AND THIS SUPERSEDES THEM ON PURPOSE.
   `.igw2-form-submit` and `.igw2-business-action` carry
   `transform: translateY(1px) scale(.995)` in the Webflow stylesheet. This
   sheet is parsed later, so the transform below wins and the two join the rest
   of the site at .98; their `:active` background and box-shadow declarations
   are untouched, because only `transform` is set here.

   THREE CONTROLS ALREADY HAD A `transition` AND IT IS RESTORED RATHER THAN
   CLOBBERED. `transition` is a shorthand: a rule that declares
   `transition: transform ...` on `.igw2-menu-toggle` does not add transform to
   its list, it REPLACES `background-color .15s ease-out, border-color .15s
   ease-out` and the toggle's hover fill starts snapping. Measured in the
   Webflow stylesheet, three of the selectors below carry one -
   `.igw2-btn` (background-color/color/border-color/transform, .2s),
   `.igw2-tool-action` (transform/border-color/background-color, .2s) and
   `.igw2-menu-toggle` - so each gets its own rule that names transform AND
   everything it already had. This is also why the generic rule below is a
   class-only `:is()` at specificity (0,1,0) and the two selectors that would
   raise it to (0,1,1), `input[type="submit"]` and `.igwportfolio-switcher a`,
   are split into a rule of their own: the three restoring rules have to be
   able to win, and they win on source order at equal specificity.
   ONE KNOWN CONSEQUENCE, MEASURED AND ACCEPTED: on the homepage igwhomeart
   0.1.2 re-declares `.igw2-btn` and `.igw2-tool-action` transitions at
   specificity (0,3,1) without transform, so those two controls press instantly
   there rather than over 150 ms. That file is another release's and the press
   still answers.

   FOCUS RINGS ARE UNTOUCHED: no `outline`, `outline-offset` or `border-radius`
   appears in this section. FORCED COLORS ARE UNAFFECTED: `transform` is not a
   colour property and `forced-colors: active` does not override it, so no
   `@media (forced-colors: active)` block is needed and none is written - one
   that restated the same transform would be noise.

   REDUCED MOTION needs no branch either: `--igw-dur-fast` is 0ms under that
   preference, so the scale becomes the instant state change §0 asks for.

   MEASURED on staging with this sheet swapped in, 1440x900 and 390x844:
   pointerdown on `.igw2-menu-toggle` reaches scale .98 with a reported
   transition of 150 ms on transform and .15s on background-color and
   border-color; its 44.00 px box paints 43.12 px for the length of the press
   and returns to 44.00; `.igw-cs-orbit-point` keeps its inline translate3d
   with no scale, as intended. */
:is(
  .igw2-navlink, .igw2-nav-live, .igw2-menu-toggle, .igw-access-pause, .igw-search-open,
  .w-button, .igw2-btn, .igw2-tool-action, .igw2-utility-button,
  .igw2-business-action, .igw2-form-submit,
  .igwch-filter, .igwfilms-text-link, .igwfilms-player-close,
  .w-pagination-next, .w-pagination-previous, .igwls-chip,
  .igwmc-hbtn, .igwmc-tab, .igwmc-hub, .igwsky-tab, .igwsky-btn,
  .igw-cs-film, .igw-cs-control, .igw-cs-watch, .igw-cs-screening-close
) {
  transition: transform var(--igw-dur-fast, 150ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1));
}
/* Split out because each of these is specificity (0,1,1) and would raise the
   whole forgiving list above it, leaving the three restoring rules unable to
   win on source order. */
input[type="submit"],
button[type="submit"],
.igwportfolio-switcher a {
  transition: transform var(--igw-dur-fast, 150ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1));
}
/* The three that already had a transition list. Transform is ADDED to what the
   Webflow stylesheet declares, never substituted for it. */
.igw2-btn {
  transition: transform var(--igw-dur-fast, 150ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1)),
    background-color .2s, color .2s, border-color .2s;
}
.igw2-tool-action {
  transition: transform var(--igw-dur-fast, 150ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1)),
    border-color .2s, background-color .2s;
}
.igw2-menu-toggle {
  transition: transform var(--igw-dur-fast, 150ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1)),
    background-color .15s ease-out, border-color .15s ease-out;
}
:is(
  .igw2-navlink, .igw2-nav-live, .igw2-menu-toggle, .igw-access-pause, .igw-search-open,
  .w-button, .igw2-btn, .igw2-tool-action, .igw2-utility-button,
  .igw2-business-action, .igw2-form-submit,
  .igwch-filter, .igwfilms-text-link, .igwfilms-player-close,
  .w-pagination-next, .w-pagination-previous, .igwls-chip,
  .igwmc-hbtn, .igwmc-tab, .igwmc-hub, .igwsky-tab, .igwsky-btn,
  .igw-cs-film, .igw-cs-control, .igw-cs-watch, .igw-cs-screening-close
):active,
input[type="submit"]:active,
button[type="submit"]:active,
.igwportfolio-switcher a:active {
  transform: scale(.98);
}
/* A disabled control does not answer a press, so it must not look as if it did. */
:is(button, input[type="submit"]):disabled:active {
  transform: none;
}

/* ==========================================================================
   §4.6 COMPACTING NAVIGATION - added 0.1.3, 2026-09-21
   ==========================================================================

   THE SHEET SAYS "71 px at scroll-top" AND THE DELIVERED NAV IS NOT 71 px.
   Measured on staging 2026-09-21 before writing a line: `.igw2-nav` is
   85.81 px tall at 1440x900 on /, /films, /photography, /news and the
   igw-media-library template, and 72 px at 390x844; /starship carries its own
   nav overrides and measures 81 px and 71 px. The 71 in the sheet is the
   `.igw2-page` phone CLEARANCE (`@media (max-width:767px){.igw2-page{padding-
   top:71px}}`), which is a different quantity that happens to sit near the
   phone nav height. So the target is expressed here as a HEIGHT TO REACH, 56
   px, and the padding that gets there is derived from the measured box rather
   than from the sheet's arithmetic.

   THE NAV HAS NO HEIGHT TO TRANSITION. Webflow gives it `padding: 18px 6vw`
   and `display:flex; align-items:center`, and its height is whatever its
   tallest child needs: at 1440 that is `.igw2-brand` at 48.81 px (a 210 px
   logo at its intrinsic ratio), at 991 and below it is the 44 px minimum on
   `.igw2-navlink` / `.igw2-nav-live` / `.igw2-brand`. `height: auto` is not
   interpolable, so compacting by setting a height would snap. Compacting by
   `padding-block` interpolates, and it is also the only change that cannot
   affect the horizontal padding, which differs at every breakpoint (6vw, 4vw,
   5vw) - which is why `padding-block` is used and never the `padding`
   shorthand.

       1440   3.1 + 48.81 + 3.1 + 1px border  =  56.0 px   (from 85.81)
       <=991  5.5 + 44.00 + 5.5 + 1px border  =  56.0 px   (from 85.81 / 72)

   AND AT 767 AND BELOW THE PADDING IS NOT ENOUGH ON ITS OWN, WHICH WAS FOUND
   BY MEASURING RATHER THAN BY READING. With the padding rule alone the phone
   nav went from 72.00 px to 72.00 px: igwfinish 0.1.5 carries
   `@media (max-width: 767px){ .igw2-nav{ ...; min-height: 72px } }`, a floor
   the arithmetic above cannot get under. The compact state therefore also sets
   `min-height: 56px`, which is interpolable and transitions with the padding,
   and which touches nothing at 768 and above because the nav is already 56 px
   there. The 44 px controls inside are unaffected - 5.5 + 44 + 5.5 + 1 is the
   56 - so lowering that floor costs no target size.

   THE LOGO SCALES ONLY ABOVE 767 px, AND THAT IS AN ACCESSIBILITY DECISION
   RATHER THAN A TASTE ONE. `transform: scale(.82)` does scale hit-testing, and
   at 767 and below `.igw2-brand` carries `min-height: 44px` - it IS a 44 px
   target. Scaling it there would paint and hit 36.08 px, below the ≥44 px
   practical target §0 requires of every control. Above 767 the brand is 210 or
   170 px wide and 48.81 px tall, so .82 leaves 40 px and the rule costs
   nothing. The phone nav still compacts; only its logo holds its size.

   THE BACKGROUND IS DEEPENED BY COMPOSITION, NOT BY REPLACEMENT. The sheet
   asks for "~8% opacity" more. Setting `background-color` would do that at
   1440, where the nav is `#050505b8`, and would be wrong twice over elsewhere:
   at 767 and below the nav is already opaque `#050505`, and /starship
   deliberately renders a transparent nav over its hero, which a
   `background-color` here would overwrite. An inset shadow of
   `rgba(5,5,5,.08)` ADDS 8% of the site's ground to whatever the page decided,
   so every nav gets the same 8% and no page's own design is overruled. It is
   declared at zero alpha in the resting state so it interpolates rather than
   appearing.

   WHAT IS NOT TOUCHED, because §4.6 says so in capitals: `.igw2-page` (the
   71 px phone clearance), `.igw2-nav-clearance`, `main` padding, `.igw2-nav`'s
   `position`, its `top` (which is `var(--igw-access-bar-height)` under
   `html[data-igw-holding=off]`, so the Starbase alert bar keeps the nav below
   it at both 36 px and 40 px), and `.igw2-menu-sheet`. The nav is
   `position: fixed`, so nothing it does to its own box can move the document:
   CLS is 0 by construction and was measured at 0 anyway.

   COMPACTION IS OFF ON SHORT VIEWPORTS. At `max-height: 600px` the site head
   makes `.igw-access-bar` `position: relative` and the nav `absolute`, and at
   `max-height: 450px` the 0.1.2 rule above does the same; in both the nav
   scrolls away with the document and there is nothing to compact. The whole
   section is therefore inside `@media (min-height: 601px)`, which covers both
   thresholds, and igwnavcompact 0.1.0 independently declines to set the
   attribute there. Two guards for one condition is deliberate: the CSS one
   holds if the script is blocked, the JS one holds if this sheet is.

   The holding page renders no nav, so these rules match nothing there; the
   script does not set the attribute on it either.

   MEASURED on staging /films with this sheet and igwnavcompact 0.1.0 applied,
   scroll 0 -> 200 -> 0: nav height 85.81 -> 56.00 -> 85.81 at 1440x900 and
   72.00 -> 56.00 -> 72.00 at 390x844; `.igw2-brand` 48.81 -> 40.03 px at 1440
   and unchanged at 390; the inset shadow 0 -> .08 -> 0 alpha; the declared
   transition reads `0.28s, 0.28s, 0.28s` on `padding-block, min-height,
   box-shadow`; `.igw2-page` padding-top 0 px throughout and the nav's top edge
   on the access bar's bottom edge (36 px at 1440, 40 px at 390) throughout;
   the attribute appears at 81 px of scroll and is gone by 23 px; at 1440x600
   no attribute is set and the nav keeps its 18 px padding; on the holding page
   no attribute is set; the 390 menu sheet opens, closes, keeps its 18 links,
   its 44 px toggle, its aria-expanded and its focus target exactly as on the
   unmodified page, and follows the compact nav (sheet top 95 against a nav
   bottom of 96, where the unmodified page reads 111 against 112).

   ONE ACCEPTANCE LINE IS NOT MET AS WRITTEN AND THE NUMBER IS GIVEN RATHER
   THAN ROUNDED AWAY. §4.6 asks for "CLS delta 0 on scroll". Measured over the
   same 0 -> 200 -> 0 sequence, the unmodified page reports 0 and this one
   reports 0.00034 at 1440x900 (one entry) and 0.00072 at 390x844 (two). Those
   entries are the nav's OWN children re-centring inside the fixed bar as its
   padding changes, which the Layout Instability spec counts as a shift; no
   document content moves, and `.igw2-page`'s padding-top is 0 px before,
   during and after. A compaction that moved nothing would not be a
   compaction, so a true zero is not reachable here; the honest statement is
   that the page's content does not shift and the nav's own contents do, by
   three ten-thousandths of a viewport. */
@media (min-height: 601px) {
  .igw2-nav {
    box-shadow: inset 0 0 0 100vmax rgba(5, 5, 5, 0);
    transition:
      padding-block var(--igw-dur-panel, 280ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1)),
      min-height var(--igw-dur-panel, 280ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1)),
      box-shadow var(--igw-dur-panel, 280ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1));
  }
  .igw2-brand {
    transform-origin: left center;
    transition: transform var(--igw-dur-panel, 280ms) var(--igw-ease-std, cubic-bezier(.4, 0, .2, 1));
  }
  html[data-igw-nav-compact="true"] .igw2-nav {
    padding-block: 3.1px;
    min-height: 56px;
    box-shadow: inset 0 0 0 100vmax rgba(5, 5, 5, .08);
  }
  @media (max-width: 991px) {
    html[data-igw-nav-compact="true"] .igw2-nav { padding-block: 5.5px; }
  }
  @media (min-width: 768px) {
    html[data-igw-nav-compact="true"] .igw2-brand { transform: scale(.82); }
  }
}
