@charset "utf-8";
/* =====================================================================
   Concept-Tree Academy - ctree.in
   Location: public_html/staging/assets/site.css

   The approved design's own stylesheet, recovered from the signed-off
   mockup on 2026-08-24 and carried over unchanged apart from the notes
   below. Do not rewrite it by hand - edit deliberately and keep the
   class names, because includes/header.php and includes/footer.php
   render against them.

   Changes from the mockup:
     1. The .note review banner rules are removed. That yellow box was a
        mockup annotation and never ships.
     2. .langtoggle a is styled alongside .langtoggle button. The PHP
        toggle is a real link so it works without JavaScript and Google
        can follow it.
     3. A small reset the artifact frame used to supply is restored at
        the end - body padding and color-scheme.

   NOTE ON REDUCED MOTION: the rule
       :not(.mrow) { animation: none !important }
   is deliberate. It stops every decorative animation while leaving the
   results marquee (.mrow) running, because the marquee is content and
   Gaurav reviews with animation effects switched off at the OS level.
   Do not "tidy" that selector into a blanket animation:none.
   ===================================================================== */

:root { --white: #ffffff; --surface: #f7f6f2; --surface-2: #ede9df; --ink: #0d1f3c; --navy: #0b182e; --navy-2: #16305c; --muted: #5d6b83; --muted-2: #6e7d96; --line: #e5e2d9; --gold: #e0a33b; --gold-dk: #8a5c00; --gold-pale: #fdf4e3; --wa: #25d366; --maxw: 1140px; --r: 14px; }

* { box-sizing: border-box; }

body { margin: 0px; background: var(--white); color: var(--ink); font-family: Mukta, system-ui, -apple-system, "Segoe UI", sans-serif; font-size: 16.5px; line-height: 1.6; -webkit-font-smoothing: antialiased; }

h1, h2, h3, .display { font-family: "Bricolage Grotesque", Mukta, sans-serif; font-weight: 700; letter-spacing: -0.015em; text-wrap: balance; margin: 0px; }

p { margin: 0px; }

a { color: inherit; }

img { max-width: 100%; display: block; }

.wrap { max-width: var(--maxw); margin: 0px auto; padding: 0px 22px; }

.sec { padding: 72px 0px; }

.sec-tint { background: var(--surface); }

.eyebrow { font-size: 12px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold-dk); margin-bottom: 10px; }

[lang="mr"] .eyebrow, [lang="mr"] .colleges .lbl, [lang="mr"] .pcard .tag, [lang="mr"] .cline b, [lang="mr"] footer.site b.ft, [lang="mr"] .sheet-top span, [lang="mr"] .dream-word { letter-spacing: 0.04em; }

.sec-head { max-width: 660px; margin-bottom: 34px; }

.sec-head h2 { font-size: clamp(26px, 3.3vw, 38px); line-height: 1.15; color: var(--navy); }

.sec-head p { color: var(--muted); margin-top: 10px; font-size: 17px; }

.num { font-variant-numeric: tabular-nums; font-feature-settings: "tnum"; }

.btn { display: inline-flex; align-items: center; gap: 9px; justify-content: center; border: 0px; border-radius: 11px; padding: 14px 22px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-family: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-language-override: inherit; font-weight: 700; font-size: 16px; cursor: pointer; text-decoration: none; line-height: 1.2; transition: transform 0.14s, box-shadow 0.14s; }

.btn:focus-visible { outline: 3px solid var(--gold); outline-offset: 3px; }

.btn-call { background: var(--gold); color: rgb(37, 24, 10); box-shadow: rgba(224, 163, 59, 0.34) 0px 6px 18px; }

.btn-call:hover { transform: translateY(-2px); box-shadow: rgba(224, 163, 59, 0.42) 0px 10px 24px; }

.btn-ghost { background: transparent; color: var(--navy); border: 1.5px solid var(--line); }

.btn-ghost:hover { border-color: var(--gold-dk); color: var(--gold-dk); }

.btn-navy { background: var(--navy); color: rgb(255, 255, 255); }

.btn-navy:hover { transform: translateY(-2px); }

.btn svg { width: 19px; height: 19px; flex: 0 0 19px; }

.util { background: var(--navy); color: rgb(219, 227, 240); font-size: 13.5px; }

.util .wrap { display: flex; flex-wrap: wrap; gap: 8px 20px; align-items: center; padding-top: 9px; padding-bottom: 9px; }

.util a { text-decoration: none; }

.util .spacer { flex: 1 1 0%; }

.util span { display: inline-flex; align-items: center; gap: 7px; }

.util svg { width: 15px; height: 15px; opacity: 0.75; }

.langtoggle { display: inline-flex; background: rgba(255, 255, 255, 0.1); border-radius: 8px; padding: 2px; gap: 2px; }

.langtoggle a, .langtoggle button { border: 0px; background: transparent; color: rgb(205, 216, 234); font-style: inherit; font-variant: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-language-override: inherit; font-size: 12.5px; font-weight: 600; padding: 4px 11px; border-radius: 6px; cursor: pointer; }

.langtoggle a[aria-pressed="true"], .langtoggle button[aria-pressed="true"] { background: var(--gold); color: rgb(37, 24, 10); }

header.site { position: sticky; top: 0px; z-index: 40; background: rgba(255, 255, 255, 0.94); backdrop-filter: blur(9px); border-bottom: 1px solid var(--line); }

header.site .wrap { display: flex; align-items: center; gap: 18px; padding-top: 13px; padding-bottom: 13px; }

.brand { display: flex; align-items: center; gap: 11px; text-decoration: none; margin-right: auto; }

.brand-mark { width: 40px; height: 40px; flex: 0 0 40px; border-radius: 11px; background: linear-gradient(150deg, rgb(224, 163, 59), rgb(201, 135, 31)); display: grid; place-items: center; }

.brand-mark svg { width: 23px; height: 23px; }

.brand b { display: block; font-family: "Bricolage Grotesque", sans-serif; font-size: 17px; line-height: 1.15; }

.brand small { display: block; font-size: 11.5px; color: var(--muted); letter-spacing: 0.04em; }

nav.main { display: flex; gap: 24px; }

nav.main a { text-decoration: none; font-size: 15px; font-weight: 600; color: var(--muted); padding: 4px 0px; }

nav.main a:hover { color: var(--ink); }

@media (max-width: 900px) {
  nav.main { display: none; }
}

@media (max-width: 620px) {
  .util .wrap > span:not(:first-child) { display: none; }
  .util .wrap { justify-content: space-between; }
  .btn-call span { display: none; }
  header.site .wrap { gap: 10px; }
}

.hero { padding: 56px 0px 0px; background: linear-gradient(135deg, #0b182e 55%, #1a3a6b 100%); color: #fff; position: relative; overflow: hidden; }

/* decorative ambient circles — matches test-series hero */
.hero::before { content: ''; position: absolute; top: -70px; right: -70px; width: 350px; height: 350px; border-radius: 50%; background: rgba(255,200,0,.06); pointer-events: none; }
.hero::after  { content: ''; position: absolute; bottom: -80px; left: -50px; width: 280px; height: 280px; border-radius: 50%; background: rgba(255,200,0,.05); pointer-events: none; }

.hero-grid { display: grid; grid-template-columns: 1.02fr 0.98fr; gap: 48px; align-items: center; }

@media (max-width: 940px) {
  .hero-grid { grid-template-columns: 1fr; gap: 34px; }
  .hero .sheet, .sheet-portrait { width: 80%; max-width: 80%; min-width: 0; margin: 0 auto; }
  .hero-grid > * { min-width: 0; }
  .hero { overflow-x: hidden; }
}

/* badge on dark bg: solid gold pill */
.badge { display: inline-flex; align-items: center; gap: 9px; background: #c9a227; color: #0b182e; border: 1px solid #c9a227; border-radius: 999px; padding: 7px 15px; font-size: 13.5px; font-weight: 700; margin-bottom: 20px; }

.badge .dot { width: 7px; height: 7px; border-radius: 50%; background: #0b182e; box-shadow: rgba(11,24,46,.3) 0px 0px 0px 4px; }

.hero h1 { font-size: clamp(34px, 5.1vw, 58px); line-height: 1.06; font-weight: 800; color: #fff; }

.hero h1 .hl { color: #c9a227; }

/* Inline formatting for any ctCopy() field edited from Admin -> Settings.
   Generic (not scoped to .hero), because ctCopy() renders headline text,
   body paragraphs, buttons and notes alike - see ctRichCopy() in
   includes/copy.php for the **bold** / [[gold: ]] / [[big: ]] / [[small: ]]
   syntax that produces these classes. */
.ct-fmt-gold  { color: var(--gold-dk); }
.hero .ct-fmt-gold { color: #c9a227; }
.ct-fmt-big   { font-size: 1.3em; }
.ct-fmt-small { font-size: 0.8em; }

.hero-sub { color: rgba(255,255,255,0.78); font-size: 18px; margin-top: 18px; max-width: 33em; }

.hero-cta { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 28px; }

/* ghost button on dark hero needs white treatment */
.hero .btn-ghost { color: #fff; border-color: rgba(255,255,255,.3); background: rgba(255,255,255,.08); }
.hero .btn-ghost:hover { border-color: rgba(255,255,255,.55); background: rgba(255,255,255,.14); }

.hero-note { display: flex; align-items: center; gap: 8px; color: rgba(255,255,255,0.48); font-size: 13.5px; margin-top: 14px; }

/* sheet card on dark hero: keep white body but give it gold border to match test-series card style */
.hero .sheet { border-color: rgba(201,162,39,.4); box-shadow: 0 8px 32px rgba(0,0,0,.35); }

.sheet { background: var(--white); border: 1px solid var(--line); border-radius: 20px; box-shadow: rgba(13, 31, 60, 0.1) 0px 18px 44px; overflow: hidden; }

.sheet-top { background: var(--navy); color: rgb(255, 255, 255); padding: 15px 20px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }

.sheet-top b { font-family: "Bricolage Grotesque", sans-serif; font-size: 14.5px; letter-spacing: 0.02em; }

.sheet-top span { font-size: 12px; color: rgb(159, 176, 204); letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; }

.sheet-rows { padding: 6px 20px 4px; }

.srow { display: flex; align-items: baseline; gap: 14px; padding: 13px 0px; border-bottom: 1px dashed var(--line); }

.srow:last-child { border-bottom: 0px; }

.srow .pct { font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 31px; line-height: 1; color: var(--ink); min-width: 118px; }

.srow .pct sup { font-size: 14px; font-weight: 700; color: var(--muted-2); margin-left: 2px; }

.srow .who { font-size: 14.5px; color: var(--muted); flex: 1 1 0%; }

.srow .who b { color: var(--ink); font-weight: 600; display: block; font-size: 15px; }

.sheet-foot { background: var(--surface); padding: 13px 20px; font-size: 13.5px; color: var(--muted); display: flex; align-items: center; gap: 8px; border-top: 1px solid var(--line); }

.sheet-foot svg { width: 16px; height: 16px; color: var(--gold-dk); flex: 0 0 16px; }

/* ---------------------------------------------------------------------
   Hero card - SLIDES mode. Added 2026-08-26.

   The same .sheet shell as the percentile list, with the rows swapped
   for one student at a time. Only .sslide.on is visible; the rest sit
   stacked underneath at opacity 0, which is what makes the crossfade
   free. Under prefers-reduced-motion the global `* { transition: none }`
   rule turns this into an instant swap - the rotation still advances,
   because a topper's face is content, not decoration.

   --slide-ar controls the picture's shape in one place.
   --------------------------------------------------------------------- */
.sheet-slides { --slide-ar: 4 / 5; background: var(--white); }

/* width: 100% is LOAD-BEARING, not decoration. A block with an auto
   inline size, an aspect-ratio and a definite max-height derives its
   WIDTH from that height - the picture came out 368px wide inside a
   512px card, with white space beside it. Pinning the width makes the
   height the derived value, which is what max-height is meant to cap.

   The cap itself keeps the card near the list version's height: without
   it a 4/5 picture in a 512px column makes the card 780px tall and the
   hero's buttons drop below the fold. */
.sslides { position: relative; width: 100%; aspect-ratio: var(--slide-ar); max-height: var(--slide-max, 600px); background: var(--surface-2); overflow: hidden; }

.sslide { position: absolute; inset: 0px; opacity: 0; transition: opacity 400ms ease; }

.sslide.on { opacity: 1; }

.sslide img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* No photo on file yet. A dashed slot, never a stand-in face. */
.sslide .sslot { display: grid; place-items: center; width: 100%; height: 100%; padding: 26px; text-align: center;
  border: 1.5px dashed rgb(227, 199, 141); background: var(--gold-pale); color: rgb(177, 135, 74);
  font-size: 14px; line-height: 1.5; font-weight: 600; }

/* Score chip. Sits over the photo's top-right corner. */
.spct { position: absolute; top: 15px; right: 15px; background: var(--gold); color: var(--navy);
  font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 20px; line-height: 1;
  padding: 9px 13px; border-radius: 12px; box-shadow: rgba(13, 31, 60, 0.28) 0px 8px 20px; }

.spct sup { font-size: 11px; font-weight: 700; margin-left: 2px; vertical-align: super; }

/* Government College tag. Overlays the hero slide opposite the score
   chip (.spct sits top-right), so this sits top-left and never
   collides with it. Same treatment on .rcard photos - see below,
   where .rank/.examtag already own the top corners so this sits
   bottom-left instead. */
.sslide .govtag { position: absolute; top: 15px; left: 15px; z-index: 2; max-width: 60%;
  background: rgba(11, 24, 46, 0.86); color: rgb(255, 255, 255);
  font-size: 11px; font-weight: 700; letter-spacing: 0.02em; line-height: 1.3;
  padding: 5px 10px; border-radius: 10px; white-space: normal; }

/* Caption scrim. The gradient is what keeps the text readable over an
   unknown photo - do not swap it for a flat bar. */
.scap { position: absolute; left: 0px; right: 0px; bottom: 0px; padding: 52px 20px 18px; color: rgb(255, 255, 255);
  background: linear-gradient(180deg, rgba(11, 24, 46, 0) 0%, rgba(11, 24, 46, 0.86) 58%, rgba(11, 24, 46, 0.96) 100%); }

.scap b { display: block; font-family: "Bricolage Grotesque", sans-serif; font-weight: 700; font-size: 20px; line-height: 1.25; }

.scap .scol { display: block; font-size: 14px; color: rgb(197, 209, 228); margin-top: 4px; }

/* Dots. Real buttons, so they are keyboard reachable. */
.sdots { display: flex; justify-content: center; gap: 8px; padding: 14px 0px 13px; background: var(--white); }

.sdots button { width: 9px; height: 9px; padding: 0px; border: 0px; border-radius: 50%; cursor: pointer;
  background: var(--line); transition: background 200ms ease, transform 200ms ease; }

.sdots button:hover { background: var(--muted-2); }

.sdots button.on { background: var(--gold-dk); transform: scale(1.35); }

.sdots button:focus-visible { outline: 2px solid var(--gold-dk); outline-offset: 3px; }

@media (max-width: 900px) {
  /* Stacked layout gives the card the full column - a squarer picture
     keeps it from pushing the CTAs off the first screen. */
  .sheet-slides { --slide-ar: 1 / 1; --slide-max: 420px; }
}

.colleges { margin-top: 52px; border-top: 1px solid var(--line); padding: 26px 0px 34px; }

.colleges .lbl { font-size: 12px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted-2); margin-bottom: 16px; }

.college-row { display: flex; flex-wrap: wrap; gap: 10px; }

.chipc { border: 1px solid var(--line); background: var(--white); border-radius: 10px; padding: 9px 15px; font-weight: 700; font-size: 14.5px; color: var(--navy-2); }

.dreams { margin-top: 46px; border-top: 1px solid var(--line); padding: 34px 0px 8px; }

.dream-grid { display: grid; grid-template-columns: 1fr 1.05fr; gap: 38px; align-items: center; }

@media (max-width: 900px) {
  .dream-grid { grid-template-columns: 1fr; gap: 22px; }
}

.dream-word { display: block; font-family: "Bricolage Grotesque", sans-serif; font-weight: 700; font-size: 15px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--gold-dk); margin-bottom: 6px; }

.dream-name { font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: clamp(38px, 6vw, 68px); line-height: 1; color: var(--ink); min-height: 1.02em; }

.dream-name .city { display: block; font-size: 0.42em; font-weight: 700; color: var(--muted); margin-top: 8px; letter-spacing: 0px; }

.dream-proof { display: inline-flex; align-items: center; gap: 9px; margin-top: 20px; background: var(--gold-pale); border: 1px solid rgb(240, 220, 180); border-radius: 999px; padding: 8px 16px; font-size: 14.5px; font-weight: 700; color: var(--gold-dk); }

.dream-proof svg { width: 16px; height: 16px; flex: 0 0 16px; }

.dream-photo { position: relative; aspect-ratio: 16 / 10; border-radius: 18px; overflow: hidden; background: var(--surface-2); border: 1px solid var(--line); }

.dream-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }

.dslide { position: absolute; inset: 0px; display: grid; place-items: center; text-align: center; padding: 20px; color: var(--muted-2); font-size: 13px; line-height: 1.5; opacity: 0; transform: scale(1.04); transition: opacity 0.9s, transform 5s linear; }

.dslide.on { opacity: 1; transform: scale(1); }

.dslide b { display: block; font-size: 15px; color: var(--muted); margin-bottom: 4px; }

.dream-list { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 30px; }

.dream-list span { border: 1px solid var(--line); background: var(--white); border-radius: 9px; padding: 7px 13px; font-weight: 700; font-size: 13.5px; color: var(--muted-2); transition: 0.45s; }

.dream-list span.on { background: var(--navy); border-color: var(--navy); color: rgb(255, 255, 255); }

.wedge { background: var(--navy); color: rgb(255, 255, 255); padding: 64px 0px; }

.wedge h2 { font-size: clamp(25px, 3.2vw, 36px); color: rgb(255, 255, 255); line-height: 1.15; max-width: 16em; }

.wedge .lead { color: rgb(169, 184, 209); margin-top: 14px; max-width: 44em; font-size: 17px; }

.spec-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 34px; }

@media (max-width: 820px) {
  .spec-grid { grid-template-columns: 1fr; }
}

.spec { background: rgba(255, 255, 255, 0.055); border: 1px solid rgba(255, 255, 255, 0.11); border-radius: var(--r); padding: 22px; display: flex; gap: 15px; align-items: flex-start; }

.spec .ph { width: 54px; height: 54px; flex: 0 0 54px; border-radius: 12px; background: linear-gradient(150deg, rgb(29, 58, 107), rgb(22, 48, 92)); display: grid; place-items: center; border: 1px dashed rgba(255, 255, 255, 0.3); font-size: 10px; color: rgb(143, 162, 193); text-align: center; line-height: 1.2; }

.spec { text-decoration: none; transition: 0.16s; }

a.spec:hover { background: rgba(255, 255, 255, 0.1); border-color: rgba(224, 163, 59, 0.5); transform: translateY(-2px); }

a.spec:focus-visible { outline: 3px solid var(--gold); outline-offset: 3px; }

.seeprof { display: inline-block; margin-top: 10px; color: var(--gold); font-weight: 700; font-size: 13.5px; }

.spec h3 { color: rgb(255, 255, 255); font-size: 17.5px; }

.spec .subj { color: var(--gold); font-weight: 700; font-size: 14px; margin-top: 2px; }

.spec p { color: rgb(159, 176, 204); font-size: 14.5px; margin-top: 7px; }

.res-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(232px, 1fr)); gap: 16px; }

.rcard { border: 1px solid var(--line); border-radius: var(--r); overflow: hidden; background: var(--white); transition: box-shadow 0.16s, transform 0.16s; }

.rcard:hover { box-shadow: rgba(13, 31, 60, 0.1) 0px 12px 30px; transform: translateY(-2px); }

.rcard .photo { aspect-ratio: 1 / 1; background: var(--surface-2); display: grid; place-items: center; border-bottom: 1px solid var(--line); position: relative; }

.rcard .photo .ph-note { font-size: 11.5px; color: var(--muted-2); text-align: center; padding: 0px 14px; line-height: 1.4; }

/* A real photo had NO sizing rule - .photo is a grid with place-items:center,
   so an uploaded image sat there at its intrinsic size and dragged the whole
   card out to 1200px wide.

   POSITION: ABSOLUTE IS NOT OPTIONAL. As a normal grid item, `height: 100%`
   resolves against an auto-sized row, so it fell back to the image's own
   ratio - a 800x1000 portrait made the "square" slot 184x230 while a card
   with no photo stayed 184x184, and the rows came out ragged. Taking the
   image out of flow leaves the grid empty, so aspect-ratio: 1/1 holds.
   .photo already carries position: relative for the rank badge. */
.rcard .photo img { position: absolute; inset: 0px; width: 100%; height: 100%; object-fit: cover; display: block; }

/* Tightened 2026-08-26: the card is ~186px wide at 1280 now, not 344. */
.rcard .body { padding: 12px 13px 14px; }

.rcard .score { font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: clamp(19px, 1.7vw, 25px); line-height: 1; color: var(--ink); }

.rcard .score sup { font-size: 11px; color: var(--muted-2); font-weight: 700; }

/* One line only - a wrapped name makes the three rows different heights. */
.rcard .nm { font-weight: 700; font-size: 14px; margin-top: 7px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.rcard .meta { color: var(--muted); font-size: 12px; margin-top: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.rcard .col { display: inline-block; max-width: 100%; margin-top: 9px; background: rgba(138,92,0,.1); color: var(--gold-dk); border-radius: 7px; padding: 3px 9px; font-size: 11.5px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; }

/* z-index is LOAD-BEARING, and only with a real photo in place.
   `.rcard .photo img` is also position:absolute with no z-index, and it
   comes AFTER this span in the DOM, so without a stacking order the
   image paints straight over the badge. With a dashed placeholder slot
   instead of an <img> the badge looked perfect - which is exactly why
   this survived until real topper photos were uploaded. */
.rank { position: absolute; z-index: 2; top: 8px; left: 8px; background: var(--gold); color: rgb(37, 24, 10); border-radius: 7px; padding: 2px 8px; font-size: 11px; font-weight: 800; letter-spacing: 0.02em; }

.res-more { display: flex; justify-content: center; margin-top: 28px; }

.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }

@media (max-width: 900px) {
  .cards { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 620px) {
  .cards { grid-template-columns: 1fr; }
}

.card { border: none; border-radius: var(--r); padding: 22px; background: var(--surface); }

.card .ic { width: 42px; height: 42px; border-radius: 11px; background: rgba(138,92,0,.1); display: grid; place-items: center; margin-bottom: 14px; }

.card .ic svg { width: 21px; height: 21px; color: var(--gold-dk); }

.card h3 { font-size: 17.5px; color: var(--navy); }

.card p { color: var(--muted); font-size: 15px; margin-top: 7px; }

.prog { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }

@media (max-width: 960px) {
  .prog { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 560px) {
  .prog { grid-template-columns: 1fr; }
}

.pcard { border: 1px solid var(--line); border-left: 3px solid var(--gold-dk); border-radius: var(--r); padding: 20px; background: var(--white); display: flex; flex-direction: column; gap: 9px; }

.pcard .tag { font-size: 11.5px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold-dk); }

.pcard h3 { font-size: 18px; color: var(--navy); }

.pcard ul { margin: 6px 0px 0px; padding-left: 0px; list-style: none; display: flex; flex-direction: column; gap: 7px; }

.pcard li { font-size: 14.5px; color: var(--muted); display: flex; gap: 8px; align-items: flex-start; }

.pcard li svg { width: 15px; height: 15px; color: var(--gold-dk); flex: 0 0 15px; margin-top: 4px; }

.pcard .fee { margin-top: auto; padding-top: 14px; font-size: 13.5px; color: var(--muted-2); }

.app-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; align-items: center; }

@media (max-width: 900px) {
  .app-grid { grid-template-columns: 1fr; gap: 28px; }
}

.app-list { display: flex; flex-direction: column; gap: 14px; margin-top: 22px; }

.app-list li { list-style: none; display: flex; gap: 12px; align-items: flex-start; font-size: 16px; }

.app-list svg { width: 20px; height: 20px; color: var(--gold-dk); flex: 0 0 20px; margin-top: 4px; }

.phone-mock { max-width: 290px; margin: 0px auto; border: 9px solid var(--navy); border-radius: 30px; background: var(--white); box-shadow: rgba(13, 31, 60, 0.16) 0px 20px 44px; overflow: hidden; }

.pm-top { background: var(--navy); color: rgb(255, 255, 255); padding: 9px 15px 13px; font-size: 12.5px; text-align: center; }

.pm-body { padding: 15px; }

.pm-row { display: flex; justify-content: space-between; align-items: center; padding: 11px 0px; border-bottom: 1px solid var(--line); font-size: 14px; }

.pm-row:last-child { border-bottom: 0px; }

.pm-row b { font-weight: 700; }

.pill-ok { background: rgb(231, 245, 236); color: rgb(18, 105, 74); border-radius: 999px; padding: 3px 10px; font-size: 12px; font-weight: 700; }

.pill-warn { background: var(--gold-pale); color: var(--gold-dk); border-radius: 999px; padding: 3px 10px; font-size: 12px; font-weight: 700; }

.flow { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0px; margin-top: 8px; position: relative; --art: 200px; }

@media (max-width: 960px) {
  .flow { grid-template-columns: 1fr 1fr; --art: 200px; }
}

@media (max-width: 560px) {
  .flow { grid-template-columns: 1fr; --art: 190px; }
}

.stepc { position: relative; padding: 0px 18px; text-align: center; }

@media (max-width: 560px) {
  .stepc { padding: 0px 8px; }
}

/* Square illustration tile. Revised 2026-08-25: the dashed ring was a
   placeholder for empty photo slots; with real square artwork in place it
   fought the picture, so the tile is now the artwork itself. --art drives
   the box AND the connector's vertical centring - change it in one place. */
.stepart { width: var(--art); height: var(--art); margin: 0px auto 18px; position: relative; }

.stepart img { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: 18px; background: var(--gold-pale); }

/* Empty state keeps a dashed box so it still reads as "add a photo". */
.stepart > span:not(.stepnum) { display: grid; place-items: center; width: 100%; height: 100%; padding: 14px; border: 1.5px dashed rgb(227, 199, 141); border-radius: 18px; background: var(--gold-pale); color: rgb(177, 135, 74); font-size: 11.5px; line-height: 1.4; text-align: center; }

.stepnum { position: absolute; right: 8px; bottom: 8px; width: 38px; height: 38px; border-radius: 50%; background: var(--navy); color: rgb(255, 255, 255); display: grid; place-items: center; font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 17px; border: 3px solid var(--white); }

.stepc h3 { font-size: 18px; }

.stepc p { color: var(--muted); font-size: 15px; margin-top: 7px; max-width: 22em; margin-left: auto; margin-right: auto; }

.arrow { position: absolute; top: calc(var(--art) / 2 - 10px); right: -26px; width: 52px; height: 20px; color: var(--gold); pointer-events: none; }

.arrow svg { width: 100%; height: 100%; }

.stepc:last-child .arrow { display: none; }

@media (max-width: 960px) {
  .stepc:nth-child(2) .arrow { display: none; }
  .arrow { right: -18px; }
}

@media (max-width: 560px) {
  .stepc { padding-bottom: 34px; }
  .arrow { top: auto; bottom: 2px; right: 50%; transform: translateX(50%) rotate(90deg); width: 40px; }
  .stepc:nth-child(2) .arrow { display: block; }
  .stepc:last-child { padding-bottom: 0px; }
}

.google-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; border: 1px solid var(--line); border-radius: var(--r); padding: 16px 20px; background: var(--white); margin-bottom: 24px; }

.stars { color: var(--gold); letter-spacing: 2px; font-size: 18px; }

.tgrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }

@media (max-width: 900px) {
  .tgrid { grid-template-columns: 1fr; }
}

.tcard { border: 1px solid var(--line); border-top: 2.5px solid var(--gold-dk); border-radius: var(--r); padding: 20px; background: var(--white); }

.tcard p { font-size: 15.5px; color: var(--ink); }

.tcard .by { display: flex; align-items: center; gap: 11px; margin-top: 15px; }

.tcard .av { width: 38px; height: 38px; border-radius: 50%; background: var(--gold-pale); color: var(--gold-dk); display: grid; place-items: center; font-weight: 800; font-size: 14px; overflow: hidden; }
.tcard img.av-img { object-fit: cover; }

.tcard .by b { display: block; font-size: 14.5px; }

.tcard .by span { font-size: 13px; color: var(--muted); }

.gal { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }

@media (max-width: 820px) {
  .gal { grid-template-columns: 1fr 1fr; }
}

.gslot { aspect-ratio: 4 / 3; border: 1.5px dashed rgb(195, 206, 222); border-radius: 12px; background: var(--surface); display: grid; place-items: center; text-align: center; padding: 14px; color: var(--muted-2); font-size: 12.5px; line-height: 1.45; }

.gal-marquee { --mq-gap: 14px; overflow: hidden; }

.gal-mrow { display: flex; gap: var(--mq-gap); will-change: transform; }

.gal-mrow > .gslot { flex: 0 0 auto; width: 260px; height: 195px; border: none; border-radius: 12px; overflow: hidden; padding: 0; background: var(--surface-2); cursor: pointer; }

.gal-mrow > .gslot img { width: 100%; height: 100%; object-fit: cover; display: block; pointer-events: none; }

.agrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }

@media (max-width: 900px) {
  .agrid { grid-template-columns: 1fr; }
}

.acard { background: var(--white); border: 1px solid var(--line); border-radius: var(--r); overflow: hidden; text-decoration: none; display: flex; flex-direction: column; transition: 0.16s; }

.acard:hover { transform: translateY(-3px); box-shadow: rgba(13, 31, 60, 0.1) 0px 14px 32px; border-color: var(--gold-dk); }

.acard:focus-visible { outline: 3px solid var(--gold); outline-offset: 3px; }

.acard .thumb { aspect-ratio: 16 / 9; background: var(--surface-2); border-bottom: 1px solid var(--line); display: grid; place-items: center; color: var(--muted-2); font-size: 12px; text-align: center; padding: 14px; line-height: 1.45; }

.acard .ab { padding: 16px 17px 18px; display: flex; flex-direction: column; gap: 7px; flex: 1 1 0%; }

.acard .atag { font-size: 11.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--gold-dk); }

.acard h3 { font-size: 17px; line-height: 1.32; }

.acard .aex { color: var(--muted); font-size: 14.5px; }

.acard .awhen { margin-top: auto; padding-top: 10px; font-size: 13px; color: var(--muted-2); }

[lang="mr"] .acard .atag { letter-spacing: 0.02em; }

.faq { max-width: 830px; }

.faq details { border: 1px solid var(--line); border-radius: 12px; background: var(--white); margin-bottom: 10px; transition: border-color .2s; }

.faq details[open] { border-color: var(--gold-dk); }

.faq summary { cursor: pointer; padding: 17px 20px; font-weight: 700; font-size: 16.5px; list-style: none; display: flex; justify-content: space-between; gap: 16px; align-items: center; }

.faq summary::-webkit-details-marker { display: none; }

.faq summary::after { content: "+"; font-family: "Bricolage Grotesque", sans-serif; font-size: 22px; color: var(--gold-dk); line-height: 1; }

.faq details[open] summary::after { content: "−"; }

.faq .a { padding: 0px 20px 18px; color: var(--muted); font-size: 15.5px; }

.tools { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }

@media (max-width: 760px) {
  .tools { grid-template-columns: 1fr; }
}

.tool { border: 1px solid var(--line); border-radius: var(--r); padding: 22px; background: var(--white); display: flex; gap: 16px; align-items: flex-start; text-decoration: none; }

.tool:hover { border-color: var(--gold); }

.tool .ic { width: 44px; height: 44px; flex: 0 0 44px; border-radius: 11px; background: var(--navy); display: grid; place-items: center; }

.tool .ic svg { width: 21px; height: 21px; color: var(--gold); }

.tool h3 { font-size: 17px; }

.tool p { color: var(--muted); font-size: 14.5px; margin-top: 5px; }

.contact-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; }

@media (max-width: 860px) {
  .contact-grid { grid-template-columns: 1fr; }
}

.cbox { border: 1px solid var(--line); border-top: 3px solid var(--gold-dk); border-radius: var(--r); padding: 26px; background: var(--white); }

.cline { display: flex; gap: 13px; align-items: flex-start; padding: 13px 0px; border-bottom: 1px solid var(--line); }

.cline:last-of-type { border-bottom: 0px; }

.cline svg { width: 19px; height: 19px; color: var(--gold-dk); flex: 0 0 19px; margin-top: 4px; }

.cline b { display: block; font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted-2); }

.cline span { font-size: 16.5px; font-weight: 600; }

.map-slot { border: 1.5px dashed rgb(195, 206, 222); border-radius: var(--r); background: var(--surface); min-height: 270px; display: grid; place-items: center; text-align: center; padding: 24px; color: var(--muted-2); font-size: 13.5px; }

.finale { background: linear-gradient(150deg, rgb(13, 31, 60), rgb(11, 24, 48)); color: rgb(255, 255, 255); padding: 74px 0px; text-align: center; }

.finale h2 { color: rgb(255, 255, 255); font-size: clamp(27px, 3.6vw, 40px); }

.finale p { color: rgb(169, 184, 209); margin-top: 14px; font-size: 17.5px; }

.finale .hero-cta { justify-content: center; margin-top: 28px; }

footer.site { background: var(--navy); color: rgb(143, 160, 187); padding: 44px 0px 30px; font-size: 14.5px; border-top: 1px solid rgba(255, 255, 255, 0.09); }

.fgrid { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 30px; }

@media (max-width: 760px) {
  .fgrid { grid-template-columns: 1fr; }
}

footer.site b.ft { color: rgb(255, 255, 255); display: block; margin-bottom: 12px; font-size: 13px; letter-spacing: 0.11em; text-transform: uppercase; }

footer.site a { display: block; text-decoration: none; padding: 4px 0px; }

footer.site a:hover { color: rgb(255, 255, 255); }

.fbot { border-top: 1px solid rgba(255, 255, 255, 0.1); margin-top: 30px; padding-top: 20px; font-size: 13px; color: rgb(111, 128, 156); display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 8px; }
.fbot-visitors { background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.12); border-radius: 20px; padding: 3px 12px; font-size: 12px; color: rgb(111, 128, 156); letter-spacing: 0.3px; }

.marquee { position: relative; overflow: hidden; mask-image: linear-gradient(90deg, transparent 0px, rgb(0, 0, 0) 5%, rgb(0, 0, 0) 95%, transparent 100%); }

.mrow { display: flex; gap: 16px; width: max-content; padding: 4px 0px 8px; animation: 46s linear 0s infinite normal none running ct-marquee; will-change: transform; }

/* ---------------------------------------------------------------------
   THIS SELECTOR MUST MATCH .rcard.

   The mockup wrapped each topper in <article>; index.php renders
   <div class="rcard">, so `.mrow > article` matched nothing and the cards
   had no flex-basis at all. With placeholder text inside they merely looked
   narrow; the moment real photos went in they blew up to the image's own
   width - one and a half cards filled the screen.

   clamp() keeps at least four cards visible at every desktop width:
   1024 -> 230px (5.2 cards), 1280 -> 269px (4.5), 1920 -> 300px (6.1).
   --------------------------------------------------------------------- */
/* ---------------------------------------------------------------------
   How many faces are on screen at a time.

   --mq-n comes from the `marquee_cards` site_settings row, printed onto
   the container by index.php as an inline style. --mq-gap must stay in
   step with the 16px gap on .mrow AND with the keyframe's `- 8px`, which
   is half of it.

   --mq-vw is the row's usable width. The 100vw fallback is right before
   JS runs but ignores the scrollbar, so site.js overwrites it with the
   container's real clientWidth (and again on resize). max() is only a
   safety floor for a big number on a small window - it never bites at
   nine faces on a 1280px screen, which computes to 128px.

   THIS SELECTOR MUST MATCH .rcard. The mockup wrapped each topper in
   <article>; index.php renders <div class="rcard">, so `.mrow > article`
   alone matched nothing and the cards had no flex-basis at all.
   --------------------------------------------------------------------- */
.marquee { --mq-n: 6; --mq-gap: 16px; --mq-vw: 100vw; }

.mrow > .rcard,
.mrow > article {
  flex: 0 0 max(120px, calc((var(--mq-vw) - (var(--mq-n) - 1) * var(--mq-gap)) / var(--mq-n)));
}

@media (max-width: 620px) {
  /* --mq-n is deliberately ignored here - nine faces on a phone would be
     unreadable, so the small screen always shows about two. */
  .mrow > .rcard,
  .mrow > article { flex: 0 0 52vw; }
}

@keyframes ct-marquee { 
  0% { transform: translate3d(0px, 0px, 0px); }
  100% { transform: translate3d(calc(-50% - 8px), 0px, 0px); }
}

.marquee { overflow-x: hidden; }

.marquee::-webkit-scrollbar { display: none; }

@media print {
  }

@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; }
  :not(.mrow) { animation: auto ease 0s 1 normal none running none !important; }
}

/* ---------------------------------------------------------------------
   Restored from the artifact frame's own reset. The design was authored
   inside a frame that already supplied these; served directly they have
   to be stated.
   --------------------------------------------------------------------- */
:root { color-scheme: light; }
body { padding: 0; }

/* ---------------------------------------------------------------------
   toppers.php - the results wall
   Added 2026-08-27.

   The CARDS are not here. toppers.php renders the same .res-grid and
   .rcard components the homepage marquee uses, so the whole card - the
   square photo slot, the absolutely positioned <img>, the rank badge,
   the score, the college chip - is already styled above and the two
   pages can never drift apart. Only the page head, the filter bar and
   the empty state are new, plus one badge the marquee has no room for.

   Ported from mockups/ctree-toppers.html. The mockup's chips were
   <button aria-pressed>; the real ones are <a aria-current> links, so
   Google can follow a filtered view, so both selectors are styled.
   --------------------------------------------------------------------- */
.phead { background: radial-gradient(900px 340px at 88% -10%, var(--gold-pale) 0%, rgba(253, 244, 227, 0) 60%), var(--white); padding: 44px 0px 30px; border-bottom: 1px solid var(--line); }

.crumb { font-size: 13.5px; color: var(--muted-2); margin-bottom: 14px; }

.crumb a { text-decoration: none; }

.crumb a:hover { color: var(--ink); }

.phead h1 { font-size: clamp(30px, 4.4vw, 48px); line-height: 1.08; font-weight: 800; }

.phead .lead { color: var(--muted); font-size: 18px; margin-top: 14px; max-width: 44em; }

/* Flex, not the mockup's repeat(4, 1fr): a tile is omitted when its
   number is too small to be worth boasting about, so this bar can be
   one, two or three wide and the tiles have to share whatever is there.
   A LONE tile is capped instead of stretched - one stat card 1140px
   wide reads as a mistake. toppers.php adds .one when there is one. */
.statbar { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 30px; }

.sb { flex: 1 1 160px; }

.statbar.one .sb { flex: 0 1 340px; }

.sb { background: var(--white); border: 1px solid var(--line); border-radius: var(--r); padding: 16px 18px; min-width: 0px; }

.sb b { display: block; font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 27px; line-height: 1.1; }

.sb span { font-size: 13.5px; color: var(--muted); }

/* 66px is the sticky header's real height: 40px brand mark + 13px of
   padding either side. Change one and change the other. */
.filters { position: sticky; top: 66px; z-index: 30; background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(8px); border-bottom: 1px solid var(--line); padding: 14px 0px; }

.frow { display: flex; flex-wrap: wrap; gap: 9px; align-items: center; }

.frow + .frow { margin-top: 10px; }

.flabel { font-size: 12px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted-2); margin-right: 4px; min-width: 52px; }

.fchip { display: inline-block; text-decoration: none; border: 1.5px solid var(--line); background: var(--white); border-radius: 999px; padding: 7px 15px; font-size: 14.5px; font-weight: 600; color: var(--muted); cursor: pointer; transition: 0.13s; }

.fchip:hover { border-color: var(--navy-2); color: var(--ink); }

.fchip.on, .fchip[aria-pressed="true"] { background: var(--navy); border-color: var(--navy); color: rgb(255, 255, 255); }

.fchip:focus-visible { outline: 3px solid var(--gold); outline-offset: 2px; }

.count { margin-left: auto; font-size: 14px; color: var(--muted); }

/* Devanagari has no uppercase and no need for Latin tracking. The list
   at the top of this file does the same job for the other tracked
   classes; .flabel is separate only because it was added later. */
[lang="mr"] .flabel, [lang="mr"] .fchip { letter-spacing: 0.01em; }

/* The page head already carries the top padding, so the grid section
   starts tighter than a homepage band. */
.sec-top { padding: 34px 0px 70px; }

/* Every field on the admin Toppers form is optional, so a card may
   start with the name, the meta line or the college chip instead of
   the score. Each of those carries a top margin for the line above it
   that is no longer there. */
.rcard .body > :first-child { margin-top: 0px; }

.empty { padding: 50px 24px; text-align: center; color: var(--muted); border: 1.5px dashed var(--line); border-radius: var(--r); }

/* Which exam a card belongs to. The marquee card is ~186px wide and
   has no room for it; on the results wall the cards are wider and the
   grid is mixed, so the badge earns its place. It sits opposite .rank
   inside the same position: relative photo slot. */
.rcard .examtag { position: absolute; z-index: 2; top: 8px; right: 8px; max-width: 62%; background: rgba(11, 24, 46, 0.86); color: rgb(255, 255, 255); border-radius: 7px; padding: 2px 8px; font-size: 11px; font-weight: 700; letter-spacing: 0.02em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Government College tag on a .rcard (toppers grid + homepage
   marquee). .rank owns top-left, .examtag (toppers only) owns
   top-right, so this sits bottom-left - free on both cards. */
.rcard .govtag { position: absolute; z-index: 2; bottom: 8px; left: 8px; max-width: 70%;
  background: rgba(11, 24, 46, 0.86); color: rgb(255, 255, 255); border-radius: 7px;
  padding: 2px 8px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.02em;
  line-height: 1.3; white-space: normal; }

@media (max-width: 620px) {
  .filters { position: static; }
  .flabel { min-width: 0px; }
  .count { margin-left: 0px; width: 100%; }

  /* .res-grid is auto-fill minmax(232px), which collapses to ONE column
     on a phone. One square photo per screen turns thirty toppers into a
     thirty-screen scroll, so the results wall - and only the results
     wall, hence the .sec-top scope - keeps two columns. */
  .sec-top .res-grid { grid-template-columns: 1fr 1fr; gap: 12px; }
}


/* =====================================================================
   BLOG - blog.php and post.php                          added 2026-08-27

   Ported from the approved mockup, mockups/ctree-blog.html, with three
   deliberate departures.

   1. THE MOCKUP'S ARTICLE CARD IS CALLED .pcard AND THAT NAME IS TAKEN.
      In this stylesheet .pcard is the COURSES card - it has .fee and a
      bullet list, and it is what the Programs section renders. Wiring
      the mockup's names up would have restyled Programs. The real
      article card is .agrid / .acard / .ab / .atag / .aex / .awhen,
      further up this file, which index.php's blog teaser has used since
      the homepage shipped. blog.php and post.php render the SAME
      component, so the three places can never drift.
      This is the .tgrid/.tcard trap from toppers.php, second occurrence.

   2. The .blabel margin labels are NOT ported. They are mockup
      annotations naming each block type for review, exactly like the
      .note banner that was dropped from the homepage.

   3. The mockup's .fcta is this file's .hero-cta, and .rgrid is .agrid.

   The article column is --readw wide, not --maxw. Long-form prose at
   1140px is unreadable; 720px is about 70 characters at this font size.
   ===================================================================== */

:root { --readw: 720px; }

.read { max-width: var(--readw); margin: 0px auto; padding: 0px 22px; }

/* ---------------------------------------------------------------------
   blog.php - the pager

   Everything else on the article index is already in this file: .phead,
   .filters/.frow/.flabel/.fchip/.count and .empty came with toppers.php,
   and the cards are .agrid/.acard. This is the only new component.
   --------------------------------------------------------------------- */
.pager { display: flex; align-items: center; justify-content: center; gap: 14px; margin-top: 34px; flex-wrap: wrap; }

.pchip { display: inline-flex; align-items: center; text-decoration: none; border: 1.5px solid var(--line); background: var(--white); border-radius: 999px; padding: 9px 18px; font-size: 15px; font-weight: 700; color: var(--ink); transition: 0.13s; }

.pchip:hover { border-color: var(--navy-2); }

.pchip:focus-visible { outline: 3px solid var(--gold); outline-offset: 2px; }

/* A dead end is rendered as a <span>, never a disabled <a>: there is no
   URL to give it, and a link that goes nowhere is worse than a label. */
.pchip.off { color: var(--muted-2); border-color: var(--surface-2); background: var(--surface); }

.pnow { font-size: 14.5px; color: var(--muted); }

.sec-blog { padding: 34px 0px 70px; }

/* ---------------------------------------------------------------------
   post.php - the article head
   --------------------------------------------------------------------- */
.ahead { padding: 40px 0px 28px; background: radial-gradient(800px 300px at 78% -12%, #fdf4e3 0%, rgba(253, 244, 227, 0) 62%), var(--white); }

.ahead .crumb { margin-bottom: 20px; }

/* The topic badge is a real link back to the filtered index, which the
   mockup drew as a plain <span>. Same shape, one more way in. */
.cat { display: inline-block; background: var(--navy); color: rgb(255, 255, 255); border-radius: 999px; padding: 6px 14px; font-size: 12.5px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: 16px; text-decoration: none; }

.cat:hover { background: var(--navy-2); }

.cat:focus-visible { outline: 3px solid var(--gold); outline-offset: 2px; }

.atitle { font-size: clamp(29px, 4.4vw, 46px); line-height: 1.08; font-weight: 800; }

.adek { color: var(--muted); font-size: 19px; margin-top: 16px; }

.ameta { display: flex; flex-wrap: wrap; gap: 14px; align-items: center; margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--line); font-size: 14.5px; color: var(--muted); }

/* Scoped, because .tcard .av is the testimonial avatar and a bare .av
   rule here would be one specificity accident away from moving it. */
.ameta .av { width: 40px; height: 40px; flex: 0 0 40px; border-radius: 50%; background: var(--gold-pale); color: var(--gold-dk); display: grid; place-items: center; font-weight: 800; font-size: 14px; overflow: hidden; }

.ameta img.av { object-fit: cover; }

.ameta a, .ameta b { font-weight: 700; color: var(--ink); text-decoration: none; }

.ameta a:hover { color: var(--gold-dk); }

/* Scoped for the same reason - .badge .dot already exists. */
.ameta .dot { width: 4px; height: 4px; border-radius: 50%; background: var(--muted-2); flex: 0 0 4px; }

/* The cover image, which the mockup does not show - it opens straight
   into prose. A blog card carries a cover, so the article it opens
   should too, and it is the first thing a reader arriving from
   WhatsApp expects to see.

   IT IS THE WIDTH OF THE READING COLUMN, NOT THE PAGE. It shipped at
   the full 1140px --maxw on 2026-08-27 and Gaurav reported it
   immediately: "image became to broad for content". He was right - a
   1140px picture sitting on top of a 720px column reads as two
   different layouts stacked, and the eye has nothing to line the
   article up against. The break-out width still exists and is still
   useful, but it belongs to pictures the AUTHOR deliberately marks
   Wide, not to every cover automatically. */
.acover { padding: 8px 0px 0px; }

.acover .wrap { max-width: var(--readw); }

.acover img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: var(--r); border: 1px solid var(--line); }

/* ---------------------------------------------------------------------
   post.php - the blocks

   One .blk per site_post_blocks row. Every rule below is scoped to its
   own .blk-* modifier, so a new block type cannot inherit spacing it
   was never designed with.
   --------------------------------------------------------------------- */
.article { padding: 26px 0px 56px; }

.blk { margin-top: 26px; position: relative; }

.blk:first-child { margin-top: 0px; }

.blk-p p { font-size: 18px; color: rgb(38, 54, 79); line-height: 1.72; }

.blk-p p + p { margin-top: 18px; }

.blk-p a, .blk-list a, .blk-quote a, .blk-note a { color: var(--gold-dk); text-decoration: underline; text-underline-offset: 2px; }

.blk-h h2 { font-size: clamp(22px, 2.8vw, 29px); margin-top: 8px; }

.blk-h h3 { font-size: clamp(19px, 2.2vw, 23px); margin-top: 8px; }

.blk-h h4 { font-size: 18px; margin-top: 8px; }

.blk-list ul, .blk-list ol { margin: 0px; padding-left: 0px; list-style: none; display: flex; flex-direction: column; gap: 10px; }

/* An ordered list keeps its numbers - a tick in front of "step 3" is a
   different claim from "3." */
.blk-list ol { list-style: decimal; padding-left: 22px; }

.blk-list li { display: flex; gap: 11px; font-size: 17.5px; color: rgb(38, 54, 79); }

.blk-list ol li { display: list-item; }

.blk-list li svg { width: 17px; height: 17px; color: var(--gold-dk); flex: 0 0 17px; margin-top: 6px; }

.blk-img figure { margin: 0px; }

.blk-img img { width: 100%; border-radius: 14px; border: 1px solid var(--line); }

.imgslot { aspect-ratio: 16 / 9; border: 1.5px dashed rgb(195, 206, 222); border-radius: 14px; background: var(--surface); display: grid; place-items: center; text-align: center; padding: 20px; color: var(--muted-2); font-size: 13px; line-height: 1.5; }

.blk-img figcaption { margin-top: 10px; font-size: 14.5px; color: var(--muted); text-align: center; }

/* variant = 'wide' breaks a graph or a wide screenshot out of the
   reading column and back to the page width. margin-left:50% +
   translateX(-50%) is the one technique that does this from inside a
   centred parent without knowing the parent's width. The min() keeps it
   inside the viewport on a phone, where it resolves to no change at
   all. It is a transform, not an animation, so the reduced-motion rule
   at the top of this file does not touch it. */
.blk-img.wide figure { width: min(var(--maxw), calc(100vw - 44px)); margin-left: 50%; transform: translateX(-50%); }

.blk-quote blockquote { margin: 0px; border-left: 4px solid var(--gold); background: var(--gold-pale); border-radius: 0px 14px 14px 0px; padding: 22px 24px; }

.blk-quote p { font-size: 19px; color: var(--ink); }

.blk-quote p + p { margin-top: 12px; }

.blk-quote .who { margin-top: 10px; font-size: 14px; font-weight: 700; color: var(--gold-dk); }

.blk-table .tblwrap { overflow-x: auto; border: 1px solid var(--line); border-radius: 12px; }

.blk-table table { width: 100%; border-collapse: collapse; min-width: 460px; }

.blk-table th, .blk-table td { text-align: left; padding: 12px 14px; border-bottom: 1px solid var(--line); font-size: 15.5px; }

.blk-table th { background: var(--surface); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); }

.blk-table tr:last-child td { border-bottom: 0px; }

.blk-table td.n { font-weight: 700; }

.tcap { margin-top: 9px; font-size: 13.5px; color: var(--muted-2); }

.blk-note .callout { border: 1px solid rgb(240, 220, 180); background: rgb(255, 250, 240); border-radius: 14px; padding: 20px 22px; display: flex; gap: 14px; align-items: flex-start; }

.blk-note svg { width: 21px; height: 21px; color: var(--gold-dk); flex: 0 0 21px; margin-top: 3px; }

.blk-note b { display: block; margin-bottom: 5px; font-family: "Bricolage Grotesque", sans-serif; font-size: 16.5px; }

.blk-note p { color: rgb(107, 77, 16); font-size: 16px; }

.blk-note p + p { margin-top: 10px; }

/* The icon is the same shape in all three variants; the colour is what
   distinguishes them. includes/icons.php holds only shapes taken from
   the approved mockup and has neither an information nor a warning
   glyph, and ctIcon() falls back to a neutral dot for a name it does
   not know - so asking it for 'info' would silently print a dot. */
.blk-note .callout.info { border-color: rgb(205, 216, 234); background: var(--surface); }

.blk-note .callout.info svg { color: var(--navy-2); }

.blk-note .callout.info p { color: rgb(38, 54, 79); }

.blk-note .callout.warn { border-color: rgb(240, 197, 190); background: rgb(255, 246, 244); }

.blk-note .callout.warn svg { color: rgb(168, 58, 42); }

.blk-note .callout.warn p { color: rgb(122, 45, 33); }

/* ---------------------------------------------------------------------
   post.php - the author box and the related strip
   --------------------------------------------------------------------- */
.authorbox { margin-top: 44px; border: 1px solid var(--line); border-radius: var(--r); padding: 22px; display: flex; gap: 18px; align-items: flex-start; background: var(--surface); }

.authorbox .av { width: 64px; height: 64px; flex: 0 0 64px; border-radius: 14px; background: var(--surface-2); border: 1px dashed rgb(195, 206, 222); display: grid; place-items: center; font-size: 10.5px; color: var(--muted-2); text-align: center; line-height: 1.25; overflow: hidden; }

/* A real photo fills the tile, so the dashed empty-state border goes. */
.authorbox img.av { object-fit: cover; border-style: solid; border-color: var(--line); }

.authorbox h3 { font-size: 17.5px; }

.authorbox .sub { color: var(--gold-dk); font-weight: 700; font-size: 14px; margin-top: 2px; }

.authorbox p { color: var(--muted); font-size: 15px; margin-top: 8px; }

.authorbox a.more { display: inline-flex; align-items: center; gap: 8px; margin-top: 10px; font-weight: 700; color: var(--navy-2); text-decoration: none; font-size: 14.5px; }

.authorbox a.more:hover { color: var(--gold-dk); }

.authorbox a.more svg { width: 34px; height: 13px; }

/* The related strip is a normal tinted section; only its heading is a
   step smaller than a homepage band's. */
.rel .sec-head h2 { font-size: clamp(23px, 3vw, 32px); }

/* ---------------------------------------------------------------------
   Rich text written in the admin block builder

   Every class here is on ctPostRichClasses()'s allowlist in
   includes/posts.php, and NOTHING else survives the sanitiser - there
   is no style attribute, no font-family and no free colour anywhere in
   an article. That is deliberate: a font picker eventually produces a
   Marathi paragraph set in a face with no Devanagari, which falls back
   to whatever the reader's phone has, and a colour wheel eventually
   produces lime green on white. Adding a class here means adding it to
   that allowlist too, or it will be stripped on save.
   --------------------------------------------------------------------- */

/* Pasted from Word, <b>/<i> read the same as <strong>/<em>. */
.blk-p b, .blk-quote b, .blk-note b.ct-inline { font-weight: 700; }
.blk-p i, .blk-quote i { font-style: italic; }

.blk-p .ct-c-navy,  .blk-quote .ct-c-navy,  .blk-note .ct-c-navy  { color: var(--navy); }
.blk-p .ct-c-gold,  .blk-quote .ct-c-gold,  .blk-note .ct-c-gold  { color: var(--gold-dk); }
.blk-p .ct-c-muted, .blk-quote .ct-c-muted, .blk-note .ct-c-muted { color: var(--muted); }
.blk-p .ct-c-red,   .blk-quote .ct-c-red,   .blk-note .ct-c-red   { color: rgb(168, 52, 42); }

/* Text styles, in place of a font-size control. */
.blk-p .ct-lead, .blk-p p.ct-lead { font-size: 20px; line-height: 1.6; color: var(--ink); }
.blk-p .ct-small, .blk-p p.ct-small { font-size: 15px; color: var(--muted); }
.blk-p .ct-center, .blk-p p.ct-center { text-align: center; }

/* Headings and lists typed inside a paragraph block get the same
   treatment as their own blocks, so an article reads the same whether
   it was built out of blocks or written in one box. */
.blk-p h2 { font-size: clamp(22px, 2.8vw, 29px); margin: 26px 0px 10px; }
.blk-p h3 { font-size: clamp(19px, 2.2vw, 23px); margin: 22px 0px 8px; }
.blk-p h4 { font-size: 18px; margin: 18px 0px 8px; }
.blk-p ul, .blk-p ol { margin: 0px 0px 14px; padding-left: 24px; color: rgb(38, 54, 79); font-size: 17.5px; }
.blk-p li { margin-bottom: 6px; }
.blk-p blockquote { margin: 18px 0px; border-left: 4px solid var(--gold); background: var(--gold-pale); border-radius: 0px 14px 14px 0px; padding: 18px 20px; }

/* Images placed inside the text. Width is a share of the reading
   column; ct-w-wide is the same break-out the Image block's "wide"
   option uses. height:auto is load-bearing - without it a percentage
   width squashes the picture. */
.blk-p img, .blk-quote img { height: auto; border-radius: 12px; border: 1px solid var(--line); margin: 18px 0px; }
.blk-p img.ct-w-25  { width: 25%; }
.blk-p img.ct-w-50  { width: 50%; }
.blk-p img.ct-w-75  { width: 75%; }
.blk-p img.ct-w-100 { width: 100%; }
.blk-p img.ct-w-wide { width: min(var(--maxw), calc(100vw - 44px)); max-width: none; margin-left: 50%; transform: translateX(-50%); }
.blk-p img.ct-al-left   { margin-right: auto; }
.blk-p img.ct-al-center { margin-left: auto; margin-right: auto; }
.blk-p img.ct-al-right  { margin-left: auto; }

/* A percentage-width picture is unreadable on a phone. Below 620px
   every in-text image is full width, whatever it was set to - except
   the deliberate break-out, which is already viewport-wide. */
@media (max-width: 620px) {
  .blk-p img.ct-w-25, .blk-p img.ct-w-50, .blk-p img.ct-w-75 { width: 100%; }
}

/* ---------------------------------------------------------------------
   Marathi

   Devanagari has no uppercase and no need for Latin tracking. The
   grouped list near the top of this file does this for the older
   classes; these are separate only because they were added later.
   --------------------------------------------------------------------- */
[lang="mr"] .cat, [lang="mr"] .blk-table th { letter-spacing: 0.02em; }

/* .agrid drops to ONE column below 900px, which is right for the
   homepage teaser's three cards and wrong for nine. At 768px the
   article index came out 6,377px tall - the same "one card per screen"
   problem the results wall hit, and the same fix: two columns in the
   tablet band, scoped so the homepage teaser is not touched. Below
   620px a card is only ~346px wide and one column is correct again. */
@media (min-width: 621px) and (max-width: 900px) {
  .sec-blog .agrid, .rel .agrid { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 760px) {
  .ahead { padding-top: 28px; }

  .adek { font-size: 17.5px; }

  .blk-p p { font-size: 17px; }

  .authorbox { flex-direction: column; gap: 14px; }

  .pager { gap: 10px; }

  .pchip { padding: 8px 14px; font-size: 14.5px; }
}

/* =====================================================================
   The admission enquiry form  -  2026-08-27

   Rendered by ctEnqForm() in includes/enquiry.php, in two places: the
   `enquiry` section on the homepage and the whole of admission.php.
   ONE set of rules serves both - the page around it changes, the form
   does not.

   Class names are all prefixed `enq-`. Every short generic name this
   form would naturally want is already taken by something else:
   .frow .flabel .fchip are the toppers filter row, .field belongs to
   the admin panel, .lbl and .lead are in use here. That has now caught
   two mockup ports (.tgrid and .pcard), so this block does not gamble.
   --------------------------------------------------------------------- */

.enq-wrap { display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr); gap: 34px; align-items: start; }

.enq-main { min-width: 0px; }

/* ---- the form ---- */

.enq-form { background: var(--white); border: 1px solid var(--line); border-radius: var(--r); padding: 26px; box-shadow: rgba(11, 24, 46, 0.05) 0px 10px 30px; }

.enq-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px 20px; }

.enq-f { min-width: 0px; display: flex; flex-direction: column; gap: 7px; }

/* The message box and the exam chips run the full width of the card.
   `grid-column: 1 / -1` and not `span 2`, so the single-column phone
   layout below does not have to override it. */
.enq-wide, .enq-fs { grid-column: 1 / -1; }

.enq-f label, .enq-fs legend { font-size: 14.5px; font-weight: 700; color: var(--ink); padding: 0px; }

.enq-req { font-weight: 500; font-size: 12.5px; color: var(--muted-2); letter-spacing: 0.02em; }

.enq-in { width: 100%; font-family: inherit; font-size: 16.5px; line-height: 1.4; color: var(--ink); background: var(--white); border: 1.5px solid var(--line); border-radius: 11px; padding: 12px 14px; transition: border-color 0.14s, box-shadow 0.14s; }

/* 16px minimum. Anything smaller and iOS Safari zooms the whole page
   in when the box is focused and never zooms back out, which on a
   phone reads as the site breaking. */
.enq-in:focus { outline: 0px; border-color: var(--navy-2); box-shadow: rgba(22, 48, 92, 0.14) 0px 0px 0px 3.5px; }

.enq-in::placeholder { color: var(--muted-2); opacity: 1; }

.enq-ta { resize: vertical; min-height: 92px; }

.enq-sel { appearance: none; background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235d6b83' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; background-size: 18px 18px; padding-right: 40px; cursor: pointer; }

.enq-hint { font-size: 13px; color: var(--muted); line-height: 1.45; }

/* A field the server rejected. Colour is not the only signal - the
   message is also listed at the top of the form and the input carries
   aria-invalid, so this reads correctly to somebody who cannot see the
   red. */
.enq-bad { border-color: #c0392b; background: #fdf6f5; }

.enq-bad:focus { border-color: #c0392b; box-shadow: rgba(192, 57, 43, 0.16) 0px 0px 0px 3.5px; }

/* ---- exam chips ---- */

.enq-fs { border: 0px; margin: 0px; padding: 0px; }

.enq-chips { display: flex; flex-wrap: wrap; gap: 9px; }

.enq-chip { display: inline-flex; align-items: center; gap: 8px; font-size: 15px; font-weight: 600; cursor: pointer; }

.enq-chip input { width: 17px; height: 17px; margin: 0; accent-color: var(--navy-2); cursor: pointer; flex: 0 0 17px; }

/* :has() is what makes a ticked chip look ticked without any
   JavaScript. Safari 15.4+, Chrome 105+, Firefox 121+. A browser
   without it still shows the checkbox itself, so the control works
   everywhere and only the fill is missing. */
.enq-chip:focus-within { outline: 3px solid var(--gold); outline-offset: 2px; }

/* ---- the error summary ---- */

/* scroll-margin-top clears the sticky site header. admission.php
   scrolls this box into view after a failed submission, and without
   the margin the first line lands underneath the header - which is
   the line saying what to check. */
.enq-alert { border: 1.5px solid #e8b4ad; background: #fdf6f5; border-radius: 12px; padding: 14px 16px; margin-bottom: 20px; scroll-margin-top: 96px; }

.enq-alert:focus-visible, .enq-alert:focus { outline: 3px solid var(--gold); outline-offset: 2px; }

.enq-alert-top { font-weight: 700; color: #8e2b1f; font-size: 15px; }

.enq-alert ul { margin: 6px 0px 0px; padding-left: 20px; color: #8e2b1f; font-size: 15px; }

.enq-alert li { margin-top: 3px; }

/* ---- submit ---- */

.enq-act { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 22px; }

.enq-act .btn { padding: 15px 30px; }

.enq-priv { font-size: 12.8px; color: var(--muted); line-height: 1.45; flex: 1 1 220px; min-width: 0px; }

/* ---- the panel beside it ---- */

/* top: 84px, not 18px. header.site is sticky and 66px tall, so a
   panel that pins at 18px pins itself underneath it. The same 66px is
   already hardcoded on .filters - see the note there. */
.enq-side { background: var(--navy); color: rgb(255, 255, 255); border-radius: var(--r); padding: 26px; position: sticky; top: 84px; }

.enq-side-top { font-family: "Bricolage Grotesque", Mukta, sans-serif; font-weight: 700; font-size: 19px; letter-spacing: -0.01em; }

.enq-side-btns { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }

.enq-side .btn-ghost { color: rgb(255, 255, 255); border-color: rgba(255, 255, 255, 0.3); }

.enq-side-list { list-style: none; margin: 22px 0px 0px; padding: 0px; display: grid; gap: 12px; }

.enq-side-list li { display: flex; gap: 10px; align-items: flex-start; font-size: 15px; color: rgba(255, 255, 255, 0.86); line-height: 1.45; }

.enq-side-list svg { width: 18px; height: 18px; flex: 0 0 18px; margin-top: 3px; color: var(--gold); }

/* ---- the homepage section ---- */

/* The homepage section sits between the FAQ (white) and the contact
   block (tinted). Reusing .sec-tint would merge it into the contact
   block as one long grey slab, so it gets the same warm wash .phead
   uses - distinct from both neighbours, and warm because this is the
   section that asks for something. */
.sec-enq { background: radial-gradient(900px 400px at 12% -8%, var(--gold-pale) 0%, rgba(253, 244, 227, 0) 62%), var(--white); }

.sec-enq .sec-head { margin-bottom: 28px; }

/* =====================================================================
   thanks.php
   --------------------------------------------------------------------- */

.tnx { padding-top: 56px; }

.tnx-card { max-width: 640px; margin: 0px auto; text-align: center; background: var(--white); border: 1px solid var(--line); border-radius: var(--r); padding: 40px 32px; box-shadow: rgba(11, 24, 46, 0.05) 0px 10px 30px; }

.tnx-tick { display: inline-flex; align-items: center; justify-content: center; width: 62px; height: 62px; border-radius: 50%; background: var(--gold-pale); color: var(--gold-dk); margin-bottom: 18px; }

.tnx-tick svg { width: 30px; height: 30px; }

.tnx-card h1 { font-size: clamp(28px, 4vw, 40px); font-weight: 800; }

.tnx-card .lead { color: var(--muted); font-size: 18px; margin-top: 10px; }

.tnx-ref { margin-top: 20px; display: inline-flex; flex-wrap: wrap; align-items: baseline; justify-content: center; gap: 10px; background: var(--surface); border: 1px solid var(--line); border-radius: 999px; padding: 9px 20px; }

.tnx-ref span { font-size: 13.5px; color: var(--muted); }

.tnx-ref b { font-family: "Bricolage Grotesque", Mukta, sans-serif; font-size: 18px; letter-spacing: 0.04em; }

.tnx-h2 { font-size: 17px; margin-top: 32px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--gold-dk); font-weight: 700; }

.tnx-steps { text-align: left; max-width: 420px; margin: 14px auto 0px; padding-left: 22px; color: var(--muted); display: grid; gap: 8px; font-size: 16px; }

.tnx-steps li { padding-left: 4px; }

.tnx-wait { margin-top: 30px; font-weight: 600; }

.tnx-cta { justify-content: center; margin-top: 14px; }

.tnx-back { margin-top: 26px; font-size: 15px; }

.tnx-back a { color: var(--muted); }

/* =====================================================================
   Enquiry form - narrow screens
   --------------------------------------------------------------------- */

/* The side panel stops being a side panel before the form does, because
   a 300px-wide navy box next to a 300px form is worse than either one
   at full width. `position: sticky` has to go with it - a sticky block
   in a single-column flow pins itself over the content below. */
@media (max-width: 900px) {
  .enq-wrap { grid-template-columns: 1fr; gap: 22px; }

  .enq-side { position: static; }
}

@media (max-width: 620px) {
  .enq-form { padding: 20px 17px; border-radius: 12px; }

  .enq-grid { grid-template-columns: 1fr; gap: 16px; }

  .enq-act { margin-top: 18px; }

  .enq-act .btn { width: 100%; }

  .enq-side { padding: 22px 18px; }

  .enq-side-btns .btn { flex: 1 1 100%; }

  .tnx-card { padding: 30px 20px; }

  .tnx { padding-top: 34px; }
}

/* Devanagari has no uppercase and no need for Latin tracking. Any new
   tracked class must be listed here or Marathi renders spaced out. */
[lang="mr"] .enq-req, [lang="mr"] .tnx-h2, [lang="mr"] .tnx-ref b { letter-spacing: 0.02em; }

/* ------------------------------------------------------------------
 * teacher.php - one teacher's profile page (2026-08-31)
 *
 * Every class here is new and prefixed "t" specifically because this
 * page reuses .phead / .crumb / .sec / .sec-tint / .eyebrow / .btn* /
 * .hero-cta / .finale from earlier pages, and several short names the
 * mockup used (.pgrid, .srow, .rgrid, .fgrid, .chips, .tl) already
 * belong to OTHER components on this site - see the class-collision
 * trap in the skill. Ported from mockups/ctree-faculty.html with that
 * one substitution throughout.
 *
 * The hero photo is SQUARE (1:1), not the mockup's 4:5 portrait - see
 * admin/faculty.php: faculty photos are cropped square everywhere else
 * they appear (homepage Faculty cards, blog author box), and a 4:5
 * slot fed a square source would lose the sides under object-fit:cover.
 * ------------------------------------------------------------------ */

.tphero { display: grid; grid-template-columns: 260px 1fr; gap: 36px; align-items: start; margin-top: 22px; }
@media (max-width: 780px) {
  .tphero { grid-template-columns: 1fr; gap: 22px; }
}

.tphoto { aspect-ratio: 1 / 1; width: 100%; border-radius: 20px; overflow: hidden; background: var(--surface-2); border: 1px solid var(--line); box-shadow: rgba(13, 31, 60, 0.1) 0px 16px 40px; }
.tphoto img { width: 100%; height: 100%; object-fit: cover; }
.tphotoslot { width: 100%; height: 100%; display: grid; place-items: center; text-align: center; color: var(--muted-2); font-size: 13px; line-height: 1.5; padding: 20px; }

.tsubject { display: inline-block; background: var(--navy); color: #fff; border-radius: 999px; padding: 6px 15px; font-size: 13.5px; font-weight: 700; margin-bottom: 12px; }
.tname { font-size: clamp(28px, 4.2vw, 44px); line-height: 1.08; font-weight: 800; }
.tintro { color: var(--muted); font-size: 17px; margin-top: 14px; max-width: 42em; }

.tcta { display: flex; flex-wrap: wrap; gap: 11px; margin-top: 22px; }

.tfacts { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-top: 26px; max-width: 560px; }
@media (max-width: 560px) {
  .tfacts { grid-template-columns: 1fr 1fr; }
}
.tfact { border: 1px solid var(--line); border-radius: 12px; padding: 13px 15px; background: var(--white); }
.tfact b { display: block; font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 19px; line-height: 1.2; }
.tfact span { font-size: 12px; color: var(--muted); display: block; margin-top: 2px; }

.ttwocol { display: grid; grid-template-columns: 1.25fr 0.75fr; gap: 40px; align-items: start; }
@media (max-width: 900px) {
  .ttwocol { grid-template-columns: 1fr; gap: 26px; }
}
.tprose { color: var(--muted); font-size: 16.5px; max-width: 40em; }
.tprose + .tprose { margin-top: 14px; }

.tquote { border-left: 4px solid var(--gold); background: var(--gold-pale); border-radius: 0px 14px 14px 0px; padding: 20px 22px; }
.tquote p:first-child { font-size: 18px; color: var(--ink); }
.tquote .twho { margin-top: 10px; font-size: 13.5px; color: var(--gold-dk); font-weight: 700; }

.ttimeline { margin: 8px 0 0; padding: 0 0 0 22px; border-left: 2px solid var(--line); display: flex; flex-direction: column; gap: 20px; list-style: none; }
.ttimeline li { position: relative; }
.ttimeline li::before { content: ""; position: absolute; left: -29px; top: 6px; width: 12px; height: 12px; border-radius: 50%; background: var(--white); border: 2.5px solid var(--gold); }
.ttimeline .tyr { display: block; font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 13.5px; color: var(--gold-dk); letter-spacing: 0.04em; }
.ttimeline h3 { font-size: 17px; margin-top: 3px; }
.ttimeline p { color: var(--muted); font-size: 15px; margin-top: 4px; }

.trgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 14px; margin-top: 20px; }
.tresult { border: 1px solid var(--line); border-radius: 12px; padding: 15px 16px; background: var(--white); }
.tsc { font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 22px; line-height: 1; margin: 0; }
.tsc sup { font-size: 11px; color: var(--muted-2); }
.tnm { font-weight: 700; font-size: 14px; margin: 7px 0 0; }
.tmt { color: var(--muted); font-size: 12.5px; margin: 2px 0 0; }
.tmore { margin-top: 18px; }

.tother { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 22px; }
@media (max-width: 700px) {
  .tother { grid-template-columns: 1fr; }
}
.totherlink { border: 1px solid var(--line); border-radius: var(--r); padding: 18px; background: var(--white); display: flex; gap: 16px; align-items: center; text-decoration: none; transition: 0.15s; }
a.totherlink:hover { border-color: var(--gold); transform: translateY(-2px); box-shadow: rgba(13, 31, 60, 0.09) 0px 10px 26px; }
.totherlink .tav { width: 60px; height: 60px; flex: 0 0 60px; border-radius: 14px; object-fit: cover; }
span.tav { background: var(--surface-2); border: 1px dashed #c3cede; display: grid; place-items: center; font-size: 9.5px; color: var(--muted-2); text-align: center; line-height: 1.2; }
.totherlink h3 { font-size: 15.5px; }
.tflabel { color: var(--gold-dk); font-weight: 700; font-size: 13px; margin-top: 2px; display: block; }

/* ------------------------------------------------------------------
 * teacher.php - Education sidebar + Experience section (2026-08-31)
 *
 * .tside is the stacking wrapper for the aside in .ttwocol - the quote
 * card and the education card can appear together or alone, so each
 * gets margin-top from the one before it rather than a fixed gap.
 * ------------------------------------------------------------------ */

.tside + .tside { margin-top: 16px; }

.tedu { border: 1px solid var(--line); border-radius: var(--r); padding: 22px; background: var(--white); }
.tedu h3 { font-size: 15px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-bottom: 4px; }
.tedurow { display: flex; gap: 14px; padding: 12px 0; border-bottom: 1px solid var(--line); align-items: baseline; }
.tedurow:last-child { border-bottom: 0; padding-bottom: 0; }
.teduyr { font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 15px; color: var(--gold-dk); flex: 0 0 auto; min-width: 48px; }
.tedurow b { display: block; font-size: 14.5px; }
.tedusub { display: block; color: var(--muted); font-size: 13px; margin-top: 2px; }

/* Experience - a wide, resume-style list. The duration sits in its own
   column so entries line up even when one role runs "2019 - Present"
   and another is a single year. */
.texp { list-style: none; margin: 20px 0 0; padding: 0; display: flex; flex-direction: column; gap: 22px; }
.texp li { display: grid; grid-template-columns: 150px 1fr; gap: 20px; padding-bottom: 22px; border-bottom: 1px solid var(--line); }
.texp li:last-child { border-bottom: 0; padding-bottom: 0; }
@media (max-width: 640px) {
  .texp li { grid-template-columns: 1fr; gap: 6px; }
}
.texpyr { font-family: "Bricolage Grotesque", sans-serif; font-weight: 800; font-size: 14px; color: var(--gold-dk); letter-spacing: 0.02em; white-space: nowrap; }
.texp h3 { font-size: 18px; }
.texpsub { color: var(--ink); font-weight: 600; font-size: 14.5px; margin-top: 3px; }
.texpdesc { color: var(--muted); font-size: 15px; margin-top: 8px; max-width: 42em; }

/* ===== MERGED FROM CURRENT site.css ===== */

.brand-mark-img { width: auto; max-width: 160px; height: 40px; flex: 0 0 auto;
  border-radius: 0; background: none; }

.brand-mark-img img { display: block; height: 100%; width: auto; max-width: 160px; object-fit: contain; }

@media (min-width: 941px) and (min-height: 560px) {
  .hero { min-height: calc(100svh - 132px); display: flex; align-items: center; }
  .hero-grid { width: 100%; }
}

.sheet:has(> .sheet-slides) { --slide-h: min(70vh, 600px);
  width: calc(var(--slide-h) * 4 / 5); max-width: 100%; margin-left: auto; }

.sheet-portrait { --slide-h: min(70vh, 600px);
  width: calc(var(--slide-h) * 4 / 5); max-width: 100%; margin-left: auto; }

.sheet:has(> .sheet-slides) .sslide .govtag,
.sheet-portrait .sslide .govtag { max-width: calc(100% - 140px); font-size: 11px;
  padding: 5px 9px; }

@media (min-width: 941px) {
  /* Let the card hug the picture and give the rest to the headline. */
  .hero-grid:has(.sheet-slides) { grid-template-columns: 1fr auto; }
  .hero-grid-portrait { grid-template-columns: 1fr auto; }
}

.mrow > .tcard {
  flex: 0 0 max(260px, calc((var(--mq-vw) - (var(--mq-n) - 1) * var(--mq-gap)) / var(--mq-n)));
  display: flex;
  flex-direction: column;
  white-space: normal;
}

.mrow > .tcard .by { margin-top: auto; padding-top: 15px; }

.gal-alb-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 26px;
  margin-top: 32px;
}

.gal-alb-card {
  display: block;
  border-radius: 16px;
  overflow: hidden;
  border: 1px solid var(--line);
  background: var(--white);
  text-decoration: none;
  color: inherit;
  transition: box-shadow .18s, transform .18s;
  box-shadow: 0 2px 12px rgba(13,31,60,.06);
}

.gal-alb-card:hover,
.gal-alb-card:focus-visible {
  box-shadow: 0 8px 30px rgba(13,31,60,.13);
  transform: translateY(-3px);
}

.gal-alb-cover {
  aspect-ratio: 4 / 3;
  width: 100%;
  overflow: hidden;
  background: var(--surface-2);
}

.gal-alb-cover img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform .3s;
}

.gal-alb-card:hover .gal-alb-cover img {
  transform: scale(1.04);
}

.gal-alb-cover-empty {
  width: 100%;
  height: 100%;
  display: grid;
  place-items: center;
  color: var(--muted-2);
}

.gal-alb-cover-empty svg {
  width: 40px;
  height: 40px;
  opacity: .35;
}

.gal-alb-info {
  padding: 16px 18px 18px;
}

.gal-alb-title {
  font-family: "Bricolage Grotesque", sans-serif;
  font-weight: 800;
  font-size: 18px;
  line-height: 1.2;
  color: var(--ink);
}

.gal-alb-desc {
  font-size: 14px;
  color: var(--muted);
  margin-top: 6px;
  line-height: 1.5;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.gal-alb-meta {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 10px;
  font-size: 12.5px;
  color: var(--muted-2);
}

.gal-alb-meta time {
  font-variant-numeric: tabular-nums;
}

.gal-meta-line {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px 14px;
  font-size: 14px;
  color: var(--muted);
  margin-bottom: 24px;
}

.gal-meta-line a {
  color: var(--gold-dk);
  text-decoration: none;
}

.gal-meta-line a:hover { text-decoration: underline; }

.gal-img-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 14px;
  margin-top: 12px;
}

.gal-img-btn {
  display: block;
  aspect-ratio: 4 / 3;
  border: 0;
  padding: 0;
  background: var(--surface-2);
  border-radius: 10px;
  overflow: hidden;
  cursor: zoom-in;
  width: 100%;
  transition: box-shadow .18s, transform .18s;
}

.gal-img-btn:hover,
.gal-img-btn:focus-visible {
  box-shadow: 0 6px 24px rgba(13,31,60,.18);
  transform: translateY(-2px);
}

.gal-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.gal-empty {
  padding: 60px 20px;
  text-align: center;
  color: var(--muted-2);
  font-size: 16px;
}

.glb-overlay {
  position: fixed;
  inset: 0;
  z-index: 9000;
  background: rgba(6, 15, 35, .92);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 20px;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}

.glb-img-wrap {
  max-width: min(90vw, 1000px);
  max-height: 78vh;
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 1 1 auto;
}

.glb-img {
  max-width: 100%;
  max-height: 78vh;
  border-radius: 8px;
  display: block;
  object-fit: contain;
  box-shadow: 0 12px 48px rgba(0,0,0,.5);
}

.glb-cap {
  color: rgba(255,255,255,.75);
  font-size: 14px;
  text-align: center;
  margin-top: 14px;
  max-width: 680px;
  line-height: 1.5;
  min-height: 1.5em;
}

.glb-close {
  position: fixed;
  top: 16px;
  right: 18px;
  z-index: 9010;
  background: rgba(255,255,255,.12);
  border: 0;
  color: #fff;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background .15s;
}

.glb-close:hover { background: rgba(255,255,255,.25); }

.glb-btn {
  position: fixed;
  top: 50%;
  transform: translateY(-50%);
  z-index: 9010;
  background: rgba(255,255,255,.12);
  border: 0;
  color: #fff;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  font-size: 22px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background .15s;
}

.glb-btn:hover { background: rgba(255,255,255,.25); }

.glb-prev { left: 14px; }

.glb-next { right: 14px; }

@media (max-width: 400px) {
  .gal-alb-grid { grid-template-columns: 1fr; }
}

[lang="mr"] .gal-alb-title { letter-spacing: 0.01em; }

/* ── Lightbox ─────────────────────────────────────────── */
.ct-lb { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; }
.ct-lb[hidden] { display: none; }

.ct-lb-backdrop { position: absolute; inset: 0; background: rgba(0,0,0,0.85); cursor: pointer; }

.ct-lb-close { position: absolute; top: 18px; right: 22px; z-index: 1; background: rgba(255,255,255,0.15); border: none; border-radius: 50%; width: 40px; height: 40px; font-size: 24px; color: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s; }
.ct-lb-close:hover { background: rgba(255,255,255,0.3); }

.ct-lb-frame { position: relative; z-index: 1; max-width: 92vw; max-height: 88vh; border-radius: 12px; overflow: hidden; box-shadow: 0 8px 48px rgba(0,0,0,0.6); }

.ct-lb-img { display: block; max-width: 92vw; max-height: 88vh; width: auto; height: auto; object-fit: contain; }

/* =====================================================================
   MOBILE FIXES  (added 2026-08-31)

   ALL rules below are inside narrow-screen media queries.
   Desktop layout (≥ 640px) is completely untouched.
   ===================================================================== */

/* 1. Safety net --------------------------------------------------------
      Prevents any stray fixed-width or absolutely-positioned element
      from growing the page wider than the screen and triggering the
      horizontal slide Gaurav reported.                                   */
html { overflow-x: hidden; }

/* 2. Utility bar -------------------------------------------------------
      Hide the address / hours strip on phones. The phone number is
      already in the header call button so nothing useful is lost.
      The strip's address text can be long in Marathi and wraps
      awkwardly; hiding it is the cleaner fix.                            */
@media (max-width: 639px) {
  .util { display: none; }
}

/* 3. Header ------------------------------------------------------------
      On a 360px phone the content area is only ~316px.
      brand-mark (40px) + brand text (~155px) + gap + full call button
      (~135px) = ~350px — overflows by ~34px. Switching to an icon-only
      call button on small screens saves ~90px and fixes the overflow.   */
@media (max-width: 639px) {
  header.site .wrap {
    gap: 10px;
    padding-top: 10px;
    padding-bottom: 10px;
  }
  /* Hide the sub-label ("Sangamner · MHT-CET") — brand mark + name
     is enough at this width.                                            */
  .brand small { display: none; }

  /* Icon-only call button — text hidden, padding tightened.
     The SVG icon is still visible so the purpose is clear.             */
  .btn-call { padding: 10px 13px; }
  .btn-call > span { display: none; }
}

/* 4. Hero section ------------------------------------------------------
      The headline min is 34px on this file. Smaller on narrow phones
      gives more breathing room above the card.                          */
@media (max-width: 480px) {
  .hero h1 { font-size: clamp(26px, 7.5vw, 34px); }
  .hero-sub { font-size: 15.5px; margin-top: 12px; }
  .hero-cta { gap: 8px; margin-top: 18px; }
  .hero-cta .btn { padding: 12px 18px; font-size: 15px; }
  .hero-note { font-size: 13px; }
}

/* 5. Score card rows ---------------------------------------------------
      The sheet has overflow:hidden so .srow content cannot bleed out to
      the page, but shrinking the font at very small widths keeps the
      layout comfortable inside the card.                                */
@media (max-width: 400px) {
  .srow .pct { font-size: 24px; min-width: 92px; }
  .sheet-top { font-size: 14px; }
  .sheet-top b { font-size: 13px; }
}

/* 6. Section padding ---------------------------------------------------
      72px top/bottom is desktop-generous. Halving it on phones lets
      users reach the next section without excess scrolling.             */
@media (max-width: 639px) {
  .sec { padding: 44px 0; }
  .wedge { padding: 44px 0; }
  .finale { padding: 48px 0; }
}

/* 7. Section headings --------------------------------------------------  */
@media (max-width: 639px) {
  .sec-head { margin-bottom: 22px; }
  .sec-head h2 { font-size: clamp(22px, 6vw, 30px); }
  .sec-head p { font-size: 15.5px; }
  .wedge .lead { font-size: 15.5px; }
}

/* 8. Dream college section headline ------------------------------------
      clamp floors at 38px — reduce slightly on very narrow phones.     */
@media (max-width: 400px) {
  .dream-name { font-size: clamp(28px, 9vw, 38px); }
}

/* 9. Admission steps ---------------------------------------------------
      Smaller art means each step card is less tall on a phone.         */
@media (max-width: 560px) {
  .flow { --art: 155px; }
}

/* 10. Marquee safety ---------------------------------------------------
       Contain the animation row on older Android browsers that ignore
       the parent's overflow:hidden.                                     */
.marquee { max-width: 100vw; }

/* 11. FAQ questions ----------------------------------------------------  */
@media (max-width: 639px) {
  .faq summary { font-size: 15px; padding: 14px 16px; }
  .faq .a { padding: 0 16px 16px; }
}

/* 12. Google rating bar ------------------------------------------------  */
@media (max-width: 639px) {
  .google-bar { gap: 10px; padding: 13px 16px; }
}

/* 13. Programme cards --------------------------------------------------  */
@media (max-width: 560px) {
  .pcard { padding: 16px; }
  .card  { padding: 18px; }
}

/* 14. Testimonial cards ------------------------------------------------  */
@media (max-width: 639px) {
  .tcard { padding: 16px; }
  .tcard p { font-size: 14.5px; }
}

/* 15. Blog article grid cards ------------------------------------------  */
@media (max-width: 639px) {
  .acard .ab { padding: 13px 14px 15px; }
}

/* 16. Footer -----------------------------------------------------------  */
@media (max-width: 639px) {
  footer.site { padding-top: 32px; padding-bottom: 20px; }
}

/* 17. Contact / cbox ---------------------------------------------------  */
@media (max-width: 639px) {
  .cbox { padding: 18px; }
}

/* 18. Teacher profile page hero ----------------------------------------
       The 260px fixed photo column is fine on a tablet but on a phone
       the grid already collapses to 1fr at 780px, so nothing extra
       is needed. The tfacts 3→2 col at 560px already exists.           */

/* 19. Downloads teaser ------------------------------------------------- */
.dl-tlist { display: flex; flex-direction: column; gap: 10px; }
.dl-trow {
  display: flex; align-items: center; gap: 14px;
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--r); padding: 14px 16px;
  text-decoration: none; color: var(--ink);
  transition: box-shadow 0.15s, border-color 0.15s, transform 0.15s;
}
.dl-trow:hover { border-color: var(--gold); box-shadow: 0 4px 18px rgba(13,31,60,.08); transform: translateY(-1px); }
.dl-ticon { flex: 0 0 38px; width: 38px; height: 38px; border-radius: 10px;
  background: var(--gold-pale); color: var(--gold-dk);
  display: grid; place-items: center; }
.dl-ticon svg { width: 20px; height: 20px; }
.dl-tmeta { flex: 1 1 0; min-width: 0; }
.dl-ttitle { display: block; font-weight: 600; font-size: 15px; line-height: 1.3; }
.dl-tdesc { display: block; font-size: 13px; color: var(--muted); margin-top: 2px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dl-tbadge { flex: 0 0 auto; font-size: 11px; font-weight: 700;
  padding: 3px 9px; border-radius: 99px; letter-spacing: .04em; }
.dl-tfree { background: #e6f4ec; color: #1c7a4a; }
.dl-tprem { background: var(--gold-pale); color: var(--gold-dk); }
.dl-tarr { flex: 0 0 auto; color: var(--muted-2); }
.dl-tarr svg { width: 16px; height: 16px; display: block; }
@media (max-width: 639px) {
  .dl-tdesc { display: none; }
  .dl-trow { padding: 12px 13px; gap: 11px; }
}

/* ── Scroll-reveal & entrance animations ── */
@media (prefers-reduced-motion: no-preference) {
  .reveal {
    opacity: 0;
    transform: translateY(28px);
    transition: opacity 0.55s ease, transform 0.55s ease;
    transition-delay: var(--reveal-delay, 0s);
  }
  .reveal.visible {
    opacity: 1;
    transform: none;
  }

  /* Hero decorative circles: subtle breathe */
  .hero::before {
    animation: hero-breathe 7s ease-in-out infinite;
  }
  .hero::after {
    animation: hero-breathe 9s ease-in-out infinite reverse;
  }
  @keyframes hero-breathe {
    0%, 100% { transform: scale(1);    opacity: 1;   }
    50%       { transform: scale(1.1); opacity: 0.65; }
  }

  /* Hero badge dot: pulse (overrides any earlier rule) */
  .badge .dot {
    animation: dot-ping 2s ease-in-out infinite;
  }
  @keyframes dot-ping {
    0%, 100% { transform: scale(1);    box-shadow: 0 0 0 0 rgba(201,162,39,.6); }
    50%       { transform: scale(1.25); box-shadow: 0 0 0 5px rgba(201,162,39,0); }
  }
}