/* WebYay Payment Tunnel — experimental full-viewport wizard
   Pulls colors/fonts from the same custom properties already defined in
   styles.css (--gold, --ink, --muted, --line, --panel, --glass) so it stays
   in the same visual family as the rest of the WebYay template. Desktop-only
   experience; see #webyayTunnel[data-active] gating in tunnel.js. */

/* ROUND 30 - "Preview buttons don't work" root cause: the tunnel's Font
   Changes "Preview" tiles were already correctly wired (see
   getFontPreviewBtn()/realBtn.click() in tunnel.js) to click the REAL
   .font-choice-example button and genuinely open the real #fontExampleModal
   with real live-preview font injection - confirmed via Playwright that the
   click does fire and the modal does reach display:flex/.is-open. But
   styles.css only ever raises .font-example-modal to z-index:260 (just
   enough to clear the z-index:240 .start-modal it's normally opened from -
   see the z-index comment on .font-example-modal in styles.css). This
   tunnel overlay (#webyayTunnel) sits at z-index:99999, so whenever the
   modal is opened FROM INSIDE the tunnel it was rendering successfully but
   completely hidden behind the tunnel itself - functionally invisible, so
   it read as "the button doesn't do anything." tunnel.css loads after
   styles.css, so this plain override wins on cascade order alone (same
   selector/specificity, later stylesheet) with no !important needed, and it
   doesn't change anything about the modal's normal non-tunnel behavior
   (100000 is still comfortably above every other z-index in the stack). */
.font-example-modal {
  z-index: 100000;
}

#webyayTunnel {
  /* Item 7 (per Dave): "too dominant for what we need it for" - the top
     band (logo + "Your new website." headline + timeline chip trail) is
     shrunk ~15% overall. This isn't just the outer min-height number below;
     every internal vertical dimension that contributes to the band's real
     rendered height (logo size, close-button size, headline font-size/
     padding, chip trail padding, chip padding/font-size, and the matching
     short-viewport @media(max-height:760px) overrides further down) is
     scaled down by the same ~15% in lockstep, so the content shrinks
     proportionally with the container instead of the container shrinking
     around content that stays the same size and overflows/clips. Was 20%. */
  /* Per Dave (round 45+): the headline's font-size was just dramatically
     increased (see .tunnel-top__headline h2 below, now clamp(34px, 4.6vw,
     68px) to match Apple.com/store's "Store" headline) - loosened this
     back up slightly (17% -> 19%) so the much taller glyph box has room
     without recompressing the band Dave already asked to keep short (was
     20% pre-shrink, so this is still meaningfully trimmed from that). */
  /* Per Dave (round 46+): "not exactly; don't want this header that bold,
     match the weight of the smaller headers; and about 20% smaller in type
     size." The headline's weight/size were walked back in step (see
     .tunnel-top__headline h2 below - font-weight 800->600, clamp scaled to
     80%), so the extra room this var added specifically to fit that bigger/
     bolder glyph box is only partly still needed. Scaled 19% back down to
     18% - keeps most of the 45+ breathing room (not a full revert to the
     original 17%) since the headline is still a bit larger than pre-45,
     but trims the excess now that it's no longer 800-weight/68px-max. */
  /* Per Dave (latest round, item 2): the headline's padding-top just grew
     +13px (22px -> 35px, see .tunnel-top__headline below) to lower it
     further per his ask - nudged this floor up a hair (18% -> 19%) so the
     band has enough spare height to absorb that without crowding/
     overlapping the chip trail row underneath. */
  /* REGRESSION FIX (this round), item 5a: "you made this top color bar
     taller again... needs to be a little less tall, I'd say 13%." Cut 13%
     off the 19% figure above: 19% * 0.87 = 16.53%, rounded to 16.5%. The
     headline-to-trail gap (item 5b) is fixed separately below via the
     headline's padding-bottom / .tunnel-trail's padding-top - not by this
     height figure - so this change only affects the band's overall
     height, not the internal spacing between the two rows inside it. */
  /* Per Dave (this round), item 1: "the top band is a little too big/too
     tall and the middle white tunnel is a little too small - make the top
     band about 15% shorter and add that 15% to the middle white tunnel."
     Cut another 15% off the 16.5% figure above: 16.5% * 0.85 = 14.025%,
     rounded to 14%. No separate action needed to grow .tunnel-mid - it's
     flex:1 1 auto (see .tunnel-mid below) so it automatically absorbs
     every bit of height this band gives up, same black-strip-safe
     mechanism documented on .tunnel-top/.tunnel-mid above. */
  --tunnel-top-height: 14%;
  --tunnel-mid-height: 60%;
  /* Per Dave (round 36+): a prior pass here misread "less padding around
     the price text" as "shrink the whole band" and halved this min-height
     floor from 20% -> 10%. That was wrong on two counts Dave called out
     explicitly: it shrank the ENTIRE gray band (never asked for) AND
     pushed the price text almost flush against the top edge with no
     happy medium. Restored to the original 20% - the band's overall
     size/floor is back to what it was before that mistake. The actual
     fix for "less gap above the price text" now lives where it belongs:
     the vertical alignment of the content INSIDE this band (see
     `align-content`/padding tuning on .tunnel-bottom below), not this
     height figure. */
  /* Item 5 (this round), per Dave: "still way too much padding between the
     dollar amounts and the top of the gray bar - fix it by making the gray
     bar smaller/shorter, by maybe 30-35px" - explicitly the band's overall
     size this time, not the inner content alignment (already tuned in the
     round referenced just above). Measured via Playwright at a real
     1440x900 render: this 20% floor was rendering at exactly 180px (content
     inside only needed ~121px, so the 20% floor - not the content - was
     the actual constraint). Dropped to 16.4% (900px * .164 = 147.6px, a
     ~32px reduction, inside the requested 30-35px range) - still comfortably
     above the ~121px the real content needs, so nothing inside gets
     cramped/clipped. */
  --tunnel-bottom-height: 16.4%;
  --tunnel-ease: cubic-bezier(.22, .8, .32, 1);
  /* Per Dave (round 49+, item 4): the top band's headline + chip trail were
     left-aligned to a flat 20px, which sits almost flush against the
     browser's own left edge - "almost falling off the left edge." The
     monitor mockup below (.tunnel-mid__preview) doesn't sit at a flat
     pixel either - it's centered as part of .tunnel-mid__unit (max-width
     1440px, centered above that width) with its own 50px padding-left (see
     .tunnel-mid__unit). This variable reproduces that exact same math so
     the headline/trail's left edge lines up with the monitor's left edge
     at every browser width, not just one: below ~1440px .tunnel-mid__unit
     stretches to fill the row so the monitor's left edge is a flat 50px;
     above ~1440px the unit centers and its left edge shifts right by
     (viewport - 1440)/2, so the monitor moves further right too - this
     calc() mirrors both cases in one value. Verified via Playwright at
     1440px and 1920px (see round-49 note). */
  /* Per Dave (latest round): "all of this content... too far to the left...
     needs to shift towards the right, about 80 pixels" - the base 50px
     floor (and the +50px inside the centered-above-1440px calc) both bumped
     by 80px: 50px -> 130px.
     Per Dave (round 52+, item 3): "top header + timeline row... shift right
     25px" - bumped again, 130px -> 155px. This is now a DELIBERATE
     divergence from .tunnel-mid__unit's own left offset (see item 4's note
     on that rule below) - an earlier round synced the two so the top band
     and mid content shared one left edge; Dave's two most recent requests
     (this one: top band right +25px; mid content: left -25px, see below)
     explicitly break that sync on purpose, so this var is no longer tied to
     .tunnel-mid__unit's padding-left at all. */
  /* Per Dave (this round): "move this content to the left by 25 pixels
     throughout" - top band (headline + chip trail) shifted back left,
     155px -> 130px. */
  /* Per Dave (latest round): "the reverse white header needs to move to the
     left by 30 pixels... a little bit more [in line with] the monitor
     below it, for desktop." Same lever, one more shift left: 130px ->
     100px. Desktop only (this var's whole formula is desktop-scaled; the
     dedicated mobile block elsewhere in this file overrides the headline's
     left padding separately and is untouched). */
  --tunnel-content-left: max(100px, calc((100vw - 1440px) / 2 + 100px));
  /* Per Dave (round 52+, item 4): the middle band's monitor+text column
     (.tunnel-mid__unit padding-left below) used to reuse this same
     --tunnel-content-left value to stay in sync with the top band. Dave now
     wants the middle content 25px further LEFT while the top band moves
     25px further RIGHT (item 3 above) - a deliberate one-time divergence -
     so it gets its own independent variable here instead: prior shared
     130px, minus 25px = 105px. */
  /* URGENT REGRESSION FIX (this round), item 2: Dave reported the monitor +
     text column "pushed way to the left again" after the Login/Create
     Account feature landed. Root-cause investigation via Playwright
     getBoundingClientRect(): the Login/Create Account buttons and
     .tunnel-top__actions (position:absolute, confirmed still intact - see
     that rule above) have ZERO effect on this value or on
     sizeMonitorPreview()/any other JS layout math - none of those functions
     read .tunnel-top's width or this element at all. The monitor's measured
     left edge (104.28px at 1440px width) matched the 105px value here
     exactly, with no discrepancy. So this was NOT a new regression caused by
     the buttons - it's the round-52 105px value, still in effect, just
     reading as "too far left" now that Dave's expectation has settled back
     on the ~130-155px range the top band (--tunnel-content-left, 155px)
     uses. Restored to the pre-round-52-split shared baseline of 130px so
     the mid content sits back inside that established range instead of
     105px. */
  /* Per Dave (this round), item 4: "all of this content in the white
     tunnel - the buttons, the text, and monitor - need to shift towards
     the left by 20 pixels, it feels way too shifted off to the right."
     Monitor + right-side text/buttons both hang off this one shared
     padding-left (.tunnel-mid__unit below), so shifting it left 20px here
     moves both together. --tunnel-content-left (top band: logo/close/
     step-nav) is a fully independent var (see above) and is deliberately
     left untouched - Dave's screenshot only showed the middle content
     area. 130px -> 110px. */
  /* Per Dave (this round), desktop only: "all of this content needs to
     shift 25 pixels to the left on desktop" - same lever as the round-above
     20px shift (this var drives .tunnel-mid__unit's padding-left, which
     moves the monitor + right-side text/buttons together as one unit).
     Mobile is untouched - .tunnel-mid__unit's own mobile override zeroes
     this padding-left out entirely (see mobile block below), so this var
     has no effect there regardless. 110px -> 85px. */
  /* Per Dave (latest round): "everything inside the white metal tunnel...
     shift over to the left by 25 pixels, as one unit... don't change
     anything else just the positioning of it." Same lever again - one
     more 25px left shift, nothing else touched. 85px -> 60px. */
  --tunnel-mid-content-left: 60px;
  /* Per Dave (round 20): "the headers and the super wide text... need to
     be less wide by at least 25%" - headers, bullet lists, body copy, and
     notes were all reading too wide/stretched across every slide type.
     This var drives .tunnel-card's own width (see .tunnel-card below),
     which is the single source of the right-hand content column's overall
     line-length, so trimming it here narrows ALL of those text elements
     consistently in one place rather than patching each one's own
     max-width separately. Was 620px; cut by 25% to 465px. */
  --tunnel-card-w: 465px;
  /* No dedicated "Lewis teal" custom property exists in styles.css - the
     closest palette references are the slate/blue-gray tones labeled
     "teal" there (#49596a, rgba(60,91,123,*)), which read more blue-gray
     than true teal. Using a genuine teal here that still sits in the same
     cool-accent family as --gold (#5e7387); flagging per Dave's request. */
  --tunnel-teal: #1c6b6b;
  --tunnel-teal-bg: #7E3187;
  /* Per Dave (latest round, item 3): darkened variant of the warm-gray/
     taupe palette color above, for spots that need a deeper shade of the
     same family (e.g. the completed-step timeline dot below) rather than
     the flat base tone - roughly 20% darker per channel. */
  /* Item 6 (this round), per Dave: the completed-step timeline dots (and
     the Secure Checkout button, which reuses this same value - see
     .tunnel-checkout-btn below) read as too dark/heavy at #67645e. Lightened
     one moderate step up toward the base --gold (#7E3187) tone, not all the
     way back to it - still clearly darker/more "done"-reading than the base
     palette, just a touch more subtle/subdued as asked.
     UPDATED (Plum/Jade recolor follow-up): this token was never part of
     Dave's original literal find-and-replace list (#817D76/#6E6A64 only),
     so it kept rendering the old discarded beige on every hover state and
     "eyebrow"/subheader that referenced it, even after the rest of the
     palette moved to Plum/Jade. Now set to the same secondary/darker plum
     (#66266E) already used everywhere else in the palette for hover/
     pressed states, so it's consistent instead of a leftover one-off. */
  --tunnel-teal-bg-dark: #66266E;
  --tunnel-bottom-gray: #eef0f0;
  --tunnel-bottom-ink: #1c242a;

  position: fixed;
  inset: 0;
  z-index: 99999;
  display: none;
  flex-direction: column;
  /* Bug fix, per Dave: scrolling the embedded "your new website" preview
     (a real, separately-scrollable iframe) on a phone was snapping the
     whole tunnel closed - overscroll-behavior wasn't set anywhere, so once
     that inner scroll hit its own end, the leftover touch-scroll gesture
     chained through this fixed overlay to the real page underneath (a
     documented iOS WebKit quirk with nested scrollers inside fixed
     overlays). The matching JS-set overscroll-behavior on documentElement/
     body in openTunnel()/closeTunnel() is the primary fix (Safari has been
     inconsistent about which element it honors); this is the same fix
     applied directly to the overlay itself as a second layer. */
  overscroll-behavior: none;
  /* Was #202020 (dark charcoal). Root cause of an intermittent black strip
     at the bottom of the viewport: the top/mid/bottom bands' heights didn't
     always sum to exactly 100% (see .tunnel-mid / .tunnel-bottom flex-basis
     fix below), so any leftover sliver let this root background peek
     through as an alarming black bar. Switched to white as a defensive
     fallback - even if a rounding/layout edge case ever reintroduces a
     sliver, it now reads as harmless white instead of a black bar, on top
     of the real fix (bands always summing to 100%). */
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
}

#webyayTunnel.is-open {
  display: flex;
}

#webyayTunnel * {
  box-sizing: border-box;
}

/* ---------- CHECKOUT REDIRECT INTERSTITIAL ---------- */
/* Fix, per Dave: Secure Checkout used to briefly reveal the real homepage
   underneath the tunnel while the create-checkout fetch was in flight (see
   showTunnelRedirectScreen()/finishTunnel() in tunnel.js for the full root-
   cause writeup). This screen is a plain absolutely-positioned sibling
   inside #webyayTunnel (which stays open/on top for the whole redirect now)
   so it can cover the entire tunnel - top/mid/bottom bands all at once -
   the instant Secure Checkout is clicked, and never lets anything else show
   through while we wait on Stripe. */
.tunnel-redirect-screen {
  /* REBUILT FROM SCRATCH (per Dave, "asked 14 times, start over and do it
     correctly"). Previous version stacked TWO centering mechanisms on top
     of each other (parent flex centering + child position:absolute/
     transform centering) - that never should have been necessary and was
     genuinely confusing to reason about, even though every measurement
     agreed. Torn out entirely and replaced with the simplest possible
     single mechanism: this screen is a CSS Grid with place-items:center,
     full stop. One rule, one job, nothing else touching position/left/top/
     transform anywhere in this block or its child. */
  position: absolute;
  inset: 0;
  z-index: 50;
  display: grid;
  place-items: center;
  text-align: center;
  /* Per Dave (this round, explicitly BOTH desktop and mobile - not scoped
     to the mobile-only media block the rest of this file's recent rounds
     have used): "that thank you screen... boring in white background and
     dark text - change that to the primary dark beige background with
     white type instead." Reuses the same --tunnel-teal-bg dark beige
     already used for the tunnel's own top header band, and swaps the
     ink/muted text-color variables below to their light equivalents so
     every child (.tunnel-redirect-screen__title/__text, which just
     reference var(--ink)/var(--muted)) picks up readable light text
     automatically, no per-child overrides needed. */
  background: var(--tunnel-teal-bg);
  opacity: 0;
  pointer-events: none;
  --ink: #ffffff;
  --muted: rgba(255,255,255,.72);
  transition: opacity .12s ease;
}

.tunnel-redirect-screen.is-open {
  opacity: 1;
  pointer-events: auto;
}

.tunnel-redirect-screen__inner {
  /* Plain, static, in-flow block - centered purely because its grid parent
     centers it. No position/left/top/transform here at all. */
  max-width: 420px;
  width: 100%;
  box-sizing: border-box;
  padding: 0 24px;
  margin: 0 auto;
}

.tunnel-redirect-screen__eyebrow {
  display: block;
  font-size: 11px;
  letter-spacing: .14em;
  text-transform: uppercase;
  /* Bug fix, per Dave ("it ALL must be white text"): was var(--gold), which
     resolves to #7E3187 - the exact same value as this screen's own
     background (--tunnel-teal-bg). That made this line invisible (not
     literally black, but unreadable/blended into the background, the same
     underlying complaint), confirmed via screenshot showing a blank gap
     where "Order Received" should read. Switched to white so it's visible
     and consistent with every other line on this screen. */
  color: #ffffff;
  margin-bottom: 14px;
}

.tunnel-redirect-screen__title {
  /* ACTUAL ROOT CAUSE FOUND (this round), per Dave's ~15th report on this,
     finally traced by measuring THIS element's own rect instead of just its
     parent's: styles.css has a GLOBAL `h2{...max-width:11ch}` rule (line
     208) that this override never reset. This title IS an <h2> - so it was
     silently capped to an 11-character-wide box the whole time. A block box
     narrower than its container left-aligns by default (text-align:center
     only centers the TEXT INSIDE a box, it does nothing for the box's own
     position unless margin is auto) - so the title box itself was sitting
     flush against the left edge of the otherwise-correctly-centered
     .tunnel-redirect-screen__inner container, while the eyebrow/subtitle
     (a <span>/<p>, neither affected by the h2 rule) rendered correctly
     centered right below/above it. That's exactly the "message reads
     skewed left" Dave kept seeing - every prior check measured
     .tunnel-redirect-screen__inner's own box (genuinely centered, hence
     always passing) and never checked this specific child's box width.
     max-width:none removes the inherited cap so this title fills the same
     width as its siblings and centers correctly like they do. */
  max-width: none;
  margin: 0 0 12px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 600;
  font-size: clamp(24px, 2.6vw, 30px);
  line-height: 1.2;
  color: var(--ink);
}

.tunnel-redirect-screen__text {
  margin: 0 auto 28px;
  font-size: 15px;
  line-height: 1.5;
  /* Bug fix, per Dave: "half the text in white and the other half text in
     black - it ALL must be white text." Root cause: this was hardcoded to
     a dark value (rgba(28,36,42,.82), left over from before the screen's
     background was switched to dark beige) instead of picking up the
     light --muted variable set on the .tunnel-redirect-screen parent -
     that hardcoded dark literal is exactly what was rendering as the
     "black" half of the text against the now-dark background. Switched to
     a genuine white so it matches the __title/__eyebrow, which already
     read correctly. */
  color: rgba(255,255,255,.86);
}

.tunnel-redirect-screen__logo {
  /* Added per Dave, explicitly BOTH desktop and mobile: WaltersGroup logo
     centered above the "Thank you for your order" text on this screen.
     Bumped 50% larger (34px -> 51px) per Dave's latest ask - same
     both-platform scope as the original addition, no mobile-only reason
     to split it. */
  display: block;
  height: 51px;
  width: auto;
  margin: 0 auto 22px;
}

.tunnel-redirect-screen__spinner {
  width: 26px;
  height: 26px;
  margin: 0 auto;
  border-radius: 50%;
  /* Was rgba(28,36,42,.14) - a dark ring, nearly invisible against this
     screen's dark-beige background (same stale-dark-literal issue as
     __text above). Lightened so the ring itself is visible; the gold
     top-color (the actual spinning accent) is unchanged. */
  border: 2.5px solid rgba(255,255,255,.22);
  border-top-color: var(--gold);
  animation: tunnelRedirectSpin .8s linear infinite;
}

@keyframes tunnelRedirectSpin {
  to { transform: rotate(360deg); }
}

/* ---------- TOP BAND ---------- */
.tunnel-top {
  position: relative;
  /* Was "flex: 0 0 var(--tunnel-top-height)" + hard height + overflow:hidden,
     which clipped the chip trail whenever the headline wrapped/grew and the
     combined content height exceeded the rigid 20% band. flex-basis is now
     "auto" (content-based) with min-height as a floor, so the band sizes to
     its real content and only ever grows past 20%, never clips it.
     Root-cause fix for the intermittent black-strip bug: the mid/bottom
     bands used to have their OWN hard fixed percentage heights too (e.g.
     60% + 20%), which combined with this band's min-height could sum to
     more or less than 100% of the viewport (most visibly when the
     max-height:760px query dropped this band's min-height to 14% but left
     mid/bottom at their desktop 60%/20% figures - 14+60+20 = 94%, leaving a
     real 6% gap of the dark root background exposed at the bottom of the
     window). The mid band is now `flex: 1 1 auto` (see .tunnel-mid below)
     so it always absorbs whatever space this band and the bottom band
     don't use - the three bands mathematically always sum to exactly 100%
     of the container's height, with no percentage arithmetic to keep in
     sync and no rounding gap possible. */
  flex: 0 1 auto;
  /* Per Dave (round 26): "make top bar about 40 pixels taller (goes lower)
     and you could remove that amount from the middle tunnel, the white
     tunnel." The top band's height was purely --tunnel-top-height (a % of
     the viewport); adding a flat +40px on top of that (rather than just
     bumping the percentage) grows it by a consistent ~40px at any viewport
     height, matching "40 pixels" literally instead of a height-relative
     amount that would vary by window size. No change needed to .tunnel-mid
     or .tunnel-bottom to compensate - .tunnel-mid is flex:1 1 auto (see its
     block below) and always absorbs whatever's left after top+bottom, so it
     automatically shrinks by the exact same ~40px this line adds, and the
     three bands still always sum to exactly 100% of the container (the
     black-strip fix from an earlier round stays intact). This calc() also
     picks up the @media (max-height:760px) override of --tunnel-top-height
     below automatically, so the short-viewport clipping fix from that round
     stays in effect too, just +40px taller in that mode as well. */
  /* Per Dave (round 28): the +40px added in round 26 made the top band
     "too tall" - trimmed by 25px (down to +15px net) per his explicit ask
     ("make it like 25 pixels shorter than you have it"). */
  /* Per Dave (round 45+): bumped from +13px to +26px in step with the
     bigger headline (see --tunnel-top-height and .tunnel-top__headline h2
     above/below) so the band's floor still comfortably fits the much
     taller glyph box plus real breathing room below it before the chip
     trail, without stretching the band back toward its original tall
     size. */
  /* Per Dave (round 46+): headline walked back to 600-weight/80%-size (see
     h2 rule below) - trimmed the +26px floor addition down to +22px in
     step, same partial-revert logic as --tunnel-top-height above (keeps
     most of the 45+ room since the headline is still bigger than pre-45,
     but no longer needs the full amount added purely for the 800/68px
     version). */
  /* CORRECTED (this round), per Dave's diagram: the headline stays right
     here in this band - it's the chip TRAIL that moved down into the gray
     .tunnel-bottom band instead (see .tunnel-bottom__header in this file).
     This band now only has to fit the logo bar + headline (no trail row
     below it anymore), so the old +22px floor - sized to clear headline
     AND trail together - is trimmed back, but headline itself is
     UNTOUCHED (still its full original size/weight, per Dave's explicit
     "keep the header [size] the same, all else remaining equal" - only
     this band's own floor height and the headline's own bottom padding
     below changed, to let it settle a bit lower and fill the space the
     trail used to occupy, not to shrink it). */
  /* Per Dave (this round): "top banner is too tall... shorter by about 25
     pixels, keeping the reverse header and everything in that bar in the
     exact same place - just a shorter header - and put the space you're
     gaining into the middle white tunnel." Trims this floor by 25px
     (14px -> -11px net) rather than touching any padding/logo/headline
     rule above, so the logo bar and headline stay pinned exactly where
     they already are - only the empty space below the headline, before
     the band's bottom edge, shrinks. .tunnel-mid is flex:1 1 auto (see
     its own rule further below) and always absorbs whatever this band
     and .tunnel-bottom don't use, so the reclaimed 25px goes straight to
     the white middle band automatically - no separate change needed
     there. Untouched: the 768-1023px tablet breakpoint's own separately-
     tuned min-height override further below (a different, deliberately
     tuned value for that range, not part of this ask). */
  min-height: calc(var(--tunnel-top-height) - 11px);
  height: auto;
  /* Plum -> Jade color change (this round), per Dave's design-review spec:
     the flat --tunnel-teal-bg fill + translucent-black depth overlay (both
     from the earlier "gradation darkening" experiment, see prior comment
     history) are replaced with the new diagonal plum->jade gradient below.
     The gradient carries its own depth, so the old black-to-transparent
     overlay layer is removed entirely rather than layered on top of it -
     layering it back on would mute the jade end and muddy the plum. The
     128% on the last stop is intentional (per spec) - it pushes the
     brightest jade just past the lower-right corner so the band stays
     mostly plum and only picks up green at the very corner; do not
     normalize it to 100%. */
  background: linear-gradient(135deg, #6A2A84 0%, #438094 58%, #1BD6A3 128%);
  border-bottom: 1px solid rgba(255,255,255,.16);
  display: flex;
  flex-direction: column;
}

.tunnel-top__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* Reverted (per Dave, latest round): back to zero top padding so the
     logo's orange/gold divider line sits flush against y=0, matching the
     original pre-regression state. The prior round's 14px "clearance" fix
     is undone per explicit instruction. */
  padding: 0 28px 0 28px;
}

.tunnel-top__logo {
  /* Dave: "miniature, needs to be twice that big" - was 26px, now 52px.
     Still the same WaltersGroup mark (assets/img/wg-logo.svg), not swapped
     for the WebYay logo per his explicit "keep it WaltersGroup" note. */
  height: 44px;
  width: auto;
  filter: brightness(1.05);
  opacity: 1;
}

/* Per Dave (latest round, item 4): "change this closing box up here to a
   pill button that says 'Close'... make it the same size pill button as
   most of the other pill buttons you have, like a Yes/No pill button."
   Swapped the small circular icon-only "x" for a text pill sized to match
   .tunnel-yesno__btn's own convention (same font-size/weight/letter-spacing/
   padding/border-radius) - just tinted for this band's white-on-#7E3187
   translucent-glass button language (matching the close button's own prior
   background/border tokens) instead of the yesno buttons' solid-white card
   treatment. Click behavior (closeTunnelAndModal in tunnel.js) is
   completely unchanged - this is a pure visual/markup swap. */
.tunnel-top__close {
  appearance: none;
  border: 1.5px solid rgba(255,255,255,.28);
  background: rgba(255,255,255,.08);
  color: var(--ink);
  width: fit-content;
  min-width: 0;
  height: auto;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .02em;
  padding: 10px 22px;
  border-radius: 999px;
  line-height: 1;
  cursor: pointer;
  text-align: center;
  transition: background .2s ease, border-color .2s ease;
  /* REGRESSION FIX (latest round), item 4: the narrow-viewport-only fix
     below (added in an earlier round) used a `transform: translate(...)`
     that only applied under the max-width:1180px query - at normal/wide
     desktop widths this button was still governed purely by
     .tunnel-top__bar's align-items:center (that row's own height is set
     by the 44px logo, and this button's own ~52px-tall box, centered,
     landed only ~5-6px from the viewport top - confirmed live via
     Playwright getBoundingClientRect() at 1280/1440/1920px: closeBtn.top
     was 5.5px at all three, well under the 25-30px Dave asked for).
     Root-cause fix: align-self:flex-start pulls this button out of that
     row-height-driven centering so its own margin-top becomes the ONLY
     thing controlling its distance from the viewport top, at every
     desktop width - not just the narrow range. 26px lands comfortably in
     the requested 25-30px band (re-verified via Playwright after this
     change). */
  align-self: flex-start;
  margin-top: 26px;
}
.tunnel-top__close:hover { background: rgba(255,255,255,.16); border-color: rgba(255,255,255,.4); }

/* Item 11 (this round), per Dave: "below this Close button... we need to
   have a Login button and we need to have a Create Account button." Simple
   stacked column in the top-right corner - Close stays first/top exactly
   where it already was (align-self:flex-start + margin-top:26px on
   .tunnel-top__close is untouched), Login/Create Account stack directly
   beneath it at a smaller gap. */
/* URGENT REGRESSION FIX (this round), item 1: this column was left as a
   normal-flow flex-row CHILD of .tunnel-top__bar (sibling of the logo).
   .tunnel-top__bar's row height is governed by its tallest child under
   align-items:center - once this became a 3-button stacked column, IT
   became the tallest thing in the row (taller than the 44px logo), so the
   whole bar grew to fit it, and since .tunnel-top's own height is purely
   content-driven (flex:0 1 auto + min-height floor, see .tunnel-top above),
   that growth dragged the entire band's height with it - roughly doubling
   it and pushing the logo/headline/timeline down. Root cause confirmed live
   via Playwright getBoundingClientRect(): .tunnel-top__bar's own height
   tracked this column's stacked-button height 1:1, not the logo's 44px.
   Fix: take this column COMPLETELY out of normal flow with
   position:absolute, anchored to .tunnel-top (already position:relative,
   see that rule above) rather than participating in .tunnel-top__bar's row
   layout at all - same technique .tunnel-top__close itself used to use
   before this group existed (align-self:flex-start + margin-top, i.e.
   "float in the corner without affecting row height"), just formalized as
   true absolute positioning now that it's a 3-item column instead of a
   single button. top/right values reproduce the exact same visual position
   the close button had pre-regression: 40px = .tunnel-top__bar's own 14px
   padding-top + the close button's former 26px margin-top; 28px matches
   .tunnel-top__bar's own left/right padding so the column's right edge
   lines up with the logo's left padding on the opposite side. Because this
   is now absolute, it can never again influence .tunnel-top__bar's or
   .tunnel-top's height, no matter how tall its content gets. */
/* Fix (this round), item 1, per Dave: "this needs to move up at least 20px" -
   still position:absolute (unchanged, see regression-fix comment above), so
   nudging top has zero effect on .tunnel-top__bar's row height or
   .tunnel-top's min-height floor - confirmed via Playwright
   getBoundingClientRect() after this edit (top band height + logo position
   unchanged). 40px -> 20px (-20px). */
.tunnel-top__actions {
  position: absolute;
  top: 20px;
  right: 28px;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 8px;
  margin-top: 0;
}
/* Fix (this round), item 11: .tunnel-top__close's own align-self:flex-start
   was written for when it was a direct row-child of .tunnel-top__bar (to
   opt out of that row's vertical centering) - now nested one level deeper
   inside the .tunnel-top__actions COLUMN above (itself absolutely
   positioned, see the regression-fix comment above), that align-self
   property would instead push it to the column's opposite (left) cross-axis
   edge, misaligning it from the Login/Create Account pills below it. Reset
   back to the column's own flex-end alignment (matching its siblings) and
   drop the now-redundant margin-top (the column's own top/right positioning
   carries the clearance for the whole group now). */
.tunnel-top__actions .tunnel-top__close {
  align-self: flex-end;
  margin-top: 0;
}
/* SIMPLIFIED (this round), per Dave: "the new buttons (Login and Create
   Account) need to be side-by-side, on a different layer so they do NOT
   push everything around... I do not want them to be equal-sized buttons
   as 'Close' - in fact they can just be side-by-side text links, not
   enormous buttons that blow up the page." Replaces the old
   .tunnel-top__auth-btn pill recipe entirely - Login/Create Account are now
   plain small text links, not bordered/filled pill buttons at all. They
   still live inside .tunnel-top__actions (position:absolute, see above), so
   this row can never influence .tunnel-top's layout - and being tiny text
   instead of two more ~52px-tall pills makes the group's total footprint
   smaller than ever, not bigger. */
.tunnel-top__auth-links {
  display: flex;
  align-items: center;
  gap: 7px;
}
/* BUG FIX (this round), per Dave: "Hi [Name]!" and "Login • Create Account"
   were both rendering at once (screenshot showed "Create Account" sitting
   directly above "Hi Dave!"). Root cause: syncTunnelAuthUI() in tunnel.js
   correctly sets the `hidden` attribute/property on whichever of these two
   elements should disappear, but this rule above sets `display: flex`
   unconditionally on .tunnel-top__auth-links (author-stylesheet origin) -
   author CSS always wins over the browser's built-in `[hidden]{display:none}`
   UA-stylesheet rule regardless of selector specificity, so `hidden` was
   being silently overridden and the links stayed visually flex/visible even
   while `hidden` was true. .tunnel-top__greeting never had this problem (it
   has no explicit `display` override), which is why only the links half of
   the toggle was stuck showing. Adding an explicit `[hidden]` rule here
   (same specificity fight, but now on our side) restores the intended
   mutually-exclusive behavior. */
.tunnel-top__auth-links[hidden] {
  display: none;
}
.tunnel-top__auth-link {
  appearance: none;
  border: none;
  background: none;
  color: rgba(255,255,255,.72);
  width: fit-content;
  min-width: 0;
  height: auto;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Fix (this round), item 1, per Dave: Login/Create Account "don't have to
     be that massive, could be smaller" - 12px -> 10px. */
  font-size: 10px;
  font-weight: 500;
  letter-spacing: .01em;
  padding: 0;
  margin: 0;
  line-height: 1;
  cursor: pointer;
  text-align: center;
  text-decoration: underline;
  text-underline-offset: 2px;
  transition: color .2s ease;
}
.tunnel-top__auth-link:hover { color: #fff; }
.tunnel-top__auth-sep {
  color: rgba(255,255,255,.4);
  font-size: 11px;
  line-height: 1;
}
/* Greeting fix (this round), per Dave: when the visitor is already logged
   in, "Hi [FirstName]!" replaces the Login/Create Account links in the
   exact same spot - a plain sibling inside the same .tunnel-top__actions
   column (still position:absolute, see above), toggled via [hidden] by
   tunnel.js's syncTunnelAuthUI(). Styled to match .tunnel-top__auth-link's
   size/color/weight so swapping the two never changes the column's
   footprint or the top band's height. */
.tunnel-top__greeting {
  color: rgba(255,255,255,.72);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Fix (this round), per Dave: "Hi [Name]!" was rendering too small next
     to the Close button - "this needs to be larger text greeting the
     person." Bumped from 11px (matching .tunnel-top__auth-link) up to 14px,
     a clearer/friendlier size. .tunnel-top__actions stays position:absolute
     (unchanged - see its rule below), so this has zero effect on
     .tunnel-top's own height. */
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .01em;
  line-height: 1;
  white-space: nowrap;
  /* Fix (this round), item 3, per Dave: "Hi [Name]!" had no way back to
     Login/Create Account. This element now holds two children - the name
     text (data-tunnel-greeting-name) and a small "Log out" link
     (data-tunnel-logout, reuses .tunnel-top__auth-link's own size/color/
     underline styling) - display:flex + a small gap lays them out
     side-by-side in the exact same corner spot, same as Login • Create
     Account did before. */
  display: flex;
  align-items: center;
  gap: 6px;
}
/* Defensive pairing with .tunnel-top__auth-links[hidden] above: explicit
   [hidden] override here guarantees the two states stay mutually exclusive
   now that the base rule above sets an explicit `display: flex`. */
.tunnel-top__greeting[hidden] {
  display: none;
}
/* Item 3 (this round): thin vertical divider between the "Hi [Name]!" text
   and the "Log out" link, matching the same bullet-separator idea already
   used between Login and Create Account (.tunnel-top__auth-sep) so the two
   states read as visually consistent siblings, not different patterns. */
.tunnel-top__greeting-logout {
  padding-left: 6px !important;
  border-left: 1px solid rgba(255,255,255,.3);
}

/* Latest round, item 4, per Dave: on a narrow/mobile viewport the "Close"
   pill was sitting right up against/touching the browser's own top chrome -
   .tunnel-top__bar deliberately has 0 top padding (see its comment above,
   so the logo's gold divider line touches y=0), which left this pill with
   no real clearance either since it shares that same row.
   IMPORTANT: the tunnel is hard-gated to desktop-only widths elsewhere in
   this file (`@media (max-width: 1023px) { #webyayTunnel { display: none
   !important; } }`, further down) AND at open-time in tunnel.js
   (isDesktop(), DESKTOP_MIN_WIDTH = 1024) - it never renders at all below
   1024px, true phone widths included. So "narrower/mobile" here can only
   mean the narrow end of the tunnel's own real, reachable range (a small/
   non-maximized desktop or laptop window just above that 1024px floor),
   not an actual phone viewport. Breakpoint set at 1180px accordingly -
   comfortably covers that narrow-desktop range while leaving the normal/
   wide desktop layout untouched.
   REGRESSION FIX (latest round), item 4: switched from a `transform:
   translate(-15px, 25px)` layered on top of the (then-centered) base
   position to an explicit margin-top, now that the base rule above
   already uses align-self:flex-start + margin-top:26px as its own real
   vertical anchor - transform would have stacked on top of that new base
   offset and pushed this button too far down. translateX still handles
   the pure-horizontal 15px nudge left; margin-top is set directly (not
   added via transform) so the two breakpoints don't compound.
   URGENT REGRESSION FIX (this round), item 1: the base rule above is now
   position:absolute (top/right), so this narrow-width override is rewritten
   to nudge those same top/right values directly instead of layering a
   transform + margin-top on top of a flow-based position - avoids any
   compounding between the two breakpoints. */
@media (max-width: 1180px) {
  .tunnel-top__actions {
    /* Fix (this round), item 1: matched the -20px nudge applied to the base
       rule above (44px -> 24px) so narrow-desktop widths get the same
       upward move Dave asked for. */
    top: 24px;
    right: 13px;
  }
}

.tunnel-top__headline {
  flex: 1;
  display: flex;
  align-items: center;
  /* Per Dave (round 44+): "I don't really think I like that header...
     dead center. I think it wants to be justified left to the buttons
     below it" - was centered; now left-aligned so its text starts at the
     exact same left edge as the timeline row underneath it. Both this
     element and .tunnel-trail share the same 20px left padding (see
     .tunnel-trail below), so their content naturally lines up without
     needing a separate shared-variable hack. */
  justify-content: flex-start;
  text-align: left;
  /* Extra top padding + the h2's own line-height below give ascenders/
     tall punctuation (g, &, capital letters with overshoot) breathing
     room above the glyph baseline so they never touch the band's edge.
     Per Dave: bottom padding raised from 4px so the headline isn't nearly
     touching the chip trail below it (see .tunnel-trail's top padding,
     bumped in tandem) - comfortable normal spacing between the two. */
  /* Per Dave (round 28): "the reverse headline is floating out on its own,
     it should be a little closer to the buttons [chip trail], but not like
     touching them like you had before" - a prior round bumped this bottom
     padding (and .tunnel-trail's top padding, in tandem) from 4px to 14px
     to fix a clipping bug. Trimmed back partway (14px -> 9px here, 14px ->
     9px on .tunnel-trail below) - a moderate middle ground between the old
     touching/clipped 4px and the too-loose 14px, not a full reset. */
  /* Per Dave (round 45+): the headline's font-size just jumped dramatically
     (see h2 rule below) - bumped bottom padding from 8px to 18px so the
     now much larger, heavier text doesn't crowd the chip trail underneath
     it (see .tunnel-trail's matching top-padding bump below). */
  /* Per Dave (round 46+): headline text shrunk back down (see h2 rule
     below) - trimmed 18px back to 15px in step, same partial-revert as
     --tunnel-top-height/.tunnel-top's min-height above (still a bit more
     than the pre-45 8px since the headline is still a little larger than
     that original size, but no longer needs the full 18px added purely to
     clear the 800-weight/68px version). */
  /* Per Dave (round 49+, item 4): left value switched from the flat 20px
     to --tunnel-content-left (see #webyayTunnel above) so this headline's
     left edge tracks the monitor mockup's left edge instead of the
     browser's own edge. Top/right/bottom untouched. */
  /* Per Dave (latest round): "all these headers are too high - lower
     position by 15px" - top padding bumped 7px -> 22px. .tunnel-top's own
     flex-basis is content-driven (min-height only, see .tunnel-top above),
     so the band grows to absorb this instead of clipping/crowding the
     chip trail underneath. */
  /* Per Dave (round after that): still too high - "lower by another 12-13px".
     Bumped 22px -> 35px (+13px). --tunnel-top-height's floor was nudged up
     in step (see #webyayTunnel above, 18% -> 19%) so this extra padding has
     real room to land without crowding/overlapping the chip trail row
     underneath. */
  /* REGRESSION FIX (this round), item 5b: "that header needs to be
     positioned closer to the timeline - about half as much padding between
     the headers... and the timeline." The headline-to-trail gap is the SUM
     of this padding-bottom (15px) and .tunnel-trail's padding-top (8px,
     below) = 25px total. Halved this side: 15px -> 7px (paired with
     .tunnel-trail's 8px -> 5px below, total gap 25px -> 12px, ~half). */
  /* Per Dave (this round), item 1: "make the top band about 15% shorter."
     Root-cause check via Playwright: .tunnel-top's flex-basis is "auto"
     (content-driven, see .tunnel-top above) with min-height only acting as
     a FLOOR - measured the real rendered top band at 1440x900 at
     222.16px, while the --tunnel-top-height-driven floor was only
     ~170.5px (16.5% * 900 + 22px). Since content already exceeds the
     floor, changing --tunnel-top-height alone (done above, 16.5% -> 14%)
     produces ZERO visible change - the floor was never the actual
     constraint. This padding-top is the single largest real contributor
     to the band's rendered height, so it's the lever that actually moves
     the needle: trimmed 35px -> 13px (paired with .tunnel-trail's
     padding-bottom below, 8px -> 3px), landing the measured top band at
     ~188.7px - a genuine ~15% cut from the 222.16px baseline, verified via
     a fresh Playwright measurement + screenshot (logo/headline/timeline
     all still comfortably fit, nothing clipped/cramped). */
  /* Per Dave (this round), item 2: "still floating too far from the tabs/
     timeline below - halve the gap again." The prior 12px combined-padding
     figure above referred only to the CSS source values, not the real
     rendered gap - measured live via Playwright getBoundingClientRect() at
     1440x900: the ACTUAL visible gap from the headline text's own glyph
     bottom (a Range over the h2's text node, not the line-box) down to the
     first timeline dot's top edge was 13.27px, not 12px - line-height
     leading below the glyph (~1.27px) plus this padding-bottom (7px) plus
     .tunnel-trail's padding-top (5px, below) all stack up to that number.
     Halved the real 13.27px target (~6.6px): trimmed this side 7px -> 3px
     (paired with .tunnel-trail's 5px -> 2.5px below), leaving the ~1.27px
     line-height leading untouched (it's baked into the font metrics, not a
     spacing value) for a new measured total of ~6.3px, genuinely half of
     the old 13.27px - re-verified via a fresh Playwright measurement after
     this change. */
  /* REGRESSION FIX (this round), item 3: repeated rounds chasing "move the
     header down closer to the timeline" kept cutting padding-TOP (35px ->
     13px over several passes) while padding-BOTTOM (the actual header-to-
     timeline gap) was separately being cut too - conflating two independent
     properties. The steadily shrinking padding-top made the header sit
     pinned near the top edge of the band, which read as "smaller/moved up"
     even though the h2's own font-size clamp was never reduced (still the
     large clamp(27px,3.7vw,54px) below - actually bigger than the older
     "unified" size, not smaller). Restored padding-top to a middle-ground
     17px (not all the way back to the original 35px, but enough that the
     headline reads big/prominent again instead of cramped against the top
     edge) while leaving padding-bottom untouched at its current small 3px
     so the close gap to the timeline (the thing Dave actually wanted kept)
     is preserved. */
  /* Latest round, item 3 (4th+ round on this exact gap): re-measured live
     via Playwright getBoundingClientRect() rather than trusting the CSS
     source (per Dave's explicit ask, given the documented history of the
     visual gap not matching what these padding values implied). At
     1440x900: the real distance from the headline h2's own rendered
     bottom edge down to the first timeline dot's slot top (.tunnel-chip__
     dot, .tunnel-trail's first child) measured 5.5px - made up of this
     padding-bottom (3px) + .tunnel-trail's padding-top (2.5px, below).
     Halved both sides of that real total: 3px -> 1.5px here (paired with
     .tunnel-trail's 2.5px -> 1.25px below), landing a new measured total
     of ~2.75px, genuinely half of the confirmed 5.5px - re-verified via a
     fresh Playwright measurement + before/after screenshot after this
     change (see tunnel_test.js in this round's working notes). */
  /* Per Dave (this round): "these heads are slightly too high, move them
     down about nine pixels throughout" - bumped padding-top +9px (17px ->
     26px), applies to every category's headline since they all share this
     one rule. .tunnel-top's own height is content-driven (min-height only,
     not a hard cap - see #webyayTunnel above), so it absorbs the extra 9px
     without crowding/clipping the chip trail underneath. */
  /* Fix (this round), per Dave's diagram: the chip trail that used to sit
     directly below this headline moved down into the gray .tunnel-bottom
     band instead (see .tunnel-bottom__header). Nothing follows this
     headline in this band anymore, so its old tight 1.5px bottom padding -
     tuned purely to keep it close to that trail - now just reads as
     "headline crammed near the top with empty space below it." Bumped to
     20px so it settles down a bit into the room the trail used to occupy,
     per Dave's explicit "scoots down a bit to compensate." Font-size/
     weight/color on the h2 itself (below) are completely untouched - this
     is a spacing-only change, not a resize. */
  /* Fix (this round), per Dave: "move these headers down 10px throughout" -
     bumped padding-top +10px (26px -> 36px), applies to every category's
     headline since they all share this one rule. .tunnel-top's own height
     is content-driven (min-height only, not a hard cap - see #webyayTunnel
     above), so it absorbs the extra 10px without clipping anything. */
  /* Fix (this round), per Dave: "the reverse header up above is a little
     bit high within that dark beige background bar... lower that throughout
     about 7 pixels." Same "throughout" convention as the fix above - bumped
     +7px again (36px -> 43px); see the matching max-height:760px
     short-viewport variant of this same padding-top, updated in step below. */
  /* Per Dave (this round): "it doesn't look any different... needs to be
     shorter, maybe 15px shorter; header not shifting." The earlier attempt
     this round trimmed .tunnel-top's min-height floor, but that band's
     real height is content-driven (flex:0 1 auto - min-height only acts as
     a floor, see .tunnel-top above) and this headline's own padding is
     what actually determines the band's real rendered height, so the
     min-height edit alone had zero visible effect - same root-cause
     pattern documented in this block's history above. This padding-bottom
     (the empty space below the headline text, before the band's own
     bottom edge) is the real lever: trimmed 20px -> 5px, a genuine 15px
     cut. padding-top (43px) is untouched so the logo bar and the headline
     text itself stay pinned exactly where they are - only the trailing
     space shrinks, and .tunnel-mid (flex:1 1 auto) automatically absorbs
     the reclaimed 15px into the white middle band. */
  padding: 43px 20px 5px var(--tunnel-content-left);
}

.tunnel-top__headline h2 {
  margin: 0;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Per Dave (round 45+): referencing Apple.com/store's giant bold "Store"
     headline as the target - "big and bold... left justified to the
     timeline buttons." Bumped from 600 to 800 (Plus Jakarta Sans' heaviest
     practical weight before Black starts looking off in this font at this
     size) to match that dense, heavy look. */
  /* Per Dave (round 46+): "not exactly; don't want this header that bold,
     match the weight of the smaller headers." Reverted 800 back to 600 -
     the exact same font-weight already used on .tunnel-card__question (the
     main slide question headers), so this headline now reads at the same
     weight/density as those instead of the ultra-bold Apple.com/store
     treatment. */
  /* Per Dave (round 50+): "the headers are still too heavy weight, needs
     to be less bold." Dropped 600 -> 500 (Plus Jakarta Sans' Medium weight
     renders cleanly - it's a variable font with real weight steps from
     200-800, so 500 isn't a fake/synthetic weight) - reads clearly lighter
     than the old 600 while still dense enough to hold up as a headline at
     this large clamp() size, not flimsy/thin.
     Fix (this round), per Dave: "made those headers throughout slightly
     less heavy than they are (on desktop)" - one more small step down,
     500 -> 450 (still a real weight step on this variable font, not
     synthetic). No separate mobile/narrow-breakpoint override sets its
     own font-weight for this element, so this single change already
     covers every width, matching "throughout." */
  font-weight: 450;
  /* Per Dave (round 45+): a prior round shrank this ~15% in step with the
     rest of the top band (18->15, 28->24). Dave has now asked for the
     headline itself to be dramatically bigger regardless of that band
     trim - "the same size as what you're seeing here with 'Store'... kind
     of big and bold" - so this clamp jumps well past even the original
     pre-shrink 24/40px ceiling, into the 56-72px range he referenced,
     using the same clamp() pattern already established on
     .tunnel-card__question elsewhere in this file. Reusing nowrap +
     ellipsis below still keeps any real headline text on one line so it
     can't wrap and blow out the band's height. */
  /* Per Dave (round 46+): "about 20% smaller in type size" - each clamp()
     number scaled to exactly 0.8x (34->27.2->27px, 4.6vw->3.68vw->3.7vw,
     68->54.4->54px), same proportions, just 20% smaller across the board. */
  font-size: clamp(27px, 3.7vw, 54px);
  /* Was unset (browser default ~1.2), which is tighter than this font's
     real ascent+descent box - combined with `overflow:hidden` below (kept
     for the ellipsis truncation to work), the line box clipped the very
     top of ascenders and tall glyphs like "g" and "&" on headlines such as
     "Want ongoing hosting & care?". A slightly taller line-height gives
     the full glyph, including overshoot, room inside the line box so
     `overflow:hidden` never crops it. */
  /* Per Dave (round 50+): even at 1.15, descenders (the tail of "g" in
     "Website Changes", etc.) were still visibly cropped flat along the
     bottom edge - confirmed via computed box model that the line box
     (line-height * font-size) was shorter than Plus Jakarta Sans' real
     ascent+descent metrics at this font-size, and `overflow:hidden` on
     this element clips to that too-short line box. Bumped 1.15 -> 1.3 so
     the line box has enough room for the font's full descent (matches the
     analogous 1.2 -> bump on the short-viewport clamp below). */
  line-height: 1.3;
  letter-spacing: -.01em;
  color: var(--ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 100%;
  transition: opacity .28s ease, transform .32s var(--tunnel-ease);
}

/* BUG FIX, per Dave's screenshots: "Website Chan..." / "Your new web..."
   were getting cropped on the right edge. Root cause: this element's own
   `overflow:hidden` (set above) was tuned for the OLD plain-text content,
   where it paired with `text-overflow:ellipsis` to truncate a genuine text
   node that ran too long. Now that the content is the animated SVG (see
   animateHeadlineIn() in tunnel.js and .tunnel-headline-svg below, which
   already sets its OWN overflow:visible), that ancestor overflow:hidden
   was clipping the SVG's rendered text at this element's box edge - the
   child's own overflow:visible can't escape a hidden ancestor. Scoped via
   :has() to only the SVG-content case, so the (extremely old-browser-only)
   plain-text fallback path in animateHeadlineIn keeps the original
   ellipsis-truncation behavior untouched. */
.tunnel-top__headline h2:has(.tunnel-headline-svg) {
  overflow: visible;
  text-overflow: clip;
}

.tunnel-top__headline h2.is-swapping {
  opacity: 0;
  transform: translateY(8px);
}

/* Per Dave: "have [the reverse headers] be animated exactly like the
   animation in this attached [logo] file" - and (round 2) "that animation
   isn't even close... not just zipping it across." See animateHeadlineIn()
   in tunnel.js for the full round-1-bug/round-2-rebuild story - this is now
   a REAL SVG stroke-dasharray draw animation (same technique the reference
   file used), just built on a live SVG <text>/<tspan> per character instead
   of pre-drawn <path> letterforms, since this headline text is dynamic
   (different per category, different per breakpoint).
   .tunnel-headline-svg: the outer SVG replaces the h2's plain text node.
   No viewBox is set on purpose - with no viewBox, 1 SVG user unit = 1 CSS
   pixel, so the <text>/<tspan> children below can just use normal font-size
   units directly with no coordinate-system math. `overflow:visible` so
   stroke width and any glyph ascender/descender overshoot never clips
   (deliberately more permissive than the old plain-text h2's own
   overflow:hidden, which existed for its now-unused text-overflow:ellipsis
   - this replaces that with generous height instead, see below). */
.tunnel-headline-svg {
  display: block;
  overflow: visible;
  width: 100%;
  /* Tall enough to clear this headline's full clamp(27px,3.7vw,54px) range
     plus real descender/ascender room at every size in that range, so nothing
     from the animated stroke ever clips even though overflow is visible
     (visible just means IF it clipped it wouldn't - height is still the
     real safety margin). */
  height: 1.4em;
}
/* Font-family/weight/size/letter-spacing and color are all deliberately
   left unset here - see animateHeadlineIn()'s comment in tunnel.js: these
   are inherited CSS properties, so this SVG text picks up exactly what the
   real <h2 data-tunnel-headline> ancestor (and its many existing per-
   breakpoint font-size overrides throughout this file) already renders,
   with zero duplicated sizing logic to keep in sync. fill/stroke are set to
   currentColor so they follow that same inherited `color`. */
.tunnel-headline-svg__text {
  fill: currentColor;
  stroke: currentColor;
  /* BUG FIX, per Dave: "too thick line." Miscalculated the reference's
     proportion the first time around - the reference's stroke-width:.9 is
     relative to its viewBox's ~58-unit CAP-HEIGHT, not the full em box (cap-
     height is roughly 0.7 of font-size for most sans fonts, this one
     included) - 0.9/58 = ~1.55% of cap-height, which converts to ~1.55% *
     0.7 = ~1.1% of font-size, not the 3.5% originally used here (a real
     ~3x-too-thick error). Relative to font-size (em) rather than a flat px
     value so the stroke still reads proportionally consistent across the
     whole clamp(27px...54px) range instead of looking too thick at the
     small end or too thin at the large end. */
  stroke-width: .011em;
  stroke-linecap: round;
  stroke-linejoin: round;
  dominant-baseline: text-before-edge;
}

/* Timeline trail sits along the bottom edge of the top band.
   Round 44+, item 3: fully rebuilt from a row of individually-bordered
   pill/chip buttons into a minimal dot-and-line progress timeline, per
   Dave's reference images - a thin horizontal line connects small round
   step dots, and each category's label sits BELOW its dot (not beside it
   inside a pill anymore). Built as: [chip][seg][chip][seg]...[chip], all
   siblings in one flex row (see buildTrail() in tunnel.js), so the line
   segments are real connected geometry rather than a background-image
   trick, and can independently be marked "traveled" or not. */
.tunnel-trail {
  display: flex;
  align-items: flex-start;
  /* Per Dave (round 48+): was justify-content:center with chips/segs set
     to flex-grow, which stretched the whole timeline edge-to-edge across
     the band. Switched to flex-start so it reads as a compact, left-
     aligned cluster instead (starting from the same 20px left padding as
     the headline above it), with growth disabled on the children below. */
  justify-content: flex-start;
  gap: 0;
  /* Per Dave (round 49+, item 4): left value switched to
     --tunnel-content-left in tandem with .tunnel-top__headline above, so
     the two keep sharing one left edge - just now that shared edge is the
     monitor mockup's left edge instead of the browser's. */
  /* REGRESSION FIX (this round), item 5b: paired with
     .tunnel-top__headline's padding-bottom halving above (15px -> 7px) -
     this side's top padding halved too (10px -> 5px) so the headline sits
     noticeably closer to this trail row, ~half the old 25px combined gap. */
  /* Per Dave (this round), item 2: paired with .tunnel-top__headline's
     padding-bottom cut above (7px -> 3px) - this side's top padding cut in
     step (5px -> 2.5px) so the real measured text-to-dot gap drops from
     ~13.27px to ~6.3px, genuinely half. See the headline's padding note
     above for the full Playwright measurement. */
  /* Per Dave (this round), item 1: paired with .tunnel-top__headline's
     padding-top cut above (35px -> 13px) - this side's bottom padding
     (below the trail row, before the white .tunnel-mid band starts) cut
     in step (8px -> 3px) so the real height reduction lands close to the
     requested ~15% band-height cut instead of just the min-height floor
     (which turned out not to be the actual constraint - see the padding-
     top note above for the full root-cause explanation). */
  /* Latest round, item 3: paired with .tunnel-top__headline's padding-
     bottom halving above (3px -> 1.5px) - this side's top padding halved
     too (2.5px -> 1.25px) so the real measured headline-to-dot gap drops
     from the confirmed-live 5.5px to ~2.75px, genuinely half. */
  /* Fix (this round), item 9, per Dave: the trail row was sitting right up
     against the bottom edge of the dark teal top band with no breathing
     room below the label text. Bumped bottom padding +7px (3px -> 10px) so
     the whole row effectively lifts ~7px away from the band's bottom edge,
     leaving real clearance between the labels and the white .tunnel-mid
     band that follows. */
  padding: 1.25px 20px 10px var(--tunnel-content-left);
  flex-wrap: nowrap;
  /* Fix (this round), per Dave: "10px LESS padding between header and dots
     in timeline" - the header-to-trail gap (this padding-top, 1.25px,
     paired with .tunnel-top__headline's own tiny padding-bottom, 1.5px
     above) was already trimmed to near-zero by prior rounds, so there was
     no more room to cut from padding alone (padding can't go negative).
     Pulls the whole trail row up 10px via negative margin-top instead - the
     single property that actually controls this gap now - landing the dots
     directly under the header's glyphs with zero visible whitespace between
     them. Verified via Playwright: real measured header-text-to-first-dot
     gap dropped by exactly 10px (glyph baseline area now sits right against
     the dot row, no clipping of the header's own text). */
  /* Per Dave (this round): reversed direction - "more padding between
     buttons and header." The -10px pull above had the trail sitting right
     against the header's glyphs with zero breathing room; this is the same
     property that actually controls the gap (see the note above), so it's
     the lever to open it back up. Set to a real, comfortable positive gap -
     a moderate value, not a maximal swing back to any of the old double-
     digit padding figures this gap has cycled through in past rounds. */
  margin-top: 14px;
}

.tunnel-chip {
  appearance: none;
  border: none;
  background: none;
  color: var(--muted);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  padding: 0;
  cursor: default;
  display: flex;
  flex-direction: column;
  align-items: center;
  /* Per Dave (round 48+): was flex:1 1 0 (equal-width columns that grew
     to fill the whole row, stretching the timeline across the page).
     Now fixed-width based on content only - no grow - so the cluster of
     dots+labels stays compact instead of spreading out. Still capped at
     a max-width so a long label ("Hosting & Care") can't blow out the
     tight spacing. */
  flex: 0 0 auto;
  min-width: 0;
  /* Per Dave (round 51+, item 3): 96px was clipping "Website Changes" into
     "Website Chang…" via the label's ellipsis below - "the text box needs
     to be wider." Widened to 148px, generous enough for the longest real
     labels ("Website Changes", "Hosting & Care") to render on one line
     without truncating. */
  max-width: 148px;
  transition: opacity .25s ease;
}

/* Thin connecting line between each pair of dots. margin-top lands it on
   the dot slot's vertical center (34px slot / 2, minus half this 2px
   line) - that offset is constant across every state because the dot
   SLOT (.tunnel-chip__dot) never changes size, only the circle drawn
   inside it via ::before does (see below), so the line never has to be
   re-tuned per state. */
.tunnel-trail__seg {
  /* Per Dave (round 48+): was flex:1 1 28px, which grew to soak up all
     leftover row width and was the main reason the timeline stretched
     across the full band. Fixed at ~1/3 of the old 28px base width and
     no longer grows, so dot/label groups now sit close together as a
     tight cluster. */
  /* Per Dave (round 49+, item 1): 9px read as "literally a couple pixels
     apart" - too tight, the opposite extreme from the old edge-to-edge
     stretch. Dave explicitly warned against another maximal swing, so
     this is a deliberate middle ground (~2.4x the old 9px, not the
     original flex:1 1 28px full-width behavior) - checked visually via
     Playwright screenshot before finalizing, not just picked by formula. */
  /* Per Dave (round 51+, item 4): "these categories need to be about twice
     as much [separated] as you have now, they're still a little bit
     tight." Doubled from the round 49 value of 22px to 42px - checked via
     Playwright screenshot before finalizing to make sure this reads as a
     comfortable, deliberate gap and not another maximal swing back toward
     the pre-48 edge-to-edge stretch. */
  /* Per Dave (latest round, item 3a): "the padding in between these
     buttons... about 20% less than what you have it - they're just a tad
     spread out." 42px * 0.8 = 33.6px, rounded to 34px. */
  /* Per Dave (this round): "these are not aligned correctly; they must be
     perfectly aligned, and spread out about 2x as much as you have it."
     Doubled 34px -> 68px. (Alignment itself is handled by
     positionTrailSegments() in tunnel.js, which measures each dot's real
     rendered circle edges via getBoundingClientRect on every layout change
     - it's fully dynamic, not hardcoded to this gap value, so it re-centers
     the connecting line correctly at the new spacing with no JS changes
     needed. .tunnel-chip__dot's fixed 34x34px slot, same margin on every
     chip regardless of done/current/future state, is what keeps the dots
     themselves on one consistent baseline.) */
  flex: 0 0 68px;
  margin-top: 16px;
  position: relative;
  pointer-events: none;
  /* Per Dave (round 49+, item 3): unfilled segments (the connector to a
     step not yet reached) are now fully hidden, not just ghosted - see
     .is-filled below and updateTrail() in tunnel.js, which only marks a
     segment filled once the user has actually reached its far end.
     visibility:hidden (not display:none) keeps this segment's flex-basis
     reserving its layout space, so nothing shifts/reflows as the user
     progresses and later segments become visible. This div itself no
     longer draws anything (see ::before below) - visibility:hidden here
     still hides the pseudo-element too, since visibility is inherited. */
  visibility: hidden;
}
/* Per Dave (round 50+): "looks ridiculous, like a dash... needs to be much
   thinner and more subtle, and needs to almost be touching the dots -
   maybe five pixels away, not just a short thing floating in the middle
   with a big gap on both sides." Investigated via Playwright
   getBoundingClientRect on the real rendered trail: the 22px slot above
   was never actually shrinking the old line - it already filled that slot
   edge to edge. The real gap came from .tunnel-chip itself (not just its
   34px dot) growing up to 96px wide to fit longer labels like "Website
   Changes" or "Hosting & Care", with the dot centered inside that wider
   box - so the actual dot could sit up to ~31px past the slot's edge.
   Drawing the visible line as this ::before (instead of directly on
   .tunnel-trail__seg) lets it bleed out past the 22px slot via left/right
   offsets without changing the slot's own flex-basis - so the chip-to-
   chip spacing/rhythm Dave locked in at round 48-49 stays untouched, only
   the drawn line gets closer to each dot. Also cut from 2px tall/rgba(...,
   .65) - a solid, chunky bar - down to a 1px hairline at a much lower
   opacity, matching the muted-text convention used elsewhere in this
   band, so it reads as a subtle connector instead of a dash. -12px each
   side checked against real label pairs via Playwright before landing
   here: closes the ~30px gap seen on the widest pairs (e.g. "Your
   Website" -> "Website Changes") down to a clean ~5-8px from the dot,
   without the line's edge reaching far enough to visibly cross into a
   dot's circle on the tightest pairs (e.g. "Pages" -> "Logo", which
   already sit almost dot-to-dot with very little slack to spare). */
/* Per Dave (round 51+, item 2): the fixed -12px/-9px bleed above still read
   as inconsistent - "close to the dot on the left and far away from the
   dot on the right" - because chip widths vary a lot based on label text
   length (e.g. "Website Changes" vs "Logo"/"Pages"), so a single symmetric
   bleed value can't land at the same 5px clearance from every dot when its
   neighboring chips are very different widths. Replaced the fixed bleed
   with two custom properties (--seg-left / --seg-width) that
   positionTrailSegments() in tunnel.js computes PER SEGMENT from each
   dot's real rendered circle edge (via getBoundingClientRect + the dot's
   actual ::before circle diameter, which itself varies by state - 21px
   done, 10px current/base), inset exactly 5px from each dot on both ends
   regardless of the chips' widths. The -12px/1px values below are only a
   pre-JS-measurement fallback (e.g. very first paint tick). */
/* Item 11 (this round), per Dave: "when you click next, that line kind of
   grows and glides... it doesn't move, it just kind of opens up from
   nothing on the left side and opens up over to the new dot - and once it
   gets there, the new dot fades in." Was an instant visibility:hidden ->
   visible pop (see .is-filled below) with no entrance transition at all.
   scaleX(0) -> scaleX(1) with transform-origin:left is a genuine "grow from
   the left edge outward" - NOT a translate/move, which is what Dave
   explicitly ruled out - so the line visibly opens up left-to-right toward
   the dot it's connecting to, rather than sliding in as a whole already-
   full-width bar. The line's own left/width position (via --seg-left/
   --seg-width) is unaffected by this - only its rendered scale changes. */
.tunnel-trail__seg::before {
  content: '';
  position: absolute;
  top: 0;
  left: var(--seg-left, -12px);
  width: var(--seg-width, 46px);
  right: auto;
  height: 1px;
  /* Per Dave (this round), item 5: "the connecting line between each one is
     a little too distracting - needs to be a little more translucent/
     subtle." Was .28 - dropped to .18, a moderate reduction (not the
     ::after label-hairline just below, which is a separate element/value
     per an earlier round and stays untouched). */
  background: rgba(255,255,255,.18);
  transform: scaleX(0);
  transform-origin: left center;
  /* Per Dave (this round), item 1: "still going too fast, about half that
     speed" - doubled again from 1s (itself already doubled from an
     original .5s) to 2s. Doubled in lockstep with goNext()'s
     is-dot-pending timeout in tunnel.js (1040ms -> 2080ms) so the dot
     still only fades in once this longer grow finishes. */
  transition: background .3s ease, left .15s ease, width .15s ease, transform 2s var(--tunnel-ease);
}
.tunnel-trail__seg.is-filled {
  visibility: visible;
}
.tunnel-trail__seg.is-filled::before {
  transform: scaleX(1);
}

/* Fixed-size slot that holds each step's dot - centers the visual circle
   (::before) and, once completed, the checkmark icon inside it, and is
   what the connecting line's margin-top above is measured against. */
.tunnel-chip__dot {
  width: 34px;
  height: 34px;
  flex: 0 0 34px;
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  /* Per Dave (round 51+, item 1): "dots + connector line sit too high above
     the label text... bring them much closer together." Was 6px, which
     combined with the label's own line-height read as a large floating
     gap between the dot/line row and the labels below it. Cut to 2px so
     the dot reads as tightly attached to its label.
     Latest round, item 2: still too much gap per Dave - cut this by half
     again, from 2px to 1px.
     This round, item 4a: "lower their position... less by 7 pixels" - cut
     a further 7px from 1px, which pushes past zero into a small negative
     margin (-6px) so the dot slot overlaps slightly closer to the label
     text below it, as explicitly requested. */
  margin-bottom: -6px;
  color: #ffffff;
}
.tunnel-chip__dot::before {
  content: '';
  position: absolute;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: rgba(255,255,255,.32);
  opacity: 1;
  /* Item 11 (this round): opacity added to this same transition list so the
     "new dot fades in" half of the line-grow-then-dot-fade sequence (see
     .tunnel-chip.is-dot-pending below, driven from goNext() in tunnel.js)
     animates smoothly rather than snapping. */
  transition: width .28s var(--tunnel-ease), height .28s var(--tunnel-ease), background .28s ease, box-shadow .28s ease, opacity .3s ease;
}
.tunnel-chip__dot svg {
  position: relative;
  z-index: 1;
  /* Per Dave (this round), item 5: "these checkmarks are a little too
     large, make them 20% smaller to scale (80% scale)." Was 14px x 14px -
     80% of 14 = 11.2, rounded to 11px. */
  /* Per Dave (this round), item 4b: "make the checkmarks... 20% smaller...
     more subtle." Was 11px (already an 80%-scale cut from an earlier
     round) - another 20% off: 11 * 0.8 = 8.8, rounded to 9px. */
  width: 9px;
  height: 9px;
  opacity: 0;
  transform: scale(.4);
  transition: opacity .2s ease, transform .28s cubic-bezier(.34, 1.56, .64, 1);
}

/* Item 11 (this round): the NEW step's dot stays hidden (opacity:0) while
   its connector line is mid-grow (see .tunnel-trail__seg.is-filled above) -
   goNext() in tunnel.js adds this class to the arriving chip right before
   calling goToIndex(), then removes it ~520ms later (after the line's own
   .5s scaleX transition has finished), letting the dot fade in via the
   opacity transition just added to .tunnel-chip__dot::before above. Only
   used for the forward Next-click path - Back navigation and jumping to an
   already-completed step via a trail-chip click are unaffected, matching
   Dave's "when you click next" framing. */
.tunnel-chip.is-dot-pending .tunnel-chip__dot::before {
  opacity: 0;
}

.tunnel-chip__label {
  /* Per Dave (latest round, item 3b): "slightly larger for that type
     overall" - bumped +2px from 11px. Font-weight used to be left unset
     here (or overridden per-state below) - see the is-current/is-done
     rules further down, which used to bump weight to 700 on the active
     step only; that per-state weight swap is exactly what Dave asked to
     remove ("I don't want it to be bold on the active and then go back to
     non-bold... same font weight... whether it's active, past, or
     future"). Every state still inherits this one weight uniformly.
     Per Dave (round 52+, item 2): "this text is too heavy, needs to be a
     bit of a lighter weight" - even at the unset/inherited normal (400)
     weight, Plus Jakarta Sans' variable-font 400 still read visually heavy
     at this small size, so weight is now explicitly set below 400 (350)
     rather than left to inherit.
     Per Dave (this round): "let's see what this text looks like smaller,
     thinner, and all caps please" - font-size trimmed 13px -> 11px, weight
     trimmed further 350 -> 300 (the lighter end of the "350 for lightness"
     convention used elsewhere in the app), and text-transform: uppercase
     added since the labels ("Your Website", "Website Changes", etc.) are
     authored in the CATEGORIES chip strings as normal title-case text.
     letter-spacing left at its existing .04em - already comfortably within
     the ~0.03em all-caps-readability range this pairing usually calls for,
     so no change needed there.
     Per Dave (this round): "smaller type" - moderate further trim per the
     session's no-extreme-moves rule, 11px -> 9px. */
  font-weight: 300;
  font-size: 9px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--muted);
  text-align: center;
  /* Per Dave: text not centered top/bottom in the pill. 1.3 line-height
     built in extra leading below the caps (no descenders in this all-caps
     label to balance it), which read as sitting high in the 18px pill even
     with align-items:center on the flex row. Tightened to 1 so the line
     box hugs the glyphs and centers cleanly. */
  line-height: 1;
  /* Per Dave (round 51+, item 3): "why does 'Website Change[s]'... cut
     off with an ellipsis? I guess the text box needs to be wider." Removed
     the nowrap+ellipsis truncation entirely (paired with the wider 148px
     chip max-width above) so every real label - including "Website
     Changes" and "Hosting & Care" - renders in full instead of getting
     clipped. white-space:normal lets a label wrap to a second line only if
     it's ever still too long for the widened box, rather than silently
     cutting text off. */
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
  max-width: 100%;
  transition: color .25s ease, font-weight .1s ease;
}

/* Per Dave (latest round, item 3b): "very faint, short vertical separator
   lines... between just the text part - not the text in the bubble above
   [the dots], but just little hairline, faint vertical separator lines
   between each of the word blocks." .tunnel-trail__seg already sits
   exactly in the gap between two adjacent .tunnel-chip elements (it's the
   same flex-row spacer the connector line above uses - see its ::before),
   so a second pseudo-element on this same spacer, positioned lower down at
   the LABEL row's vertical position instead of top:0, naturally lands
   centered between each pair of adjacent label text blocks without any
   extra markup or JS measurement. Kept as its own ::after (distinct from
   the dot-row ::before connector line above) so it never overlaps/
   interferes with that line. .tunnel-trail__seg itself is visibility:hidden
   by default (only shown once .is-filled, see above) - explicit
   visibility:visible here overrides that inherited value for this pseudo
   only, since Dave wants these separators between every label pair
   regardless of done/current/future state, not just completed steps. */
.tunnel-trail__seg::after {
  content: '';
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  /* Vertical centering: measured via Playwright against the real rendered
     boxes (seg's own top sits at the dot row; the label row's vertical
     center lands ~21px below that) so the hairline centers on the label's
     own text line rather than spanning the dot row above it or falling
     below the trail band entirely. */
  /* Fix (this round): per Dave - "I moved the text up for this which I'd
     like, but you did not move the corresponding separator lines equally
     up, so now they're hanging way down below the text." Confirmed via
     Playwright getBoundingClientRect: label's own text-block vertical
     center measured ~169.46px from viewport top, while this hairline
     (segTop 149.02px + old top:20px + half its 14px height) centered at
     ~176.02px - 6.56px too low, reading as "hanging below" the label.
     top cut 20px -> 13.45px so this pseudo's center now lands on that same
     ~169.46px line as the label text, matching exactly.
     Fix (this round), per Dave's "smaller, thinner, all caps" pass on
     .tunnel-chip__label (13px -> 11px): shrinking the label text pulled
     its own vertical center up slightly, re-measured via Playwright
     getBoundingClientRect at a >760px-tall viewport (so the short-viewport
     media override below doesn't interfere) - label center now lands
     ~1.3px above the hairline's old center. top trimmed 13.45px -> 12.15px
     to close that gap and keep the hairline centered on the new, smaller
     label text.
     Fix (this round), per Dave's "smaller type" pass on .tunnel-chip__label
     (11px -> 9px): shrinking the label text again pulled its own vertical
     center up ~1.31px more, re-measured via Playwright getBoundingClientRect
     (segTop 137.078px + old top 12.15px + half the 14px pseudo height =
     156.228px vs. label's own text-block center at 154.922px). top trimmed
     12.15px -> 10.84px to close that gap and keep the hairline centered on
     the new, smaller label text. */
  top: 10.84px;
  width: 1px;
  height: 14px;
  /* RE-FIX (this round), item 3: Dave's fresh screenshot showed NO visible
     separator at all, even though this rule (and the reduced .tunnel-trail
     __seg gap below) was already present in the file from an earlier round
     - the CSS itself was never missing. Root cause was almost certainly the
     cache-buster: index.html's tunnel.css query string was never bumped
     past ?v=64 when that earlier round landed, so browsers that already had
     v=64 cached kept serving the PRE-fix file and never re-fetched this
     change - a caching miss, not a broken rule. This round's cache-buster
     bump to ?v=65 (see index.html) forces a real re-fetch. Also hardened
     the rule itself against the "too faint to notice" theory raised in the
     brief: bumped from rgba(255,255,255,.15) to .3 - still a genuinely
     faint hairline against this band's dark teal background, but noticeably
     more visible than .15 in a real screenshot, confirmed via Playwright
     getBoundingClientRect + pixel-sampling zoomed into the trail row. */
  /* Latest round, item 7, per Dave: "make it a little more faded/subtle" -
     a small, moderate reduction from .3, not a big change. */
  background: rgba(255,255,255,.22);
  visibility: visible;
  pointer-events: none;
}

/* ROOT-CAUSE FIX (this round), item 1, per Dave: "on this breakpoint, the
   separator lines in the tab bar are too low, they didn't rise up with the
   words." This override was ALWAYS meant for the short-viewport (max-height)
   layout - its own comment says "Matches the short-viewport dot-slot shrink
   (26px)" - but it was mistakenly gated on `@media (max-width: 900px)`
   instead of `@media (max-height: 760px)`. Two consequences, both confirmed
   by hand-measuring the box model against the real CSS values: (1) on a
   normal-width-but-short window (e.g. 1280x720, or a laptop with a small
   non-maximized browser - width > 900px so this rule never applied), the
   short-viewport .tunnel-chip__dot shrink (34px->26px, margin-bottom -6px->
   -5px) and .tunnel-chip__label shrink (9px->8px) plus .tunnel-trail__seg's
   own margin-top cut (16px->12px, all set inside the max-height:760 block
   below) all fired, but the ::after separator kept using the un-adjusted
   base top:10.84px/height:14px meant for the taller 34px-dot layout -
   landing its center ~3.6px BELOW the label's real text center, exactly
   Dave's "too low, didn't rise up with the words." (2) meanwhile a merely
   NARROW-but-tall viewport (<=900px wide, >760px tall) got this override
   even though it doesn't need it - the base top:10.84px/height:14px value
   already centers correctly against the un-shrunk 34px dots/9px label used
   at that breakpoint, so applying the 26px-dot-tuned values there pulled the
   line too high instead. Moving this block to `@media (max-height: 760px)`
   (alongside the actual dot/label/seg-margin overrides that create the
   26px-dot layout) fixes both: short-but-wide viewports now get the
   correctly-tuned override, and narrow-but-tall viewports fall back to the
   already-correct base rule. top nudged 8.45px -> 8.2px, hand-recomputed
   against the max-height block's own real numbers below: dot content-top =
   26px height - 5px margin-bottom = 21px; label line box = 8px font *  1.3
   line-height = 10.4px, so label center = 21 + 10.4/2 = 26.2px from the
   trail row's top. seg's own top offset there is margin-top:12px, so
   solving 12 + top + height/2 = 26.2 with height:12px gives top = 8.2px -
   an exact center-on-center match, not just a close approximation. */
@media (max-height: 760px) {
  .tunnel-trail__seg::after {
    top: 8.2px;
    height: 12px;
  }
}

/* Small scale/fade-in pop when a category is first completed - only
   played once at the moment the dot becomes "done" (triggered via
   .is-popping in tunnel.js), not on every re-render of the trail. */
@keyframes tunnelCheckPop {
  0% { transform: scale(0); opacity: 0; }
  65% { transform: scale(1.3); opacity: 1; }
  100% { transform: scale(1); opacity: 1; }
}
.tunnel-chip__dot.is-popping {
  animation: tunnelCheckPop .38s cubic-bezier(.34, 1.56, .64, 1);
}

/* Completed step: solid-filled dot (item 3's "15% larger" ask applies to
   this and the current dot below - both sized up from a smaller first
   pass so they read clearly at a glance). When the category was
   genuinely answered "yes" with content configured, updateTrail() in
   tunnel.js injects the checkmark SVG into this same dot (INSIDE it, not
   to its left as before); a "no" answer leaves the dot's solid fill with
   no icon - same underlying logic as the old chip row, just relocated. */
.tunnel-chip.is-done {
  opacity: 1;
  cursor: pointer;
}
.tunnel-chip.is-done .tunnel-chip__dot::before {
  /* Fix (this round), item 4, per Dave: an earlier round scaled the
     CHECKMARK ICON inside this dot down (14px->11px, see the svg rule
     above) but left the actual circle/background itself untouched at
     21px - Dave wants the CIRCLE genuinely smaller, not just the icon
     inside it. 20% smaller than the real 21px diameter: 21 * 0.8 = 16.8,
     rounded to 17px. */
  /* Per Dave (this round), item 4b: another 20% off the completed-dot
     circle, matching the checkmark icon's own cut just above:
     17 * 0.8 = 13.6, rounded to 14px. (This also finally matches what the
     short-viewport media-query rule below already claimed the base value
     was - that comment was aspirational/incorrect until now, since base
     was still actually 17px.) */
  width: 14px;
  height: 14px;
  /* Per Dave (latest round, item 3): was rendering blue (a leftover
     rgba(94,115,135,*)-family hex that never got swept up when the palette
     moved to the --gold/#7E3187 warm-gray family) - now a darkened shade of
     that new palette color instead of the flat base tone. */
  background: var(--tunnel-teal-bg-dark);
}
.tunnel-chip.is-done .tunnel-chip__dot svg {
  opacity: 1;
  transform: scale(1);
}
.tunnel-chip.is-done .tunnel-chip__label { color: var(--ink); }
.tunnel-chip.is-done:hover .tunnel-chip__dot::before { background: var(--tunnel-teal-bg-dark); filter: brightness(1.12); }
.tunnel-chip.is-done:hover .tunnel-chip__label { color: #ffffff; }

/* Current/active step: the single largest dot in the row, solid white so
   it reads clearly against the teal band, with a soft halo ring. Label
   goes bright + bold. */
.tunnel-chip.is-current {
  opacity: 1;
}
.tunnel-chip.is-current .tunnel-chip__dot::before {
  /* Per Dave (round 48+): the 25px dot + 5px/.16-alpha halo read as "too
     bright and distracting". Scaled down to 19px and the halo trimmed to
     a much smaller, softer ring so it's still clearly the active step
     without glaring. */
  /* Per Dave (round 49+, item 2): "the active button... should be about
     half that large" - 19px cut to 10px (roughly half), halo ring
     trimmed in step so it stays proportional rather than looking oversized
     next to the now-smaller dot. Still clearly bigger than the 10px
     is-done/is-future dots below so it reads as the active step at a
     glance. */
  /* Per Dave (round 51+, item 7): the active dot was a solid filled white
     circle - now a hollow ring/donut instead. Same ~10px overall diameter
     as the prior solid version, but drawn with a transparent center and a
     2px white border/stroke so it clearly reads as an outline rather than
     a filled dot. box-sizing:border-box keeps the 10px a true outer
     diameter (the border is drawn inward, not added on top of it). */
  /* Per Dave (latest round, item 2): thinner stroke - 2px read as too
     heavy/chunky for a 10px ring. Cut to 1.5px (not the full 1px Dave
     floated) since 1px checked via Playwright screenshot actually did read
     as too faint against this band's dark teal background at this small a
     diameter - 1.5px is the thinnest weight that still stays clearly
     visible. */
  /* Per Dave (this round), item 8: "make these throbbing dots about half
     that size and slightly thinner - too distracting now." Halved the
     10px diameter down to 5px and thinned the stroke 1.5px -> 1px. */
  width: 5px;
  height: 5px;
  box-sizing: border-box;
  background: transparent;
  /* Per Dave (this round), item 2: "too wide [thick stroke]... needs to be
     somewhat translucent so the color behind it shows through a little."
     Stroke trimmed 1px -> .75px (thinnest weight that still renders as a
     visible line rather than disappearing) and switched from solid
     #ffffff to a translucent rgba white so the band's teal background
     shows through the ring a bit instead of reading as a solid opaque
     line. The soft halo box-shadow is trimmed from a 2px spread to 1px so
     it doesn't itself read as extra ring "width" stacked on top of the
     border. */
  border: .75px solid rgba(255,255,255,.72);
  box-shadow: 0 0 0 1px rgba(255,255,255,.07);
  /* Per Dave (round 52+, item 1): the tunnelNextPulse glow (box-shadow
     based, reused from the Secure Checkout button) was invisible on this
     small hollow ring - "I don't think you're having a pulse." Swapped for
     a dedicated transform:scale breathing animation instead (see
     @keyframes tunnelDotBreathe below, near tunnelNextPulse) so the ring
     itself visibly grows/shrinks. tunnelNextPulse itself is left untouched
     - Secure Checkout still uses it. transform-origin:center keeps the
     scale centered on the ring rather than growing off to one side. */
  /* Per Dave (this round), item 8: at the new smaller 5px size, the old
     1->1.25 scale range (see @keyframes tunnelDotBreathe below) still read
     as visually loud, so the keyframe's own scale ceiling was tempered too
     (1.25 -> 1.15) alongside this size/stroke cut. */
  animation: tunnelDotBreathe 2.4s ease-in-out infinite;
  transform-origin: center;
}
.tunnel-chip.is-current .tunnel-chip__label {
  color: #ffffff;
}

/* Upcoming/not-yet-reached step: small pale dot, ghosted label - matches
   the muted-text convention already used elsewhere against this band. */
.tunnel-chip.is-future {
  /* Per Dave (latest round, item 3a): "might be a little too ghosted, hard
     to read - make them a little less ghosted." Moderate bump from .55 to
     .68 (combined with this label's own --muted color, already at .68
     alpha, the old .55*.68≈.37 effective opacity is now .68*.68≈.46 -
     noticeably more legible without going anywhere near fully opaque,
     which would stop reading as "upcoming/not yet reached" at all). */
  opacity: .68;
  pointer-events: none;
}
/* Per Dave (round 49+, item 3): "I don't want to see the ghosted dashes or
   the ghosted circles above [future labels]... only show when you're
   there." The dot for a not-yet-reached step is now fully hidden - only
   its label (already ghosted via the .55 opacity above) stays visible.
   visibility:hidden (not display:none) keeps the 34px dot slot's layout
   space reserved, so the label doesn't jump upward and nothing reflows
   when the step later becomes current/done (see .tunnel-trail__seg's
   matching visibility approach above for the connecting line). */
.tunnel-chip.is-future .tunnel-chip__dot {
  visibility: hidden;
}
.tunnel-chip.is-future .tunnel-chip__label { color: var(--muted); }

/* ==========================================================================
   PILL-STYLE TRAIL RESTYLE (this round) - EXPERIMENTAL, per Dave: "very thin
   white pill boxes around each one, eliminate the vertical separators, and
   [the] checkmark... would be in that same darker circle to the left of the
   words inside the pill button... future are ghosted out... past are pure
   white text and if they chose no, it would be the pure white text without
   the checkmark just that... maybe not pure white, a little translucent so
   they're a little more subtle."
   Dave explicitly flagged this as something he might want to revert ("I
   guess... we'll come back to this"). Kept as a clean, self-contained
   override block AFTER every rule above (all of that original column/dot-
   above-label styling, animations, etc. is left completely intact) so
   reverting is just deleting this block - nothing above needs to change
   either way. Everything below wins the cascade purely by appearing later
   in the file at equal specificity. */

/* Vertical connector lines removed entirely, per Dave. */
.tunnel-trail__seg,
.tunnel-trail__seg::before,
.tunnel-trail__seg::after {
  display: none !important;
}

.tunnel-trail {
  /* Fix (this round), per Dave: "these must be perfectly aligned... 2x as
     much padding on those words too" - doubled the inter-item spacing,
     same convention used everywhere else in this file when Dave asks for
     "2x" (see .tunnel-trail__seg's own doubling history above). */
  gap: 16px;
}

.tunnel-chip {
  flex-direction: row;
  align-items: center;
  justify-content: center;
  gap: 5px;
  /* Per Dave (this round): "no pill button shapes at all" - the fixed-
     height/border/border-radius/background box that made each step read as
     a little bordered button is removed entirely. What's left is plain
     text sitting in the flex row (still spaced/aligned the same way via the
     rules above) - no box chrome of any kind, on any state. */
  height: auto;
  /* ROOT-CAUSE FIX (this round), per Dave: "the previous item is not
     aligned, it's several px lower than the rest." Confirmed the cause:
     the done+checkmarked chip's .tunnel-chip__dot box (11px) was the only
     state that kept `display:flex` - is-current/is-future/is-done-no-check
     all set `display:none` on that same dot span below, which REMOVES it
     from layout entirely (zero height contribution), so those chips' own
     row height collapsed to just the 9px label line box while the
     checkmarked chip's row stayed 11px tall. Since .tunnel-trail top-aligns
     every chip (align-items:flex-start), that height difference pushed the
     checkmarked chip's vertically-centered label ~1-2px lower than every
     other chip's label, which sat flush at the row's own top with no
     centering offset to apply. min-height pins every chip's row to the
     same 11px regardless of which state's dot is actually visible, so
     every label centers against the identical row height - see the
     matching display->visibility fix on the three dot rules below, which
     is what actually keeps that reserved height in the layout. */
  min-height: 11px;
  padding: 0;
  border-radius: 0;
  border: none;
  background: none;
  transition: opacity .25s ease;
}

/* The dot slot becomes the small circle sitting to the left of the label,
   inside the pill - only actually painted (see the is-done rule below) once
   a step is done AND genuinely checkmarked. Sized to sit comfortably inside
   the fixed 18px chip height above (never taller than the chip itself). */
.tunnel-chip__dot {
  width: 11px;
  height: 11px;
  flex: 0 0 11px;
  margin-bottom: 0;
}
.tunnel-chip__dot::before {
  display: none;
}

.tunnel-chip__label {
  text-align: left;
  /* Per Dave (this round): "no all caps, initial caps... slightly less
     light text weight." The base rule earlier in this file sets
     text-transform:uppercase + font-weight:300 for the old dot-timeline
     design - overridden here so the labels render exactly as authored in
     the CATEGORIES chip strings (already proper title case: "Your
     Website", "Changes", "Pages", etc.) at a slightly heavier weight than
     the old 300. Letter-spacing trimmed too - the old .04em was tuned for
     tight all-caps tracking and reads too loose on normal mixed-case text. */
  text-transform: none;
  font-weight: 450;
  letter-spacing: .01em;
  /* Fix, per Dave: "the type in the Wizard needs to be a little bit
     larger. It's hard to see at some monitor[s]." The base rule (much
     earlier in this file) had trimmed this all the way down to 9px over
     several rounds - bumped back up to 11px here. */
  font-size: 11px;
}

/* Done + genuinely checkmarked (yes-answered yesno, or any non-yesno "done"
   kind - matches the same showCheck logic already in updateTrail()):
   pure white label text, dark circle to the left holding the white
   checkmark icon, pill slightly more visible than the base translucent
   fill. The circle only shows once the checkmark SVG is actually injected
   (:has() - falls back to a plain label-only pill on old engines, which is
   still correct for the "no" case just below). */
.tunnel-chip.is-done {
  /* Per Dave (this round): "no pill button shapes at all" - the translucent
     fill/border chrome this state used to paint is gone; nothing left to
     set here (the base .tunnel-chip rule above already has no box). */
}
.tunnel-chip.is-done .tunnel-chip__label {
  color: #ffffff;
}
/* Per Dave (this round): "remove the circles behind the checkmarks and
   just have checkmarks" - dot slot still occupies its layout space (so the
   checkmark keeps its usual position/spacing) but no longer paints a
   circle behind it. Check color set explicitly to white here since it can
   no longer lean on the old dark-circle background for contrast. */
.tunnel-chip.is-done:has(.tunnel-chip__dot svg) .tunnel-chip__dot {
  visibility: visible;
  display: flex;
  align-items: center;
  justify-content: center;
  background: none;
  color: #ffffff;
}
.tunnel-chip.is-done .tunnel-chip__dot svg {
  opacity: 1;
  transform: scale(1);
}
/* Answered "no" (or any done step with no checkmark): per Dave, "just the
   pure white text without the checkmark" - no circle at all, dot slot
   collapses out of the layout so the pill hugs the label alone. */
.tunnel-chip.is-done:not(:has(.tunnel-chip__dot svg)) .tunnel-chip__dot {
  /* Fix (this round): was display:none, which drops this box out of layout
     entirely and shrinks this chip's row height relative to the
     checkmarked-done chip - see .tunnel-chip's min-height note above for
     the full alignment root-cause. visibility:hidden keeps the 11px slot
     reserved (invisible, but still occupying space) so every chip's row
     height - and therefore its label's vertical position - stays identical
     regardless of state. */
  visibility: hidden;
}
.tunnel-chip.is-done:hover .tunnel-chip__label {
  /* Per Dave (this round): no pill fill/border to darken on hover anymore -
     the click affordance now reads purely through the label's own opacity
     lift (still fully white/legible, was already white at rest too). */
  color: #ffffff;
  opacity: .75;
}
.tunnel-chip.is-done:hover .tunnel-chip__dot::before {
  background: none;
}

/* Current step: no checkmark yet (nothing to show in the circle), but
   should still read as "here" rather than ghosted - white text, a slightly
   brighter pill border than the base/future state, dot slot collapsed
   (same reasoning as the "no" case above - nothing to put in it yet). */
.tunnel-chip.is-current .tunnel-chip__dot {
  /* Fix (this round): same display->visibility swap as the is-done-no-check
     rule above and for the same reason - see .tunnel-chip's min-height note. */
  visibility: hidden;
}
/* Per Dave (this round): "no pill button shapes at all" - the old active
   state was a pulsing box-shadow drawn around the pill's own border/fill
   box; with that box gone there's nothing left for a box-shadow to outline
   (it would just draw a ghost rectangle around the bare text, which still
   reads as an unwanted button shape). The active step now reads purely
   through its own label styling instead: full white (already set via the
   base, non-override .tunnel-chip.is-current .tunnel-chip__label rule
   earlier in this file) plus a bit of extra weight here so it's clearly
   the current step at a glance, no glow/box needed. tunnelChipCurrentPulse
   keyframes block removed - nothing references it anymore.
   REVERSED (this round), per Dave: "DON'T have the current/active text
   bolder than the rest of the text - make it identical to the treatment of
   the previous ones - the differentiator now is the horizontal line, not
   heavier - so we don't have 50 different font styles going on." The
   .tunnel-active-indicator bar (added since the above 650 was written)
   already marks the current step visually - this extra weight is
   redundant on top of it and is exactly the "different font style" Dave's
   flagging. Dropped to match the shared base .tunnel-chip__label weight
   (450) so is-done/is-current/is-future all render at the identical
   weight; only color (white vs ghosted) and the indicator bar tell them
   apart now. This rule intentionally left in place (rather than deleted)
   so it's obvious at a glance that is-current's weight is a deliberate
   match, not an oversight. */
.tunnel-chip.is-current .tunnel-chip__label {
  font-weight: 450;
}

/* Future step: ghosted text only, no box. */
.tunnel-chip.is-future {
}
.tunnel-chip.is-future .tunnel-chip__dot {
  /* Fix (this round): same display->visibility swap as above, same reason. */
  visibility: hidden;
}
/* ========================================================================== */

/* Per Dave: on short browser windows (a laptop with a small, non-maximized
   browser window - not just a narrow one) the top band's content ("You're
   all set." + the chip trail) was getting clipped at the bottom of the
   viewport. The top band's min-height is a percentage of the *viewport*,
   so on short viewports it never actually shrinks - only the padding/
   font-sizes/gaps inside it do here, so the logo, headline, and full chip
   trail reliably fit without clipping even at ~650-700px tall windows. */
@media (max-height: 760px) {
  #webyayTunnel {
    /* Item 7: same ~15% trim applied here in step with the base value. */
    /* REGRESSION FIX (this round), item 5a: same 13% trim as the base
       value above, applied here in step: 12% * 0.87 = 10.44%, rounded to
       10.5%. */
    /* Per Dave (this round), item 1: same 15% trim as the base value above,
       applied here in step: 10.5% * 0.85 = 8.925%, rounded to 8.9%. */
    --tunnel-top-height: 8.9%;
  }

  .tunnel-top__logo {
    height: 32px;
  }

  .tunnel-top__close {
    padding: 8px 18px;
    font-size: 10px;
  }

  .tunnel-top__headline {
    /* Proportionally tighter than the base 8px/14px (round 13's headline-
       to-trail spacing bump) but still a real, non-zero gap - keeps the
       short-viewport clipping fix from an earlier round intact while still
       giving the headline and chip trail some breathing room. */
    /* Left value switched to --tunnel-content-left in step with the base
       rule above, so short-viewport windows keep the same monitor-aligned
       left edge (round 49+, item 4). */
    /* Per Dave (this round), item 3: same padding-top restoration as the
       base rule above, scaled down proportionally (short-viewport windows
       still need to conserve vertical space) - 2px -> 6px.
       Latest round, item 3: paired with the base rule's padding-bottom
       halving (3px -> 1.5px) - halved here too. */
    /* Per Dave (this round): "throughout" - same +9px headline-down nudge
       as the base rule above (17px -> 26px), applied here too so short
       browser windows get the same lowered header. */
    /* Per Dave (latest round): "lower that throughout about 7 pixels" -
       same +7px bump as the base rule above (15px -> 22px), kept in step so
       short browser windows get the same lowered header. */
    padding: 22px 20px 1.5px var(--tunnel-content-left);
  }

  .tunnel-top__headline h2 {
    /* Per Dave (round 45+): scaled up in step with the new base clamp
       (34-68px) so short-viewport windows still get a visibly big/bold
       headline, just proportionally smaller than the full-height version. */
    /* Per Dave (round 46+): scaled back down 0.8x in step with the base
       clamp's 20% reduction (24->19.2->19px, 3.4vw->2.72vw->2.7vw,
       40->32->32px). */
    font-size: clamp(19px, 2.7vw, 32px);
    /* Per Dave (round 50+): bumped in tandem with the base h2 rule above
       (1.15 -> 1.3) so descenders don't clip on short-viewport windows
       either. */
    line-height: 1.3;
  }

  .tunnel-trail {
    /* Left value switched to --tunnel-content-left in step with the base
       rule above (round 49+, item 4).
       Latest round, item 3: top padding halved (5px -> 2.5px) in step with
       the headline's own padding-bottom halving above, so the short-
       viewport headline-to-dot gap is cut proportionally too. */
    padding: 2.5px 20px 5px var(--tunnel-content-left);
    /* FIX (this round), per Dave: "header is now so low it's on top of the
       pill buttons." Root cause: the base (non-short-viewport) .tunnel-trail
       rule picked up a new +14px margin-top this round (see that rule
       above, "more padding between buttons and header") - but this
       max-height override never explicitly reset margin-top, so on a short
       browser window that same +14px kept applying on TOP of this block's
       already-tight padding, pushing the header/trail combo taller than
       the shrunk --tunnel-top-height ceiling here and causing the overlap
       Dave saw. Scaled proportionally smaller for this tighter layout
       instead of inheriting the full-height value unchanged. */
    margin-top: 8px;
  }

  .tunnel-chip__label {
    /* Per Dave (latest round, item 3b): bumped +2px in step with the base
       rule above (10px -> 12px).
       Per Dave (this round): trimmed back down 2px in step with the base
       rule's 13px -> 11px cut, so short-viewport windows stay
       proportionally smaller/thinner too (12px -> 10px).
       Per Dave (this round): "smaller type" - trimmed in step with the base
       rule's 11px -> 9px cut (10px -> 8px).
       Fix, per Dave: "the type in the Wizard needs to be a little bit
       larger" - bumped back up in step with the base rule's 9px -> 11px
       fix (8px -> 10px). */
    font-size: 10px;
  }

  /* FIX (this round), per Dave: "the dark circle is huge here and blowing
     out of the pill button." Root cause: this override is a leftover from
     the OLD column-layout timeline (dot stacked above the label, in its own
     34px-tall slot) - it was never updated when the trail was redesigned
     into the current compact row-layout pills (13px dot inline with the
     label, see the base, non-media .tunnel-chip__dot rule earlier in this
     file). On a short browser window this 26px override was winning over
     that 13px base value, rendering a checkmark circle roughly 2x the
     height of the 22px-tall pill it sits inside - genuinely "blowing out"
     of it. Matches the base rule's 13px now (no separate short-viewport
     shrink needed - the pill itself is already a fixed, small size at every
     window height) and margin-bottom is 0, not negative - that offset only
     ever made sense for the old stacked layout. */
  .tunnel-chip__dot {
    width: 13px;
    height: 13px;
    flex: 0 0 13px;
    margin-bottom: 0;
  }

  .tunnel-trail__seg {
    margin-top: 12px;
  }

  /* Per Dave (round 51+, item 2): the fixed -9px bleed here is now dead -
     positionTrailSegments() in tunnel.js measures real dot/segment
     geometry at runtime (including on this short-viewport layout, since
     it re-measures on resize) and sets --seg-left/--seg-width directly, so
     no separate short-viewport override is needed here any more. */

  .tunnel-chip.is-done .tunnel-chip__dot::before {
    /* This round, item 4b: matches the base rule's further 20%-smaller cut
       above (now genuinely 17px * 0.8 = 13.6, rounded to 14px - the base
       rule has been corrected to match this value this round). Since the
       base is now also 14px, this short-viewport override stays the same
       number but is left explicit for clarity. */
    width: 14px;
    height: 14px;
  }

  /* Per Dave (round 49+, item 2): halved in step with the base is-current
     rule above (17px -> 9px) so the short-viewport active dot stays
     proportionally half-sized too, not just the base one. */
  .tunnel-chip.is-current .tunnel-chip__dot::before {
    /* Per Dave (round 51+, item 7): matches the hollow-ring treatment set
       on the base is-current rule above, just at the short-viewport's
       slightly smaller 9px diameter. */
    /* Per Dave (this round), item 8: same ~half-size + thinner-stroke cut
       as the base is-current rule above, scaled to this short-viewport's
       proportionally smaller dot slot (9px -> 5px, matching the base). */
    width: 5px;
    height: 5px;
    box-sizing: border-box;
    background: transparent;
    border: 1px solid #ffffff;
  }

  .tunnel-chip__dot svg {
    /* This round, item 4b: matches the base checkmark's 20%-smaller cut
       above (11px -> 9px). */
    width: 9px;
    height: 9px;
  }
}

/* ---------- MIDDLE BAND (the tunnel) ----------
   Per Dave (v6): the laptop-mockup + live-site preview that used to only
   exist on the intro slide is now a PERSISTENT fixture pinned to the left
   of .tunnel-mid for the ENTIRE tunnel flow, not just the first few panels.
   .tunnel-mid is now a two-column flex row: a fixed-width left column
   (.tunnel-mid__preview) holding that laptop/iframe, and a right column
   (.tunnel-mid__content) holding the existing card track/carousel. The
   preview column is built once in tunnel.js's buildRoot() as a sibling of
   the card track (never inside any one .tunnel-card), so it never
   re-renders, reloads, or animates away as the user moves between slides -
   only the right-hand card content transitions. */
.tunnel-mid {
  position: relative;
  /* Was `flex: 0 0 var(--tunnel-mid-height); height: var(--tunnel-mid-height);`
     (a hard 60% of viewport). Changed to flex-grow so this band always
     fills exactly whatever space the top/bottom bands don't use - see the
     black-strip root-cause note on .tunnel-top above. This is what
     guarantees the three bands sum to 100% in every case (any viewport
     height, any media-query breakpoint, any content-driven top-band
     growth), not just the specific percentages that happened to add up
     before. */
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  display: flex;
  align-items: stretch;
  /* Per Dave (round 23): was flex-start, which pinned the monitor+content
     pair to the left edge - any extra browser width just widened the gap
     between them as .tunnel-mid__content (flex:1 1 auto) grew to fill it.
     .tunnel-mid__unit below now wraps both columns together with a capped
     max-width, so centering it here turns any extra width into symmetric
     outer whitespace on both sides instead. */
  justify-content: center;
  background: #ffffff;
}

/* Per Dave (round 23) - MAJOR LAYOUT FIX: the monitor (.tunnel-mid__preview)
   and the card content (.tunnel-mid__content) used to be direct children of
   .tunnel-mid itself - a fixed-width left column plus a flex:1 1 auto right
   column that simply absorbed whatever width was left over. That meant the
   monitor stayed pinned to the left edge at any browser width while the gap
   to the content column stretched or shrank independently as the window
   resized - sometimes way too far apart, sometimes crowded. This wrapper
   groups both columns into one flex row with a single FIXED gap between
   them that never grows or shrinks on its own, capped at a max-width so the
   pair doesn't stretch apart on ultra-wide windows either. .tunnel-mid
   above centers this unit (justify-content:center), so the whole
   monitor+content pair now moves and recenters together as one block -
   extra browser width becomes equal outer whitespace on the far left and
   far right, never extra space between the two columns.
   Per Dave (round 27): the round-23 56px gap read as "incredibly wide /
   ridiculous" on a narrower browser window, where he asked for the monitor
   and text to sit no more than ~40px apart. Verified via Playwright
   (getBoundingClientRect on .tunnel-intro__visual's right edge vs.
   .tunnel-mid__content's left edge, i.e. the REAL rendered gap, not just
   this CSS `gap` value) at 1024x800 up through 1920x900 and 600-900px
   viewport heights: .tunnel-mid__preview is flex:0 0 auto with no width of
   its own set in CSS, so its box already hugs .tunnel-intro__visual's
   JS-computed calc(587px * var(--intro-scale)) width exactly at every size
   tested - the measured visible gap always matched this `gap` value 1:1,
   never more. So there was no separate width/flex-basis mismatch bug to
   fix here (the column was never wider than the monitor graphic it holds);
   the whole 56px was genuinely just wider than Dave wants. Dropped straight
   to 40px, which the same Playwright pass confirms now measures as a true
   ~40px monitor-graphic-edge-to-text-column gap at every tested size.
   Round 31, per Dave: "they need to be maybe 30 pixels apart from each
   other no matter how big or small the browser window is." Re-verified via
   Playwright across every category (intro, website-changes, pages, logo,
   care, payment, summary) at 1024/1150/1280/1440/1680/1920px - both
   .tunnel-mid__preview (flex:0 0 auto, content-sized, never stretches) and
   .tunnel-mid__content (flex:1 1 auto, but the card inside it is anchored
   left:0 per the round-30 fix below, so it never re-centers into leftover
   width) hug this `gap` value exactly at every width tested, with zero
   drift - so a single fixed 30px value here is sufficient on its own;
   no per-slide overrides were found or needed.
   Round 32, per Dave: the whole monitor+content unit sat too close to the
   browser's left edge ("shift all of that stuff inside the white tunnel
   together, about 50 pixels to the right"). Added padding-left:50px here
   rather than touching the `gap` (which controls the 30px monitor-to-
   content spacing Dave already likes and explicitly wants kept). Because
   the page has a global box-sizing:border-box reset, this padding is
   absorbed inside the existing max-width:1440px box instead of growing it
   - so the fix behaves identically in both layout modes this unit runs in:
   below ~1440px viewport width the unit still stretches to fill
   .tunnel-mid (flex:1 1 auto) and the padding simply pushes the monitor
   50px off the true left edge; above ~1440px the unit is centered via
   .tunnel-mid's justify-content:center and the padding shifts the monitor
   50px off the unit's own (still-centered) left edge. Either way the
   monitor's on-screen left edge moves right by a consistent ~50px at every
   width, the .tunnel-mid__content column simply absorbs the 50px out of
   its own flex:1 1 auto space, and the 30px gap value below is completely
   untouched. Verified via Playwright at 1024/1280/1440/1680/1920px. */
.tunnel-mid__unit {
  display: flex;
  align-items: stretch;
  flex: 1 1 auto;
  max-width: 1440px;
  min-width: 0;
  /* Per Dave (latest round, item 8): "too much padding between the monitor
     and the text on the right... make it half that much" - halved from 30px
     to 15px. This is the single shared gap between .tunnel-mid__preview
     (monitor) and .tunnel-mid__content (text column); reducing it here pulls
     the text column left toward the monitor (monitor itself is untouched -
     it's flex:0 0 auto and never moves). Verified via Playwright at 1440px
     and 1920px: the rendered gap is now visibly half what it was, with no
     text/button overlap onto the monitor art. */
  gap: 15px;
  /* Per Dave (latest round): shifted right 80px in step with
     --tunnel-content-left above (50px -> 130px) so the monitor/text column
     kept sharing the same left edge as the top band's headline/timeline.
     Per Dave (round 52+, item 4): "middle content... shift LEFT 25px" -
     a separate, deliberate request from item 3's top-band-right-25px above.
     This deliberately BREAKS the previous sync with --tunnel-content-left,
     so this rule now uses its own independent variable
     (--tunnel-mid-content-left) instead of a hardcoded value tied to that
     var, set to 130px - 25px = 105px. The top band's offset now increases
     independently (see --tunnel-content-left above), so the two no longer
     share a left edge - a ~50px gap between them (25px + 25px in opposite
     directions from the old shared 130px position). */
  padding-left: var(--tunnel-mid-content-left);
}

/* Per Dave (v8): the monitor now scales to fill nearly the full HEIGHT of
   the white .tunnel-mid band (~15px clearance top/bottom - see
   sizeMonitorPreview() in tunnel.js), which at the monitor art's fixed
   587x435 aspect ratio makes it considerably wider than the old fixed-37%
   column could hold without clipping/overflowing into the content column.
   Switched this column from a fixed 37% width to flex:0 0 auto (content-
   sized) with a little horizontal padding, so its width always exactly
   matches whatever the height-driven scale computes, and the right-hand
   .tunnel-mid__content column (flex:1 1 auto) simply absorbs whatever
   width remains - no fixed percentage to fall out of sync with the JS
   scale math. sizeMonitorPreview() still caps the scale against .tunnel-mid's
   total width as a safety ceiling so the content column never gets
   starved. */
.tunnel-mid__preview {
  flex: 0 0 auto;
  position: relative;
  height: 100%;
  /* Per Dave (round 23): the old 8px symmetric padding + 20px extra left
     margin (ad hoc nudges from earlier rounds to control the monitor-to-
     content gap and keep it off the browser edge) are both gone - the
     fixed 56px gap now lives once on .tunnel-mid__unit's own `gap`
     (see above), and .tunnel-mid centering that whole unit is what keeps
     it off the edge, so neither hack is needed here anymore. */
  display: flex;
  /* Per Dave (round 22): the "View Your New Site" pill is no longer a
     stacked flex sibling below the monitor art (that pushed/shrank the
     monitor to make room for it, which Dave explicitly did not want). It's
     now absolutely positioned INSIDE .tunnel-intro__stage, overlapping the
     monitor graphic itself in the gap between the bezel and the stand base
     (see .tunnel-view-newsite-pill below) - so this column goes back to
     simply centering the one visual child, same as before the pill existed. */
  align-items: center;
  justify-content: center;
  background: #ffffff;
}

/* Per Dave (round 22): the "View Your New Site" pill moved from below the
   monitor art (which forced sizeMonitorPreview() to shrink the monitor to
   reserve room for it - Dave explicitly said don't shrink the monitor) to
   sitting directly ON TOP of the monitor graphic, in the flat open gap
   between the bottom of the bezel and the stand's base, beside the narrow
   neck. It's a child of .tunnel-intro__stage (like .tunnel-intro__frame and
   .tunnel-intro__screen), so the SAME scale(var(--intro-scale)) transform
   that sizes the whole monitor also scales this button's position, padding
   and font proportionally at any viewport height - no separate JS math
   needed, and it can never push or resize the monitor since it no longer
   participates in that flex layout at all.
   Per Dave (later round): moved from the RIGHT flank of the stand neck to
   the LEFT flank, still below the bezel's bottom edge - measured off
   assets/img/desktop-monitor-v2.jpg's native 587x435 canvas (bezel bottom
   edge ~y354, stand neck spans x233-357/y356-412, monitor's left edge
   ~x16). The open flank to the LEFT of the neck is x16-233, centered at
   x124 - mirrors the old right-side x467 position onto the left third of
   the canvas, same y384 depth below the bezel. */
.tunnel-view-newsite-pill {
  position: absolute;
  /* Per Dave: moved up 4px and left 20px (top 384->380, left 124->104). */
  left: 104px;
  top: 380px;
  transform: translate(-50%, -50%);
  z-index: 4;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Fix (this round), per Dave: "remove pill outline on this button and
     have a '+' to the right of the text, just like the below buttons, with
     same exact size/styling as the 7 [Foundation] buttons below it (mobile
     and desktop)." Border/background/pill-shape chrome removed entirely
     (same "flat text + plus icon" treatment as .tunnel-foundation-pill),
     and font-size/padding matched to that same desktop rule's values
     (9.4px / 6.8px-22px-6.8px-12px) instead of this pill's own old
     10.8px/7.2px-19.2px pair. gap added for the new plus icon (markup
     updated in tunnel.js to include a .tunnel-foundation-pill__plus span,
     reusing that exact shared icon rather than a new one-off). The
     transform:translate(-50%,-50%) above still keeps it centered on the
     same anchor point on the monitor graphic regardless of this size
     change. */
  padding: 6.8px 12px;
  /* Fix (this round), per Dave, desktop only: "move the text 'View Your New
     Site' over to the right four pixels so it's closer to the plus button...
     right now the plus symbol and the text are too spread apart." Same fix
     already applied to the mobile version of this pill below (gap 15px ->
     11px, see the --intro-scale-compensated mobile override) - this brings
     the desktop base rule in line with that same 4px trim. */
  gap: 11px;
  border: none;
  background: none;
  /* Per Dave: "ALWAYS use pill shape instead of square in these
     circumstances on hover, never square." No visible radius needed while
     background:none above, but the hover rule below fills a solid color -
     without this, that fill paints as a hard-edged rectangle instead of a
     pill. Set here so it's always pill-shaped the instant a background
     appears, on hover or otherwise. */
  border-radius: 999px;
  /* NOT var(--ink) - this pill lives inside .tunnel-intro__stage, a sibling
     of .tunnel-card rather than a descendant of it, so it never picks up
     .tunnel-card's local --ink redefinition (light cream -> dark). Using
     the root-scoped var(--ink) here would render near-invisible light text
     on this pill's white background - hardcoding the same #1c242a dark ink
     .tunnel-yesno__btn effectively resolves to instead. */
  color: #1c242a;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 9.4px;
  /* Per Dave: "too bold - make this a thinner font, lighter weight."
     600 -> 400 (regular). Mobile has its own separate rule further down
     this file (see the intro-scale-compensated override) - untouched here,
     scoped to desktop only per this being the desktop base rule. */
  font-weight: 400;
  letter-spacing: .02em;
  text-decoration: none;
  cursor: pointer;
  white-space: nowrap;
  transition: all .22s ease;
}

/* The shared .tunnel-foundation-pill__plus icon defaults to
   position:absolute (right:8.5px off its OWN button's edge) - correct for
   the still-bordered desktop Foundation pills it was built for, but wrong
   here: this pill is inline-flex with a real `gap` above (matching the
   Foundation pills' now-flattened mobile treatment), so the plus needs to
   be a normal flex child instead, flowing right after the label with that
   gap, on every viewport - not anchored to a fixed spot on the button's
   own edge. */
.tunnel-view-newsite-pill .tunnel-foundation-pill__plus {
  position: relative;
  top: auto;
  right: auto;
  transform: none;
  flex: 0 0 7.7px;
}
.tunnel-view-newsite-pill:hover .tunnel-foundation-pill__plus,
.tunnel-view-newsite-pill:focus-visible .tunnel-foundation-pill__plus {
  transform: rotate(45deg);
}
/* Per Dave: "the + should be off-white on hover." The plus bars default to
   a dark, muted rgba(28,36,42,.35) (see the shared base
   .tunnel-foundation-pill__plus::before/::after rule) - fine at rest
   against this pill's white/transparent background, but nearly invisible
   once the hover fill below paints the whole pill solid teal. The other 7
   buttons already get a hover color swap (see
   .tunnel-foundation-pill:hover .tunnel-foundation-pill__plus::before/
   ::after elsewhere in this file) - this pill needed its own copy since it
   doesn't share the .tunnel-foundation-pill class itself. */
.tunnel-view-newsite-pill:hover .tunnel-foundation-pill__plus::before,
.tunnel-view-newsite-pill:hover .tunnel-foundation-pill__plus::after,
.tunnel-view-newsite-pill:focus-visible .tunnel-foundation-pill__plus::before,
.tunnel-view-newsite-pill:focus-visible .tunnel-foundation-pill__plus::after {
  background: #f5f4f1 !important;
}

/* Fix (this round), per Dave: "on hover this button needs to be the solid
   primary color and the text needs to be white on hover" - overrides the
   previous faded-outline hover (matches this session's established
   "hover = solid accent + white text" convention used on the other pills/
   buttons, e.g. .tunnel-care-handoff-pill:hover below). */
.tunnel-view-newsite-pill:hover,
.tunnel-view-newsite-pill:focus-visible {
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* Per Dave (this round), item 6: only on the Website Changes slide, this
   pill's text swaps to "Check Site for Changes" (see syncNewSitePill() in
   tunnel.js) and gets a pulsing/throbbing effect to draw attention - reuses
   the EXACT same tunnelNextPulse keyframe already established on the
   Secure Checkout button (.tunnel-checkout-btn), same as Dave's reference
   ("like we did on some of the other [buttons]"), rather than inventing a
   new animation. Reverts (class removed) on every other slide. */
/* Item 3 (this round), per Dave: "a little bit more faint or faded on the
   throbbing here, it's a little bit much I think" - re. this exact pill's
   "Check Site for Changes" pulse. tunnelNextPulse (the shared keyframe this
   used to reuse) is also used by .tunnel-nav__btn--next and
   .tunnel-checkout-btn, which Dave did NOT flag - editing it directly would
   have quietly changed those two as well. Split off a dedicated, fainter
   keyframe just for this pill instead: peak shadow opacity dialed down
   (.55 -> .3) and the spread trimmed (10px -> 7px), a moderate reduction
   per this session's "no extreme moves" standard, not a near-invisible one. */
@keyframes tunnelNewSitePulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(94,115,135,.3); }
  50% { box-shadow: 0 0 0 7px rgba(94,115,135,0); }
}

.tunnel-view-newsite-pill.is-pulsing {
  animation: tunnelNewSitePulse 2.2s ease-in-out infinite;
}

/* Right column - holds the card track. Narrower than the old full-width
   .tunnel-mid now that the left column is permanently occupied; the
   .tunnel-card width/max-width rules below were updated to fit within it
   (percentage-based max-width instead of a viewport-relative one, since
   this column is narrower than the full viewport). */
/* Per Dave (supersedes the earlier "never allow scrolling" rule): this
   column must be scrollable vertically in case content is taller than the
   available space (e.g. a short browser window), but WITHOUT a visible
   scrollbar - wheel/trackpad/touch scrolling still works, the track/thumb
   itself just never renders. overflow-y:auto still lets an absolutely
   positioned, overflowing .tunnel-card (see .tunnel-card below) be reached
   by scrolling even though this column's own height is fixed. */
.tunnel-mid__content {
  position: relative;
  flex: 1 1 auto;
  height: 100%;
  overflow-y: auto;
  overflow-x: hidden;
  scrollbar-width: none; /* Firefox */
  -ms-overflow-style: none; /* legacy Edge/IE */
}

/* Item 10 (this round): one-time entrance animation for the tunnel's very
   first open only (see playIntroEntrance() in tunnel.js) - the text/question
   column glides in from the right (same direction as the regular slide-to-
   slide card transition), while the persistent monitor+"View Your New Site"
   column glides in from the left, timed to finish together so they visibly
   "meet in the middle." Duration/easing matches the main card transition
   (.65s var(--tunnel-ease), see .tunnel-card's `transition`, item 12 this
   round) for a consistent feel. Classes are added/removed by JS around a
   single playback - not a permanently-attached rule - so no later slide
   navigation (which leaves both of these elements static/persistent per
   buildRoot()'s design) is affected. */
@keyframes tunnelIntroContentIn {
  from { opacity: 0; transform: translateX(70px); }
  to { opacity: 1; transform: translateX(0); }
}
@keyframes tunnelIntroPreviewIn {
  from { opacity: 0; transform: translateX(-70px); }
  to { opacity: 1; transform: translateX(0); }
}
.tunnel-mid__content.tunnel-intro-anim-content {
  animation: tunnelIntroContentIn .65s var(--tunnel-ease) both;
}
.tunnel-mid__preview.tunnel-intro-anim-preview {
  animation: tunnelIntroPreviewIn .65s var(--tunnel-ease) both;
}

.tunnel-mid__content::-webkit-scrollbar {
  display: none;
  width: 0;
  height: 0;
}

.tunnel-track {
  position: relative;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Per Dave (round 45+, latest of several relocations this session - moved
   from the "Hosting & Care" slide to "Logo Design", then to a card-content
   position, then to the gray .tunnel-bottom band, and now here): reuses the
   same looping client-logo marquee already on the stock landing page's Logo
   Add-on card (.logo-addon-marquee in landingpage-template/assets/css/
   styles.css - same client-logo-strip.png asset, same scroll/loop
   behavior). Per Dave's latest, most specific instruction: it belongs
   "in the 'Do you need a new logo?' section, BEFORE they click yes...
   underneath that yes/no question... in between the computer frame and the
   right side of the browser window." It's now built directly inside the
   Logo Design card's .tunnel-qa markup (see the 'logo' category's
   kind:'yesno' branch in buildCards(), tunnel.js) as a normal in-flow block
   below the question + Yes/No buttons - NOT absolutely positioned/pinned to
   the bottom band anymore, since .tunnel-qa's own containing column
   (.tunnel-mid__content) IS already "between the monitor and the right edge
   of the browser." Because it's a plain child of .tunnel-qa, it disappears
   automatically the instant `.tunnel-qa.is-collapsed` is applied on "Yes"
   (see the click handler in tunnel.js) - no separate show/hide toggle is
   needed, and it can never reappear once the card expands into the
   textarea/upload fields. Per Dave: kept noticeably lighter/more subtle
   than a plain grayscale treatment - grayscale plus a low opacity so the
   logos read as a faint gray watermark rather than a bold logo strip. */
.tunnel-logo-marquee {
  /* Fix (this round), per Dave (repeat complaint on the Logo Design slide's
     Yes/No buttons sitting too high/low vs. every other slide): this
     element used to be `position:relative` (plain in-flow), which meant its
     68px height + 42px margin-top counted toward .tunnel-card's own total
     height - and since that card is vertically CENTERED (top:40% +
     translateY(-50%)), the extra height shifted the Yes/No row above it up
     relative to every other yesno-kind slide (none of which have a
     marquee). A prior attempt compensated with a big margin-top on the
     eyebrow instead of fixing this - that overshot at shorter browser
     windows (added height pushed the whole box past this column's
     max-height, triggering a scroll). Root-cause fix instead: position this
     absolutely so it NEVER contributes to .tunnel-card's height at all - the
     card (the nearest positioned ancestor) centers itself exactly like
     every other yesno slide, no compensation needed anywhere. `top:100%`
     (of the card's own, now-marquee-free height) + the same 42px
     margin-top lands this in the identical on-screen spot it always
     occupied, directly below the Yes/No row. */
  position: absolute;
  top: 100%;
  left: 0;
  /* Per Dave (latest round): "You have this logo animated banner incredibly
     tiny... it stops in the middle. It needs to go from the monitor over to
     the right side of the browser." The old `max-width: var(--tunnel-card-w)`
     capped this at the same ~465px narrow text-column width as the
     question/buttons above it - nowhere near wide enough to read as a real
     banner, and with only ~2 small logo images' worth of scrollable content
     inside a box nearly as wide as they were, the translateX(-50%) loop had
     almost no room to visibly travel before resetting, which is what read
     as "stops in the middle" rather than a genuine bug in the loop math
     itself.
     FIX (this round): width is now set inline (px) by sizeLogoMarquee() in
     tunnel.js, which measures the LIVE rendered width of
     .tunnel-mid__content (the actual monitor-edge-to-browser-edge column)
     on load/resize and lands the marquee's right edge flush with that
     column's real right edge - this CSS width:100% is just the fallback
     before JS runs. That alone wasn't enough while this element lived
     inside .tunnel-qa (~445px wide, overflow:hidden) - no CSS overflow
     combination lets one axis stay clipped while the other is genuinely
     "visible" (mixing overflow-x:visible with overflow-y:hidden computes to
     'auto', which still clips). So this element is no longer a child of
     .tunnel-qa at all - it's built as a sibling appended directly to
     .tunnel-card in tunnel.js's buildCards() (which has its own
     overflow:visible), so its wide inline width is never clipped back down
     to the narrow question/button column. It still visually sits directly
     below the Yes/No row via normal document flow. Show/hide on Yes/No is
     now handled explicitly via the .is-collapsed class below (previously
     free-rode qa's own collapse, since it was qa's child). */
  width: 100%;
  /* Doubled from 26px (per Dave: "at least twice that big") - the logo
     images below are height:100%/width:auto, so this single value also
     doubles their rendered width proportionally, giving the loop far more
     real scrollable distance to travel, which combined with the wider
     container above is what actually fixes the "stops in the middle" look. */
  /* Per Dave (latest round): scaled up another 30% (52px -> ~68px) and
     nudged 20px further down (22px -> 42px margin-top) - the images below
     are still height:100%/width:auto so this single height change scales
     the whole marquee (track + logos) proportionally, same trick as the
     original doubling above. */
  height: 68px;
  /* Per Dave (this round): "a little bit low, raise it about 28 pixels" -
     42px -> 14px. Everything else about this element (width/height/timing/
     the is-collapsed toggle) is untouched. */
  margin-top: 14px;
  overflow: hidden;
  opacity: 1;
  visibility: visible;
  pointer-events: none;
  z-index: 1;
  max-height: 68px;
  transition: opacity .3s ease, max-height .42s var(--tunnel-ease), margin-top .42s var(--tunnel-ease);
}

/* Per Dave: the marquee no longer lives inside .tunnel-qa (see the class
   comment above), so it no longer disappears for free when qa collapses on
   "Yes" - this class is toggled explicitly alongside qa.is-collapsed in
   tunnel.js's data-answer click handler, using the same fade treatment. */
.tunnel-logo-marquee.is-collapsed {
  opacity: 0;
  max-height: 0;
  margin-top: 0;
  pointer-events: none;
}

.tunnel-logo-marquee__track {
  display: flex;
  align-items: center;
  height: 100%;
  width: max-content;
  /* Per Dave: "just a tad faster" - 84s -> 70s (~17% shorter duration,
     i.e. faster) at the same distance/loop, not a drastic change. The
     keyframes below already animate a full, seamless 0 -> -50% loop across
     the two duplicated .tunnel-logo-marquee__img tracks (see the markup in
     tunnel.js's 'logo' category branch) - two copies of the same strip
     laid side by side, translated left by exactly one copy's width, so it
     wraps with no visible seam/reset. That loop was already mechanically
     seamless; only the container/image size (above) was making it
     imperceptible. */
  animation: tunnelCareMarquee 70s linear infinite reverse;
  will-change: transform;
}

.tunnel-logo-marquee__img {
  display: block;
  height: 100%;
  width: auto;
  flex: 0 0 auto;
  filter: grayscale(1);
  /* Per Dave (latest round): logos were reading as too faint/washed out at
     .35 - bumped up modestly to .55 so they're noticeably more visible
     while still staying a subtle, muted watermark-style strip (not a bold
     logo bar). */
  opacity: .55;
}

@keyframes tunnelCareMarquee {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

/* Round 36+: the old max-height:760px override (originally compensating
   for less vertical room in the tall white mid-band card) no longer
   applies now that the marquee lives in the fixed-role gray .tunnel-bottom
   band at a slim 30px instead of the card-relative 68px - nothing left to
   compensate for. */

.tunnel-card {
  position: absolute;
  /* REAL ROOT CAUSE (this round) of the Secure Checkout button's left-edge
     crop, per Dave's 8th report on this: every prior attempt (raising
     .tunnel-checkout-btn's own z-index to 20, then switching .tunnel-summary
     off overflow-x:hidden) treated this as either a stacking-order problem
     on the BUTTON or a clipping problem on its SCROLL ANCESTOR - both real
     things to check, neither was the actual cause. The actual cause: this
     card has `transform` set unconditionally below (translateY/translateX/
     scale), and ANY non-none `transform` creates a brand new CSS stacking
     context for the element - so .tunnel-checkout-btn's z-index:20 has only
     ever been compared against OTHER elements inside .tunnel-card's own
     local context, never against elements outside it (like the persistent
     monitor mockup in the sibling .tunnel-mid__preview column, which sits
     in a DIFFERENT branch of the tree). What actually decides whether the
     monitor paints over the card (or vice versa) is where THIS ELEMENT
     itself - the whole stacking context, as one unit - ranks in ITS OWN
     parent's stacking order. This card never had an explicit z-index of its
     own (auto = stacking level 0), while .tunnel-intro__mask (part of the
     monitor graphic, see that rule elsewhere in this file) has z-index:5 -
     so at some widths/selections the mask's higher explicit level won out
     over this card's implicit "0", clipping a sliver of whatever card
     content happened to sit near that boundary (the Secure Checkout button,
     given its position). Giving THIS element - not the button buried inside
     it - an explicit z-index above the monitor's highest internal value (5)
     is the fix that actually reaches the real comparison. */
  z-index: 10;
  /* ROUND 30 - ROOT CAUSE of the recurring "huge monitor-to-content gap"
     bug (reported broken across multiple prior rounds despite each one
     re-measuring and closing the ticket): every previous round measured the
     gap as getBoundingClientRect() of .tunnel-mid__content's own box edge
     vs. the monitor's edge, which is genuinely a fixed 40px (the
     .tunnel-mid__unit `gap` value) at every width - that measurement was
     never wrong. But .tunnel-mid__content itself is flex:1 1 auto, so its
     box keeps growing to absorb all leftover browser width. This card was
     `left:50%` + `translate(-50%, -50%)` - CENTERED inside that ever-
     growing box, not anchored near its left edge. At a narrow width where
     the content column happens to be close to the card's own 465px width,
     centering looks fine (near-zero slack). At realistic/wide desktop
     widths (1150px+), the column becomes far wider than the fixed-width
     card, and centering strands the actual visible text in the middle of
     that leftover space - which reads as a large blank gap between the
     monitor and the text, exactly what Dave kept reporting, even though
     the 40px CSS gap value itself was never the problem. Verified via
     Playwright: at 1440px the text block was rendered ~134px further right
     than the content column's own left edge (in addition to the 40px unit
     gap), i.e. ~174px of visible whitespace - see tunnel-fix-round30/.
     Fixed by anchoring the card to the LEFT edge of .tunnel-mid__content
     (left:0, vertical centering only) instead of centering it inside the
     column, so the text always starts immediately after the fixed 40px
     gap at any viewport width, matching how it already looked (correctly)
     at narrower widths. */
  left: 0;
  /* Per Dave (round 35): every card (and its monitor-preview neighbor, both
     riding this same vertical anchor via translateY(-50%) below) read as
     "quite low" in the white .tunnel-mid band even though 50% is a true
     mathematical center of that band - because each card's own content is
     top-anchored inside itself (heading/tiles/etc. all start at the card's
     top edge and grow downward), true vertical centering of the CARD puts
     most of the visible text in the lower half of the band, which is what
     reads as low. Moved the anchor up to 42% (was 50%) - still centered
     enough that short cards (e.g. yes/no-only slides) don't look pinned to
     the top, but the extra ~8% of band height (~40px at this band's ~525px
     height) now sits below the content instead of above it, pulling text
     toward the upper-middle of the band as Dave asked. Verified via
     Playwright across the changes/intro/care slides - no clipping against
     .tunnel-top or .tunnel-bottom at any of them (see tunnel-fix-round35/). */
  /* Round 36+ REGRESSION FIX: 42% (round 35's "pull content up" fix) pushed
     the tallest cards' eyebrow labels (e.g. Website Changes with its Font
     Changes panel open) up far enough to visibly touch/overlap the teal
     top band - a hard visual bug Dave flagged as worse than the original
     "too low" complaint 42% was meant to solve. Dialed back to 46%,
     roughly the midpoint between the original 50% (too low) and the 42%
     overcorrection (touching the top band) - erring slightly toward more
     top clearance since touching is the harder failure of the two. */
  /* Per Dave (this round): "all of this text content on the right needs to
     move up... too much padding on top, and then it runs into the gray bar
     at the bottom" - this vertical centering anchor (top + translateY(-50%)
     below) IS the real "top padding" for this column: there's no literal
     padding-top on .tunnel-mid__content or .tunnel-card, the gap above
     short cards (e.g. the Website Changes tile-selection screen, Hc~216px)
     is purely a byproduct of centering a short box in a much taller column.
     Root-cause check via Playwright at 1440x900: with the OLD 46%/90% pair,
     a short card's top gap measured ~158px while its bottom gap was ~204px -
     confirming the "huge top padding" complaint - but the TALLEST cards
     (the changes-detail sub-panels, already capped at the old 90%
     max-height below) measured only ~5-9px of top clearance, i.e. almost
     zero headroom, which is exactly why round 36 dialed this anchor back
     from 42% to 46% in the first place (42% + a 90% cap put those same
     tall panels into negative territory - real overlap with the teal top
     band). Lowering only this value would reproduce that exact regression,
     so it's paired with the max-height reduction below: both moved so the
     capped-panel top clearance stays mathematically the SAME (~0.01 of the
     column height, matching the old 46%/90% pair almost exactly - verified
     via Playwright: ~5-9px before, ~5-9px after, no clipping), while every
     shorter card's top gap drops a genuine ~22% (e.g. ~158px -> ~123px at
     1440x900) and its bottom gap grows in step (~204px -> ~239px) - less
     padding on top, more breathing room before the gray .tunnel-bottom
     band, exactly as asked. */
  top: 40%;
  width: var(--tunnel-card-w);
  /* Was 88vw (viewport-relative) - now that .tunnel-card's containing block
     is the narrower right-hand .tunnel-mid__content column (not the full
     viewport, since the left column is permanently occupied by the
     persistent laptop preview - see .tunnel-mid__preview above), the
     max-width needs to be relative to that column instead of the viewport,
     so it can't overflow past its own column. */
  max-width: 92%;
  /* Per Dave (updated): if a card's content still exceeds this, the parent
     .tunnel-mid__content column now scrolls (with its scrollbar hidden -
     see above) rather than clipping content unreachably. max-height stays
     as a soft target so most slides never need to scroll at all. */
  /* Paired with the `top` anchor change above (90% -> 78%): keeps the
     tallest/capped panels' top clearance unchanged (still ~0.01 of the
     column height, non-clipping - see note above) while freeing up real
     extra room below them before .tunnel-bottom, instead of just shifting
     the same fixed-size box higher and leaving the reclaimed space
     stranded above the panel. Content that already scrolled internally at
     90% may now start scrolling a little sooner - an accepted trade-off,
     since this column's overflow-y:auto scroll fallback (above) was
     already built specifically for this case. */
  max-height: 78%;
  overflow: visible;
  transform: translateY(-50%) translateX(0) scale(1);
  opacity: 1;
  /* Per Dave: no more "boxes within boxes" - the card is a plain, unboxed
     content container now (no fill, no border, no radius, no shadow). It
     sits directly on .tunnel-mid's white background and content flows
     freely; typography/spacing carry the hierarchy instead of container
     chrome. Only light breathing-room padding remains so text doesn't
     press against the edges of the mid band. */
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 14px 10px;
  /* Fix (round 44+), item 2 - per Dave: scrolling a tall category's
     content all the way down left its trailing OK/Next button flush
     against the gray .tunnel-bottom band with zero clearance. Tried
     adding padding-bottom here first, but this card's own box is capped
     by `max-height: 90%` above while `overflow: visible` lets its real
     content paint past that cap - trailing padding on THIS capped box
     gets absorbed into the cap and never actually pushes the visually-
     overflowing content down (confirmed via Playwright: measured a ~0px
     gap no matter the padding value here). The real, working fix lives
     on each panel's own last-child wrapper instead - see
     .tunnel-3tile-ok-row and .tunnel-pages-flow.is-visible - which are
     not subject to this card's max-height clamp. */
  box-shadow: none;
  /* Per Dave: the slide transition "just very quickly comes in" instead of
     visibly sliding. Root cause was the incoming/outgoing translateX
     distance being only 6% of the card's own width (~37px on the 620px
     card) combined with a scale(.97) - together those read as a quick
     fade/settle rather than a clear directional slide. Longer duration +
     a proper ease-out-expo curve (below) plus a real fixed-pixel travel
     distance (see .is-prev/.is-next) now produce a visible, elegant slide.
     Per Dave (round 22): even at .52s/64px the motion still read as "snaps
     in so quick" - verified empirically with Playwright (sampling computed
     transform/opacity every ~60ms mid-click) that the .52s/64px animation
     WAS genuinely running exactly as coded, it just wasn't a big/slow enough
     move to read as an elegant glide to the eye. Bumped to a longer .7s
     transform duration and roughly double the travel distance (64px -> 120px,
     see .is-prev/.is-next below) so the incoming card's glide-in and the
     outgoing card's fade-out are both unmistakable while watching it.
     Round 31, item 8, per Dave (referencing Warby Parker's quiz flow as the
     target feel): .7s read as sluggish rather than elegant once the actual
     bypass bug below was fixed (real snapping was masking this - with every
     navigation path now genuinely animating, the plain duration itself
     became the next thing to tune). Settled on .55s - inside Dave's
     requested 500-600ms "just right" window - with a smoother, more
     symmetric ease-out-ish curve. Opacity now finishes noticeably faster
     (.38s) than the .55s transform, so the incoming card visibly
     materializes partway through its own slide (rather than the two
     finishing in lockstep, which read as flatter/less alive) and the
     outgoing card visibly fades before it's finished sliding away - both
     halves of the motion play concurrently from the same class-toggle
     tick (see goToIndex()/updateCardPositions() in tunnel.js - there was
     never a separate "then" step here), so fade and slide are already
     choreographed together, not sequential.
     Round 36, per Dave (THIRD+ round on this same complaint - "still the
     same, like almost immediate"): investigated from scratch instead of
     re-trusting the prior rounds' numeric transform sampling. First ruled
     out DOM recreation - buildCards() in tunnel.js runs exactly ONCE at
     init (confirmed by grep + reading the init sequence), and every
     navigation (goToIndex -> updateCardPositions) only ever toggles
     classes on the SAME persistent card nodes, never rebuilds them, so
     that classic "no prior painted state to transition from" bug was never
     in play here. Then re-verified the transition mechanism itself two
     ways: (1) temporarily forced a 3s transition-duration via an injected
     style tag and polled getComputedStyle().transform every 200ms - it
     interpolated smoothly through 15 distinct in-between values from
     120px down to 0, proving the CSS engine and the class-toggle timing
     both genuinely work; (2) polled the REAL .55s/120px animation the same
     way, every 30ms - it also interpolated smoothly and completed in
     ~600ms real time, matching the authored durations exactly. So the
     ROOT CAUSE was never a broken/bypassed transition - it's that 120px
     (the actual travel distance) is only ~8% of a 1440px-wide viewport,
     and the opacity fade (.38s) reaches ~90%+ before the transform is even
     halfway done, so almost the entire move is fully-opaque and nearly-
     arrived within the eye's first glance - technically animating, but too
     small/quick a move to ever read as a deliberate "glide in from the
     right edge" to a human watching it, exactly as Dave described. Fixed
     by making the travel distance genuinely viewport-scaled (see
     .is-prev/.is-next/.is-hidden-far below - 70vw instead of a fixed
     120px), so the incoming card visibly originates from near the
     browser's right edge and the outgoing card visibly exits toward the
     left edge, at any window size. Verified via Playwright video recording
     (frame-by-frame extraction, not just numeric sampling this time) - see
     tunnel-fix-transition-final/ - multiple distinct in-between frames now
     show the card clearly mid-flight across the visible content column,
     not just a before/after pair. */
  /* Item 12 (earlier round), per Dave: "the gliding in from right to left of
     the next category is still a little too rapid - can you slow it down
     by like 25%." Actual current values (not the .55s the comments above
     reference - those went stale after a later untracked tweak) were .52s
     transform / .4s opacity+filter. Bumped ~25%: .52s -> .65s, .4s -> .5s.
     Item 13 (this round), per Dave: "slow down the glide in when you hit
     the next button even more, it's still coming too quickly." Bumped
     again, ~50%: .65s -> 1s transform, .5s -> .75s opacity+filter. Any
     JS setTimeout()s that wait for this transition to visually settle
     before re-measuring/resetting state (see scheduleFlushRemeasure() and
     sizeLogoMarquee()'s own delayed call in tunnel.js) were bumped by the
     same ratio so nothing fires early and catches the card mid-flight. */
  /* Round 37 (REPEAT complaint, 4th+ round on this exact issue), per Dave:
     "this glides in from left and from right way too quickly... I keep
     asking you to slow these things down, I don't see a change." Re-verified
     from scratch rather than trusting round 36's self-report: confirmed via
     grep that this is the ONLY `.tunnel-card {` rule in the file (no later
     duplicate/higher-specificity override silently winning the cascade) and
     that index.html's cache-buster WAS bumped to ?v=98 after round 36 (so
     Dave's browser should have loaded the 1s/.75s values, not a stale
     asset) - the 1s/.75s value was genuinely live, it was simply still not
     slow enough to read as deliberate. Roughly doubled again per this
     round's instruction: transform 1s -> 1.9s, opacity/filter .75s -> 1.35s. */
  /* `top` added (this round, item 3) alongside `transform` so the new
     top-anchored override below (see .tunnel-card.is-current:has(...)
     after the is-hidden-far rules) animates smoothly into/out of place
     when a Website Changes sub-panel opens/closes, instead of snapping -
     `top` never changes anywhere else in this file, so this is a no-op
     everywhere except that one state change. */
  transition: transform 1.9s cubic-bezier(.16, 1, .3, 1), top 1.9s cubic-bezier(.16, 1, .3, 1), opacity 1.35s ease-out, filter 1.35s var(--tunnel-ease);
  will-change: transform, opacity;
  pointer-events: none;
  /* --ink/--muted (defined in styles.css) are light cream tones meant for
     text on the site's dark background. Now that the card itself is light,
     redefine them locally so every rule inside the card that already
     reads "color: var(--ink)" / "color: var(--muted)" automatically
     becomes dark, legible text - no need to touch each rule individually. */
  --ink: #1c242a;
  --muted: rgba(28,36,42,.62);
  /* Root-cause fix for "text renders too light" bugs on this card (e.g. the
     stepper number): #webyayTunnel sets `color: var(--ink)` using the
     ROOT-scoped --ink (a light cream tone meant for the dark tunnel shell),
     and that computed color is what descendants inherit by default. Simply
     redefining the --ink/--muted CUSTOM PROPERTIES above does not retroactively
     change that already-inherited `color` - only elements that themselves
     write `color: var(--ink)` picked up the dark tone. Any element in here
     that never set an explicit `color` (like .tunnel-stepper__value) kept
     inheriting the light cream color from the shell, reading as "too light
     gray" against this card's white background. Setting `color` directly
     here means every descendant without its own explicit color declaration
     now inherits the correct dark ink by default. */
  color: var(--ink);
}

.tunnel-card.is-current {
  pointer-events: auto;
  opacity: 1;
  /* ROUND 30: left/horizontal-centering removed - see the root-cause note
     on .tunnel-card above (was translate(-50%, -50%), now vertical-only). */
  transform: translateY(-50%) translateX(0) scale(1);
  z-index: 3;
}

/* Per Dave: no more ghost/peek previews of the previous or next card - only
   the current card is ever visible. Cards leaving to the back (is-prev,
   i.e. the one just navigated away from) simply fade/slide out to the
   left; cards about to become current arrive by fading/sliding in from the
   right (is-next is applied for one frame right before a card becomes
   is-current - see tunnel.js). Both states are fully transparent and
   non-interactive, never idle-visible. */
.tunnel-card.is-prev {
  opacity: 0;
  /* Fixed-pixel travel distance (was -6%, ~37px on a 620px card - too
     subtle to read as a slide) so the outgoing card visibly travels left
     by a moderate, consistent amount regardless of card width. Dropped the
     scale(.97) - it muddied the pure directional read of the motion.
     Per Dave (round 22): bumped 64px -> 120px alongside the longer .7s
     duration above, so the outgoing fade/slide reads as a clear, elegant
     glide rather than a quick snap.
     Round 36: 120px is a fixed pixel value regardless of window size - on
     a wide desktop that's only ~8% of the viewport, nowhere near "the left
     edge of the browser." Switched to a viewport-relative 70vw so the
     outgoing card always travels a genuinely dramatic distance toward the
     browser's left edge, proportional to the actual window width (see the
     transition-duration comment above for the full investigation notes -
     the transition mechanism itself was already firing correctly; distance
     was the real problem). */
  transform: translateY(-50%) translateX(-70vw);
  z-index: 1;
  pointer-events: none;
}

.tunnel-card.is-next {
  opacity: 0;
  /* See .is-prev above - same viewport-relative distance, opposite
     direction, so the incoming card visibly slides in from the right edge
     of the browser. */
  transform: translateY(-50%) translateX(70vw);
  z-index: 1;
  pointer-events: none;
}

/* Round 31, item 8 - ROOT CAUSE of the "chip navigation still snaps" bug:
   .is-hidden-far never set its own `transform`, so it silently inherited
   the base .tunnel-card rule's translateX(0) - THE EXACT SAME transform
   value as .is-current. Every trigger (Next, Back, chip click) already
   funnels through the one goToIndex()/updateCardPositions() path in
   tunnel.js (verified - there was never a second, separate "jump instantly"
   code path), but clicking a completed trail chip more than one slide away
   moves the outgoing card straight from is-current to is-hidden-far (not
   is-prev/is-next, since it's no longer adjacent to the new currentIndex) -
   and since translateX(0) -> translateX(0) is not a transform CHANGE, only
   opacity animated. That read as a flat crossfade with zero slide motion,
   which is exactly the "snapping" Dave kept seeing even though the
   underlying code path was already unified. Fix: give is-hidden-far the
   same directional offset as is-prev/is-next, chosen by the card's index
   relative to the NEW currentIndex (via .is-before/.is-after, set in
   updateCardPositions()) - so a far card sitting off-screen already carries
   the correct-direction offset, and becoming current (or leaving it) now
   always animates a real slide, at any jump distance, not just +-1. */
.tunnel-card.is-hidden-far {
  opacity: 0;
  pointer-events: none;
}
.tunnel-card.is-hidden-far.is-before {
  /* Round 36: matches the .is-prev viewport-relative distance above. */
  transform: translateY(-50%) translateX(-70vw);
}
.tunnel-card.is-hidden-far.is-after {
  transform: translateY(-50%) translateX(70vw);
}

/* HIGH-PRIORITY FIX (this round), item 3 - REPEAT complaint, per Dave: "you
   see how when I go into these sub-categories, you have tons of padding on
   the top, and it's butting up to the gray bar at the bottom... needs to be
   way higher vertically in the page... I've asked for this a few times."
   The 4 Website Changes sub-panels (Overall Changes/Font Changes/Social
   Media/Email - each a .tunnel-3tile-panel.is-visible inside this card)
   were still reading this way even after an earlier round's general
   .tunnel-card top:46%->40%/max-height:90%->78% tune. Root cause: that
   earlier fix only ever adjusted the CENTERING anchor's percentages -
   .tunnel-card is (and remained) `top:40%` + `transform:translateY(-50%)`,
   which by definition always splits whatever headroom exists roughly
   evenly above/below the box. Nudging the percentages can rebalance top-gap
   vs. bottom-gap against each other, but can never make the TOP gap alone
   genuinely small while this card's tallest real content (Font Changes' own
   2-column font grid + its OK button, the tallest of the 4 sub-panels)
   still safely clears the gray .tunnel-bottom band - centering is
   structurally the wrong model for a panel this tall.
   Fix: when a sub-panel is open, this specific state now uses a TOP-
   ANCHORED (non-centering) position instead - `top:0` lands the panel's
   real content right at .tunnel-card's own 14px top padding, i.e. within a
   few px of the monitor mockup's own top edge (.tunnel-mid__preview's
   monitor art sits ~15px from the band's top - see that rule's comment),
   matching Dave's literal "get it up close to the top edge of that
   monitor" ask, instead of floating in the vertical middle of the band.
   `transform:translateY(0)` (no vertical translate at all) replaces the
   -50% centering translate. max-height raised to 96% (was the general
   78% cap) since this state no longer needs half its box-height reserved
   as "space above" - the freed room goes toward the tallest panel (Font
   Changes) actually having somewhere real to grow into before the bottom
   band, and .tunnel-mid__content's own overflow-y:auto (scrollbar hidden)
   remains as a non-clipping safety net for any content that still exceeds
   this on an unusually short window.
   Scoped narrowly via :has(.tunnel-3tile-panel.is-visible) so ONLY this
   exact state is affected - the Website Changes tile-picker screen (no
   panel open yet) and every other category's card keep the normal centered
   layout untouched. :has() is unsupported only in very old browsers, where
   this rule is simply ignored and the pre-existing centered .tunnel-card.
   is-current rule above still applies - a safe, non-breaking fallback, not
   a hard dependency. */
.tunnel-card.is-current:has(.tunnel-3tile-panel.is-visible) {
  top: 0;
  transform: translateY(0) translateX(0) scale(1);
  max-height: 96%;
}

/* Fix (this round), item 2, per Dave (REPEAT complaint): "this content in
   the Website Changes overall for all four categories is too low in the
   tunnel window, it needs to go up at least 30 pixels or more."
   REAL root cause, found via Playwright after the margin trims below alone
   only reclaimed a few px: the "What kind of changes?" subquestion right
   above the tile row is SUPPOSED to collapse to 0 height the instant a
   panel opens (tunnel.js's setHeaderCollapsed(true) adds .is-collapsed to
   it, exactly like the eyebrow right above it) but a separate cascade-
   specificity bug (see the .tunnel-detail__heading--subquestion[data-3tile-
   subquestion].is-collapsed fix further up this file) was silently
   cancelling that collapse, permanently costing ~47px of dead space on
   every one of the 4 sub-panels. Fixing that alone delivers the bulk of
   Dave's requested 30px+ move. The .tunnel-card__question above it is
   already invisible while a panel is open (it lives inside .tunnel-qa,
   which is-collapsed already clips to 0 - confirmed via Playwright, no fix
   needed there). The margin trims below are the remaining, smaller
   contribution: tightening the eyebrow's/panel's own spacing (tuned for
   the OLD centered layout, which had slack to spare) now that the card is
   top-anchored. Scoped entirely inside this :has(.tunnel-3tile-panel.
   is-visible) state so the tile-PICKER screen (no panel open yet) and
   every other slide keep their original spacing untouched. Combined
   effect verified via Playwright: panel content now clears the gray band
   with a comfortable positive gap instead of clipping into it, and the
   tile fields sit noticeably higher than before this round. */
.tunnel-card.is-current:has(.tunnel-3tile-panel.is-visible) .tunnel-card__eyebrow {
  margin-bottom: 4px;
}
.tunnel-card.is-current:has(.tunnel-3tile-panel.is-visible) .tunnel-3tile-panel.is-visible {
  margin-top: 4px;
}

/* Item 5 (prior round), per Dave: "this content is a bit high in that white
   tunnel... 20 or 30 pixels too skewed high" - referring specifically to
   the Summary/Review Order slide ("Here's everything you've selected...").
   The prior fix nudged the CENTERING anchor (`top:40%` + `translateY(-50%)`)
   down by a flat 25px - but that's the wrong model for this card entirely.
   ROOT CAUSE (this round): .tunnel-summary opts into the flush-scroll
   mechanism (data-flush-scroll in tunnel.js/sizeFlushScrollAreas()), which
   force-stretches this card's real measured height via min-height to reach
   almost all the way down to the gray .tunnel-bottom band - i.e. this card
   ends up nearly as tall as the ENTIRE mid column (measured ~92% of it,
   matching this card's own max-height:92% override below). Centering a box
   that tall via `translateY(-50%)` moves its top edge up by roughly HALF
   THE COLUMN'S HEIGHT - a ~25px nudge to the anchor is negligible against
   that, which is exactly why Dave's screenshot showed the headline clipped
   UNDER the top teal band: the box's top edge was landing above the mid
   column's own top edge, i.e. inside the top band itself. Fixed by
   switching this state to the SAME top-anchored (non-centering) model
   already proven safe for the Website Changes sub-panels directly above
   (`top:0` + `transform:translateY(0)`) instead of trying to tune a
   centering anchor against a box that's nearly full-column height - the
   card's own 20px top padding (see [data-summary-detail="true"] padding
   below) then provides the actual visible gap below the top band, verified
   via Playwright as a clearly positive, non-clipping gap. Scoped only to
   the Summary card via its own [data-summary-detail="true"] marker (set in
   tunnel.js) so no other slide is affected. */
.tunnel-card.is-current[data-summary-detail="true"] {
  top: 0;
  transform: translateY(0) translateX(0) scale(1);
}

/* BUG FIX (this round), per Dave: "flows in at the right height and then
   glides up too high by the time it stops." Root cause: .tunnel-card's
   base rule has BOTH `top` and `transform` in its transition list (1.9s!).
   is-prev/is-next (below) never override `top`, so while this card is
   mid-transition (arriving from is-next), its `top` is still the base
   card's 40% - only once the `is-current` class lands does the
   [data-summary-detail] override above kick top down to 0. Since `top` is
   a transitioned property, the browser doesn't jump straight to 0 - it
   genuinely ANIMATES from 40% to 0 over the full 1.9s, which is exactly
   the extra "glide up" after the card already looked like it had arrived.
   Fix: give this card's is-prev/is-next states the SAME top:0 (and a
   transform with no vertical component - translateY(0), only translateX
   slides) so `top` and the transform's Y component never actually change
   across ANY state this card can be in. Only translateX (the intentional
   left/right slide) still animates - the vertical "settle" glitch is
   gone because there's no longer a vertical value change to animate. */
.tunnel-card.is-prev[data-summary-detail="true"] {
  top: 0;
  transform: translateY(0) translateX(-70vw);
}
.tunnel-card.is-next[data-summary-detail="true"] {
  top: 0;
  transform: translateY(0) translateX(70vw);
}

/* Fix (this round), item 10, per Dave: the embedded account-creation panel's
   "Step 1A: Create account" label (`.small-label` in the base site's
   #accountFlowModal markup, index.html) read as an odd one-off "STEP 1A"
   numbering AND used its own smaller/differently-colored one-off style
   instead of the shared eyebrow look every other tunnel category uses
   ("WEBSITE CHANGES", "ADDITIONAL PAGES", etc). Copy simplified to plain
   "Create Account" (no step numbering) and the markup now carries this
   same .tunnel-card__eyebrow class directly (see index.html) rather than a
   one-off style, so it's genuinely the same rule, not a lookalike. */
.tunnel-card__eyebrow {
  display: block;
  font-size: 11px;
  letter-spacing: .14em;
  text-transform: uppercase;
  /* Per Dave (this round): same "old discarded dark beige" fix as
     .tunnel-card__question above - this was a 50% screening of the old
     --tunnel-teal-bg-dark/#75726c beige tone; now a 50% screening of
     --ink (#1c242a = rgb(28,36,42)) instead, so the eyebrow stays
     visually paired with the header's new dark-gray color. */
  color: rgba(28, 36, 42, .5);
  margin-bottom: 10px;
  /* Per Dave: on slides where a tile's fields expand below (currently just
     Website Changes), this eyebrow temporarily collapses via .is-collapsed
     (see JS) to reclaim vertical real estate while filling in the tile's
     fields, then fades back in once OK is hit. max-height capped generously
     above the text's real rendered height so the base (non-collapsed) state
     never clips; same fade+collapse transition idiom as .tunnel-qa.is-collapsed
     elsewhere in this file. */
  max-height: 40px;
  overflow: hidden;
  opacity: 1;
  transition: max-height .42s var(--tunnel-ease), opacity .22s ease, margin-bottom .42s var(--tunnel-ease);
}

.tunnel-card__eyebrow.is-collapsed {
  max-height: 0;
  opacity: 0;
  margin-bottom: 0;
  pointer-events: none;
}

.tunnel-card__question {
  margin: 0 0 22px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 600;
  /* Item 9 (per Dave): "the type needs to be larger... it's getting lost...
     needs to be front and center size-wise" - a pure font-size bump, ~18%
     larger at every step of the clamp (19->22, 25->29, and the vw slope
     nudged up to match so it scales at the same relative rate across
     viewport widths), not a position/alignment change. Shared by every
     slide type that uses this class (plain yes/no questions, the "choice"
     kind, and the summary/review slide via
     .tunnel-card[data-summary-detail="true"] .tunnel-card__question further
     below, which only overrides size at narrow breakpoints and otherwise
     inherits this base value) - verified via Playwright at several
     viewport widths that text-wrap:balance still avoids widows and no
     slide's header collides with content above/below at the larger size.
     Round 2 (per Dave, same session): "still larger for these headers
     throughout" - bumped again, ~18% on top of the above (22->26, 29->34,
     vw slope nudged 2.3->2.7 to match the same relative growth rate).
     margin-bottom also raised 16->22px so the now-taller line(s) still keep
     clear breathing room above the Yes/No buttons / tile grids that follow -
     verified via Playwright across plain yes/no (Logo Design), tile-based
     (Website Changes), Care/Payment choice slides, and the summary slide at
     1280/1440/1920px: text-wrap:balance still balances multi-line headers
     sensibly at the larger size (no widows), and no header collides with or
     crowds the buttons/tiles beneath it. */
  font-size: clamp(26px, 2.7vw, 34px);
  /* Item 7a (this round): "the leading/line-space is too loose on all of
     these headers, needs to be tightened a little." Was 1.25. Tightened to
     1.15 - NOT the same floor that bit .tunnel-top__headline h2 in an
     earlier round (that element clipped descenders at 1.15 because it also
     has overflow:hidden, cropping the line box tight to its glyphs). This
     element has no overflow:hidden anywhere in its rule chain, so a shorter
     line box here just tightens the visual leading - there's nothing for it
     to clip against. Verified via Playwright across multi-line headers
     (Logo Design, Hosting & Care, the intro info-card) that descenders
     ("g", "y") still render fully. */
  line-height: 1.15;
  /* Per Dave (this round): reverted back to plain --ink (#1c242a, dark
     gray) - the --tunnel-teal-bg-dark/#75726c beige tone this used to sit
     on (see prior comment, kept for history) was left behind by the
     Plum/Jade color-change pass and read as "old discarded dark beige"
     against the new plum palette. Scoped to just this header + the
     .tunnel-card__eyebrow label right above it (same beige family, same
     visual header group) - NOT the --tunnel-teal-bg-dark variable itself,
     which other things (button hover states, the account-embed login
     panel) still legitimately use and were not part of this ask. */
  color: var(--ink);
  /* Per Dave (round 18): multi-line headers were stretching wide enough
     that the wrap looked lopsided (a long top line over a short bottom
     line, or vice versa) - "too oblong". A fixed 30ch cap was tried first,
     but it kept producing ugly one-word/two-letter WIDOWS instead (e.g.
     "The foundation everything else below builds / on." with "on." stranded
     alone on its own line) - the ch cap forces a break point that has
     nothing to do with where the text actually balances evenly, it just
     forces an early wrap and whatever's left over (often one short word)
     spills to its own line.
     Root-cause fix (round 21, per Dave): drop the guessed ch cap entirely
     and use the browser's own line-balancing algorithm instead -
     text-wrap:balance (below) computes the minimum number of lines the
     text needs at its NATURAL container width, then re-flows the break
     points so every line in that count is as close to equal-length as
     possible, which by construction can never leave a lone short word
     dangling on its own line the way a fixed ch guess could. Tested
     against several real headline strings in the tunnel (this intro
     question, the payment-approach question, the review/confirm question,
     "Want ongoing hosting & care?", etc.) - none produce a widow anymore.
     Supported in all current Chromium/Safari/Firefox; on any older engine
     that doesn't understand text-wrap, this simply falls back to normal
     wrapping at the card's own natural width (still better than the old
     30ch cap, which is why it isn't kept as a fallback here either). */
  text-wrap: balance;
}

/* Item 7b (this round), per Dave re: the Logo Design header ("Would you
   like a custom logo designed for use with your new website?"): "this
   header can have its text block widened so it's not quite so narrow -
   but don't do extreme moves... I'd love to have the word 'logo' go up to
   the first line, and 'with' go up to the middle line, but don't do
   extreme [moves]." A MODERATE width bump for just this one card (via its
   new data-cat-id, see buildCards() in tunnel.js) - +55px over the shared
   465px --tunnel-card-w (about +12%), not a global change to every slide's
   card width. Verified via Playwright: at this width text-wrap:balance
   reflows the header to land "logo" on line 1 and "with" on line 2, as
   Dave asked, without stretching the card dramatically wider. */
.tunnel-card[data-cat-id="logo"] {
  width: 520px;
}

/* Fix, per Dave: "move all of this content down so that the note and the
   yes buttons are in the exact same positioning as the tiles that came
   before it... if they just keep clicking, their mouse would be in the
   same place on all these tiles - this one jumps it up too high."
   ROOT CAUSE: .tunnel-card is vertically CENTERED (top:40% + translateY
   (-50%) - see the base .tunnel-card rule), so a taller card's visible
   content starts higher on screen than a shorter card's, purely because
   centering splits the extra height evenly above/below the anchor point.
   This is the one card with genuinely extra height below its Yes/No row:
   the client-logo marquee (.tunnel-logo-marquee - see .tunnel-logo-marquee's
   own position:absolute rule and comment elsewhere in this file) used to be
   a normal in-flow sibling appended after .tunnel-qa, adding a fixed 68px +
   42px margin-top = 110px of extra box height that no other yesno-kind
   slide (Inside Pages, the one immediately before this) carries - that's
   what pushed this card's Yes/No row up relative to every other slide.
   FIRST FIX (reverted this round): tried compensating with a big margin-top
   on the eyebrow to push the visible content down again. Per Dave (repeat
   complaint): that overshot badly at his actual (shorter) browser window -
   adding 110px of margin ALSO adds 110px to the box .tunnel-card centers
   itself around, so at a shorter viewport the box's own max-height cap /
   this column's overflow-y:auto scroll kicked in, landing the content far
   lower than intended and requiring a scroll to see the top chip trail -
   exactly the "moved it all the way down" Dave flagged, not the gentle
   nudge asked for.
   REAL FIX (this round): don't inflate the box at all - take the marquee
   OUT of the flow entirely (position:absolute, no longer contributing to
   this card's height) so the box centering this card is built around is
   the SAME height as every other yesno slide, and the Yes/No row lands in
   the same place with zero compensation needed anywhere. See
   .tunnel-logo-marquee below for the position:absolute + top:100% swap that
   keeps it visually in the exact same on-screen spot it always occupied. */

/* Per Dave (earlier round): the Hosting & Care headline was wrapping into a
   staggered 4-line stack at common desktop widths - .tunnel-mid__content
   (the text column) is capped hard by the monitor-preview graphic sharing
   the row, shrinking to as little as ~350-400px at some viewports. This
   width bump (matches the Logo Design header treatment above) helps at the
   taller/narrower aspect ratios where the column is wider than 465px.
   NOTE: a scoped font-size reduction on .tunnel-card__question used to be
   paired with this to fight the wrap further, but per Dave (later round)
   that made this header read as a different/smaller size than every other
   header in the tunnel - removed so this headline always matches the
   shared base size; if the 4-line wrap resurfaces at narrow aspect ratios,
   revisit via width/layout, not a font-size cut. */
.tunnel-card[data-cat-id="care"] {
  width: 520px;
}

/* Fade group wrapping the yes/no question + buttons. On "Yes" this
   collapses/fades OUT in place (via .is-collapsed) while .tunnel-detail
   fades IN right below it on the SAME card - no new slide is inserted.
   Raised from 320px originally to give the "Primary Base Page Design"
   slide's (now-removed, round 24) View Proposed Website pill and the
   "Hosting & Care" slide's fine print room to breathe without ever getting
   clipped; left as-is since the "Hosting & Care" fine print still needs it. */
.tunnel-qa {
  max-height: 380px;
  opacity: 1;
  /* Per Dave (latest round): tried overflow-y:hidden + overflow-x:visible
     here to let the wide logo-marquee spill past this ~445px-wide box, but
     that doesn't work - per the CSS spec, mixing overflow-x:visible with a
     non-visible overflow-y computes the "visible" axis to 'auto' instead,
     which still clips/scrolls. Reverted to plain overflow:hidden (both
     axes, as before). The logo marquee is no longer a child of .tunnel-qa
     at all (see the 'logo' category branch in tunnel.js's buildCards()) -
     it's now a sibling appended directly to .tunnel-card, which has its own
     overflow:visible, so it never needs to escape this element's box. */
  overflow: hidden;
  transition: max-height .42s var(--tunnel-ease), opacity .3s ease, margin-bottom .42s var(--tunnel-ease);
}

.tunnel-qa.is-collapsed {
  max-height: 0;
  opacity: 0;
  margin-bottom: 0;
  pointer-events: none;
  transition: max-height .42s var(--tunnel-ease), opacity .22s ease;
}

/* Big elegant yes/no pill control. Per Dave (round 14): these were still
   stretching edge-to-edge to fill the row (flex:1 on each button) even
   after a prior round shrank their padding/font - "as wide as they were
   before". Switched to a non-stretching row so each button sizes to its
   own content/min-width instead of splitting the full row width. */
.tunnel-yesno {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
  /* Per Dave (round 28) - belt-and-suspenders alongside the matching
     .tunnel-yesno__col wrapper now used on BOTH buttons on the Care slide
     (see tunnel.js): explicit flex-start instead of the default `stretch`
     cross-axis alignment, so a bare Yes/No button (non-Care slides) can
     never get stretched taller by a taller sibling either. */
  align-items: flex-start;
  gap: 14px;
  margin-bottom: 4px;
}

.tunnel-yesno__btn {
  flex: 0 0 auto;
  width: fit-content;
  min-width: 132px;
  appearance: none;
  border: 1.5px solid rgba(28,36,42,.18);
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .02em;
  padding: 10px 22px;
  border-radius: 999px;
  cursor: pointer;
  transition: all .22s ease;
  text-align: center;
}

/* Per Dave (round 25): wraps just the "No" button on the Hosting & Care
   slide so its "(handoff html files)" fine print centers under that single
   button instead of spanning the full Yes/No row. Column sizes to the
   button's own width (align-items center handles centering the narrower
   text beneath it) and sits inline with the "Yes" button in the row via the
   parent .tunnel-yesno's flex/gap - no layout change for any other yesno
   slide, which still renders a bare button here. */
.tunnel-yesno__col {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
}

.tunnel-yesno__finetext {
  font-size: 11px;
  font-style: normal;
  color: var(--muted);
  text-align: center;
  white-space: nowrap;
}

.tunnel-yesno__btn:hover {
  border-color: var(--gold);
  background: rgba(94,115,135,.08);
}

.tunnel-yesno__btn.is-selected {
  background: var(--gold);
  border-color: var(--gold);
  color: #fff;
  /* Per Dave: "no shadows anywhere" on these yes/no buttons - this was a
     regression back in, removed for good this round. */
  box-shadow: none;
}

/* Per Dave (round 24): the "View Proposed Website" pill that used to live
   here (below the Yes/No buttons on the "Website Changes" slide) was
   removed as redundant now that the persistent "View Your New Site" pill
   on the monitor graphic covers the same function everywhere in the
   tunnel - see tunnel.js buildDetail for the "changes" category. Rules
   removed along with it (.tunnel-view-proposed-wrap / -pill).
*/

/* Per Dave: short, professional fine print below the Yes/No buttons on the
   "Hosting & Care" slide, reworded from his rough dictation into one
   polished sentence - ongoing help keeping the site current, routine
   maintenance, and staying current with underlying technology/platform
   changes. Styled consistently with the tunnel's other small-print copy
   (.tunnel-info-card__note). */
/* ROOT CAUSE FIX (this round), per Dave's repeat complaint that this
   slide's Yes/No row sits noticeably higher than every other yesno slide's:
   tunnel.js's own comment above (careFinetextEl) already documented the
   INTENDED fix as "position:absolute; top:100%" (same root-cause pattern as
   .tunnel-logo-marquee - an element appended as a sibling of .tunnel-qa
   specifically so it doesn't count toward .tunnel-card's own height, which
   drives the card's translateY(-50%) vertical centering) - but this rule
   itself was only ever given a plain `margin-top`, still fully in-flow, so
   it silently kept contributing its real height to the card after all,
   reproducing the exact bug the sibling-element restructuring was supposed
   to prevent. Actually taking it out of flow now, matching
   .tunnel-logo-marquee's own positioning exactly. */
.tunnel-care-finetext {
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  margin: 14px 0 0;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--muted);
  max-width: 48ch;
  transition: opacity .25s ease;
}
/* Bug fix, per Dave (screenshot: this paragraph staying on screen and
   overlapping the Website Access + Domain Information form once a care
   plan tile is picked): tunnel.js has always toggled an `is-collapsed`
   class on this element (see careFinetextEl in tunnel.js) the moment Yes
   is answered, but no CSS rule for `.tunnel-care-finetext.is-collapsed`
   ever existed - the class was landing on the element and doing
   genuinely nothing, so it just sat in its normal position:absolute spot
   forever, permanently overlapping whatever real content rendered below
   it. This is a real functional bug (broken already-intended behavior),
   not a style choice, so fixed for both desktop and mobile - same
   opacity/visibility/pointer-events pattern already used for other
   collapsed elements in this file (see .tunnel-logo-marquee.is-collapsed
   above). */
.tunnel-care-finetext.is-collapsed {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

/* Detail options that fade in below yes/no when "Yes" is picked */
/* Fix (this round), item 6, per Dave (app-wide, every category): "when I
   click on a Yes button and all the information flows in... it flows too
   quickly, it needs to gradually gracefully glide up, not snap in." Root
   cause: this reveal only ever animated max-height (a layout property, not
   a compositor-friendly one, and one that reads as content "growing
   downward from nothing" rather than a deliberate upward glide) plus a
   plain opacity fade - there was never a `transform` in the mix at all, so
   no matter how the max-height/opacity durations were tuned, the motion
   could never read as a panel gliding UP into place, only as a box
   stretching open. Added a genuine translateY glide (starts 22px lower,
   settles to 0) alongside the existing opacity fade, on a slightly longer
   duration (.6s, ease-out) so the two together read as the content rising
   smoothly into place - the classic "fade + rise" reveal idiom - instead
   of a snap. max-height's own transition is left in place (still needed so
   the box's LAYOUT space opens up without a hard jump-cut, avoiding a
   different kind of snap), just no longer the only thing carrying the
   perceived motion. */
.tunnel-detail {
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transform: translateY(22px);
  transition: max-height .55s var(--tunnel-ease), opacity .6s ease-out, margin-top .55s var(--tunnel-ease), transform .6s ease-out;
  margin-top: 0;
}

.tunnel-detail.is-visible {
  max-height: 360px;
  opacity: 1;
  /* Fix (this round), per Dave (Logo Design slide, eyebrow -> "Custom logo
     design" heading): "make padding between eyebrow and header about half
     this, need more real estate." This 18px margin-top (plus the eyebrow's
     own 10px margin-bottom) is the actual gap between the eyebrow and
     whatever detail heading appears right below it once a Yes/No answer
     reveals its detail panel - halved to 9px. Shared by every yes/no
     card's detail reveal (not logo-specific), consistent with today's
     other space-tightening asks. */
  margin-top: 9px;
  transform: translateY(0);
}

/* The info slide's detail panel has no yes/no gate to toggle it - it must
   stay visible even after resetTunnelState() strips ".is-visible" from
   every ".tunnel-detail" on each fresh open (that reset is written
   generically for the yes/no cards' fade-in sub-options). Scoping to the
   info card's own wrapper keeps that shared reset logic untouched. Per
   Dave (v6): the laptop mockup that used to sit in this same detail panel
   (two-column flex layout) is now a PERSISTENT fixture in .tunnel-mid's own
   left column (see .tunnel-mid__preview above) rather than living inside
   this card - so this panel is back to a plain single-column block, same
   treatment as the terminal summary slide's counterpart below. */
.tunnel-card[data-info-detail="true"] .tunnel-detail {
  max-height: none;
  opacity: 1;
  overflow: visible;
  /* Fix (this round), per Dave (repeat complaint): "the padding between the
     header and the content below it... still twice as much as I want."
     Measured via Playwright: the real gap between the header's bottom edge
     and this row's top edge was 44px (question's own 22px margin-bottom +
     this element's old 16px margin-top). Cut roughly in half (44px -> 22px)
     by trimming 10px off this margin (see the matching -12px trim on
     .tunnel-card__question's margin-bottom just below) - together that's
     the full 22px reduction. Per Dave's explicit instruction, this is NOT
     done by pulling this content up - see .tunnel-card__eyebrow's new
     margin-top just below, which pushes the header/eyebrow down by the same
     22px this saves, so this row's own screen position is unchanged; only
     the header moves, closing the gap from above. */
  margin-top: 0px;
}

/* Per the .tunnel-detail comment above: -12px off this header's own
   margin-bottom (22px -> 10px), paired with the eyebrow's new +22px
   margin-top below, is the other half of the 22px total gap reduction. */
.tunnel-card[data-info-detail="true"] .tunnel-card__question {
  margin-bottom: 0px;
}

/* Fix (this round), per Dave, desktop only: "20px more padding between
   header and dollar amount." Since the "Website Design" name/checkmark row
   was hidden entirely this round (see .tunnel-info-card__name's display:
   none fix elsewhere in this file - a base/unscoped change, so it applies
   on both mobile and desktop), the header-to-price gap on THIS info slide
   collapsed down to near-zero (this rule's own 0px margin-bottom, set in
   an earlier round when "Website Design" still sat directly below the
   header and needed zero extra gap) - now that the row right after the
   header is the $57/mo price line instead, that same 0px reads as too
   tight. Scoped to desktop only (min-width:768px, the inverse of this
   file's standard 767px mobile breakpoint) since Dave only flagged this on
   desktop - mobile's own spacing/decluttering is untouched. */
@media (min-width: 768px) {
  .tunnel-card[data-info-detail="true"] .tunnel-card__question {
    margin-bottom: 20px;
  }
}

/* Per Dave: "do it by moving the header and eyebrow down, which is
   positioned too high" - NOT by pulling the "Website Design / Transition
   Questions?" row up. This card is vertically centered (base .tunnel-card's
   top:40% + translateY(-50%)), so adding this margin-top pushes the eyebrow
   (and everything after it - question, Yes/No-less detail row - since
   they're all normal document flow) down within the card by 22px, while the
   matching -12px/-10px trims above keep the card's TOTAL height unchanged -
   so the detail row below stays anchored at the same screen position. Net
   effect verified via Playwright: header/eyebrow visibly shift down,
   header-to-content gap is now ~22px (was ~44px), and the detail row's own
   on-screen Y position is unchanged (within 1px). */
.tunnel-card[data-info-detail="true"] .tunnel-card__eyebrow {
  margin-top: 32px;
}

/* ---- Persistent desktop-monitor mockup (left column of .tunnel-mid) ----
   Per Dave (v7): swapped the laptop mockup for a real desktop-monitor asset
   he supplied (desktop-computer.jpg/.png, ~587x435 native, an iMac-style
   monitor on a stand). Same lightweight opaque-JPEG-behind / iframe-in-
   front pattern as the laptop version it replaces.
   ROUND 21, per Dave: after five rounds of chasing a recurring white-line
   artifact along the screen-cutout edge (see the long history below, kept
   for context), Dave supplied a brand-new asset - desktop-monitor-v2.jpg
   (copied verbatim from his desktop-computer-nowhite.jpg, same 587x435
   canvas) - where the ENTIRE monitor face (bezel AND screen together, not
   just the screen cutout) is painted solid black, with no separate lighter
   bezel color to distinguish from. His reasoning: any leftover sub-pixel
   gap between the iframe's edge and the screen box's clip edge now exposes
   more solid black bezel underneath instead of a lighter bezel color or
   raw white iframe background - so it blends away instead of reading as a
   jarring hairline, even if the coordinates are never pixel-perfect.
   Measured fresh via PIL color-diffing (this is a DIFFERENT source photo
   than the old desktop-monitor.jpg, not just a recolor - dimensions
   happened to match at 587x435 but the black shape's own edges do not
   line up with the old screen-cutout box, so the old 28/26/534/312 numbers
   were NOT reused): the solid-black monitor-face rectangle's innermost
   safe bounds (i.e. the tightest edge found scanning every row/column,
   which accounts for the shape's slightly rounded corners) are left>=16,
   right<=573, top>=11, bottom<=352 in native 587x435 px - confirmed pure
   (0,0,0) at every one of those boundary coordinates.
   Since the whole face is one uniform black (no inner screen-vs-bezel
   distinction to hit exactly), and Dave explicitly asked for a MORE
   generous margin this round ("err on the side of slightly over-cropping
   rather than under-cropping ... a black gap is far less visible than
   white was"), the screen box below is inset well past those measured
   bounds - 12-19px of pure-black margin on every side - rather than
   hugging the tightest safe edge the way the old white-bezel version had
   to. Verified via automated Playwright pixel-sampling (zero light/white
   pixels along any of the 4 edges) at 1440x900, 1440x800, 1440x700,
   1280x800 and 1680x1000 - see tunnel-fix-round21/ output.
   ---- Prior history (v3-v20, kept for context, superseded by the above) ----
   desktop-monitor.jpg (copied from his desktop-computer.jpg) was a flat,
   fully opaque JPEG with the screen area painted plain white, so no
   transparent-PNG mask/alpha channel was needed. The companion
   desktop-computer.png (transparent-cutout mask version) was only used to
   MEASURE the screen-cutout coordinates via a flood-fill of its alpha
   channel. Measured screen-cutout bounding box on that 587x435 native
   canvas: left 30px, top 28px, width 530px, height 308px, later tightened
   to left 28 / top 26 / 534 wide / 312 tall after repeated white-hairline
   reports traced to the box landing 1-2px short of the JPEG's actual
   border-to-screen transition. No native-canvas cropping/offset trick was
   ever needed (unlike the old device-frame-laptop.jpg, which packed a
   laptop+phone on one shared canvas) - .tunnel-intro__stage is sized to
   the exact 587x435 native canvas with a plain scale() transform, no
   translate offset. Built ONCE in tunnel.js's buildRoot() as a persistent
   sibling of the card track (inside .tunnel-mid__preview), not re-created
   per slide, so the iframe never reloads/re-renders as the user moves
   through the tunnel. */
.tunnel-intro__visual {
  /* Per Dave (v8): the monitor now scales to nearly fill the full height of
     the white .tunnel-mid band, leaving ~15px clearance above/below - see
     sizeMonitorPreview() in tunnel.js, which measures the live
     .tunnel-mid__preview column height on open + resize and writes the
     matching --intro-scale value here as an inline style (overriding this
     0.87 fallback, which only applies before JS runs / if JS fails). */
  --intro-scale: 0.87;
  position: relative;
  flex: 0 0 auto;
  width: calc(587px * var(--intro-scale));
  height: calc(435px * var(--intro-scale));
  overflow: hidden;
}

/* Touch-scroll fix (round: WebKit transform+touch bug): the monitor's
   live iframe sits under TWO stacked CSS transform scale() layers (this
   .tunnel-intro__stage's own scale(--intro-scale), AND the iframe's own
   inner scale(.38281) - see .tunnel-intro__screen iframe below). iOS
   Safari/WebKit has a long-documented bug where native touch-to-scroll
   coordinate math breaks down on any element sitting under a CSS
   transform: scale() ancestor - confirmed via direct A/B test: the exact
   same live iframe scrolls perfectly fine with no transform ancestor
   (font-preview iframes, the real above-the-fold page), and crashes/
   glitches every time specifically inside this doubly-transformed monitor.
   Fix: this untransformed sibling div (a DIRECT child of .tunnel-intro__visual,
   NOT nested inside .tunnel-intro__stage's transform) sits visually on top
   of the screen cutout and captures the real, untransformed touch
   coordinates - which WebKit computes correctly since nothing here is
   transformed - then tunnel.js manually drives the iframe's own
   contentWindow scroll position from that real touch delta. The iframe
   itself is pointer-events:none (see .tunnel-intro__screen iframe) so it
   never receives a raw native touch event at all - scrolling only ever
   happens programmatically, so the buggy native-touch-on-transformed-
   element path is never exercised. Sized as a % of .tunnel-intro__visual
   (which is NOT itself transformed, just width/height calc()'d off the
   same --intro-scale) so it tracks the screen cutout's real on-screen box
   at any --intro-scale with pure CSS, no JS resize math needed. */
.tunnel-intro__touchcatch {
  position: absolute;
  left: calc(35 / 587 * 100%);
  top: calc(28 / 435 * 100%);
  width: calc(525 / 587 * 100%);
  height: calc(312 / 435 * 100%);
  z-index: 6;
  background: transparent;
  touch-action: none;
}

.tunnel-intro__stage {
  position: absolute;
  left: 0;
  top: 0;
  width: 587px;
  height: 435px;
  /* Per Dave (this round): a thin black line persisted along the monitor's
     bottom, or right+bottom, edges even on an already-settled/deployed
     page (not just mid-resize - see .tunnel-intro__mask's own comment
     above for that separate, already-fixed timing issue). Root cause here
     is different: .tunnel-intro__visual's clipping box is sized by a
     layout calc() (`587px * var(--intro-scale)`, computed by the browser's
     layout engine), while this element's own size comes from an
     independent CSS transform: scale() (computed by the compositor). Both
     use the exact same --intro-scale value, but layout-rounding and
     transform-rounding don't always land on the same fractional pixel -
     at certain scale factors the transformed content is a hair SMALLER
     than its clipping box, exposing a sliver of whatever sits behind it
     (this stage's own dark bezel/screen content bleeding into a gap reads
     as the black line reported). Fix: scale a fraction of a percent
     (1.006x) larger than --intro-scale actually calls for, so the
     rendered content is always guaranteed to fully cover its clipping
     box regardless of which way the rounding goes - the extra sliver
     (well under a pixel at this element's size) is silently clipped by
     .tunnel-intro__visual's overflow:hidden instead of ever leaving a
     gap. transform-origin stays top left so the tiny overscan grows
     toward the right/bottom edges - exactly where the line was reported,
     and consistent with every other edge-safety margin already used in
     this file (the iframe's 5% overscan, the mask's border) rather than
     chasing pixel-perfect alignment. */
  transform: scale(calc(var(--intro-scale) * 1.006));
  transform-origin: top left;
  background: transparent;
}

/* Screen box coordinates, in the same native 587x435 stage-pixel space as
   .tunnel-intro__frame (assets/img/desktop-monitor-v2.jpg).
   ROUND 21 (do not regress to the old 28/26/534/312 box - that was measured
   against a DIFFERENT source photo, desktop-monitor.jpg, whose bezel/screen
   edges do not line up with this new asset): re-measured fresh against
   desktop-monitor-v2.jpg via PIL color-diffing. Unlike the old asset (a
   light bezel around a white screen cutout, where the exact bezel/screen
   boundary had to be hit precisely or a hairline of the wrong color leaked
   through), this new asset paints the ENTIRE monitor face - bezel and
   screen together - one uniform solid black, so there's no internal
   boundary to hit at all; only the OUTER edge (black monitor shape vs. the
   white page background around it) matters, and any imprecision on this
   box just crops a little more/less of the harmless black bezel, never
   white background.
   Measured innermost safe bounds of that solid-black shape (tightest edge
   found scanning every row 15-345 / column 20-569, i.e. safely clear of
   the shape's slightly rounded corners): left>=16, right<=573, top>=11,
   bottom<=352 - confirmed pure (0,0,0) at each boundary.
   Per Dave's explicit round-21 ask ("apply a MORE generous overscan margin
   than before ... err on the side of slightly over-cropping"), this box is
   inset well past those measured bounds rather than hugging them the way
   the old white-bezel box had to: left 35 / top 28 / 525 wide / 312 tall
   (covers native x 35-560, y 28-340) - 12-19px of solid-black margin on
   every side. Verified via automated Playwright pixel-sampling (zero
   light/white pixels found along any of the 4 edges) at 1440x900,
   1440x800, 1440x700, 1280x800 and 1680x1000 - see tunnel-fix-round21/. */
.tunnel-intro__screen {
  position: absolute;
  left: 35px;
  top: 28px;
  width: 525px;
  height: 312px;
  overflow: hidden;
  /* FIX (2026-07-29), per Dave: this monitor screen (the "your new
     website" mockup inside the paid tunnel) showed pure white for 1-3
     seconds before the live-preview iframe's delayed (600ms in tunnel.js)
     src assignment finished loading/painting - a jarring blank-white flash
     every time the tunnel opens. Screen box + iframe (see
     .tunnel-intro__screen iframe below) both default to black instead,
     matching the monitor bezel's own solid black face (desktop-monitor-v2.jpg)
     so the "empty" state reads as an off monitor, not a broken white one.
     Once the iframe's real content finishes loading it paints over this
     background exactly as before - no JS/timing logic changed, this is a
     pure background-color swap on the two elements behind the iframe. */
  background: #000;
  z-index: 3;
  /* Second layer of the overscroll-chaining fix (see #webyayTunnel above) -
     contained directly on the box that actually holds the scrollable iframe,
     so the fix applies right at the source, not just the outer overlay. */
  overscroll-behavior: contain;
}

/* Monitor screen (530x308, ~1.72:1) is a wider/shorter ratio than the live
   site's 1440x900 (1.6:1) iframe viewport, so a uniform scale that fills
   the screen's width exactly (530/1440 = .36806) overflows slightly on
   height (~331px of scaled content into a 308px-tall box) rather than
   leaving any gap on the sides - the parent's overflow:hidden trims that
   small excess off the bottom, same crop-not-gap idiom the laptop version
   used, just tuned to this screen's own aspect ratio instead of reusing
   the laptop's .89 figure.
   Per Dave (scroll request): `pointer-events: none` used to sit here,
   which blocked ALL mouse interaction with the iframe - including wheel/
   trackpad scroll, not just clicks. That was the actual reason hovering
   the monitor and scrolling did nothing. Switched to `pointer-events: auto`
   so wheel events reach the embedded page and it scrolls natively; the
   `scrolling="no"` attribute that used to sit on the <iframe> in tunnel.js
   (buildRoot()) was also removed for the same reason - some browsers honor
   that legacy attribute as an actual scroll-disable, not just a scrollbar-
   hide. The parent .tunnel-intro__screen keeps its own overflow:hidden +
   fixed 530x308 box, so scrolling only ever reveals different content
   *within* that same confined screen-cutout shape - nothing can visually
   spill past the monitor bezel, since the crop is enforced by the parent,
   not by blocking pointer events on the iframe. */
/* Per Dave: faint white hairline slivers were visible at the very left/right
   edges of the embedded site inside the screen cutout - a sub-pixel
   rounding gap between the iframe's scaled-content edge and the screen
   box's clipped edge (the exact .36806 scale, 530/1440, can land on a
   fractional device pixel that the browser doesn't fully paint, exposing
   the iframe's own white document background for a hairline at the seam).
   Fixed by deliberately overscanning the iframe ~2.5% wider than the screen
   box and re-centering it, so both edges bleed a few px past the screen
   cutout on purpose - .tunnel-intro__screen's overflow:hidden crops that
   intentional overscan, guaranteeing full edge-to-edge coverage regardless
   of any subpixel rounding, instead of relying on an exact-fit scale that
   can leave a gap.
   IMPORTANT (round "fix white edge lines v2" - do not regress): an earlier
   version of this fix used a hardcoded translateX(-3px) alongside a fixed
   scale(.37222). That worked ONLY because --intro-scale was a static 0.87
   at the time. sizeMonitorPreview() in tunnel.js later made --intro-scale
   DYNAMIC (recomputed from the live .tunnel-mid height on open/resize), and
   since .tunnel-intro__screen (and this iframe) live INSIDE
   .tunnel-intro__stage - the element --intro-scale's scale() transform is
   applied to - a fixed -3px absolute offset does NOT stay proportionally
   correct as --intro-scale changes: the overscan margin needs to move by
   -3px * (--intro-scale / 0.87), not by a constant -3px, so the old hack
   silently drifted out of sync and the white line came back at other
   window sizes.
   Fix: use PERCENTAGE-relative centering instead of an absolute px
   translate, so the overscan stays mathematically correct at ANY
   --intro-scale with no JS involvement needed:
     left: 50%              -> anchor point is the screen box's own
                                horizontal center (a %, so it already tracks
                                the box's scaled size automatically)
     transform-origin: 0 0  -> plain top-left pivot, no extra origin offset
                                math to account for
     transform: scale(F) translate(-50%, 0)
                             -> CSS applies the rightmost function first:
                                translate(-50%, 0) shifts the iframe left by
                                50% of ITS OWN 1440px layout width (-720px,
                                a fixed ratio of the iframe's own untransformed
                                box, never of the viewport) in local space,
                                THEN scale(F) is applied on top of that
                                already-translated point - which means the
                                -720px shift gets multiplied by F too, same
                                as every other pixel in the iframe. Because
                                this whole iframe subtree also sits inside
                                .tunnel-intro__stage's own scale(--intro-scale)
                                transform, that ancestor scale multiplies in
                                as a second, outer factor on top of F - so
                                the centering offset scales correctly through
                                BOTH the local F and the dynamic --intro-scale
                                simultaneously, by construction, with no
                                separate translateX px value to keep in sync.
   F = (525 / 1440) * 1.05 = 0.38281: the exact width-fill ratio for the
   ROUND-21 525px-wide screen box (see .tunnel-intro__screen comment above
   for the fresh measurement against desktop-monitor-v2.jpg) times a flat
   5% overscan multiplier - bumped up from the prior round's 3.5% since the
   new solid-black monitor face (see .tunnel-intro__screen comment) makes a
   generous overscan margin essentially free: any extra crop just exposes
   more black bezel, never a visible gap, so there's no longer a reason to
   tune this tightly. Because F is a single ratio (not a mix of an absolute
   translate + a separate scale, like the old -3px hack this superseded),
   the whole overscan/centering system still scales as one unit at any
   --intro-scale - this is what makes it durable against future
   sizeMonitorPreview() tuning. Height already intentionally overflows/
   crops at the bottom per the comment above, unaffected by this - top:0
   keeps that same top-aligned, crop-at-bottom behavior. */
.tunnel-intro__screen iframe {
  display: block;
  position: absolute;
  left: 50%;
  top: 0;
  border: 0;
  width: 1440px;
  height: 900px;
  transform: scale(.38281) translate(-50%, 0);
  transform-origin: 0 0;
  pointer-events: auto;
  /* Black, not white - see .tunnel-intro__screen fix comment above; this
     is the color visible in the iframe's own paint area before its content
     (live-preview/index.html) finishes loading. */
  background: #000;
}

.tunnel-intro__frame {
  position: absolute;
  inset: 0;
  width: 587px;
  height: 435px;
  z-index: 1;
  pointer-events: none;
  user-select: none;
}

/* ROUND 24 - permanent black masking frame, per Dave's explicit diagnostic
   ask ("can't you put like a black line over that"). History: seven+ rounds
   chased a recurring white-line artifact along the screen-cutout edge by
   re-measuring the .tunnel-intro__screen box, retuning the iframe overscan,
   and finally swapping to an all-black-screen bezel JPEG
   (desktop-monitor-v2.jpg, confirmed byte-identical to Dave's supplied
   desktop-computer-nowhite.jpg) - yet the line kept resurfacing at a
   DIFFERENT edge each round. Root cause of that pattern: the left/right
   edges have a deliberate 5% iframe overscan (see the F = .38281 comment
   above) and the bottom edge overflows naturally (900px-tall iframe content
   scaled into a 312px box), so those three edges have always had a built-in
   safety margin - but the TOP edge never did. .tunnel-intro__screen iframe
   sits at top:0 with zero overscan, so the top boundary has always relied
   on the iframe's top edge landing EXACTLY flush with the screen box's top
   edge - a single sub-pixel rounding error, or the live site's own white
   document background painting for one frame before its header component's
   background covers it, is enough to expose a hairline there with no margin
   to absorb it. That's why round after round of re-measuring the bezel
   image never fully closed it out: the bezel was already correct (confirmed
   pure black at its measured bounds), the exposure was the UNPROTECTED
   iframe/screen-box seam itself, on whichever edge happened to have the
   least accidental slack that round.
   Fix: stop chasing pixel-perfect alignment entirely. This is a dedicated
   top-layer div, a sibling of .tunnel-intro__screen and .tunnel-intro__frame
   inside .tunnel-intro__stage (so it inherits the same --intro-scale
   transform as everything else and stays proportionally correct at any
   size), positioned a few px OUTSIDE the .tunnel-intro__screen box on every
   side and sized so its box-sizing:border-box border straddles the exact
   screen-cutout boundary line: the outer half of the border overlaps the
   black bezel image (z-index 1), the inner half overlaps the iframe's own
   content (which sits at z-index 3 / .tunnel-intro__screen), and this mask
   sits above both at z-index 5. Because the border is solid black and
   physically covers the seam, it doesn't matter anymore whether the
   underlying box-to-iframe alignment is off by 1px, 2px, or reflows
   differently at a viewport width nobody tested - there is no exposed seam
   left for a stray pixel to leak through, on any of the 4 edges, at any
   size. background:transparent + pointer-events:none keeps the open center
   fully click/scroll-through so the iframe underneath stays interactive
   (re-verified: wheel-scroll on the embedded site still works after adding
   this, see tunnel-fix-edge-lines-v3/ Playwright output). Color is pure
   #000 to match the bezel JPEG's own measured (0,0,0) black exactly, so the
   border is visually invisible against the bezel and reads only as "more
   black bezel," never as its own separate frame. */
/* Per Dave (this round): a thin black-ish outline was showing up along the
   bottom, or right+bottom, edges of the monitor specifically WHILE actively
   dragging the browser window wider/narrower (not once it settles). Root
   cause: sizeMonitorPreview()'s resize listener (tunnel.js) recomputes
   --intro-scale on every native resize tick, but the browser has already
   repainted the container at the NEW width by the time that recalculation
   lands - during a continuous drag this mask is effectively always one
   frame behind the real box size, briefly exposing a sliver at the
   trailing (right/bottom) edges each tick. This mask already exists
   specifically to paper over exactly this class of seam (see ROUND 24
   comment above) - rather than touching the resize/scale timing itself
   (real risk of regressing the 7+ rounds of history above), just giving it
   more overlap margin so a bigger one-frame gap during active dragging
   still lands safely inside the mask's black border instead of past its
   edge. Settled/idle sizing is unaffected either way, since the mask was
   already generous enough to look seamless there. */
.tunnel-intro__mask {
  position: absolute;
  left: calc(35px - 9px);
  top: calc(28px - 9px);
  width: calc(525px + 18px);
  height: calc(312px + 18px);
  box-sizing: border-box;
  border: 14px solid #000;
  background: transparent;
  z-index: 5;
  pointer-events: none;
}

/* Same treatment for the terminal review/summary slide - always visible,
   no yes/no gate. */
.tunnel-card[data-summary-detail="true"] .tunnel-detail {
  max-height: none;
  opacity: 1;
  overflow: visible;
  /* Per Dave (this round), desktop: "half as much padding/vertical space
     between the header and the list of products below it" - paired with
     .tunnel-card__question's own margin-bottom above (10px -> 5px). */
  /* Per Dave (this round): "way too much... should be a third of that much."
     Paired with .tunnel-card__question's own margin-bottom above
     (5px -> 2px) - 13px combined -> 4px, a genuine third. */
  margin-top: 2px;
}

.tunnel-detail__label {
  font-size: 13px;
  letter-spacing: .03em;
  color: var(--muted);
  margin: 0 0 12px;
}

/* Per Dave (round 14): the Additional Pages slide's "How many additional
   pages?" line was rendering as a small plain .tunnel-detail__label - every
   other slide's main question uses the big/bold .tunnel-card__question
   treatment, so this reuses that same class (see buildDetail() for the
   'pages' category in tunnel.js) with a tighter bottom margin since it's
   immediately followed by the smaller muted "$190 each..." pricing line
   instead of a control. */
.tunnel-detail__question {
  margin-bottom: 6px;
}

/* Heading-style treatment for a detail panel's lead line (e.g. "Custom logo
   design — $149" on the Logo Design slide) - bolder/larger than the plain
   .tunnel-detail__label eyebrow text, consistent with the other detail
   headers in the tunnel (.tunnel-card__question / .tunnel-info-card__name),
   plus the same shared checkmark badge used on the intro slide's "Website
   Design" heading and the timeline trail chips. */
.tunnel-detail__heading {
  display: flex;
  align-items: center;
  gap: 9px;
  margin: 0 0 8px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 700;
  font-size: 17px;
  color: var(--ink);
  /* Round 21: same widow fix as .tunnel-card__question, applied to the
     inner <span> text node (text-wrap only balances the element it's set
     on, and this heading is a flex row with an icon sibling, not a plain
     text block) - see .tunnel-detail__heading span rule below. */
}

.tunnel-detail__heading > span:first-child {
  text-wrap: balance;
}

/* Per Dave (round 23): the Logo Design slide gets two new fields below its
   existing "Custom logo design - $149" copy - a fill-in-the-blank textarea
   for what the client envisions, and an upload field for logo inspiration
   (reusing the same .file-field drag-and-drop pattern used elsewhere in the
   site - see bindFileFieldDragDrop() in tunnel.js). Neither the textarea
   nor the .file-field markup have any usable box/layout styling outside
   .start-modal (all of that is scoped there in styles.css), so both get
   their own block-level, no-box treatment here - flat and consistent with
   the tunnel's established "no boxes/shadows" visual language, just like
   every other detail-panel element on this card. */
.tunnel-logo-notes {
  display: grid;
  gap: 6px;
  margin-top: 14px;
}

.tunnel-logo-notes__label {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Per Dave: field sub-header labels reduced 700 -> 600 site-wide, see
     .tunnel-3row__label above. */
  font-weight: 600;
  font-size: 13px;
  color: var(--ink);
}

/* Fix (this round), per Dave: "don't have this showing straight-out, have
   it an info button item right next to that what are you thinking....
   header." The former always-visible .tunnel-logo-notes__hint sentence
   (JS markup above) was removed and its exact same copy moved into a
   .tunnel-info-btn[data-tooltip] appended right after this label's text -
   same established pattern as the Logo Design fine-print/upload-hint info
   buttons elsewhere on this slide, so it's picked up automatically by the
   shared bindHoverTooltips() (mouseenter + click + focus all already show
   it - "all info buttons open on hover on desktop" was already true for
   every existing .tunnel-info-btn, this one included, with no JS changes
   needed) on both mobile and desktop. This label is a flex row (below) so
   the button sits inline right after the question text. */
.tunnel-logo-notes__label {
  display: flex;
  align-items: center;
}

.tunnel-logo-notes__input {
  display: block;
  width: 100%;
  box-sizing: border-box;
  resize: vertical;
  /* Fix (this round), per Dave: "make this field box about half as tall...
     need more vert real estate" (meaning: for the rest of the card's
     content below it, not the textarea itself - shrinking this frees up
     room). Was 64px/rows="3" (rows attribute trimmed to 2 in tunnel.js
     alongside this); halved to 32px so the initial box is roughly half its
     old height. resize:vertical is untouched, so the client can still drag
     it taller if they want more room to type. */
  min-height: 32px;
  margin-top: 2px;
  padding: 10px 12px;
  border: 1px solid rgba(28,36,42,.16);
  border-radius: 10px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
  line-height: 1.5;
}

.tunnel-logo-notes__input:focus {
  outline: none;
  border-color: var(--gold);
}

.tunnel-logo-notes__input::placeholder {
  color: rgba(28,36,42,.35);
}

.tunnel-logo-upload {
  display: grid;
  gap: 6px;
  margin-top: 14px;
}

.tunnel-logo-upload > span:first-child {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Per Dave: field sub-header labels reduced 700 -> 600 site-wide, see
     .tunnel-3row__label above. */
  font-weight: 600;
  font-size: 13px;
  color: var(--ink);
}

.tunnel-logo-upload .file-field__control {
  height: 44px;
}

.tunnel-logo-upload .file-field__input {
  display: block;
  width: 100%;
  height: 44px;
  box-sizing: border-box;
  padding: 9px 12px;
  border: 1px dashed rgba(28,36,42,.24);
  border-radius: 10px;
  background: transparent;
  color: transparent; /* native "No file chosen" text hidden - see .file-field__status */
  font-size: 12px;
}

.tunnel-logo-upload.is-dragover .file-field__input {
  border-color: var(--gold);
  background: rgba(94,115,135,.08);
}

.tunnel-logo-upload em {
  font-size: 12px;
  color: var(--muted);
  font-style: normal;
  line-height: 1.4;
  max-width: 52ch;
}

/* Per Dave (item B, superseded round 36+): this used to add extra bottom
   padding to the whole Logo Design card so its "Upload logos..." text
   would clear the old in-card marquee that sat absolutely-positioned at
   the bottom of .tunnel-mid__content. Now that the marquee has been moved
   out of the white card entirely into the real .tunnel-bottom gray band
   (see .tunnel-logo-marquee / .tunnel-bottom.has-marquee above), there's
   nothing left in this card's own content for it to overlap, so the extra
   padding is removed - it was only ever compensating for the marquee's old
   location, not a real spacing need of this card's own content. */

/* Per Dave (item C): raw/unstyled native "Choose Files" buttons were
   showing up on every .file-field upload widget inside the tunnel (the
   Logo Design slide's inspiration uploader, and the new Overall Changes
   tile's Images/Video + Your Logo uploaders) - the master template's own
   pill-button treatment for these (styles.css) is scoped to `.start-modal
   .file-field input[type="file"]`, which none of the tunnel's dynamically-
   injected .file-field markup lives inside, so none of it applied. This
   mirrors that exact same pill treatment, scoped to #webyayTunnel instead,
   so every .file-field in the tunnel gets the same elegant styled button -
   no raw OS-default file input chrome anywhere in here. */
#webyayTunnel .file-field input[type="file"] {
  color: transparent;
}
#webyayTunnel .file-field input[type="file"]::file-selector-button,
#webyayTunnel .file-field input[type="file"]::-webkit-file-upload-button {
  appearance: none;
  border: 1px solid var(--tunnel-teal-bg);
  border-radius: 999px;
  background: var(--tunnel-teal-bg);
  color: #ffffff;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 11px;
  font-weight: 650;
  letter-spacing: .01em;
  line-height: 1;
  padding: 8px 14px;
  margin: 0 10px 0 0;
  cursor: pointer;
  transition: filter .18s ease;
}
#webyayTunnel .file-field input[type="file"]:hover::file-selector-button,
#webyayTunnel .file-field input[type="file"]:hover::-webkit-file-upload-button,
#webyayTunnel .file-field input[type="file"]:focus::file-selector-button,
#webyayTunnel .file-field input[type="file"]:focus::-webkit-file-upload-button {
  filter: brightness(.9);
}
#webyayTunnel .file-field__control {
  position: relative;
  display: block;
  height: 44px;
}
#webyayTunnel .file-field .file-field__input {
  display: block;
  width: 100%;
  height: 44px;
  box-sizing: border-box;
  padding: 9px 12px;
  border: 1px dashed rgba(28,36,42,.24);
  border-radius: 10px;
  background: transparent;
  font-size: 12px;
}
#webyayTunnel .file-field.is-dragover .file-field__input {
  border-color: var(--tunnel-teal-bg);
  background: rgba(28,107,107,.08);
}

/* Per Dave (this round), item 3: "if they have a whole bunch of different
   files they can drag them all up, or choose files one at a time, and they
   all would be listed." Rendered by bindFileFieldDragDrop() in tunnel.js
   right after .file-field__control (NOT inside it - .file-field__control
   is position:relative with .file-field__status absolutely covering it, so
   this lives in normal flow below that, one row per accumulated file, each
   with its own remove (x) button. Shared by all three .file-field
   instances in the tunnel (Images/Video/Logo, per-page Additional Pages
   uploads, Logo Design inspiration). */
#webyayTunnel .file-field__list {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-top: 6px;
}
#webyayTunnel .file-field__list:empty {
  margin-top: 0;
}
#webyayTunnel .file-field__list-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 5px 8px 5px 10px;
  border: 1px solid rgba(28,36,42,.14);
  border-radius: 8px;
  background: rgba(28,107,107,.05);
  font-size: 11px;
  color: rgba(28,36,42,.75);
}
#webyayTunnel .file-field__list-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
#webyayTunnel .file-field__list-remove {
  appearance: none;
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  border: none;
  border-radius: 50%;
  background: rgba(28,36,42,.1);
  color: rgba(28,36,42,.65);
  font-size: 13px;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  transition: background .15s ease, color .15s ease;
}
#webyayTunnel .file-field__list-remove:hover {
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* Per Dave (round 22): the "Website Changes" slide's detail-panel label
   ("What kind of changes? (select all that apply)") was rendering as thin,
   faint .tunnel-detail__label body copy - reads as an afterthought instead
   of a real header. It sits BELOW the slide's own big .tunnel-card__question
   ("Do you want any changes...?"), so it's a sub-header, not a duplicate
   top-level question - reuses .tunnel-detail__heading's bold 17px treatment
   (same family as "Custom logo design – $149") but as plain text with no
   icon span, so the base rule's flex/gap (built for the icon-bearing
   variant above) is turned off here. */
.tunnel-detail__heading--subquestion {
  display: block;
  gap: 0;
  /* Per Dave (round 35): left edge must line up exactly with the tile row
     below (.tunnel-3tiles) - both are plain block-level children of the
     same .tunnel-changes-detail container with no left padding/margin of
     their own, so a stray inherited margin here would be the only thing
     that could knock them out of alignment. Pinned to 0 explicitly so this
     never drifts even if a future edit adds padding to a shared ancestor. */
  margin-left: 0;
  /* Per Dave (round 35): "more pad between those buttons and the header" -
     the old 8px value (heading's own 8px bottom margin, further shrunk by
     margin-collapsing against .tunnel-3tiles' 4px top margin) read as
     cramped. Bumped to a clearly-separated 22px so the header reads as its
     own line, not crowded by the tile row underneath it. */
  margin-bottom: 22px;
  /* Per Dave (later round): "when they click on one of these three buttons
     and all the fill-in-the-blanks glide in, I want this header... to
     temporarily go away, so the three buttons go up near the top of that
     white tunnel to give us more real estate." Same collapse idiom as
     .tunnel-card__eyebrow.is-collapsed just above/below it in the DOM - both
     collapse together (see JS), so the .tunnel-3tiles row directly beneath
     naturally rises to sit right under the card's top edge while a panel is
     open, with no separate reposition/transform needed. max-height capped
     generously above this heading's real (possibly 2-line) rendered height
     so the base state never clips. */
  max-height: 60px;
  overflow: hidden;
  opacity: 1;
  transition: max-height .42s var(--tunnel-ease), opacity .22s ease, margin-bottom .42s var(--tunnel-ease);
}

.tunnel-detail__heading--subquestion.is-collapsed {
  max-height: 0;
  opacity: 0;
  margin-bottom: 0;
  pointer-events: none;
}

/* Fix (this round, again), item 1, per Dave: "What kind of changes?" (the
   Website Changes tile-picker's subquestion, the ONLY instance of
   .tunnel-detail__heading--subquestion that isn't also stacked with
   --planhead) was still rendering at the plain 17px size the comment above
   explicitly called out as intentional - Dave has now said twice this needs
   real header treatment like the Payment/Care/Logo headline sizes
   (clamp(26px,2.7vw,34px), weight 600), not the small 17px subquestion size.
   Scoped to [data-3tile-subquestion] (unique to this one element in the DOM,
   set in tunnel.js) so it doesn't touch --planhead's own already-large
   "Choose the plan that fits:" styling or any other future plain use of
   --subquestion. max-height bumped from 60px to 80px to comfortably clear
   this much taller line before the is-collapsed transition kicks in.
   Bug fix (this round), per Dave: "Choose your Design Changes" (2-line
   wrap, e.g. in the tile-focus header) was getting its descenders (the
   'g' in "Design") clipped along the bottom edge. Root cause: at this
   heading's largest clamp size (34px) with the tight 1.15 line-height,
   two full lines render at ~78px - right up against the 80px max-height/
   overflow:hidden cap, leaving the descenders no room and getting cropped.
   Loosened line-height to 1.3 (still a tight header line-height, just not
   descender-crushing) and raised the cap to 100px so a 2-line wrap at any
   width in the clamp range clears with real margin to spare. */
.tunnel-detail__heading--subquestion[data-3tile-subquestion] {
  font-size: clamp(26px, 2.7vw, 34px);
  font-weight: 600;
  /* Per Dave (this round): "the lead is a little bit too loose, tighten it
     slightly" - trimmed 1.3 -> 1.22. Kept above the old 1.15 that caused
     descender clipping (see comment above) - just not as loose as 1.3. */
  line-height: 1.22;
  max-height: 100px;
  /* Per Dave (this round): all the big interior subcategory headers ("Choose
     your Design Changes", "Choose the plan that fits:", "Custom logo design
     - $149") get the same primary-dark color already applied to the main
     outer .tunnel-card__question headers this round - was inheriting the
     base .tunnel-detail__heading's plain var(--ink). */
  color: var(--tunnel-teal-bg-dark);
}

/* ROOT-CAUSE FIX found this round while investigating item 2 (below), per
   Dave: "this content in the Website Changes overall for all four
   categories is too low... needs to go up at least 30 pixels or more."
   Verified via Playwright: tunnel.js's setHeaderCollapsed(true) (see the
   'changes' category's buildDetail()) DOES correctly add .is-collapsed to
   this exact subquestion element the instant a tile panel opens - exactly
   like the eyebrow right above it - but it was silently having NO visual
   effect. Cause: `.tunnel-detail__heading--subquestion[data-3tile-
   subquestion]` (max-height:80px, directly above) and `.tunnel-detail__
   heading--subquestion.is-collapsed` (max-height:0, above that) are EQUAL
   specificity (one class+one attribute vs two classes = 0,2,0 either way),
   and the 80px rule sits LATER in the file - so at the exact moment both
   classes are present (`.is-collapsed` + `[data-3tile-subquestion]`
   together), the later 80px rule silently won the cascade tie and the
   subquestion never actually collapsed, quietly costing ~47px (its own
   39px rendered height + 8px margin) of permanent dead space above the
   tile fields on EVERY one of the 4 sub-panels, every time. Adding this
   explicit combined-selector override (higher specificity than either rule
   above, since it matches both a class AND an attribute AND another class)
   restores the intended collapse behavior - confirmed via Playwright the
   subquestion now genuinely goes to 0 height the instant a tile panel is
   open, matching the eyebrow, and this alone accounts for the bulk of the
   "30px+" move Dave asked for. */
.tunnel-detail__heading--subquestion[data-3tile-subquestion].is-collapsed {
  max-height: 0;
  opacity: 0;
  margin-bottom: 0;
  pointer-events: none;
}
/* Note: the two .is-collapsed rules just above are no longer triggered -
   tunnel.js no longer adds .is-collapsed to this element (see the
   .is-tile-focus rules directly below for why) - left in place rather
   than deleted since removing them is zero-risk either way and this keeps
   the history intact. */

/* Fix (this round), per Dave: "We had this before, but somehow it got
   pushed back to something else... I want all of that stuff [the 4-tile
   grid + Email/Send-Me-PDF row] to go away and have that whole panel
   filled up with just stuff about [the active category] and there needs
   to be a header on top of that that says 'choose your fonts' and that
   same head[ing] [text siz]e." This "What kind of changes?" header is
   REPURPOSED instead of collapsed away now (see setTileFocus() in
   tunnel.js) - its text swaps to "Choose your Fonts"/"Choose your Design
   Changes"/etc. and it grows a small inline back-arrow, both only while a
   tile is focused. display:flex (only while focused - unfocused stays the
   plain block layout above so the plain "What kind of changes?" text
   still reads centered/static as before) lets the arrow sit to the right
   of the swapped-in title text on one line. */
/* BUG FIX (this round), per Dave's screenshot: "Email Services" (a much
   shorter swapped-in title than "Choose your Design Changes") showed this
   row's step-back button sitting way out at the container's far right edge,
   nearly falling off the window. Root cause: `justify-content:space-between`
   anchors the button to the ROW's own right edge, not to the end of the
   text - for a long title like "Choose your Design Changes" the text
   happened to fill most of the row so the button landed close to it almost
   by coincidence, but for a short title like "Email Services" the same rule
   left a huge gap and pushed the button far past the visible text, out
   toward (or past) the row's real width. Switched to `flex-start` so the
   button always sits a small, FIXED gap after the text itself, regardless
   of how long or short any given title is - consistent behavior for every
   swapped-in title, not just the one that happened to be tested first. */
.tunnel-detail__heading--subquestion[data-3tile-subquestion].is-tile-focus {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  /* Per Dave: wanted ~15px right of "changes?" on one screenshot, then
     "maybe 20-25 pixels...to the right of that Email Services header" on
     another - both now come from this one shared gap value (not a
     per-button transform hack, which was the old space-between-era
     workaround and is removed below). Split the difference at 22px. */
  gap: 22px;
}
.tunnel-3tile-focus-stepback {
  display: none;
}
.tunnel-detail__heading--subquestion[data-3tile-subquestion].is-tile-focus .tunnel-3tile-focus-stepback {
  display: inline-flex;
  flex: 0 0 auto;
}

/* Per Dave (desktop only): "move this reverse button... up four pixels on
   desktop." Horizontal spacing is now controlled by the shared `gap` above
   (see the BUG FIX comment) instead of a per-button transform, so only the
   small vertical nudge remains here. Scoped to a desktop-width media query
   so mobile's own already-tuned position is untouched. */
@media (min-width: 768px) {
  .tunnel-3tile-focus-stepback {
    transform: translateY(-4px);
  }
}

/* Per Dave (this round): "How many additional pages?" (the Additional Pages
   slide's own main question, before OK is clicked) had no way back to the
   Yes/No question at all - every other detail panel's main header has one
   (Logo Design, Care/Hosting, the Website Changes tile-focus header above).
   Added the same generic [data-detail-stepback] round button (see tunnel.js
   buildDetail() for the 'pages' category) as an inline child at the END of
   the h3's own text, not a separate flex row - .tunnel-stepback-btn is
   already display:inline-flex (see base rule), so placed as the h3's last
   child it flows naturally with the wrapping text and lands right after
   whichever word ("pages?") ends up last, at any card width, without any
   JS text-measuring. Per Dave: "about 15 pixels to the right of pages?" -
   margin-left set to 15px; vertical-align keeps the round button centered
   against the text's cap-height instead of the taller full line box. */
.tunnel-pages-setup-stepback {
  margin-left: 15px;
  vertical-align: middle;
}

/* Fix (this round), per Dave: the 4-tile grid (Design/Font/Social) and the
   Email + "Or, make changes on your own schedule:" + Send Me PDF row both
   fully hide while a tile is focused, per the same instruction above - the
   focused panel's own content is the only thing left on screen (besides
   the "Choose your X" header just above), freeing up the real estate Dave
   asked for and eliminating scrolling. Both rows come right back the
   instant OK (or the new inline back arrow) closes the focused tile - see
   setTileFocus(null) call sites in tunnel.js. */
.tunnel-3tiles.is-hidden-focused,
.tunnel-3tiles-row2.is-hidden-focused {
  display: none !important;
}

/* Item 1 (this round), per Dave: "Choose the plan that fits:" (Care/Hosting
   tile slide) was still rendering at the plain 17px .tunnel-detail__heading
   size while every other slide's main question was unified to the big
   clamp(26px,2.7vw,34px) .tunnel-card__question size in an earlier round.
   This particular header reuses .tunnel-detail__heading--subquestion (built
   for a genuinely secondary sub-header, e.g. "What kind of changes?"), which
   is the WRONG shared class for this one - "Choose the plan that fits:" is
   this slide's actual main question (the real .tunnel-card__question for
   this yesno-turned-detail-panel slide is the collapsed "Would you like
   WalterGroup to host..." line above it, already hidden by the time this
   shows). Rather than repoint the markup to .tunnel-card__question outright
   (which would also pull in that class's own margin/max-width assumptions
   built for a different DOM position), this adds a THIRD modifier class
   (--planhead, see tunnel.js's 'care' category buildDetail) scoped only to
   this one heading, so the "What kind of changes?" subquestion elsewhere
   keeps its original smaller 17px treatment untouched. */
.tunnel-detail__heading--planhead {
  /* Fix (this round), item 4, per Dave: "Choose the plan that fits:" got
     clipped/overlapped by the "Hosting + Web Care $49/mo" pill below it at
     wider browser windows. ROOT CAUSE, verified via Playwright: this
     heading still inherits its base .tunnel-detail__heading--subquestion
     rule's `max-height: 60px; overflow: hidden;` (built for a genuinely
     short one-line subquestion), but never overrode it the way the OTHER
     --subquestion variant did (see [data-3tile-subquestion] above, which
     raised its own cap to 80px for this exact reason). At most tested
     sizes this heading fits on one ~39px line, comfortably under the 60px
     cap - but at taller/wider browser windows the persistent monitor
     mockup (sizeMonitorPreview() in tunnel.js) scales up to fill more of
     the available height, which narrows this card's own measured column
     width (measured via Playwright: card width dropped from 520px at
     2200x900 to 388px at 2200x1100) enough to wrap this heading onto a
     genuine second line needing ~80px - silently clipped by the 60px cap,
     which reads exactly as "fits:" (the wrapped second line/word) being
     cut off and overlapped by the pill row starting right where the capped
     box ends. Raised to the same 80px cap already proven safe for the
     other --subquestion variant so a wrapped 2-line render is never
     clipped, at any viewport width or height - verified via Playwright at
     1440x900, 1920x900, and 2200x1100 (the reproducing case) with no
     clipping/overlap in any of them. */
  max-height: 80px;
  font-size: clamp(26px, 2.7vw, 34px);
  font-weight: 600;
  line-height: 1.15;
  margin-bottom: 22px;
  /* Per Dave (this round): same primary-dark color as the other big interior
     subcategory headers (see [data-3tile-subquestion] above). */
  color: var(--tunnel-teal-bg-dark);
}

/* Fix (this round), item 3, per Dave: "Custom logo design – $149" (Logo
   Design slide) was still on the plain 17px .tunnel-detail__heading size -
   same issue/fix pattern as --planhead above, just for this one heading.
   Scoped modifier so the genuinely-secondary subquestions elsewhere
   (e.g. "What kind of changes?") keep their smaller 17px treatment. */
.tunnel-detail__heading--logohead {
  font-size: clamp(26px, 2.7vw, 34px);
  font-weight: 600;
  line-height: 1.15;
  /* Per Dave (this round): same primary-dark color as the other big interior
     subcategory headers (see [data-3tile-subquestion] above). */
  color: var(--tunnel-teal-bg-dark);
}

/* Fix (this round), per Dave: the step-back arrow used to live in its own
   .tunnel-stepback-row above this heading - a full extra row (30px button +
   10px margin-bottom) just for that one control, which read as "taking up
   a huge amount of real estate" on an already-tight panel. Moved inline,
   directly after the "$149" text (per Dave's screenshot, which marked the
   exact spot with a dashed box) - everything below shifts up by that
   row's old height for free, no separate spacing rule needed. Sized down
   slightly from the standalone-row version (30px -> 26px) so it sits
   comfortably next to the heading's own text instead of dominating it,
   and vertical-align keeps its center roughly level with the text's own
   baseline area rather than the default inline top-alignment. */
/* Per Dave (this round): the checkmark circle was sitting past the reverse
   button, on the far right - moved (see the markup order in tunnel.js) to
   sit right after "$149" instead, with a real 15px gap between them,
   scoped to just this heading's check so the shared .tunnel-detail__check
   rule (reused elsewhere) isn't affected. */
/* .tunnel-detail__heading (the shared base rule) is a flex row with its own
   9px gap between every child - so this only needs 6px more margin to land
   the real total gap at Dave's requested 15px (6 + 9 = 15), not 15px on
   top of the existing gap. */
/* BUG FIX (this round), per Dave: "this checkmark w/ circle needs to go
   next to the header, 15px adjacent to the left of $149" - it was still
   rendering up near the FIRST line of the header ("Custom logo"), nowhere
   near "$149" (which wraps to a second line at typical card widths).
   ROOT CAUSE: the check was a separate flex ITEM sibling of the text
   <span> inside .tunnel-detail__heading (display:flex; align-items:
   center) - when that text span wraps to 2 lines, the check (a flex
   child, not part of the text's own inline flow) just gets vertically
   centered against the whole 2-line block, landing between the lines
   instead of tracking to sit next to wherever "$149" actually ends up.
   Fixed at the markup level (tunnel.js): the check <span> now lives
   NESTED INSIDE the text <span> itself, as its very last piece of inline
   content, instead of as a flex sibling after it - so it's part of the
   same natural text flow as "$149" and wraps together with it onto
   whatever line that lands on, landing genuinely adjacent every time.
   Since it's no longer a flex child, the shared heading's 9px flex-gap no
   longer contributes any spacing here - margin-left carries the entire
   15px gap on its own now (6px -> 15px), and vertical-align keeps the
   small circle level with the text's own baseline instead of the default
   inline top-alignment. */
.tunnel-logohead-check {
  margin-left: 15px;
  vertical-align: middle;
}

.tunnel-logohead-stepback {
  width: 26px;
  height: 26px;
  margin: 0 8px;
  vertical-align: middle;
}
.tunnel-logohead-stepback svg {
  width: 14px;
  height: 14px;
}

/* Same move, per Dave, applied to the "Website Access + Domain Information"
   sub-heading: step-back arrow relocated from its own standalone row above
   the panel down to inline, right after the (i) info button on this
   heading line (see the screenshot Dave marked with a dashed box - directly
   to the right of that info icon). Sized down further than the logohead
   version above since this sub-heading itself renders smaller. */
.tunnel-subhead-stepback {
  width: 22px;
  height: 22px;
  margin-left: 8px;
  vertical-align: middle;
}
.tunnel-subhead-stepback svg {
  width: 13px;
  height: 13px;
}

/* ============================================================
   ITEM A: "Website Changes" 3-tile build (Overall Changes / Font
   Changes / Social Media) - replaces the old flat change_type
   checkbox list. See buildDetail() for the 'changes' category in
   tunnel.js. This detail panel needs to grow well past the shared
   .tunnel-detail 360px cap (deep sub-content per tile), so it's
   given the same "no hard cap, just let it flow" treatment already
   used for the info/summary slides' own detail panels. */
.tunnel-detail.tunnel-changes-detail.is-visible {
  max-height: none;
  overflow: visible;
}

/* Per Dave (latest round, item 4): the Care slide's detail panel (heading +
   3 pill+caption options + the handoff pill below) now runs taller than the
   shared .tunnel-detail 360px cap now that item 3's redesign added a caption
   line under each pill - the handoff pill at the bottom was getting clipped
   off by that hard overflow:hidden cap. Same "no hard cap, just let it flow"
   treatment already used for .tunnel-changes-detail/.tunnel-pages-detail
   above. See container.classList.add('tunnel-care-detail') in the 'care'
   category's buildDetail() in tunnel.js. */
.tunnel-detail.tunnel-care-detail.is-visible {
  max-height: none;
  overflow: visible;
}

/* Round 40, item 4: Additional Pages' sequential "Page N of X" panel needs
   the same "lift the shared 360px/overflow:hidden cap" treatment as
   .tunnel-changes-detail above - it was previously left on the plain
   .tunnel-detail base rule, which hard-clipped (overflow:hidden, no scroll
   possible at all) as soon as the panel's title/content/upload/button stack
   plus the header above it exceeded 360px, most visibly once the page-title
   dropdown was added. The actual internal scrolling for the tall content is
   handled by .tunnel-pages-flow.is-visible below (a bounded, visibly
   scrollable region of its own) - this override just stops the OUTER
   wrapper from clipping it away before that inner scroll can ever be
   reached. */
.tunnel-detail.tunnel-pages-detail.is-visible {
  max-height: none;
  overflow: visible;
}

/* Item 7 (this round): Logo Design's detail panel was left on the plain
   .tunnel-detail base rule (360px cap, overflow:hidden, no scroll) - the
   notes textarea + upload field pushed it past 360px and the upload field/
   hint text at the bottom was silently clipped away. Same "lift the outer
   cap" treatment as .tunnel-changes-detail/.tunnel-care-detail/
   .tunnel-pages-detail above; the actual scrolling is handled by the inner
   .tunnel-logo-flow[data-flush-scroll] region below (sized live by
   sizeFlushScrollAreas() in tunnel.js). */
.tunnel-detail.tunnel-logo-detail.is-visible {
  max-height: none;
  overflow: visible;
}
.tunnel-logo-flow {
  max-height: min(320px, 36vh);
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 8px;
  padding-bottom: 28px;
  scrollbar-width: thin;
  scrollbar-color: rgba(28,36,42,.35) transparent;
}
.tunnel-logo-flow::-webkit-scrollbar {
  width: 6px;
}
.tunnel-logo-flow::-webkit-scrollbar-track {
  background: transparent;
}
.tunnel-logo-flow::-webkit-scrollbar-thumb {
  background: rgba(28,36,42,.32);
  border-radius: 4px;
}

/* Missing-feature restoration (this round): "Website Access + Domain
   Information" + "Access notes" fields, ported from the production
   landingpage-template's own Care/Hosting flow (.website-access-grid /
   .access-notes-field in landingpage-template/assets/css/styles.css) into
   the 'care' category's detail panel (see buildDetail() in tunnel.js).
   Restyled onto the tunnel's own field language (.tunnel-page-panel__field/
   __input/__select/__textarea, already established for the Additional
   Pages panel) rather than reusing the production template's own
   .start-modal/.website-access-grid CSS classes verbatim. Hidden by
   default (.is-hidden on .tunnel-care-access) until a real hosting/care
   tile is picked - see updateCareAccessVisibility() in tunnel.js. */
.tunnel-care-access {
  margin-top: 18px;
  padding-top: 16px;
  border-top: 1px solid rgba(28,36,42,.12);
}
.tunnel-care-access.is-hidden {
  display: none;
}
.tunnel-care-access__head {
  display: flex;
  align-items: center;
  gap: 6px;
}

/* "Let's figure this out later" skip pill - see the markup comment in
   tunnel.js. Same base pill language/hover behavior as
   .tunnel-yesno__btn (border, radius, hover fill/lift) so it reads as a
   real, consistent tunnel button rather than a one-off style, but
   deliberately smaller/lighter so it doesn't compete visually with the 6
   real form fields below it - this is the low-commitment escape hatch, not
   the primary action on this screen. */
.tunnel-care-access__skip {
  appearance: none;
  align-self: flex-start;
  border: 1.5px solid rgba(28,36,42,.16);
  background: #ffffff;
  color: rgba(28,36,42,.6);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .02em;
  padding: 7px 16px;
  border-radius: 999px;
  cursor: pointer;
  transition: background .18s ease, border-color .18s ease, color .18s ease, transform .18s ease;
}
/* Bug fix, per Dave (desktop only - screenshot showed this pill rendering
   full-width/centered, not the small left-aligned "escape hatch" pill the
   rule above already intends): .tunnel-care-access__flow (this button's
   direct parent) is `display:grid`, where align-self only controls the
   BLOCK axis - grid items default to `justify-self:stretch` on the INLINE
   axis regardless of align-self, which is what was actually stretching
   this button to the full column width the whole time. justify-self is
   the correct grid property for that axis. Also halves the gap to the
   "Website Access + Domain Information" header above it (14px, from this
   grid's own `gap`) via a negative margin-top on just this one row, per
   "padding between that and the header... about half" - other rows in
   this same grid (skip button -> the field grid below it, etc.) keep the
   full 14px gap untouched since the grid's own `gap` value isn't changed,
   only this specific button's own position within its track. Scoped to
   desktop only per Dave's explicit ask - mobile's current full-width
   rendering (consistent with most other mobile tunnel buttons being
   full-width by design) is untouched. */
@media (min-width: 768px) {
  .tunnel-care-access__skip {
    justify-self: flex-start;
    margin-top: -7px;
  }
}
.tunnel-care-access__skip:hover,
.tunnel-care-access__skip:focus-visible {
  background: var(--tunnel-teal-bg-dark);
  border-color: var(--tunnel-teal-bg-dark);
  color: #fff;
  transform: translateY(-1px);
}
/* "OK, send me next steps" - the real primary action on this form (per
   Dave, this round), so styled as a solid filled pill rather than the
   lighter skip pill above - same solid-teal treatment as this tunnel's
   other primary CTAs (.tunnel-yesno__btn.is-selected, care choice tiles). */
.tunnel-care-access__ok {
  appearance: none;
  align-self: flex-start;
  justify-self: flex-start;
  border: none;
  background: var(--tunnel-teal-bg-dark);
  color: #fff;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .01em;
  padding: 11px 22px;
  border-radius: 999px;
  cursor: pointer;
  margin-top: 4px;
  transition: background .18s ease, transform .18s ease;
}
.tunnel-care-access__ok:hover,
.tunnel-care-access__ok:focus-visible {
  background: #1c242a;
  transform: translateY(-1px);
}
@media (max-width: 767px) {
  .tunnel-care-access__ok { width: 100%; text-align: center; }
}
/* Added (this round), per Dave: live warning shown under the "Files Only"
   destination-platform picker the instant they pick a platform that can't
   accept a raw file upload (Wix, Squarespace, Shopify, etc. - see
   NO_UPLOAD_PLATFORMS in tunnel.js). Empty/plain by default; .is-warning
   is only added once a matching platform is actually selected. */
.tunnel-care-access__handoff-note {
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--tunnel-muted, #6b7280);
  margin: 0;
}
.tunnel-care-access__handoff-note.is-warning {
  /* Per Dave: the old burnt-orange/peach warning styling ("terrible...
     don't match our color palette") didn't coordinate with the Plum/Jade
     brand palette. Recolored to a faded-plum tinted card (same family as
     the .tunnel-care-choice/.tunnel-payment-choice selected-state plum and
     the faded-jade autofill treatment elsewhere) so it still reads as a
     distinct "heads up" callout without clashing - solid plum text/border
     instead of orange. */
  color: #66266E;
  background: rgba(126, 49, 135, .08);
  border: 1px solid rgba(126, 49, 135, .28);
  border-radius: 10px;
  padding: 10px 12px;
  font-weight: 600;
}
.tunnel-care-access__flow {
  display: grid;
  gap: 14px;
  /* Bug fix, per Dave: "everything needs to kind of stay uniform together...
     this looks so stupid" - on a tall browser window, sizeFlushScrollAreas()
     (tunnel.js) force-sets a big inline min-height on this element so its
     outer box still reaches the gray bottom band (an earlier, deliberate
     fix for a different complaint - the box stopping short). But this is a
     CSS GRID container with only `gap` set (no explicit row sizing), and a
     grid's default align-content behaves as `stretch`: once the box is
     taller than its own content, that default silently expanded the ROW
     GAPS themselves to eat the extra space, spreading the skip pill/field
     grid/notes box apart instead of just leaving blank room below them.
     align-content:start keeps every row's own natural size/gap and lets
     any leftover height sit as plain empty space at the bottom instead.
     Same reasoning applies to Additional Pages' per-page field grid
     (.tunnel-page-panel, also display:grid) - fixed alongside this one. */
  align-content: start;
  /* Same "internally-scrolling region that reaches the gray bottom band"
     treatment as .tunnel-logo-flow above - sized live by
     sizeFlushScrollAreas()/[data-flush-scroll] in tunnel.js, this starting
     cap just prevents a layout flash before the first live measurement. */
  max-height: min(320px, 36vh);
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 8px;
  padding-bottom: 12px;
  scrollbar-width: thin;
  scrollbar-color: rgba(28,36,42,.35) transparent;
}
.tunnel-care-access__flow::-webkit-scrollbar {
  width: 6px;
}
.tunnel-care-access__flow::-webkit-scrollbar-track {
  background: transparent;
}
.tunnel-care-access__flow::-webkit-scrollbar-thumb {
  background: rgba(28,36,42,.32);
  border-radius: 4px;
}
.tunnel-access-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px 16px;
}
@media (max-width: 560px) {
  .tunnel-access-grid {
    grid-template-columns: 1fr;
  }
}
.tunnel-access-other {
  margin-top: 8px;
}
.tunnel-access-other.is-hidden {
  display: none;
}
.tunnel-care-access__notes {
  margin-top: 2px;
}

.tunnel-3tiles {
  /* Row 1 only now: the 3 pill tiles (Overall Changes / Font Changes /
     Social Media). Email + the step-back button live in their own
     `.tunnel-3tiles-row2` container below (see markup in tunnel.js) so row
     2's layout doesn't depend on flex-wrap math at all - each row is
     simple and predictable. */
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 4px;
}
/* REMOVED (this round), per Dave: "you have two reverse buttons on this
   panel... remove the reverse button at the bottom... only keep the one
   at top next to the header." The row-2 step-back button
   (.tunnel-3tile-stepback / data-3tiles-stepback) that used to live here
   as a static sibling of Email/PDF - moving between "next to Email"
   (desktop) and "next to Send Me PDF" (mobile) via CSS `order` - is gone
   from the markup entirely now (see tunnel.js). Its dual behavior (close
   an open tile's panel, or step the whole card back to the Yes/No
   question) now lives entirely on the top header's own back arrow
   (.tunnel-3tile-focus-stepback) - see that button's click handler in
   tunnel.js for the merged logic. */
.tunnel-3tiles-row2 {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin-top: 10px;
}

/* Outline-only pill per Dave's spec - no fill at rest, changes appearance
   on hover, and switches to a SOLID accent-teal fill + white text + white
   checkmark once that tile's own content is OK'd (see .is-done below). */
.tunnel-3tile {
  appearance: none;
  border: 1.5px solid rgba(28,36,42,.2);
  background: transparent;
  border-radius: 999px;
  padding: 11px 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
  font-weight: 600;
  line-height: 1;
  color: var(--ink);
  text-align: center;
  cursor: pointer;
  transition: all .22s ease;
  /* Sized so 3 tiles comfortably fit one flex row (with the 10px gaps) at
     normal content-column widths, and the 4th (Email) wraps to row 2 -
     restores the original 3-then-1 layout. flex-grow:1 lets the 3 tiles
     on row 1 (and Email alone on row 2) stretch evenly to fill the row's
     full width, same pill proportions either way. */
  flex: 1 1 calc(33.333% - 7px);
  min-width: 108px;
}

/* Per Dave (this round, desktop only): "the font and all of these buttons
   is heavy... needs to be lighter text in these buttons throughout on
   desktop" - then, after first pass (600->500) still read as unchanged:
   "did you make changes to the overly bold buttons? they look the same to
   me, need to be less bold on buttons throughout." Bumped down one more
   step, 500->450, so the difference is unmistakable without going all the
   way to a thin/light voice. Covers all 5 pills that share this base class -
   Design Changes / Font Changes / Social Media / Email / Send Me PDF -
   since they all render at 600 above. Scoped to desktop only (this file's
   standard min-width:768px desktop breakpoint) per Dave's own "on desktop"
   framing; mobile keeps the original 600 weight untouched.
   NOTE: this is a static CSS file - a change here only takes effect on the
   live site after the whole folder is drag-and-drop redeployed to Netlify
   again, same as every other tunnel.css/tunnel.js edit this round. If a
   screenshot still shows the old bold weight, that almost always means the
   redeploy hasn't happened yet, not that the edit didn't take. */
@media (min-width: 768px) {
  .tunnel-3tile {
    font-weight: 450;
  }
}

/* REGRESSION FIX (this round), item 2: the previous `flex: 1 1 auto;
   min-width: 0;` here let Email grow (flex-grow:1) to fill the ENTIRE row2
   width inside `.tunnel-3tiles-row2` (a flex row with only Email + the
   step-back button in it, so nothing else was left to absorb that growth) -
   roughly 10x wider than the 3 tiles above it, and it visually shoved the
   step-back button out to the far right edge / off-screen. Per Dave: Email
   should be the SAME width as the 3 tiles on row 1, not stretched full-row.
   Fix: match `.tunnel-3tile`'s own row-1 sizing exactly - same
   `flex-basis: calc(33.333% - 7px)` and `min-width: 108px` - but with
   flex-grow/flex-shrink both 0 so it holds that width instead of growing to
   fill row 2 (row 1's flex-grow:1 only matters there because all 3 tiles
   grow evenly together; here it would just be Email alone re-expanding to
   fill the row again). Placed after the base `.tunnel-3tile` rule so it
   still wins the cascade at equal specificity. */
.tunnel-3tile--email {
  flex: 0 0 calc(33.333% - 7px);
  min-width: 108px;
  order: 1;
}

/* "Send Me PDF" - per Dave (long-requested). Used to be its own separate
   full-width row (.tunnel-3tiles-row3, now unused - the div itself was
   removed from tunnel.js and merged into .tunnel-3tiles-row2 alongside
   Email, see the big comment above .tunnel-3tiles-row2). On desktop it
   needs to LOOK like its own full-width row below Email, so `order:3`
   (last) plus `flex-basis:100%` forces it to wrap onto its own line in
   the shared flex-wrap container. REMOVED (this round), per Dave: the
   mobile override that used to shrink this to a non-100% width (to make
   room for the now-deleted step-back button beside it) is gone - see the
   mobile block further down, where this is now full-width like the other
   4 tiles on every viewport, since nothing needs to share its line
   anymore. */
.tunnel-3tile--pdf {
  flex: 1 1 100%;
  border-color: rgba(28,36,42,.16);
  background: rgba(94,115,135,.06);
  order: 4;
}
.tunnel-3tile--pdf:hover {
  border-color: var(--gold);
  background: rgba(94,115,135,.14);
}
.tunnel-3tile__pdf-icon {
  display: inline-flex;
  flex: 0 0 auto;
}

/* Per Dave (this round): short caption line just above "Send Me PDF",
   plus a bit more breathing room above the button. Full-width so it
   forces its own line (order:3, right before PDF's order:4 line on
   desktop - see the reshuffled orders above/below). Mobile override
   further down renumbers this alongside PDF to keep the same "caption
   line, then PDF" arrangement. */
.tunnel-pdf-caption {
  flex: 1 1 100%;
  order: 3;
  margin-top: 10px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
  font-weight: 600;
  color: rgba(28,36,42,.5);
  text-align: left;
}

.tunnel-3tile:hover {
  border-color: var(--tunnel-teal-bg);
  background: rgba(28,107,107,.08);
}

/* Per Dave: the tile whose panel is currently expanded below should keep
   reading as "active" the whole time the client is filling it in, not just
   for the instant the mouse happens to be over it - "that button should
   show the hover state so you know that's the category you're in". Grouped
   with :hover (same values, not a new similar-but-different style) so an
   open-but-not-hovered tile still gets the same solid-teal-tinted preview
   treatment as a hovered one. .is-active is toggled in tunnel.js alongside
   each panel's own .is-visible class. This is intentionally lighter than
   the fully-solid .is-done (OK'd) state below - .is-done still wins visually
   since it comes after in source order and its rule is unconditional. */
.tunnel-3tile.is-active {
  border-color: var(--tunnel-teal-bg);
  background: rgba(28,107,107,.08);
}

.tunnel-3tile.is-done {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* Fix, per Dave: this box was always in the flex row (even empty, pre-
   selection), so its 14px width + 6px gap sat to the left of the label
   inside a centered flex row - shoving the label off-center to the right
   on every tile, all the time, not just once selected. display:none by
   default removes it from the flow entirely so the label sits perfectly
   centered before selection; .is-done below (same class the checkmark
   SVG is injected into, see tunnel.js) brings it back, which re-centers
   the whole check+label group as a pair - the label shifts right just
   enough to stay balanced against the now-visible checkmark, instead of
   being permanently off-center either way. */
.tunnel-3tile__check {
  display: none;
  width: 14px;
  height: 14px;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
}
.tunnel-3tile.is-done .tunnel-3tile__check {
  display: inline-flex;
}
.tunnel-3tile__check svg {
  width: 100%;
  height: 100%;
}

.tunnel-3tile__label {
  /* Single-line pill labels (Overall Changes / Font Changes / Social
     Media / Email) - `text-wrap: balance` combined with the too-narrow
     4-per-row grid was what forced 2-line wrapping ("Overall / Changes").
     Now that tiles are sized to fit 3 per row, nowrap keeps each label on
     one line at all times. */
  white-space: nowrap;
}

/* Per Dave: the "Design & Copy Changes" tile's own label reads as
   "Design/Copy Changes" on desktop only (shorter, so it stops crowding
   the pill's edges at the fixed 3-per-row desktop tile width - see
   .tunnel-3tile above) - mobile keeps the original "Design & Copy
   Changes" wording untouched (mobile tiles are full-width, plenty of
   room, and this was never asked to change there). Both strings render
   in the DOM at all times; this CSS pair just toggles which one is
   visible per breakpoint, so there's no JS resize-listener to keep in
   sync - it's always correct even across a live resize/orientation
   change. */
.tunnel-3tile__label-mobile {
  display: none;
}
@media (max-width: 767px) {
  .tunnel-3tile__label-desktop {
    display: none;
  }
  .tunnel-3tile__label-mobile {
    display: inline;
  }
}

/* Per-tile content reveal - same large fixed-max-height fade idiom as
   .tunnel-qa/.tunnel-detail elsewhere in the tunnel, sized generously
   since the Overall Changes panel in particular is the deepest content
   in the whole tunnel (4 stacked rows + an OK button). */
/* Fix (this round), item 6, per Dave (app-wide - "this goes for every
   single slide or category"): same glide-not-snap fix as .tunnel-detail
   above, applied here too since opening a tile (Overall/Font/Social/Email)
   is its own separate reveal that shares the exact same "just max-height +
   opacity, no transform" root cause. */
.tunnel-3tile-panel {
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  margin-top: 0;
  transform: translateY(22px);
  transition: max-height .55s var(--tunnel-ease), opacity .6s ease-out, margin-top .55s var(--tunnel-ease), transform .6s ease-out;
}

.tunnel-3tile-panel.is-visible {
  max-height: 900px;
  opacity: 1;
  margin-top: 18px;
  transform: translateY(0);
  /* Fix (this round), per Dave: "also remove that separator line - not
     needed." This hairline (added a prior round to separate the tile
     button row from the panel content below it) no longer makes sense now
     that the tile button row hides entirely whenever a panel is open (see
     .tunnel-3tiles.is-hidden-focused above) - there's nothing left above
     this panel to separate FROM once it's showing, just the new "Choose
     your X" focus header. Removed outright rather than just hidden. */
}

.tunnel-3tile-panel__intro {
  font-size: 12px;
  color: var(--muted);
  line-height: 1.5;
  /* ROUND 30: trimmed 14px -> 8px bottom margin (Social Media tile only
     needed this last bit shaved to fully clear scrolling - see the
     .tunnel-social-url/.tunnel-social-status comments above for the main
     fix); harmless on the Overall/Font panels too since they had more
     vertical slack already. */
  margin: 0 0 8px;
  max-width: 56ch;
}

/* Overall Changes tile: Language / Images-Video / Your Logo / Color
   Changes rows, each label-left, control-right. */
.tunnel-3row {
  display: grid;
  grid-template-columns: 108px 1fr;
  gap: 14px;
  align-items: start;
  margin-bottom: 16px;
}

.tunnel-3row__label {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Per Dave: "the sub headers on all the panels look heavy to me... make
     them semi-bold, it's too heavy, too distracting" - dropped from 700 to
     600 here and on every other field-sub-header label class in this file
     (.tunnel-page-panel__label, .tunnel-logo-notes__label,
     .tunnel-logo-upload > span:first-child) so the reduction is consistent
     across every panel that uses this same bold-label-above-a-field
     pattern, not just this one. */
  font-weight: 600;
  font-size: 13px;
  color: var(--ink);
  padding-top: 9px;
}

.tunnel-3row__control {
  min-width: 0;
}

.tunnel-3row__textarea {
  display: block;
  width: 100%;
  box-sizing: border-box;
  resize: vertical;
  min-height: 60px;
  padding: 10px 12px;
  border: 1px solid rgba(28,36,42,.16);
  border-radius: 10px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
  line-height: 1.5;
}
.tunnel-3row__textarea:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}
.tunnel-3row__textarea::placeholder {
  color: rgba(28,36,42,.35);
}

/* Round 40, item 2: "Tell us what to change (in 2 lines)" - new top row of
   the Overall Changes panel, same label-left/control-right .tunnel-3row
   treatment as every other row here, just a shorter 2-line textarea so it
   reads as a compact summary field rather than the larger free-form
   Language box below it. */
.tunnel-3row__textarea--summary {
  min-height: 44px;
}

.tunnel-3upload .file-field__control {
  height: 40px;
}
.tunnel-3upload .file-field__input {
  height: 40px;
}
.tunnel-3upload .file-field__status {
  height: 40px;
  font-size: 11px;
}

/* Color Changes: two stacked fill-in-the-blank + native color-picker rows */
.tunnel-color-stack {
  display: grid;
  gap: 10px;
}

.tunnel-color-field {
  display: grid;
  grid-template-columns: 100px 1fr;
  align-items: center;
  gap: 8px;
}

.tunnel-color-field > span:first-child {
  font-size: 12px;
  color: var(--muted);
}

.tunnel-color-field__inputs {
  display: flex;
  align-items: center;
  gap: 8px;
}

.tunnel-color-text {
  width: 110px;
  box-sizing: border-box;
  padding: 8px 10px;
  border: 1px solid rgba(28,36,42,.16);
  border-radius: 8px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
}
.tunnel-color-text:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}
/* Item 1 (re-fix): the JS-level "blank on every open" logic (resetTunnelState
   in tunnel.js) was already verified correct via live Playwright testing -
   fresh open, tile-swap within Website Changes, Back/Next between
   categories, and a full tunnel close+reopen all leave value="" here every
   time. The reason Dave's screenshots still LOOKED populated even after
   that fix shipped: these fields' example placeholders ("e.g. #1c6b6b",
   "e.g. #5e7387") are realistic-looking hex codes, and with no
   ::placeholder override this text rendered in the browser's plain default
   gray (rgb(117,117,117), full opacity, upright) - solid enough at this
   field's small 12px size to read as genuine typed content in a screenshot,
   not obviously-a-hint text. Lightening + italicizing the placeholder here
   makes it visually unambiguous as an empty hint, not real data, so this
   can't be mistaken for "still pre-populated" again. */
.tunnel-color-text::placeholder {
  color: rgba(28,36,42,.36);
  font-style: italic;
}

/* Native color-wheel picker - clicking this opens the browser's own color
   picker; tunnel.js copies the chosen hex value into the adjacent text
   field automatically (see wireColorPicker in tunnel.js). */
.tunnel-color-picker {
  width: 34px;
  height: 34px;
  padding: 2px;
  border: 1px solid rgba(28,36,42,.18);
  border-radius: 8px;
  background: #ffffff;
  cursor: pointer;
  flex: 0 0 auto;
}

.tunnel-3tile-ok-row {
  display: flex;
  justify-content: center;
  margin-top: 6px;
  /* Fix (round 44+), item 2: per Dave - once a user scrolls a tall 3-tile
     sub-panel (Overall Changes / Font Changes / Social Media, whichever
     is open) all the way down, this OK button was landing flush against
     the gray .tunnel-bottom band with zero clearance. Root cause: the
     parent .tunnel-card's own box is capped by its `max-height: 90%`
     (see .tunnel-card above) while `overflow: visible` lets this content
     paint past that cap - trailing space added to .tunnel-card itself
     (padding-bottom) gets absorbed into that same capped box and never
     actually pushes the visually-overflowing content further down
     (confirmed via Playwright: adding padding-bottom there measured a
     ~0px gap no matter the value). Bottom margin directly on this OK
     row - the actual last visible element in every one of these three
     panels - genuinely extends the real scrollable content, since it's
     not subject to that same max-height clamp. */
  margin-bottom: 32px;
}

/* Latest round, item 2, per Dave: "move the OK button up and to the right
   so it's adjacent and aligned with the bottom font choice (Barlow), to
   help with real estate." The Font Changes panel's OK row used to be a
   plain sibling BELOW the whole .tunnel-font-list grid, centered on its own
   full-width row - wasted vertical space since the grid's 2-col/5-item
   layout leaves the 3rd row's right-hand cell empty (Barlow alone occupies
   the left cell). Moved in the markup (tunnel.js) to be the grid's 6th
   child instead of a sibling after it - with 5 font rows already filling
   row1 col1/col2 and row2 col1/col2, CSS grid auto-placement drops this
   6th item straight into row3's empty right-hand cell for free, no
   explicit grid-column/row needed. This override only applies to that
   specific instance (.tunnel-3tile-ok-row--font); the Overall/Social/Email
   panels' OK rows keep their original centered-below-content layout. */
/* Per Dave (this round): centered OK button below "Send Me PDF" that does
   the same thing the bottom Next button does. Sits inside the same
   `.tunnel-3tiles-row2` flex-wrap container as Email/the caption/the PDF
   tile itself (see that rule's own "order" comments above) - needs the
   same `flex:1 1 100%` full-width-forcing trick so it lands on its own
   centered line instead of trying to squeeze onto the PDF button's row,
   and `order:5` to land right after the PDF tile (order:4). */
.tunnel-3tile-ok-row--pdf {
  flex: 1 1 100%;
  order: 5;
}

.tunnel-3tile-ok-row--font {
  /* SUPERSEDED (this round), per Dave: added a 6th font option (Jost - see
     FONT_OPTIONS in tunnel.js), which fills the grid's previously-empty
     row-3/col-2 cell that the rules below used to dock this button into
     ("underneath Robo"). With all 6 cells now genuinely occupied by real
     font pills, this row (the grid's 7th/last child) auto-places into a
     brand-new row-4 spanning col-1 only, floating small and left-aligned
     under Barlow - not what Dave asked for. Fix: explicitly span both grid
     columns (grid-column: 1 / -1) so this becomes its own full-width row
     below all 6 font pills, then center its content on both axes - "move
     the OK button to below the six options, centered." No media query
     here (same as the rest of this rule's history), so this applies
     identically on mobile and desktop, as asked. */
  grid-column: 1 / -1;
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 6px;
  /* Keeps the round-44 fix (see .tunnel-3tile-ok-row comment below) intact:
     this is still effectively the last visible element in the Font Changes
     panel's scroll content, so it still needs real bottom margin to clear
     the gray .tunnel-bottom band once scrolled all the way down. */
  margin-bottom: 32px;
}

.tunnel-3tile-ok {
  appearance: none;
  border: none;
  background: var(--tunnel-teal-bg);
  color: #ffffff;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: .03em;
  padding: 10px 28px;
  border-radius: 999px;
  cursor: pointer;
  transition: filter .18s ease;
}
.tunnel-3tile-ok:hover {
  filter: brightness(.9);
}
/* Logo Design panel's OK button (item 1, this round): stays visible but
   ghosted/inert until the client has provided some logo direction (notes
   text or an uploaded file) - see the 'logo' category's buildDetail in
   tunnel.js. Matches the same ghosted-disabled treatment used on the main
   .tunnel-nav__btn--next below. */
.tunnel-3tile-ok:disabled {
  opacity: .4;
  cursor: not-allowed;
  pointer-events: none;
}
/* Per Dave (this round): "make the OK buttons throbbing similar to the
   Start button and Next buttons, wherever it appears, mobile and desktop."
   Covers every .tunnel-3tile-ok instance (Overall/Font/Social/Email tiles,
   and the Logo Design panel's OK, which reuses this same class - see its
   disabled rule just above) - reuses the exact same stronger keyframe
   already given to Start/Next (tunnelNavBtnPulse, see that rule's own
   comment for why it's a separate keyframe from the Secure Checkout/"Check
   Site for Changes" pulse). No media query here, so this applies to both
   mobile and desktop identically, as asked. :not(:disabled) so the Logo
   Design OK button only pulses once it's actually clickable, matching how
   Next's own pulse already behaves. */
.tunnel-3tile-ok:not(:disabled) {
  animation: tunnelNavBtnPulse 2.2s ease-in-out infinite;
}

/* Font Changes tile: real font options (see FONT_OPTIONS in tunnel.js).
   Per Dave (round 41+): replaced the old big 2-col card grid with a
   stacked single-column list of compact, regular-sized PILL buttons
   (name only, sized/shaped like the pill convention already used
   elsewhere in the tunnel - see .tunnel-social-chip's border-radius:999px
   pill above) + caption text below each row + a small round magnifying-
   glass button to the pill's right that opens the preview popup. The pill
   is the ONLY selection control; the round button is a separate click
   target. Per Dave: CRITICAL - unlike the stock picker (dark background,
   light text), this must render on THIS card's white background, so every
   label here uses dark ink explicitly rather than inheriting/reusing the
   stock .font-choice-* colors (scoped for a dark background and never
   applicable here in the first place). */
/* Per Dave (round 52+, item 5): "just stack this into two columns and make
   the buttons slightly smaller" - switched from a single-column flex list
   to a 2-column CSS grid (2 font rows per line; 5 fonts wrap 2+2+1), each
   font's pill+magnifying-glass+caption group staying together as one grid
   cell. */
.tunnel-font-list {
  display: grid;
  grid-template-columns: 1fr 1fr;
  /* Fix (this round), per Dave: with the always-visible caption line gone
     (now a hover tooltip - see .tunnel-font-row__caption's removal note
     below), each row is just one control line instead of two, so the old
     14px row-gap (tuned for two-line rows) reads as excess air between
     single-line rows now - trimmed to 10px to reclaim some of the "more
     vert real estate" this whole fix was about. */
  gap: 10px 16px;
}

.tunnel-font-row {
  display: flex;
  flex-direction: column;
}

.tunnel-font-row__controls {
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Pill button: same regular pill sizing/shape convention as
   .tunnel-social-chip (border-radius:999px) - contains ONLY the font
   name, rendered in that font's own stack (style="font-family:..." set
   inline per-option in tunnel.js) for a live preview-of-the-name effect. */
.tunnel-font-pill {
  position: relative;
  appearance: none;
  display: inline-flex;
  align-items: center;
  /* Item 6 (this round): "when selected, I want the checkmark to be on the
     RIGHT side of the word so the word doesn't have to jump to the middle
     to make room for the checkmark - the word stays the same [position]."
     Root cause: the checkmark span used to be the FIRST child in the DOM
     (before the name span, see the pill's markup in tunnel.js), so going
     from display:none to display:flex on select inserted 15px+8px of new
     content BEFORE the name, shoving it rightward. Swapped the markup order
     (name first, check second) so the name's own start position never
     moves - only content appended AFTER it can appear/disappear. Paired
     with justify-content:space-between (instead of the old implicit
     flex-start) so, once selected, the checkmark uses this pill's existing
     min-width floor to sit flush against the pill's right edge rather than
     just hugging the name with a small gap - reads clearly as "on the right
     side of the pill", not merely "after the word". */
  justify-content: space-between;
  gap: 8px;
  text-align: left;
  border: 1.5px solid rgba(28,36,42,.16);
  background: #ffffff;
  color: var(--ink);
  /* Fix (this round), per Dave: "these need to be real pill boxes not
     squares with rounded corners." REVERTS a prior round's change - a
     10px rounded-rect radius was tried per an earlier "seems very fat"
     complaint, but Dave's actual ask there was about the pill's HEIGHT/
     padding (already trimmed 8px/15px -> 7px/14px, kept as-is below), not
     its shape - back to a true fully-rounded 999px pill. */
  border-radius: 999px;
  padding: 7px 14px;
  cursor: pointer;
  transition: all .22s ease;
  flex: 0 0 auto;
  min-width: 130px;
}
/* Per Dave (round 36+, carried forward): the selected/hovered pill gets the
   same bold solid-teal + white-text treatment already established for
   care/payment tiles and the social chips elsewhere in this file - hover on
   an UNSELECTED pill previews the identical solid look a selected pill
   gets, not a lighter/faded version of it. */
.tunnel-font-pill:hover,
.tunnel-font-pill.is-selected {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
}
.tunnel-font-pill:hover .tunnel-font-pill__name,
.tunnel-font-pill.is-selected .tunnel-font-pill__name {
  color: #ffffff !important;
}

.tunnel-font-pill__check {
  display: none;
  align-items: center;
  justify-content: center;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  /* White circle + teal check, same as the old card badge, sized down to
     sit inline inside the pill next to the font name. */
  background: #ffffff;
  color: var(--tunnel-teal);
  flex: 0 0 auto;
}
.tunnel-font-pill__check svg {
  width: 9px;
  height: 9px;
}
.tunnel-font-pill.is-selected .tunnel-font-pill__check {
  display: flex;
}

.tunnel-font-pill__name {
  font-weight: 700;
  /* Per Dave (round 52+, item 5): trimmed in step with the pill's smaller
     padding above (15px -> 13px, ~13% smaller).
     Per Dave (this round): "the words that explain the font are too small
     on mobile and desktop" - bumped back up ~30% (13px -> 17px). This rule
     has no media query/breakpoint of its own, so it already applies to
     both mobile and desktop identically - one change covers both, exactly
     as asked. */
  font-size: 17px;
  color: var(--ink) !important;
  transition: color .22s ease;
}
/* Per Dave (this round): "Barlow feels too heavy there, make it less heavy
   weight." Every other font name in this list renders at this pill's
   shared 700 weight using ITS OWN typeface (Helvetica at 700, Garamond at
   700, etc.) - only Barlow Condensed visually reads as noticeably
   heavier/denser than the others at the same numeric weight, since
   condensed faces pack more ink into the same footprint. Scoped to just
   this one font option rather than lowering the shared 700 for everyone
   else. 500 matches the weight already used for Barlow Condensed's own
   live preview button elsewhere on this page (see index.html's
   data-font-weight="500" on its Preview button) - already loaded (see the
   Barlow+Condensed:wght@400;500;600;700 Google Fonts link in index.html),
   so no extra font weight needs fetching. */
.tunnel-font-pill[data-font-option="Barlow Condensed"] .tunnel-font-pill__name {
  font-weight: 500;
}
/* Per Dave (this round): "the Jost and Montserrat examples here... super
   heavy... should be maybe medium weight" - same exact situation as the
   Barlow Condensed fix directly above (a typeface that reads noticeably
   bolder than the others at this pill's shared 700 weight). No media
   query/breakpoint on either rule, so both apply identically on mobile and
   desktop, as asked. 500 ("Medium") matches the same numeric weight used
   for Barlow's fix above and is already loaded for both (Jost:wght@...500
   and Montserrat:wght@...500 are both in the Google Fonts <link> in
   index.html), so no extra font weight needs fetching. */
.tunnel-font-pill[data-font-option="Jost"] .tunnel-font-pill__name,
.tunnel-font-pill[data-font-option="Montserrat"] .tunnel-font-pill__name {
  font-weight: 500;
}
/* Added (this round), per Dave: 8th font option - "Inter Light" (weight
   300). Same pattern as the two fixes above - the pill's shared 700
   default would render "Light" as heavy/bold, which is the opposite of
   the point. 300 matches Inter:wght@300, already loaded in index.html's
   Google Fonts <link>, so no extra font weight needs fetching. */
.tunnel-font-pill[data-font-option="Inter"] .tunnel-font-pill__name {
  font-weight: 300;
}

/* Round magnifying-glass preview button, immediately to the pill's right -
   a separate click target from the pill (opens #fontExampleModal for that
   row's font; does not select it). Reuses the same stroke-based search/
   magnifying-glass icon markup as the real site header's #searchToggle
   (see landingpage-template/index.html), not a new invented icon. */
.tunnel-font-preview-btn {
  appearance: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Per Dave (round 52+, item 5): "make the buttons slightly smaller" -
     diameter trimmed ~12.5% (32px -> 28px). */
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1.5px solid rgba(28,36,42,.16);
  background: #ffffff;
  color: var(--ink);
  cursor: pointer;
  transition: all .22s ease;
  flex: 0 0 auto;
  padding: 0;
}
.tunnel-font-preview-btn svg {
  width: 13px;
  height: 13px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.tunnel-font-preview-btn:hover {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* .tunnel-font-row__caption removed (this round), per Dave: the
   always-visible caption sentence under each font pill now lives as a
   hover tooltip on the pill itself instead (data-tooltip in tunnel.js) -
   "to give us more vert real estate." No rule needed here anymore. */

/* Social Media tile: real status options + real 8-platform toggle grid
   (see SOCIAL_STATUS_OPTIONS/SOCIAL_PLATFORMS in tunnel.js). */
.tunnel-social-status {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  /* ROUND 30: trimmed 16px -> 10px, part of tightening this panel's overall
     vertical rhythm so the 8-platform grid + OK button fit within the mid
     band without needing to scroll - see .tunnel-social-url comment above
     for the main fix. */
  margin-bottom: 10px;
}

/* Latest round, item 3, per Dave: "can these two buttons fit side-by-side,
   not stacked, to help with the real estate problem?" There are only ever
   exactly 2 SOCIAL_STATUS_OPTIONS (see tunnel.js), but each has a long
   sentence-length label ("Don't include social media links" / "No change
   to proposed social media links"), so the plain flex-wrap row above wraps
   them onto 2 stacked lines once both can't fit on one line at their
   natural content width. Forced into a real 2-column grid instead - each
   pill fills its own half-width column and wraps its OWN text across 2
   lines internally (white-space stays the default `normal`, never set to
   nowrap) rather than the whole button wrapping to a new row. */
.tunnel-social-status:has(.tunnel-social-status-btn) {
  display: grid;
  grid-template-columns: 1fr 1fr;
}

.tunnel-social-status-btn {
  appearance: none;
  border: 1.5px solid rgba(28,36,42,.16);
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 11px;
  font-weight: 600;
  padding: 7px 14px;
  border-radius: 999px;
  cursor: pointer;
  transition: all .22s ease;
  /* Part of the item 3 side-by-side fix above: text-align left + normal
     line-height reads better than centered when a pill's long label wraps
     to 2 lines inside its now half-width grid column. */
  text-align: left;
  line-height: 1.35;
}
.tunnel-social-status-btn:hover {
  border-color: var(--tunnel-teal-bg);
}
.tunnel-social-status-btn.is-selected {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* ROUND 30 - per Dave: the 8 platform rows (Facebook/Instagram/LinkedIn/
   X/YouTube/TikTok/Yelp/Google Business) stacked in a single tall column
   pushed the OK button down near/behind the bottom gray band. Switched to a
   2-column grid (4 rows of 2) so the whole section is roughly half as tall.
   Each .tunnel-social-row already has flex-wrap:wrap (below) - when a row
   is active and its URL input appears, if the chip + input can't both fit
   in one ~half-width column they simply wrap onto their own line within
   that same cell rather than overflowing, so nothing gets cramped. */
.tunnel-social-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 8px 14px;
  transition: opacity .2s ease;
}
.tunnel-social-grid.is-disabled {
  opacity: .35;
  pointer-events: none;
}

.tunnel-social-row {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  min-width: 0;
}

.tunnel-social-chip {
  appearance: none;
  display: flex;
  align-items: center;
  gap: 8px;
  border: 1.5px solid rgba(28,36,42,.16);
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
  font-weight: 600;
  padding: 7px 13px;
  border-radius: 999px;
  cursor: pointer;
  transition: all .22s ease;
  flex: 0 0 auto;
  min-width: 152px;
}
.tunnel-social-chip:hover {
  border-color: var(--tunnel-teal-bg);
}
.tunnel-social-chip.is-selected {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

.tunnel-social-chip__icon {
  display: inline-flex;
  width: 15px;
  height: 15px;
  color: var(--muted);
  flex: 0 0 auto;
}
.tunnel-social-chip__icon svg {
  width: 100%;
  height: 100%;
  fill: currentColor;
}
.tunnel-social-chip.is-selected .tunnel-social-chip__icon {
  color: #ffffff;
}

/* ROUND 30: was `flex:1 1 auto; min-width:160px` UNCONDITIONALLY (only
   opacity/pointer-events toggled between inactive/active) - since opacity:0
   still occupies real layout space, every row reserved a full 160px-wide
   invisible input at all times. In the new 2-column grid (each column only
   ~215px wide) chip(152px) + gap(10px) + that permanently-reserved 160px
   input couldn't fit on one line, so EVERY row - even collapsed/inactive
   ones - was forced to flex-wrap onto a second line, nearly doubling the
   whole grid's height and pushing the OK button down toward the bottom
   band, the opposite of the compact 2-column layout this round intended.
   Fixed by actually collapsing the inactive input to zero width/padding
   (not just invisible) so an inactive row is just its one-line chip; only
   `.is-active` (below) restores the real flexible/min-width sizing so the
   input can grow and show real placeholder/typed text once a platform is
   toggled on. */
.tunnel-social-url {
  flex: 0 0 0;
  width: 0;
  min-width: 0;
  box-sizing: border-box;
  border: 0;
  border-radius: 8px;
  padding: 8px 0;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
  opacity: 0;
  pointer-events: none;
  overflow: hidden;
  transition: opacity .2s ease, flex-basis .2s ease, width .2s ease;
}
.tunnel-social-row.is-active .tunnel-social-url {
  flex: 1 1 auto;
  min-width: 160px;
  width: auto;
  border: 1px solid rgba(28,36,42,.16);
  padding: 8px 10px;
  opacity: 1;
  pointer-events: auto;
}
.tunnel-social-url:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}
/* ============================================================ */

/* ---- Email tile (4th tile in the Website Changes row) ----
   First pass per Dave, round 65+: reuses the same "pill + caption below"
   choice pattern already established for the Care/Payment slides
   (.tunnel-choice/.tunnel-payment-option/.tunnel-payment-caption above),
   just with only 2 options and no price on the pill. Selecting either
   option reveals a repeatable list of plain email inputs below - built
   fresh for this tile since no equivalent list-of-fields control exists
   elsewhere in the tunnel to reuse. Not pixel-polished yet - functional
   first pass, to be refined per Dave's follow-up notes. */
.tunnel-email-choices {
  max-width: 360px;
}

.tunnel-email-choice {
  border-radius: 999px;
  padding: 12px 20px;
  text-align: center;
}

.tunnel-email-addresses {
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  margin-top: 0;
  transition: max-height .35s var(--tunnel-ease), opacity .3s ease, margin-top .35s var(--tunnel-ease);
}

.tunnel-email-addresses.is-visible {
  max-height: 480px;
  opacity: 1;
  margin-top: 18px;
}

.tunnel-email-rows {
  display: grid;
  gap: 10px;
  margin-bottom: 12px;
}

/* Per Dave (this round): each email row now also carries a "Use email
   for..." dropdown (and, for "Other", a follow-up free-text field) - the
   row is now a small column (main input/select/remove line, plus the
   optional Other field below it) instead of a single flex line. */
.tunnel-email-row {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.tunnel-email-row__main {
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Per Dave (this round): wrapped .tunnel-email-input in a <form> (see
   tunnel.js) purely so Chrome recognizes it as a real, committable
   autofill target - clicking a saved-email suggestion was silently not
   populating the field. display:contents makes the <form> invisible to
   this flex row's layout, so the input still sizes/positions exactly as
   before (flex:1 1 auto below, same as always) with no visual change. */
.tunnel-email-input-form {
  display: contents;
}
.tunnel-email-input {
  flex: 1 1 auto;
  min-width: 0;
  box-sizing: border-box;
  padding: 10px 12px;
  border: 1px solid rgba(28,36,42,.16);
  border-radius: 10px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
}
.tunnel-email-input:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}
/* Gibberish-address guard (e.g. "hjfhj"): OK button ghosts via
   .tunnel-3tile-ok:disabled (already defined) until every row is either a
   real-shaped address or removed - this just marks the offending row. */
.tunnel-email-input.is-invalid {
  border-color: #c0392b;
  background: rgba(192,57,43,.05);
}
.tunnel-email-input.is-invalid:focus {
  border-color: #c0392b;
}
.tunnel-email-row__error {
  color: #c0392b;
  font-size: 12px;
  margin: -2px 0 0;
}
.tunnel-email-input::placeholder {
  color: rgba(28,36,42,.36);
}

/* "Use email for..." dropdown, sits to the right of the address input on
   desktop (see the mobile override further down, which stacks it below
   instead - a native <select> at this width reads too cramped alongside a
   full email address on a phone). Plain native <select> rather than a
   custom-built dropdown - simplest, most reliable cross-device behavior
   (real OS picker on mobile, no extra JS/positioning logic to maintain)
   and it only needs 4 fixed options plus Other. */
.tunnel-email-usage {
  flex: 0 0 auto;
  width: 168px;
  box-sizing: border-box;
  padding: 10px 30px 10px 12px;
  border: 1px solid rgba(28,36,42,.16);
  border-radius: 10px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12.5px;
  cursor: pointer;
  /* Custom small chevron so it doesn't rely on each OS/browser's own
     (very inconsistent-looking) native select arrow. */
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%23818075' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 11px center;
  background-size: 10px 7px;
}
.tunnel-email-usage:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}
/* The disabled placeholder <option> ("Use email for...") reads as muted
   gray until a real choice is made, same visual language as every other
   placeholder in this tile. */
.tunnel-email-usage option[value=""] {
  color: rgba(28,36,42,.36);
}

.tunnel-email-usage-other {
  box-sizing: border-box;
  width: 100%;
  padding: 10px 12px;
  border: 1px solid rgba(28,36,42,.16);
  border-radius: 10px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
}
.tunnel-email-usage-other:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}
.tunnel-email-usage-other::placeholder {
  color: rgba(28,36,42,.36);
}

.tunnel-email-remove {
  flex: 0 0 auto;
  appearance: none;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1px solid rgba(28,36,42,.18);
  background: #ffffff;
  color: var(--muted);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  transition: all .18s ease;
}
.tunnel-email-remove:hover {
  border-color: #c0392b;
  color: #c0392b;
  background: rgba(192,57,43,.06);
}

.tunnel-email-add-btn {
  appearance: none;
  border: 1.5px dashed rgba(28,36,42,.22);
  background: transparent;
  color: var(--tunnel-teal-bg);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 600;
  font-size: 12px;
  padding: 9px 16px;
  border-radius: 999px;
  cursor: pointer;
  transition: all .18s ease;
}
.tunnel-email-add-btn:hover {
  border-color: var(--tunnel-teal-bg);
  background: rgba(126,49,135,.08);
}
/* Per Dave (mobile only): the "Use email for..." dropdown added this round
   sits to the RIGHT of the address input on desktop (see .tunnel-email-usage
   above), but a fixed-width select next to a full email address plus the
   remove "x" doesn't have room to breathe on a phone. Wraps the select
   (and remove button) onto their own line below the address input instead
   - same real elements/values, just stacked - rather than shrinking the
   dropdown down to an illegibly narrow width to force everything onto one
   line. Desktop is completely untouched (no change to the base rule). */
@media (max-width: 767px) {
  .tunnel-email-row__main {
    flex-wrap: wrap;
  }
  .tunnel-email-input {
    flex-basis: 100%;
  }
  .tunnel-email-usage {
    flex: 1 1 auto;
    width: auto;
  }
}
/* ============================================================ */

/* Shared checkmark badge: same gold-filled circle glyph used by
   .tunnel-info-card__check on the intro slide, reused here (and anywhere
   else a detail heading needs a "confirmed/included" checkmark) so both
   draw from one visual definition instead of duplicating it. */
.tunnel-info-card__check,
.tunnel-detail__check {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: var(--gold);
  color: #fff;
}
.tunnel-info-card__check svg,
.tunnel-detail__check svg {
  width: 12px;
  height: 12px;
}

/* Page quantity stepper. Per Dave (round 14): restore the pill-box-with-
   clear-background treatment this control had in an earlier round - wraps
   the -/value/+ row in a rounded pill with a transparent/clear fill and a
   thin border, rather than floating unboxed on the card. */
/* Per Dave (round 18): the pill+circle stepper read as too big/dominant on
   the page-count slide. Sized every dimension (circle diameter, font sizes,
   pill padding/gap) down proportionally so it reads as a compact, secondary
   control - still comfortably clickable, just no longer the loudest thing
   on the card. */
.tunnel-stepper {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 6px 14px;
  border-radius: 999px;
  border: 1.5px solid rgba(28,36,42,.18);
  background: transparent;
}

.tunnel-stepper__btn {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: 1.5px solid var(--line);
  background: rgba(255,255,255,.04);
  color: var(--ink);
  font-size: 15px;
  cursor: pointer;
  /* Per Dave (this round): a touch of the "spatial stepper" tactile feel
     from his reference - a soft resting shadow that lifts the button off
     the pill slightly, and a quick scale-down on press so tapping +/-
     reads as a real physical push, not just a color change. */
  box-shadow: 0 1px 3px rgba(28,36,42,.1);
  transition: border-color .2s ease, background .2s ease, box-shadow .2s ease, transform .12s ease;
}
.tunnel-stepper__btn:hover { border-color: var(--gold); background: rgba(94,115,135,.16); }
.tunnel-stepper__btn:active { transform: scale(.88); box-shadow: 0 1px 1px rgba(28,36,42,.08); }

/* Fixed-height mask the animated digit rolls inside of - per Dave's "Spatial
   Stepper" VisionOS reference (dribbble.com/shots/24533778): tapping +/-
   should animate the number changing, not just snap to the new value. See
   animateStepperDigit() in tunnel.js for the actual roll: the old digit
   slides out one row-height in the direction of travel while fading, the
   new one slides in from the opposite edge and fades in - this element just
   needs a fixed height + overflow:hidden so that motion is clipped to a
   single-digit-tall window instead of spilling over neighboring text.
   NOTE (honest disclosure): I couldn't load the actual Dribbble page content
   in this session (fetch came back empty), so this is a best-guess build
   from the shot's title/genre - a rolling-digit "odometer" style transition,
   which is the most common effect that name/reference points to. Flag it if
   this doesn't match what you saw - happy to retune the motion once I can
   see it (a screenshot or short screen recording of the shot would do it). */
.tunnel-stepper__value {
  position: relative;
  display: inline-block;
  min-width: 44px;
  height: 24px;
  overflow: hidden;
  text-align: center;
  font-size: 18px;
  font-weight: 700;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
}
.tunnel-stepper__value-digit {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  line-height: 24px;
  will-change: transform, opacity;
}

.tunnel-stepper__note {
  color: var(--muted);
  font-size: 13px;
  margin-left: 4px;
}

/* Round 31, item 2 (BUILD): the "Additional Pages" OK button sits directly
   beside the stepper pill (per Dave: "an OK button positioned to the right
   of/next to the counter") and locks the chosen count in, kicking off the
   sequential per-page content flow below. Styled as a small solid-teal
   pill matching the tunnel's other primary actions, distinct from the
   stepper's own plain outline treatment so it reads as the confirming
   action, not another counter control. */
.tunnel-pages-count-row {
  display: flex;
  align-items: center;
  gap: 14px;
  flex-wrap: wrap;
}

/* Item 6 (per Dave): once a page count is locked in via OK, the whole
   count-selection block (header/subtext/stepper/OK - all wrapped in
   [data-pages-setup] in tunnel.js) collapses away entirely so the per-page
   flow below moves up and reclaims that vertical space. display:none
   (not just opacity/height) so it also stops taking up any layout space -
   only the top-level "Additional Pages" eyebrow (outside this component)
   remains visible above the flow at that point. */
.tunnel-pages-setup.is-collapsed {
  display: none;
}

/* The real per-page header ("Page N of X") that takes over from the
   collapsed setup block above - reuses .tunnel-card__question wholesale
   (same bold/dark/header-size treatment as every other slide's main
   question) rather than the old small muted eyebrow style, per Dave's
   explicit "front and center" ask for this header too. Hidden until a
   count is actually locked in (see is-hidden toggle in tunnel.js). */
.tunnel-page-panel__header {
  margin-top: 6px;
}
.tunnel-page-panel__header.is-hidden {
  display: none;
}
.tunnel-page-panel__header-row.is-hidden {
  display: none;
}

.tunnel-pages-ok {
  appearance: none;
  border: 1.5px solid var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
  font-weight: 650;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 8px 20px;
  border-radius: 999px;
  cursor: pointer;
  transition: filter .18s ease;
}
.tunnel-pages-ok:hover,
.tunnel-pages-ok:focus-visible {
  filter: brightness(.92);
}
/* Per Dave (this round): "make the OK buttons throbbing similar to the
   Start button and Next buttons, wherever it appears, mobile and desktop."
   This is the Additional Pages per-page-count OK button - same shared
   pulse as .tunnel-3tile-ok above, no disabled state on this particular
   button (always clickable once rendered), so no :not(:disabled) guard
   needed here. */
.tunnel-pages-ok {
  animation: tunnelNavBtnPulse 2.2s ease-in-out infinite;
}

/* The per-page panel (upload + description field) rendered ONE PAGE AT A
   TIME inside this same card after OK is pressed - never a new slide, per
   Dave's spec. Reuses the same .file-field drag-and-drop pattern already
   used on the Logo Design slide (bindFileFieldDragDrop in tunnel.js) for
   the upload control, and a plain text input for the "what do you want on
   this page" fill-in-the-blank. */
.tunnel-pages-flow {
  margin-top: 4px;
  max-height: 0;
  overflow: hidden;
  opacity: 0;
  transition: opacity .25s ease;
}
.tunnel-pages-flow.is-visible {
  /* Round 40, item 4: per Dave, a tall multi-page form (title dropdown +
     content field + upload + Next/Done button, per page, one page shown at
     a time but the panel itself is already tall on its own) is a legitimate
     exception to the tunnel's normal "no page-level scroll" rule - it needs
     SOME way to reach every field and the trailing Next/Done button rather
     than silently clipping. Bounded to a fixed max-height (sized to
     comfortably fit within the white .tunnel-mid band alongside the "How
     many pages?" header/stepper above it, verified at a 900px-tall
     viewport with 5 pages) with its own overflow-y:auto and a subtle
     visible scrollbar - a self-contained scroll region for just this
     stack, not the whole tunnel page.
     LATEST ROUND, ITEM 6, per Dave: that fixed cap left a real dead white
     gap between this scroll window's bottom edge and the gray
     .tunnel-bottom band below it, even though there was visible empty
     space there before the gray bar started - "that window needs to
     extend all the way down... basically touching the top of that bottom
     gray bar." A fixed/viewport-relative value can't express that (the
     available space varies with the top/bottom bands' own sizing and this
     panel's own header height above it), so sizeFlushScrollAreas() in
     tunnel.js now measures the real live gap to .tunnel-bottom's top edge
     and applies it as an inline max-height (element has
     [data-flush-scroll] - see that function) which overrides this value.
     This CSS max-height is now only the pre-JS-measurement fallback for
     the very first paint. */
  max-height: min(320px, 36vh);
  overflow-y: auto;
  overflow-x: hidden;
  opacity: 1;
  margin-top: 16px;
  padding-right: 8px;
  /* Fix (round 44+): per Dave - scrolled all the way down, the trailing
     Next/Done button was landing flush against the bottom edge of this
     panel's own scroll boundary with zero breathing room. Bottom padding
     inside the scrollable region itself (not just a margin on the last
     child) guarantees real clearance no matter what the last field is. */
  padding-bottom: 28px;
  scrollbar-width: thin;
  scrollbar-color: rgba(28,36,42,.35) transparent;
}
.tunnel-pages-flow.is-visible::-webkit-scrollbar {
  width: 6px;
}
.tunnel-pages-flow.is-visible::-webkit-scrollbar-track {
  background: transparent;
}
.tunnel-pages-flow.is-visible::-webkit-scrollbar-thumb {
  background: rgba(28,36,42,.32);
  border-radius: 999px;
}

/* Per Dave (round 36+): "I don't think I want this half a box behind the
   page one of one... I think I want that to be floating without a box" -
   dropped the card/border/tint background so this panel's content floats
   directly on the white tunnel background like every other slide's
   content, matching the "no boxes" rule already applied elsewhere in this
   file (see .tunnel-card's own "no boxes within boxes" note above). Kept
   as a plain grid for spacing only. */
.tunnel-page-panel {
  display: grid;
  gap: 12px;
  padding: 0;
  border: none;
  border-radius: 0;
  background: transparent;
  /* Same align-content fix as .tunnel-care-access__flow above - this grid
     sits inside .tunnel-pages-flow, which also gets a forced min-height on
     a tall window; without this, the default grid stretch behavior would
     spread its rows apart the same way. */
  align-content: start;
}

/* Page-title preset dropdown (item 6) - same compact field treatment as
   the content input right below it so the two read as one cohesive small
   field group, not a redesign of the panel. */
.tunnel-page-panel__select {
  width: 100%;
  box-sizing: border-box;
  /* Fix (this round), per Dave: "they seem huge to me... could be smaller...
     the pill box shape would be nice." Shrunk 40px -> 34px and switched
     from a 10px rounded-rect to a full pill (999px), matching the same
     shape language already used for the tunnel's other small controls
     (.tunnel-yesno__btn, .tunnel-foundation-pill, etc.) instead of reading
     as a separate, heavier form-field style. Paired 1:1 with
     .tunnel-page-panel__input below so both field types in this grid stay
     visually identical. */
  height: 34px;
  padding: 0 16px;
  border: 1px solid rgba(28,36,42,.24);
  border-radius: 999px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
  cursor: pointer;
}
.tunnel-page-panel__select:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}

.tunnel-page-panel__title-other {
  margin-top: 8px;
}
.tunnel-page-panel__title-other.is-hidden {
  display: none;
}

.tunnel-page-panel__label {
  margin: 0;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Per Dave: field sub-header labels reduced 700 -> 600 site-wide, see
     .tunnel-3row__label above. */
  font-weight: 600;
  font-size: 13px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--tunnel-teal);
}

.tunnel-page-panel__field {
  display: grid;
  gap: 6px;
}
.tunnel-page-panel__field > span:first-child {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 600;
  font-size: 13px;
  color: var(--ink);
}

.tunnel-page-panel__input {
  width: 100%;
  box-sizing: border-box;
  /* Fix (this round), per Dave: same pill-shape/shrink treatment as
     .tunnel-page-panel__select above - see that rule's comment. */
  height: 34px;
  padding: 0 16px;
  border: 1px solid rgba(28,36,42,.24);
  border-radius: 999px;
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
}
.tunnel-page-panel__input:focus {
  outline: none;
  border-color: var(--tunnel-teal-bg);
}
.tunnel-page-panel__input::placeholder {
  color: rgba(28,36,42,.4);
}

/* Per Dave: the "What content do you want on this page?" field is meant for
   pasting in chunks of real page copy, so a single 40px input row was too
   cramped to work with comfortably. Converted to a <textarea> in tunnel.js
   (data-page-notes) and given its own class here so it can grow to ~5 rows
   (~130px) of visible height while every other .tunnel-page-panel__input
   field (title, summary) stays a normal 40px single-line input. This lives
   inside the Additional Pages stack's own bounded max-height/overflow-y:auto
   scroll container (see round-earlier fix ~line 2600) - a taller textarea per
   page just adds more scrollable content within that same container, it
   doesn't change the container's scroll behavior. */
.tunnel-page-panel__textarea {
  height: auto;
  /* Reduced by ~1/3 per Dave (130px -> 85px), then halved again this round
     (85px -> 42px, rows="5" -> "3" in tunnel.js alongside this) per Dave:
     "make this field half as tall as you have it now." */
  min-height: 42px;
  padding: 10px 12px;
  line-height: 1.45;
  resize: vertical;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* FIX (this round), per Dave: "a big blown up pill shape that's obviously
     ridiculous." Root cause: the pill-shape fix a round ago set
     border-radius:999px on the shared .tunnel-page-panel__input class this
     textarea also carries - fine for a short single-line 34px field (999px
     just rounds it into a normal pill), but on an 85px+ TALL multi-line
     textarea, border-radius:999px means the corner radius tries to be half
     the box's own height, producing the huge stretched-capsule shape in
     Dave's screenshot. This textarea never should have inherited that
     value - reset back to a normal, modest rounded-rect radius. */
  border-radius: 12px;
}

/* Per Dave (this round), desktop only: "make this fill in the blank field
   about 30% shorter" - specifically the "What content do you want on this
   page?" textarea (data-page-notes), not the shared class's OTHER use
   (the Access Notes / no passwords field on the Website Access panel,
   which wasn't part of this ask and stays at the base 85px). 85px * 0.7 =
   ~60px. Scoped to min-width:768px so mobile (which shares the same base
   rule) is untouched. */
@media (min-width: 768px) {
  textarea[data-page-notes].tunnel-page-panel__textarea {
    /* Halved again this round per Dave: "make this field half as tall as
       you have it now" (60px -> 30px). */
    min-height: 30px;
  }
}

.tunnel-page-panel__upload > span:first-child {
  display: block;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 600;
  font-size: 13px;
  color: var(--ink);
  margin-bottom: 6px;
}

.tunnel-page-panel__next {
  justify-self: start;
  appearance: none;
  border: 1.5px solid var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
  font-weight: 650;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 9px 20px;
  border-radius: 999px;
  cursor: pointer;
  transition: filter .18s ease;
}
.tunnel-page-panel__next:hover,
.tunnel-page-panel__next:focus-visible {
  filter: brightness(.92);
}

/* Choice tiles (used for monthly care sub-options and payment plan) */
.tunnel-choices {
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
}

.tunnel-choice {
  text-align: left;
  appearance: none;
  border: 1.5px solid rgba(28,36,42,.16);
  background: #ffffff;
  color: var(--ink);
  border-radius: 14px;
  padding: 11px 14px;
  cursor: pointer;
  transition: all .22s ease;
  display: flex;
  flex-direction: column;
  gap: 3px;
}

/* Per Dave (round 12): the 3 care-tier tiles stack in a single column (not
   a 2-col grid) so the hover tooltip has clean room to the right with no
   overlap-with-neighbor problem. Per Dave (round 13): the Payment Plan
   tiles now get this exact same treatment, so this is no longer scoped to
   only the care-tier group - it applies to both .tunnel-care-choice and
   .tunnel-payment-choice groups. Padding/gap tightened slightly since
   stacking rows instead of a 2x2 grid makes the group taller. */
.tunnel-choices:has(.tunnel-care-choice),
.tunnel-choices:has(.tunnel-payment-choice) {
  grid-template-columns: 1fr;
  gap: 8px;
  /* Capped narrower than the full card width (rather than stretching edge
     to edge) so the single stacked column leaves real room on its right for
     the hover tooltip to land in. Note: the surrounding .tunnel-detail
     panel keeps overflow:hidden (needed for its collapse/expand animation
     when the yes/no answer toggles), so the tooltip is clipped at
     .tunnel-detail's own right edge, not the viewport edge - this width
     must leave enough room inside that boundary for the full tooltip
     (230px + 14px gap + its own 14px side padding) to render unclipped. */
  max-width: 280px;
}

.tunnel-choices:has(.tunnel-care-choice) .tunnel-choice,
.tunnel-choices:has(.tunnel-payment-choice) .tunnel-choice {
  padding: 9px 14px;
}

/* Per Dave (latest round, item 3): Care tiles restructured into the same
   "pill + caption below" pattern as the Payment slide's options (see
   .tunnel-payment-option/.tunnel-payment-caption above), but with the price
   living INSIDE the pill on the right (fixed values, unlike Payment's
   dynamic total) instead of in the caption. Overrides the shared
   .tunnel-choice column layout (flex-direction:column) with a row layout so
   the plan name (<strong>, left) and price (<b>, right) sit on one line,
   space-between. The plain-gray description now lives entirely outside this
   button in .tunnel-payment-caption (see the 'care' category's buildDetail()
   in tunnel.js), so it's correctly NOT white-on-color when the pill is
   selected/hovered - only the name/price inside the button flip to white via
   the existing .tunnel-care-choice.is-selected/:hover strong,b rule below. */
.tunnel-choices:has(.tunnel-care-choice) .tunnel-care-choice {
  border-radius: 999px;
  padding: 12px 20px;
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
}

.tunnel-care-choice strong {
  font-size: 14px;
}

.tunnel-care-choice b {
  font-size: 14px;
  font-weight: 700;
  white-space: nowrap;
}

/* The pill+caption column needs a little more room than the old 280px cap
   (set back when tiles only held a single short label) now that each pill
   holds both the plan name and price on one line. The hover tooltip is a
   position:fixed element appended straight to <body> (see
   bindHoverTooltips() in tunnel.js), not clipped by this column's own width,
   so widening this doesn't reintroduce the old tooltip-clipping problem the
   280px cap was originally guarding against. */
.tunnel-choices:has(.tunnel-care-choice) {
  max-width: 320px;
}

.tunnel-choice:hover {
  border-color: var(--gold);
  background: rgba(94,115,135,.08);
}

.tunnel-choice.is-selected {
  border-color: var(--gold);
  background: rgba(94,115,135,.22);
  /* Per Dave: no shadow on choice tiles, selected or not - flat and clean. */
}

.tunnel-choice strong {
  font-size: 15px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
}

/* ---- Care & Payment Plan choice tiles: selected state + hover tooltip ----
   Per Dave (round 12): the SELECTED tile on the 3-tile care-level chooser
   should be a solid teal fill (reusing --tunnel-teal) with no outline/
   border and ALL its text in white. Per Dave (round 13): the Payment Plan
   tiles (12/6/3-month/pay-in-full) now get this exact same treatment, so
   .tunnel-payment-choice is included alongside .tunnel-care-choice
   everywhere in this block rather than being excluded from it. */
.tunnel-care-choice,
.tunnel-payment-choice {
  position: relative;
}

/* Per Dave (round 23): hovering ANY care/payment tile (selected or not)
   should preview the exact same bold solid-teal + white-text look as the
   is-selected state - not the generic faded .tunnel-choice:hover treatment
   (that rule still applies to every OTHER choice group in the tunnel, just
   not these two). Grouped with :hover here so both states share one
   declaration and can never drift apart. This must come after the generic
   .tunnel-choice:hover rule above so it wins on equal specificity. */
.tunnel-care-choice.is-selected,
.tunnel-care-choice:hover,
.tunnel-payment-choice.is-selected,
.tunnel-payment-choice:hover,
/* CHANGED (2026-08-01), per Dave: "I don't like this active button color
   choice... should be just the plum solid color with white type not the
   faded gray with black type." The email-choice pills (Keep our current
   email service / Move our email to WaltersGroup) were still on the
   generic .tunnel-choice.is-selected treatment further up this file,
   which is a leftover translucent blue-gray tint (rgba(94,115,135,...) -
   a stray value never part of the beige-to-plum migration, same class of
   bug as several other stray-blue leftovers fixed elsewhere this session)
   with plain dark text. Folded into this exact same solid-fill/white-text
   group the Care and Payment tiles already use, instead of a one-off rule,
   so all three tile families share one definition and can't drift apart. */
.tunnel-email-choice.is-selected,
.tunnel-email-choice:hover {
  background: var(--tunnel-teal-bg);
  border-color: var(--tunnel-teal-bg);
  /* Per Dave: no shadow on choice tiles, selected or not - flat and clean. */
}

.tunnel-care-choice.is-selected strong,
.tunnel-care-choice.is-selected b,
.tunnel-care-choice.is-selected em,
.tunnel-care-choice:hover strong,
.tunnel-care-choice:hover b,
.tunnel-care-choice:hover em,
.tunnel-payment-choice.is-selected strong,
.tunnel-payment-choice.is-selected b,
.tunnel-payment-choice.is-selected em,
.tunnel-payment-choice:hover strong,
.tunnel-payment-choice:hover b,
.tunnel-payment-choice:hover em,
.tunnel-email-choice.is-selected strong,
.tunnel-email-choice.is-selected b,
.tunnel-email-choice.is-selected em,
.tunnel-email-choice:hover strong,
.tunnel-email-choice:hover b,
.tunnel-email-choice:hover em {
  color: #ffffff;
}

/* Per Dave (this round): "put a white checkmark on the right side of the
   pill button that is selected" - the 4 Payment Plan pills (12/6/3-month/
   pay-in-full). Overrides the base .tunnel-choice column layout (used by
   plain single-line pills elsewhere) with a row layout so the label sits
   left and the checkmark slot sits flush right, same idea as
   .tunnel-font-pill's row layout above. The checkmark itself reuses the
   exact same CHECK_SVG icon markup already used on the Font Changes pill
   (.tunnel-font-pill__check in tunnel.js) for visual consistency, but drawn
   as a plain white stroke (no circle badge) since it sits directly on the
   pill's own solid-teal selected fill rather than a white pill background -
   a white circle+teal-check badge would look out of place here. Hidden by
   default and only shown once .is-selected is present, matching the same
   show/hide-on-selection pattern used everywhere else in this file. */
.tunnel-payment-choice {
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}

.tunnel-payment-choice__check {
  display: none;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  flex: 0 0 auto;
  color: #ffffff;
}

.tunnel-payment-choice__check svg {
  width: 14px;
  height: 14px;
}

.tunnel-payment-choice.is-selected .tunnel-payment-choice__check {
  display: flex;
}

/* Descriptive tooltip/popover shown on hover (selected or not), reusing the
   same real descriptive copy already written for the care tiers in the
   stock site's plan-modal (see careTooltips in tunnel.js), plus short
   descriptive copy for each Payment Plan option (see paymentTooltips in
   tunnel.js). Per Dave (round 23): this used to be a CSS ::after
   pseudo-element positioned relative to the tile, which meant it got
   clipped at .tunnel-detail's own overflow:hidden boundary on the right
   edge instead of showing in full. It's now a single real element
   (.tunnel-hover-tooltip) appended straight to <body> and positioned with
   position:fixed from JS (bindHoverTooltips() in tunnel.js), using the
   hovered tile's live bounding box - body has no clipping ancestor, so the
   full tooltip text is always visible, never cropped, at any tile position
   or viewport width. No outline/shadow, per Dave - the tooltip text just
   floats on its light background fill. */
.tunnel-hover-tooltip {
  position: fixed;
  width: 230px;
  /* Per Dave, explicitly BOTH desktop and mobile: "I'd like the background
     color on all of these pop-ups... not white, so clean with a white
     background - a very faint gray so there's a differentiation from the
     background." Was pure #ffffff (identical to the white .tunnel-card it
     usually floats over, plus every other white surface in the tunnel) -
     switched to a very faint warm gray so it visually separates from
     whatever's behind it instead of blending in. Same change applied to
     .tunnel-faq-modal__panel below (the "Transition Questions?"/feature
     popups) - the two real info-popup surfaces in this file. */
  background: #f5f4f1;
  /* Per Dave (round 34): was var(--muted), which is the ROOT-scoped --muted
     (a light cream tone at reduced opacity meant for text on the dark
     tunnel shell - see the .tunnel-card comment above) - unreadable against
     this tooltip's white background. This element is appended straight to
     <body> (see bindHoverTooltips() in tunnel.js), OUTSIDE .tunnel-card's
     scope, so it never picks up that card's local light->dark --ink/--muted
     redefinition either. Hardcoded to the same dark ink (#1c242a, full
     opacity) used for regular body copy elsewhere in the tunnel so it's
     unambiguously legible regardless of where in the DOM this lands. */
  color: #1c242a;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 12px;
  font-weight: 400;
  line-height: 1.5;
  text-align: left;
  padding: 12px 14px;
  border-radius: 10px;
  border: none;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity .2s ease, visibility .2s;
  z-index: 2147483000;
}

.tunnel-hover-tooltip.is-visible {
  opacity: 1;
  visibility: visible;
}

/* Item 8 (this round): small circular info-disclosure button, per Dave -
   "a very small info button... a small eye [icon]... with a circle around
   it - and when you click on it, what it doesn't include comes up." Used
   right now on the Logo Design slide's fine print (replaces the old
   permanently-visible "Doesn't include full identity systems..." sentence -
   see the 'logo' category's buildDetail in tunnel.js), reusing the SAME
   .tunnel-hover-tooltip popover already established for the care/payment
   tiles elsewhere in this file (bindHoverTooltips() in tunnel.js) rather
   than a new one-off disclosure pattern. Simple circle + lowercase "i"
   glyph (no external icon asset needed) instead of a literal eye, since an
   info/"i" glyph is the more universally understood convention for "click
   for details" and matches this same shared tooltip's existing use
   elsewhere. Inline with the preceding sentence via vertical-align so it
   reads as a small superscript-ish marker right after "...revisions." */
.tunnel-info-btn {
  appearance: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 15px;
  height: 15px;
  margin-left: 5px;
  vertical-align: middle;
  border-radius: 50%;
  border: 1.3px solid rgba(28,36,42,.4);
  background: transparent;
  color: rgba(28,36,42,.65);
  font-family: Georgia, "Times New Roman", serif;
  font-style: italic;
  font-size: 10px;
  line-height: 1;
  padding: 0;
  cursor: pointer;
  transition: background .18s ease, border-color .18s ease, color .18s ease;
}
.tunnel-info-btn:hover,
.tunnel-info-btn:focus-visible {
  background: var(--tunnel-teal-bg);
  border-color: var(--tunnel-teal-bg);
  color: #ffffff;
  outline: none;
}

.tunnel-choice b {
  color: var(--gold);
  font-size: 15px;
}

.tunnel-choice em {
  font-style: normal;
  font-size: 12px;
  color: var(--muted);
}

/* Per Dave (latest round): the 4 Payment Plan options ("12 monthly
   payments", "6 monthly payments", "3 monthly payments", "Pay in full")
   used to be larger tiles with BOTH the bold plan name AND a bold price
   line stacked inside the same solid box (the shared .tunnel-choice/
   .tunnel-choice b treatment above, same as the Care tiles). Dave wants
   these specifically restructured into compact "regularly shaped pill"
   buttons containing just the plan name, with the price explanation moved
   OUTSIDE/below each pill as plain gray, non-bold caption text - the Care
   tiles above are untouched and keep their old dual-line tile look.
   .tunnel-payment-option wraps each pill + its caption so they lay out as
   one stacked unit inside .tunnel-choices (which still just sees a plain
   block-level grid item per option, so its existing grid/gap rules keep
   working unchanged). */
.tunnel-payment-option {
  display: flex;
  flex-direction: column;
}

/* Pill shape override for payment options only - fully rounded like the
   Yes/No buttons (.tunnel-yesno__btn) and every other pill convention in
   this file, single line of just the bold plan name now that the price
   line has moved out to .tunnel-payment-caption below. Selected/hover
   fill + white text still comes from the shared .tunnel-care-choice,
   .tunnel-payment-choice rules further up this file - only shape/padding/
   content sizing changes here.
   BUG FIX (this round), item 4, per Dave: the selected pill's checkmark was
   rendering on its OWN line below the label text, making that one pill
   visibly taller/fatter than its unselected siblings. Root cause: this rule
   set `display: block` (added when this pill became a fully-rounded shape),
   which - at higher specificity than the earlier `.tunnel-payment-choice`
   rule (2 classes vs. 1) - silently killed the flex row layout that same
   earlier rule sets up (flex-direction:row/align-items:center/justify-
   content:space-between) for the label+checkmark pair. With the pill back
   to `display:block`, the `.tunnel-payment-choice__check` span (itself
   `display:flex` once `.is-selected`) became its own block-level box and
   dropped to a new line under the `<strong>` label instead of sitting
   inline to its right. `display:flex` here keeps this pill's own shape/
   padding overrides intact while restoring the row layout, so the check
   sits inline at the pill's right edge and the selected pill's height
   matches the unselected pills exactly (verified via Playwright bounding-
   box comparison - see this round's notes). */
.tunnel-choices:has(.tunnel-payment-choice) .tunnel-payment-choice {
  border-radius: 999px;
  padding: 12px 20px;
  display: flex;
}

.tunnel-payment-choice strong {
  font-size: 14px;
}

/* Gray, non-bold caption sitting directly below (outside) each pill -
   e.g. "$57/mo for 12 months" - replaces the old bold <b data-price> line
   that used to live inside the tile itself. */
.tunnel-payment-caption {
  margin: 5px 0 0 4px;
  font-size: 12px;
  font-weight: 400;
  color: var(--muted);
}

/* Round 31, item 6, per Dave: a smaller, lighter-weight opt-out pill below
   the 3 paid Care tiles for clients who want neither ongoing hosting nor
   care - a real fourth choice (wired to the same real 'handoff' service
   key the plain "No" answer already uses - see buildDetail above),
   deliberately styled much quieter than the 3 solid choice tiles above it
   so it doesn't compete with them for attention. */
/* Fix (this round), per Dave: "make this button say 'Handoff Files', in
   the same font style and size as the top 3 larger buttons... below it in
   that matching gray text... it should say 'no web care or hosting'."
   Restructured (see tunnel.js) from a single 2-line button (both the
   pithy label AND the "no web care/hosting" copy baked inside the pill
   itself) into the same "pill + gray caption below, outside the button"
   pattern as the 3 real Care tiles above it (.tunnel-payment-option /
   .tunnel-payment-caption, both elsewhere in this file) - this wrapper is
   just that same pattern reused, holding the margin-top that used to live
   directly on the button (moved here since the button is no longer the
   outermost element). */
.tunnel-care-handoff-option {
  margin: 12px 0 0;
}
.tunnel-care-handoff-pill {
  appearance: none;
  display: block;
  /* Round 33, per Dave: left/right edges must line up exactly with the 3
     .tunnel-care-choice tiles above it. Those tiles live in the sibling
     .tunnel-choices column, which is deliberately capped at max-width:280px
     (see the :has(.tunnel-care-choice) rule above) and left-aligned (no
     auto margin) inside this same .tunnel-detail wrapper. This pill isn't
     inside that .tunnel-choices column - it's a plain sibling in the wider
     wrapper - so it must repeat that exact same 280px cap + left alignment
     itself (rather than a naive width:100%, which would stretch it to the
     full wrapper width and no longer match). Height/padding stay compact,
     unlike the taller tiles above. */
  /* Per Dave (latest round, item 4): "it doesn't have to be full width of
     the buttons above it... could be like 60% as wide, since the text is
     only on the left side." The 3 real plan pills above now cap at 320px
     (see .tunnel-choices:has(.tunnel-care-choice) above) - 60% of that is
     192px. Still left-aligned (no auto margins), so its left edge stays
     flush with the pills above it, same as before. */
  width: 100%;
  max-width: 192px;
  box-sizing: border-box;
  /* Margin moved to the new .tunnel-care-handoff-option wrapper above, now
     that this button is no longer the outermost element in this group. */
  /* Per Dave (latest round): text-align must match the left-justified copy
     in the 3 .tunnel-care-choice tiles directly above this pill - it was
     still centered from an earlier pass, which reads inconsistently next
     to them. */
  text-align: left;
  border: 1px solid rgba(28,36,42,.2);
  background: transparent;
  /* Fix (this round), item 6, per Dave: text needs to be black, matching
     the 3 Care tiles above it (.tunnel-choice's base color: var(--ink)) -
     was var(--muted), a lighter gray. */
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Fix (this round), per Dave: "make this button say 'Handoff Files', in
     the same font style and size as the top 3 larger buttons" - this
     rule's own font-size (11.5px, tuned back when this pill held two full
     lines of descriptive copy) no longer applies at the button level now
     that the label is just a single short bold word pair. Font-size is
     set on the inner <strong> instead (see .tunnel-care-handoff-pill
     strong below, matched to .tunnel-care-choice strong's 14px + the
     shared .tunnel-choice strong/.tunnel-care-choice strong/... 500 weight
     rule elsewhere in this file) - this base font-size left in place only
     as a fallback for anything that isn't the <strong> (there isn't
     anything else in here anymore, but harmless either way). */
  font-size: 11.5px;
  /* Fix (this round), per Dave: "just a little bit lighter weight on this
     text, not extreme, just a little bit lighter" - one moderate step down
     from 600, not all the way to a thin/normal weight. */
  font-weight: 500;
  letter-spacing: .01em;
  /* Fix (this round), per Dave: "the text is not aligned with the text on
     the larger three buttons above it... nudge it to the right a little
     bit so it's aligned with Hosting Only above." Root cause: the 3 real
     Care tiles above use `padding: 12px 20px` (20px left inset - see
     .tunnel-choices:has(.tunnel-care-choice) .tunnel-care-choice above),
     while this pill's own 16px left inset sat 4px further left, reading as
     unaligned even though both are left-justified. Bumped left padding
     only (16px -> 20px, matching the tiles above exactly) - right padding
     stays 16px and every other sizing value (height, border-radius, the
     192px max-width on the button itself) is untouched, per Dave's "keep
     the button position and shape the same, just nudge the text over." */
  padding: 7px 16px 7px 20px;
  border-radius: 999px;
  cursor: pointer;
  transition: all .18s ease;
}
/* Matches .tunnel-care-choice strong's 14px exactly - "same font style and
   size as the top 3 larger buttons," per Dave. Font-weight comes from the
   shared .tunnel-choice strong, .tunnel-care-choice strong, ... rule
   elsewhere in this file (500) - added this selector to that same list
   below rather than repeating the weight here, so both stay in sync if
   that shared value ever changes again. */
.tunnel-care-handoff-pill strong {
  font-size: 14px;
}

/* Item 6 (this round), per Dave: "the hover treatment on this button needs
   to match the hover treatment on the upper buttons, which is solid accent
   color with white type on hover." This pill previously only got an
   outline-color swap + teal text on hover (an out-of-sync one-off), while
   its 3 sibling .tunnel-care-choice tiles above it fill solid
   var(--tunnel-teal-bg) with white text on hover (see the
   .tunnel-care-choice:hover rule above - "hover = selected treatment" is
   the established convention this session). Brought into line with that
   exact same solid-fill + white-text hover, matching .is-selected below too. */
.tunnel-care-handoff-pill:hover,
.tunnel-care-handoff-pill:focus-visible {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* Latest round, item 1, per Dave: the Email tile's 2 choice buttons
   ("Keep our current email service" / "Move our email to WaltersGroup")
   read "way too heavy/bold" and needed their shape fixed to a full pill.
   Root causes, both cascade-order bugs:
   1) Weight - every choice card's title lives in a bare <strong>, which
      the browser bolds (~700) by default whenever no font-weight is set.
      None of .tunnel-choice/.tunnel-care-choice/.tunnel-payment-choice
      strong ever set one, so all of them (not just Email) rendered heavier
      than intended - matched here to .tunnel-yesno__btn's own 600 per
      Dave's direction to match that weight.
   2) Shape - .tunnel-email-choice (defined earlier, ~line 3288) already
      set border-radius:999px, but the later, EQUAL-specificity base
      .tunnel-choice rule (~line 3702, radius 14px) comes after it in the
      file and won the cascade, so Email's pills rendered with the boxier
      14px radius instead. Re-asserted here, after both conflicting rules,
      so the full pill shape actually wins. (Care/Payment tiles already
      have their own later, higher-order 999px overrides, so they were
      already correct pills - only Email needed this.) */
.tunnel-choice strong,
.tunnel-care-choice strong,
.tunnel-payment-choice strong,
.tunnel-email-choice strong,
.tunnel-care-handoff-pill strong {
  /* Per Dave (repeat complaint, this round): "too heavy, too bold; need to
     be lighter weight" - a prior round already cut this from the browser's
     default <strong> bold (~700) down to 600 (matching .tunnel-yesno__btn),
     but that still reads heavy to Dave. Cut a further step to 500 (medium) -
     genuinely lighter than .tunnel-yesno__btn's 600 this time, not just a
     repeat of the same value. */
  font-weight: 500;
}

.tunnel-email-choice {
  border-radius: 999px;
}
.tunnel-care-handoff-pill.is-selected {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* Presentational "info" slide card (the new true-first slide) - a clean
   hero-style summary of the base website plan. Per Dave: no inner bordered
   "box within a box" here either - flattened to a plain flex column that
   flows freely on the card; only the small "Included" badge pill keeps its
   own button-like chrome. */
.tunnel-info-card {
  display: flex;
  flex-direction: column;
  gap: 7px;
  min-width: 0;
}

/* Per Dave (this round): "move this content up about 20 pixels" - scoped to
   just this first "Your Foundation" slide via the card's own data-cat-id
   (see buildCards() in tunnel.js, `card.dataset.catId = cat.id`) rather than
   touching the shared eyebrow/headline/question block every other slide
   also uses.
   BUG FIX (this round), per Dave: "why is the eyebrow overlapping the
   header now." Root cause: I put -20px margin-top on BOTH the eyebrow AND
   the question. .tunnel-card__question has no margin-top of its own
   normally (only the eyebrow's 10px margin-bottom separates them) - adding
   a NEW -20px margin-top on the question stacked against that 10px gap and
   flipped it negative (10 - 20 = -10px), pulling the headline up into the
   eyebrow. Only the eyebrow (the first element in the block) needs the
   shift - pulling it up carries the question along with it via normal
   document flow, since nothing after it needs its own separate offset. */
[data-cat-id="website"] .tunnel-card__eyebrow {
  margin-top: -20px;
}

.tunnel-info-card__badge {
  align-self: flex-start;
  font-size: 11px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: #fff;
  background: var(--gold);
  padding: 4px 12px;
  border-radius: 999px;
  font-weight: 600;
}

/* Per Dave (this round), item 2: badge relocated (see tunnel.js) to sit
   between the "$57/mo" price line and the 5 foundation pills instead of at
   the top of the card. .tunnel-info-card is a flex column with a flat 7px
   gap between every child, which read a bit tight/cramped directly under
   the large price text (26-36px clamp) in its new spot - a small extra
   top margin on top of that 7px gap gives it real breathing room without
   touching the pills' own spacing below (that 7px gap to the grid was
   already comfortable and untouched). */
.tunnel-info-card__badge--pre-pills {
  margin-top: 6px;
}

/* Per Dave (this round): the h4 is now the shared row that holds the
   "Website Design" name+checkmark group AND the "Transition Questions?"
   pill as flex siblings, so the pill sits inline on the same
   row/baseline as the header instead of below the note text. flex-wrap
   lets the pill drop to its own line under the header only at the
   narrowest supported width (see the ~1024px media query below) rather
   than ever clipping against the overflow:hidden column. */
.tunnel-info-card__name {
  margin: 4px 0 0;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  row-gap: 10px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 600;
  font-size: 22px;
  color: var(--ink);
}

/* Fix (this round), per Dave, desktop: "remove the website design and the
   checkmark... declutter... everything below the header will shift up a
   bit" - same "Website Design" name+checkmark row already hidden on mobile
   (see the @media(max-width:767px) override further down), now hidden on
   desktop too by killing it at the base/unscoped level instead of only in
   that mobile media query. Since .tunnel-info-card is display:flex;
   flex-direction:column with a shared 7px gap between children (see
   .tunnel-info-card above), display:none here removes both this row AND
   its 7px gap slot, which is exactly the "shift up" Dave asked for - no
   extra margin math needed on the siblings below. */
.tunnel-info-card__name {
  display: none !important;
}

/* Groups the name text + checkmark together so the fixed 9px gap between
   them stays independent of the 40px gap to the pill below - the pill's
   spacing is controlled entirely by its own margin-left, not this gap. */
.tunnel-info-card__name-inner {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
}

/* Checkmark next to "Website Design" - reuses the same check glyph as the
   timeline trail's .tunnel-chip__check (CHECK_SVG in tunnel.js). Styling
   for .tunnel-info-card__check itself now lives in the shared rule above
   (grouped with .tunnel-detail__check) so both draw from one definition. */

.tunnel-info-card__price {
  display: flex;
  align-items: baseline;
  gap: 10px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 700;
  font-size: clamp(26px, 2.8vw, 36px);
  color: var(--gold);
  /* Fix, per Dave: "half as much padding between these items" (Transition
     Questions? button and this price line). .tunnel-info-card uses a
     single flex `gap:7px` between every child, so this pulls just THIS
     one gap in half via a negative margin-top rather than touching the
     shared gap value, which would also shrink the price-to-badge spacing
     below it. */
  margin-top: -3.5px;
}

/* The price markup is the site's real .plan-base-payment-amount/-note pair
   (same structure main-v114.js already renders in the plan modal) - only
   restyling size/color for this card, not touching the underlying logic. */
.tunnel-info-card__price .plan-base-payment-amount {
  font-size: inherit !important;
  color: var(--gold) !important;
  font-family: inherit !important;
}
.tunnel-info-card__price .plan-base-payment-note {
  font-style: normal;
  font-size: 13px !important;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  color: var(--muted) !important;
}

/* Per Dave (this round): the 5 plain bulleted "Your Foundation" list items
   became pill buttons - "remove the bullets, turn these into five pill
   buttons, in columns - three in the first column, two in the second
   column. If clicked they'd have pop-up windows going into detail about
   each one of these points." Styled consistently with the app's other pill
   family (.tunnel-yesno__btn/.tunnel-choice: white fill, soft border,
   rounded-full) with the SAME "solid teal fill + white text" hover
   convention already established on .tunnel-care-choice/.tunnel-payment-
   choice (var(--tunnel-teal-bg)), not the lighter faded hover used
   elsewhere - this is a clickable action (opens a popup), so it gets the
   bolder hover treatment that signals "this does something" on click.
   Layout: this card is a narrow ~465px sidebar column (--tunnel-card-w),
   not full-width - a literal 3-wide horizontal grid left "Clean launch
   coordination"/"Up and running today" pills too cramped to read cleanly
   at that width (verified via Playwright). grid-auto-flow:column with 2
   explicit columns x 3 rows instead lays the 5 buttons out in DOM order as
   column 1 = items 1-3, column 2 = items 4-5 (empty 3rd cell), i.e. "three
   in the first column, two in the second column" read literally as two
   side-by-side vertical columns - which is both the literal ask AND the
   layout that actually fits this narrow card's width. */
.tunnel-foundation-pills {
  /* Fix (this round), per Dave: "the ceiling on the scrolling of this
     needs to be about 20 pixels higher - right now when you scroll to
     the very end of this content, the bottom button is just sit on top
     of that gray bar." This pills grid is the last child of the
     "Website Design"/foundation info card, and this card scrolls via
     the generic .tunnel-mid__content overflow-y:auto fallback (not one
     of the data-flush-scroll panels) - per this codebase's own
     established pattern (see .tunnel-3tile-ok-row/.tunnel-pages-flow's
     comments elsewhere in this file), bottom padding on the CARD itself
     doesn't extend how far you can scroll, only real space on the last
     rendered CHILD does. 20px bottom margin added here so the scroll
     ceiling genuinely lands 20px above the gray .tunnel-bottom band
     instead of flush against it. */
  margin: 10px 0 20px;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-template-rows: repeat(3, auto);
  grid-auto-flow: column;
  gap: 10px;
}

.tunnel-foundation-pill {
  appearance: none;
  position: relative;
  border: 1.5px solid rgba(28,36,42,.18);
  background: #ffffff;
  color: var(--ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Per Dave (this round): "make them the size of the Transition
     Questions? button" - that pill runs on .tunnel-yesno__btn's 11px/600
     weight base. Matched here (was 12.5px), and padding trimmed to sit a
     touch smaller than that button's own 10px/22px (a la "a little
     smaller"), keeping enough right-side room for the "+" affordance icon.
     Per Dave (this round): "make all seven of those buttons smaller by
     15%" (paired with the .tunnel-transition-faq-btn unification above, so
     all 7 share these exact values) - font-size 11px -> 9.4px, padding
     8/26/14px -> 6.8/22/12px, each ~85% of the prior value. */
  font-size: 9.4px;
  font-weight: 600;
  letter-spacing: .02em;
  padding: 6.8px 22px 6.8px 12px;
  border-radius: 999px;
  cursor: pointer;
  transition: all .22s ease;
  text-align: center;
  line-height: 1.25;
}

.tunnel-foundation-pill:hover,
.tunnel-foundation-pill:focus-visible {
  background: var(--tunnel-teal-bg);
  border-color: var(--tunnel-teal-bg);
  color: #ffffff;
}

/* Per Dave: these pills read as plain text with no hint they're clickable -
   a small medium-gray "+" at the right edge signals "there's more here"
   (an "unlock"/expand affordance), rotating 90deg on hover. Click behavior
   is unchanged (still opens openFeatureModal() in tunnel.js) - this is a
   purely visual add, drawn with CSS ::before/::after bars (same plus-icon
   technique as .tunnel-faq-item__icon above) rather than an SVG/image so it
   inherits color via background and needs no extra asset. */
/* Fix (per Dave, this round): the rotate-on-hover read as an instant snap,
   not a "slow rotation", because THIS element (the one the hover rule
   actually rotates) had no transition property at all - only its ::before/
   ::after pseudo-elements (the two bars) had transitions, and those only
   cover their own static centering transform + color, not this parent's
   rotation. Added a real, slower transition here so the turn from + to X
   is genuinely visible instead of snapping. Also sized down ~25% (12px ->
   9px box, right offset scaled to match) per Dave's ask - it was reading
   too large. */
/* Per Dave (this round): shrunk ~15% in step with the 7 buttons this icon
   sits inside (9px -> 7.7px box, 10px -> 8.5px right offset, 1.5px -> 1.3px
   bar thickness) - shared by both .tunnel-foundation-pill and
   .tunnel-transition-faq-btn, so one change keeps the icon proportional on
   all 7 at once. */
.tunnel-foundation-pill__plus {
  position: absolute;
  top: 50%;
  right: 8.5px;
  width: 7.7px;
  height: 7.7px;
  transform: translateY(-50%);
  transition: transform .45s ease;
  pointer-events: none;
}
.tunnel-foundation-pill__plus::before,
.tunnel-foundation-pill__plus::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  background: rgba(28,36,42,.35);
  transform: translate(-50%,-50%);
  transition: transform .25s ease, background-color .22s ease;
}
.tunnel-foundation-pill__plus::before {
  width: 7.7px;
  height: 1.3px;
}
.tunnel-foundation-pill__plus::after {
  width: 1.3px;
  height: 7.7px;
}
/* Fix: rotating the whole "+" a full 90deg is invisible - the two bars are
   equal-length/equal-thickness crossing at the same center, so a 90deg
   spin lands on a pixel-identical shape. 45deg (the standard plus-becomes-X
   turn) is what actually reads as motion, now animated slowly via the
   transition above instead of snapping. Color explicitly forced to solid
   white (not the base rgba dark gray) so the X reads clearly against the
   pill's dark hover fill. */
.tunnel-foundation-pill:hover .tunnel-foundation-pill__plus,
.tunnel-foundation-pill:focus-visible .tunnel-foundation-pill__plus {
  transform: translateY(-50%) rotate(45deg);
}
.tunnel-foundation-pill:hover .tunnel-foundation-pill__plus::before,
.tunnel-foundation-pill:hover .tunnel-foundation-pill__plus::after,
.tunnel-foundation-pill:focus-visible .tunnel-foundation-pill__plus::before,
.tunnel-foundation-pill:focus-visible .tunnel-foundation-pill__plus::after {
  background: #ffffff !important;
}

@media (max-width: 1024px) {
  .tunnel-foundation-pills {
    grid-template-columns: 1fr;
    grid-template-rows: none;
    grid-auto-flow: row;
  }
}

/* Per Dave (this round), item 5: "this can be a bit smaller and moved up a
   bit so there's less padding - it's very tight on the gray bar there."
   Trimmed the top margin (14px -> 8px, moves the note up/closer to the
   bullet list above it) and the font-size (13px -> 12px, reads as more
   compact/proportionate) so the note sits tighter and smaller overall. */
.tunnel-info-card__note {
  margin: 8px 0 0;
  font-size: 12px;
  color: var(--muted);
  max-width: 52ch;
}

/* "Transition Questions?" pill - intro slide only.
   Per Dave (round after the one described below): "still indented in on
   the page - I asked it to be shifted over to the left so the shape of
   the button aligns with the text and the buttons below it, on desktop."
   The 40px-from-the-checkmark placement below was only ever correct while
   this button stayed genuinely INLINE right after "Website Design [check]"
   on the same line - the moment the row wrapped (which the very next
   comment down already flagged as happening "at the narrowest supported
   width", but in practice was also happening at ordinary desktop widths
   once "Website Design" plus a real plan name got long enough), the same
   fixed 40px became a stray left indent with nothing to its left, reading
   exactly like this bug report. First fix attempt kept this as a flex
   child of .tunnel-info-card__name with flex-basis:100% to force the wrap
   - technically left-aligned, but flex-basis:100% also stretches the
   button's own box to the full row width (a wide bar with the text/icon
   stranded on the left/right edges), not a normal pill anymore. Real fix:
   moved this button OUTSIDE .tunnel-info-card__name entirely in tunnel.js
   (a plain sibling <button> now, not a flex child of that row) - a normal
   block-level element always starts its own line and auto-sizes to its
   own content with no flex stretching involved, so it's simply left-
   aligned with the row above/pills below (same ancestor left padding) at
   its natural pill width, on every viewport, with no wrap-detection logic
   needed at all. */
.tunnel-transition-faq-btn {
  display: inline-flex;
  width: fit-content;
  /* Fix (this round), per Dave, desktop: "move the transition questions
     button down to below the six buttons... on the left side... justified
     to the mobile friendly button" (mirrors the same reorder already done
     on mobile - see the order:10 fix on this same class in the
     @media(max-width:767px) block below). .tunnel-info-card is a flex
     column (see .tunnel-info-card above), and this button is a plain DOM
     sibling that renders BEFORE .tunnel-foundation-pills (see buildCards()
     in tunnel.js) - order:10 pushes it visually after that grid (which has
     no explicit order, defaulting to 0) without touching the DOM/click-
     handler wiring. align-self:flex-start keeps it hugging its own
     fit-content width instead of stretching to the column's full width
     (the flex column's implicit align-items:normal/stretch default), so it
     stays left-aligned flush with the pills grid above/below it rather
     than spanning edge-to-edge. Margin flipped from "10px 0 0" (old
     spacing to the checkmark row above it) to "14px 0 0" (new spacing
     below the pills grid it now follows). */
  order: 10;
  align-self: flex-start;
  margin: 14px 0 0;
  white-space: nowrap;
  /* Per Dave (this round): "put the plus symbol in this button exactly how
     you did it on the six buttons below it, animate on hover the exact same
     way." Reuses the SAME .tunnel-foundation-pill__plus markup/CSS as those
     pills (see that rule below) rather than a new one-off icon - position:
     relative here gives that absolutely-positioned plus a home, and the
     extra right padding clears room for it exactly like the foundation
     pills' own 30px-16px asymmetric padding does. */
  position: relative;
  /* Per Dave (this round): "Transition Questions is a little taller/larger
     than the ones below it, and the button itself needs to be aligned with
     the left side of the text" (the other 6 pills below keep their own
     centered look untouched). Root cause of the size mismatch: this button
     was inheriting .tunnel-yesno__btn's base 11px font / 10px vertical
     padding / 132px min-width, while the foundation pills below run their
     own separate 11px font / 8px vertical padding rule - close, but not
     identical, hence "a little" taller. Overridden here to match the
     pills' own values exactly (before the shared 15% shrink below), and
     min-width dropped to 0 so this button can genuinely hug its text
     instead of padding out to that 132px yes/no-button floor. padding-left
     cut from the inherited 22px down to a hairline 3px (just enough that
     the border doesn't touch the glyphs) - THIS is the "aligned with the
     left side of the text" fix; padding-right stays generous for the "+"
     icon, same as the pills' own asymmetric left/right split. */
  min-width: 0;
  /* Fix (this round), per Dave: "this text in this button is TOO tight on
     left/right; the button shape needs to be wider so the text is not
     touching on the left of the pill button." The 3px hairline left
     padding from the earlier round's alignment fix (see note above) reads
     as the text touching the pill's own border - widened to a normal,
     comfortable inset that still keeps the button hugging its text (no
     min-width floor reintroduced) rather than the old cramped 3px. */
  padding: 6.8px 22px 6.8px 16px;
  font-size: 9.4px;
}
.tunnel-transition-faq-btn:hover .tunnel-foundation-pill__plus,
.tunnel-transition-faq-btn:focus-visible .tunnel-foundation-pill__plus {
  transform: translateY(-50%) rotate(45deg);
}
.tunnel-transition-faq-btn:hover .tunnel-foundation-pill__plus::before,
.tunnel-transition-faq-btn:hover .tunnel-foundation-pill__plus::after,
.tunnel-transition-faq-btn:focus-visible .tunnel-foundation-pill__plus::before,
.tunnel-transition-faq-btn:focus-visible .tunnel-foundation-pill__plus::after {
  background: #ffffff !important;
}

/* This button is now a plain block-level sibling (see the rule above) that
   always sits on its own line at its natural width regardless of
   viewport, so the old narrow-width-only override that used to live here
   is no longer needed - removed rather than left as dead/conflicting CSS. */

/* Terminal review/summary card - itemized selections, prominent total,
   and the Secure Checkout button that performs the real hand-off. Styled
   consistently with .tunnel-info-card/.tunnel-choice rather than a
   parallel visual language. Given a taller/roomier card + tighter internal
   spacing than the other slides so the checkout button never gets clipped
   by the card's own scroll area - it's the terminal CTA and must always be
   reachable without hunting for a scrollbar. */
.tunnel-card[data-summary-detail="true"] {
  max-height: 92%;
  /* Per Dave (this round), item 3: this card's left padding (was 36px) sat
     way heavier than every other slide's base .tunnel-card left padding
     (10px, see the plain .tunnel-card rule above), which visibly pushed
     this slide's whole text block ~26px further from the monitor than
     Website Changes/Logo/Care/Payment and every other slide - "the text
     content on the right [is] further away from the monitor... needs to
     push to the left a bit, so it's about the same padding." Left padding
     matched to that same base 10px so this card's text starts at the exact
     same horizontal position as every other slide; right/top/bottom padding
     left untouched (still needs the extra internal breathing room for the
     itemized list + total + checkout button).
     Per Dave (this round): "content on this tile is too high compared to
     all the other tiles... needs to come down as a unit" - top padding
     bumped 20px -> 45px (+25px) to bring the eyebrow/headline down to
     match. This card is pinned `top:0` (not centered like other slides -
     see .tunnel-card.is-current[data-summary-detail] above), so this top
     padding IS its only vertical position control. */
  padding: 45px 36px 16px 10px;
  /* Per Dave (latest round): widened from the standard --tunnel-card-w
     (465px) so the headline below has room to fit "Here's everything
     you've selected -" as one line before its explicit <br>, at typical
     desktop widths (1440/1600/1920) - the .tunnel-mid__content column this
     card sits in is flex:1 1 auto and has plenty of slack to give at those
     widths. max-width still caps it from overflowing a narrower column. */
  width: 560px;
  max-width: 94%;
}

.tunnel-card[data-summary-detail="true"] .tunnel-card__question {
  /* Per Dave (this round), desktop: "half as much padding/vertical space
     between the header and the list of products below it" - paired with
     .tunnel-detail's own margin-top just below (16px -> 8px), halves the
     combined header-to-list gap (10px + 16px = 26px -> 5px + 8px = 13px). */
  /* Per Dave (this round): "way too much... should be a third of that much."
     Paired with .tunnel-detail's own margin-top just below (8px -> 2px) -
     13px combined -> 4px, a genuine third. */
  margin-bottom: 2px;
  /* Per Dave (this round), desktop only: "less leading - to spread out."
     Tightens the two-line "Here's everything you've selected." headline
     further than the shared base rule's already-tightened 1.15 (see the
     base .tunnel-card__question rule above). Scoped to this summary
     headline only, and to desktop (min-width:768px below) since Dave
     called out desktop specifically - the base 1.15 stays as-is everywhere
     else, mobile included. */
  /* Item 2 (this round): Dave wants ONE consistent header size across every
     slide type, matching the intro info-card's "The foundation everything
     else below builds on." text (the base .tunnel-card__question clamp).
     The previous flat 23px override here (and the forced nowrap/<br> hard
     break in tunnel.js's 'summary' category question) existed ONLY to dodge
     an overflow bug at the larger 34px size - removed the font-size
     override entirely so this headline now genuinely inherits the same
     clamp(26px,2.7vw,34px) as every other slide's header, no exception.
     text-wrap:initial (which disabled the base rule's text-wrap:balance)
     is removed too - balance is what actually solves the overflow at the
     full size (see max-width below), the same mechanism already proven
     safe on every other multi-line tunnel header. */
  max-width: 560px;
}

@media (min-width: 768px) {
  .tunnel-card[data-summary-detail="true"] .tunnel-card__question {
    line-height: 1;
  }
}

/* Per Dave's added "Make change" pill (see .tunnel-summary__item-right)
   made every row taller than before by stacking a second element under
   the price. Tightened the row/list gaps here (base styles, not just the
   short-viewport media query below) so the itemized list + total + Secure
   Checkout button still fit inside the mid band's hard max-height ceiling
   at a normal 1440x900 viewport too, not just short windows. */
.tunnel-summary {
  display: flex;
  flex-direction: column;
  gap: 6px;
  /* Per Dave (latest round): "scoop the dollar amounts on the right a
     little closer to the product names" - the itemized rows'
     justify-content:space-between (see .tunnel-summary__item below) was
     spreading the price column all the way to this block's own full-width
     right edge, leaving a big gap after the label + "Make change" pill.
     Narrowing this block's own right edge by a fixed 32px (measured via
     Playwright as a ~20% cut of the ~131-174px label-to-price gaps that
     were previously landing across the 3 itemized rows) pulls every price
     in .tunnel-summary__list AND the checkout row's total price (same
     right-hand column per the .tunnel-summary__checkout-row comment below)
     left by that same amount, so the whole block's right edge - and every
     price pinned to it - moves in together without needing per-row
     flex-basis math.
     FIX (this round), per Dave: "cutting off on the right, small window
     with horizontal scroll bar." Root cause: the checkout-crop fix earlier
     this round added `margin-left:10px` to .tunnel-summary__checkout-cta
     (see that rule) to give the button real clearance from the left clip
     edge - but that 10px also made the checkout row's own minimum content
     width 10px wider, which this block's overflow-x (computed to `auto`,
     see the note below) doesn't hide, only scrolls - so on any window
     narrower than ~1280px, where this row was already close to its limit,
     that extra 10px was enough to trigger real horizontal overflow/
     clipping. Trimmed this margin by the same 10px (32px -> 22px) to give
     the row back the width it needs, so the net footprint matches what it
     was before the crop fix while still keeping that fix's actual benefit
     (the button's position relative to the LEFT clip edge is unaffected by
     this right-side margin). */
  margin-right: 22px;
  /* Per Dave (this round): the Secure Checkout panel (itemized list +
     total + Secure Checkout button + payment-card icon row) had no way to
     scroll, so once its real content ran taller than the room above the
     gray .tunnel-bottom band, the bottom of the panel (the payment-card
     icon row) got pushed under/touching that band with no way to see it.
     This block now opts into the same data-flush-scroll mechanism used by
     .tunnel-logo-flow/.tunnel-pages-flow (see data-flush-scroll on this
     element in tunnel.js and sizeFlushScrollAreas() in tunnel.js, which
     live-measures the real distance to .tunnel-bottom and applies it as
     inline min/max-height). overflow-y:auto here is what actually makes
     that measured height scrollable instead of just clipping; the
     min(320px,36vh) max-height is only the pre-JS fallback used before
     the real inline height is applied (same pattern as .tunnel-logo-flow). */
  max-height: min(320px, 36vh);
  overflow-y: auto;
  /* Fix (this round), per Dave (repeat complaint): "Secure Checkout is
     still cropped on the left side." A prior round already tried raising
     the button's own z-index (see .tunnel-checkout-btn below) on the theory
     it was a stacking-order issue with the monitor mockup - that doesn't
     fix a clipping issue like this one, since z-index only reorders paint
     among siblings, it can never let content escape an ANCESTOR's
     overflow:hidden clip box. ROOT CAUSE: this element's overflow-x:hidden
     (paired with overflow-y:auto for the intentional vertical scroll) hard-
     clips anything that renders even a sub-pixel past its left/right edge -
     harmless for plain text, but a real risk for a `position:relative;
     z-index:20` child like the checkout button, where sub-pixel layout
     rounding (common at fractional browser zoom/display-scaling factors,
     which is very likely what Dave's own display is doing, since this
     never reproduced in headless testing at integer zoom) can clip a
     sliver off a rounded pill's edge. Switched to overflow-x:visible -
     per spec, pairing a `visible` axis with a non-visible other axis
     (overflow-y:auto here) computes the visible axis to `auto` instead
     (still permits horizontal scroll if something genuinely overflows),
     but critically no longer HARD-clips a nearly-in-bounds child over a
     sub-pixel rounding difference the way `hidden` does. Nothing in this
     block is designed to overflow horizontally in the first place (the
     card width already caps everything to fit), so this is a safe change -
     it only removes the clipping failure mode, doesn't invite a new one. */
  overflow-x: visible;
  padding-right: 8px;
  scrollbar-width: thin;
  scrollbar-color: rgba(28,36,42,.35) transparent;
}
.tunnel-summary::-webkit-scrollbar {
  width: 6px;
}
.tunnel-summary::-webkit-scrollbar-track {
  background: transparent;
}
.tunnel-summary::-webkit-scrollbar-thumb {
  background: rgba(28,36,42,.32);
  border-radius: 4px;
}

/* Per Dave: no bordered/filled box around the itemized list either - it
   flows freely on the card now, with dashed dividers between rows (rather
   than a container box) carrying the "list" structure. */
.tunnel-summary__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0;
  border: none;
  border-radius: 0;
  background: transparent;
}

.tunnel-summary__item {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  font-size: 13px;
  padding: 4px 0;
  border-bottom: 1px dashed rgba(28,36,42,.14);
}

.tunnel-summary__item:last-child {
  border-bottom: none;
}

.tunnel-summary__item-label {
  color: var(--ink);
  font-weight: 500;
}

/* Per Dave: the "Make change" pill sits directly to the right of the
   row's label/header text (left side of the row), not stacked under the
   price on its own row. */
.tunnel-summary__item-label-wrap {
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Holds the price (+ optional financing-term small print) stacked on the
   right. */
.tunnel-summary__item-right {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 3px;
}

.tunnel-summary__item-price {
  color: var(--gold);
  font-weight: 700;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  white-space: nowrap;
  /* Per Dave: "make this dollar amount on the review larger... don't go
     extreme, but make it larger" - re. the per-row financed price (e.g.
     "$244/mo"). Was inheriting the row's plain 13px (.tunnel-summary__item),
     same size as the row's own label text - bumped to its own explicit,
     moderately larger size (13px -> 15px, ~15%) so it reads as the row's
     headline figure without ballooning past the card's other text. Set here
     (not on .tunnel-summary__item) so the Payment Plan row's own muted price
     just below - which already has its own explicit 13px override - is
     unaffected. */
  font-size: 15px;
}

.tunnel-summary__item--payment .tunnel-summary__item-price {
  color: var(--muted);
  font-weight: 600;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
}

/* Per Dave: small print under each itemized price naming the financing
   term ("for 6 months") when a monthly payment plan is selected. Omitted
   entirely (see tunnel.js) when "Pay in full" is chosen. */
.tunnel-summary__item-months {
  font-size: 10px;
  color: var(--muted);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 500;
  white-space: nowrap;
}

/* Per Dave (round 13): "I want these to be blue with white text... not
   [always] active/solid the way you had them before - a clear background
   with darker text is what I want at rest, [the solid look] stands out way
   too much. They need to look like that ON HOVER, not just sitting there
   solid all the time." So the resting state is now subtle (transparent
   background, thin border, muted dark text) and the solid accent-fill +
   white-text look only kicks in on :hover, next to the row's label (see
   .tunnel-summary__item-label-wrap). */
/* Per Dave (latest round): "cumbersome and huge" - sized down ~20% across
   the board (font-size, padding) from the round-13 values above while
   keeping it legible and tappable. */
.tunnel-summary__edit-btn {
  appearance: none;
  border: 1px solid rgba(28,36,42,.13);
  background: transparent;
  /* Item 6 (this round), per Dave: "the text and these buttons need to be
     slightly darker... keep the pill shape exactly the way it is, but
     slightly darken the text so it's readable." Covers both the "Make
     change" pills on each itemized row and the "Change Payment Method"
     pill (.tunnel-summary__edit-btn--total below reuses this same base
     rule/color, no separate override needed). Darkened from .38 opacity
     to .62 (matches the --muted body-copy tone already used elsewhere on
     this card) - pill border/background/shape/padding untouched, only the
     text color moved. */
  color: rgba(28,36,42,.62);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  /* Per Dave (this round), desktop: "10% larger... 110% to scale of what
     they currently are showing on the desktop view" - covers every button
     using this shared rule (the "Make change" pills on each summary row and
     "Change Payment Method"). Scaled 8px -> 8.8px, 2.5px/8px padding ->
     2.75px/8.8px, all a clean 110% of the prior values. Mobile gets its own
     separate +15% override further down (see the max-width:767px block) so
     the two viewports scale independently per Dave's two separate requests. */
  font-size: 8.8px;
  font-weight: 600;
  letter-spacing: .02em;
  padding: 2.75px 8.8px;
  border-radius: 999px;
  cursor: pointer;
  white-space: nowrap;
  transition: background .18s ease, border-color .18s ease, color .18s ease, transform .18s ease;
}

.tunnel-summary__edit-btn:hover {
  background: var(--gold);
  border-color: var(--gold);
  color: #fff;
  transform: translateY(-1px);
}

/* Per Dave: no "TOTAL" label, and the checkout button sits on the left with
   the total price on the right, in the SAME right-hand column as every
   itemized price above (.tunnel-summary__item-right) - both this row and
   the itemized list are full-width children of .tunnel-summary, so
   space-between here naturally pins the total to that identical right
   edge. Per Dave (round 23): this row used to wrap onto two lines once the
   "Payments secured by Stripe" trust mark was added inline next to the
   button (the combined cta group got too wide for the row), which pushed
   the total price down and left instead of staying pinned top-right. The
   trust mark now stacks BELOW the button instead of beside it (see
   .tunnel-summary__checkout-cta below), keeping the cta group narrow so
   this row never needs to wrap and the total stays put. */
.tunnel-summary__checkout-row {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  /* Per Dave (prior round, "stop changing that every time"): gap was
     locked at 22px (padding-top 20.5px + this row's 1.5px border-top).
     A later round added 10 more px (22 -> 32px total, padding-top 30.5px).
     Per Dave (this round), NEW explicit measurement, desktop only: "12px
     less padding space between separator line and button/price tally" -
     30.5px -> 18.5px. Mobile is pinned back to the old 30.5px explicitly
     in the mobile block below since this base rule is shared and this ask
     was desktop-specific. RE-LOCKED to this number - do not adjust without
     an explicit new measurement from Dave. */
  padding-top: 18.5px;
  margin-top: 2px;
  border-top: 1.5px solid var(--gold);
}

/* Per Dave (round 23): "Payments secured by Stripe" now sits directly BELOW
   the Secure Checkout button (stacked, left-aligned under it) instead of
   inline beside it - see the row comment above for why. */
.tunnel-summary__checkout-cta {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 8px;
  /* Root-cause fix (this round), per Dave (12th report of the left-edge
     crop): measured the real ancestor chain via Playwright and found the
     ACTUAL cause - not stacking order (already tried), not this element's
     own overflow (already tried) - but that .tunnel-card sits with almost
     NO horizontal clearance from .tunnel-mid__content's overflow-x:hidden
     clip edge (measured gap: only ~10px at 1440px width, card padding
     eating essentially all of it). At that razor-thin margin, this pill's
     rounded left edge - and the tunnelNextPulse glow's box-shadow, which
     bleeds 10px past the button's own edge at its peak (see @keyframes
     tunnelNextPulse below) - has no real room to spare, so small real-world
     differences in rendered width (font hinting, display scaling, browser
     zoom - all things a headless test at exact integer zoom won't
     reproduce) push it past that clip edge. Fixing the clip boundary
     itself would mean moving the whole card (risk of the same overcorrection
     problem as other rounds); instead this gives the CTA column its own
     guaranteed buffer, independent of how tight the outer clearance is. */
  margin-left: 10px;
}

.tunnel-summary__stripe-mark {
  font-size: 11px;
  color: var(--muted);
  opacity: .75;
  white-space: nowrap;
  padding-left: 2px;
}

.tunnel-summary__stripe-wordmark {
  font-family: Georgia, 'Times New Roman', serif;
  font-style: italic;
  font-weight: 700;
  letter-spacing: .01em;
}

/* Per Dave (round 15): subtle light-gray card-brand icon row under the
   Secure Checkout button/total row - simple flat monochrome SVG marks (not
   full-color brand logos), just enough for shoppers to recognize their card
   is accepted. */
.tunnel-summary__payment-icons {
  /* Per Dave (this round): "the stuff under the separator line starting
     with Secure Checkout... needs padding so it's not overlapping that
     separator line." Root cause: .tunnel-summary's own max-height is set
     inline by sizeFlushScrollAreas() (tunnel.js) to exactly the live pixel
     distance up to .tunnel-bottom's top edge - real, but leaves ZERO
     guaranteed clearance for this last row before that boundary. A real
     bottom margin here (inside the scrollable area, not on the outer card)
     guarantees breathing room below these icons regardless of how tightly
     the live-measured height happens to land. */
  margin-bottom: 16px;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 7px;
  /* Per Dave (this round): "move those credit cards up about 16 pixels...
     tighter between 'Payments secured by Stripe' and the credit cards."
     This row is a direct flex child of .tunnel-summary (display:flex;
     flex-direction:column; gap:6px - see .tunnel-summary above), so the
     REAL total gap above this row was that 6px flex gap PLUS this
     margin-top's old 12px = 18px. Cutting the full 16px out of margin-top
     alone (12px -> -4px) lands the new total gap at 18-16=2px, matching
     Dave's exact 16px measurement without touching the shared 6px flex
     gap (which also spaces the list/checkout-row above and shouldn't
     change here). */
  margin-top: -4px;
  /* Per Dave (item E round 28): "20% smaller and just slightly lighter" -
     the icons themselves are now rendered ~20% smaller (see the width/
     height on each <svg> in tunnel.js's summary buildDetail), and this
     color is lightened a step further from round 23's #8b8b96. */
  color: #a3a3ac;
  /* FIX (this round), per Dave: "the credit cards... not staggered, off on
     their own to the left... need to line up justified left with the
     [button/Stripe line] above." Root cause: the checkout-crop fix a
     couple rounds back added margin-left:10px to .tunnel-summary__
     checkout-cta (the Secure Checkout button + "Payments secured by
     Stripe" text column directly above this row) to clear the button from
     an ancestor's clip edge - but this payment-icons row is a SEPARATE
     flex child of .tunnel-summary, not nested inside that cta column, so
     it never picked up the same shift and was left sitting 10px further
     left than the button/Stripe text above it. Matches that same 10px so
     all three - button, Stripe line, card icons - share one left edge
     again. */
  margin-left: 10px;
}

.tunnel-summary__payment-icons svg {
  display: block;
  opacity: .88;
}

/* Round (latest): real branded card-logo image (Visa/Mastercard/Amex/
   Discover/PayPal), replacing the old outline-style inline SVG row above -
   see tunnel.js's summary buildDetail for the <img> markup. Height picked
   to land the image at roughly the same on-screen footprint the old 6-icon
   row occupied (~197x17px at its native 27x17px-per-card sizing) so it
   doesn't look oversized or tiny next to the "Payments secured by Stripe"
   line/Secure Checkout button directly above it; width is auto so the
   source's real 500x55 aspect ratio is preserved. */
/* Item 9 (this round), per Dave: reduce this ~12% from its prior size
   (20px -> 17.6px / 18px -> 15.8px on the narrow breakpoint below); width
   stays auto so the source's real aspect ratio keeps scaling proportionally.
   Latest round, item 9: reduce another ~12% from the CURRENT size
   (17.6px -> 15.5px / 15.8px -> 13.9px on the narrow breakpoint). */
.tunnel-summary__payment-icons-img {
  display: block;
  height: 15.5px;
  width: auto;
}

@media (max-width: 900px) {
  .tunnel-summary__payment-icons-img {
    height: 13.9px;
  }
}

.tunnel-summary__total {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 1px;
  text-align: right;
}

.tunnel-summary__total-amount {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 700;
  font-size: clamp(20px, 2.2vw, 28px);
  color: var(--gold);
}

/* Bug fix, per Dave ("$629/mo" wrongly summed a one-time $590 charge and a
   recurring $39/mo charge into one figure): when a one-time total and a
   monthly total both exist, tunnel.js now renders them as two distinct
   pieces inside .tunnel-summary__total-amount instead of one combined
   number - the primary (one-time) figure keeps the big/bold treatment
   above, and this "then $39/mo" piece reads as a clearly separate,
   secondary line so it's obvious it's a different, later, recurring
   charge - not additional math on the number next to it. */
.tunnel-summary__total-then {
  display: block;
  font-size: 14px;
  font-weight: 600;
  color: var(--muted);
  margin-top: 2px;
}

/* Per Dave: the total used to re-render the FULL .estimate-breakdown/
   .estimate-part markup here - the exact same per-item rows already listed
   individually above in .tunnel-summary__list, just restyled. That was the
   literal duplicate "gray box repeating the same line items" he flagged.
   syncDetail() in tunnel.js now writes one plain summed total figure into
   .tunnel-summary__total-amount as plain text, so no .estimate-breakdown/
   .estimate-part styling is needed here anymore. */

.tunnel-summary__total-note {
  font-size: 12px;
  color: var(--muted);
}

/* Item 7 (this round), per Dave: "Change Payment Method" pill below the
   final tally - reuses .tunnel-summary__edit-btn's exact styling (same
   color/size/shape as the "Make change" pills above), just with a bit of
   top spacing so it doesn't crowd the total-note line right above it.
   .tunnel-summary__total's own flex-direction:column + align-items:flex-end
   already right-aligns it under the total, no extra positioning needed. */
.tunnel-summary__edit-btn--total {
  margin-top: 6px;
}

/* Per Dave: noticeably less wide than the full-width button it used to be -
   it now sits to the left of the total price in .tunnel-summary__checkout-row
   instead of stretching across the card, so it's sized to its own content
   (no flex-stretch/width rule here). */
.tunnel-checkout-btn {
  /* Fix (this round), item 3, per Dave: "this button is being cut off on
     the left side, it looks like it might be behind the monitor image."
     This button previously had no explicit z-index (auto), which normally
     already loses to nothing in front of it at default sizes, but is a
     real risk any time this card's real measured width/position (driven by
     sizeFlushScrollAreas()/the monitor's own live sizeMonitorPreview()
     scaling in tunnel.js) pushes the two columns close enough to touch at
     some viewport/selection combination - and .tunnel-mid__preview's own
     children climb as high as z-index:5 internally. Explicit position +
     z-index here guarantees this CTA always paints above the monitor
     column regardless of exact measured widths, per Dave's own suggested
     fix ("lifting it up to a higher layer"), cheap and non-disruptive since
     it doesn't change layout/flow at all. */
  position: relative;
  z-index: 20;
  appearance: none;
  border: none;
  /* Per Dave (latest round, item 7): was rendering in an old blue-gray -
     switched to the established dark/solid variant of the warm-gray palette
     already used elsewhere in this file (--tunnel-teal-bg-dark, #67645e -
     see the root vars above, same value the completed-step timeline dot
     uses) instead of the plain --gold base tone, so this primary CTA reads
     as a deliberately darker/solid shade consistent with the rest of the
     palette rather than a one-off value. */
  background: var(--tunnel-teal-bg-dark);
  color: #fff;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 700;
  font-size: 14px;
  letter-spacing: .03em;
  padding: 12px 18px;
  border-radius: 999px;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  flex: 0 0 auto;
  white-space: nowrap;
  /* Per Dave: no shadow on this button at all - resting or hover. Hover now
     darkens the accent background slightly instead (a normal subtle
     interactive darken), rather than the old shadow-lift effect.
     Fix (this round): was `filter .18s ease`, but filter darkened the white
     text along with the background (see .tunnel-checkout-btn:hover below,
     switched to a plain background-color swap) - transitions background
     directly now instead of a filter that no longer exists. */
  transition: background .18s ease;
  /* Per Dave (latest round): "that throbbing effect... like we did with that
     other button" - reuses the EXACT same tunnelNextPulse keyframe/timing
     already defined below for .tunnel-nav__btn--next.is-pulsing, for visual
     consistency rather than inventing a new animation. Unlike Next (which
     only pulses conditionally once enabled), Secure Checkout is always the
     terminal CTA on this slide, so it pulses continuously at rest. */
  animation: tunnelNextPulse 2.2s ease-in-out infinite;
}

/* Fix (this round), per Dave: "you darkened everything including the text
   on hover, which is not what we want - the text has to stay pure white,
   and the button [background should] get dark a little bit more than what
   you have." The old `filter: brightness(.88)` darkened every rendered
   pixel of this element uniformly, including the white text (brightness()
   applies to the whole element, not just background) - swapped for an
   explicit darker background-color (no filter) so text color is completely
   unaffected, plus set color:#fff explicitly so it can never drift.
   Darkened background a bit MORE than the old brightness(.88) result
   (roughly equivalent to brightness(.8) on the base --tunnel-teal-bg-dark
   #75726c tone) per Dave's ask. */
.tunnel-checkout-btn:hover {
  background: #5e5b56;
  color: #ffffff;
}

/* ---------- BOTTOM BAND ---------- */
.tunnel-bottom {
  position: relative;
  /* Was a hard `flex: 0 0 var(--tunnel-bottom-height); height: ...` (fixed
     20% of viewport). Now a content-sized band with that same figure as a
     MIN-height floor, same treatment as .tunnel-top - see the black-strip
     root-cause note there. The mid band's flex-grow (above) absorbs
     whatever space is left, so this band's exact size no longer has to be
     kept in lockstep with the top/mid percentages for the total to reach
     100%. */
  flex: 0 1 auto;
  min-height: var(--tunnel-bottom-height);
  height: auto;
  background: var(--tunnel-bottom-gray);
  border-top: 1px solid rgba(28,36,42,.10);
  display: flex;
  flex-direction: column;
  align-items: center;
  /* REGRESSION FIX (this round), item 1 - HISTORICAL, SUPERSEDED BELOW: this
     was `center`, not `flex-start`. Root cause of "pushed down again" after
     the 4-pill payment quick-picker was added then removed: when the
     quick-picker existed, .tunnel-bottom__main's content was tall enough
     that centering it inside this band barely mattered (there was almost no
     leftover space to split). .tunnel-bottom__main's own
     `justify-content:flex-start` (below) only controls how ITS OWN children
     (price/nav) sit within itself - it does nothing to control how
     .tunnel-bottom__main as a whole sits inside ITS parent, this element.
     Once the quick-picker was removed, .tunnel-bottom__main got noticeably
     shorter, so this `justify-content:center` on the OUTER band started
     splitting a much bigger leftover gap evenly above/below the
     now-shorter content block - silently re-introducing the "big gap above
     the price text" this exact band was tuned to avoid in an earlier
     round. Switched to `flex-start` so the 24px padding-top above is once
     again the ONLY thing controlling clearance above the price text. */
  /* Per Dave (later round), item 2 - HISTORICAL, SUPERSEDED BELOW: "the
     Back/Next buttons are extremely close to the bottom edge of the
     browser window... send all that content up, center it top-to-bottom in
     that bar." Switched to `center` so the content is genuinely centered
     top-to-bottom in the band, then shifted up ~15px via
     .tunnel-bottom__main's own transform below. */
  /* FINAL FIX (this round): `center` is the actual root cause of Dave's
     "super important" bug - min-height uses --tunnel-bottom-height (16.4%
     of VIEWPORT height), so on a tall browser window this band's box is
     much taller than its actual content, and `justify-content:center`
     splits that leftover space evenly above/below, dragging the whole
     trail+price content block down away from a fixed offset from the top
     edge. On a short window there's little/no leftover space, so content
     sits near the top - meaning the block's position relative to the top
     of the gray bar was silently a function of window height the whole
     time. Back to `flex-start`: padding-top (12px) is now the ONLY thing
     controlling the gap from the top of the band, so that gap stays fixed
     no matter how tall or short the browser window is. Any leftover space
     from the viewport-relative min-height now simply falls below the
     Back/Next row instead of pushing the trail/price block around. */
  justify-content: flex-start;
  /* Fix (this round), per Dave, desktop: "padding between these words and
     the top of the gray bar got increased somewhere along the line - about
     half that much padding between those two things." Top padding halved
     (24px -> 12px); right/bottom left untouched (24px bottom still gives
     the Back/Next row its own already-tuned clearance, unrelated to this
     ask). .tunnel-bottom__header's own compensating margin-top (below) is
     halved in the same proportion so the trail/total row's net gap off
     this new, shorter padding-top shrinks by the same real amount instead
     of drifting out of the ratio the last few rounds tuned it against. */
  /* padding-top bumped 12px -> 26px last round (see .tunnel-bottom__header
     comment below) now that this padding-top is the sole control over the
     gap above the trail/price row - meant to land ~20px lower than the
     too-high position Dave flagged, but 26px overshot: net effective
     change from the old -12.4px position was +38.4px, way more than the
     ~20px asked for. Per Dave (this round): "too extreme again... double
     what I asked... someone in the middle would probably be about right."
     Trimmed to 8px - nets a ~20px real move down from the old -12.4px
     position (-12.4 -> ~7.6px), matching what was actually asked the
     first time instead of overshooting. */
  padding: 8px 20px 24px;
}

/* Fix (this round), per Dave: "a horizontal primary color bar maybe 4px
   thick line to be right above only the 'active category'... gently
   flashing on/off, and the top of the bar would be touching the top of
   the gray bottom background, embedded to the top of that." Positioned
   against .tunnel-bottom (position:relative, set above) rather than the
   trail row itself, so top:0 lands exactly at the gray band's own true
   top edge - "embedded to the top of that" - regardless of the 24px
   padding-top that pushes .tunnel-bottom__header's content down from
   there. Left/width are set inline by positionActiveIndicator() in
   tunnel.js (chip widths/positions vary by label + viewport, so they
   can't be derived from CSS alone); opacity starts at 0 so it never
   flashes at the wrong spot for a frame before JS measures the current
   chip on first paint. */
.tunnel-active-indicator {
  position: absolute;
  top: 0;
  /* Fix (this round), per Dave: "make it only 2px thick... no curved ends
     only square ends... 50% screen back that color, looks too dark, more
     subtle." Height halved (4px -> 2px), border-radius removed outright
     (square ends, was rounding the bottom corners). Color history: first
     computed as a 50/50 white blend (#C0BEBA, same math as the checkmark
     fix), then Dave asked for "70% screen" - misread as 70% WHITE / 30%
     original (#D9D8D6), which came out far too faint ("almost invisible").
     Per Dave's correction: "take that line at 100% screen of the primary
     color [i.e. the color at full strength], then screen back to 70%" -
     "70% screen" means 70% of the original color's strength remains (30%
     lightened toward white), the OPPOSITE ratio from what was applied
     before. Recomputed as --tunnel-teal-bg #7E3187 blended 70% original /
     30% white: #A7A49F - notably closer to the full brand color than
     either previous attempt, just a bit softened. Still a solid tint, not
     a plain alpha fade, for the same reasoning as the checkmark fix. */
  height: 2px;
  border-radius: 0;
  /* Fix (2026-07-29), per Dave: "make the bar... a little bit darker as
     well, by say 8%." Same solid-blend convention as above - was 70%
     original / 30% white (#A7A49F), bumped 8 points to 78% original / 22%
     white: 0.78*(126,49,135) + 0.22*(255,255,255) = (157,154,148) =
     #9D9A94. */
  background: #9D9A94;
  pointer-events: none;
  /* Fix (this round), per Dave: "when going to the next screen have it
     glide over much slower, more gently." The left/width slide (when the
     active chip changes) was .3s - slowed way down to 1.4s with a gentle
     ease-in-out, distinct from the quick .3s var(--tunnel-ease) used
     elsewhere in this file for snappier UI moves. */
  transition: left 1.4s ease-in-out, width 1.4s ease-in-out;
  animation: tunnelActiveIndicatorPulse 2.4s ease-in-out infinite;
}
@keyframes tunnelActiveIndicatorPulse {
  0%, 100% { opacity: .35; }
  50% { opacity: 1; }
}
/* Set via positionActiveIndicator() in tunnel.js for the rare case there's
   no .is-current chip to measure yet (e.g. before the trail's first
   build) - kills the animation outright rather than fighting it with a
   plain opacity value, since an active `animation` always wins over a
   static opacity declaration for the same property. */
.tunnel-active-indicator.is-hidden {
  animation: none;
  opacity: 0;
}
@media (prefers-reduced-motion: reduce) {
  .tunnel-active-indicator {
    animation: none;
    opacity: .85;
  }
}

/* FIX (this round), per Dave's diagram - corrected from the prior round,
   which moved the wrong element: "WIZARD TIMELINE MOVES DOWN TO GRAY BAR;
   REVERSE HEADER STAYS UP IN THE DK BEIGE BAR." The chip trail/timeline
   moves down into this gray band, left side; the big headline stays in the
   dark .tunnel-top band untouched (see that band's own padding tweak
   below for its "scoots down a bit" compensation). Running total shifts to
   the right of this same row to make room, same as before. This is the new
   top row of .tunnel-bottom - trail left, running total right - sitting
   ABOVE the existing .tunnel-bottom__main (which now holds only .tunnel-nav
   and is otherwise completely untouched, so Back/Next/Start keep their
   exact same centered position/behavior). width:100% overrides
   .tunnel-bottom's own align-items:center (which would otherwise shrink
   this row to its content's width and center it, instead of spanning the
   full band). */
.tunnel-bottom__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  gap: 20px;
  padding-bottom: 14px;
  /* Fix (this round), per Dave: "position of these needs to move up 20px
     within gray bar." Scoped to this row only (not .tunnel-bottom's own
     padding-top, which .tunnel-bottom__main below also depends on) via a
     negative margin-top, so the trail+total row lifts 20px without
     disturbing the Back/Next row's own already-tuned position beneath it.
     Fix, per Dave: "this got pushed down in position again; needs to be
     moved up... half the padding between wizard and top of the gray bar
     than you currently have." .tunnel-bottom's own padding-top is 24px, so
     the net gap here was 24-20=4px - halved to 2px (margin-top -20 -> -22).
     Fix (this round), per Dave: "half that much padding" again, this time
     against .tunnel-bottom's own padding-top (halved 24px -> 12px just
     above) - this margin halved in step (-22px -> -11px) to keep the same
     tuned ratio/net gap the rounds above landed on, just scaled down with
     the shorter padding-top instead of drifting looser relative to it.
     BUG FIX (historical, now superseded): that -11px value barely moved
     the visible gap, because most of the real visible space above the
     trail text was never coming from .tunnel-bottom's padding-top at all -
     .tunnel-bottom itself was justify-content:center at the time (see that
     rule above) with a min-height floor (16.4%, ~148px at a real 900px-
     tall viewport) taller than its actual content, so the leftover space
     got split evenly above/below the header+main stack regardless of this
     margin. That's what -24.4px here was solved against.
     ROOT-CAUSE FIX (this round): .tunnel-bottom's justify-content was
     switched from center to flex-start (see that rule above) to fix a
     DIFFERENT, bigger bug - the whole trail/price block drifting away from
     the top edge on tall browser windows, since the centering trick
     depended on that viewport-relative min-height leftover space. That
     changed what this -24.4px margin actually does: with flex-start, the
     header row now starts right after .tunnel-bottom's own padding-top
     (12px), so this leftover "pull it up to compensate for centering"
     margin instead yanked the whole row 24.4px-12px=12.4px ABOVE the top
     of the gray band entirely - Dave's report ("way too high... you
     haven't actually left the gray bar"). This margin's whole reason to
     exist (compensating for centered leftover space) no longer applies
     under flex-start, so it's removed - .tunnel-bottom's own padding-top
     is now the ONLY thing controlling this gap. Per Dave ("needs to come
     down about 20px at least on desktop"): padding-top bumped 12px -> 26px
     to land clearly below the old too-high position. */
  margin-top: 0;
}

/* Reused element (same markup/class the dark .tunnel-top band used to
   render this in) - repositioned/resized for its new home in the light
   gray band. The base .tunnel-trail rule's padding/margin-top were tuned
   for sitting full-width under the dark band's headline+logo row - reset
   here since it's now just the left half of a compact row alongside the
   price total. */
.tunnel-bottom__header .tunnel-trail {
  padding: 0;
  margin-top: 0;
  flex: 1 1 auto;
  min-width: 0;
}
/* Every chip color rule elsewhere in this file (is-done/is-current/
   is-future label + dot/checkmark colors) was written for WHITE text on
   the dark teal top band - #ffffff and var(--muted) (which itself resolves
   to a white-based rgba at this scope; .tunnel-bottom never redefines it,
   see .tunnel-nav__btn's use of the dedicated --tunnel-bottom-ink variable
   instead, elsewhere in this file, for the same reason). Left as-is, that
   white/near-white text would be unreadable against this band's light gray
   background (--tunnel-bottom-gray: #eef0f0). Every state re-pointed here
   to dark tones instead, using the same --tunnel-bottom-ink-based
   convention already established for this band's other text (price
   figures, Back/Next labels, copyright). */
.tunnel-bottom__header .tunnel-chip.is-done .tunnel-chip__label,
.tunnel-bottom__header .tunnel-chip.is-current .tunnel-chip__label {
  color: var(--tunnel-bottom-ink);
}
.tunnel-bottom__header .tunnel-chip.is-done:hover .tunnel-chip__label {
  color: var(--tunnel-bottom-ink);
  opacity: .75;
}
.tunnel-bottom__header .tunnel-chip.is-future .tunnel-chip__label {
  /* Per Dave: "make the 'future' ghosted text just slightly more ghosted,
     not extreme but a bit less visible than you have it." Alpha trimmed
     .45 -> .33, a modest step down, not a big cut. */
  /* Per Dave (this round): reversed slightly - "slightly more readable...
     maybe 10% darker than it is currently." Alpha bumped back up .33 -> .43
     (+10 points), still meaningfully more ghosted than the done/current
     labels, just no longer quite as faint. Same rule covers mobile and
     desktop (no media query here). */
  color: rgba(28,36,42,.43);
}
.tunnel-bottom__header .tunnel-chip.is-done:has(.tunnel-chip__dot svg) .tunnel-chip__dot {
  /* Per Dave: checkmarks in the gray bar should be the primary dark-beige
     brand color, not near-black - text color (--tunnel-bottom-ink) left
     untouched.
     Fix (this round), per Dave: "I like the primary color but too dark,
     make them 50% screened of that color, brighter (NOT 50% trans, 50%
     screened)." A plain alpha/rgba fade was explicitly ruled out - "50%
     screened" means a solid, fully-opaque tint (like a 50% ink screen in
     print), i.e. this color averaged 50/50 with white, computed as a real
     solid hex value rather than transparency: --tunnel-teal-bg (#7E3187 =
     126,49,135) averaged with white (255,255,255) = (192,190,186) =
     #C0BEBA. Solid color, so it stays legible/consistent over this gray
     bar's background regardless of what's behind it.
     Fix (2026-07-29), per Dave: "a little hard to see... 10% darker" - not
     10% of the 10%, 10 percentage points less screened overall: 50% white
     dropped to 40% white / 60% original, recomputed as a solid blend the
     same way as above: 0.4*(255,255,255) + 0.6*(126,49,135) =
     (179,177,173) = #B3B1AD.
     CHANGED (2026-08-01), per Dave: "checkmarks here in the new plum
     color" - the screened/blended math above was tuned against the OLD
     beige-family primary from before the Plum/Jade recolor, and by the
     time it's diluted 40% toward white it reads as a washed-out taupe/
     gray, not recognizably plum at all (see the screenshot that prompted
     this - checkmarks looked gray, not purple). Switched to the flat,
     full-strength brand plum (#7E3187) instead of another screened blend,
     so it actually reads as "the plum color" as asked. No @media wrapper
     on this rule, so it already applies at every breakpoint - desktop and
     mobile both, per Dave's ask, with one edit.
     CHANGED AGAIN (this round), per Dave: full-strength plum now reads
     "too dark" - wants it "the same plum," screened back, explicitly "60%
     screen... NOT transparency... screen." Same solid-blend convention as
     the original 50%/60% screen math above (a real opaque tint, not alpha):
     0.6*(255,255,255) + 0.4*(126,49,135) = (203.4, 172.6, 207) = #CBADCF. */
  color: #CBADCF;
}
/* Fix (2026-07-29), per Dave: "checkmarks... a little bit small... 10%
   larger" - applies to both desktop and mobile since this same gray-bar
   trail markup is shared across both (only position/height are adjusted
   per-breakpoint elsewhere in this file, not icon size). Base size (see
   .tunnel-chip__dot svg earlier in this file) is 9px x 9px; 9 * 1.1 = 9.9,
   rounded to 10px. */
.tunnel-bottom__header .tunnel-chip__dot svg {
  width: 10px;
  height: 10px;
}
/* Per Dave: "checkmarks a few px closer to the words/text." .tunnel-chip's
   base gap between dot and label is set elsewhere in the file for the
   dot-timeline design; nudging it in tighter here, scoped to this gray-bar
   trail only, via a negative margin on the dot slot itself. */
.tunnel-bottom__header .tunnel-chip__dot {
  margin-right: -3px;
}
/* Running total: was centered as part of .tunnel-bottom__main's column
   stack - now the right-hand half of this new row instead. flex:0 0 auto +
   justify-content:flex-end keeps it pinned to the right edge and stops it
   from getting squeezed if the trail's labels run long. */
.tunnel-bottom__header .tunnel-total {
  flex: 0 0 auto;
  justify-content: flex-end;
  /* Fix (this round), per Dave: "move position down 6px w/ this text
     desktop within the gray bar" - scoped to just the price total (not the
     trail beside it, which stays put), via its own transform rather than
     touching the shared row's align-items:center. */
  transform: translateY(6px);
}

/* Fix (this round), per Dave: "small, in the lower left corner in this
   gray bar, gray type, not very large type - it has to say 'copyright (c
   with circle) 2026 WaltersGroup.'" .tunnel-bottom is already
   position:relative (see above), so this positions absolutely off it
   without disturbing the centered .tunnel-bottom__main price/Back/Next
   layout at all. Sized/colored to read as a quiet caption, similar scale
   to other small captions in this app (e.g. .tunnel-summary__edit-btn). */
.tunnel-copyright {
  position: absolute;
  left: 16px;
  bottom: 10px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 10px;
  font-weight: 400;
  letter-spacing: .01em;
  color: rgba(28,36,42,.4);
  white-space: nowrap;
  pointer-events: none;
}

/* Wraps the price total + Back/Next nav (the only content in this band now
   that the persistent payment quick-picker has been removed - see Dave's
   note above .tunnel-payment-quickpick's old location, since deleted).
   Keeps its own column stacking/gap/alignment unchanged. */
.tunnel-bottom__main {
  display: flex;
  flex-direction: column;
  align-items: center;
  /* Round 37 fix: with --tunnel-bottom-height restored to its correct 20%
     floor, `justify-content:center` splits the leftover space (band is
     taller than its content) exactly evenly above/below the price+nav
     group - that even split is what actually read as "huge gap above the
     price text" in the first place. Dave never wanted the band itself
     resized (that was the prior round's mistaken fix, reverted above) -
     he wanted the CONTENT nudged up within the band. `flex-start` +
     `padding-top` gives direct, tunable control over just the top
     clearance instead of an even 50/50 split; the leftover space that
     isn't consumed by padding-top falls below the nav row automatically. */
  justify-content: flex-start;
  gap: 14px;
  /* Per Dave (this round), item 2: nudges the now-centered content (see
     .tunnel-bottom's justify-content:center above) up ~15px from dead
     center, per his explicit ask - "move it up maybe 15px or so".
     Fix (this round), item 5, per Dave: "move this content down within the
     gray box by about seven pixels" - referring to this exact price/Back-
     Next row. Shifts the prior -15px up-nudge to -8px (a net +7px move
     DOWN from where it was, not a fresh from-center calculation) so the
     gray band's own total height/position is untouched - only where this
     content sits within it moves. */
  transform: translateY(-8px);
}

.tunnel-total {
  display: flex;
  align-items: baseline;
  gap: 10px;
}

.tunnel-total__amount {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 700;
  font-size: clamp(24px, 2.6vw, 34px);
  color: var(--tunnel-bottom-ink);
  transition: transform .18s ease;
}

.tunnel-total__amount.is-pulsing {
  transform: scale(1.06);
}

/* The total reuses the site's real .estimate-breakdown/.estimate-part
   markup (same markup main-v114.js already renders for the plan-modal
   total) so the number can never drift out of sync with the rest of the
   site's math. Those base rules in styles.css assume a light background
   (dark text) - only the color/sizing is restyled here for this dark
   band; the structure/logic is untouched. */
/* Per Dave (item F): "about half as much padding on this text in the light
   gray bar throughout" - the itemized $590 $190 $149 $19/mo figures in the
   bottom running-total band were spaced with 14px of left padding + 18px of
   gap between each item; both cut roughly in half (to 7px/9px). Round 31,
   per Dave: "much less padding... about half" AGAIN - halved a second time
   from that 7px/9px down to ~4px/5px.
   Item 4 (this round), per Dave: that 4px/5px landed too cramped the OTHER
   direction - "the horizontal padding between the text and the vertical
   line... is so tight they're almost touching - need much more, at least
   25px padding between each of these elements." The flex `gap` here is the
   space between one item's text and the NEXT item's vertical divider line;
   `.estimate-part`'s own padding-left below is the space between that line
   and its own text - both bumped from 5px/4px to 25px so there's a genuine
   ~25px clearance from text to line on both sides of every divider. */
.tunnel-total__amount .estimate-breakdown {
  display: flex !important;
  flex-wrap: wrap;
  justify-content: center;
  gap: 25px !important;
}
.tunnel-total__amount .estimate-part {
  display: grid !important;
  gap: 1px !important;
  text-align: left !important;
  border-left: 1px solid rgba(28,36,42,.16) !important;
  padding-left: 25px !important;
}
.tunnel-total__amount .estimate-part:first-child {
  border-left: none !important;
  padding-left: 0 !important;
}
/* Item 4 (this round), per Dave: "maybe 35px between the three on the right
   [Additional Pages/Logo Design/Hosting] and the one on the left
   [Professional Website]" - the base website price is conceptually a
   different grouping (the one-time/base project cost) than the add-ons
   that follow it, so the FIRST divider after it gets a slightly wider gap
   than the standard 25px used between the add-on items themselves. Targets
   whichever part actually lands second (pages, logo, or straight to care/
   months, depending on what's selected) via :first-child + adjacent
   sibling, rather than hard-coding a specific class, so it stays correct
   regardless of which add-ons are present for a given selection. */
.tunnel-total__amount .estimate-part:first-child + .estimate-part {
  margin-left: 10px !important;
}
/* Item 4 (this round), per Dave: Hosting + Web Care is "a different
   category - that's ongoing, not for 3/6/12 months - treated a little
   differently," so it also gets the wider ~35px separation from whatever
   project-based item(s) precede it, on top of the standard 25px gap/padding
   already applied above (25 + 10 = 35px). */
.tunnel-total__amount .estimate-part--care {
  margin-left: 10px !important;
}
/* Email hosting add-on ($4.90/mo/account) is the same kind of ongoing,
   not-part-of-the-financed-term charge as Care - same wider gap treatment. */
.tunnel-total__amount .estimate-part--email {
  margin-left: 10px !important;
}
.tunnel-total__amount .estimate-part strong {
  color: var(--tunnel-bottom-ink) !important;
  font-size: clamp(17px, 1.7vw, 22px) !important;
  /* Per Dave (this round): "this dollar amount in the gray bar at the
     bottom seems much heavier weight, much bolder than the headers above
     in the tunnel - it needs to be the same weight as the headers in the
     white tunnel." This markup reuses the site-wide .estimate-part strong
     rule from styles.css (font-weight:650, close to true bold) - overridden
     here to the exact 600 value already established on .tunnel-card__question
     (the white-tunnel headers) so the two read as the same weight. */
  font-weight: 600 !important;
}
.tunnel-total__amount .estimate-part em {
  color: rgba(28,36,42,.60) !important;
  font-size: 10.5px !important;
}

/* Per Dave (round 20): the "for N months" divider segment (financed rows
   only - see .estimate-part--months in main-v114.js's formatItemizedPayment,
   the one estimate-part with only an <em>, no <strong> price above it) sat
   visibly too high and too far right of the $57/mo figure it's meant to
   describe. Root cause: .estimate-breakdown is display:flex with the
   default (stretch) cross-axis alignment, so every .estimate-part
   (display:grid internally) stretches to match the tallest sibling's full
   two-line height (strong + em stacked) and its own content top-anchors
   inside that stretched box via grid's default align-content:start. Every
   OTHER part has its own strong sitting in that same top row, so the
   top-anchoring is invisible there - but this part has no strong, so its
   lone em visibly floats up near the top of the tall box instead of
   sitting level with the price text it's paired with. align-self:center
   drops it to vertically center within that shared height, landing it
   right alongside the $57/mo baseline instead of floating above it; a
   small negative margin-left tightens the gap so it also reads as
   "directly adjacent to" the price instead of a separate far-right column.
   Round 21, per Dave: this exact same misalignment was STILL showing up
   in his screenshots even after the round-20 fix - because that fix was
   scoped only to `.tunnel-total__amount .estimate-part--months` (the
   bottom "Running Total" band). readSelectedPaymentTotalHtml() in
   tunnel.js returns this identical raw .estimate-breakdown/.estimate-part
   markup (straight from the real #payFull/#payFour/#paySix/#payTwelve
   spans main-v114.js maintains), and that raw HTML can end up wherever a
   slide chooses to drop it - the bottom band is only ONE such spot. Widened
   the selector from `.tunnel-total__amount .estimate-part--months` to
   `#webyayTunnel .estimate-part--months` so the fix applies EVERYWHERE
   this markup can appear inside the tunnel (bottom band, any per-slide
   price card, any future spot that reads the same real payment spans) -
   one rule, not a growing list of one-off scoped selectors to keep in
   sync by hand. */
#webyayTunnel .estimate-part--months {
  align-self: center !important;
  /* Item 4 (this round): the general item-to-item padding/gap above was
     bumped 4/5px -> 25px (and the wider 35px groupings) for the priced
     items, but "for N months" isn't its own priced group - it's a plain
     descriptive suffix meant to sit directly beside the $/mo figure right
     before it (see the round-20/21 notes above), so it keeps its own much
     smaller, tightly-coupled spacing regardless of the bigger values now
     used elsewhere in this row. !important since it comes after the more
     specific `:first-child + .estimate-part` / `--care` margin rules above
     in source order but must still win over them on the rare selection
     where "for N months" happens to land as the second breakdown item. */
  padding-left: 4px !important;
  margin-left: -8px !important;
}

.tunnel-nav {
  display: flex;
  align-items: center;
  gap: 22px;
  /* Per Dave: "move the start and back/next buttons DOWN 6px from current so
     not to collide w/ text" - the price tally sits directly above this row;
     6px of clearance keeps them from touching. Applies to Back/Next and the
     single-button Start variant alike (both use this same .tunnel-nav row).
     Fix, per Dave: "cramped - these buttons need to move down 12px in
     position" - bumped further, 6px -> 18px total. */
  margin-top: 18px;
}

.tunnel-nav__btn {
  appearance: none;
  display: inline-flex;
  align-items: center;
  /* Fix (this round), per Dave: "make these buttons 10% smaller than you
     have them" - gap/font-size/padding all trimmed ~10% (8px->7px,
     13px->11.7px, 12px/22px->11px/20px). */
  gap: 7px;
  border: 1.5px solid rgba(28,36,42,.22);
  background: rgba(28,36,42,.04);
  color: var(--tunnel-bottom-ink);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 11.7px;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 11px 20px;
  border-radius: 999px;
  cursor: pointer;
  transition: all .2s ease;
}

.tunnel-nav__btn:hover:not(:disabled) {
  border-color: var(--gold);
  background: rgba(94,115,135,.14);
}

.tunnel-nav__btn:disabled {
  opacity: .35;
  cursor: not-allowed;
}

/* Hidden entirely while on the terminal review/summary slide - that slide
   ends via its own Secure Checkout button, not Next. */
.tunnel-nav__btn.is-hidden {
  display: none;
}

/* Per Dave, explicitly BOTH desktop and mobile (deliberate exception to
   the mobile-only rule most of this file's recent rounds have used): "on
   the very first slide there's no Back button because they can't go back
   anymore - just Next, centered, and change it to say Start." .tunnel-nav
   gets this modifier only while on Foundation (see updateNextState() in
   tunnel.js) - Back is hidden via the existing .is-hidden mechanism above,
   and this just re-centers the row now that it holds a single button
   instead of splitting two apart with justify-content unset/flex-start. */
.tunnel-nav--first {
  justify-content: center;
}

.tunnel-nav__btn--next {
  background: var(--gold);
  border-color: var(--gold);
  color: #fff;
}

/* Per Dave (round 24): Next inherits the generic .tunnel-nav__btn:hover rule
   above, which swaps it to a light-gray fill - washed out on a solid accent
   button. Override here so hovering just darkens its own gold/teal
   background in place (same brightness-darken treatment as the Secure
   Checkout button's hover, see .tunnel-checkout-btn:hover), keeping the
   solid fill and white text instead of switching families. Must come after
   the generic rule to win on equal specificity. */
.tunnel-nav__btn--next:hover:not(:disabled) {
  background: var(--gold);
  border-color: var(--gold);
  color: #fff;
  filter: brightness(.88);
}

.tunnel-nav__btn--next:disabled {
  background: rgba(94,115,135,.25);
  border-color: var(--line);
  color: rgba(255,255,255,.5);
}

/* Subtle pulse animation once Next becomes enabled */
@keyframes tunnelNextPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(94,115,135,.55); }
  /* Trimmed 10px -> 6px (this round): this glow bleeds OUTWARD past the
     button's own box (box-shadow isn't clipped by the button's own
     border-radius, only by an ancestor's overflow:hidden) - at 10px it
     was eating most of the new 10px buffer added on .tunnel-summary__
     checkout-cta above at the pulse's peak. 6px keeps a visible pulse
     while leaving real margin before it reaches that clip edge again. */
  50% { box-shadow: 0 0 0 6px rgba(94,115,135,0); }
}

/* Per Dave (this round): "the throbbing effect on the Start button and the
   Next button is actually too subtle, make it slightly more obvious."
   Deliberately NOT amplifying the shared tunnelNextPulse keyframe above -
   that one is also reused by the Secure Checkout CTA and the "Check Site
   for Changes" pill (see their own animation:tunnelNextPulse lines), both
   of which were previously trimmed from a 10px glow down to 6px specifically
   because they sit only ~10px from a clipping ancestor edge at certain
   widths (see .tunnel-summary__checkout-cta's comment above) - widening
   that shared keyframe back up would silently reintroduce that exact
   clipping bug on those two buttons. Start/Next lives in the footer bar
   with real clearance on every side, so it gets its own slightly-stronger
   keyframe instead: a bit more spread (6px -> 9px) and a touch more peak
   opacity (.55 -> .65) so it reads as clearly more present without
   touching the shared animation the other two buttons depend on. */
@keyframes tunnelNavBtnPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(94,115,135,.65); }
  50% { box-shadow: 0 0 0 9px rgba(94,115,135,0); }
}

.tunnel-nav__btn--next.is-pulsing:not(:disabled) {
  animation: tunnelNavBtnPulse 2.2s ease-in-out infinite;
}

/* Per Dave (round 52+, item 1): dedicated gentle scale "breathing" pulse
   for the active timeline dot (.tunnel-chip.is-current .tunnel-chip__dot::
   before) - separate from tunnelNextPulse above since a box-shadow glow
   didn't read as a visible pulse on a ~10px hollow ring. Slow, gentle
   scale up/down instead. */
@keyframes tunnelDotBreathe {
  /* Per Dave (this round), item 2: "I can't even really see the throbbing on
     this, it's so slight... needs a bit more throb." The prior 1.15 ceiling
     (tempered down from an original 1.25 in an earlier round) read as too
     subtle to perceive. Bumped back up, moderately past even the original
     1.25, to 1.35, and opacity is now animated in tandem (not just scale) so
     the pulse has two independent, compounding visual cues instead of one
     faint one - together they read as a clearly visible "breathe" rather
     than a barely-there wobble. */
  0%, 100% { transform: scale(1); opacity: .6; }
  50% { transform: scale(1.35); opacity: 1; }
}

/* Fallback notice shown briefly on mobile / narrow viewports before we
   defer to the original plan modal */
.tunnel-unavailable-note {
  position: fixed;
  bottom: 18px;
  left: 50%;
  transform: translateX(-50%);
  background: rgba(0,0,0,.82);
  color: var(--ink);
  font-size: 12px;
  padding: 10px 16px;
  border-radius: 10px;
  z-index: 100000;
  opacity: 0;
  pointer-events: none;
  transition: opacity .3s ease;
}
.tunnel-unavailable-note.is-visible {
  opacity: 1;
}

/* Per Dave (mobile pass): the tunnel used to be hard-gated off below
   1024px (both here and in tunnel.js's isDesktop() check at the entry
   point/resume-after-Stripe listeners, both now removed) - phones fell
   back to the old legacy #planModal instead of ever seeing the tunnel at
   all. That gate is gone; the real mobile layout lives in the
   `@media (max-width: 767px)` block at the very end of this file. The
   1024px cutoff below narrows down to a real "narrow/small desktop
   window" range only (768-1023px) - genuine phone widths are handled by
   the dedicated mobile block instead, not this one. */
/* Fix (this round), per Dave: adding the Email Accounts price row (see
   .estimate-part--email in main tunnel.js) widened the price total enough
   that it now starts colliding with the trail sooner than before - at
   window widths that used to be comfortably wide enough for the single-row
   gray-bar layout below. Bumped this breakpoint's upper bound 1023px ->
   1083px (+60px, Dave's exact ask) so the trail relocates to the white
   .tunnel-mid area (see the block below) a bit sooner, before the wider
   price row has room to crash into it. Lower bound (768px) and every rule
   inside this block are otherwise untouched. */
/* Fix (this round), per Dave (screenshots: one showing the actual text
   collision, one showing the exact window width where the break should
   now land): adding email as its own payment-plan option widened the
   lower-right price tally another notch - same root cause as the +60px fix
   above, recurring because the price row got wider again. "Maybe 60 or 70
   pixels earlier than before... nothing else changes... just an earlier
   break." Split the difference, +65px: 1083px -> 1148px. Nothing else in
   this block touched, per his explicit "don't blow anything up." */
@media (max-width: 1148px) and (min-width: 768px) {
  /* Fix (this round), per Dave: "the bottom elements (wizard and cost
     tallies) run into each other... the wizard needs to move just above
     the gray bar so it's between the computer desktop and the gray bar in
     the white tunnel background, not in the gray bar for that smaller
     window breakpoint." Confirmed via his screenshot - at this width the
     trail's labels and the price total's text were genuinely overlapping,
     not just visually tight.
     .tunnel-bottom is already position:relative (see its base rule), so
     the trail is pulled out of the gray-bar row's normal flex flow here
     and absolutely positioned against THAT ancestor instead, landing it
     just above the gray band's top edge - in the white .tunnel-mid area,
     exactly where Dave's diagram put it. It stays the same DOM element/
     JS-driven content (checkmarks, current/future states, click-to-jump)
     as the gray-bar version at wider widths - only its rendered position
     changes at this breakpoint, nothing about how tunnel.js drives it. */
  .tunnel-bottom__header {
    /* The trail no longer takes up space in this row's flex flow (it's
       position:absolute now) - flex-end keeps the price total pinned to
       the right instead of drifting to fill the row alone. */
    justify-content: flex-end;
  }
  .tunnel-bottom__header .tunnel-trail {
    position: absolute;
    /* Fix (this round), per Dave: "the wizard needs to be down about 10px
       and not centered but to the left - about 20px from the left edge of
       the browser window pinned to the left." Dropped the `right:20px`
       stretch (which spanned trail-to-price-total, effectively centering/
       spreading it across the row) - now `right:auto` + `width:auto` so it
       hugs its own content width instead, and `left` is a flat 20px from
       the viewport edge rather than the deeper --tunnel-content-left
       variable, matching his diagram. margin-bottom trimmed 14px->4px to
       drop it ~10px further down (closer to the gray bar, still clear of
       it). */
    left: 20px;
    right: auto;
    bottom: 100%;
    /* Fix (this round), per Dave: "the wizard is a little bit too close to
       the gray bar... higher by about 12 pixels." margin-bottom is the only
       thing controlling clearance above .tunnel-bottom (bottom:100% pins it
       flush otherwise) - bumped 4px -> 16px. */
    margin-bottom: 16px;
    width: auto;
  }
  /* Fix (this round), per Dave: "when the browser is narrow and the wizard
     moves into the white tunnel, that horiz bar would not be inside the
     gray bottom background but on top of it - inside the white tunnel,
     directly below the word(s), touching the top of the gray bar." The
     base .tunnel-active-indicator rule anchors to .tunnel-bottom's top:0 -
     correct at wider widths where the trail lives inside the gray band
     itself, but wrong here where .tunnel-trail (just above) relocates into
     the white .tunnel-mid area above the gray band. Flips the anchor to
     bottom:100% (same anchor the trail itself uses right above) so the bar
     sits flush with the gray band's top edge - in the white gap directly
     under the trail's text, "touching the top of the gray bar" as
     described - instead of appearing at the gray band's own top edge where
     no label text exists anymore at this width. Left/width still come from
     positionActiveIndicator() in tunnel.js unchanged - it measures the
     current chip's label regardless of which layout is active, so no JS
     changes are needed for this breakpoint. */
  .tunnel-active-indicator {
    top: auto;
    bottom: 100%;
  }

  /* Fix (this round), per Dave: "at this window width the close button and
     login/acct are down too low, needs to move up in position by 8px. and
     that top gray bar @ this window size should be taller by 20px; only
     this breakpoint." Scoped entirely to this same 768-1023px range - the
     base .tunnel-top-height/.tunnel-top__actions values (used above and
     below this range) are untouched.
     Fix (this round, again), per Dave: "move this up 8px" - still too low
     at this width even after the first 8px trim (20px -> 12px); moved up
     another 8px (12px -> 4px). */
  .tunnel-top {
    min-height: calc(var(--tunnel-top-height) + 34px);
  }
  .tunnel-top__actions {
    top: 4px;
  }

  /* Fix (this round), per Dave: "the top reverse header (need extra pages)
     needs to be a bit larger throughout, too small now" - scoped to this
     same 768-1023px range only. Base clamp is 27px/3.7vw/54px; bumped the
     floor and ceiling up ~15% (27->31, 54->62) while leaving the base rule
     (used above/below this range) untouched. */
  .tunnel-top__headline h2 {
    font-size: clamp(31px, 4.2vw, 62px);
    /* Fix (this round), per Dave: "move reverse header 5px UP on this
       break point" - scoped to this same 768-1023px range only, same
       margin-top nudge idiom already used for the true-mobile block's own
       reverse-header position tweaks elsewhere in this file. */
    margin-top: -5px;
  }

  /* Fix (this round), per Dave: "make the computer monitor and html scene
     about 8% smaller to compensate @ bottom more room for the wizard below
     the monitor stand more breathing rm." --intro-scale is written inline
     by tunnel.js's sizeMonitorPreview() onto .tunnel-intro__visual (see that
     class's base rule, which reads it via calc(587px * var(--intro-scale))
     for its own width/height) - can't self-reference that same custom
     property in a multiplying calc() without a cycle, so the 0.92 shrink is
     applied here instead on the two rules that actually consume it:
     .tunnel-intro__visual's box size, and .tunnel-intro__stage's scale()
     transform (kept in lockstep so the 587x435 native-coordinate content -
     frame image, screen iframe, the "Check Site for Changes" pill - stays
     aligned inside the now-smaller box rather than overflowing/clipping). */
  .tunnel-intro__visual {
    width: calc(587px * var(--intro-scale) * 0.92);
    height: calc(435px * var(--intro-scale) * 0.92);
  }
  .tunnel-intro__stage {
    /* Same 1.006x overscan guard as the base rule above (see that
       comment) - stacked with this breakpoint's own 0.92 shrink so the
       narrow-window layout gets the same static-rounding-gap protection,
       not just the wide-desktop layout. */
    transform: scale(calc(var(--intro-scale) * 0.92 * 1.006));
  }
}

/* Adding the "Make change" pill under each summary row (see
   .tunnel-summary__item-right) makes every row taller than before. On
   short viewports (same ~760px threshold as the top-band fix above) that
   extra height pushed the review slide's total/checkout button past the
   mid band's hard max-height ceiling ("no internal scrolling, ever" - see
   .tunnel-card comment). Tightening the summary card's own type/spacing
   here (on top of the top-band savings already applied) keeps the whole
   itemized list + total + Secure Checkout button inside the mid band with
   room to spare, without touching any other slide. */
@media (max-height: 760px) {
  /* BUG FIX (this round): this override's left padding (32px) was never
     updated when the base rule's left padding above was matched to 10px
     (to align this card horizontally with every other slide) - so on any
     window under 760px tall, this stale 32px silently took back over,
     pushing the summary card's whole text block ~22px further from the
     monitor than every other slide, exactly the recurring "shift closer to
     the monitor" complaint. Left padding matched to 10px here too, and top
     padding bumped in step with the base rule's own +25px bump above
     (proportionally smaller here since short viewports have less room to
     give: 12px -> 20px). */
  .tunnel-card[data-summary-detail="true"] {
    padding: 20px 32px 10px 10px;
  }

  /* Per Dave (round 18): this was overridden to 4px, out of sync with
     .tunnel-card__eyebrow's base 10px used on every other slide - made the
     Review & Confirm eyebrow sit noticeably closer to its header than
     elsewhere on shorter viewports. Normalized back to the shared 10px. */
  .tunnel-card[data-summary-detail="true"] .tunnel-card__eyebrow {
    margin-bottom: 10px;
  }

  /* BUG FIX (this round), per Dave: "the header is way smaller than the
     header treatment on the previous ones." Root cause: the base (non-
     media) version of this rule had its flat font-size override removed in
     an earlier round specifically so this headline inherits the same
     clamp(26px,2.7vw,34px) as every other slide - but this short-viewport
     COPY of the rule was never updated to match, so anyone on a window
     under 760px tall was still getting the old flat, tiny 16px size this
     whole time. Removed here too, so it now inherits the same clamp as
     every other slide at every viewport height, exactly like the base fix
     already intended. */
  .tunnel-card[data-summary-detail="true"] .tunnel-card__question {
    /* Per Dave (this round): same "third of that much" cut as the base
       desktop rule above, applied to this short-viewport copy too. */
    margin-bottom: 2px;
  }

  .tunnel-card[data-summary-detail="true"] .tunnel-detail {
    margin-top: 3px;
  }

  .tunnel-summary {
    gap: 4px;
  }

  .tunnel-summary__item {
    padding: 3px 0;
    font-size: 12px;
  }

  .tunnel-summary__item-right {
    gap: 2px;
  }

  .tunnel-summary__edit-btn {
    padding: 1.5px 6px;
    font-size: 7.5px;
  }

  .tunnel-summary__checkout-row {
    padding-top: 6px;
  }

  .tunnel-summary__total-amount {
    font-size: 20px;
  }

  .tunnel-summary__total-note {
    font-size: 10.5px;
  }

  .tunnel-checkout-btn {
    padding: 10px 16px;
    font-size: 13px;
  }

  .tunnel-summary__stripe-mark {
    font-size: 10px;
  }

  .tunnel-summary__payment-icons svg {
    width: 28px;
    height: 18px;
  }
}

/* ---- Item H (round 14): scale the real account-creation modal down to the
   tunnel's card-based visual scale ----
   #accountFlowModal is the SAME real modal the stock non-tunnel flow uses
   (same markup/fields/submission logic in index.html, untouched here) - it
   was rendering at full-page scale (920px-wide panel, 32-48px h2) when
   reached via "Secure Checkout" inside the tunnel. finishTunnel() in
   tunnel.js adds `tunnel-checkout-flow` to <body> right before handing off
   to it, so this is a pure visual/sizing scope - nothing about the form's
   behavior changes, and the stock (non-tunnel) pages that never add this
   class are completely unaffected. */
body.tunnel-checkout-flow .account-flow-modal__panel {
  width: min(600px, calc(100vw - 34px));
  max-height: calc(100vh - 44px);
  padding: 22px 26px;
  border-radius: 20px;
}

body.tunnel-checkout-flow .account-flow-step h2 {
  font-size: clamp(20px, 2.6vw, 26px);
  margin: 8px 0 8px;
  font-weight: 600;
}

body.tunnel-checkout-flow .account-flow-step p {
  font-size: 12.5px;
  line-height: 1.5;
  margin: 0 0 16px;
  max-width: 100%;
}

/* Fix (this round), item 10: this used to override the eyebrow back down to
   a one-off 10px, fighting the shared .tunnel-card__eyebrow class now on
   this element (see index.html + .tunnel-card__eyebrow above) - explicitly
   matched to that class's real values instead so it genuinely reads the
   same as every other tunnel eyebrow, not just a similar-looking size. */
body.tunnel-checkout-flow .account-flow-modal .small-label {
  font-size: 11px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--gold);
}

body.tunnel-checkout-flow .account-flow-choice-grid {
  gap: 10px;
}

body.tunnel-checkout-flow .account-flow-choice {
  padding: 14px;
  min-height: 118px;
  border-radius: 14px;
}

body.tunnel-checkout-flow .account-flow-choice span {
  font-size: 9.5px;
}

body.tunnel-checkout-flow .account-flow-choice strong {
  font-size: 15px;
}

body.tunnel-checkout-flow .account-flow-choice em {
  font-size: 12px;
}

body.tunnel-checkout-flow .account-flow-form {
  gap: 10px 12px;
  margin-top: 14px;
}

body.tunnel-checkout-flow .account-flow-form label {
  font-size: 11.5px;
  gap: 5px;
}

body.tunnel-checkout-flow .account-flow-form input {
  min-height: 38px;
  padding: 9px 12px;
  font-size: 13px;
  border-radius: 10px;
}

body.tunnel-checkout-flow .account-flow-modal__close {
  width: 30px;
  height: 30px;
  top: 12px;
  right: 12px;
  font-size: 20px;
}

@media (max-width: 640px) {
  body.tunnel-checkout-flow .account-flow-modal__panel {
    width: calc(100vw - 24px);
    padding: 18px;
  }
}

/* ============================================================
   ROUND 31, ITEM 7 (BUILD) -> LATEST ROUND, ITEM 1 (MAJOR REWRITE): "I'd
   rather this not be a pop-up window, but just another panel - without the
   box - that goes to the RIGHT of the computer monitor, like all the other
   panels do." The account-required hand-off (finishTunnel() in tunnel.js)
   still brings the tunnel back up and adds `tunnel-account-embed` to
   <body> exactly as before - everything below is still a PURE re-styling
   of the same real, untouched #accountFlowModal/#accountFlowForm markup,
   no fields/names/submission logic touched. What changed: the panel is no
   longer centered/boxed as a popup over the whole page - positionAccountEmbed()
   in tunnel.js now measures the SAME .tunnel-mid__content column every
   other slide's .tunnel-card sits in and applies that column's real
   left/vertical-center position to this panel as inline left/top (the
   exact same "left edge of the content column, vertically centered ~46%"
   anchor .tunnel-card itself uses - see .tunnel-card above), so it reads
   as a normal in-flow tunnel card next to the monitor, not a floating
   dialog. All box chrome (border/background fill/shadow/backdrop) is
   removed to match the "no boxes" rule already established for every
   other panel in this file.
   ============================================================ */

/* NOTE: styles.css layers MANY later, higher-priority passes onto
   #accountFlowModal's backdrop/panel/h2/p (several full `!important`
   re-skins - "frosted glass" v34, "modal styling adjustments" v36, etc.).
   Every rule below is anchored on the `#accountFlowModal` ID (not just the
   `.account-flow-modal` class) and uses `!important` throughout so it
   reliably wins over ALL of those earlier passes regardless of their own
   specificity/`!important` use - a plain class-only override was silently
   losing to several of them (verified via Playwright: the backdrop stayed
   opaque/blurred and the panel stayed near the top-left instead of
   centering in the tunnel's mid band until this was anchored this way).
   left/top are the one exception - deliberately left WITHOUT !important
   (and unset here entirely) so positionAccountEmbed()'s inline style
   (higher specificity than a plain selector, same as every other JS-driven
   position in this file - sizeMonitorPreview/sizeLogoMarquee/
   positionTrailSegments all use the same pattern) is what actually places
   the panel. */

/* #accountFlowModal is z-index:9999 in styles.css (base) - lower than the
   tunnel's own 99999, so with the tunnel now genuinely still open behind
   it (rather than closed), the account modal would render invisibly
   behind the tunnel without this bump. Same fix pattern already used for
   .font-example-modal at the top of this file. */
body.tunnel-account-embed #accountFlowModal {
  z-index: 100000 !important;
}

/* The base backdrop is a dark, blurred rgba(0,0,0,.38-.62) overlay (several
   `!important` layers deep) - exactly the "page with all gray background"/
   popup look Dave wants gone entirely now, not just lightened. Fully
   transparent AND non-interactive (pointer-events:none) so the tunnel's own
   teal top band / white mid band / gray bottom band show through completely
   untouched, and there's no invisible full-viewport click target sitting
   over the monitor mockup or anything else on screen - this is meant to
   read as a plain in-flow panel, not a dismissible dialog with a
   click-outside-to-close backdrop. */
body.tunnel-account-embed #accountFlowModal .account-flow-modal__backdrop {
  background: transparent !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  pointer-events: none !important;
}

/* The outer #accountFlowModal wrapper no longer needs to be a full-viewport
   flex-centering container - the panel itself is positioned directly via
   fixed left/top (set by positionAccountEmbed() in tunnel.js), which takes
   it out of normal flow entirely, so this wrapper just needs to stay
   visible/non-blocking underneath it. */
/* The outer #accountFlowModal wrapper is position:fixed/inset:0 (a real box
   covering the full viewport, from styles.css's base rule) - even with its
   backdrop child set to pointer-events:none above, this wrapper element
   ITSELF still captured clicks everywhere outside the panel (verified via
   Playwright: clicking the tunnel's own "Close" pill in the top band was
   silently swallowed by this wrapper sitting on top of it at z-index
   100000). pointer-events:none here lets clicks pass straight through to
   whatever's actually visible underneath (the tunnel's monitor/top/bottom
   bands), and the explicit pointer-events:auto on the panel below (item
   1's actual visible content) is what keeps the form itself fully
   interactive. */
body.tunnel-account-embed #accountFlowModal.is-open {
  display: block !important;
  padding: 0 !important;
  pointer-events: none !important;
}

/* Item 7's own small floating "x" (.plain-modal-x, top-right corner of the
   old boxed panel) only made sense as a modal-dismiss affordance on a
   boxed popup. Now that this is a plain unboxed panel - with its own real
   "Back" button (see .account-flow-actions below) and the tunnel's own
   "Close" pill (item 4, top-right of the whole tunnel) already covering
   navigation - this extra corner x is redundant clutter with nothing to
   visually anchor to, so it's hidden in embed mode. */
body.tunnel-account-embed #accountFlowModal .plain-modal-x {
  display: none !important;
}

/* The tunnel itself is deliberately kept genuinely open BEHIND the account
   panel (not closed) purely so its state/currentIndex survives a "back out
   of account creation" round-trip - see finishTunnel()'s comment in
   tunnel.js. But the summary card it was left showing (headline/itemized
   list/Secure Checkout button) sat directly underneath this now-transparent
   unboxed panel and visually bled through/overlapped the account form's
   own fields once the old opaque popup card was removed. Hiding just the
   card track (not the whole .tunnel-mid__content column) keeps the monitor
   mockup, teal top band/trail, and gray bottom price band all visible
   exactly as Dave asked ("the monitor mockup should remain visible on the
   left throughout, exactly as it does on every other slide"), while
   clearing the one thing that was actually colliding with the new panel. */
body.tunnel-account-embed #webyayTunnel .tunnel-track {
  visibility: hidden;
}

/* THE CORE OF ITEM 1: no box. Plain, unboxed content sitting directly on
   the tunnel's own white .tunnel-mid background - no fill, no border, no
   radius, no shadow - exactly the same "no boxes within boxes" treatment
   already established on every other .tunnel-card (see its own comment
   above). Width matches the tunnel's own wider-card precedent (the summary
   slide's 560px, itself already widened past the standard 465px
   --tunnel-card-w for a form-heavy slide) rather than the old 720px popup
   width, so the 2-column field grid below comfortably fits the tunnel's
   normal content-column width instead of needing the full popup's real
   estate. left/top are deliberately omitted here (see the NOTE above) -
   positionAccountEmbed() in tunnel.js sets those as inline styles so this
   panel lands at the exact same left-edge-of-content-column, ~46%-
   vertically-centered anchor every other .tunnel-card uses. Kept scrollable
   (scrollbar hidden) as a safety net for short browser windows, same
   pattern as .tunnel-mid__content itself. */
body.tunnel-account-embed #accountFlowModal .account-flow-modal__panel {
  position: fixed;
  pointer-events: auto !important;
  margin: 0 !important;
  width: 560px;
  max-width: min(94vw, 560px);
  max-height: 90vh;
  overflow-y: auto;
  overflow-x: hidden;
  scrollbar-width: none;
  -ms-overflow-style: none;
  padding: 0 !important;
  border: none !important;
  border-radius: 0 !important;
  background: transparent !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  box-shadow: none !important;
}
body.tunnel-account-embed #accountFlowModal .account-flow-modal__panel::-webkit-scrollbar {
  display: none;
  width: 0;
  height: 0;
}

/* Item 7b (kept): one-line header. Desktop-only context (the tunnel never
   runs below 1024px - see isDesktop() in tunnel.js), so a plain nowrap at a
   slightly reined-in font size is safe here without risking overflow on
   any width this can actually be seen at. */
body.tunnel-account-embed #accountFlowModal .account-flow-step--form h2 {
  /* Fix (this round), per Dave: "make this header larger" - scaled the
     clamp up roughly 20% (19->22, 2.1vw->2.5vw, 23->27) while keeping the
     same one-line/nowrap treatment above it. */
  font-size: clamp(22px, 2.5vw, 27px) !important;
  white-space: nowrap !important;
  margin: 4px 0 6px !important;
}

/* Item 7c (kept): full-width intro paragraph, evened out via text-wrap:balance
   (already used elsewhere in this file for the same widow-line problem). */
body.tunnel-account-embed #accountFlowModal .account-flow-step--form p {
  max-width: 100% !important;
  font-size: 12.5px !important;
  line-height: 1.45 !important;
  margin: 0 0 10px !important;
  text-wrap: balance;
}

body.tunnel-account-embed #accountFlowModal .small-label {
  /* Fix (this round), item 10: was a one-off 9.5px !important that fought
     the shared .tunnel-card__eyebrow class now applied to this element -
     matched to that class's real font-size/letter-spacing/color/uppercase
     treatment instead, so this eyebrow genuinely looks like every other
     one in the tunnel rather than its own smaller/differently-styled
     lookalike. */
  font-size: 11px !important;
  letter-spacing: .14em !important;
  text-transform: uppercase !important;
  color: var(--gold) !important;
  /* Per Dave (this round), item 4c: "you need to have the eyebrow down in
     the white tunnel, fully visible, not crammed up into the top bar."
     The panel itself has padding:0 (see .account-flow-modal__panel above)
     and positionAccountEmbed() in tunnel.js already keeps the panel's own
     top edge at least 8px below .tunnel-mid__content's top (which itself
     sits below the teal .tunnel-top band) - but with zero panel padding
     the eyebrow's own text (font-size 9.5px, no line-height buffer) sat
     flush against that top edge, reading as cramped/clipped-looking right
     under the band even though it was technically not overlapping it.
     Small explicit top margin gives it real breathing room from the
     panel's top edge, same idea as every other slide's own top spacing. */
  display: block;
  margin: 4px 0 8px !important;
}

/* Per Dave (latest round, item 1): "you can make the buttons and fill-in-
   the-blank areas a little narrower if you need that to make this fit in
   there." Column gap trimmed from the base 16px (and this file's own prior
   14px embed value) down to 10px so the 2-up field grid sits comfortably
   inside the narrower 560px panel instead of the old 720px popup. */
body.tunnel-account-embed #accountFlowModal .account-flow-form {
  gap: 8px 10px !important;
  margin-top: 8px !important;
}

body.tunnel-account-embed #accountFlowModal .account-flow-form label {
  font-size: 11.5px !important;
  gap: 4px !important;
}

/* Fields themselves narrowed slightly (min-height/padding trimmed) in step
   with the tighter grid gap above, per the same "narrower if you need it
   to fit" instruction.
   Per Dave (this round), item 4a: "make all the fill-in-the-blank fields
   shorter than you have them by like 15% each, that'll get us more real
   estate." min-height 34px * .85 = 28.9, rounded to 29px; vertical padding
   7px * .85 = 5.95, rounded to 6px (horizontal padding left alone - the
   15% ask was about height/real-estate, not field width). */
body.tunnel-account-embed #accountFlowModal .account-flow-form input {
  min-height: 29px !important;
  padding: 6px 10px !important;
  font-size: 13px !important;
  border-radius: 10px !important;
}

/* Per Dave (latest round, item 2): "these two buttons do not need to be
   the full width of that area and stacked - I prefer normal-size buttons,
   side-by-side, adjacent, to give more real estate/breathing room." Reverts
   the earlier round's flex-direction:column/full-width stacking back to a
   plain horizontal row (the account-flow-actions/-back/-submit base rules
   in styles.css are ALREADY a row by default - display:flex, no
   flex-direction override, and normal-width `padding:13px 18px` pill
   buttons, not width:100% - so this simply stops overriding them rather
   than re-declaring a row from scratch). */
/* Per Dave (this round): "position this text block to be in line with the
   Back button and Create Account button, so it's at the same HEIGHT as
   those, and to the RIGHT of the Create Account button" - NOT stacked
   below the password fields/Back+Create Account row like the prior round's
   2-line-stack-underneath treatment rendered. .account-flow-form is a real
   CSS grid (grid-template-columns: 1fr 1fr, see styles.css) and both
   .account-flow-actions and .account-inline-login--forced are direct
   children of it. The base styles.css rule forces
   .account-inline-login--forced to grid-column:1/-1 (full width, its own
   row below the buttons) - overridden below to grid-column:2/3 instead so
   it auto-places into the SAME grid row as .account-flow-actions (which is
   narrowed to grid-column:1/2 here, so it no longer spans/reserves the
   whole row), landing it beside the Back/Create Account buttons rather
   than under them. align-self:center on both vertically centers the
   buttons against the 2-line "Already have a WebYay account? / Log in
   instead" text stack (kept as a 2-line stack per the earlier round's
   established fallback). */
body.tunnel-account-embed #accountFlowModal .account-flow-actions {
  grid-column: 1 / 2 !important;
  margin-top: 6px !important;
  align-self: center !important;
}
body.tunnel-account-embed #accountFlowModal .account-flow-back,
body.tunnel-account-embed #accountFlowModal .account-flow-submit {
  min-height: 38px !important;
  padding: 9px 20px !important;
  box-sizing: border-box !important;
  text-align: center !important;
}

body.tunnel-account-embed #accountFlowModal .account-inline-login--forced {
  grid-column: 2 / 3 !important;
  flex-direction: column !important;
  align-items: flex-start !important;
  justify-content: center !important;
  text-align: left !important;
  align-self: center !important;
  gap: 2px !important;
  margin: 6px 0 0 !important;
  font-size: 12.5px !important;
}
body.tunnel-account-embed #accountFlowModal .account-inline-login--forced button {
  margin-left: 0 !important;
}

/* ---- "Transition Questions?" FAQ modal (intro slide) ----
   First pass per Dave, round 65+: a small dedicated modal (own element,
   appended straight to <body> - see ensureFaqModalEl() in tunnel.js),
   simple centered panel + translucent backdrop + close control, in the
   same visual spirit as the tunnel's other overlays (font-example modal,
   account-embed modal) without reusing their machinery, since this is
   plain static FAQ copy with no real form fields to drive. z-index sits
   above #webyayTunnel's own 99999 (see .font-example-modal's 100000
   comment above for the same reasoning) so it always renders on top even
   though the tunnel itself is a full-viewport fixed overlay. */
.tunnel-faq-modal {
  position: fixed;
  inset: 0;
  z-index: 100050;
  display: none;
  align-items: center;
  justify-content: center;
}
.tunnel-faq-modal.is-visible {
  display: flex;
}
.tunnel-faq-modal__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(28,36,42,.55);
}
/* Rebuilt (this round), item 1: was a plain white box with a bold-question/
   plain-answer list stacked vertically - "very boring" per Dave. Now themed
   to match the SAME accordion pattern already established for the real FAQ
   section on the base landing page (.faq-intro/.faq-section/.faq-item in
   styles.css) - dark card background, small-caps eyebrow, big bold
   headline, muted subtitle, then a 2-column grid of rounded question boxes
   with a +/- icon that expands on click. Background uses the tunnel's own
   established dark band color (var(--tunnel-teal-bg), the same taupe used
   on .tunnel-top/.tunnel-bottom) rather than the base site's near-black
   page background, so it reads as consistent with this modal's own shell
   instead of a mismatched borrowed dark. */
.tunnel-faq-modal__panel {
  position: relative;
  /* Switched from the dark taupe (var(--tunnel-teal-bg)) + white text theme
     to a WHITE/light panel with dark text, per Dave: "I think this needs to
     be the white theme with dark text rather than this dark [gray] theme
     with white text." Locally redefine --ink/--muted to the same dark ink
     tone used throughout the tunnel's other light content areas (see
     .tunnel-card's identical local override above) so every rule below that
     already reads var(--ink)/var(--muted) automatically becomes dark,
     legible text against this now-light background. */
  --ink: #1c242a;
  --muted: rgba(28,36,42,.62);
  /* Per Dave, explicitly BOTH desktop and mobile (see the identical note on
     .tunnel-hover-tooltip above): faint gray instead of pure white, so this
     panel (covers both the "Transition Questions?" FAQ popup AND the
     Foundation pill feature popups, which reuse this same class - see
     tunnel.js's `featureModalEl.className = 'tunnel-faq-modal
     tunnel-feature-modal'`) visually separates from the page behind it. */
  background: #f5f4f1;
  border-radius: 20px;
  padding: 36px 40px 32px;
  width: min(760px, 92vw);
  max-height: 86vh;
  overflow-y: auto;
  box-shadow: 0 24px 60px rgba(0,0,0,.22);
  /* Hide the visible scrollbar per Dave: "we don't have scrollbars in other
     areas of this [tunnel]... 95% of people can scroll with their mouse."
     overflow-y stays 'auto' above so wheel/trackpad scrolling still works -
     this only removes the track/thumb UI, not the scroll behavior itself. */
  scrollbar-width: none; /* Firefox */
}
.tunnel-faq-modal__panel::-webkit-scrollbar {
  display: none; /* Chrome/Safari/Edge */
}
.tunnel-faq-modal__close {
  position: absolute;
  top: 16px;
  right: 16px;
  appearance: none;
  border: none;
  background: rgba(28,36,42,.08);
  width: 30px;
  height: 30px;
  border-radius: 50%;
  color: var(--ink);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
  transition: background .18s ease, color .18s ease;
}
.tunnel-faq-modal__close:hover {
  background: rgba(28,36,42,.16);
  color: var(--ink);
}
/* Eyebrow + headline + subtitle - same three-part header pattern as
   .faq-intro's .small-label / h2 / p on the base landing page. */
.tunnel-faq-modal__header {
  margin: 0 0 22px;
  padding-right: 34px;
}
.tunnel-faq-modal__eyebrow {
  display: block;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 11px;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: .13em;
  color: var(--ink);
  margin: 0 0 8px;
}
.tunnel-faq-modal__title {
  margin: 0 0 8px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-weight: 700;
  font-size: clamp(22px, 2.6vw, 28px);
  letter-spacing: -.01em;
  color: var(--ink);
}
.tunnel-faq-modal__subtitle {
  margin: 0;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--muted);
  max-width: 62ch;
}
/* 2-column grid of accordion question boxes - same grid/gap/rounded-box
   pattern as .faq-section on the base landing page. */
.tunnel-faq-modal__list {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px 16px;
  align-items: start;
}
.tunnel-faq-item {
  border-radius: 16px;
  /* Light gray fill + subtle border instead of the old translucent
     white-on-dark fill, so each accordion box reads as a distinct light
     card against the panel's white background. */
  background: #f6f5f3;
  border: 1px solid rgba(28,36,42,.1);
  overflow: hidden;
  transition: background-color .18s ease, border-color .18s ease;
}
@media (hover:hover) {
  .tunnel-faq-item:hover {
    background: #efeeeb;
    border-color: rgba(28,36,42,.18);
  }
}
.tunnel-faq-item__q {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 16px 18px;
  background: transparent;
  border: 0;
  cursor: pointer;
  text-align: left;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
}
.tunnel-faq-item__q span {
  color: var(--ink);
  font-size: 13.5px;
  font-weight: 600;
  letter-spacing: -.01em;
  line-height: 1.4;
}
/* Same +/- expand icon as .faq-icon on the base landing page - two bars
   forming a plus, with the vertical bar rotating/scaling away on expand so
   it reads as a minus. */
.tunnel-faq-item__icon {
  flex: 0 0 auto;
  position: relative;
  width: 16px;
  height: 16px;
}
.tunnel-faq-item__icon::before,
.tunnel-faq-item__icon::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  background: var(--ink);
  transform: translate(-50%,-50%);
  transition: transform .2s ease;
}
.tunnel-faq-item__icon::before {
  width: 12px;
  height: 2px;
}
.tunnel-faq-item__icon::after {
  width: 2px;
  height: 12px;
}
.tunnel-faq-item__q[aria-expanded="true"] .tunnel-faq-item__icon::after {
  transform: translate(-50%,-50%) rotate(90deg) scale(0);
}
.tunnel-faq-item__a {
  padding: 0 18px 16px;
}
.tunnel-faq-item__a p {
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--muted);
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
}
@media (max-width: 760px) {
  .tunnel-faq-modal__list {
    grid-template-columns: 1fr;
  }
  .tunnel-faq-modal__panel {
    padding: 28px 22px 24px;
  }
}

/* "Your Foundation" pill detail popup - reuses the .tunnel-faq-modal shell
   (backdrop/panel/close/header/eyebrow/title/subtitle) wholesale (see
   ensureFeatureModalEl() in tunnel.js), only adding these two extra pieces
   that the FAQ modal doesn't need: an optional image slot and a single
   feature's list of supporting points (rendered flat, not as an
   accordion - there's only ever one feature's worth of content open at a
   time, so there's nothing to collapse). */
/* v108: 2-column "photo left / copy right" layout, per Dave - mirrors the
   base landing page's .detail-modal (photo-left-copy-right split) but kept
   at this modal's existing COMPACT footprint rather than that reference's
   full-page-wide size. Width bumped only slightly (560px -> 620px) to give
   two columns room to breathe; still reads as a small popup, not a
   takeover. The panel's own padding is removed here and pushed down onto
   .tunnel-feature-modal__body instead, so the photo column can run flush to
   the panel's edges (top/left/bottom) the same way the base page's photo
   does, while the close button stays absolutely positioned above both. */
.tunnel-feature-modal__panel {
  width: min(620px, 94vw);
  padding: 0;
  overflow: hidden;
  display: flex;
}
.tunnel-feature-modal__layout {
  display: flex;
  align-items: stretch;
  width: 100%;
  max-height: 86vh;
}
.tunnel-feature-modal__media {
  flex: 0 0 38%;
  min-height: 100%;
  background-size: cover;
  background-position: center;
  background-color: #f6f5f3;
  border-right: 1px solid rgba(28,36,42,.1);
  filter: saturate(1.08) contrast(1.02);
}
/* Fallback for a feature with no real photo asset yet - soft gradient fill
   instead of collapsing the column, so the 2-column layout still holds. */
.tunnel-feature-modal__media.is-placeholder {
  background-image: linear-gradient(150deg, #dcd9d3, #b9c2c4) !important;
}
.tunnel-feature-modal__body {
  flex: 1 1 auto;
  min-width: 0;
  padding: 32px 30px 28px;
  overflow-y: auto;
  scrollbar-width: none;
}
.tunnel-feature-modal__body::-webkit-scrollbar {
  display: none;
}
.tunnel-feature-modal__points {
  display: grid;
  gap: 12px;
}
@media (max-width: 640px) {
  .tunnel-feature-modal__layout {
    flex-direction: column;
    max-height: none;
  }
  .tunnel-feature-modal__media {
    flex: 0 0 auto;
    width: 100%;
    aspect-ratio: 16 / 9;
    /* Bug fix, per Dave: on mobile this popup was "just filling up the
       entire screen with the photo, no text" - doesn't match the base
       website's version at all. Root cause: the desktop rule above sets
       min-height:100% (meant for the side-by-side desktop layout, where
       100% of the row's height is correct) and this mobile block, which
       stacks the photo above the text instead, never reset it - so
       min-height:100% was forcing the photo to stretch to the FULL modal
       height regardless of its aspect-ratio, squeezing the eyebrow/title/
       description/points into a sliver below the fold. Reset to 0 so
       aspect-ratio (already set above) is what actually sizes the photo,
       same as the base website's own version of this popup. */
    min-height: 0;
    border-right: none;
    border-bottom: 1px solid rgba(28,36,42,.1);
  }
  .tunnel-feature-modal__body {
    max-height: 60vh;
  }
  /* Bug fix, per Dave: "no closing X button in the upper right of any of
     these 6 popups." The button (.tunnel-faq-modal__close) was already
     there in the markup and DID sit on top (position:absolute, no z-index
     conflict) - it just had no real contrast: an 8%-opacity dark circle
     with a dark "x", meant to read as a subtle mark against this modal's
     plain off-white body background on desktop. On mobile this same modal
     stacks a full-bleed PHOTO right at the top (see .tunnel-feature-modal__
     media above) directly under the button, and a dark mark on an 8%-dark
     circle simply disappears against a photo that's dark/busy in that
     corner (confirmed on the SSL Certificate photo). Given a real solid
     white circle + shadow + full-opacity dark "x" here, mobile-only, so
     it reads against any photo regardless of its own colors. */
  .tunnel-faq-modal__close {
    background: #ffffff !important;
    box-shadow: 0 2px 8px rgba(0,0,0,.28) !important;
    color: var(--ink) !important;
    z-index: 5;
  }
}
.tunnel-feature-modal__point {
  border-radius: 14px;
  background: #f6f5f3;
  border: 1px solid rgba(28,36,42,.1);
  padding: 14px 16px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.tunnel-feature-modal__point strong {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13.5px;
  font-weight: 600;
  color: var(--ink);
  letter-spacing: -.01em;
}
.tunnel-feature-modal__point span {
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 13px;
  line-height: 1.55;
  color: var(--muted);
}

/* "Step back within this slide" icon button - distinct from the bottom-bar
   Back button (which jumps between whole CATEGORIES). Sized/styled to match
   the existing small round icon buttons already established in this file
   (.tunnel-font-preview-btn's 28px + border/hover pattern below, nudged to
   30px per Dave's spec so it reads as slightly more "actionable" than the
   purely-decorative preview glass, without overpowering the panel). Same
   solid-teal-fill + white-icon hover treatment used throughout the tunnel
   (.tunnel-font-preview-btn:hover, .tunnel-social-status-btn.is-selected,
   etc.) so it reads as refined/consistent rather than a bolted-on control. */
.tunnel-stepback-btn {
  appearance: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  border: 1.5px solid rgba(28,36,42,.16);
  background: #ffffff;
  color: var(--ink);
  cursor: pointer;
  transition: all .22s ease;
  flex: 0 0 auto;
  padding: 0;
}
.tunnel-stepback-btn svg {
  width: 16px;
  height: 16px;
  flex: 0 0 auto;
}
.tunnel-stepback-btn:hover,
.tunnel-stepback-btn:focus-visible {
  border-color: var(--tunnel-teal-bg);
  background: var(--tunnel-teal-bg);
  color: #ffffff;
  outline: none;
}

/* Item 5 (this round), per Dave: round step-back button on the real Create
   Account panel, "to the right of the header." Reuses the same
   .tunnel-stepback-btn recipe above (injected via tunnel.js right after the
   real <h2>Create your webyay account</h2>, see the account-form-stepback
   block in tunnel.js). Hidden by default so it never appears on the plain
   non-tunnel account flow (the stock page's own "Start your project" path
   reaches this exact same real #accountFlowModal markup) - only shown while
   body.tunnel-account-embed is present, i.e. genuinely reached via the
   tunnel's Secure Checkout hand-off. Positioned absolutely at the header's
   own top-right corner (the step needs position:relative for that to
   anchor correctly - scoped the same way, tunnel-embed-only, so it can't
   affect the stock flow's own layout). */
.tunnel-account-form-stepback {
  display: none;
}
/* Per Dave (this round): the Login step now gets the same round step-back
   button as Create Account (see tunnel.js's addStepback() factory) - needs
   the identical position:relative anchor + text clearance, or the button
   would position itself against the next positioned ancestor up (the whole
   panel) instead of sitting next to "Log in to continue". */
body.tunnel-account-embed #accountFlowModal .account-flow-step--form h2,
body.tunnel-account-embed #accountFlowModal .account-flow-step--login h2 {
  position: relative;
  /* Room on the right for the 30px round button + a small gap, so the
     heading's own text never runs underneath it. */
  padding-right: 40px;
}
body.tunnel-account-embed .tunnel-account-form-stepback {
  display: inline-flex;
  position: absolute;
  top: 50%;
  right: 0;
  transform: translateY(-50%);
}

/* Placement row for the step-back button - a consistent, unobtrusive spot
   at the very top of each expanded/detail panel, left-aligned just above
   that panel's own content. Used identically across the Website Changes
   tiles, Logo Design's Yes expansion, Additional Pages' per-page flow, and
   the Email sub-flow's address fields (see each buildDetail() in tunnel.js)
   so the control is predictable to the user no matter which panel they're
   in. */
.tunnel-stepback-row {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
}
.tunnel-page-panel__header-row {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 4px;
}
.tunnel-page-panel__header-row .tunnel-page-panel__header {
  margin: 0;
}

/* ---- Item 4 (this round), per Dave: "these fields that are filled out
   turn to light blue, I hate that - have it turn to a light shade in the
   same family as the primary color, but very faint - throughout [all
   fields in the tunnel]." This is the browser's own default autofill
   styling (Chrome/Safari force a blue-ish background onto autofilled
   <input> elements via the internal :-webkit-autofill pseudo-class, which
   can only be overridden with the -webkit-box-shadow inset trick below -
   a plain background-color rule doesn't work against it). Applied broadly
   to every text-entry field anywhere inside the tunnel widget AND the
   account-embed panel (both plain <input> and <textarea>, covering the
   account-creation fields, Overall Changes text fields, Additional Pages
   fields, Email fields, color-swatch text fields, social URL fields, etc.)
   so autofill/fill-in styling is consistent everywhere in the tunnel, not
   just the account panel. Tint is a very faint version of the established
   primary palette color (--tunnel-teal-bg, #7E3187), text color reuses the
   tunnel's own --ink so filled text still reads normally. ---- */
/* Note: --ink/--tunnel-teal-bg-dark are custom properties scoped LOCALLY
   inside #webyayTunnel's own rule block (and, for --ink, re-scoped again
   inside .tunnel-card/.tunnel-faq-modal__panel) - they don't cascade to
   #accountFlowModal, a separate sibling element outside #webyayTunnel. So
   every value below is written as a literal hex/rgba (not var()) to avoid
   silently resolving to an invalid/empty value in the account panel. */
/* CHANGED (2026-08-01), per Dave: "you have the background color in all of
   these fields throughout in this kind of baby blue which I don't like...
   can it be the green tone in the upper bar but much more faded version of
   the green tone instead." Swapped the tint from faded plum (#7E3187) to a
   faded version of the jade end of the .tunnel-top header gradient
   (#1BD6A3) - same very-faint .08 alpha as before, just a different hue.
   See assets/shared/styles.css for the matching SITE-WIDE version of this
   same fix (this rule only covers the tunnel widget + account modal; that
   one covers every other form on every page, per Dave's "wherever this
   shows"). */
#webyayTunnel input:-webkit-autofill,
#webyayTunnel input:-webkit-autofill:hover,
#webyayTunnel input:-webkit-autofill:focus,
#webyayTunnel input:-webkit-autofill:active,
#webyayTunnel textarea:-webkit-autofill,
#webyayTunnel textarea:-webkit-autofill:hover,
#webyayTunnel textarea:-webkit-autofill:focus,
#accountFlowModal input:-webkit-autofill,
#accountFlowModal input:-webkit-autofill:hover,
#accountFlowModal input:-webkit-autofill:focus,
#accountFlowModal input:-webkit-autofill:active {
  -webkit-box-shadow: 0 0 0 1000px rgba(27, 214, 163, .08) inset !important;
  box-shadow: 0 0 0 1000px rgba(27, 214, 163, .08) inset !important;
  -webkit-text-fill-color: #1c242a !important;
  caret-color: #1c242a;
  transition: background-color 5000s ease-in-out 0s;
}

/* ---- Item 5 (this round), per Dave: the "Create account" button (and
   other buttons in the account-embed panel) was showing BLUE on hover -
   same class of stray/leftover blue value as the orange-hover bug fixed
   in an earlier round, never swept from this panel. Swept every hover
   rule in the account-embed panel: .account-flow-submit ("Create
   account") now darkens its OWN resting color (#7E3187, the established
   primary/warm-gray palette color - see .account-flow-submit in
   styles.css) via the same darker shade already established elsewhere in
   this file (--tunnel-teal-bg-dark, #75726c) instead of any blue value,
   and .account-flow-back / the inline "Log in instead" link / forgot-
   password link are pinned to neutral dark-ink/border darkening too so
   nothing in this panel can render blue on hover. ---- */
body.tunnel-account-embed #accountFlowModal .account-flow-submit:hover,
body.tunnel-account-embed #accountFlowModal .account-flow-actions .gold-btn:hover,
body.tunnel-account-embed #accountFlowModal .gold-btn:hover {
  /* Root cause found: #accountFlowModal .account-flow-actions .gold-btn:hover,
     #accountFlowModal .account-flow-submit:hover in styles.css hard-codes
     background/border-color #6b8db0 - a genuinely blue value, same class of
     leftover/stray-color bug as the orange-hover fix from an earlier round.
     Overridden here (higher specificity + !important) to darken the
     button's own resting warm-gray color instead, via the same
     --tunnel-teal-bg-dark shade already used for this exact purpose
     elsewhere in this file. Covers BOTH .account-flow-submit ("Create
     account") and .gold-btn (the "Log in" button on the login step),
     since the same blue rule in styles.css targets both. Written as the
     literal #75726c hex (the same value --tunnel-teal-bg-dark resolves to
     elsewhere in this file) rather than var(--tunnel-teal-bg-dark) - that
     custom property is scoped inside #webyayTunnel's own rule block and
     doesn't cascade to #accountFlowModal (a sibling element), which was
     silently producing an invalid/transparent background here. */
  background: #66266E !important;
  border-color: #66266E !important;
  color: #fff !important;
}
body.tunnel-account-embed #accountFlowModal .account-flow-back:hover {
  background: #f5f4f2 !important;
  border-color: rgba(28, 36, 42, .28) !important;
  color: #1c242a !important;
}
body.tunnel-account-embed #accountFlowModal .account-inline-login--forced button:hover,
body.tunnel-account-embed #accountFlowModal .forgot-password-link:hover {
  color: #66266E !important;
  -webkit-text-fill-color: #66266E !important;
}

/* ==========================================================================
   MOBILE PASS (first draft) - per Dave: "translate the tunnel to vertical
   iPhone format... the timeline buttons in the dark beige bar won't work on
   mobile... can't have the computer on every slide like desktop, maybe
   that's in the first slide." This block is intentionally a full rewrite of
   layout mechanics for narrow viewports, not a tweak of the desktop rules
   above (which stay completely untouched at 768px+).

   Approach, and why:
   1) The desktop carousel is `.tunnel-card { position:absolute; ... transform:
      translateY(-50%) translateX(...) }` with hard max-height caps (78%/96%
      of the mid band, plus per-panel caps like .tunnel-qa's 380px and
      .tunnel-detail.is-visible's 360px) - all tuned against a "never scroll,
      three bands always sum to exactly 100vh" desktop constraint. On a phone,
      text reflows to more lines at narrower widths, so those same fixed caps
      would silently clip content (color pickers, font lists, email rows,
      etc.) with no way to reach the rest. Rather than re-tuning ~15 different
      hard caps by hand against every phone size, this block removes the
      no-scroll constraint for mobile only: the middle band scrolls normally,
      every hard max-height is released, and the card carousel's slide
      animation is disabled in favor of simple normal-flow stacking (only the
      current card renders at all - is-prev/is-next/is-hidden-far are
      display:none instead of transformed off-screen). This trades the
      desktop slide transition for guaranteed no-clipping on every single
      panel type, which matters more on a first mobile pass. Re-adding a
      lighter (e.g. fade-only) transition here later is a safe follow-up.
   2) The persistent monitor mockup (.tunnel-mid__preview, a sibling of the
      card track that stays mounted across every slide on desktop) is hidden
      by default and only shown while `#webyayTunnel` has the `is-monitor-
      slide` class. Per Dave (later round - MAJOR change from this block's
      original "only the first slide" behavior): the monitor now stays
      mounted across the Foundation slide AND every plain yes/no category
      card (Website Changes, Additional Pages, Logo Design, Hosting & Care)
      - eyebrow/question/Yes-No always lands right underneath it, same
      spot every time - and only disappears once a "Yes" answer expands
      that card's fill-in-the-blank detail content, to give that content
      the room back. See updateMonitorVisibility() in tunnel.js for the
      real logic (kind:'yesno' + no .tunnel-detail.is-visible, or
      currentIndex===0). Desktop is untouched (that class is harmless
      there - no rule below targets it outside this block).
   3) The chip trail (7 fixed pills) is kept as real, working desktop markup
      (same DOM, same tunnel.js logic) but made horizontally scrollable
      instead of trying to compress 7 labeled pills into ~350px - swiping
      across the trail is a standard, familiar mobile pattern and needs zero
      JS changes.
   Breakpoint: 767px and below (phones - iPhone SE at 375px through Pro Max
   at 428px, plus small Android widths). 768-1023px (small/narrow desktop
   windows, not phones) is intentionally left on the desktop layout above. */
/* ============================================================================
   LOCKED - per Dave, 2026-07-27: "the wizard finally looks good, lock it in
   for mobile." Everything in this @media (max-width:767px) block - trail
   sizing/spacing/position, chip label weight/ghosting, scrollbar hiding,
   .tunnel-bottom band height, the 3px #webyayTunnel left shift, all of it -
   is CONFIRMED WORKING and approved as final. Do not tweak, "improve," or
   re-tune any value in here on a hunch. If a future change is genuinely
   needed, it must come from an explicit new instruction from Dave, and
   should be scoped as narrowly as possible so it can't disturb anything
   else already locked in this block.
   ========================================================================= */
@media (max-width: 767px) {
  #webyayTunnel {
    height: 100dvh;
    /* Per Dave: "move the mobile wizard overall 3px to the left, to be
       more centered." This element is position:fixed with inset:0 (see
       base rule) - flush to all four viewport edges. Overriding just
       `left` (not the whole inset shorthand) widens the box 3px further
       left only, right/top/bottom stay flush at 0 - every child positioned
       relative to this box's edges (padding, --tunnel-content-left, etc.)
       shifts left by the same 3px as a result, with no gap opening up on
       the right side. */
    left: -3px !important;
  }

  /* ---- Form field auto-zoom fix (mobile only, very important per Dave) ----
     Bug fix: "when I click on any field to type... it zooms in, and it
     doesn't zoom back out when I go somewhere else, so I can't read
     anything." This is a real, well-documented iOS/mobile-browser
     behavior, not a styling choice: when a tapped text input's font-size
     computes to under 16px, the browser zooms the whole page in to make
     that text legible while typing - and on iOS in particular, it often
     does NOT reliably zoom back out afterward, leaving the page stuck
     zoomed in exactly as Dave described. Every real text field in this
     tunnel (and the embedded Create Account form, reached from it) was
     measured via Playwright at 12-13px - well under that threshold. Fixed
     at the root by forcing every real form control to 16px, the minimum
     that keeps browsers from zooming at all - covers every current field
     via one broad selector (rather than patching each of the ~10 different
     input classes individually) so nothing new added later can silently
     reintroduce this. !important + loaded after styles.css, so this wins
     regardless of which stylesheet originally set the smaller size. */
  #webyayTunnel input,
  #webyayTunnel select,
  #webyayTunnel textarea,
  body.tunnel-account-embed #accountFlowModal input,
  body.tunnel-account-embed #accountFlowModal select,
  body.tunnel-account-embed #accountFlowModal textarea,
  /* Bug fix, found verifying the above: a pre-existing, more specific rule
     (body.tunnel-account-embed #accountFlowModal .account-flow-form input,
     further down this file - from an earlier round that shrank these
     fields "for more real estate") was ALSO !important and had one more
     class in its selector, so it kept winning over the broader rule above
     despite source order. Matching/exceeding that same specificity here
     (adding .account-flow-form) so this genuinely wins - covers the
     Create Account, Login, AND Password Reset forms in one shot, since
     all three share this one form class. */
  body.tunnel-account-embed #accountFlowModal .account-flow-form input,
  body.tunnel-account-embed #accountFlowModal .account-flow-form select,
  body.tunnel-account-embed #accountFlowModal .account-flow-form textarea,
  /* BUG FIX (this round), per Dave: "the screen is STILL zooming in when
     keyboard arrives." Found the actual remaining gap: the "Send Me PDF"
     popup (#tunnelPdfModal, its email field is .tunnel-pdf-modal__input at
     14px) is built and appended straight to document.body in tunnel.js -
     NOT inside #webyayTunnel at all (a deliberate singleton, per that
     code's own comment, so it survives category re-renders) - so it was
     never matched by the `#webyayTunnel input` selector above and kept its
     real 14px, still under the 16px zoom threshold. Added directly by its
     own class so it doesn't depend on being inside #webyayTunnel. */
  .tunnel-pdf-modal__input {
    font-size: 16px !important;
  }

  /* ---- Top band: logo/actions row + headline + trail ---- */
  .tunnel-top {
    /* Per Dave (mobile only): "content needs to move up closer to the top
       of the window by maybe six or seven pixels" - top padding trimmed
       14px -> 7px. Desktop's own .tunnel-top rule above is untouched.
       Per Dave (this round): "make this top bar taller by about 22 pixels
       and move the header down accordingly, but a few pixels closer to
       the bottom edge than you have it now" - band grows 22px total, with
       MOST of that added above the content (top padding 7px -> 33px, +26)
       and a few px trimmed off the bottom (10px -> 6px, -4), netting the
       full +22px while landing the header nearer the band's own bottom
       edge than before. */
    /* Bug fix, per Dave: "make this top bar 5px shorter... move that
       reverse header and all content below up 5px with it." The logo/
       Close row above are top-anchored (negative margins measured off
       this band's TOP edge, see .tunnel-top__logo/.tunnel-top__actions
       below - untouched by this), while the headline sits near the
       band's BOTTOM edge, so trimming bottom padding by 5px (6px -> 1px)
       shrinks the band by exactly 5px without disturbing the logo/Close
       row, and - since .tunnel-mid flows immediately after this band in
       the column - automatically pulls the headline and every white-card
       slide below it up by that same 5px, matching what was asked. */
    padding: 33px 16px 1px !important;
    min-height: 0 !important;
    /* Bug fix (found while making the above change, pre-existing - not
       caused by the padding trim): the base rule's flex-shrink:1 (no
       floor) let this band get squeezed shorter than its own content's
       real height whenever #webyayTunnel's column (top+mid+bottom) didn't
       fit the viewport - the headline text was overflowing past the
       band's own bottom edge and getting visually covered by .tunnel-mid's
       opaque background right below it. .tunnel-mid already scrolls on
       mobile (overflow-y:auto below), so it's the right place to absorb
       any shortfall - pinning this band to flex-shrink:0 keeps it at its
       real content height always, same as .tunnel-bottom already does. */
    flex-shrink: 0 !important;
    /* ROOT-CAUSE FIX, ROUND 3 - FINAL, per Dave (real-device retest): the
       round-2 attempt (a -30px margin moved from the headline up onto
       this container) still broke on the "Choose your Fonts" tile panel
       even though it fixed every other screen. Did the math on WHY: this
       container's own real bottom clearance below the header text is
       only ~13px (this rule's 1px padding-bottom + the headline's own
       12px padding-bottom) - a "shrink" of 30px was never actually safe
       anywhere, it just happened not to visibly clip on screens where
       other rounding/line-height slack absorbed the extra ~17px. Font
       selection had less slack to spare, so it was the one that visibly
       broke. There is no version of "fake a shorter box via negative
       margin" that's safe for every headline - it was always going to
       break on SOME screen depending on exact content height. Removing
       the shrink trick entirely, for good, from every level (this
       container AND the headline element below, which never got one back
       after round 1). The bar now sizes to its true, honest content
       height on every screen, every headline, guaranteed - no more
       "which screen breaks this time." It renders ~30px taller than
       Dave's original compact target from months ago; that's the real
       cost of a bar that can never spill or clip, and it's the trade
       being made here after three rounds of the shortcut failing. */
  }
  /* Per Dave (this round): "the logo needs to move up so the vertical
     orange bar is touching the top of the iPhone browser window, then
     move it left about 15 pixels." Measured via Playwright: logo sat at
     y=7 (this band's own 7px top padding, see .tunnel-top above) and
     x=44 (.tunnel-top's 16px left padding + .tunnel-top__bar's own 28px
     left padding, desktop base rule, unchanged here). Negative margins on
     just the logo image move it to y=0/x=29 without touching the row's
     height or the Close button beside it. */
  .tunnel-top__logo {
    /* Per Dave (this round): "15% larger, same position where it touches
       the top, move it left a few more pixels." 44px base height * 1.15 =
       50.6px. Kept pinned to y=0 (per Dave's earlier explicit "touching
       the top" request) even though .tunnel-top's own top padding grew
       7px -> 33px (an earlier round's "taller top bar" request) - margin
       re-measured/re-tuned below for the new taller logo so it still
       lands exactly at y=0, not just carried over from the old height. */
    /* Per Dave (this round): "5% smaller, scoot it about 5px left." 50.6px
       * 0.95 = 48.07px. margin-top left untouched - it's not tied to
       height, only to .tunnel-top's 33px padding-top (padding-top(33) +
       margin-top(-33) = 0, still pinned to y=0 at any logo height).
       margin-left made 5px more negative (-20px -> -25px) to shift left. */
    height: 48.07px !important;
    margin-top: -33px !important;
    margin-left: -25px !important;
  }
  /* Per Dave (this round): "this content [Close / Hi Dave-Log out row]
     must move up so it's about five pixels below the top of the iPhone
     browser window" (supersedes the earlier -10px greeting-only nudge
     below, which only handled the logged-in row and left the base 20px
     top position untouched for the logged-out Login/Create Account
     state). Applied to the whole .tunnel-top__actions column (position:
     absolute, base rule top:20px) so both states land at the same 5px
     mobile-only.
     Per Dave (latest, screenshot): "this button and text needs to move
     down from top edge by 6px on mobile" - 5px -> 11px. Also: "the text
     below the close button needs more separation from the button by
     5px" - the base .tunnel-top__actions rule sets gap:8px (the vertical
     space between Close and the Login/Create-Account or Hi-Name/Log-out
     row beneath it) for both desktop and mobile; bumped to 13px here,
     mobile-only, desktop's 8px is untouched. */
  .tunnel-top__actions {
    top: 11px !important;
    gap: 13px !important;
  }
  .tunnel-top__headline {
    /* Per Dave (7/29): headers were landing at inconsistent positions
       across different steps because align-items:center (base rule)
       centers text vertically, so a 1-line header and a 2-line header
       land differently even with identical padding. Anchoring to the
       bottom instead so every panel sits the same fixed distance from
       the bar's bottom edge (that padding-bottom value below), regardless
       of how many lines the headline wraps to. */
    align-items: flex-end !important;
    /* Per Dave: flush-left on mobile, not centered - matches the base
       (desktop) rule's justify-content/text-align, just re-asserted here
       with !important since this whole mobile block leans on !important
       to beat the base rules' specificity. */
    justify-content: flex-start !important;
    text-align: left !important;
    /* Bug fix, per Dave (screenshot: headline sitting ~130px in, not flush
       left even after the justify-content/text-align fix above): the base
       rule's 4th padding value is var(--tunnel-content-left), a DESKTOP
       formula ("max(130px, calc((100vw - 1440px)/2 + 130px))") meant to
       line the headline up with the monitor mockup's left edge on a wide
       screen. It was never overridden for mobile, so it was still forcing
       ~130px of left padding here regardless of justify-content/text-align
       (those only control alignment WITHIN the padded box, not the box's
       own offset). Pinned to a normal mobile left padding instead. */
    /* Per Dave (this round): card content below reads ~12-13px further
       right than this header, making the whole mobile layout look
       "staggered"/misaligned. Bumped from 20px to 28px to match the new
       .tunnel-card / .tunnel-bottom left padding below - one shared left
       edge for header, card content, and the bottom bar. */
    /* Bug fix, per Dave (newest report): "top reverse headers need to
       move left approx 10-12px to align with copy below" - the 28px set
       above was measured against .tunnel-card's OWN padding-left in
       isolation, but this headline wrapper sits nested one level deeper -
       inside .tunnel-top, which itself already has padding-left:16px (see
       .tunnel-top above). Those two stack (16px + 28px = 44px real offset
       from the viewport edge), while .tunnel-card's 28px is its only
       layer of left padding - so the headline was rendering 16px further
       right than the copy below, not the 0px the matching 28px values
       implied. Cut to 12px here so the STACKED total (16px + 12px = 28px)
       actually matches the card's 28px, instead of matching the number in
       isolation. */
    padding-left: 12px !important;
    /* Per Dave: "move this header up 4px away from the bottom of the dark
       bar" - base rule's padding is 26px top / 1.5px bottom (see base
       .tunnel-top__headline rule above), and .tunnel-top's own height is
       content-driven (flex-basis:auto, see .tunnel-top above), so shifting
       padding-top -> padding-bottom by 4px moves the text up within the
       band without changing the band's own total height (no knock-on
       resize of anything below it). */
    /* Per Dave (7/29): header was crowding the logo above it - moved
       down so it clears the logo, landing about 10px above the bottom of
       the dark bar as asked.
       Per Dave (this round): "too high above the bottom of that color
       bar... move it down." A prior attempt this same round used
       margin-top on the h2 child instead of this padding-top/bottom pair -
       Dave confirmed that was "zero change," which makes sense in
       hindsight: .tunnel-top__headline is align-items:flex-end, so the
       h2's own margin-top just grows the auto-height container from the
       top while the item stays flush against padding-bottom at the
       bottom - it never visibly moves. This uses the ACTUAL proven lever
       instead (see the padding-top<->padding-bottom redistribution note
       above, same mechanism, opposite direction): padding-bottom cut to
       its floor of 0 (was 12px) with the same 12px added to padding-top
       (56->68) so the sum - and therefore the band's own total height -
       stays IDENTICAL (respects the "BAR HEIGHT - LOCKED" rule directly
       below; nothing below this band shifts). This is the maximum safe
       move in this direction (padding-bottom can't go negative), landing
       the text flush against the band's bottom edge - it physically
       cannot overshoot past that edge into the white content below. */
    padding-top: 68px !important;
    padding-bottom: 0 !important;
  }
  /* BAR HEIGHT - LOCKED (2026-07-29), per Dave: "make the top dark bar
     headers all identical, that shorter size we had for so long, and lock
     that in - do not keep changing the size of that bar." Explicit
     instruction: step 1 is stop touching this bar's height at all.
     Restoring the exact compact height/position via the mechanism already
     confirmed correct on every top-level panel (Dave: "good on all of the
     top-level panels") - the -30px shrink lives on .tunnel-top itself
     (the outer band's own box), NOT on .tunnel-top__headline (the text
     block, just above - that block's own padding is untouched, so text
     position is unaffected). Because .tunnel-top's own box (background +
     everything it directly contains) shrinks together as one unit here,
     there's no internal mismatch the way there was when this trick lived
     on the headline alone - the overlap this creates is with the NEXT
     band down (.tunnel-mid, solid white), not with this bar's own text.
     This value is locked per Dave's explicit instruction - the
     font-selection glitch is being isolated and fixed separately in
     tunnel.js instead, without touching this bar again. */
  .tunnel-top {
    margin-bottom: -30px !important;
  }
  /* REMOVED (2026-08-04), per Dave: "when I login to my account on my
     iPhone, the text 'Hi Dave! and log out' shift UP and touch the close
     button above it! it's fine w/o logging in... but when showing an
     acct. it breaks and shifts up overlapping button."
     This -10px margin-top was added back when .tunnel-top__actions' own
     column gap was 13px (see that rule above, top:11px/gap:13px) - at
     that gap, -10px just tightened the greeting row a bit (net ~3px)
     without causing overlap. A LATER round added a second
     .tunnel-top__actions{gap:8px !important;} override further down this
     same media block (still in force - same specificity, later wins) to
     tighten the Close-to-row spacing generally, but nothing re-checked
     this older -10px margin against the new smaller gap. Stacked
     together they net to 8px - 10px = -2px, i.e. the greeting row
     overlapping the Close button above it by 2px - exactly what Dave
     saw, and exactly why the logged-out Login/Create Account row (which
     never had this extra margin) was fine. Removed entirely; the
     greeting row now uses the same 8px gap as every other state. */
  /* Per Dave (this round): top-band header ("Your new website." / "You're
     all set!" etc.) reading too small/lost next to the rest of the now-
     bigger mobile headers - wants it larger too. Band is flex-shrink:0 and
     sizes to its own content (see .tunnel-top above), so growing this just
     grows the band with it - no overflow risk. */
  .tunnel-top__headline h2 {
    /* Per Dave (this round): reverse headers in the top color bar read
       too small - bumped ~18% (26px->31px, 32px->38px, 7vw->8.3vw), still
       fits one line at every mobile width. */
    font-size: clamp(31px, 8.3vw, 38px) !important;
    /* Per Dave (this round): "space between bottom of text and bottom of
       the plum bar... needs to be about half of what we have it
       currently, mobile only." padding-bottom on the parent (below) is
       already at its floor of 0 from last round, so that lever is maxed
       out - the remaining gap Dave's seeing is the line-height itself:
       even at padding-bottom:0, line-height adds empty space below the
       actual glyphs (and an equal amount above them) as part of the
       line's own box. 1.2 -> 1.1 cuts that extra (0.2x font-size worth)
       in half (0.1x), which - split evenly top/bottom - roughly halves
       the visible gap below the text specifically, matching the ask. */
    line-height: 1.1 !important;
    text-align: left !important;
    /* Per Dave (this round): "position these headers down about seven
       pixels from where they're at" - nudges just the headline text down,
       independent of the logo/Close row above it.
       Per Dave (this round, again): "move position of reverse headers in
       the upper color bar up three pixels from where you have it
       currently, mobile only." 7px -> 4px.
       REVERTED (this round): tried margin-top:20px here for "move down
       16px," Dave confirmed zero visible change. Root cause: this h2 sits
       in an align-items:flex-end parent (.tunnel-top__headline), so
       margin-top just grows that auto-height container from the top while
       the item stays pinned to the bottom via padding-bottom - it can
       never visibly move this way. Reverted to the original 4px; the real
       fix now lives on .tunnel-top__headline's own padding-top/
       padding-bottom below (the proven lever this file already uses for
       this exact move). */
    margin-top: 4px !important;
  }
  .tunnel-top__actions {
    gap: 8px !important;
  }

  /* REVERSED (this round), per Dave: "I think I'd like to use the wizard
     on the mobile view in the top of the bottom gray bar, w/ the
     start/next/back buttons at the bottom of that gray bar" - a prior
     round cut the chip trail entirely on mobile (see the old rule this
     replaces); Dave now wants it back, in the same spot it already lives
     in the DOM/CSS structure on desktop (.tunnel-bottom__header, above
     .tunnel-bottom__main's Back/Next/Start row - see that layout earlier
     in this file). Re-enabled here; the rules just below trim it down for
     a phone-width row (drop the first category, smaller type, tighter
     spacing) rather than just turning the desktop version back on as-is.
     Click-to-revisit an already-completed category needs no separate
     mobile wiring - tunnel.js's chip click handler (gated on the same
     `.is-done` class desktop already uses) is shared markup/JS for every
     breakpoint, so it starts working the instant the trail is visible
     again. */
  .tunnel-trail {
    display: flex !important;
  }
  /* Per Dave: "for mobile only leave off the first one 'Your Website',
     don't need it on mobile... keep all intact on desktop." Hides just
     the first chip (data-chip-index="0", set in buildTrail() in
     tunnel.js) plus the connecting segment immediately after it
     (data-seg-index="0", same indexing scheme) so there's no stray
     leading line with nothing attached to its left once the first chip
     is gone - the trail now visually starts at "Changes". Desktop is
     untouched (this whole block only applies at max-width:767px). */
  .tunnel-chip[data-chip-index="0"],
  .tunnel-trail__seg[data-seg-index="0"] {
    display: none !important;
  }
  /* Per Dave: "make the type small enough to fit in the width of the
     iphone w/o it text wrapping" - the desktop label size (9px) still
     wraps some of the longer labels ("Web Care") at real iPhone widths
     once 6 chips + connecting lines have to share the row; trimmed
     further for mobile only.
     Fix (this round), per Dave: "make the type larger... and 90%
     horizontal scale so it's a little squished" - now that the edge
     padding, chip-to-chip spacing, and checkmark gap below have all been
     tightened, there's real room to size the label text back up. Bumped
     7.5px -> 10px (a meaningful step up, not just a token nudge) and added
     a horizontal-only squeeze (scaleX(.9), anchored to the left edge via
     transform-origin so the squeeze doesn't shift where each label starts)
     so the wider glyphs still take up less real width than a plain 10px
     would, same idea as condensed type. Mobile only - desktop's own 9px
     .tunnel-chip__label rule elsewhere in this file is untouched.
     Fix (this round, again), per Dave: "make everything big to stretch it
     out to fit those new parameters" - now that the edges/gaps below are
     even tighter, sized back up again, 10px -> 12px. */
  /* Fix (this round), per Dave: "the type can be about 3% larger overall"
     - 12px -> 12.4px (~3%).
     Fix (this round), per Dave (repeat): "the bottom of the 'g' letters is
     still cut off/cropped out" even after the .tunnel-trail overflow-y fix
     elsewhere in this file. ROOT CAUSE this time: the base (desktop
     dot-timeline) .tunnel-chip__label rule sets line-height:1 - a line box
     exactly as tall as the font-size, with zero room for the font's real
     descent (the "g" tail extends below that box). overflow:visible on the
     label (also from the base rule) lets the glyph paint past its own line
     box, but the ROW's height (.tunnel-chip, align-items:center) is
     measured from that too-short line box, and this tight bottom-bar
     layout leaves no real slack below it. Explicit line-height:1.3 here
     (mobile only - desktop's dot-under-label design still wants line-
     height:1, untouched) gives the line box itself enough room for real
     descenders, matching the same "line-height, not just overflow" fix
     already applied to the top-band headline/detail headings elsewhere in
     this file. */
  /* BUG FIX (this round), per Dave: "you do NOT have it constraining or
     resizing within the phone size... it's just staying same size on
     smaller phones and running off the right edge." Confirmed via his 3
     screenshots (SE 375px, 12 Pro 390px, 14 Pro Max 428px): every size
     below (label font, dot, segment width, gap) was a FIXED px value,
     tuned by trial-and-error specifically against a Pro Max-width render -
     the `overflow-x:hidden` safety net a few rounds back was only ever a
     clip, not real responsive shrinking, so on any narrower phone the row
     simply didn't fit and the excess (the last chip(s)) got clipped off -
     exactly "Review" vanishing on SE/12 Pro. ROOT-CAUSE FIX: every size
     that contributes to this row's total width is now `vw`-based (via
     clamp(), with the OLD fixed values kept as the clamp's max ceiling)
     instead of a flat px number. Because font-size, dot size, segment
     width, AND gap now all scale together with actual viewport width, the
     row's total content width scales down in the same proportion as the
     viewport itself - if it fits with room to spare at 428px (confirmed
     via Dave's Pro Max screenshot), it fits with that SAME proportional
     room at 375px too, instead of staying fixed-size and clipping. */
  .tunnel-bottom__header .tunnel-chip__label {
    font-size: clamp(9.5px, 2.9vw, 12.4px) !important;
    line-height: 1.3 !important;
    white-space: nowrap !important;
    display: inline-block;
    transform: scaleX(.9);
    transform-origin: left center;
  }
  /* Per Dave: "maybe a little less padding between the cats" - the
     connecting-segment slot (.tunnel-trail__seg, the actual lever for
     chip-to-chip spacing - see its own base-rule comment history earlier
     in this file) trimmed from the desktop 68px down for mobile only;
     positionTrailSegments() in tunnel.js re-measures the real dot
     positions on every layout change, so the connecting line itself stays
     correctly aligned at this tighter spacing with no JS changes needed.
     Fix (this round), per Dave: "about 30% less padding between each
     category than you currently have" - 34px * 0.7 = 23.8px, rounded to
     24px.
     Fix (this round, again), per Dave: "30% less than what you have it
     now" (a fresh cut, on top of the round above, not a repeat of the same
     30%) - 24px * 0.7 = 16.8px, rounded to 17px.
     Fix (this round, yet again), per Dave: "you can STILL reduce the
     padding between categories by nearly half" - 17px -> 9px.
     RESET (this round), per Dave (repeat complaint about lunging between
     extremes instead of landing surgically): the 9px cut above, combined
     with the trail's own gap cut below, shrank the whole row far more than
     intended - it now reads as tiny with a big dead gap on the right
     instead of using the real estate. Eased back up to a middle value
     (9px -> 14px) - tighter than the original 34px, not as severe as 9px.
     Fix (this round), per Dave: "the 'w' on 'Review' is missing, cut off
     on the far right" - STILL happening at 14px because the row's real
     total content width (6 labels + 6 dots + 5 segments + 5 gaps, now also
     3% wider per the type-size bump above) was landing right at the edge
     of the safety-net's max-width:100%/overflow-x:hidden clip on typical
     phone widths - not a bug in the clip itself, just not enough slack
     left over for it to matter. Trimmed further, paired with the gap
     trim below, to reclaim real width for the now-larger type: 14px -> 9px.
     BUG FIX (this round), per Dave: "constrain/resize within the phone
     size" - fixed 9px never shrank on narrower phones, one of the several
     fixed values causing the SE/12 Pro overflow (see the label font-size
     fix above for the full explanation). Converted to the same vw-based
     clamp approach, old value kept as the ceiling. */
  .tunnel-trail__seg {
    flex-basis: clamp(6px, 2.1vw, 9px) !important;
  }
  /* RESET (this round), per Dave: "have both sides being maybe 4 or 6px
     away from the left/right edge of the phone... can that be determinant
     on the phone res?" Every earlier round here computed a negative
     margin against the PARENT .tunnel-bottom's own padding (28px left /
     16px right) - a fragile chain of magic numbers that had to be
     re-derived by hand each time and kept overshooting in one direction or
     the other. Replaced with a clean, direct reset instead: margin fully
     cancels the parent's padding (-28px / -16px, landing this row's own
     box flush at 0/0, no more reverse-engineered numbers), then a real
     padding-left/right is added back on THIS element directly, sized with
     clamp() so it's genuinely resolution-independent - 4px on the
     narrowest phones up to 6px on the widest, scaling with actual viewport
     width via vw instead of one fixed px guessed at for a single device. */
  .tunnel-bottom__header {
    margin-left: -28px !important;
    margin-right: -16px !important;
    padding-left: clamp(4px, 1.3vw, 6px) !important;
    padding-right: clamp(4px, 1.3vw, 6px) !important;
  }
  /* BUG FIX (this round, found after Dave's screenshot showed "Review"
     STILL cut off after the previous round's changes): the previous fix
     only shrank .tunnel-trail__seg (the connecting-line slot), but missed
     a SEPARATE, later .tunnel-trail rule elsewhere in this file that sets
     its own `gap: 16px` between every chip - stacking on TOP of the
     segment width, at every breakpoint, never scoped for mobile at all.
     That 16px x 5 gaps (~80px) was the real leftover width the earlier
     round's math didn't account for. Cut hard for mobile only.
     RESET (this round), per Dave: eased back up in step with the segment
     flex-basis reset above (4px -> 8px) - same "middle ground, not another
     extreme" reasoning.
     Fix (this round), per Dave: "Review" still clipping + "3% larger" type
     both this round - trimmed further in step with .tunnel-trail__seg's
     matching cut above, to reclaim width for the bigger type: 8px -> 5px.
     BUG FIX (this round), per Dave: fixed 5px never shrank on narrower
     phones - same vw-based clamp conversion as the label font-size and
     segment width above, old value kept as the ceiling. */
  .tunnel-bottom__header .tunnel-trail {
    gap: clamp(3px, 1.17vw, 5px) !important;
  }
  /* SAFETY NET (this round), per Dave: "it needs to adjust to fit any
     phone, not run off of some phones." Even with the sizing above tuned
     for a Pro Max screen, a narrower phone (SE, mini, etc.) could still
     come up short on width. Rather than leave that to chance, this caps
     the trail to the row's own available width and clips gracefully
     instead of bleeding past the visible screen on any device this
     hasn't been checked on. This stays in place regardless of the sizing
     tweaks above/below - it only ever activates as a last resort.
     BUG FIX (this round), per Dave: "the bottom of the 'g' letters in the
     wizard are being cut off." The plain `overflow: hidden` shorthand just
     above clipped BOTH axes - this row's own height is sized tight to the
     label text's line box, so any real descender (the tail of a "g")
     extending slightly past that box got cropped right along with the
     horizontal safety clip this was actually meant for. Split into
     overflow-x:hidden (keeps the intended right-edge safety net) plus
     overflow-y:visible (lets descenders render in full again) instead of
     the single shorthand that clipped everything. */
  .tunnel-bottom__header .tunnel-trail {
    max-width: 100% !important;
    overflow-x: hidden !important;
    overflow-y: visible !important;
  }
  /* Fix (this round), per Dave: "move the checkmarks slightly closer to
     their words" - further tightening the shared -3px gray-bar dot gap
     (see .tunnel-bottom__header .tunnel-chip__dot elsewhere in this file,
     which stays untouched so desktop's bottom-bar chip trail isn't
     affected) with an additional mobile-only nudge.
     Fix (this round, again), per Dave: "make everything big" - the dot/
     checkmark slot itself sized up in step with the label text above
     (shared base .tunnel-chip__dot is 11px), so the checkmark reads at
     the same bigger scale as its now-larger word.
     Fix (this round), per Dave: "3% larger" + "Review" still clipping -
     dot bumped 3% in step with the label (13px -> 13.4px) and tightened
     slightly further (-5px -> -6px) to help reclaim width for the bigger
     type.
     BUG FIX (this round), per Dave: "the 'w' is missing completely on
     Review" - the previous round's fix for this exact bug (tightening
     .tunnel-trail__seg to 9px and this row's gap to 5px) got directly
     undone by the "move checkmarks 2px left" change right after it: doing
     that via margin-right -6px -> -4px added real layout width back
     (2px x 6 chips = 12px), eating the slack that fix had just reclaimed
     and then some - reintroducing the overflow, worse than before. Reverted
     margin-right to -6px (restores the reclaimed width) and moved the
     checkmark left via `transform: translateX(-2px)` instead - a visual-
     only shift that doesn't consume any layout width/flex space, so it
     can't reopen this same overflow bug again.
     BUG FIX (this round), per Dave: fixed 13.4px dot / -6px margin never
     shrank on narrower phones either - same vw-based clamp conversion,
     old values kept as the ceiling/floor so Pro Max renders identically to
     before. */
  .tunnel-bottom__header .tunnel-chip__dot {
    margin-right: clamp(-6px, -1.4vw, -4.5px) !important;
    width: clamp(10px, 3.13vw, 13.4px) !important;
    height: clamp(10px, 3.13vw, 13.4px) !important;
    flex: 0 0 clamp(10px, 3.13vw, 13.4px) !important;
    transform: translateX(-2px);
  }

  /* BUG FIX (this round), per Dave (repeat, 3rd time): "the W is being cut
     off [on iPhone 12 Pro] and on the SE even more of the word Review is
     being cut off... that needs to work and fit completely on any phone
     size." Confirmed via a real Playwright measurement pass at 375/390/428
     that the previous vw-based clamp round (font-size, dot size, segment
     width, row gap, edge padding - all converted already) still left ONE
     fixed, never-scaled contributor: the "pill-style trail restyle" block
     earlier in this file sets a flat `.tunnel-chip { gap: 5px; }` (the
     inner gap between each chip's own dot and its label) that applies at
     EVERY viewport, mobile included - it was simply missed in the earlier
     mobile-only override pass since it lives on the bare `.tunnel-chip`
     selector, not `.tunnel-bottom__header .tunnel-trail`/`__seg`/`__dot`
     which is what that pass actually touched. With 6 visible mobile chips
     each carrying this same fixed 5px, that's ~30px of real width that
     never shrank on narrower phones while everything around it did -
     exactly the kind of leftover fixed-px contributor that reopens
     clipping once the true device width is scarce enough (SE/12 Pro).
     Converted to the same vw-based clamp formula as every other value in
     this fix pass (5 / 428 * 100 = 1.17vw, old value kept as the ceiling).
     Also nudging the ceiling itself down slightly (5px -> 4.5px) as extra
     real-world headroom: this synthetic-render math was verified using
     the fallback system font (this sandbox has no live internet access to
     load the real Google-hosted Plus Jakarta Sans), and the real webfont's
     actual glyph widths (esp. capital "W") can run measurably wider than
     the fallback - trimming the ceiling a hair gives genuine slack instead
     of landing exactly on the edge again. */
  .tunnel-bottom__header .tunnel-chip {
    gap: clamp(2.5px, 1.05vw, 4.5px) !important;
  }

  /* BUG FIX (this round), per Dave's screenshot: the chip trail text was
     riding up into the white card area above, its top half cropped by the
     boundary between .tunnel-mid and the gray .tunnel-bottom band (read as
     "words up so high, almost coming out of the gray bar" and, as a side
     effect of only the bottom half of each glyph rendering visibly, "the
     text looks smaller" and "the g is still cut off" - same visual symptom,
     one root cause). ROOT CAUSE: the base (non-mobile-scoped)
     .tunnel-bottom__header rule sets `margin-top: -22px`, reverse-engineered
     against .tunnel-bottom's OLD mobile padding-top of 32px (net gap
     32-22=10px, by coincidence the right amount). This round's "gray bar
     12px shorter" fix (above) dropped that padding-top to 20px, but nothing
     compensated this margin - net gap became 20-22=-2px, i.e. the trail row
     sat 2px ABOVE the band's own top edge instead of 10px below it. Adding a
     mobile-only override restores the same 10px net gap (20-10=10) so the
     whole row moves down together with the shortened band instead of
     poking up out of it - this is what makes "the wizard come down"
     concretely for this specific row, on top of the automatic flex-grow
     reflow already covering .tunnel-mid above. */
  .tunnel-bottom__header {
    margin-top: -10px !important;
  }

  /* Per Dave: "remove ALL visible scroll bars on the right on mobile view
     within the pay portal." Several internal scrolling regions in this
     tunnel (the Logo Design flow, Care access flow, Additional Pages flow,
     and the Payment/Summary card) were deliberately given a thin, visible
     scrollbar (scrollbar-width:thin + custom webkit thumb, see each of
     those rules earlier in this file) as an intentional desktop affordance
     ("mouse users need to see there's more below"). On mobile, touch
     scrolling makes that visible track/thumb pure clutter along the right
     edge - hidden here the same way .tunnel-mid__content's own scrollbar
     already is (scrollbar-width:none + the matching ::-webkit-scrollbar
     display:none), for all four of these regions, mobile only. Desktop
     keeps its visible thin scrollbar on all four untouched. */
  .tunnel-logo-flow,
  .tunnel-care-access__flow,
  .tunnel-pages-flow.is-visible,
  .tunnel-summary {
    scrollbar-width: none !important;
  }
  .tunnel-logo-flow::-webkit-scrollbar,
  .tunnel-care-access__flow::-webkit-scrollbar,
  .tunnel-pages-flow.is-visible::-webkit-scrollbar,
  .tunnel-summary::-webkit-scrollbar {
    display: none !important;
    width: 0 !important;
  }

  /* Per Dave (this round), mobile only: "make all the change buttons on the
     review tile on mobile larger by 15%... they're too small to read." Covers
     every button sharing .tunnel-summary__edit-btn - the "Make change" pills
     on each itemized row and "Change Payment Method" below the total - via
     the one shared base rule. Scaled from the ORIGINAL pre-edit values
     (8px / 2.5px-8px padding), a clean 115%, not compounded on top of the
     separate +10% desktop bump made to that same base rule this round -
     mobile and desktop now scale independently from the original baseline. */
  .tunnel-summary__edit-btn {
    font-size: 9.2px !important;
    padding: 2.875px 9.2px !important;
  }

  /* ---- Middle band: scrolls instead of hard-capping every panel ---- */
  .tunnel-mid {
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch;
    align-items: flex-start !important;
    padding: 0 !important;
  }
  .tunnel-mid__unit {
    flex-direction: column !important;
    max-width: 100% !important;
    padding-left: 0 !important;
    align-items: stretch !important;
    gap: 0 !important;
    min-height: 100%;
  }
  .tunnel-mid__content {
    width: 100% !important;
    flex: 1 1 auto !important;
  }

  /* Monitor mockup: hidden on every slide except the first (foundation)
     one - see the is-monitor-slide class note in the block comment above. */
  .tunnel-mid__preview {
    display: none;
  }
  #webyayTunnel.is-monitor-slide .tunnel-mid__preview {
    display: flex !important;
    justify-content: center;
    /* Bug fix, per Dave: "reduce the space between top of monitor and
       content below [above?] by 9px on mobile throughout" - this
       padding-top is the real gap between the dark top band's bottom
       edge and the monitor mockup's own top edge, on every slide that
       shows the monitor (this rule is the shared, single source for all
       of them - "throughout" is automatic, not per-slide). Trimmed
       18px -> 9px.
       Per Dave (this round): "the monitor and View New Site button are a
       tad too high on mobile, move them down 7px - same on every panel."
       Since this is already the single shared rule for every slide/client
       copy that shows the monitor, one change here covers all of them.
       9px -> 16px. */
    padding: 16px 16px 0;
  }
  /* Bug fix, per Dave: the monitor mockup was "peeking out" from behind
     the embedded Create Account panel - root cause is that #accountFlowModal
     is a separate element outside the tunnel's own card structure (see the
     account-embed notes elsewhere in this file), so opening it doesn't
     change which tunnel category is "current" underneath it - if that
     category happens to be a yes/no card still in its pre-detail state
     (e.g. Hosting & Care, right before its account gate fires), is-
     monitor-slide is still active and the monitor stays showing behind
     the (not always full-bleed on every screen size) account panel.
     Force it off outright whenever the account form is embedded, full
     stop - it should never be visible while that panel is up.
     BUG FIX (per Dave, this round): "monitor still showing through when I
     hit Create Account / Login in the upper right." This rule was never
     actually winning - measured live via Playwright: the OTHER mobile rule
     just above, `#webyayTunnel.is-monitor-slide .tunnel-mid__preview
     {display:flex!important}`, has an ID selector (#webyayTunnel), which
     out-specifies this plain `body.tunnel-account-embed` class selector
     even with matching !important on both sides - #webyayTunnel keeps its
     is-monitor-slide class the whole time the corner Login/Create Account
     links are used (a different code path from the mid-checkout gate,
     which happens to close/reopen the tunnel in a way that usually clears
     it), so the higher-specificity "show" rule was silently winning
     whenever that path was hit. Added #webyayTunnel into THIS selector too
     so it's specificity-equal-or-greater no matter what class combination
     is on the tunnel at the time - this must always win once the account
     panel is embedded, full stop, matching the original intent above. */
  body.tunnel-account-embed #webyayTunnel .tunnel-mid__preview {
    display: none !important;
  }
  #webyayTunnel.is-monitor-slide .tunnel-intro__visual {
    /* Fixed mobile size rather than the desktop JS-computed --intro-scale
       (that math targets filling a wide desktop column's height, not a
       sane phone width). !important beats tunnel.js's inline
       style.setProperty('--intro-scale', ...) call, since an !important
       author-stylesheet declaration outranks a non-important inline style.
       Per Dave: "larger monitor scene" - bumped 0.46 -> 0.6. */
    --intro-scale: 0.6 !important;
    width: calc(587px * 0.6) !important;
    height: calc(435px * 0.6) !important;
  }
  /* SUPERSEDED (this round), per Dave: "remove pill outline on this button
     and have '+' plus sign to the right of the text just like the below
     buttons, with same exact size/styling as the 7 buttons below it
     (mobile and desktop)." The old "make it bigger, proper tap target"
     sizing from an earlier round is explicitly replaced now that Dave
     wants this pill matched to the Foundation buttons' current mobile
     treatment instead - same values as .tunnel-foundation-pill's mobile
     override (10px font, 5px/6px padding, 22px min-height, 15px gap to
     the plus), not its own one-off size.
     BUG FIX (this round), per Dave: "the 'View Your New Site' button looks
     miniature, does NOT match the size of the 7 buttons below." Root
     cause: this button lives INSIDE .tunnel-intro__stage, which on mobile
     gets `transform: scale(var(--intro-scale))` with --intro-scale:0.6 (see
     #webyayTunnel.is-monitor-slide .tunnel-intro__visual above) - shrinking
     the ENTIRE monitor mockup, button included, to 60% of whatever size is
     set here. So the plain 10px/5px/6px/etc. values above were rendering
     at 60% of that - genuinely tiny, and correctly out of step with the
     7 unscaled buttons below. Same "compensate for an ancestor's
     transform:scale" fix pattern already used elsewhere in this file (see
     the comparison-side-cta button earlier) - dividing every value here by
     var(--intro-scale) so the FINAL rendered size, after the 0.6 shrink,
     lands back at the true 10px/5px/6px/22px/15px the 7 buttons use. */
  .tunnel-view-newsite-pill {
    font-size: calc(10px / var(--intro-scale)) !important;
    padding: calc(5px / var(--intro-scale)) calc(6px / var(--intro-scale)) !important;
    min-height: calc(22px / var(--intro-scale)) !important;
    /* Fix (this round), per Dave: "move text in this button to the right
       (closer to the plus sign) by 4px" - the gap between label and plus
       is what actually controls that distance, so trimmed by a real 4px
       (15px -> 11px), still divided by --intro-scale so it's a true 4px
       on screen after the ancestor's 0.6 shrink, not 4px pre-scale (which
       would only read as ~2.4px once rendered). */
    gap: calc(11px / var(--intro-scale)) !important;
    /* Fix (this round), per Dave: "move text and + sign down 4px." Base
       rule's transform:translate(-50%,-50%) centers this pill on its
       anchor point - appending a translateY here shifts it down from that
       center without disturbing the centering itself, again divided by
       --intro-scale for a true 4px on screen. */
    transform: translate(-50%, -50%) translateY(calc(4px / var(--intro-scale))) !important;
  }
  /* Same ancestor-scale compensation applied to the "+" icon (both its own
     box and the two bars drawn via ::before/::after) - without this, the
     icon would still render at 60% of the 7-button plus icon's true size
     even though the button's own text now matches. */
  .tunnel-view-newsite-pill .tunnel-foundation-pill__plus {
    width: calc(7.7px / var(--intro-scale)) !important;
    height: calc(7.7px / var(--intro-scale)) !important;
    flex: 0 0 calc(7.7px / var(--intro-scale)) !important;
  }
  .tunnel-view-newsite-pill .tunnel-foundation-pill__plus::before {
    width: calc(7.7px / var(--intro-scale)) !important;
    height: calc(1.3px / var(--intro-scale)) !important;
  }
  .tunnel-view-newsite-pill .tunnel-foundation-pill__plus::after {
    width: calc(1.3px / var(--intro-scale)) !important;
    height: calc(7.7px / var(--intro-scale)) !important;
  }
  /* Bug fix, per Dave: "way too much space between the eyebrow and the
     monitor." Root cause: .tunnel-card[data-info-detail="true"]
     .tunnel-card__eyebrow carries a 32px margin-top that's a DESKTOP-only
     compensation (see that rule's comment above - it exists to rebalance
     a vertical-centering trick that only applies to the desktop absolute-
     positioned carousel). Mobile cards are plain normal-flow blocks with
     no such centering, so that 32px was pure unexplained dead space here.
     Zeroed out on mobile only - desktop's own 32px is untouched. */
  .tunnel-card[data-info-detail="true"] .tunnel-card__eyebrow {
    margin-top: 0 !important;
  }
  /* Per Dave: "way too much space between the header and the content
     below it [Website Design] - should be about a third of what it is
     now." Measured via Playwright: 50px total on this Foundation card
     (question-to-Website-Design), only 28px of which is the question's
     own margin-bottom (the shared .tunnel-card__question rule above, used
     everywhere for breathing room before Yes/No buttons on the other
     cards - can't shrink that globally without also tightening every
     yes/no card's header-to-buttons gap, which nobody asked for). The
     other 22px is baked into this specific info-detail card's layout
     independent of that margin. Scoped a smaller/negative margin-bottom
     to JUST this card's question so the total lands at ~17px (a third of
     50), without touching the question's spacing on any other slide. */
  .tunnel-card[data-info-detail="true"] .tunnel-card__question {
    margin-bottom: -5px !important;
  }

  /* ---- Cards: normal document flow, not the absolute-positioned
     desktop carousel. Only the current card renders; prev/next/far are
     simply not shown (no slide animation on mobile - see block comment). ---- */
  .tunnel-card {
    position: relative !important;
    left: auto !important;
    top: auto !important;
    width: 100% !important;
    max-width: 100% !important;
    max-height: none !important;
    /* ROOT CAUSE of "still not gliding in on mobile" (repeat complaint):
       this was `transform: none !important`. Per the CSS cascade spec,
       an `!important` declaration on a property wins over that SAME
       property being driven by a Web Animations API el.animate() call
       (confirmed empirically via Playwright: opacity, which has no
       competing !important rule here, animated smoothly frame-by-frame;
       transform stayed locked at "none" for the animation's entire
       duration despite replayEntranceAnimation() genuinely running - see
       CARD_ENTER_KEYFRAMES in tunnel.js). Dropping !important here only
       (every other property on this rule keeps it) still correctly
       cancels the leftover desktop translateY(-50%) centering transform
       at rest - nothing else at mobile widths sets `transform` on
       .tunnel-card outside the entrance animation - but now lets the
       JS-driven slide-in actually paint instead of being silently
       overridden every single frame. */
    transform: none;
    /* Per Dave (this round): card content read ~12-13px too close to the
       left edge vs. the top-band header above it - "staggered"/unaligned.
       Left padding bumped 16px -> 28px to match .tunnel-top__headline's
       new 28px padding-left and .tunnel-bottom's matching left padding
       below - one shared left content edge across header/card/bottom bar. */
    padding: 18px 16px 18px 28px !important;
    /* Bug fix, per Dave: "scrolling all the way to the bottom of this
       panel, the button at the bottom needs padding - you have it sitting
       on the gray bar." .tunnel-mid scrolls independently on mobile and
       .tunnel-bottom (the $/mo + Back/Next bar) is a separate fixed band
       below it, not part of the scroll - so whatever a card's last real
       element happens to be lands flush against that bar with zero
       clearance once you scroll to the end. A generous bottom padding on
       every card guarantees breathing room no matter which slide/panel
       you're on or how its content ends. */
    padding-bottom: 40px !important;
    /* Fix, per Dave: on his iPhone, the card's eyebrow/header text
       ("Your Foundation," etc.) reads as almost touching the dark
       .tunnel-top bar above it - wants 10-15px more clearance. Bumping
       just this card's own top padding (18px -> 32px, +14px) rather than
       touching .tunnel-top or .tunnel-mid, since this is the one
       clearance value that applies regardless of scroll position. Same
       override pattern as the padding-bottom fix directly above (longhand
       property re-declared after the shorthand, same specificity, later
       in the same rule wins for that one property only). */
    padding-top: 32px !important;
    box-sizing: border-box;
  }
  .tunnel-card.is-prev,
  .tunnel-card.is-next,
  .tunnel-card.is-hidden-far {
    display: none !important;
  }
  .tunnel-card.is-current {
    display: block !important;
    /* REGRESSION FIX (round after the transform:!important removal above):
       removing !important from the base mobile `.tunnel-card{transform:none}`
       rule (see above) fixed the WAAPI slide-in animation, but at REST
       (animation finished/not running) it let the desktop-only, unguarded
       `.tunnel-card.is-current{transform:translateY(-50%) translateX(0)
       scale(1)}` rule (defined outside any media query, higher specificity:
       .tunnel-card.is-current vs. plain .tunnel-card) win instead - which
       shoved every mobile card up by half its own height (measured via
       Playwright: translateY(-234px) on the Foundation card), rendering it
       overlapping/hidden behind the monitor mockup above, and on taller
       cards (e.g. Website Changes) pushing the question/Yes-No content
       up out of the visible scroll area entirely (Dave's "just white"
       report). Fix: re-assert `transform:none` here at MATCHING
       specificity (.tunnel-card.is-current, same as the desktop rule) so
       source order (this mobile block comes later in the file) decides
       the tie at rest - still no !important, so the WAAPI entrance
       animation (a separate cascade origin that beats any non-important
       rule regardless of specificity) is untouched and keeps gliding in
       exactly as before. */
    transform: none;
    /* Per Dave (this round): "when you hit Next/No/Yes it just snaps to
       the next category with zero animation - needs to match the glide-in
       motion we have on desktop." Desktop's real effect is a dual-card
       absolute-position carousel (outgoing card slides out left/right
       WHILE the incoming one slides in from the opposite side - see
       .tunnel-card.is-prev/.is-next above) - deliberately NOT reused here,
       since mobile cards are plain-flow (position:relative, only the
       current one ever rendered - see rules above) specifically so mobile
       can scroll normally; reintroducing absolute positioning would
       reopen the exact layout problems that mobile redesign fixed. This
       is a mobile-appropriate approximation of the same idea: the
       INCOMING card (the only one ever in the DOM/visible on mobile)
       glides in from the right on every navigation. */
    /* Bug fix, per Dave (reported repeatedly - this WAS a real CSS
       `animation` here, same as this comment used to say): moved off CSS
       animation entirely and onto the Web Animations API instead (see
       replayEntranceAnimation() in tunnel.js, called from
       updateCardPositions() on every navigation) - a CSS `animation` that
       starts the instant a class lands depends on the browser noticing
       the display:none->block change in a separate paint from the
       animation starting, which iOS Safari doesn't reliably do (a known
       WebKit quirk), and this environment has no way to test real iOS
       Safari to confirm a CSS-only fix actually holds there. JS-driven
       el.animate() starts explicitly/synchronously with no dependency on
       that browser behavior at all, sidestepping the quirk rather than
       working around one instance of it. No `animation` property left
       here on purpose - leaving one would double up with the JS version. */
  }

  /* Per Dave (this round): "when we dig deeper and say Yes and all the
     content populates the page, that flows in from the bottom up, not
     from the right." Same JS-driven Web Animations API approach as the
     card slide-in above (see replayDetailEntranceAnimation() in
     tunnel.js) - not a CSS `animation`, for the identical same-tick-
     display-change reason noted above. */

  .tunnel-card__eyebrow {
    font-size: 11px !important;
  }
  /* Per Dave (mobile only): the yes/no question headers were reading as
     small/tucked-up-high, "getting lost" at 22px/2 lines - wants them
     dominant, filling more of the screen, breaking into 4-5 lines instead.
     Scales with viewport width (9vw) so it stays proportionally huge on
     both a narrow SE-width phone and a wider Pro Max-width one, clamped
     36-44px. Desktop's own clamp(26px,2.7vw,34px) above is untouched -
     this block only fires under max-width:767px.
     Per Dave (this round): "make the type size of these headers a little
     bit smaller" - the longest question ("Do you need extra inside pages
     beyond your primary base website?") was wrapping to 5 lines at the
     36-44px size, which was also the direct cause of the Yes/No buttons
     landing in a different spot on every card (see min-height fix on
     .tunnel-qa below - the two go together). Trimmed clamp down a notch:
     36-44px -> 30-36px.
     Per Dave (this round, again): "headers are just slightly too large,
     make them slightly smaller, not extreme... and slightly less
     leading/line space." Another small notch down: 30-36px -> 28-34px,
     and line-height 1.18 -> 1.13 (tighter leading, still clear of
     descender clipping - this element has no overflow:hidden anywhere in
     its rule chain, same reasoning as the desktop 1.15 note above).
     margin-bottom also halved 28px -> 14px here, per Dave's separate "half
     as much padding space between headers and no/yes buttons" ask this
     same round - paired with the .tunnel-qa min-height reduction just
     below (the two together control that gap; see that rule's comment for
     the full before/after math). */
  .tunnel-card__question {
    font-size: clamp(28px, 7.1vw, 34px) !important;
    line-height: 1.13 !important;
    margin-bottom: 14px !important;
  }
  /* Per Dave (this round): "try and make it so the Yes/No buttons are in
     the exact same position for everything." Root cause: the 4 yes/no
     cards' questions wrap to different line counts ("Do you need extra
     inside pages..." / "...hosting and/or maintaining..." both wrap to 3
     lines at 141.5px tall, "...changes to your primary page design?" /
     "...custom logo designed..." both wrap to only 2 lines at 106px) - so
     the Yes/No button row directly below always landed at a different
     height depending on which category was showing. Scoped to just
     .tunnel-qa .tunnel-card__question (the wrapper only the 4 yes/no
     cards use - see qa.className = 'tunnel-qa' in tunnel.js, Foundation/
     Payment/Summary never get it) so this doesn't add unwanted space to
     any other slide. min-height matches the tallest real question (the
     3-line ones, 141.5625px measured via Playwright) so the shorter
     2-line questions get padded down to the same total height, landing
     the buttons in the same spot either way.
     Per Dave (this round): "half as much padding space between headers
     and no/yes buttons, mobile only." Re-measured all 4 real questions at
     the smaller 28-34px/1.13 type this round set above - the tallest is no
     longer a 3-line question at ~141.5px. The Care question ("Would you
     like help hosting and/or maintaining your site each month?") now
     wraps to 4 lines at 126.5px on a narrow phone, because the smaller
     font this round fits fewer characters per line even though each line
     is shorter - so that's the new real floor, not an arbitrary half of
     the old 142px. Dropped to 128px (matches that measured 126.5px + a
     hair of rounding buffer). Combined with the margin-bottom cut above
     (28px -> 14px), the total visible gap on the 2-line "changes"/"logo"
     questions goes from ~99px to ~79px - a real, meaningful cut, but
     honestly not a full 50% cut, because this min-height can't drop
     further without the Care question's own box growing taller than the
     other 3 cards again (min-height is a floor, not a clip - undershoot it
     and Care's Yes/No buttons land lower than everyone else's, the exact
     bug this rule was added to fix). Flagged rather than silently landing
     short of "half." */
  .tunnel-qa .tunnel-card__question {
    min-height: 128px !important;
  }

  /* Per Dave (this round): "make padding space between yes/no buttons and
     headers HALF as much as you have it on mobile... on all slides that
     have yes/no buttons." Halves the base rule's margin-bottom:14px above,
     but scoped to .tunnel-qa .tunnel-card__question (same two-class
     pattern as the min-height rule directly above) so it only touches the
     4 yes/no cards - Foundation/Payment/Summary never get the .tunnel-qa
     wrapper class (see qa.className = 'tunnel-qa' in tunnel.js) and are
     untouched. min-height:128px left as-is - that's a floor tied to the
     Care question's real measured content height (see comment above), not
     "padding," so halving it would make Care's own Yes/No buttons sit
     higher than the other 3 cards again. */
  .tunnel-qa .tunnel-card__question {
    margin-bottom: 7px !important;
  }

  /* Per Dave (this round, mobile only): the Care question ("Would you like
     help hosting and/or maintaining your site...?") was wrapping to 4
     lines on a phone. Paired with shortening the question copy itself
     (questionMobile in tunnel.js drops the redundant "each month"), widen
     just this text block so more characters fit per line, aiming for 3
     lines instead of 4. .tunnel-card__question is a plain block-level
     heading with no explicit width set (see the base rule above), so
     negative margins here bleed it past .tunnel-card's own mobile padding
     (18px 16px 18px 28px, set elsewhere for alignment with the headline/
     bottom bar) and it auto-widens to fill the new edges - no width/
     calc() needed. Scoped to .tunnel-qa .tunnel-card__question (the 4
     yes/no cards only, same pattern as the two rules just above) so
     Foundation/Payment/Summary headers, which don't have this wrapping
     problem, are untouched. Trimmed down to roughly equal ~10px of
     breathing room on each side (28px left padding - 18px bleed = 10px;
     16px right padding - 6px bleed = 10px) rather than removing the
     padding entirely, so the text doesn't run edge-to-edge.
     REAL ROOT CAUSE FIX (this round), per Dave: "headers cut off/blown up
     on the left side" - every yes/no question was missing its first
     character/word on a phone. This negative margin was always bleeding
     the question 18px past .tunnel-qa's own left edge - but .tunnel-qa
     itself (the DIRECT parent, per tunnel.js's buildCards(): "the question
     + yes/no control live together in one fade group (.tunnel-qa)") has
     `overflow:hidden` on both axes (needed for its collapse animation),
     and .tunnel-qa's own box was never widened to match - so the leftmost
     ~18px of the question (the actual missing letter) was being hard-
     clipped by its own parent the whole time. The 28px-padding math in the
     comment above was measured against .tunnel-card, not the real
     clipping ancestor, which is why it looked safe on paper but wasn't.
     Fix: give .tunnel-qa the SAME negative margin/width expansion as its
     child (see .tunnel-qa rule just below) so the overflow:hidden box
     itself grows to contain the bleed instead of clipping it. */
  /* REVERTED (this round), per Dave: "zero change - actually worse than
     before" after the .tunnel-qa width-matching attempt just above (now
     removed). That attempt was based on static code reading only - this
     sandbox cannot render or screenshot the live site (file:// and
     localhost navigation both hang in the available headless browser, and
     the live domain actively resets the connection), so there was no way
     to verify it before shipping, and it evidently didn't fix - and may
     have worsened - the real issue. Rather than ship another unverified
     guess, this negative-margin "bleed past the parent" technique is
     removed entirely: margin-left/margin-right zeroed out so the question
     sits fully inside .tunnel-card's normal 28px/16px mobile padding with
     no negative offset for ANY ancestor's overflow:hidden to clip,
     regardless of exactly which ancestor turns out to be the real culprit.
     Trade-off: the Care question ("Would you like help hosting and/or
     maintaining your site...?") may wrap back to 4 lines instead of 3 on
     narrow phones - a cosmetic regression, not a clipped/missing-text bug,
     so it's the safe direction to fail in until this can be confirmed
     visually. */
  .tunnel-qa .tunnel-card__question {
    margin-left: 0 !important;
    margin-right: 0 !important;
  }

  /* Bug fix, per Dave (mobile only): the round step-back button on the
     Additional Pages "Page N of X" header was sitting way too low, not
     adjacent to the header text. Root cause: .tunnel-page-panel__header
     carries the shared .tunnel-card__question class (see the base rule
     above), which on mobile sets margin-bottom:28px !important - correct
     for every OTHER use of that class (a standalone question with Yes/No
     buttons below it), but here the header is a flex ITEM sharing a row
     with the round button (.tunnel-page-panel__header-row, align-
     items:center). That 28px bottom margin is included in the header's
     outer box for centering purposes, so the row centered the button
     against a box far taller than the visible text - landing the button
     near the bottom of that invisible margin instead of next to the text.
     Zeroed out here (this specific header only, not the shared class) so
     the row's real height matches the visible text and the button
     centers against it correctly. Gap also widened slightly per Dave's
     "move it away from the header a bit, ~15px" ask. */
  .tunnel-page-panel__header-row {
    gap: 15px !important;
    align-items: center !important;
    margin-bottom: 4px !important;
  }
  .tunnel-page-panel__header-row .tunnel-page-panel__header {
    margin-bottom: 0 !important;
  }

  /* Every hard-coded desktop height cap released - see block comment
     item 1. Mobile scrolls; nothing needs to fit a fixed band anymore. */
  .tunnel-qa,
  .tunnel-detail,
  .tunnel-detail.is-visible,
  .tunnel-card[data-info-detail="true"] .tunnel-detail,
  .tunnel-card[data-summary-detail="true"] {
    max-height: none !important;
  }
  /* Bug fix, found per Dave: "the additional options are floating alone
     in the middle of the page" with a couple hundred px of blank space
     above them. Root cause - the max-height:none !important right above
     unintentionally also beat .tunnel-qa.is-collapsed's own max-height:0
     (that rule has no !important, so per CSS's !important-trumps-
     specificity rule it lost even though .is-collapsed is more specific).
     The answered Yes/No question + buttons were genuinely invisible
     (opacity:0) but still reserving their full ~240px of layout height
     underneath the eyebrow - that reserved space WAS the blank gap. This
     re-asserts the collapse for real on mobile. */
  .tunnel-qa.is-collapsed {
    max-height: 0 !important;
  }
  /* Per Dave: once a Yes/No question collapses, its detail panel (the
     tile/options content) should sit close under the eyebrow - "almost
     attached... maybe 30 pixels below the eyebrow" - rather than wherever
     the (now zero-height) collapsed question happened to leave it.
     Per Dave (this round): "15 pixels less padding between the eyebrow and
     the header here throughout" (screenshot: Additional Pages' "Page 1 of
     1" header) - this is the one shared rule behind that gap on every
     slide (not pages-specific), so trimming it here applies everywhere at
     once, same as the original 30px value did. 30px -> 15px. */
  .tunnel-detail.is-visible {
    margin-top: 15px !important;
  }
  /* Per Dave: these sub-headers ("What kind of changes?" etc.) were
     reading small/lost - wants them larger and dominant, matching the
     bigger-header treatment just given to .tunnel-card__question above. */
  .tunnel-detail__heading--subquestion {
    font-size: 28px !important;
    line-height: 1.2 !important;
    font-weight: 700 !important;
    /* Bug fix, per Dave: "Website Access + Domain Information" was
       rendering with its first line ("Website Access +") invisible,
       showing only "Domain Information." Root cause: the base (desktop)
       rule's max-height:60px + overflow:hidden - sized for this same
       class's plain 17px desktop text (max 2 lines) - was never raised
       for mobile's much bigger 28px font just above, which wraps this
       particular (longer) header to 3 real lines (~100px tall). The 60px
       cap was silently clipping the overflow, and clipping from the TOP
       since the row's own align-items:flex-end (see
       .tunnel-care-access__head below) anchors content to the bottom of
       that clipped window. Raised generously so every subquestion header
       at the new mobile size - including this, the longest one - fits
       with real room to spare. */
    max-height: 160px !important;
  }
  /* Bug fix, per Dave (mobile only): "Website Access + Domain Information"
     wraps to 2 real lines at the bigger 28px subquestion size above, and
     that broke its info ("i") button two separate ways.
     1) Distortion: .tunnel-info-btn's base rule (a 15x15px round button)
        never set flex-shrink:0 - fine everywhere it's only ever sat next
        to a single line of text, but here the flex row's own content
        (2 lines of 28px text) is wider than the row can fit, so the
        browser started shrinking the button's WIDTH (not height) to help
        the row fit, flattening the circle into a distorted horizontal
        oval. Pinned to flex-shrink:0 so it always renders at its real
        15x15 size, full stop.
     2) Position: .tunnel-care-access__head's align-items:center (base
        rule) centers the button against the FULL 2-line text block's
        height, landing it up near the gap between the two lines instead
        of next to the second/last line - not what "adjacent to the
        header" should look like once text wraps. Switched to
        align-items:flex-end so both buttons sit down at the baseline of
        the last visible line instead. */
  .tunnel-info-btn {
    flex-shrink: 0 !important;
  }
  .tunnel-care-access__head {
    align-items: flex-end !important;
  }
  /* Bug fix, per Dave (mobile only): "Custom logo design – $149" was
     wrapping to 2 lines because the inline step-back button (26px + 8px
     margin either side = ~42px) was sharing the same flex row/width budget
     as the text and checkmark. Per Dave: keep the header text + checkmark
     together on one line, and float the step-back button up into the
     white space in the panel's own upper-right corner instead - out of
     the text row entirely, not just visually beside it. Pulled out of the
     flex flow via position:absolute (anchored to this heading's own box,
     which needs position:relative for that), so the text+check row no
     longer has to share width with it and can use the full line width. */
  .tunnel-detail__heading--logohead {
    position: relative !important;
    flex-wrap: nowrap !important;
    padding-right: 34px !important;
    /* Per Dave: "header all in one line (wider text block)." Freeing the
       button's width above (padding-right/absolute, see
       .tunnel-logohead-stepback below) wasn't enough on its own - "Custom
       logo design – $149" still doesn't fit one line at the desktop-sized
       26-34px clamp within a mobile card's real width. Measured via
       Playwright bisection: 20px is the largest size that stays on one
       real line at this card width (21px already wraps to 2) - sized down
       to exactly that, mobile only. */
    font-size: 20px !important;
    line-height: 1.3 !important;
  }
  .tunnel-logohead-stepback {
    position: absolute !important;
    top: 0 !important;
    right: 0 !important;
    margin: 0 !important;
  }
  /* Per Dave: on this tile-choice type (Overall Changes / Font Changes /
     Social Media / Email), side-by-side pills should stack as full-width
     buttons on mobile instead of squeezing 3 across one row. */
  .tunnel-3tiles,
  .tunnel-3tiles-row2 {
    flex-direction: column !important;
    align-items: stretch !important;
  }
  .tunnel-3tile {
    width: 100% !important;
    flex: 1 1 auto !important;
  }
  .tunnel-3tiles-row2 {
    flex-direction: row !important;
  }
  .tunnel-3tile--email {
    flex: 1 1 100% !important;
    order: 1 !important;
  }
  /* REMOVED (this round), per Dave: "remove the reverse button at the
     bottom... you could make that Send Me PDF button full width like the
     other four buttons because that second redundant reverse button will
     be gone, and it won't need to make room for it." The step-back
     button that used to share this line with a shrunk PDF pill is gone
     from the markup entirely (see tunnel.js / the removed
     .tunnel-3tile-stepback rule elsewhere in this file) - PDF no longer
     needs the `width:auto`/shrink treatment that used to clear room for
     it, so it's left to inherit the blanket `.tunnel-3tile{width:100%
     !important}` rule above like the other 4 tiles, full-width on its
     own line same as Design/Font/Social/Email. */
  .tunnel-pdf-caption {
    order: 2 !important;
    margin-top: 12px !important;
  }
  .tunnel-3tile--pdf {
    order: 3 !important;
  }

  /* Yes/No buttons: already flex-wrap on desktop, just give them a bit
     more room to be comfortably tappable (44px+ per iOS HIG). */
  .tunnel-yesno__btn {
    min-width: 46% !important;
    padding: 13px 18px !important;
    font-size: 12px !important;
  }
  /* Bug fix, per Dave: "the yes/no buttons all look great until Hosting &
     Care - the button shapes are like little round dots." Root cause: the
     Care slide's "No" button (only one with fine-print text under it, e.g.
     "(handoff html files)") is wrapped in an extra .tunnel-yesno__col so
     that caption can center under just that button - see that wrapper's
     comment above. .tunnel-yesno__col has no width of its own (shrink-
     wraps to its content), so the button's min-width:46% right above had
     nothing real to resolve against and silently fell back to shrink-to-
     fit - just the word "No"/"Yes" plus padding, which at this button's
     999px border-radius rendered as a tiny circle instead of the same
     wide pill every other yes/no button gets. Giving the column itself an
     explicit 46% width fixes the percentage math, and stretching the
     button to fill it makes this pill render pixel-identical to every
     bare (non-wrapped) yes/no button elsewhere. */
  .tunnel-yesno__col {
    width: 46% !important;
  }
  .tunnel-yesno__col .tunnel-yesno__btn {
    width: 100% !important;
    min-width: 0 !important;
  }

  /* Per Dave (this round - REPLACES the prior "full width, left-justified"
     stack): "the buttons are all over the map, different sizes and
     justifications - they need to be uniform, text centered, same height
     as the Transition Questions button, not going all the way across the
     page, a bit wider than the widest text but all still uniform." Widest
     label ("Up and running today") measures ~106px at this font/weight -
     200px comfortably covers every label (including the plus icon's
     clearance) with room to spare, so ALL 7 buttons (6 pills + Transition
     Questions) now share that one fixed width/height instead of each
     shrinking or stretching to its own content. */
  /* Per Dave (this round): reverted from the single 200px-wide column
     (previous round) BACK to a real 2-column grid on mobile - "narrower
     and side-by-side, two columns of three rows instead of one column of
     six." Desktop's base rule (.tunnel-foundation-pills above) is already
     display:grid; grid-template-columns:repeat(2,1fr);
     grid-template-rows:repeat(3,auto); grid-auto-flow:column - exactly the
     2x3 layout wanted, just never un-collapsed for mobile. Not overriding
     grid-template-columns/rows/auto-flow here at all lets mobile fall
     straight back to that same desktop grid (same column-major pairing
     visible on desktop too), just with each pill's own width/padding/font
     shrunk to fit two columns on a narrow phone (see .tunnel-foundation-
     pill below) instead of stretching full-width. */
  .tunnel-foundation-pills {
    /* Bug fix: an existing @media (max-width:1024px) rule (tablet-width
       fix, elsewhere in this file) collapses this back to 1fr/row-flow -
       that rule isn't !important but DOES come after the base desktop
       rule, so at this narrower mobile width it was winning over the
       plain (no grid-template-columns override) approach above and
       silently forcing 1 column again. Explicitly re-asserting the real
       2-column/3-row/column-flow values here with !important guarantees
       mobile gets them regardless of that other rule.
       Fix (this round), per Dave: "all seven buttons need to be uniformly
       spaced, not staggered... much less lead[ing] than what you have
       currently." Root cause of the staggering: `grid-template-rows:
       repeat(3, auto)` sizes each row to its TALLEST cell - fine only if
       every cell renders at an identical height, which stopped being
       guaranteed once the pill "box" chrome (fixed padding read as a
       button) was removed in favor of plain text (see .tunnel-foundation-
       pill below) - any tiny per-label height difference now shows up
       directly as an uneven row. Switched to `minmax(28px, auto)` so every
       row has the SAME explicit floor regardless of label height, and
       gap cut (8px -> 5px) for the "much less leading" ask.
       Fix (this round), per Dave: "less line spacing or leading on these" -
       cut further, gap 5px -> 2px, row floor 28px -> 22px (paired with the
       matching min-height/padding cut on .tunnel-foundation-pill below). */
    grid-template-columns: repeat(2, 1fr) !important;
    /* Fix (this round), per Dave: "this text larger on mobile view" - the
       row floor bumped in step with .tunnel-foundation-pill's own
       min-height increase just below (22px -> 25px) so all 3 rows stay
       uniformly sized against the now-taller 13px text, same "identical
       floor regardless of label height" reasoning as the fix above. */
    grid-template-rows: repeat(3, minmax(25px, auto)) !important;
    grid-auto-flow: column !important;
    justify-items: stretch !important;
    align-items: center !important;
    gap: 2px !important;
    /* BUG FIX (this round), per Dave: "too much padding between the 6
       buttons and the transition line." The base rule's `margin: 10px 0
       20px` bottom value was written back when this grid was genuinely
       the LAST child of the card, reserving real clearance above the gray
       .tunnel-bottom band for scrolling purposes (see that rule's own
       comment). Since the Transition Questions button was moved to render
       after this grid (order:10, see .tunnel-transition-faq-btn below),
       THAT button is now the actual last child - this 20px bottom margin
       just reads as a big, out-of-step gap before it instead. Trimmed to
       match the grid's own internal 2px row gap; the real 20px scroll
       clearance is moved onto the Transition Questions button itself
       below, where the last child now actually is. */
    margin-bottom: 2px !important;
  }
  /* Per Dave (this round): "remove the pill button outlines on those 7
     buttons on this tile, just words and the + signs, justified left...
     have the plus symbol right next to the text, not way far away like
     it's a button - 15px away from the text... all seven uniformly
     spaced, exact same leading, much less than currently."
     Border/background/pill-shape chrome stripped from all 7 (the 6 grid
     pills + the Transition Questions button below). Switched each button
     to a real flex row (display:flex, was plain text-align/justify-
     content with no flex container - those two properties alone never
     actually did anything without a flex/grid display, which is also WHY
     the "+" previously looked "like it's a button": it's position:absolute
     off the BUTTON's own right edge, not the text, so on a left-justified
     full-width button it landed far from short labels regardless of what
     justify-content said). Now the plus is a normal flex child with a
     15px gap after the label - it always sits 15px from the actual text,
     never from the button's outer edge, on any label length. line-height
     and padding both tightened (1.25 -> 1.05, 11px -> 8px vertical) for
     the "much less leading" ask, and a shared min-height keeps all 7 rows
     an identical height regardless of label length, so nothing can drift
     out of alignment. */
  .tunnel-foundation-pill,
  .tunnel-transition-faq-btn {
    display: flex !important;
    align-items: center !important;
    gap: 15px !important;
    /* Fix (this round), per Dave: "less line spacing or leading on these" -
       tightened in step with the grid's own row/gap cut above:
       min-height 28px -> 22px, vertical padding 8px -> 5px.
       Fix (this round), per Dave: "this text larger on mobile view" - the
       10px font (below, both this pill and .tunnel-transition-faq-btn)
       read too small; bumped to 13px. min-height nudged up in step (22px
       -> 25px) so the taller text has real room instead of feeling
       cramped against the same old 22px slot. */
    min-height: 25px !important;
    line-height: 1.05 !important;
  }
  .tunnel-foundation-pill {
    width: 100% !important;
    justify-content: flex-start !important;
    text-align: left !important;
    padding: 5px 6px !important;
    font-size: 13px !important;
    background: none !important;
    border: none !important;
    /* Per Dave: "ALWAYS use pill shape instead of square in these
       circumstances on hover, never square." No visible radius while
       background:none above, but the shared :hover rule (base rule,
       elsewhere in this file) fills solid teal - without a radius that
       reads as a hard-edged rectangle. Kept round so it's always
       pill-shaped the instant hover paints a background. */
    border-radius: 999px !important;
  }
  /* The "+"/"x" icon is normally position:absolute (see the shared base
     rule) so it can anchor to a fixed spot inside the old pill-shaped
     button regardless of text length - exactly the behavior Dave's asking
     to undo here. Switched to position:relative (still a valid positioning
     context for its own ::before/::after bars, which are sized off ITS
     own box, not the button's) so it becomes a normal flex child instead -
     flows right after the label with the 15px gap above, on every button,
     regardless of label length. Hover/focus rotation adjusted to match
     (plain rotate(45deg), no translateY - that was only ever needed to
     re-center it after the old absolute top:50% positioning, which no
     longer applies once it's a normal flex item centered by align-items). */
  .tunnel-foundation-pill .tunnel-foundation-pill__plus,
  .tunnel-transition-faq-btn .tunnel-foundation-pill__plus {
    position: relative !important;
    top: auto !important;
    right: auto !important;
    transform: none !important;
    flex: 0 0 7.7px !important;
  }
  .tunnel-foundation-pill:hover .tunnel-foundation-pill__plus,
  .tunnel-foundation-pill:focus-visible .tunnel-foundation-pill__plus,
  .tunnel-transition-faq-btn:hover .tunnel-foundation-pill__plus,
  .tunnel-transition-faq-btn:focus-visible .tunnel-foundation-pill__plus {
    transform: rotate(45deg) !important;
  }

  .tunnel-transition-faq-btn {
    padding: 5px 6px !important;
    font-size: 13px !important;
    /* Per Dave (this round): "move the wizard overall... move Transition
       Questions to below/left of the bottom 6 buttons." Was sized to match
       one column of the 2-col pill grid (for its old spot next to
       "Website Design"); now that it renders below the full-width pills
       grid instead (see the `order` fix and .tunnel-info-card__name
       hiding below), it reads better at the same full width as the grid
       above it rather than staying pinned to a half-width column. */
    width: 100% !important;
    justify-content: flex-start !important;
    text-align: left !important;
    align-self: flex-start !important;
    margin-left: 0 !important;
    background: none !important;
    border: none !important;
    /* Per Dave: "ALWAYS use pill shape instead of square in these
       circumstances on hover, never square." Same fix as
       .tunnel-foundation-pill above - keeps this button's hover fill
       round instead of square. */
    border-radius: 999px !important;
    /* SUPERSEDED (this round): the comment below assumed the pills grid's
       20px bottom margin still provided the gap above this button - it no
       longer does (see the "too much padding" fix on .tunnel-foundation-
       pills above, which trimmed that to 2px). Left at a small flat value
       since the grid above now sits close, matching its own 2px rhythm. */
    margin-top: 4px !important;
    /* BUG FIX (this round), per Dave: "too much padding between the 6
       buttons and the transition line" (paired fix, see .tunnel-foundation-
       pills above). Since this button now renders after the pills grid
       (order:10, see below) it's the card's real last child now, not the
       grid - so the 20px of genuine scroll clearance the grid's bottom
       margin used to provide (so the scroll ceiling lands 20px above the
       gray .tunnel-bottom band, not flush against it) belongs here now. */
    margin-bottom: 20px !important;
    /* Per Dave (this round): "move Transition Questions to below/left of
       the bottom 6 buttons." .tunnel-info-card is a flex column (base
       rule) - giving this button a high explicit `order` re-sequences it
       to render last, after the price/badge/pills grid, without touching
       tunnel.js's actual DOM order (which stays as-is for its click
       handler and any assistive-tech reading order). */
    order: 10 !important;
  }
  /* Per Dave (this round): "remove sub-head 'Website Design' and its
     checkmark." This h4 (name text + check, see .tunnel-info-card__name-
     inner in tunnel.js) is hidden outright on mobile - the price/badge/
     pills below it are unaffected since they're independent flex siblings,
     not children of this element. */
  .tunnel-info-card__name {
    display: none !important;
  }
  .tunnel-info-card__badge {
    font-size: 9px !important;
    padding: 3px 10px !important;
  }
  /* Bug fix, per Dave (mobile only): "$57/mo" on the Foundation card was
     reading too small - it was only ever hitting the base clamp's 26px
     floor (clamp(26px, 2.8vw, 36px) - the 2.8vw term is desktop-tuned and
     resolves to ~11px at phone widths, well under the floor, so mobile
     always rendered at the smallest end of that range regardless of
     screen size). Bumped the floor itself for mobile so this reads
     noticeably bigger/more prominent, matching the weight this figure
     carries as the headline price on the very first slide.
     Fix (this round), per Dave: "make the $57/mo portion larger by 25%" -
     34px * 1.25 = 42.5px.
     BUG FIX (this round), per Dave: "way more padding between the header
     and the $57/mo... they are overlapping, need at least 20px padding."
     ROOT CAUSE: hiding .tunnel-info-card__name above (the "Website Design"
     subhead) removed a real ~37px of vertical space that used to separate
     the headline above this card from the price line (that h4's own 4px
     margin-top + its ~26px content height + the card's 7px flex gap) -
     with it gone, the base rule's `margin-top: -3.5px` (written to tuck
     the price up closer to the Transition Questions button that used to
     sit directly above it) now pulls the price straight up against the
     headline instead, since price is effectively the first visible child
     now. Overridden here to a real +22px so there's genuine clearance.
     Fix (this round), per Dave: "larger on this dollar amount" - bumped
     again, 42.5px -> 50px.
     RESET (this round), per Dave: "another extreme move - this is HUGE
     now; happy medium please between what it was prior [42.5px] and this
     new size [50px]." Landed dead center: (42.5 + 50) / 2 = 46.25px. */
  .tunnel-info-card__price {
    font-size: 46.25px !important;
    margin-top: 22px !important;
  }

  /* Stepper (page count +/-): larger tap targets. */
  .tunnel-stepper__btn {
    width: 38px !important;
    height: 38px !important;
  }

  /* ---- Summary / Secure Checkout card ---- */
  /* Per Dave (this round): "way too much padding space here [between the
     '...you've selected.' headline and the itemized list below]; reduce
     spacing by half." Measured via Playwright: real gap was 50px. The
     margins involved (28px question margin-bottom, 16px base desktop
     .tunnel-detail margin-top) don't fully explain that 50px - same extra
     ~22px "dead space" phenomenon found on the Foundation card earlier in
     this file - so this value was reached empirically (measured, not
     computed): -25px lands the real on-screen gap at exactly 25px (half
     of 50), confirmed via Playwright getBoundingClientRect. Scoped to
     JUST this card's detail wrapper - .tunnel-card__question's shared
     28px (used for every other slide) and the base desktop 16px are
     untouched. */
  .tunnel-card[data-summary-detail="true"] .tunnel-detail {
    margin-top: -25px !important;
  }

  /* Per Dave (this round): "move the total amount above the secure
     checkout button, move the secure checkout button down." DOM order is
     .tunnel-summary__checkout-cta (button+Stripe mark) then
     .tunnel-summary__total (price) - column-reverse flips the VISUAL stack
     (total on top, button+Stripe below) without touching desktop's row
     layout or the DOM/JS. */
  .tunnel-summary__checkout-row {
    /* Per Dave (this round): the base rule's padding-top was just trimmed
       12px for a desktop-only ask (30.5px -> 18.5px) - pinned back to the
       original 30.5px here so mobile's own spacing is untouched. */
    padding-top: 30.5px !important;
    flex-direction: column-reverse !important;
    align-items: stretch !important;
    gap: 14px !important;
  }
  /* Bug fix, per Dave (screenshot: "$929/then $19/mo" tally reading
     shifted left instead of flush right against the same edge the itemized
     rows above it use): this container was left `text-align:left` here
     even though .tunnel-summary__total's own flex column already sets
     `align-items:flex-end` to hug every child (amount/note/button) to the
     right edge - text-align:left had no clear reason to override that and
     risked left-aligning wrapped text away from that edge on some
     renderers. Matched to the base rule's own text-align:right so nothing
     here fights the flex-end alignment. */
  .tunnel-summary__total {
    text-align: right !important;
  }
  .tunnel-summary__checkout-cta {
    align-items: stretch !important;
  }
  .tunnel-checkout-btn {
    width: 100% !important;
    text-align: center !important;
    justify-content: center !important;
  }
  .tunnel-summary__payment-icons {
    /* Per Dave (this round): "move the credit cards closer to 'Payments
       secured by Stripe' (vert padding 14px)." Desktop's real gap is the
       shared .tunnel-summary flex column gap (6px) plus this row's own
       margin-top (-4px) = net 2px (see base rule above). On mobile the
       column-reverse row above now sits ABOVE this icons row instead of
       the button, so this margin is re-targeted to land the gap at
       exactly 14px: 14 - 6 = 8px. */
    margin-top: 8px !important;
    flex-wrap: wrap !important;
    justify-content: flex-start !important;
  }

  /* ---- Bottom band: total + Back/Next ---- */
  /* Per Dave: the $ amount was touching the top edge of the gray band -
     real cause is the desktop translateY(-8px) nudge on .tunnel-bottom__main
     (tuned for a taller desktop band) plus this band's own padding-top
     being too thin on mobile. Cancelled the nudge and gave real top
     clearance below instead - band grows a little taller to fit it, per
     Dave's explicit "if the gray bar has to be a little taller, do that." */
  .tunnel-bottom {
    /* Per Dave: Back/Next were sitting right on the bottom edge of the
       gray band with no clearance underneath - bumped bottom padding
       12px -> 24px so they get real breathing room below them too.
       Left padding matched to 28px (this round) so the $/mo price text
       lines up with the card content and header above it - see
       .tunnel-card / .tunnel-top__headline's matching 28px left padding. */
    /* Bug fix, per Dave (mobile only): the itemized price breakdown
       ("$57/mo | for 12 months | $49/mo...") that used to sit in this
       band doesn't fit horizontally once a customer has picked several
       items - it was overflowing/wrapping messily on narrow screens. The
       total is now hidden entirely on mobile (see .tunnel-total below;
       it's still shown, and still the source of truth, on the Summary
       card and on desktop), so this band only has to hold Back/Next now.
       Padding cut roughly in half top/bottom to reclaim that vertical
       real estate for the middle content area, per Dave's explicit ask
       ("make the gray bar about half as tall"). Left padding kept at 28px
       to stay aligned with the card/header content above. */
    /* Per Dave (this round): Back/Next/Start buttons 15% larger on mobile
       (see .tunnel-nav__btn below) - band grown to match ("make that
       bottom gray bar about 15% taller to make them fit"). Top/bottom
       padding each bumped ~15% (10px->12px, 12px->14px) on top of the
       button's own +5px min-height growth, netting the band ~9px taller
       overall (~57px -> ~66px, i.e. ~15%). Left/right untouched - those
       aren't part of "taller" and still need to stay aligned with the
       card/header content above. */
    /* Fix (this round), per Dave: "the gray bar needs to be taller by
       prob 20px or so" - now that the chip trail is showing again at the
       top of this band (see .tunnel-trail above), it needs real room
       above the Back/Next/Start row for it. Top padding bumped +20px
       (12px -> 32px); left/right/bottom untouched.
       Fix (this round, again), per Dave: "that bottom gray bar doesn't
       need to be quite that tall... come down about 10 pixels" - now that
       the trail's own text/dots are bigger and tighter (see the
       .tunnel-bottom__header rules above), it doesn't need as much
       clearance above it. Top padding trimmed back 32px -> 22px, a real
       10px shorter band; left/right/bottom untouched.
       REVERTED (this round), per Dave: "you pushed the words up so
       they're crowding and touching the top horiz bar and top of the gray
       box, move that down how you had it before." Back to 32px.
       Fix (this round), per Dave: "the bottom gray bar should be 12px
       shorter than it is on mobile, and the wizard to come down to
       accommodate that new size." Top padding trimmed 32px -> 20px, a real
       12px shorter band (left/right/bottom untouched). .tunnel-mid is
       flex:1 1 auto in this column (see base rule above), so it
       automatically grows to reclaim the freed 12px - no separate change
       needed to make "the wizard come down." */
    padding: 20px 16px 14px 28px !important;
    min-height: 0 !important;
    /* Bug fix, found while making the above change - same landmine as
       .tunnel-top above: the base rule's flex-shrink:1 (no floor) let
       this band get squeezed shorter than its own real content height
       whenever #webyayTunnel's column didn't fit the viewport, which was
       silently eating the padding-bottom just added above (measured: the
       band's own box was rendering ~29px shorter than its content
       actually needed, .tunnel-bottom__main was overflowing the padding
       box on both edges as a result). Pinning to flex-shrink:0 keeps this
       band at its real content height always, matching .tunnel-top's own
       fix earlier. */
    flex-shrink: 0 !important;
  }
  .tunnel-bottom__main {
    flex-wrap: wrap !important;
    gap: 10px !important;
    transform: none !important;
  }
  /* Per Dave (mobile only): "not have that tally in the gray bar" - the
     itemized price breakdown is dropped from this band on mobile so it
     never has to fit a growing horizontal list of chosen items. The real
     total is still visible to the customer on the Summary card right
     before checkout (and untouched on desktop, where the wider band has
     room for it). */
  .tunnel-total {
    display: none !important;
  }
  /* Per Dave: Back/Next 20% smaller (from the prior mobile pass's
     44px/10px-18px values: font 13px->10px, padding 10px 18px->8px 14px,
     min-height 44px->35px, gap 8px->6px - each cut ~20%). */
  /* Per Dave (this round): "make these Start/Next/Back buttons about 15%
     larger" - scaled each value in the rule directly above up ~15% off
     THIS mobile size (not the desktop base rule): min-height 35->40px,
     padding 8px 14px -> 9px 16px, font-size 10->11.5px, gap 6->7px.
     .tunnel-bottom above grown to match so the taller buttons still fit
     with real clearance. */
  /* Per Dave (this round): "10% larger... within the same size gray
     block... don't change the size of the gray block." Scaled another
     ~10% off the values directly above: min-height 40->44px, padding 9px
     16px -> 10px 18px, font-size 11.5->12.65px, gap 7->8px. .tunnel-bottom
     above is deliberately left untouched this round, per Dave's explicit
     ask - verified via Playwright that the larger buttons still fit inside
     it with no clipping/overflow (clearance is just tighter than before). */
  .tunnel-nav__btn {
    min-height: 44px !important;
    padding: 10px 18px !important;
    font-size: 12.65px !important;
    gap: 8px !important;
  }
  /* Per Dave: remove the copyright line from the mobile footer entirely. */
  .tunnel-copyright {
    display: none !important;
  }

  /* ---- Redirect ("Thank you for your order") screen ---- */
  .tunnel-redirect-screen__inner {
    padding: 0 24px !important;
  }
  .tunnel-redirect-screen__title {
    font-size: 24px !important;
  }

  /* Generic safety net: nothing inside a card should ever be able to
     force horizontal scroll (images, iframes, wide fixed-width blocks
     from the color/font/email sub-panels this pass didn't hand-tune
     individually). */
  .tunnel-card img,
  .tunnel-card iframe,
  .tunnel-card svg {
    max-width: 100%;
  }
  .tunnel-detail,
  .tunnel-qa {
    width: 100% !important;
    box-sizing: border-box;
  }

  /* Per Dave (this round): "add this animated logo motion... currently on
     desktop of that section [Logo Design's Yes/No card]... have it show
     below the No/Yes buttons on mobile as well, maybe a little smaller...
     when you click Yes it wouldn't show anymore, just on that first panel
     [before answering] it would automatically load and play." The base
     (desktop) rule earlier in this file makes this element `position:
     absolute; top:100%` relative to the whole .tunnel-card - correct on
     desktop, where sizeLogoMarquee() in tunnel.js measures a live px width
     out to the two-column layout's real right edge. Mobile has no second
     column to measure against (single-column, full-bleed card - see
     .tunnel-card's own mobile rule above) and sizeLogoMarquee() now bails
     out early on mobile entirely (see that function's own comment in
     tunnel.js), so this needs its own plain, normal-flow mobile treatment
     instead: position:relative puts it back in document flow, landing
     exactly where Dave asked - directly below the Yes/No row, in the same
     spot .tunnel-detail (hidden/collapsed until "Yes") would otherwise
     start. Show/hide on Yes/No needs no change here at all - the same
     .is-collapsed class (see the base .tunnel-logo-marquee.is-collapsed
     rule) is toggled by the exact same click handler in tunnel.js on every
     viewport, and the marquee's own CSS `animation` on
     .tunnel-logo-marquee__track starts playing the instant this element
     is actually in the DOM/visible - no separate autoplay wiring needed. */
  .tunnel-logo-marquee {
    position: relative !important;
    top: auto !important;
    left: auto !important;
    /* Fix (this round), per Dave: "it needs to be edge to edge, left edge
       to right edge... bleeding out of the edges on both sides." width:
       100% (the previous value) is 100% of the CONTENT box it sits in -
       .tunnel-card's own mobile padding (28px left / 16px right, see that
       rule elsewhere in this file) still insets this element from the
       real screen edges same as everything else on the card, so it never
       actually reached the edges. Standard full-bleed trick instead:
       width:auto (a block-level element with auto width and negative
       margins has the browser solve the box-model equation so its
       rendered box exactly fills margin+width+margin against the parent's
       full border-box) paired with margin-left/-right set to the exact
       negative of .tunnel-card's own left/right padding, canceling that
       inset out completely so this element's left/right edges land
       flush with the true screen edges, not just the card's padded
       content area. */
    width: auto !important;
    margin-left: -28px !important;
    margin-right: -16px !important;
    /* "maybe a little bit smaller in size" - desktop's 68px trimmed ~30%
       for mobile's narrower column. Logo images below are height:100%/
       width:auto, so this one change scales the whole marquee (track +
       logos) proportionally, same trick already used for the desktop
       sizing rounds. */
    height: 48px !important;
    max-height: 48px !important;
    margin-top: 20px !important;
  }
  /* BUG FIX (caught while adding the mobile sizing above): the base
     .tunnel-logo-marquee.is-collapsed rule (elsewhere in this file) sets
     max-height:0/margin-top:0 WITHOUT !important - the mobile-only sizing
     rule just above uses !important on those same two properties (needed
     so they win over the base rule's own plain 68px/14px values), and an
     !important declaration always beats a non-important one regardless of
     specificity or source order. Left as-is, clicking "Yes" on mobile
     would fail to actually collapse the marquee (it'd stay at 48px tall)
     - re-asserting max-height:0/margin-top:0 here, also with !important,
     restores the collapse behavior on top of the mobile sizing above. */
  .tunnel-logo-marquee.is-collapsed {
    max-height: 0 !important;
    margin-top: 0 !important;
  }

  /* ---- Embedded "Create Account" panel (Hosting & Care checkout gate) ---- */
  /* Bug fix, per Dave: "setting up the account you have it leading off the
     left edge... needs padding on the left and right edge on the phone
     view." Root cause: body.tunnel-account-embed #accountFlowModal
     .account-flow-modal__panel (above, desktop rule) is explicitly
     `padding: 0 !important` with its horizontal position driven entirely
     by positionAccountEmbed() in tunnel.js, which sets an inline
     `left`/`width` matching .tunnel-mid__content's real rendered box - a
     comment on that function even calls this "Desktop-only context (the
     tunnel never runs below 1024px)", which was true when it was written
     but is stale now that this file has real mobile support. On mobile,
     .tunnel-mid__content spans the FULL viewport width edge-to-edge (see
     .tunnel-mid__content above in this block), so the panel's own
     zero-padding meant its content (eyebrow, headline, every input) sat
     flush against the literal screen edges instead of getting the same
     28px content gutter every other mobile slide has. Adding real
     horizontal padding here (box-sizing:border-box, from the global
     `*{box-sizing:border-box}` reset, so this doesn't fight the JS-set
     inline width) fixes it without touching positionAccountEmbed()'s
     desktop math or the desktop padding:0 rule at all. */
  body.tunnel-account-embed #accountFlowModal .account-flow-modal__panel {
    padding: 0 20px !important;
    box-sizing: border-box !important;
  }
  /* Bug fix (found while fixing the above): the STANDALONE account modal
     already collapses .account-flow-form to a single column on mobile
     (see @media(max-width:760px) .account-flow-form in styles.css), but
     the EMBEDDED version (this file, used when the tunnel opens the
     account form) never got that same override - it was still forcing
     the base desktop grid-template-columns:1fr 1fr. With 20px padding
     just added above, two real columns of full-width inputs no longer
     fit at all on a phone (confirmed via screenshot - the right column
     was bleeding straight off the right edge). Collapsed to one column,
     same fix, same reasoning as the standalone modal's own mobile rule. */
  body.tunnel-account-embed #accountFlowModal .account-flow-form {
    grid-template-columns: 1fr !important;
  }
  /* Bug fix (found while verifying the above via Playwright): setting
     grid-template-columns:1fr alone did NOT actually collapse the grid to
     one column - getComputedStyle still reported two 194px tracks even
     with the property forced via inline style. Root cause: two of this
     form's own children have hardcoded grid-column:1/2 and
     grid-column:2/3 (.account-flow-actions/.account-inline-login--forced,
     desktop rule above - the Back/Create Account buttons vs the "Already
     have an account? Log in instead" text, meant to sit side by side on
     desktop). CSS Grid auto-generates an implicit second column to honor
     an explicit grid-column:2/3 placement REGARDLESS of how many columns
     grid-template-columns itself defines - that implicit column is what
     was still reserving the extra ~194px and pushing the whole 2-up field
     grid wide on mobile. Spanning both back to the single real column
     collapses them to stack vertically instead. */
  body.tunnel-account-embed #accountFlowModal .account-flow-actions,
  body.tunnel-account-embed #accountFlowModal .account-inline-login--forced {
    grid-column: 1 / -1 !important;
  }

  /* Bug fix, per Dave: the round step-back ("reverse") button on the
     Create Account panel was sitting in the middle of the "Create your
     webyay account" header text instead of to its right, and reading as
     washed-out gray instead of black like every other step-back button in
     the tunnel. Two separate root causes:
     1) Position: styles.css has a GLOBAL `h2{max-width:11ch}` rule (the
        exact same one already root-caused and reset on
        .tunnel-redirect-screen__title elsewhere in this file) that this
        h2 never got its own reset for. 11ch measured out to exactly the
        154px this h2's real width was capped at - with white-space:nowrap
        also set (see the desktop rule above), the actual text overflowed
        way past that 154px box instead of wrapping, while the button
        (position:absolute; right:0) stayed anchored to the box's own
        edge - which landed it mid-text instead of after it.
     2) Color: .tunnel-stepback-btn's `color: var(--ink)` looks black
        everywhere else because every OTHER use of it lives inside
        #webyayTunnel, which defines its own local --ink:#1c242a. This
        button's panel (#accountFlowModal) is a separate element appended
        directly to <body>, outside that tree, so it falls back to
        :root's global --ink (a light cream tone meant for dark-background
        sections) - reading as pale gray against this button's white fill
        instead of black. Pinned to the same dark ink explicitly rather
        than depending on which --ink happens to be in scope. */
  body.tunnel-account-embed #accountFlowModal .account-flow-step--form h2,
  body.tunnel-account-embed #accountFlowModal .account-flow-step--login h2 {
    max-width: none !important;
  }
  .tunnel-account-form-stepback {
    color: #1c242a !important;
  }
}

/* NEW (2026-07-29), per Dave - added as its own standalone block rather
   than inserted into the locked 767px block above (see that block's own
   "LOCKED... do not tweak" note from 7/27): on mobile, every category
   panel's small uppercase eyebrow ("WEBSITE CHANGES", "YOUR FOUNDATION",
   etc.) gets dropped entirely and the headline below it pulled up, to
   close the gap to the device-mockup image above. Desktop is completely
   untouched - this whole rule is gated behind the same 767px breakpoint
   the rest of the mobile tunnel styling uses, and .tunnel-card__eyebrow's
   base rule (way above) is left as-is for desktop.
   Reuses the SAME collapse mechanism already built for this exact class
   (.tunnel-card__eyebrow.is-collapsed, used elsewhere for the Website
   Changes tile) rather than inventing a new one - just applies it
   unconditionally on mobile instead of only when JS toggles that class.
   max-height 40px + margin-bottom 10px collapsed to 0 reclaims 50px of
   vertical space, comfortably covering the ~25px Dave asked to close up.
   CORRECTED (same day), per Dave: the unscoped .tunnel-card__eyebrow
   selector above was too broad - it also hid the eyebrow on the "inside"
   detail panels shown after clicking Yes on a question (tile grids,
   option pickers, etc.), which Dave wants KEPT. Only the TOP-LEVEL panels
   should lose their eyebrow: the 4 yes/no question cards (all carry
   tunnel.js's own .tunnel-qa wrapper class, see `qa.className =
   'tunnel-qa'` in that file) and the very first Foundation panel (no
   yes/no button, but still top-level - carries data-cat-id="website" per
   `card.dataset.catId = cat.id` in tunnel.js, same attribute/value
   already used elsewhere in this file for that exact card). Detail panels
   use a different marker (data-info-detail="true") and are deliberately
   NOT included in this selector, so they keep their eyebrow untouched.
   ROOT-CAUSE FIX (same day, second pass), per Dave: this rule never
   actually fired for anything except the "website" (Foundation) slide -
   verified against tunnel.js's own buildCards(): the eyebrow span is
   appended directly to `card` FIRST (card.appendChild(eyebrow)), then
   .tunnel-qa is appended as its own SEPARATE sibling afterward
   (card.appendChild(qa)) for yes/no cards, or the bare h3.question is
   appended directly to `card` (not inside any .tunnel-qa wrapper) for the
   info/summary cards. So `.tunnel-qa .tunnel-card__eyebrow` is a
   descendant selector that can never match anything - the eyebrow is a
   SIBLING of .tunnel-qa, never a child of it. Only the
   `[data-cat-id="website"]` half of this rule ever worked, which is
   exactly why Website Changes / Additional Pages / Logo Design / Monthly
   Website Care / Payment Plan all kept showing their eyebrow on real
   phones despite this rule "existing." Fixed by switching to explicit
   data-cat-id selectors for every top-level panel that should lose its
   eyebrow (website, changes, pages, logo, care, payment) - Review and/or
   Confirm (data-cat-id="summary") is deliberately left OUT per Dave's
   explicit "keep the eyebrow on that one, that's not an issue." */
@media (max-width: 767px) {
  [data-cat-id="website"] .tunnel-card__eyebrow,
  [data-cat-id="changes"] .tunnel-card__eyebrow,
  [data-cat-id="pages"] .tunnel-card__eyebrow,
  [data-cat-id="logo"] .tunnel-card__eyebrow,
  [data-cat-id="care"] .tunnel-card__eyebrow,
  [data-cat-id="payment"] .tunnel-card__eyebrow {
    max-height: 0 !important;
    opacity: 0 !important;
    margin-bottom: 0 !important;
    overflow: hidden !important;
  }
}

/* NEW (2026-07-29), per Dave - again a standalone block after the locked
   767px section rather than edited in place. Follow-up to the min-
   height:128px / margin-bottom:7px pair set inside that locked block for
   .tunnel-qa .tunnel-card__question (the 4 yes/no cards): even after the
   eyebrow removal above, Dave reported the Yes/No buttons still landing
   below the fold on a real iPhone, low enough to go under the sticky
   bottom bar - a real usability problem, not just a spacing preference.
   That min-height existed to keep all 4 cards' buttons at the same
   vertical position (see that block's own comment for the measured-height
   math), but Dave explicitly asked to prioritize the buttons being
   reachable over that alignment, so this cuts the floor way down. Real
   tradeoff, called out per his own ask rather than applied silently: the
   Care question (the tallest, ~126px of real text) will now make its own
   card taller than the other 3, so its buttons sit a bit lower than
   theirs - the other 3 (shorter) questions get their buttons landing much
   higher/closer, which is the actual ask here.
   ADJUSTED (same day, second pass), per Dave: with the eyebrow-removal
   selector bug above now actually fixed, every top-level panel's question
   text moved up and the Yes/No buttons ended up sitting right under it -
   "literally almost touching the header." Dave's ask was never zero gap,
   it was "at least 15 pixels... not touching." Bumped margin-bottom from
   4px to 18px (comfortably inside his 15-20px range) - still far below
   the old 7px-inside-a-128px-floor spacing that was pushing buttons off
   the bottom of the screen, so the reachability fix above is preserved. */
@media (max-width: 767px) {
  .tunnel-qa .tunnel-card__question {
    min-height: 0 !important;
    margin-bottom: 18px !important;
  }
}

/* NEW (2026-07-29), per Dave - mobile, "Need monthly support?" (Hosting &
   Care) slide only: its question text ("Would you like help hosting and/or
   maintaining your site each month?") runs 4 lines instead of the 2-3 every
   other yes/no slide gets, pushing the Yes/No row down far enough to sit
   right under the sticky gray bottom bar. Dave's explicit ask: nudge the
   header + buttons up ~13-14px, modest (not "extreme"), and without
   touching/overlapping the monitor mockup above - which lives outside this
   card as its own sibling, so shrinking THIS card's own top padding can't
   affect it either way.
   The locked 767px block above sets the shared `.tunnel-card{padding-top:
   32px !important}` floor every slide uses - rather than edit that shared,
   locked rule (which would shift all 4 yes/no slides, not just this one),
   this scopes to `.tunnel-card[data-cat-id="care"]` specifically (higher
   specificity than the locked block's bare `.tunnel-card`, and declared
   later besides, so it wins outright - no cascade ambiguity). 32px - 14px
   = 18px. */
@media (max-width: 767px) {
  .tunnel-card[data-cat-id="care"] {
    padding-top: 18px !important;
  }
}

/* NEW (2026-07-29), per Dave - mobile, "Payment options" (Choose your plan)
   slide: same class of complaint as the Hosting & Care fix directly above,
   smaller ask this time - "Choose your plan." header + the plan buttons
   below it sit a bit too far under the fold, wants them nudged up ~10px,
   nothing extreme. Same mechanism/reasoning as the care fix above (scoped
   override of the locked block's shared `.tunnel-card{padding-top:32px}`
   floor, this card only). 32px - 10px = 22px. */
@media (max-width: 767px) {
  .tunnel-card[data-cat-id="payment"] {
    padding-top: 22px !important;
  }
}

/* NEW (2026-07-29), per Dave - mobile, "Do you need extra inside pages"
   slide (data-cat-id="pages"): too much air between the monitor mockup
   above and this card's header + Yes/No buttons - wants it shifted up at
   least 15px, template and all 30 clients. Same mechanism as the Hosting &
   Care / Payment fixes above: scoped override of the locked block's shared
   `.tunnel-card{padding-top:32px}` floor, this card only - the monitor
   mockup lives outside this card as its own sibling, so it's untouched
   either way. 32px - 15px = 17px. */
@media (max-width: 767px) {
  .tunnel-card[data-cat-id="pages"] {
    padding-top: 17px !important;
  }
}

/* BUG FIX (2026-07-29), per Dave (real-device report, repeat complaint): the
   reverse header ("Website Changes," etc.) lands in the right spot on most
   panels, but on the "Choose your Fonts" panel specifically it lands way
   too low, cut off outside the color bar - and once that's happened,
   subsequent panels (reached via the Back button) inherit the same wrong
   position, even ones that were fine before. tunnel.js's resetMidScroll()
   (added earlier this session for the same complaint) already sets
   .tunnel-mid/.tunnel-mid__content scrollTop to 0 at the exact moment a
   tile panel opens/closes/OKs/backs out - confirmed correct via code
   review. ROOT CAUSE (this pass): that reset is correct at the instant it
   runs, but the eyebrow/question collapse it triggers is an ANIMATED
   height change (.tunnel-card__eyebrow/.tunnel-card__question both
   transition max-height/margin over ~0.4s, see their base rules above).
   Browsers have a native feature called "scroll anchoring"
   (overflow-anchor, on by default) that automatically re-adjusts scrollTop
   whenever content ABOVE the visible area changes size, specifically to
   stop things from visually jumping - but here it fights the deliberate
   JS reset, silently dragging scrollTop back away from 0 as the collapse
   animation plays out over the following ~400ms, AFTER resetMidScroll()
   already ran. This exactly matches "shifts depending on which button" -
   which panel/animation happens to trigger scroll anchoring varies by
   what's currently expanded. Fix: turn scroll anchoring off on the actual
   scroll containers so the JS-driven reset is the only thing moving
   scrollTop, full stop - no browser feature quietly overriding it
   afterward. Mobile-scoped (matches .tunnel-mid's own mobile-only
   overflow-y:auto in the locked block above); desktop's non-scrolling
   carousel layout is unaffected either way. */
@media (max-width: 767px) {
  .tunnel-mid,
  .tunnel-mid__content {
    overflow-anchor: none !important;
  }
}

/* "Send Me PDF" popup (#tunnelPdfModal, built once and appended directly to
   <body> by tunnel.js - see the singleton IIFE near the account-modal
   step-back buttons). IMPORTANT: same scoping issue already documented and
   fixed for #accountFlowModal just above - this modal lives OUTSIDE the
   #webyayTunnel tree, so --ink/--muted/--tunnel-teal-bg (all locally
   redefined inside #webyayTunnel, dark-band values meant for THAT
   background) are not safely available here and would fall back to
   :root's own global values instead - colors are spelled out literally
   below rather than risking that mismatch. --gold has no local override
   inside #webyayTunnel (only ever set at :root), so it's safe to reference
   normally. Same mobile+desktop treatment throughout - no separate
   @media(max-width:767px) block needed, this is a single centered card at
   any width via the max-width/margin combo below. */
.tunnel-pdf-modal {
  position: fixed;
  inset: 0;
  /* #webyayTunnel itself sits at z-index:99999 (see the comment at the top
     of this file) - this modal opens FROM INSIDE the tunnel, so it has to
     clear that, not just some ordinary page-level z-index. 100001 matches
     this codebase's own established convention of going one better than
     the highest documented value (100000) rather than picking an arbitrary
     round number. */
  z-index: 100001;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  opacity: 0;
  visibility: hidden;
  transition: opacity .2s ease, visibility 0s linear .2s;
}
.tunnel-pdf-modal.is-visible {
  opacity: 1;
  visibility: visible;
  transition: opacity .2s ease;
}
.tunnel-pdf-modal__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(28,36,42,.55);
}
.tunnel-pdf-modal__box {
  position: relative;
  background: #ffffff;
  border-radius: 14px;
  padding: 28px 24px 22px;
  width: 100%;
  max-width: 400px;
  box-shadow: 0 20px 60px rgba(28,36,42,.3);
  transform: translateY(10px);
  transition: transform .22s ease;
}
.tunnel-pdf-modal.is-visible .tunnel-pdf-modal__box {
  transform: translateY(0);
}
.tunnel-pdf-modal__close {
  position: absolute;
  top: 10px;
  right: 12px;
  border: none;
  background: none;
  font-size: 22px;
  line-height: 1;
  color: rgba(28,36,42,.45);
  cursor: pointer;
  padding: 6px;
}
.tunnel-pdf-modal__close:hover { color: #1c242a; }
.tunnel-pdf-modal__title {
  margin: 0 0 10px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 19px;
  font-weight: 700;
  color: #1c242a;
}
.tunnel-pdf-modal__copy {
  margin: 0 0 18px;
  font-size: 13.5px;
  line-height: 1.55;
  color: rgba(28,36,42,.68);
}
.tunnel-pdf-modal__form {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.tunnel-pdf-modal__input {
  width: 100%;
  box-sizing: border-box;
  padding: 12px 14px;
  /* Per Dave (this round): "can these be pill box shaped?" - matches the
     999px fully-rounded pill treatment already used everywhere else in
     this tunnel (.tunnel-3tile, etc.), rather than this modal's own
     8px-radius rectangle. */
  border-radius: 999px;
  border: 1.5px solid rgba(28,36,42,.2);
  font-size: 14px;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  color: #1c242a;
}
.tunnel-pdf-modal__input:focus {
  outline: none;
  border-color: var(--gold);
}
.tunnel-pdf-modal__submit {
  width: 100%;
  box-sizing: border-box;
  padding: 12px 14px;
  /* Per Dave (this round): pill-shaped, matching the input field above and
     the rest of the tunnel's pill buttons. */
  border-radius: 999px;
  border: none;
  background: #7E3187;
  color: #ffffff;
  font-family: "Plus Jakarta Sans", Arial, sans-serif;
  font-size: 14px;
  font-weight: 700;
  cursor: pointer;
  transition: background .2s ease, opacity .2s ease;
}
.tunnel-pdf-modal__submit:hover { background: #66266E; }
.tunnel-pdf-modal__submit:disabled { opacity: .6; cursor: default; }
.tunnel-pdf-modal__status {
  margin: 12px 0 0;
  font-size: 13px;
  line-height: 1.5;
  color: #2f7a4f;
  min-height: 1px;
}
.tunnel-pdf-modal__status.is-error {
  color: #b3392c;
}

/* Fix (this round), per Dave: "the padding between the dollar tally and
   product name and the separate lines - the horizontal padding needs to
   be about half of what you have it right now and that text is gonna
   have to be a little bit smaller so that when the webpage gets narrower
   on a browser, it doesn't collide with the wizard - gentle on the
   smaller type, please not extreme." Targets the bottom gray running-
   total band (.tunnel-total__amount .estimate-breakdown/.estimate-part -
   see the base rules earlier in this file). Appended at file end so it
   reliably wins over those earlier !important rules.
   Horizontal padding: the item-to-item gap (25px) and each item's own
   divider padding-left (25px) both cut roughly in half, to 12px. The
   extra grouping margin used after the base website price and before
   Hosting+Webcare (10px on top of the standard gap, for a wider ~35px
   separation there) is halved in step, 10px -> 5px, so that grouping
   stays proportionally wider than the standard gaps without staying at
   its old absolute size.
   Type: gentle reduction only, per Dave's explicit "not extreme" - the
   price clamp trimmed ~2px at each end (17-22px -> 15-19px) and the
   small "/mo" sub-label trimmed 1px (10.5px -> 9.5px). */
.tunnel-total__amount .estimate-breakdown {
  gap: 12px !important;
}
.tunnel-total__amount .estimate-part {
  padding-left: 12px !important;
}
.tunnel-total__amount .estimate-part:first-child {
  padding-left: 0 !important;
}
.tunnel-total__amount .estimate-part:first-child + .estimate-part {
  margin-left: 5px !important;
}
.tunnel-total__amount .estimate-part--care {
  margin-left: 5px !important;
}
.tunnel-total__amount .estimate-part strong {
  font-size: clamp(15px, 1.5vw, 19px) !important;
}
.tunnel-total__amount .estimate-part em {
  font-size: 9.5px !important;
}
#webyayTunnel .estimate-part--months {
  /* Keep this item's own much-tighter, hand-tuned spacing (see the base
     rule's comment earlier in this file) rather than inheriting the
     halved general padding above - it's not a priced group, just a
     descriptive suffix glued to the price right before it. */
  padding-left: 4px !important;
  margin-left: -8px !important;
}

/* Fix (this round), per Dave: on the Review & Confirm slide, the
   itemized rows (.tunnel-summary__item) were overflowing horizontally on
   narrow windows, forcing a horizontal scrollbar inside the white
   tunnel card - "I don't want any horizontal scrolling within a small
   window - I think that should fit in the white tunnel, w/o doing
   that." Root cause: each row is a single-line flex row - label + "Make
   change" pill on the left, price (+ optional "for N months" note)
   stacked on the right via justify-content:space-between - with several
   white-space:nowrap children (.tunnel-summary__item-price,
   .tunnel-summary__item-months, .tunnel-summary__edit-btn). Nothing in
   the row was allowed to wrap, so once the combined natural width of the
   label side + price side exceeded the card's width, the row (and
   .tunnel-summary's own overflow-x, which computes to auto - see that
   rule's comment) just grew past the card edge and scrolled instead of
   reflowing. Fix: below 480px-wide viewports, let each row wrap onto two
   lines - label/"Make change" pill keep their own top line, and the
   price column is forced to full width so it drops to its own line
   directly underneath - so every row always fits inside the card with no
   horizontal scrolling, on any window width. */
@media (max-width: 480px) {
  .tunnel-summary__item {
    flex-wrap: wrap;
    row-gap: 2px;
  }
  .tunnel-summary__item-label-wrap {
    flex-wrap: wrap;
  }
  .tunnel-summary__item-right {
    width: 100%;
    align-items: flex-end;
  }
}

/* NEW (2026-07-29), per Dave - mobile only, Review & Confirm slide: the
   price column on the right of each itemized row (.tunnel-summary__item-
   right) was sitting noticeably lower than the product-name column on the
   left, ~10-15px below the dashed separator instead of starting at the
   same height - "the column on the right... skewed away... makes each
   section much bigger cumbersome than it needs to be," pushing Secure
   Checkout further below the fold. ROOT CAUSE: .tunnel-summary__item uses
   `align-items:baseline`, but the right-hand column is itself a nested
   flex COLUMN (price stacked above its "for N months" note) - per the
   flexbox spec, a flex item that's also a flex container has ambiguous/
   inconsistent baseline behavior across engines when its own children
   don't establish a clean baseline, which is exactly this case. The label
   column (plain text + a button) has a normal text baseline and aligns
   fine; the price column doesn't, so it drifts down. Fix: flex-start
   instead of baseline - both columns' top edges are then pinned to the
   exact same line deterministically, matching Dave's literal ask ("top of
   the dollar amount at the same height as the product name"), with no
   dependency on either column's internal content. Scoped to mobile only
   (max-width:767px, wider than the 480px wrap-fix breakpoint above so it
   also covers phones between 480-767px) - desktop's existing alignment is
   untouched. */
@media (max-width: 767px) {
  .tunnel-summary__item {
    align-items: flex-start;
  }
  /* FOLLOW-UP FIX (2026-07-29, later), per Dave: the flex-start change
     above pinned both columns' BOXES to the same top edge, but the price
     box's own line-height (inherited, larger than the plain label's
     because of the price's bumped 15px font-size) adds leading space
     above the glyph itself - so the visible "$" still sat visibly lower
     than the label text even with matching box tops, reading as "still
     not fixed." Setting an explicit tight line-height directly on the
     price/months text removes that inherited leading, and a small
     negative margin-top (per Dave's own estimate, "I would guess 15
     pixels") pulls the whole right column up flush with the label - which
     also shortens each row's effective height (it was being stretched by
     this same excess top space), tightening the dashed separators
     vertically exactly as Dave asked. Scoped to mobile only - desktop is
     untouched. */
  .tunnel-summary__item-right {
    margin-top: -15px;
  }
  .tunnel-summary__item-price {
    line-height: 1;
  }
  .tunnel-summary__item-months {
    line-height: 1.2;
  }
}

/* Fix (this round), per Dave (repeat complaint - "I've asked about this
   many times"): the round step-back ("reverse") button on the real
   Create Account / Log In panel was landing in the middle of the header
   text ("Create your w[button]yay account") instead of clear of it, and
   reading as washed-out gray instead of solid black like every other
   step-back button in the tunnel.
   A prior round already diagnosed and partly fixed both root causes (see
   the max-width:none / color:#1c242a rules earlier in this file, plus
   the accompanying tunnel.js change moving this button from inside the
   <h2> to the step container so it no longer re-centers on however many
   lines the headline wraps to) - but that earlier CSS fix was scoped
   inside `@media (max-width:767px)` only, so it never applied at normal/
   desktop widths, where the exact same causes (global h2{max-width:11ch}
   in styles.css; --ink falling back to :root's light value outside
   #webyayTunnel) were still live. Un-scoped here so both fixes apply at
   every width, and re-anchored explicitly to the step container's own
   top-right corner (matching the tunnel.js change moving the button
   there) so it always sits level with the "Create Account"/"Returning
   client" eyebrow line above the headline, per Dave: "move it up so it's
   adjacent to the create account eyebrow." Selector specificity matched
   to the earlier base rules so this reliably wins regardless of source
   order. */
body.tunnel-account-embed #accountFlowModal .account-flow-step--form,
body.tunnel-account-embed #accountFlowModal .account-flow-step--login {
  position: relative;
}
body.tunnel-account-embed #accountFlowModal .account-flow-step--form h2,
body.tunnel-account-embed #accountFlowModal .account-flow-step--login h2 {
  max-width: none !important;
  padding-right: 0 !important;
}
body.tunnel-account-embed .tunnel-account-form-stepback {
  top: 0 !important;
  right: 0 !important;
  transform: none !important;
  color: #1c242a !important;
}

/* Fix (this round), per Dave: "move the reverse button to 15px away from
   and adjacent to the word 'account' in header." Reverses the absolute
   top-right-of-the-step anchoring set by the two rules just above (that
   placement put it level with the eyebrow line, away from the headline
   entirely - not what's wanted now) back to sitting inline right after the
   header's own last word, matching tunnel.js's change appending this
   button as the h2's own last child again. No wrap risk here: the Create
   Account h2 is forced white-space:nowrap (see that rule earlier in this
   file) and the Login h2's short text never wraps either, so a plain
   inline-flex flow (no position:absolute) lands the button genuinely
   adjacent every time instead of needing to fight text-wrapping. */
body.tunnel-account-embed .tunnel-account-form-stepback {
  position: static !important;
  display: inline-flex !important;
  vertical-align: middle !important;
  margin-left: 15px !important;
  top: auto !important;
  right: auto !important;
  transform: none !important;
}

/* Fix (this round), per Dave: "move the 'for 12 months/etc' UP along
   w/ the separator line so it's aligned at same eye-level as the $/mo
   dollar text; up maybe 4px." This "for N months" note (see
   .estimate-part--months in main-v114.js's formatItemizedPayment) is its
   own divider column - text plus the vertical border-left line it
   carries (from the shared .tunnel-total__amount .estimate-part base
   rule) - sitting slightly low of the $/mo price baseline it's meant to
   read alongside. Since align-self:center (see the base
   #webyayTunnel .estimate-part--months rule above) already makes this
   column hug its own single-line content height rather than stretching
   to the row, a translateY nudges the whole column - text AND its
   border-left - up together as one unit. */
#webyayTunnel .estimate-part--months {
  transform: translateY(-4px) !important;
}

/* Fix (this round, repeat complaint), per Dave: "still problems with the
   review content on narrow browsers" / "why the white border or mask or
   window on the right of that review text???" - the hard right edge Dave
   is seeing is this card's own fixed box: .tunnel-card[data-summary-
   detail="true"] is a fixed 560px wide (see that rule earlier in this
   file), and its checkout row (.tunnel-summary__checkout-row - total
   price + Secure Checkout button + Stripe mark) is deliberately never
   allowed to wrap. At real "in-between" window widths (narrower than a
   normal desktop, but not narrow enough to trigger the true-mobile
   stacked layout at max-width:767px, where the monitor hides entirely),
   the persistent monitor mockup was still claiming enough of the row's
   width that this card's own rendered width shrank below what its
   checkout row actually needs - the excess content then gets hard-
   clipped/scrolled right at that box edge, which is the "white mask"
   Dave's describing (the card's own white background stopping dead at
   its clipped edge). Paired with the tunnel.js fix (this round) that
   gives the monitor a much smaller width share below 950px, this trims
   the checkout row's OWN footprint in that same range too - smaller
   total-price type, a tighter Secure Checkout button, and smaller
   payment-icons - so what's left to fit is genuinely narrower, not just
   hoping the freed-up monitor space alone is enough. */
@media (min-width: 768px) and (max-width: 1100px) {
  .tunnel-card[data-summary-detail="true"] {
    padding-right: 20px !important;
  }
  .tunnel-summary {
    margin-right: 10px !important;
  }
  .tunnel-summary__total-amount {
    font-size: clamp(17px, 2vw, 22px) !important;
  }
  .tunnel-summary__total-then {
    font-size: 12px !important;
  }
  .tunnel-checkout-btn {
    padding: 10px 14px !important;
    font-size: 13px !important;
  }
  .tunnel-summary__checkout-cta {
    margin-left: 4px !important;
  }
  .tunnel-summary__stripe-mark {
    font-size: 9.5px !important;
  }
  .tunnel-summary__payment-icons svg {
    width: 26px !important;
    height: 17px !important;
  }
}

/* Fix (this round), per Dave, at the narrow-desktop window range (roughly
   768-900px, where the tunnel top band was shown "Login/Create Account"
   plain text rather than a hamburger): "the top bar needs to be 25 pixels
   taller and there needs to be a little bit more padding by like five
   pixels between that top reverse header and the bottom of the dark
   beige." .tunnel-top's own height is content-driven (min-height only, a
   floor - see that rule's long comment history earlier in this file), so
   the real lever is .tunnel-top__headline's own padding (base rule:
   `padding: 43px 20px 20px var(--tunnel-content-left);` - nothing else
   follows the headline in this band anymore, so its bottom padding IS the
   gap to the band's bottom edge). Grew top padding +20px (43->63) and
   bottom padding +5px (20->25) - together a genuine +25px of real content
   height (taller band), with exactly 5px of that specifically landing as
   extra breathing room between the headline text and the band's bottom
   edge, matching both parts of Dave's ask. Scoped to 768-900px so it
   doesn't collide with the true-mobile block's own separate headline
   padding (max-width:767px, elsewhere in this file) or change anything on
   normal desktop widths. */
@media (min-width: 768px) and (max-width: 900px) {
  .tunnel-top__headline {
    padding: 63px 20px 25px var(--tunnel-content-left) !important;
  }
}

/* Per Dave (this round), scoped to just this window range per his explicit
   "in this exact breakpoint" ask (not "throughout" like most earlier
   headline padding rounds - see the base .tunnel-top__headline rule's long
   history above): "it's hugging the bottom of the line too much... move up
   five pixels." Base rule is `padding: 43px 20px 20px ...` - shifted 5px
   from top to bottom (43->38, 20->25) so the headline moves up 5px while
   .tunnel-top's own total height (content-driven, see #webyayTunnel above)
   stays the same - the freed space lands as extra clearance below the text
   instead of shrinking/growing the band. Scoped to 901px+ so it can't
   collide with the already-tuned 768-900px block just above or the locked
   max-width:767px mobile block further down. */
@media (min-width: 901px) {
  .tunnel-top__headline {
    padding-top: 38px;
    /* ROOT-CAUSE FIX (this round), per Dave ("asked 6x... STILL not
       shortened"): found it. This 901px+ block - which covers virtually
       every real desktop window, including the 1440px+ widths Dave was
       actually testing at - sits AFTER the base .tunnel-top__headline rule
       in the file and at equal specificity, so its own padding-bottom
       (25px) was silently winning the cascade and re-adding back the exact
       15px the base rule's edit (20px -> 5px, earlier this round) was
       supposed to cut. The base rule's change was correct; it just never
       had a chance to actually apply at any normal desktop width because
       of this override sitting right here. Cut in step: 25px -> 10px, the
       same 15px reduction, so the two rules finally agree instead of one
       silently cancelling the other. padding-top (38px) left untouched -
       per Dave's explicit "header not shifting," only the trailing empty
       space below the text should shrink. */
    padding-bottom: 10px;
  }
}

/* Fix (this round), per Dave (screenshot of the "Your Foundation" intro
   slide - eyebrow/headline/Website Design/price/pills): "position of all
   this content up 12px." Shifting the card's three top-level content
   pieces (.tunnel-card__eyebrow, .tunnel-card__question, .tunnel-detail -
   see buildCards() in tunnel.js, all three are direct children of
   .tunnel-card[data-info-detail="true"], not one shared wrapper) each by
   the same translateY(-12px) rather than touching .tunnel-card's own
   transform, since that property is already used by the carousel for
   slide positioning/centering (base .tunnel-card rule + transition
   transforms) - stacking a second value there would silently replace one
   or the other instead of combining. Moving all three children by an
   identical amount up keeps their relative spacing to each other exactly
   as-is, just 12px higher on screen. Applies at every width (not scoped
   to a breakpoint) since Dave didn't call out mobile/desktop only. */
.tunnel-card[data-info-detail="true"] .tunnel-card__eyebrow,
.tunnel-card[data-info-detail="true"] .tunnel-card__question,
.tunnel-card[data-info-detail="true"] .tunnel-detail {
  transform: translateY(-12px) !important;
}

/* Fix, per Dave: "eliminate" the page auto-zooming in every time the
   keyboard opens on mobile inside the tunnel/checkout flow, forcing a
   manual zoom back out after every field. Root cause: iOS Safari (and
   Chrome on iPhone - same WebKit engine) automatically zooms the whole
   page in on focus whenever a text field's rendered font-size is under
   16px - it does NOT zoom back out on blur, so the page stays zoomed in
   after every single field. This tunnel has several real text-entry
   fields under that threshold (.tunnel-email-input at 13px, the mobile-
   scoped body.tunnel-checkout-flow .account-flow-form input override
   also at 13px, .start-modal .social-url-field input at 13px, and
   others) - matching "every time... every field." Same blanket, future-
   proof mobile-only fix as the one just added to the shared styles.css:
   force every real text-entry element to the 16px minimum that stops iOS
   from zooming at all, rather than hunting down and bumping each field's
   font-size individually (and risking missing one, or a new field later
   reintroducing this same bug). Desktop is completely untouched. */
@media (max-width:767px){
  input[type="text"],
  input[type="email"],
  input[type="tel"],
  input[type="password"],
  input[type="search"],
  input[type="url"],
  input[type="number"],
  input:not([type]),
  textarea,
  select{
    font-size:16px !important;
  }
}
