/* TSC Join a C-Group — front-end styles.
   "Full bold" system: red-grit field, Barlow Condensed display, Acumin UI text, black
   translucent cards with soft shadows + gold glow, yellow accents.

   Scoping note: the modal and the toast render on <body>, outside .tsc-jag, so the design
   tokens live on :root and every surface reads the same variables. */

/* Both faces ship as WOFF2 with every glyph the originals had — nothing is subsetted away,
   so no character can ever fall back to a different font.
   The size win came from elsewhere: Acumin is a variable font whose 1MB was mostly
   interpolation data for axes this UI never varies. Pinning wdth to 100 and slnt to 0
   (slnt=0 is the iOS oblique fix) and keeping only the 300-800 weight range the CSS asks
   for took it from 1,005 KB to 41 KB, rendering identically. */
/* Barlow Condensed carries EVERYTHING set in caps: the step headlines, the group names on the
   cards, and the info-sheet title.

   It replaced Hightone, which is a distressed display face — it held up at 90px+ on the
   landing headline but at the 32px of a sheet title its roughness ate the letterforms, and a
   name like "ADDI PENNE & EMILY STUECKER" stopped being readable. It carried the names first
   for that reason, then the headlines too, so the whole page is one voice instead of two.

   Shipped whole — 525 characters, nothing subsetted — so no name can hit a missing glyph.
   hightone.woff2 is left in assets/fonts/ but is no longer declared, so it is not downloaded;
   restoring the @font-face and --tsc-display is all a revert would take. */
@font-face{font-family:'BarlowCondensed';src:url('../fonts/barlow.woff2') format('woff2');
  font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:'Acumin';src:url('../fonts/acumin.woff2') format('woff2');
  font-weight:300 800;font-style:normal;font-display:swap}

:root{
  --tsc-red:#ca1c2e; --tsc-yellow:#f0ba1b; --tsc-ink:#141013;
  /* Interaction never changes HUE — only luminance. The brand is four colours; a fifth
     one for hover is what makes a UI look bolted together. Yellow surfaces light up,
     black surfaces lift. */
  --tsc-yellow-lit:#ffd34d;
  --tsc-card:rgba(18,10,12,.80);
  --tsc-card-lift:rgba(32,19,21,.90);
  --tsc-glow:rgba(255,208,70,.6); --tsc-halo:rgba(0,0,0,.5);
  /* Same stack as --tsc-title: one face for all caps type. Kept as its own token
     because the headline and the names are sized and tracked independently. */
  --tsc-display:'BarlowCondensed','Arial Narrow',sans-serif;
  --tsc-title:'BarlowCondensed','Arial Narrow',sans-serif;
  --tsc-ui:'Acumin','Helvetica Neue',Arial,sans-serif;
  /* ONE grit asset, LOSSLESS, at the resolution a phone can actually show.
     History worth keeping: it was drawn at 440px (a 29% downscale of the artwork) which
     crushed it into busy speckle; then at 1200px lossy, which upscaled 2.8x on a retina
     phone AND smeared — measured against a lossless reference, the worst pixels were 22%
     off, which is the blocking that reads as "compressed".
     Now: 3400px, because 1100 CSS px at 3x device pixels is 3300 — so it renders 1:1 on a
     phone with no upscale — and lossless, so there are no artefacts at all. 6000px full
     resolution was tempting (and compresses to a similar size) but decodes to 103 MB of
     RAM versus 33 MB, for detail no screen in the room can resolve.
     Lossless normally balloons after a downscale because interpolation invents thousands
     of intermediate alpha values; quantising alpha to 32 levels while keeping pure 0 and
     pure 255 exact brings it back to 375 KB with a worst-case error of 4/255.
     The same file serves the field and the in-card overlay, so it decodes once. */
  --tsc-grit:url('../img/grit.webp');--tsc-seal:url('../img/seal-mark.png');
  /* Where the card's photo band is taken FROM, vertically. Not the centre, and this is why:
     the band is a wide strip across a much taller photo, and leader photos are two people
     stood up against a wall with their heads near the top of the frame. Centred, a 4:3 photo
     shows only its middle third — 33% to 67% — which runs the crop straight through their
     foreheads. 15% puts the strip near the top of the frame instead, which keeps heads in
     shot for landscape AND portrait sources.

     7%, and the number was MEASURED rather than picked. It was 10% until desktop photos were
     still coming up a little tight at the top: expanding the band alone only moves the window
     from 5.6% to 4.7% of the frame, because a taller band grows DOWNWARD as much as up. The
     bias is the lever that buys top margin, and 7% puts desktop at 3.3% and the phone at 2.3%
     — near-identical framing at both sizes, which is worth having on its own. Rendered at the real card width with
     the real stylesheet, a 4:3 photo shows: centred 33%-67% (which is the mid-forehead crop
     that started this), at 15% it is 8.3%-52.8% — still shaving the top of the hair — and at
     10% it is 5.6%-50.0%, which clears it. Portrait and 16:9 sources both land inside that
     too. Lower this if a photo ever shows too much wall above someone; raise it and you are
     back to cutting heads off. */
  --tsc-photo-y:7%;
  /* Strength of the photo-to-card join at the bottom of a card image. 1 = as designed,
     0 = no join at all. See .gimg::after for why it is only the bottom third. */
  --tsc-photo-veil:1;
  /* GRIT SCALE — the brand original is 6000x4500. It used to be drawn at 440px with a
     SECOND offset tile stacked on top, which crushed the texture into fine, busy speckle
     and doubled its density. The main site shows the same artwork large: soft blotches,
     sparse flecks. One layer, floored large enough that a phone shows a calm portion of
     the texture rather than the whole busy tile.
     This floor is what sets the resolution the field asset needs: 1100 CSS px on a 3x
     phone is 3300 device pixels, hence the 3400px source above. Raise one, raise both. */
  --tsc-grit-size:max(1100px, 100vw);
  /* Val asked for the texture to read softer so the content pops. The field asset is opaque
     (red baked in), so "more transparent" is a red veil over it rather than an alpha change —
     one number, and it keeps the compression win. 0 = full texture, 1 = flat red. */
  --tsc-grit-veil:.35;
  --tsc-grit-bg:linear-gradient(rgba(202,28,46,var(--tsc-grit-veil)),rgba(202,28,46,var(--tsc-grit-veil))),
                var(--tsc-grit) center top / var(--tsc-grit-size) repeat;
}

.tsc-jag{
  /* Full-bleed: fill the whole viewport width even inside a themed/Elementor column. */
  width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);
  background:var(--tsc-red);color:#fff;
  font-family:var(--tsc-ui);-webkit-font-smoothing:antialiased;position:relative;overflow-x:hidden;
  /* Acumin has a slant (slnt) axis; some iOS Safari builds render it obliquely by default.
     Pin slnt to 0 (font-weight still drives the wght axis) + kill synthetic italics. */
  font-style:normal;font-synthesis:none;
}
.tsc-jag *,.tsc-jag-modal *,.tsc-jag-toast{font-variation-settings:'slnt' 0}
.tsc-jag *{box-sizing:border-box;margin:0;padding:0}
.tsc-jag button{font:inherit;cursor:pointer;border:none;background:none;color:inherit;-webkit-tap-highlight-color:transparent}

/* THEME BLEED GUARD.
   WordPress themes (and Elementor) style bare <button> and its :hover, and those rules
   were painting the finder's Continue button and options in the theme's own accent — but
   NOT the Join button, because that one is an <a>. That inconsistency is the tell.
   Every interactive surface in here therefore states its own background and colour at
   every state, and wins outright, so the finder looks the same under any theme.
   The !important is deliberate and scoped to .tsc-jag; it is not papering over our own
   specificity, it is refusing to inherit someone else's palette. */
.tsc-jag button,.tsc-jag a.join,
.tsc-jag-modal button,.tsc-jag-modal a{background-image:none !important;text-shadow:none !important}

/* Visible to screen readers only — used for context the sighted layout already conveys
   ("opens in a new tab", "Change answer:", which group an Info button belongs to). */
.tsc-jag .sr-only,.tsc-jag-modal .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}

/* Embedded via an Elementor Shortcode widget: strip the wrapper padding so the finder
   fills the screen top-to-bottom (no white gaps). Intentionally reaches outside .tsc-jag. */
.elementor-widget-shortcode:has(.tsc-jag),
.elementor-widget-shortcode:has(.tsc-jag) > .elementor-widget-container,
.elementor-widget-shortcode:has(.tsc-jag) > .elementor-widget-container > .elementor-shortcode,
.e-con:has(.elementor-widget-shortcode .tsc-jag),
.e-con-inner:has(.elementor-widget-shortcode .tsc-jag),
.elementor-column:has(.elementor-widget-shortcode .tsc-jag),
.elementor-section:has(.elementor-widget-shortcode .tsc-jag){
  padding:0 !important; margin:0 !important;
}

/* Content column: fills a phone edge-to-edge; on wider screens it stays a centered
   560px column on the same red-grit field (no floating box). */
.tsc-jag .scr{width:100%;max-width:560px;margin:0 auto;min-height:100vh;min-height:100dvh;
  display:flex;flex-direction:column;position:relative;background:var(--tsc-red)}
.tsc-jag .scr::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;background:var(--tsc-grit-bg)}
.tsc-jag .scr > *{position:relative;z-index:1}

/* Question screens are SIZED to one viewport (min-height above) but never clipped.
   They used to be `height:100dvh;overflow:hidden`, which looked identical on a tall phone
   and silently put the Continue button out of reach on a short one, in landscape, or as
   soon as one more option was configured — a dead end with no way out and no scrollbar.
   Growing past the viewport and letting the page scroll is the safe version of the same
   design; the no-bounce feel comes from overscroll-behavior on the page itself, below. */
.tsc-jag .scr.step,.tsc-jag .scr.welcome{-webkit-overflow-scrolling:touch}

/* No rubber-band and no pull-to-refresh on the finder page — the swipe-down gesture
   belongs to the info sheet. Scoped to the full-screen template so it can never affect
   the rest of the site. */
html:has(> body.tsc-jag-fullscreen),body.tsc-jag-fullscreen{overscroll-behavior-y:contain}

/* Full-screen template: draw the grit as ONE viewport-fixed layer so the texture is perfectly
   continuous across the status-bar/home-indicator safe areas and the content — no tiling seam.
   The content field is made transparent so this single layer shows through everywhere. */
.tsc-jag-fullscreen{background:var(--tsc-red)}
.tsc-jag-fullscreen::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background:var(--tsc-grit-bg)}
.tsc-jag-fullscreen .tsc-jag{position:relative;z-index:1;background:transparent}
.tsc-jag-fullscreen .tsc-jag .scr{background:transparent}
.tsc-jag-fullscreen .tsc-jag .scr::before{display:none}

/* Edge-to-edge on notched phones (only under the full-screen template, which sets viewport-fit=cover). */
.tsc-jag-fullscreen .tsc-jag .band{padding-top:calc(16px + env(safe-area-inset-top))}
.tsc-jag-fullscreen .tsc-jag .welcome{padding-top:calc(22px + env(safe-area-inset-top))}
.tsc-jag-fullscreen .tsc-jag .paper{padding-bottom:calc(8px + env(safe-area-inset-bottom))}
.tsc-jag-fullscreen .tsc-jag .scr.dash{padding-bottom:env(safe-area-inset-bottom)}

.tsc-jag .spacer{flex:1;min-height:12px}
.tsc-jag .spacerx{flex:1}
.tsc-jag .foot{text-align:center;font-family:var(--tsc-ui);font-weight:500;letter-spacing:.16em;
  text-transform:uppercase;font-size:10.5px;color:rgba(255,255,255,.92);padding:14px 0}

/* ---- top row (logo badge + progress + back) ---- */
.tsc-jag .band{position:relative;padding:16px 20px 8px}
.tsc-jag .top{display:flex;align-items:center;gap:10px;min-height:58px}
.tsc-jag .back{font-size:24px;line-height:1;color:#fff !important;width:34px;height:34px;flex:none;
  display:flex;align-items:center;justify-content:center;border-radius:50%;background:transparent !important;transition:background-color .15s}
@media (hover:hover){ .tsc-jag .back:hover{background:rgba(255,255,255,.16) !important} }
.tsc-jag .back:active{background:rgba(255,255,255,.28) !important}
.tsc-jag .back:focus-visible{outline:2px solid #fff;outline-offset:2px}
.tsc-jag .back[hidden]{display:flex;visibility:hidden} /* keep the 34px so the row stays balanced */
.tsc-jag .prog{display:flex;gap:6px;flex:1}
.tsc-jag .prog i{height:5px;border-radius:3px;flex:1;background:rgba(255,255,255,.35)}
.tsc-jag .prog i.on{background:var(--tsc-yellow)}
/* Matches the main site's header mark: the bare "salt" script in brand RED on the yellow
   badge, filling most of the tile rather than sitting in a wide margin. */
.tsc-jag .badge{width:58px;height:58px;border-radius:15px;background:var(--tsc-yellow) !important;flex:none;
  display:flex;align-items:center;justify-content:center;text-decoration:none;
  -webkit-tap-highlight-color:transparent;transition:transform .12s;padding:7px 8px}
.tsc-jag .badge:active{transform:scale(.94)}
@media (hover:hover){ .tsc-jag .badge:hover{transform:scale(1.04)} }
.tsc-jag .badge:focus-visible{outline:3px solid #fff;outline-offset:2px}
/* OPTICAL centring, not geometric. The script's tall "t" stretches the bounding box
   upward while the weight of "sal" sits low — measured, the ink centroid is 11.5% of the
   height BELOW the box centre, so a mathematically centred box reads bottom-heavy in the
   tile. Nudging up by that measured amount puts the visual mass on the badge's centre.
   height:auto (not object-fit) so the element's height IS the artwork's height, which
   makes the percentage scale with the badge instead of needing a pixel value per size. */
.tsc-jag .badge img{width:100%;height:auto;display:block;transform:translateY(-11.5%)}
.tsc-jag .eyebrow{font-family:var(--tsc-ui);font-weight:700;text-transform:uppercase;letter-spacing:.14em;color:var(--tsc-yellow);font-size:13px}

/* ---- display headline ----
   TWO lines, centred. `balance` keeps them even rather than orphaning a word.

   THE SIZE IS NOT ARBITRARY, and it changed when this moved off Hightone. The two faces have
   an identical cap height (0.700em), so swapping the family alone keeps the letters exactly
   as TALL — but Barlow Condensed Bold sets 2.0x WIDER. At the old 92px, "CONNECTION GROUP"
   measures 654px inside a 560px container: it would have overflowed every screen.

   Sizes below were measured in a browser, not estimated:
       320px screen -> 37px      390px -> 45px      600px+ -> 68px (the type stops growing
                                                                   while the column is 560)

   WHAT ACTUALLY PREVENTS OVERFLOW is wrapping, not the size — so the clamp governs how big
   the type LOOKS, not whether it fits. The one hard requirement is that no single unbreakable
   word can exceed the column: the longest, CONNECTION, is 310px at the 68px cap inside a
   520px column, and overflow-wrap catches anything longer.

   So do not tune this to the last pixel, and do not read the leftover space as headroom.
   `balance` re-decides the line count as the size changes — "Where do you live?" sits on two
   comfortable lines at 72px and one tight line at 68px — which means leftover space is not
   monotonic in font-size and chasing it just moves which headline looks full. 68px was
   chosen because every step reads well at it, not because it is the largest number that
   fits (that was 72, and it left one case 9px from the edge). */
.tsc-jag .display{font-family:var(--tsc-display);font-weight:700;text-transform:uppercase;
  line-height:.92;color:#fff;text-align:center;white-space:normal;text-wrap:balance;
  overflow-wrap:break-word;font-size:clamp(34px,11.5vw,68px)}
.tsc-jag .display:focus{outline:none}
.tsc-jag .display:focus-visible{outline:2px solid #fff;outline-offset:4px}
.tsc-jag .band .display{margin-top:16px}
.tsc-jag .rule{height:2px;background:rgba(255,255,255,.5);margin-top:13px}

/* ---- options area (transparent — sits on the red grit) ---- */
.tsc-jag .paper{flex:1;position:relative;padding:12px 20px 8px;display:flex;flex-direction:column}
.tsc-jag .label{font-family:var(--tsc-ui);font-weight:700;text-transform:uppercase;letter-spacing:.14em;
  font-size:13px;color:var(--tsc-yellow);margin:4px 0 12px;text-align:center}

/* ---- option cards (black translucent + gold glow) ---- */
.tsc-jag .opts{display:flex;flex-direction:column;gap:11px}
/* The base state carries !important like every other control here. It is the state that
   matters most on a phone: :hover rules sit inside @media (hover:hover) and never fire on
   touch, and iOS leaves a button FOCUSED after a tap — so a theme's button:focus colour
   was painting the last-tapped option (typically one the student had just deselected)
   while every other option stayed correct. An !important base beats any non-important
   theme rule in any state, which is simpler and safer than chasing states one by one. */
.tsc-jag .opt{white-space:normal;text-align:left;display:flex;align-items:center;gap:13px;width:100%;
  /* Border width must be IDENTICAL in every state. .opt.on needs a 2px yellow edge, and
     when the resting border was 1.5px the card grew 1px per side on selection — which
     reflowed the whole list 2px downwards. Weight is carried by colour, not thickness. */
  border:2px solid rgba(255,255,255,.13);border-radius:15px;padding:15px 16px;
  background:var(--tsc-card) !important;color:#fff !important;
  position:relative;overflow:hidden;
  /* SHADOWS ARE NOT ANIMATED, deliberately. box-shadow cannot be composited, so every
     frame of a transition repaints the card and its blur over the textured field — that is
     the stutter, and it was worst between hover and selected because those two states had
     different layer structures for the browser to interpolate between.
     Every state below now has the SAME three layers in the same order and changes only the
     glow's alpha, so switching is instantaneous and free. (If a fade is ever wanted, the
     structures now match, so adding box-shadow back to the transition would interpolate
     cleanly — it just isn't worth the repaint.) */
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 3px 12px rgba(0,0,0,.30),0 0 10px rgba(255,208,70,0);
  transition:border-color .18s,background-color .18s}
/* Each card crops a DIFFERENT part of the grit. With a fixed `center` position every
   card the same size showed a pixel-identical texture, which stacked up as an obvious
   repeat down the list. --grit-x/y/scale are set per card in app.js from a hash of the
   card's own key, so the variation is natural but stable across re-renders and re-sorts. */
.tsc-jag .opt::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:var(--tsc-grit) var(--grit-x,50%) var(--grit-y,50%) / var(--grit-scale,210%) repeat;
  filter:invert(1);opacity:.12;mix-blend-mode:screen}
.tsc-jag .opt .r{width:22px;height:22px;border-radius:50%;border:2px solid #9a9089;flex:none;position:relative;z-index:1;
  transition:background-color .18s,border-color .18s}
/* Multi-select uses a SQUARE box, because a circle promises "pick one" and this step
   doesn't. The tick is a stroked path that draws itself in. */
.tsc-jag .opt .r.box{border-radius:7px}
.tsc-jag .opt .r.box svg{position:absolute;inset:-2px;width:22px;height:22px;display:block}
.tsc-jag .opt .r.box .tick{fill:none;stroke:var(--tsc-ink);stroke-width:3.2;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:22;stroke-dashoffset:22;transition:stroke-dashoffset .3s cubic-bezier(.2,.7,.3,1) .04s}
.tsc-jag .opt.on .r.box{background:var(--tsc-yellow);border-color:var(--tsc-yellow)}
.tsc-jag .opt.on .r.box .tick{stroke-dashoffset:0}
/* Nudged down to sit on the OPTICAL centre rather than the geometric one.
   align-items:center centres the line BOX, but a line box reserves room for descenders and
   an all-caps label has none — so the ink ends up 2.6px above centre in a 60px row while
   the checkbox beside it, whose box is its ink, sits dead centre. Measured: ink centre
   336.58 vs row centre 339.19 at 17px. Tuned by measuring again after the nudge rather
   than trusting the arithmetic. Expressed in em so it holds at both type sizes. */
.tsc-jag .opt .tx{flex:1;min-width:0;position:relative;z-index:1;top:.114em}
.tsc-jag .opt .tx b{display:block;font-family:var(--tsc-ui);font-weight:600;text-transform:uppercase;
  letter-spacing:.06em;font-size:16px;line-height:1.15;color:#fff;white-space:normal;word-break:break-word;overflow-wrap:anywhere}
.tsc-jag .opt .tx span{display:block;font-family:var(--tsc-ui);font-weight:300;letter-spacing:.03em;
  font-size:12.5px;color:rgba(255,255,255,.78);white-space:normal;overflow-wrap:anywhere;margin-top:1px}
/* Hover glow ONLY on real pointer devices — otherwise a touch tap leaves the glow "stuck"
   on the last-tapped option even after it's deselected. */
@media (hover:hover){
  .tsc-jag .opt:hover{background:var(--tsc-card-lift) !important;border-color:rgba(255,208,70,.7);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 3px 12px rgba(0,0,0,.30),0 0 10px rgba(255,208,70,.40)}
  .tsc-jag .opt:hover .r{border-color:rgba(255,208,70,.8)}
}
.tsc-jag .opt:active{background:var(--tsc-card-lift) !important;border-color:var(--tsc-yellow);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 3px 12px rgba(0,0,0,.30),0 0 12px rgba(255,214,90,.55)}
/* :focus spelled out so the selected state can't be undone by a theme either, and so it
   doesn't depend on this rule happening to sit later in the file than the base one. */
.tsc-jag .opt.on,.tsc-jag .opt.on:focus,.tsc-jag .opt.on:focus-visible{
  background:var(--tsc-card-lift) !important;border:2px solid var(--tsc-yellow);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 3px 12px rgba(0,0,0,.30),0 0 12px rgba(255,208,70,.55)}
.tsc-jag .opt.on .r{border-color:var(--tsc-yellow)}
/* the filled dot belongs to the round (single-choice) control only */
.tsc-jag .opt.on .r:not(.box)::after{content:"";position:absolute;inset:4px;border-radius:50%;background:var(--tsc-yellow)}
.tsc-jag .opt:focus-visible{outline:3px solid var(--tsc-yellow);outline-offset:2px}

/* An option that cannot reach any group given the answers so far. Shown, not hidden, so the
   list does not jump around and the student can see the choice existed — but not selectable. */
.tsc-jag .opt.dead{opacity:.42;cursor:not-allowed;box-shadow:none;border-color:rgba(255,255,255,.09)}
.tsc-jag .opt.dead .tx b{color:rgba(255,255,255,.75)}
.tsc-jag .opt.dead .tx span{color:rgba(255,255,255,.62);text-transform:none;letter-spacing:0}
.tsc-jag .opt.dead .r{border-color:rgba(255,255,255,.22)}
@media (hover:hover){ .tsc-jag .opt.dead:hover{background:var(--tsc-card) !important;border-color:rgba(255,255,255,.09);box-shadow:none} }

/* ---- search on the results screen ---- */
.tsc-jag .srch{display:block;padding:12px 20px 0}
/* 16px, and it MUST NOT go below that.
   iOS Safari force-zooms the page whenever a form control smaller than 16px receives focus,
   and the zoom stays put as the student moves between screens: the layout viewport is still
   390px while the visible one has shrunk, so the header, the cards and the Continue button
   all run off the right-hand edge. It reads as "the page shifted off screen when I went
   forward and back", and the real cause is one tap on this field several screens earlier. */
.tsc-jag .srch input{width:100%;font-family:var(--tsc-ui);font-weight:400;font-size:16px;color:#fff;
  background:rgba(20,16,19,.8) !important;border:1.5px solid rgba(255,255,255,.2);border-radius:12px;
  padding:12px 14px;-webkit-appearance:none}
.tsc-jag .srch input::placeholder{color:rgba(255,255,255,.6)}
.tsc-jag .srch input:focus-visible{outline:2px solid var(--tsc-yellow);outline-offset:2px}

/* ---- primary button (yellow pill + gold glow) ---- */
.tsc-jag .cta{display:flex;align-items:center;justify-content:center;gap:9px;
  background:var(--tsc-yellow) !important;color:var(--tsc-ink) !important;
  font-family:var(--tsc-ui);font-weight:800;text-transform:uppercase;letter-spacing:.05em;font-size:18px;
  padding:16px;border-radius:999px;width:100%;box-shadow:0 3px 12px rgba(0,0,0,.28);
  transition:transform .1s,background-color .18s;
  white-space:normal !important;overflow-wrap:anywhere;text-align:center} /* long empty-state labels wrap instead of clipping */
@media (hover:hover){
  .tsc-jag .cta:not([disabled]):hover{background:var(--tsc-yellow-lit) !important}
}
.tsc-jag .cta:not([disabled]):active{background:var(--tsc-yellow-lit) !important;transform:translateY(1px)}
/* The disabled state used to be opacity:.45, which composites the WHOLE button against the
   red field behind it — yellow at 45% over red reads orange. It was never an orange colour.
   The fill now stays brand yellow in every state; "not ready yet" is carried by the shadow
   and by a nudge on tap, neither of which touches the colour. */
/* same shadow as enabled — changing it was animating on every tap */
.tsc-jag .cta[disabled]{cursor:default}
.tsc-jag .opts.nudge{animation:tscNudge .34s ease}
@keyframes tscNudge{0%,100%{transform:translateX(0)}22%{transform:translateX(-7px)}
  55%{transform:translateX(5px)}80%{transform:translateX(-2px)}}
.tsc-jag .cta:focus-visible{outline:3px solid #fff;outline-offset:2px}
.tsc-jag .micro{text-align:center;color:rgba(255,255,255,.9);font-size:12px;margin-top:11px;font-family:var(--tsc-ui);letter-spacing:.04em}

/* ---- welcome ---- */
.tsc-jag .welcome{padding:22px 20px 16px}
.tsc-jag .welcome .display{margin-top:14px}
.tsc-jag .hero{position:relative;border-radius:16px;overflow:hidden;height:180px;margin-top:16px;flex:none}
.tsc-jag .hero img{width:100%;height:100%;object-fit:cover;object-position:center 40%}
.tsc-jag .hero .veil{position:absolute;inset:0;background:linear-gradient(0deg,rgba(143,20,32,.7),rgba(143,20,32,.15) 60%)}
.tsc-jag .hero .tag{position:absolute;left:12px;bottom:12px;background:var(--tsc-yellow);color:#111;font-family:var(--tsc-ui);
  font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:11px;padding:5px 9px;border-radius:6px}
.tsc-jag .welcome .intro{color:rgba(255,255,255,.88);font-family:var(--tsc-ui);font-weight:300;font-size:14.5px;line-height:1.55;margin-top:14px;letter-spacing:.01em}

/* ---- dashboard ---- */
.tsc-jag .dash{padding-bottom:0}
.tsc-jag .dtop{padding:16px 20px 14px;border-bottom:1px solid rgba(255,255,255,.18)}
.tsc-jag .dtop .top{min-height:34px}
.tsc-jag .dhead{margin-top:8px}
.tsc-jag .dhead .n{font-family:var(--tsc-ui);font-weight:800;text-transform:uppercase;letter-spacing:.03em;font-size:20px;color:#fff}
.tsc-jag .dhead .n:focus{outline:none}
.tsc-jag .dhead .n:focus-visible{outline:2px solid #fff;outline-offset:4px}
.tsc-jag .dhead .n b{color:var(--tsc-yellow)}
.tsc-jag .chips{display:flex;gap:7px;flex-wrap:wrap;margin-top:10px}
.tsc-jag .chip{display:inline-flex;align-items:center;line-height:1;
  background:rgba(20,16,19,.72) !important;color:#fff !important;
  font-family:var(--tsc-ui);font-weight:500;text-transform:uppercase;letter-spacing:.05em;font-size:10.5px;
  padding:7px 11px;border-radius:999px;border:1px solid rgba(240,186,27,.5);
  transition:background-color .15s,border-color .15s}
@media (hover:hover){ .tsc-jag .chip:hover{background-color:rgba(38,24,26,.85) !important;border-color:var(--tsc-yellow)} }
.tsc-jag .chip:active{background-color:rgba(46,29,31,.9) !important;border-color:var(--tsc-yellow)}
.tsc-jag .chip:focus-visible{outline:2px solid var(--tsc-yellow);outline-offset:2px}
/* Hint on the left, the way out on the right. "Start over" is the answer to "I picked the
   wrong thing three questions ago" — without it the only reset was reloading the page. */
.tsc-jag .chiprow{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:8px}
.tsc-jag .chiphint{font-family:var(--tsc-ui);font-weight:300;text-transform:uppercase;letter-spacing:.14em;
  font-size:10px;color:rgba(255,255,255,.92)}
.tsc-jag .startover{flex:none;font-family:var(--tsc-ui);font-weight:600;text-transform:uppercase;letter-spacing:.1em;
  font-size:10px;color:var(--tsc-yellow) !important;background:transparent !important;
  padding:4px 0;border-bottom:1px solid rgba(240,186,27,.5);border-radius:0;transition:border-color .15s,color .15s}
@media (hover:hover){ .tsc-jag .startover:hover{border-bottom-color:var(--tsc-yellow);color:var(--tsc-yellow-lit) !important} }
.tsc-jag .startover:active{color:var(--tsc-yellow-lit) !important}
.tsc-jag .startover:focus-visible{outline:2px solid var(--tsc-yellow);outline-offset:3px}
.tsc-jag .controls{display:flex;gap:10px;margin-top:13px;flex-wrap:wrap;align-items:center}
.tsc-jag .ctl{display:flex;align-items:center;font-family:var(--tsc-ui);font-weight:500;text-transform:uppercase;
  letter-spacing:.1em;font-size:10.5px;color:rgba(255,255,255,.92)}
/* 16px for the same reason as the search field — a <select> triggers the same iOS zoom.
   The type is visually held down with tighter tracking and padding rather than a smaller
   size, because size is the thing iOS actually keys off. */
.tsc-jag .controls select{font-family:var(--tsc-ui);font-weight:600;font-size:16px;letter-spacing:.01em;color:#fff;
  border:1px solid rgba(255,255,255,.24);border-radius:9px;padding:5px 9px;background:rgba(20,16,19,.85);margin-right:6px}
.tsc-jag .controls select:focus-visible{outline:2px solid var(--tsc-yellow);outline-offset:2px}
.tsc-jag .controls option{color:var(--tsc-ink)}
.tsc-jag .list{padding:14px 20px 28px;display:flex;flex-direction:column;gap:13px}

/* group cards (dark translucent + shadow) */
.tsc-jag .gcard{position:relative;background:rgba(18,10,12,.82);border:1px solid rgba(255,255,255,.12);border-radius:17px;overflow:hidden;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05),0 4px 16px rgba(0,0,0,.34)}
.tsc-jag .gcard::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:var(--tsc-grit) var(--grit-x,50%) var(--grit-y,50%) / var(--grit-scale,230%) repeat;
  filter:invert(1);opacity:.10;mix-blend-mode:screen}
.tsc-jag .gcard .gimg,.tsc-jag .gcard .gbody{position:relative;z-index:1}
/* A full group is de-emphasised, not made illegible: desaturate the imagery and mute the
   frame, but leave the text at full contrast so it can still be read. */
.tsc-jag .gcard.full{border-color:rgba(255,255,255,.08);box-shadow:none;background:rgba(18,10,12,.62)}
.tsc-jag .gcard.full .gimg,.tsc-jag .gcard.full .av{filter:grayscale(1);opacity:.55}
.tsc-jag .gcard.full .gname,.tsc-jag .gcard.full .gwhen,.tsc-jag .gcard.full .gmeta,.tsc-jag .gcard.full .gloc{color:rgba(255,255,255,.75)}
/* THE PHONE BAND, and it is an aspect rather than a fixed height on purpose.
   118px was the same ~3:1 proportion the desktop breakpoint uses, which meant the phone
   showed an identical slice of each photo at half the size — so faces were tiny AND still
   clipped, and nothing about it was actually tuned for a phone.
   2/1 shows 67% of a 4:3 photo instead of 45%, and being an aspect it grows with the handset
   rather than staying 118px on every phone from an SE to a Pro Max. Combined with the 10% top
   bias the window is 3%-70% of the frame: whole heads, shoulders, room to spare.
   It costs about 57px of card height on a 350pt phone. Dial toward 2.2/1 or 2.6/1 if the list
   feels too long to scroll; anything above ~2.6 starts clipping heads again. */
.tsc-jag .gimg{position:relative;height:auto;aspect-ratio:2/1;background:#2a1a1c;overflow:hidden}
.tsc-jag .gimg img{width:100%;height:100%;object-fit:cover;object-position:center var(--tsc-photo-y);display:block}
/* The join between photo and card body — NOT a veil over the photo.
   It used to be linear-gradient(0deg, rgba(24,16,18,.92), rgba(143,20,32,.32)): 92% opaque at
   the bottom and never lighter than 32% red anywhere, so every pixel of every photo was tinted
   and the whole card read as murky. That was tolerable while the photos were dark scenery and
   is not once they are people's faces.
   Nothing is drawn over this image — the name and time live in .gbody below it — so the
   overlay was never protecting legibility. All it has to do is stop the photo ending in a hard
   line against the card, which needs the bottom third and nothing above it. The top 70% is now
   completely clean. Fades to the card's own ink rather than red: the page behind is already
   brand red and the card reads maroon over it, so the red language is present without putting
   a tint on anyone's face. Turn --tsc-photo-veil down to 0 to remove the join entirely. */
.tsc-jag .gimg::after{content:"";position:absolute;inset:0;pointer-events:none;
  opacity:var(--tsc-photo-veil,1);
  background:linear-gradient(0deg,rgba(18,10,12,.78) 0%,rgba(18,10,12,.30) 12%,rgba(18,10,12,0) 30%)}
.tsc-jag .gbody{padding:13px 14px 14px}
.tsc-jag .grow{display:flex;align-items:center;gap:11px}
.tsc-jag .gwho{flex:1;min-width:0}
.tsc-jag .av{width:40px;height:40px;border-radius:50%;flex:none;overflow:hidden;display:grid;place-items:center;
  background:var(--tsc-yellow);color:var(--tsc-ink);font-family:var(--tsc-ui);font-weight:800;font-size:16px}
/* The seal, inset so its outer ring doesn't run into the edge of the circle it sits in. */
.tsc-jag .av.seal{background-color:var(--tsc-yellow);background-image:var(--tsc-seal);
  background-repeat:no-repeat;background-position:center;background-size:86% auto}
.tsc-jag .av img{width:100%;height:100%;object-fit:cover;display:block}
.tsc-jag .spots{flex:none;align-self:flex-start;background:var(--tsc-yellow);color:var(--tsc-ink);font-family:var(--tsc-ui);font-weight:800;
  text-transform:uppercase;letter-spacing:.03em;font-size:11px;padding:4px 9px;border-radius:999px;white-space:nowrap}
.tsc-jag .spots.isfull{background:#e6e0d8;color:#4a443f}
.tsc-jag .gname{font-family:var(--tsc-title);font-weight:700;text-transform:uppercase;letter-spacing:.035em;font-size:20px;line-height:1.1;color:#fff}
/* The meeting time — the fact a student is choosing on, so it gets the size. */
.tsc-jag .gwhen{font-family:var(--tsc-ui);font-weight:600;text-transform:uppercase;letter-spacing:.04em;
  font-size:15px;color:#fff;margin-top:5px}
/* The leader's name, quieter, underneath. */
.tsc-jag .gmeta{font-family:var(--tsc-ui);font-weight:300;text-transform:uppercase;letter-spacing:.05em;font-size:12px;color:rgba(255,255,255,.7);margin-top:2px}
.tsc-jag .gloc{display:flex;align-items:center;gap:6px;margin-top:10px;font-family:var(--tsc-ui);font-weight:300;
  text-transform:uppercase;letter-spacing:.05em;font-size:12px;color:rgba(255,255,255,.88)}
.tsc-jag .gloc .pin{flex:none}
.tsc-jag .gact{display:flex;align-items:center;gap:10px;margin-top:13px}
/* Join is the same yellow surface as the CTA and must behave identically — it previously
   missed the hover treatment simply because it's an <a> and the rules were button-shaped. */
.tsc-jag .join{flex:1;text-align:center;background:var(--tsc-yellow) !important;color:var(--tsc-ink) !important;
  font-family:var(--tsc-ui);font-weight:800;
  text-transform:uppercase;letter-spacing:.04em;font-size:15px;padding:11px 20px;border-radius:999px;text-decoration:none;display:block;
  box-shadow:0 3px 10px rgba(0,0,0,.26);transition:transform .1s,background-color .18s}
@media (hover:hover){
  .tsc-jag a.join:hover{background:var(--tsc-yellow-lit) !important}
}
.tsc-jag a.join:active{background:var(--tsc-yellow-lit) !important;transform:translateY(1px)}
.tsc-jag a.join:focus-visible{outline:3px solid #fff;outline-offset:2px}
/* "Request to join" — past the site cap but still open in Planning Center. Deliberately
   NOT the confident yellow of a normal Join: outlined in yellow so it reads as available
   but conditional, which is exactly what it is. */
.tsc-jag a.join.req{background:transparent !important;color:var(--tsc-yellow) !important;
  border:2px solid var(--tsc-yellow);box-shadow:none;font-size:13.5px;padding:9px 14px}
@media (hover:hover){ .tsc-jag a.join.req:hover{background:rgba(240,186,27,.14) !important;box-shadow:none} }
.tsc-jag a.join.req:active{background:rgba(240,186,27,.22) !important;transform:translateY(1px)}

/* Non-interactive states: styled as a label, not a button, so they don't invite a tap. */
.tsc-jag .join.isfull,.tsc-jag .join.nolink{flex:1;text-align:center;background:transparent !important;color:rgba(255,255,255,.75) !important;
  border:1.5px dashed rgba(255,255,255,.3);box-shadow:none;cursor:default}
/* The outline is drawn as an INSET RING, not a border. A border on a pill is rendered as
   four separate pieces — two end-cap arcs plus a straight top and bottom — and at a
   fractional 1.5px width the seams where they meet were visible as four short tick marks
   on the edge. An inset ring is a single path, so it has no joins to show.
   (This ring has zero blur and zero spread, so unlike the big soft shadows elsewhere it is
   cheap enough to transition — there is no blur area to repaint.) */
.tsc-jag .more{background:transparent !important;border:0;box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.35);
  color:#fff !important;font-family:var(--tsc-ui);font-weight:700;
  text-transform:uppercase;letter-spacing:.04em;font-size:13px;padding:12px 17px;border-radius:999px;transition:box-shadow .15s}
@media (hover:hover){ .tsc-jag .more:hover{background:rgba(255,255,255,.10) !important;box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.6)} }
.tsc-jag .more:active{background:rgba(255,255,255,.16) !important}
.tsc-jag .more:focus-visible{outline:3px solid var(--tsc-yellow);outline-offset:2px}

/* ---- empty state ---- */
.tsc-jag .empty{text-align:center;padding:40px 24px;color:rgba(255,255,255,.85)}
.tsc-jag .empty h3{font-family:var(--tsc-ui);font-weight:800;text-transform:uppercase;font-size:22px;color:#fff;margin-bottom:8px}
.tsc-jag .empty p{font-family:var(--tsc-ui);font-weight:300;font-size:14px;line-height:1.5;margin-bottom:18px;letter-spacing:.03em}

/* ---- info modal (renders on <body>, outside .tsc-jag) ---- */
.tsc-jag-modal{position:fixed;inset:0;z-index:99999;display:flex;align-items:flex-end;justify-content:center;
  background:rgba(10,7,8,.66);padding:0;font-family:var(--tsc-ui);overscroll-behavior:none;
  font-style:normal;font-synthesis:none}
.tsc-jag-modal *{box-sizing:border-box}
.tsc-jag-modal .sheet{position:relative;background:#181012;color:#fff;width:100%;max-width:480px;border-radius:22px 22px 0 0;
  padding:24px 20px calc(26px + env(safe-area-inset-bottom));max-height:85vh;overflow:auto;overscroll-behavior:contain;
  box-shadow:0 -12px 44px rgba(0,0,0,.5);border-top:1px solid rgba(255,255,255,.1)}
/* The grab handle exists to advertise swipe-to-dismiss, which is a touch gesture. On a
   device with a real pointer there is nothing to swipe, so the handle is just a stray bar —
   hide it there. Keyed on input capability, not width, because a large touch tablet still
   swipes. Same query used for the hover glows, so the two stay consistent. */
.tsc-jag-modal .grab{position:absolute;top:8px;left:50%;transform:translateX(-50%);width:42px;height:4px;border-radius:2px;
  background:rgba(255,255,255,.4);z-index:3;pointer-events:none}
@media (hover:hover) and (pointer:fine){
  .tsc-jag-modal .grab{display:none}
  /* reclaim the space the handle was reserving */
  .tsc-jag-modal .sheet{padding-top:20px}
  .tsc-jag-modal .mimg{margin-top:-20px}
}
/* the sheet with no gesture never needs the top allowance at all */
.tsc-jag-modal .sheet.nodrag{padding-top:22px}
.tsc-jag-modal .mimg{margin:-24px -20px 16px;aspect-ratio:16 / 7;overflow:hidden;background:#2a1a1c;position:relative}
.tsc-jag-modal .mimg img{width:100%;height:100%;object-fit:cover;object-position:center var(--tsc-photo-y);display:block}
/* Set solid at 32px, a condensed face runs its letters into one another and a long name of
   proper nouns is genuinely hard to parse. A little tracking separates the shapes. Kept after
   the move to Barlow: it is cleaner than Hightone was, but still condensed enough to need it. */
.tsc-jag-modal .mname{font-family:var(--tsc-title);font-weight:700;text-transform:uppercase;font-size:32px;line-height:1.02;letter-spacing:.02em;color:#fff;margin:0}
.tsc-jag-modal .mrows{margin:16px 0 6px;display:flex;flex-direction:column;gap:10px}
.tsc-jag-modal .mrow{display:flex;gap:12px;font-size:14.5px;align-items:baseline}
.tsc-jag-modal .mk{flex:0 0 64px;color:var(--tsc-yellow);font-family:var(--tsc-ui);font-weight:600;text-transform:uppercase;letter-spacing:.08em;font-size:12px}
.tsc-jag-modal .mv{color:#fff;font-weight:400}
.tsc-jag-modal .mdesc{font-size:14.5px;line-height:1.6;margin:16px 0 20px;color:rgba(255,255,255,.85);font-weight:300}
.tsc-jag-modal .join{display:block;text-align:center;background:var(--tsc-yellow) !important;color:var(--tsc-ink) !important;text-decoration:none;
  font-family:var(--tsc-ui);font-weight:800;text-transform:uppercase;letter-spacing:.05em;font-size:16px;padding:15px;border-radius:999px}
.tsc-jag-modal .join:focus-visible{outline:3px solid #fff;outline-offset:2px}
@media (hover:hover){ .tsc-jag-modal .join:hover{background:var(--tsc-yellow-lit) !important} }
.tsc-jag-modal .join.req{background:transparent !important;color:var(--tsc-yellow) !important;
  border:2px solid var(--tsc-yellow)}
@media (hover:hover){ .tsc-jag-modal .join.req:hover{background:rgba(240,186,27,.14) !important} }
.tsc-jag-modal .join.isfull,.tsc-jag-modal .join.nolink{background:transparent !important;
  color:rgba(255,255,255,.75) !important;border:1.5px dashed rgba(255,255,255,.3);cursor:default}
/* The modal lives on <body>, OUTSIDE .tsc-jag — so the theme-bleed guard scoped to
   .tsc-jag never covered it, and a theme's button:hover was painting Close in its own
   accent. Every state states its own background here, same as the in-app controls. */
.tsc-jag-modal .close{display:block;margin:14px auto 0;color:rgba(255,255,255,.8) !important;
  background:transparent !important;border:none;cursor:pointer;border-radius:999px;padding:8px 16px;
  font-family:var(--tsc-ui);font-weight:600;text-transform:uppercase;letter-spacing:.06em;font-size:13px;
  transition:background-color .15s,color .15s}
@media (hover:hover){ .tsc-jag-modal .close:hover{background:rgba(255,255,255,.12) !important;color:#fff !important} }
.tsc-jag-modal .close:active{background:rgba(255,255,255,.18) !important}
.tsc-jag-modal .close:focus-visible{outline:2px solid #fff;outline-offset:3px}
@media (min-width:768px){
  .tsc-jag-modal{align-items:center}
  .tsc-jag-modal .sheet{border-radius:20px;max-width:460px;max-height:86vh}
}

/* ---- toast (e.g. "that group just filled") ---- */
.tsc-jag-toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,20px);z-index:100000;background:#000 !important;color:#fff !important;
  font-family:var(--tsc-ui);font-size:14px;line-height:1.4;padding:12px 18px;border-radius:12px;
  box-shadow:0 12px 40px rgba(0,0,0,.5);max-width:90%;text-align:center;opacity:0;
  transition:opacity .25s ease,transform .25s ease;border:1px solid rgba(255,255,255,.12)}
.tsc-jag-toast.show{opacity:1;transform:translate(-50%,0)}

/* ---- desktop / wide screens ----
   Two rules matter here and they interact:

   1. TOP-ANCHORED, NOT CENTRED. On a phone the spacer pushing the button to the bottom
      edge is right — it's one thumb-reachable screen. On desktop that stranded the button
      far below the question, so the block was centred instead; but centring makes the
      header sit at a different height on every step (three options vs five) and the
      results screen is top-aligned regardless, so moving through the wizard made the logo
      and title jump around. Everything is pinned to the same top offset instead, and the
      offset is on .scr so the step band and the results header start at the same y.

   2. BIGGER TYPE, WIDER COLUMN. A 560px column with a 45px headline is a phone layout
      stretched onto a monitor. Both scale up with the viewport. */
@media (min-width:820px){
  .tsc-jag .scr{max-width:680px;padding-top:clamp(20px,4.5vh,56px)}
  /* 3. THE CARD PHOTO BAND. A fixed 96px height means the crop tightens as the card widens:
        a 16:9 photo shows 44% of its height on a phone, but only 27% at 640px and 19% at
        900px, so artwork that sits comfortably on mobile gets sliced through on a monitor.
        A fixed ASPECT holds the framing steady at any width.
        2.5/1, arrived at in three steps and worth recording so it is not re-litigated.
        4/1 was the original and matched what the phone showed — the right instinct while the
        photos were landscape scenery, and 33% of a 4:3 frame once they were people. 3/1 took
        that to 44%, which cleared most heads but still ran tight on photos framed a little
        higher. 2.5/1 shows 53%.
        NOT 2/1 like the phone, and that is deliberate rather than timid: a desktop card is
        twice as wide, so the same ratio makes a 340px band and the list stops reading as a
        list. 53% here against 67% on the phone lands both windows within a percentage point
        of each other in FRAME terms, which is the thing that actually matters. */
  .tsc-jag .gimg{height:auto;aspect-ratio:2.5/1}
  /* Re-measured for Barlow Condensed. The old 112px cap was sized for Hightone, which sets
     half as wide — in Barlow it pushed "FIND YOUR CONNECTION GROUP" onto THREE lines,
     because a line can only hold "CONNECTION GROUP" (711px per 100px of size) up to 90px
     in this 640px column. Past that the greedy wrap breaks "CONNECTION" and "GROUP" apart
     and balance keeps all three lines.

     80px, so the hero holds two lines with 71px to spare rather than sitting 1px from
     flipping to three. It also keeps "Where do you live?" on one line (601px), which 90px
     would have wrapped. The floor is 68px — the same as the mobile cap — so crossing this
     breakpoint never makes the headline suddenly SMALLER than it was on a narrower screen. */
  .tsc-jag .display{font-size:clamp(68px,8.5vw,80px)}
  .tsc-jag .band{padding-bottom:4px}
  .tsc-jag .band .display{margin-top:22px}
  .tsc-jag .rule{margin-top:18px}
  .tsc-jag .label{font-size:14px;margin:14px 0 16px}
  .tsc-jag .opt{padding:17px 18px}
  .tsc-jag .opt .tx b{font-size:17px}
  /* the button follows the question instead of being pushed to the bottom edge */
  .tsc-jag .scr.step .paper{flex:0 0 auto}
  .tsc-jag .scr.step .spacer{display:none}
  .tsc-jag .scr.step .cta{margin-top:24px}
  .tsc-jag .scr.step .foot{padding-top:24px}
  .tsc-jag .scr.welcome .spacer{min-height:24px;flex:0 0 auto}
  .tsc-jag .dhead .n{font-size:24px}
}

/* ---- short viewports (landscape phones) ----
   Tighten the vertical rhythm so a rotated phone shows the whole question without a
   long scroll, and let the welcome hero shrink instead of forcing the CTA off-screen. */
@media (max-height:560px){
  .tsc-jag .display{font-size:clamp(26px,8vh,36px)}
  .tsc-jag .band{padding:10px 20px 6px}
  .tsc-jag .band .display{margin-top:8px}
  .tsc-jag .rule{margin-top:8px}
  .tsc-jag .paper{padding:8px 20px 8px}
  .tsc-jag .label{margin:2px 0 8px}
  .tsc-jag .opts{gap:8px}
  .tsc-jag .opt{padding:11px 14px}
  .tsc-jag .cta{padding:13px;font-size:16px}
  .tsc-jag .foot{padding:8px 0}
  .tsc-jag .hero{height:min(180px,26vh)}
  .tsc-jag .welcome .intro{margin-top:10px}
}

@media (prefers-reduced-motion: reduce){
  .tsc-jag *,.tsc-jag-modal *,.tsc-jag-toast{transition:none !important;animation:none !important}
}
