/* ==========================================================================
   Indore — homepage
   Figma: Rqwo562WA6jYmkKiR121n2, frame 42:33 "Homepage (pass 4, Dragan edit)"
   Reference frame 1440 wide, content column 1360 (40px margins).
   Vertical rhythm below is taken from the frame's own y offsets.

   Loads AFTER css/base.css, which carries everything this page shares with
   the rest of the site: the faces, the tokens, the reset, .wrap, the display
   type classes, .capsule / .btn / .opill, .nav, .snav, .mc, the footer and
   the reduced-motion block. What is left here is the homepage's nine
   sections and nothing else.
   ========================================================================== */

/* ---------- homepage override ----------
   The capsule is tight below 400px and its label gives up tracking to fit.
   base.css holds the shared step (12px / .13em from 899px down); this last
   squeeze is the homepage's own, because the sign-in page's eyebrow uses the
   same .cap and has room for it. */
@media (max-width:399px){
  .cap{font-size:12px;letter-spacing:.08em}
}

/* ==========================================================================
   01 — Hero  (42:34)  1440 x 900
   ========================================================================== */
/* ---- the address bar ----
   100svh is the height of the screen WITH the browser's address bar showing.
   Sizing the hero to it means that the moment the bar slides away the screen
   is taller than the hero and the white intro section below shows at the
   bottom — a strip that appears and vanishes as the bar comes and goes.
   So the hero is sized to the LARGE viewport instead: the tallest the screen
   ever gets, so the photograph covers it in both states and nothing can peek
   in underneath.
   The cost is that with the bar showing, the last (100lvh - 100svh) of the
   hero sits below the fold — which is where the bottom block lives. It is
   lifted by exactly that difference, so it comes to rest its usual distance
   above the SMALL viewport's bottom edge and is visible either way.
   This is deliberately NOT scoped to phones. A tablet in landscape is wide
   enough for the 900-up layout and still has a collapsing toolbar, so it had
   the defect too. On a desktop browser the two units are equal, the
   difference is exactly zero, and both expressions resolve to the values they
   have always had — which is why widening this costs nothing.
   lvh and svh are both static: neither changes during a scroll, so this
   resolves once at layout and never animates. That is the whole point.
   The first declaration of each pair is the fallback for a browser that has
   neither unit. */
.hero{position:relative;background:var(--ink);overflow:hidden;
  min-height:100vh;min-height:100lvh}
/* The video is the hero's ground. It crops exactly as the photograph it
   replaced — same object-fit, same object-position — and the poster is laid
   out by those same two properties, so the still and the first video frame
   sit in identical positions and the handover is invisible. The ink ground
   is there for the instant before the poster decodes. */
.hero__video{position:absolute;inset:0;width:100%;height:100%;max-width:none;
  object-fit:cover;object-position:50% 50%;background:var(--ink)}
/* still in use: the fallback inside the <video>, for a browser with no video */
.hero__img{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;object-position:50% 50%}
.hero__scrim{position:absolute;left:0;right:0;bottom:0;height:36%;
  background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.45))}
.hero__word{position:absolute;left:0;right:0;top:32.8%}
.hero__word .wordmark text{fill:var(--white)}
.hero__bottom{position:absolute;left:0;right:0;
  bottom:57px;bottom:calc(57px + 100lvh - 100svh)}
.hero__bottom .wrap{display:flex;flex-direction:column;align-items:flex-start;gap:24px}
.hero__tag{font-family:var(--disp);font-weight:500;font-size:20px;line-height:1.15;color:var(--white);max-width:617px}
@media (min-width:900px){
  .hero__bottom .wrap{flex-direction:row;align-items:center;justify-content:space-between;gap:40px}
  .hero__tag{font-size:26px}
  .hero__bottom .capsule{flex:0 0 auto}
}
@media (max-width:899px){
  /* a phone sits the block closer to the bottom edge; the address-bar lift on
     the base rule above is carried through unchanged */
  .hero__bottom{bottom:28px;bottom:calc(28px + 100lvh - 100svh)}
  .hero__word{top:auto;bottom:40%}
  /* the column stacks here, so the tagline and the capsule are centred on the
     frame rather than hung off its left edge. This stays narrow-only: from 900
     up the block is a row and the side-by-side arrangement is correct. */
  .hero__bottom .wrap{align-items:center;text-align:center}
}

/* ==========================================================================
   02 — Intro  (42:47)  1440 x 1093
   ========================================================================== */
.intro{background:var(--white);padding:72px 0}
.intro .wrap{display:flex;flex-direction:column;align-items:center;gap:72px}
.intro__grid{display:grid;gap:32px;width:100%;max-width:1232px}
.intro__lead{font-family:var(--disp);font-weight:500;font-size:34px;line-height:1.3;color:var(--primary)}
.intro__body{color:var(--plum70);font-size:18px;line-height:1.25}
.intro__body p+p{margin-top:1.25em}
.intro__kit{display:flex;flex-direction:column;align-items:center;gap:12px;max-width:500px;text-align:center}
.intro__icons{display:flex;justify-content:center}
.intro__icons img{width:120px;height:120px;flex:0 0 auto}
.intro__kit h2{font-family:var(--disp);font-weight:500;font-size:22px;line-height:1.15;color:var(--plum)}
.intro__kit p{font-size:16px;color:var(--plum70);line-height:1.25}
@media (max-width:899px){
  /* keep a readable measure once the two columns stack */
  .intro__grid{max-width:640px;margin-inline:auto}
}
@media (min-width:900px){
  .intro{padding:128px 0}
  .intro .wrap{gap:128px}
  .intro__grid{grid-template-columns:repeat(2,minmax(0,600px));justify-content:center;align-items:center}
  .intro__lead{font-size:64px}
  .intro__body{font-size:20px}
  .intro__kit h2{font-size:24px}
}

/* ==========================================================================
   03 — Base ride  (42:64)  1440 x 993
   ========================================================================== */
.base{position:relative;overflow:hidden;background:var(--ink);
  min-height:clamp(620px,68.96vw,1081px);display:flex;flex-direction:column}
.base__img{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;object-position:50% 0%}
.base__scrim{position:absolute;inset:0;background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.65))}
.base__in{position:relative;z-index:2;flex:1;display:flex;flex-direction:column;
  width:100%;max-width:var(--maxw);margin-inline:auto;padding:clamp(56px,9.26vw,145px) var(--pad) 0}
.base__head{color:var(--white)}
.base__kicker{font-size:clamp(22px,3.333vw,52px);margin-left:.146em}
.base__big{font-size:clamp(54px,17.778vw,279px);line-height:1;margin-top:-.088em}
.base__foot{margin-top:auto;display:flex;flex-direction:column;gap:32px;
  padding-bottom:clamp(64px,10.2vw,160px);color:var(--white)}
.base__copy{display:flex;flex-direction:column;gap:32px;max-width:560px}
.base__copy h2{font-size:clamp(26px,2.36vw,37px)}
.base__copy p{font-size:clamp(17px,1.39vw,22px);line-height:1.25}
.base__tear{position:absolute;left:0;right:0;bottom:-1px;z-index:3;width:100%;
  height:clamp(24px,4.3vw,67px);line-height:0}
.base__tear svg{width:100%;height:100%;display:block}
@media (min-width:900px){
  .base__copy{max-width:min(38.89vw,610px)}
  .base__foot{flex-direction:row;align-items:flex-end;justify-content:space-between;gap:40px}
  .base__foot .capsule{flex:0 0 auto;margin-bottom:6px}
}
@media (max-width:899px){
  /* the Figma's 993px block would squeeze to 269px of proportional height here,
     so give the two text blocks room and darken the lower photo to keep the
     white copy legible over a busy frame */
  .base{min-height:780px}
  .base__scrim{background:linear-gradient(rgba(0,0,0,.18),rgba(0,0,0,.28) 32%,rgba(0,0,0,.8) 76%)}
  .base__foot{gap:24px}
  .base__foot .capsule{align-self:flex-start}
}

/* ==========================================================================
   04 — Sessions  (42:81)  1440 x 1240
   ========================================================================== */
.sessions{position:relative;background:var(--surface);padding:88px 0 80px;overflow-x:clip}

.structure{position:relative}
.structure__small{font-size:clamp(17px,4.444vw,69px);text-align:right;color:var(--primary);margin-bottom:10px}
.structure .wordmark text{fill:var(--primary)}

.sessions__cols{display:grid;gap:36px;margin-top:48px}
.sessions__cols>div{display:flex;flex-direction:column;gap:20px}
.sessions__cols h3{font-family:var(--disp);font-weight:500;font-size:24px;line-height:1.15;color:var(--plum)}
.sessions__cols p{font-size:18px;color:var(--plum70);line-height:1.28}
.sessions__cta{display:flex;justify-content:center;margin-top:48px}

/* session cards */
.scard{background:var(--white);border:1px solid var(--border);border-radius:24px;
  padding:32px 32px 10px;box-shadow:var(--lift-card);width:480px;max-width:100%}
.scard h3{font-family:var(--body);font-weight:700;font-size:22px;line-height:1.2;color:var(--plum);margin-bottom:12px}
.srow{display:grid;grid-template-columns:200px 180px;justify-content:space-between;align-items:center;
  height:50px;border-top:1px solid var(--border)}
.srow .n{font-size:16px;color:var(--plum)}
.srow .m{font-family:var(--mono);font-weight:400;font-size:14px;color:var(--plum70);white-space:nowrap}
.scard--cut{border-radius:24px 24px 0 0}

.sdeck{display:flex;flex-direction:column;align-items:center;gap:24px;margin-top:56px}

@media (min-width:900px){
  .sessions{padding:133px 0 96px}
  .structure__small{margin-bottom:-.411em}
  .sessions__cols{grid-template-columns:repeat(4,minmax(0,1fr));gap:32px;margin-top:152px}
  .sessions__cta{margin-top:64px}
}
/* the overlapping deck only once there is room for it to read as designed */
@media (min-width:1200px){
  .sessions{padding-bottom:431px}
  .sdeck{display:block;position:absolute;left:50%;transform:translateX(-50%);
    bottom:0;width:1440px;height:0;margin-top:0}
  .sdeck .scard{position:absolute}
  .sc-a{left:246px;bottom:-120px;z-index:1}
  .sc-b{left:698px;bottom:-120px;z-index:1}
  .sc-c{left:464px;bottom:-12px;z-index:2}
}
@media (max-width:1199px){
  .sdeck .scard{width:min(480px,100%)}
}
/* The deck is designed as three overlapping cards and only reads that way from
   1200px up. Below 900 it is dropped rather than stacked: display:none takes
   its top margin with it, so the section closes on .sessions__cta and its own
   bottom padding, with nothing stranded. The markup stays, so bringing it back
   is deleting this rule. */
@media (max-width:899px){
  .sdeck{display:none}
}
@media (min-width:600px) and (max-width:899px){
  /* four columns is too many at tablet width, one is too wide a measure */
  .sessions__cols{grid-template-columns:repeat(2,minmax(0,1fr));gap:32px 32px}
}
@media (max-width:899px){
  .srow{grid-template-columns:1fr auto;gap:16px}
  .srow .m{text-align:right}
}
@media (max-width:399px){
  .scard{padding:24px 20px 6px}
  .srow .n{font-size:16px}
  .srow .m{font-size:13px}
}

/* ==========================================================================
   05 — Group rides  (54:277)  1440 x 1145
   ========================================================================== */
.group{position:relative;overflow:hidden;
  background:var(--primary) center center/cover no-repeat;
  /* plain url() first so a browser without image-set() still gets the JPG */
  background-image:url("../assets/img/ridealone-bg.jpg");
  background-image:image-set(url("../assets/img/ridealone-bg.webp") type("image/webp"),
                             url("../assets/img/ridealone-bg.jpg") type("image/jpeg"));
  padding:72px 0}
.group .wrap{position:relative}
.group__head{font-size:clamp(42px,8.889vw,139px);color:var(--plum)}
.group__copy{display:flex;flex-direction:column;align-items:flex-start;gap:32px;max-width:560px;margin-top:48px}
.group__copy h3{font-size:clamp(26px,2.36vw,37px);color:var(--plum)}
.group__copy p{font-size:clamp(17px,1.39vw,22px);line-height:1.25;color:var(--plum70)}
/* Both phones are one complete image now (phones-duo, Figma 160:512), so the
   whole pair moves as one. To reposition or resize it, change only the custom
   properties at the top of each block below — nothing else here needs touching.
     --duo-w    width of the pair, against the wrap
     --duo-x    distance from the wrap's left edge
     --duo-y    distance down from the wrap's top edge
     --duo-rot  rotates the whole pair
   The desktop values are the design's own: the pair is 737.26 x 844 inside the
   1440 frame at (742, 157), and it bleeds ~39px past the wrap's right edge by
   design. Below 900px the pair is shown whole rather than cropped — the two
   phones overlap, so any crop to one of them leaves a sliver of the other.
   Instead it bleeds out through the wrap's padding to the section edges, which
   buys back the size the screens need; --duo-m-w is that width and --duo-m-x
   nudges it sideways. */
.phones{
  --duo-m-w:min(calc(100% + var(--pad) * 2),460px);
  --duo-m-x:0px;
  position:relative;width:var(--duo-m-w);
  margin:40px 0 0 calc((100% - var(--duo-m-w)) / 2);
  transform:translateX(var(--duo-m-x))}
.phones img{display:block;width:100%;max-width:none;height:auto}
@media (min-width:900px){
  .group{padding:128px 0}
  .group__head{max-width:min(63.61vw,997px)}
  .group__copy{max-width:min(38.89vw,610px)}
  .group .wrap{min-height:889px}
  .group__copy{position:absolute;left:var(--pad);bottom:0;margin-top:0}
  .phones{
    --duo-w:51.199%;
    --duo-x:51.528%;
    --duo-y:29px;
    --duo-rot:0deg;
    position:absolute;left:var(--duo-x);top:var(--duo-y);
    margin:0;width:var(--duo-w);height:auto;
    aspect-ratio:auto;overflow:visible;
    transform:rotate(var(--duo-rot));transform-origin:50% 50%}
  .phones img{position:static;width:100%;display:block}
}

/* ==========================================================================
   06 — Routes  (47:427)  1440 x 969
   ========================================================================== */
.routes{position:relative;overflow:hidden;background:var(--surface);padding:72px 0 80px;text-align:center}
/* the export is flat RGB with the section's own ground colour already baked
   in, so it is painted at full strength — an extra opacity would wash the
   contours out twice over */
.routes__paper{position:absolute;inset:0;
  background:center/cover no-repeat;pointer-events:none;
  background-image:url("../assets/img/routes-topo.png");
  background-image:image-set(url("../assets/img/routes-topo.webp") type("image/webp"),
                             url("../assets/img/routes-topo.png") type("image/png"))}
.routes__path{position:absolute;left:calc(50% - .9375%);top:50%;transform:translate(-50%,-50%);
  width:94.375%;max-width:none;height:auto;pointer-events:none}
.routes .wrap{position:relative;z-index:2}
.routes__cluster{position:relative;width:450px;height:112px;
  margin-left:calc(50% - 225px);transform:translateX(-5px);transform-origin:50% 0}
.routes__cluster .mc,.routes__cluster .rtag{position:absolute}
.mc-a{left:144.5px;top:0;width:180px}
.mc-b{left:0;top:32px;width:112px}
.mc-c{left:357px;top:32px;width:93px}
.rtag{left:167px;top:81px}
.routes__body{display:flex;flex-direction:column;align-items:center;gap:32px;max-width:500px;margin:48px auto 0}
.routes__body h2{font-size:clamp(28px,2.78vw,44px);color:var(--plum)}
.routes__body p{font-size:18px;line-height:1.28;color:var(--plum70)}
@media (min-width:900px){
  .routes{padding:178px 0 165px}
  .routes__body{margin-top:77px}
}
@media (max-width:899px){
  /* the route loop is a 1359x803 landscape figure; at phone width it reads as
     texture rather than a map, so drop it back behind the copy */
  .routes__path{opacity:.5}
}
@media (max-width:560px){
  .routes__cluster{transform:translateX(-5px) scale(.66);height:80px}
}

/* the orange category tag that sits under the metric cluster — routes only.
   The white metric card itself (.mc) is shared and lives in base.css. */
.rtag{position:relative;display:inline-flex;gap:12px;padding:11px 18px;border-radius:var(--r);
  background:var(--orange);color:var(--white);box-shadow:var(--lift-sm);overflow:hidden;white-space:nowrap}
.rtag::before{content:"";position:absolute;left:0;top:0;width:39px;height:100%;background:rgba(0,0,0,.2)}
.rtag span{position:relative;font-family:var(--mono);font-weight:300;font-size:12px;line-height:9px;
  letter-spacing:.05em;text-transform:uppercase}
.rtag .dim{opacity:.66}

/* ==========================================================================
   07 — Pricing  (42:129)  1440 x 775
   ========================================================================== */
.pricing{background:var(--plum);color:var(--white);padding:72px 0}
.pricing__head{display:flex;flex-direction:column;gap:24px}
.pricing__head h2{font-size:clamp(52px,8.889vw,139px);color:var(--white)}
.pricing__head p{font-size:18px;color:var(--white70)}
.plist{margin-top:40px;border-top:1px solid var(--hair-light)}
.prow{display:grid;grid-template-columns:1fr;gap:16px;padding:28px 0;border-bottom:1px solid var(--hair-light)}
.prow .name{font-size:clamp(34px,3.333vw,52px);color:var(--white)}
.prow .desc{font-size:18px;color:var(--white70)}
.prow .price{font-size:18px;color:var(--white70)}
.pfoot{margin-top:40px;font-size:16px;color:var(--white70)}
@media (min-width:900px){
  .pricing{padding:128px 0}
  .pricing__head{gap:36px}
  .plist{margin-top:56px}
  .prow{grid-template-columns:minmax(0,340fr) minmax(0,520fr) auto auto;align-items:center;
    column-gap:clamp(24px,4.86vw,76px);row-gap:0;padding:32px 0}
  .pfoot{margin-top:56px;text-align:right}
}
@media (max-width:899px){
  /* one row is one stacked column here, so the button takes the whole of it */
  .prow .btn{justify-self:stretch;width:100%}
}

/* ==========================================================================
   08 — Running  (107:495)  1440 x 1056
   ========================================================================== */
/* Flat ground, copy left, the photograph as a contained panel on the right.
   No full-bleed image and no veil — the section carries its own surface
   colour and nothing sits on top of the photograph. */
.running{background:var(--surface);padding:72px 0}
.running .wrap{display:flex;flex-direction:column;align-items:flex-start;gap:40px}
.running__col{display:flex;flex-direction:column;align-items:flex-start;gap:32px;max-width:560px}
.running__col h2{font-size:clamp(28px,2.78vw,44px);color:var(--plum)}
.running__col .prose{font-size:18px;line-height:1.28;color:var(--plum70)}
.running__col .prose p+p{margin-top:1.28em}
.running__photo{margin:0;width:min(100%,380px);aspect-ratio:450/800;
  border-radius:12px;overflow:hidden;box-shadow:var(--lift-photo)}
.running__photo img{display:block;width:100%;height:100%;max-width:none;object-fit:cover}
@media (max-width:899px){
  /* the copy and the photograph stay left; the capsule closes the section on
     the centre line */
  .running__cta{align-self:center}
}
@media (min-width:900px){
  .running{padding:128px 0}
  /* The design's own frame: a 500-wide text column at x = 130 and a 450 x 800
     photo panel at x = 835, inside a 1440 page whose wrap pads 40 either side.
     The four columns are fr units in that ratio, so the pair keeps its spacing
     at any width. The photo spans both rows and the capsule sits at the end of
     the second, which keeps their bottom edges together as the photo scales. */
  .running .wrap{display:grid;gap:0;
    padding-left:calc(var(--pad) + 90px);
    grid-template-columns:minmax(0,500fr) minmax(0,205fr) minmax(0,450fr) minmax(0,115fr);
    grid-template-rows:1fr auto}
  .running__col{grid-column:1;grid-row:1;max-width:none}
  .running__photo{grid-column:3;grid-row:1 / span 2;width:auto;max-width:none}
  .running__cta{grid-column:1;grid-row:2;align-self:end}
}
