/* ═══════════════════════════════════════════════════════
   my school — Κέντρο Ξένων Γλωσσών
   Homepage rebuilt section-by-section from primer.com.
   Everything sits on a 12-column grid; every rule is 1px
   pure black; colour appears only as flat blocks.
   ═══════════════════════════════════════════════════════ */

/* ---------- 1. Tokens ---------- */
:root{
  --ink:#000;
  --paper:#fff;
  --rule:#000;
  --rule-soft:rgba(0,0,0,.1);
  --muted:rgba(0,0,0,.62);

  --yellow:#FED933;
  --orange:#FE6D2E;
  --blue:#377EF0;
  --green:#00AD6F;

  /* brand colours, sampled from the logo */
  --brand-pink:#EE3D8F;
  --brand-purple:#7B3FB5;
  --brand-teal:#29B6C8;

  --serif:'Source Serif 4','Iowan Old Style',Georgia,'Times New Roman',serif;
  --sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
  --round:'Baloo 2','Trebuchet MS',var(--sans);

  --f56:clamp(2rem,1.1rem + 3.1vw,3.5rem);
  --f40:clamp(1.6rem,1.05rem + 1.9vw,2.5rem);
  --f24:clamp(1.2rem,1.02rem + .62vw,1.5rem);
  --f20:clamp(1.08rem,1rem + .3vw,1.25rem);
  --f18:clamp(1rem,.96rem + .18vw,1.125rem);
  --f15:.9375rem;
  --f12:.75rem;

  /* Up to 2150px the page is full-bleed with a 5vw inset. Past that the
     content column freezes at 1920px and centres itself. */
  --gutter:5vw;
  --pad:var(--gutter);
  --maxw:100%;

  --gap:clamp(10px,1.25vw,18px);   /* 12-col gutter (primer: 17.78px) */
  /* One column of the 12-col grid, and the x-position where column 3 starts.
     The band's side panels are exactly that wide, so the colour bar begins on
     the same line as the section headings' vertical rule. */
  --col:calc((100% - 2 * var(--gutter) - 11 * var(--gap)) / 12);
  --flank:calc(var(--gutter) + 2 * (var(--col) + var(--gap)));
  --core:520px;                    /* band text column                  */
  --bar:clamp(22px,2.2vw,30px);    /* vertical colour bar   (primer 30) */
  --barH:clamp(30px,3.2vw,41px);   /* horizontal colour bar (primer 41) */
  --sec-y:clamp(56px,7vw,104px);
  --navH:64px;
  /* graph-paper cell. On phones it equals the page gutter, so the strip is
     exactly one cell wide and its rule lands on the text edge below it. */
  --cell:var(--gutter);

  --ease:cubic-bezier(.22,.61,.36,1);
  --ease-out:cubic-bezier(.16,1,.3,1);
}

@media (min-width:980px){
  :root{--cell:40px}
}

@media (min-width:2150px){
  :root{--gutter:0px;--maxw:1920px;--pad:28px}
}

/* ---------- 2. Reset ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
html:focus-within{scroll-behavior:smooth}
body,h1,h2,h3,h4,p,ul,ol,figure,blockquote{margin:0}
ul,ol{list-style:none;padding:0}
img,svg{display:block;max-width:100%}
button{background:none;border:0;cursor:pointer;font:inherit;color:inherit}
a{color:inherit;text-decoration:none}

body{
  background:var(--paper);color:var(--ink);
  font-family:var(--sans);font-size:var(--f15);line-height:1.55;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
body.is-locked{overflow:hidden}
::selection{background:var(--yellow);color:#000}
:focus-visible{outline:2px solid var(--blue);outline-offset:2px}

.skip-link{position:absolute;left:-9999px;top:0;z-index:300;background:#000;color:#fff;padding:12px 20px}
.skip-link:focus{left:12px;top:12px}

/* ---------- 3. Layout primitives ---------- */
.container{width:100%;max-width:var(--maxw);margin-inline:auto;padding-inline:var(--gutter)}
.section{padding-block:var(--sec-y)}

/* the 12-column grid everything is measured against */
.grid12{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));column-gap:var(--gap)}

/* Primer's Sirca is a dense display serif; Source Serif 4 reads noticeably
   lighter at the same weight, so the display sizes run at 500 and the small
   titles at 600 to land on a comparable colour on the page. */
.serif{font-family:var(--serif);font-weight:500;letter-spacing:-.015em;line-height:1.08;text-wrap:balance}
.t56{font-size:var(--f56)}
.t40{font-size:var(--f40)}
.t24{font-size:var(--f24);line-height:1.14;font-weight:600}
.label{font-size:var(--f12);font-weight:600;letter-spacing:.1em;text-transform:uppercase}
/* body copy is pure black on primer, not grey — grey is only for meta text */
.descr{font-size:var(--f18);line-height:1.5;color:var(--ink);text-wrap:pretty}

/* hairlines */
.rule{display:block;height:1px;background:var(--rule);width:100%}
.vline{display:block;position:absolute;top:0;bottom:0;width:1px;background:var(--rule)}

/* ---------- 4. Buttons ---------- */
.btn{
  --bg:transparent;--fg:#000;--bd:#000;
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--bg);color:var(--fg);border:1px solid var(--bd);
  border-radius:999px;padding:11px 28px;
  font-size:var(--f15);font-weight:500;line-height:1.2;white-space:nowrap;
  transition:background .22s,color .22s,border-color .22s;
}
.btn:hover{--bg:#000;--fg:#fff;--bd:#000}
.btn--fill{--bg:#000;--fg:#fff;--bd:#000}
.btn--fill:hover{--bg:var(--orange);--bd:var(--orange);--fg:#000}
.btn--sm{padding:8px 20px;font-size:var(--f12);letter-spacing:.02em}
.btn--block{display:flex;width:100%}

/* ---------- 5. Logo ---------- */
/* The header uses the CSS wordmark: the painted badge carries three lines of
   type and a ring of figures, none of which survive at nav size. The badge
   itself only appears in the footer, where it has room to read.
   logo.png is a full 1080x1920 portrait frame with big empty margins, so the
   badge is cropped out of the middle. If the file is ever re-exported tightly
   cropped, this box already matches its shape and nothing is cut. */
.logo{display:inline-flex;align-items:center;gap:10px}
.logo__img{
  display:none;width:auto;aspect-ratio:11/10;
  object-fit:cover;object-position:50% 53%;
}
.logo.has-img .logo__img{display:block}
.logo.has-img .logo__text{display:none}
.logo__text{display:inline-flex;flex-direction:column;line-height:1;gap:2px}
.logo__mark{font-family:var(--round);font-weight:800;font-size:1.35rem;letter-spacing:-.02em;color:var(--brand-purple)}
.logo__mark em{font-style:normal;color:var(--brand-pink)}
.logo__sub{font-size:.5rem;font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);white-space:nowrap}

.swatches{display:flex;align-self:stretch;border-left:1px solid var(--rule)}
.swatches i{width:clamp(24px,3vw,33px);border-right:1px solid var(--rule);display:block}
.swatches i:nth-child(1){background:var(--brand-pink)}
.swatches i:nth-child(2){background:var(--brand-purple)}
.swatches i:nth-child(3){background:var(--brand-teal)}


/* ---------- 6. Nav ---------- */
.nav{position:sticky;top:0;z-index:100;background:var(--paper);border-bottom:1px solid var(--rule)}
.nav__inner{
  max-width:var(--maxw);margin-inline:auto;padding-left:var(--gutter);
  display:flex;align-items:stretch;justify-content:space-between;min-height:var(--navH);
}
.nav__left{display:flex;align-items:center}
.nav__left .logo{padding-right:clamp(12px,2vw,22px)}
.nav__links{display:none;align-items:center;gap:clamp(14px,1.8vw,28px);margin-left:clamp(18px,3vw,40px)}
.nav__links a{font-size:var(--f15);position:relative;padding-block:3px;white-space:nowrap}
.nav__links a::after{
  content:'';position:absolute;left:0;right:0;bottom:0;height:1px;background:currentColor;
  transform:scaleX(0);transform-origin:left;transition:transform .3s var(--ease);
}
.nav__links a:hover::after,.nav__links a.is-active::after{transform:scaleX(1)}
.nav__right{display:flex;align-items:center;gap:10px;padding-right:var(--gutter)}
.nav__right .btn{display:none}
.burger{width:34px;height:34px;display:grid;place-content:center;gap:6px}
.burger span{display:block;width:22px;height:1.5px;background:#000;transition:transform .3s var(--ease)}
.burger[aria-expanded="true"] span:first-child{transform:translateY(3.7px) rotate(45deg)}
.burger[aria-expanded="true"] span:last-child{transform:translateY(-3.7px) rotate(-45deg)}

@media (min-width:940px){
  .nav__links{display:flex}
  .nav__right .btn{display:inline-flex}
  .burger{display:none}
}
.nav__right .btn.nav__phone{display:none}
@media (min-width:1180px){.nav__right .btn.nav__phone{display:inline-flex}}

/* ---------- 7. Mobile menu ---------- */
.mmenu{
  position:fixed;inset:var(--navH) 0 0;z-index:99;background:var(--paper);
  display:flex;flex-direction:column;justify-content:space-between;
  padding:0 var(--gutter) calc(24px + env(safe-area-inset-bottom));
  opacity:0;transition:opacity .25s var(--ease);
}
.mmenu[hidden]{display:none}
.mmenu.is-open{opacity:1}
.mmenu__links{display:flex;flex-direction:column;margin-top:8px}
.mmenu__links a{
  font-family:var(--serif);font-size:clamp(1.6rem,7vw,2.2rem);line-height:1.2;
  padding-block:14px;border-bottom:1px solid var(--rule);
  display:flex;align-items:baseline;gap:14px;
}
.mmenu__links em{font-family:var(--sans);font-style:normal;font-size:var(--f12);color:var(--muted)}
.mmenu__foot{display:flex;flex-direction:column;gap:14px;align-items:center;padding-top:20px}

/* ═══════════ 8. BAND (hero + cta) ═══════════ */
.band{position:relative;border-top:1px solid var(--rule)}
/* On phones primer keeps the frame, just narrower: one column of graph paper
   down the left, the colour bar down the right, the horizontal bar underneath.
   Only the diagonal is dropped. The desktop query below widens the flanks. */
.band__grid{
  position:relative;max-width:var(--maxw);margin-inline:auto;
  display:grid;grid-template-columns:calc(var(--cell) + 1px) minmax(0,1fr) var(--bar);
  grid-template-rows:minmax(clamp(240px,26vw,322px),auto) auto;
}
.band__core{
  grid-row:1;grid-column:2;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:14px;text-align:center;
  padding:clamp(36px,4.5vw,56px) var(--gutter);
  max-width:var(--core);margin-inline:auto;width:100%;
  position:relative;z-index:2;
}
.band__core .descr{max-width:42ch}
.band__core .btn{margin-top:8px}
.band__deco{display:block;position:relative;overflow:hidden}
.band__deco--left{grid-row:1/3;grid-column:1;border-right:1px solid var(--rule)}
.band__deco--left .graph{bottom:var(--barH)}
.band__deco--right{grid-row:1;grid-column:3;border-left:1px solid var(--rule)}
.diagonal{display:none}          /* no room for it until the desktop layout */

/* the mirrored band keeps its orientation on phones too: colour bar down the
   left, the strip of paper down the right */
.band--mirror .band__grid{grid-template-columns:var(--bar) minmax(0,1fr) calc(var(--cell) + 1px)}
.band--mirror .band__deco--left{border-right:0}
.band--mirror .band__edge{left:0;right:auto;border-left:0;border-right:1px solid var(--rule)}
.band--mirror .graph{background-position:left top}
.band--mirror .graph i{left:1px;right:auto}

.graph{
  /* pulled up 1px so the paper's own first line lands on the band's top rule
     instead of sitting under it and reading as a 2px border */
  position:absolute;inset:-1px 0 0 0;
  background-image:
    linear-gradient(to right, var(--rule) 1px, transparent 1px),
    linear-gradient(to bottom, var(--rule) 1px, transparent 1px);
  background-size:var(--cell) var(--cell);background-position:right top;
  overflow:hidden;   /* a square can never escape the paper */
  /* closes the last, partial row — without it the vertical rules run past the
     bottom of the paper and hang loose under the grid */
  border-bottom:1px solid var(--rule);
}
/* 39px on a 40px pitch, shifted 1px off each rule: the square then fills the
   inside of its cell and leaves all four grid lines drawn around it, instead
   of sitting on top of them */
.graph i{
  position:absolute;right:0;display:block;
  width:calc(var(--cell) - 1px);height:calc(var(--cell) - 1px);
}
/* one column on a phone: colour the third cell and the last one, nothing else */
.graph i:nth-child(1){background:var(--brand-pink);display:none}
.graph i:nth-child(2){background:var(--brand-purple);top:auto;bottom:1px}
.graph i:nth-child(3){background:var(--brand-teal);top:calc(2 * var(--cell) + 1px)}

.diagonal{position:absolute;top:0;bottom:0;left:0;right:var(--bar);color:var(--rule)}
.diagonal svg{width:100%;height:100%;display:block}

.band__edge{
  position:absolute;top:0;bottom:0;right:0;width:var(--bar);
  background:var(--c2,var(--green));border-left:1px solid var(--rule);z-index:3;
}
.band__bar{grid-column:2/4;
  grid-row:2;height:var(--barH);
  background:var(--c,var(--brand-teal));border-block:1px solid var(--rule);z-index:3;
}
/* the footer draws its own top rule — a second one here reads as 2px */
.band--last .band__bar{border-bottom:0}

@media (min-width:980px){
  .band__grid{grid-template-columns:var(--flank) minmax(0,1fr) var(--flank)}
  .band__core{padding-inline:24px}
  /* the flanks are wide enough now for the diagonal and all three squares */
  .diagonal{display:block}
  .graph i:nth-child(1){display:block;right:80px;top:1px}
  .graph i:nth-child(2){right:80px;top:161px;bottom:auto}
  .graph i:nth-child(3){right:160px;top:201px}
  .band__bar{grid-column:2/4}

  /* MIRRORED band (the CTA): diagonal + colour bar on the left, graph paper on
     the right, and both panels run the full height so the paper draws over the
     horizontal bar — exactly how primer builds its closing band. */
  /* these two must be restated: the mobile .band--mirror rules above outrank
     the plain .band__grid / .band__deco--left rules in this query, because a
     media query adds no specificity of its own */
  .band--mirror .band__grid{grid-template-columns:var(--flank) minmax(0,1fr) var(--flank)}
  .band--mirror .band__deco--left{border-right:1px solid var(--rule)}
  .band--mirror .band__deco{grid-row:1/3;z-index:4}
  .band--mirror .band__deco--left .graph{bottom:0}
  .band--mirror .band__edge{left:0;right:auto;border-left:0;border-right:1px solid var(--rule)}
  .band--mirror .diagonal{left:var(--bar);right:0}
  .band--mirror .graph{background-position:left top}
  .band--mirror .graph i:nth-child(1){left:81px;right:auto}
  .band--mirror .graph i:nth-child(2){left:81px;right:auto}
  .band--mirror .graph i:nth-child(3){left:161px;right:auto}
}

/* ---------- 9. Hero strip ---------- */
/* capped like every other block, or past 2150px the banner runs edge to edge
   while the rest of the page sits in a 1920px column */
.hero__strip{
  max-width:var(--maxw);margin-inline:auto;
  padding-block:clamp(24px,4vw,48px) 0;overflow:hidden;
}
.hero__strip .ph{aspect-ratio:1440/300}
.hero__strip .ph img{object-fit:contain;object-position:bottom center}
@media (max-width:700px){.hero__strip .ph{aspect-ratio:5/2}}

/* ---------- 10. Section heading (cols 3–8, ruled left) ---------- */
/* The rule has to read as one continuous line: from the colour bar above the
   section down to the first row's hairline. So this block carries all of the
   vertical space itself — the section adds no top padding (#why below) and
   the rows follow with no margin. */
.sec-head{
  grid-column:1/-1;position:relative;
  padding:clamp(56px,9vw,124px) 0 clamp(20px,3vw,36px) clamp(16px,2.6vw,36px);
}
.sec-head .vline{left:0}
.sec-head h2{max-width:16ch}
@media (min-width:900px){
  .sec-head{grid-column:3/9}
}

/* ---------- 11. Rows (title | info | image) ---------- */
#why{padding-top:0}          /* the heading block supplies the space instead */
.rows{margin-top:0}
.row{position:relative;padding-block:clamp(22px,2.6vw,32px);row-gap:16px}
.row .rule{position:absolute;top:0;left:0}
.row .rule--last{top:auto;bottom:0}
.row__title{grid-column:1/-1}
.row__info{grid-column:1/-1}
.row__info .descr{max-width:46ch}
.row__img{grid-column:1/-1;aspect-ratio:5/3}
@media (min-width:900px){
  .row{row-gap:0}
  .row__title{grid-column:1/5}
  .row__info{grid-column:5/10}
  .row__img{grid-column:10/13;aspect-ratio:5/3;align-self:end}  /* primer: 213x129 */
}

/* ---------- 12. Commitments ---------- */
.section--comm{padding-block:0 var(--sec-y)}
.comm__top{grid-column:1/-1;align-items:start}
.comm__img{
  grid-column:1/-1;aspect-ratio:16/10;position:relative;
  margin-inline:calc(-1 * var(--gutter));
}
.comm__head{grid-column:1/-1;position:relative;padding-block:clamp(20px,2.4vw,32px)}
.comm__head .rule{position:absolute;left:0;top:0}
.comm__head .rule:last-of-type{top:auto;bottom:0}
.comm__head-inner{display:grid;grid-template-columns:1fr;gap:clamp(20px,2.6vw,36px);padding-block:clamp(24px,3vw,40px)}
.comm__title{max-width:16ch}
.comm__descr .descr{max-width:34ch}

@media (min-width:900px){
  /* runs the full height of the heading beside it, so the boundary reads as
     one clean edge with no leftover gap and no separate rule */
  .comm__img{
    grid-column:1/3;aspect-ratio:auto;height:auto;align-self:stretch;
    margin-inline:0;margin-left:calc(-1 * var(--gutter));
    margin-right:calc(-1 * var(--gap)); /* close the column gap */
    border-right:0;
  }
  .comm__head{grid-column:3/13;padding-block:clamp(24px,3vw,32px) clamp(32px,4vw,46px)}
  .comm__head-inner{
    grid-template-columns:repeat(10,minmax(0,1fr));column-gap:var(--gap);
    padding-left:clamp(20px,2.6vw,36px);
  }
  .comm__title{grid-column:1/7}
  .comm__descr{grid-column:7/10;padding-left:clamp(14px,2vw,28px)}
}

/* 4-column cell grid: text cards, colour cards and image cards */
/* Every box is the same size at every breakpoint: the row height comes from
   the grid, never from the text or the photo inside it. minmax keeps a long
   edit from ever clipping. */
.comm__grid{
  display:grid;grid-template-columns:1fr;gap:var(--gap);
  grid-auto-rows:minmax(clamp(300px,72vw,360px),auto);
  margin-top:clamp(36px,5vw,71px);
}
.cell{position:relative;min-height:0}
.cell--txt{
  display:flex;flex-direction:column;justify-content:space-between;
  padding:clamp(16px,1.6vw,21px) clamp(20px,2vw,28px) clamp(14px,1.4vw,18px) clamp(8px,1vw,11px);
  border:1px solid var(--rule);
}
.cell--fill{background:var(--c);border:0}
.cell__num{font-size:var(--f15);font-weight:600}
.cell--fill .cell__num{color:var(--ink)}
.cell__body{display:flex;flex-direction:column;gap:clamp(16px,2vw,30px)}
.cell__body p{max-width:26ch}
.cell--fill .cell__body p{color:var(--ink)}
.cell--img{aspect-ratio:auto}
@media (min-width:640px){
  .comm__grid{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(clamp(300px,42vw,420px),auto)}
}
@media (min-width:1040px){
  /* one fixed row height for every box, matching the taller of the two rows */
  .comm__grid{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:clamp(360px,32vw,460px)}
  .cell,.cell--img{min-height:0}
  .cell--img{aspect-ratio:auto}
}

/* ---------- 13. Colour spacer (col 4 → right edge) ---------- */
.spacer-sec{position:relative}
.spacer-block{
  grid-column:1/-1;position:relative;
  height:clamp(64px,9vw,107px);background:var(--c,var(--brand-purple));
  margin-right:calc(-1 * var(--gutter));
}
@media (min-width:900px){.spacer-block{grid-column:4/-1}}

/* ---------- 14. Gallery ---------- */
.gal__head{grid-column:1/-1;padding-bottom:clamp(28px,4vw,52px);text-align:center}
.gal__head h2{max-width:22ch;margin-inline:auto}
@media (min-width:900px){.gal__head{grid-column:3/11}}
.gal__hero{aspect-ratio:16/9;margin-bottom:clamp(36px,5vw,64px)}

.strip{overflow:hidden;border-block:1px solid var(--rule)}
.strip__track{display:flex;gap:var(--gap);width:max-content;animation:slide 46s linear infinite}
.strip__group{display:flex;gap:var(--gap)}
.strip__group .ph{
  width:clamp(150px,16vw,215px);height:clamp(190px,20vw,270px);
  flex:none;
}
.strip:hover .strip__track{animation-play-state:paused}
/* the half-gap keeps the seam between the two groups exactly one gap wide */
@keyframes slide{to{transform:translateX(calc(-50% - var(--gap) / 2))}}

/* ---------- 15. Split section ---------- */
.split{position:relative}
.split__grid{display:grid;grid-template-columns:minmax(0,1fr)}
.split__left{
  display:flex;flex-direction:column;justify-content:space-between;align-items:flex-start;
  gap:clamp(32px,5vw,64px);
  padding:clamp(36px,4.5vw,56px) var(--gutter);
}
.split__content{display:flex;flex-direction:column;gap:clamp(18px,2.4vw,28px)}
.split__content h2{max-width:14ch}
.split__content .descr{max-width:34ch}
.split__right{position:relative;display:flex;align-items:center;justify-content:center;padding:clamp(24px,3vw,40px)}
.split__right .vline{left:0}   /* without this the flex centring drags it onto the photo */
.split__right .ph{aspect-ratio:4/3;width:100%}  /* flex item needs an explicit width or it collapses */
@media (min-width:900px){
  .split__grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .split__right .ph{aspect-ratio:11/8}
}

/* ---------- 16. Image placeholders ---------- */
.ph{position:relative;overflow:hidden;background:#F4F2EE}
.ph::before{
  content:'';position:absolute;inset:0;z-index:0;
  background-image:
    linear-gradient(to right, var(--rule-soft) 1px, transparent 1px),
    linear-gradient(to bottom, var(--rule-soft) 1px, transparent 1px);
  background-size:40px 40px;
}
.ph::after{
  content:attr(data-ph);position:absolute;left:12px;bottom:10px;z-index:1;
  font-size:var(--f12);letter-spacing:.08em;text-transform:uppercase;color:rgba(0,0,0,.38);
}
/* out of flow: a photo must never drive layout height — the .ph gets its
   height from its aspect-ratio or from the grid row, never from the image */
.ph img{position:absolute;inset:0;z-index:2;width:100%;height:100%;object-fit:cover}
.ph img[data-broken]{opacity:0}
.ph.is-loaded{background:none}
.ph.is-loaded::before,.ph.is-loaded::after{display:none}

/* ---------- 17. Footer ---------- */
.footer{border-top:1px solid var(--rule)}
.footer__grid{display:grid;grid-template-columns:1fr;max-width:var(--maxw);margin-inline:auto}
.footer__col{padding:clamp(22px,2.6vw,32px) var(--pad);border-bottom:1px solid var(--rule)}
.footer__col h4{font-size:var(--f12);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:14px}
.footer__col a,.footer__col p{display:block;font-size:var(--f15);margin-bottom:7px}
.footer__col a:hover{color:var(--orange)}
.footer__brand{display:flex;flex-direction:column;align-items:flex-start;gap:14px}
.footer__brand .logo__img{height:clamp(150px,12vw,200px)}  /* the badge only reads at size */
.footer__owner{font-size:var(--f15)}
.footer__owner span{color:var(--muted);font-size:var(--f12)}
.socials{display:flex;gap:8px;margin-top:8px}
.socials a{width:36px;height:36px;border:1px solid var(--rule);border-radius:999px;display:grid;place-items:center;margin:0}
.socials svg{width:17px;height:17px}
.socials a:hover{background:#000;color:#fff}
.footer__bar{
  display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between;
  padding:18px var(--pad);font-size:var(--f12);color:var(--muted);
  max-width:var(--maxw);margin-inline:auto;
}
.footer__bar a:hover{color:#000}
@media (min-width:760px){
  .footer__grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .footer__col{border-right:1px solid var(--rule)}
  .footer__col:nth-child(2n){border-right:0}
}
@media (min-width:1060px){
  .footer__grid{grid-template-columns:1.4fr 1fr 1fr 1.2fr;border-bottom:1px solid var(--rule)}
  .footer__col{border-right:1px solid var(--rule);border-bottom:0}
  .footer__col:nth-child(2n){border-right:1px solid var(--rule)}
  .footer__col:last-child{border-right:0}
}
@media(max-width:760px){
  .footer__brand{align-items:center;}
  .footer__col{text-align:center;}
  .socials{justify-content:center;}
  .footer__bar{justify-content:center;text-align:center;}
  .split__content h2{max-width:100%;}
  .split__content .descr{max-width:100%;}
}

/* ═══════════ 18. SCROLL ANIMATIONS ═══════════
   Primer's vocabulary: rules draw themselves out from one end, text rises
   line by line out of a mask, images uncover, blocks lift into place. */

/* rules draw out */
.js .a-line{transform:scaleX(0);transform-origin:left center;transition:transform 1s var(--ease-out)}
.js .a-line.in{transform:scaleX(1)}
.js .a-vline{transform:scaleY(0);transform-origin:center top;transition:transform 1s var(--ease-out)}
.js .a-vline.in{transform:scaleY(1)}

/* text rises out of a mask, one line at a time */
.js .a-txt .lm{display:block;overflow:hidden}
.js .a-txt .li{display:block;transform:translateY(110%);transition:transform .95s var(--ease-out);transition-delay:var(--d,0ms)}
.js .a-txt.in .li{transform:translateY(0)}
/* before the splitter has run, keep un-split text hidden so it cannot flash */
.js .a-txt:not(.is-split){opacity:0}
.js .a-txt.is-split{opacity:1}

/* images uncover from the bottom, with a slow settle on the picture itself */
.js .a-img{clip-path:inset(0 0 100% 0);transition:clip-path 1.1s var(--ease-out)}
.js .a-img.in{clip-path:inset(0 0 0 0)}
.js .a-img img{transform:scale(1.08);transition:transform 1.4s var(--ease-out)}
.js .a-img.in img{transform:scale(1)}

/* generic lift */
.js .a-up{opacity:0;transform:translateY(18px);transition:opacity .8s var(--ease-out),transform .8s var(--ease-out);transition-delay:var(--d,0ms)}
.js .a-up.in{opacity:1;transform:none}

/* colour blocks wipe in */
.js .spacer-block{transform:scaleX(0);transform-origin:left center;transition:transform 1.1s var(--ease-out)}
.js .spacer-block.in{transform:scaleX(1)}
.js .band__bar{transform:scaleX(0);transform-origin:left center;transition:transform 1.1s var(--ease-out)}
.js .band__bar.in{transform:scaleX(1)}
.js .band__edge{transform:scaleY(0);transform-origin:center top;transition:transform 1s var(--ease-out) .15s}
.js .band__edge.in{transform:scaleY(1)}
.js .graph{opacity:0;transition:opacity 1.2s var(--ease-out)}
.js .graph.in{opacity:1}
.js .graph i{transform:scale(0);transition:transform .7s var(--ease-out);transition-delay:var(--d,0ms)}
.js .graph.in i{transform:scale(1)}
.js .cell--fill{transform:scaleY(0);transform-origin:center top;transition:transform .9s var(--ease-out)}
.js .cell--fill.in{transform:scaleY(1)}

@media (prefers-reduced-motion:reduce){
  html:focus-within{scroll-behavior:auto}
  .strip__track{animation:none}
  .js .a-line,.js .a-vline,.js .a-img,.js .a-up,.js .a-txt .li,
  .js .spacer-block,.js .band__bar,.js .band__edge,.js .graph,.js .graph i,.js .cell--fill{
    transform:none!important;opacity:1!important;clip-path:none!important;transition:none!important;
  }
  *,*::before,*::after{animation-duration:.01ms!important;transition-duration:.01ms!important}
}

/* ---------- 19. Print ---------- */
@media print{
  .nav,.mmenu,.band__deco,.band__bar,.band__edge,.strip{display:none}
  .js .a-line,.js .a-vline,.js .a-img,.js .a-up,.js .a-txt .li{
    transform:none!important;opacity:1!important;clip-path:none!important;
  }
}
