/* =========================================================================
   /about, on the site's own palette and rhythm.

   The old page was a second site: about.css set html,body to #2C2523,
   its cream was #E0D2C5 and its bands ran 104px, against the rebuilt
   four's #171413, #F6F1EA and 118px. That is most of why the page read
   as "more corporate and generic than the other pages" -- it was not
   the writing, it was that nothing on it was the same colour as the
   rest of the site.

   site.css and about.css are both gone. This file is written fresh on
   the tokens the other five use, so there is nothing underneath to
   fight.
   ========================================================================= */

.ab12{
  --ab-ground:#171413;
  --ab-ground-dark:#0F0D0C;
  --ab-cream:#F6F1EA;
  --ab-accent:#B28479;
  --ab-accent-hi:#C99084;
  /* the pale blue the planning page writes figures in. The operator
     band's one hard number is a figure, so it is written in the ink the
     site already uses for figures. */
  --ab-ink:#A9B8C6;
  --ab-inset:clamp(44px,8vw,120px);
  --ab-rule:rgba(246,241,234,.10);
  background:var(--ab-ground-dark);
  color:var(--ab-cream);
}
.ab12 *{box-sizing:border-box}
.ab12-wrap{width:100%;padding:0 var(--ab-inset)}
/* the shared mobile gutter -- see the note in blog-n12.css */
@media(max-width:1024px){ .ab12{--ab-inset:32px} }
@media(max-width:640px){  .ab12{--ab-inset:20px} }

/* THE BAND EYEBROW AND HEADING, the standard planning, software,
   automation and pricing all agree on: 12px/.17em cream at 70%, and
   38px/1.04/-0.035em lowercase. */
.ab12-eyebrow{
  display:block;
  font-family:'Questrial',sans-serif;
  font-size:12px;font-weight:700;letter-spacing:.17em;text-transform:uppercase;
  color:rgba(246,241,234,.7);margin:0;
}
.ab12 h2{
  font-family:'League Spartan',sans-serif;font-weight:700;
  font-size:clamp(30px,3.2vw,38px);line-height:1.04;letter-spacing:-.035em;
  text-transform:lowercase;color:var(--ab-cream);
  margin:14px 0 20px;
}
/* NOT IN THE FOOTER. These are body-wide element selectors, and the
   site footer is inside <body class="ab12"> like everything else -- so
   .ab12 p was restyling "this site was built using Next 12 automations"
   to 15px at .68 and making this one page's footer 78px tall against
   everyone else's 50px. */
/* :where(), NOT :not(). A bare :not() carries its argument's weight, so
   `.ab12 p:not(.site-footer-built)` is (0,2,1) -- heavier than
   `.ab12-close p` (0,1,1) -- and this rule's `margin` SHORTHAND then
   overrode the `margin-left:auto;margin-right:auto` that centres the
   closing band's paragraph. :where() contributes nothing, so the
   exclusion costs no specificity and the rule stays (0,1,1) where it
   belongs. */
.ab12 p:where(:not(.site-footer-built)){
  font-family:'Questrial',sans-serif;
  font-size:15px;line-height:24px;color:rgba(246,241,234,.68);
  margin:0 0 18px;
}
.ab12 p:where(:not(.site-footer-built)):last-child{margin-bottom:0}
.ab12 strong{color:var(--ab-cream);font-weight:400}

/* ------------------------------- the hero -------------------------------
   Same construction as the other five: the masthead lives INSIDE the
   hero so it does not move between pages, and the copy is centred and
   top-aligned so its eyebrow lands on the same 128px line. */
.ab12-hero{
  position:relative;display:flex;align-items:flex-start;overflow:hidden;
  /* NO MIN-HEIGHT AND NO TAIL. This was a 340px box with a photograph
     in it; it is flat dark now and carries an eyebrow and one line of
     headline, so 340 was just empty space holding the letter away from
     the line it belongs under. The hero is its own content plus its
     padding, and the letter starts 30px below the headline. */
  min-height:0;
  /* 151px, the blog masthead's number -- see the note there. All four
     rebuilt heroes start their type on the same line now instead of
     each one landing wherever its own copy height put it. */
  padding:151px var(--ab-inset) 0;
  background:var(--ab-ground-dark);
}
/* THE HERO IS FLAT DARK NOW, and the warehouse has moved down to the
   band it actually illustrates. On the hero it was a photograph of a
   place behind the words "built from the operator's seat", which is a
   caption looking for its picture; behind "who's behind it" it is the
   room the person in that section runs. Same plate, one section lower,
   doing a job instead of decorating one.

   Nothing replaces it here. A 340px dark band with an eyebrow and one
   line of headline is the shape /pricing and /privacy already open
   with, so the page now has a quiet opening and its one photograph
   where the story starts. */

/* LEFT AND LOW. The three service pages centre their heroes because
   they are making a case to a room; this one is introducing a person,
   and a name plate sits at the foot of the picture. */
/* CENTRED, unlike the letter under it. The hero is a title page and the
   letter is the page after it -- one is centred type, the other is a
   centred block of left-aligned type, which is the difference between a
   heading and something written. */
.ab12-hero-copy{
  position:relative;z-index:2;align-self:flex-start;
  max-width:900px;margin:0 auto;text-align:center;
}
.ab12-hero h1{
  font-family:'League Spartan',sans-serif;font-weight:700;
  font-size:var(--n12-h1);line-height:.98;letter-spacing:-.04em;
  text-transform:lowercase;color:var(--ab-cream);
  margin:12px 0 20px;
}
.ab12-hero p{
  font-size:15px;line-height:24px;color:rgba(246,241,234,.68);
  margin:0 auto;max-width:none;
}

/* ------------------------------ the bands ------------------------------ */
.ab12-band{padding:118px 0;position:relative}
/* 84 into the first band. See the note in contact-n12.css: only the
   transition straight out of a hero is tightened. */
.ab12-hero + .ab12-band{padding-top:84px}
.ab12-band--lift{background:var(--ab-ground)}
.ab12-band--dark{background:var(--ab-ground-dark)}

/* --------------------------- where it started ---------------------------
   Heading left, prose right -- the same two-column shape the origin
   section already had, on the site's measure. */
.ab12-origin{
  display:grid;grid-template-columns:minmax(0,.78fr) minmax(0,1.22fr);
  gap:0 clamp(40px,6vw,96px);
}
/* THE PROSE STARTS LEVEL WITH THE HEADLINE, not with the eyebrow. The
   left column is an eyebrow then an h2; the right column began at the
   top of the grid row, so its first line sat beside the EYEBROW and the
   body copy appeared to float above the heading it belongs to.

   27px, measured rather than guessed: 58 was the obvious arithmetic --
   the eyebrow's line box plus the h2's top margin -- and it overshot by
   31, because the h2's own line box already carries leading above its
   cap height. Set, measured, corrected. */
.ab12-origin-copy{padding-top:27px}
.ab12-origin-copy > p:first-child{
  font-size:21px;line-height:1.5;color:var(--ab-cream);
}
.ab12-origin-copy > p{max-width:66ch}

/* .ab12-quote is gone. It styled two pull quotes that have both been
   removed -- "we still use everything we build" from the founder band
   and "people make the decisions" from the systems band -- and nothing
   on the page carries the class now. */

/* ---------------------------- who is behind it ----------------------------
   The old section said, at length, that an operator runs this. It could
   have described any operator-led consultancy. The band now carries one
   number, because one number does what three paragraphs of positioning
   could not.
   ------------------------------------------------------------------------ */
/* A MEASURED COLUMN, NOT THE REST OF THE ROW.

   Two numbers were doing the damage. align-items:center dropped the
   portrait 76px below the eyebrow, so the picture floated against the
   middle of the biography instead of introducing it -- there was no
   line anywhere in the section that both columns shared. And letting
   the copy take whatever was left of a 1209px wrap made the measure
   794px: about 105 characters a line, which is a wall rather than a
   paragraph.

   290 and 680 with 72 between them is 1042 of the 1140 container. The
   portrait, the name and the first line of prose all start on the same
   pixel, and the longest line is 88 characters. */
/* AND IT OVERRIDES .ab12-wrap'S PADDING. box-sizing is border-box on
   this page, so a 1140px max-width on top of the wrap's 115px gutters
   left 910px of content -- the 680 column came out at 548 and the
   measure was narrower than the spec, not wider. The container is the
   inset as a margin instead: 1140 where there is room for it, the
   gutter where there is not. */
/* WIDER. 1140/680 was sized against a band with nothing behind it; with
   the warehouse under it the copy needs to hold more of the frame or
   the picture reads as the subject and the words as a caption on it.
   1320 and 820 is the same ratio at the width the band actually has. */
/* AND NOW IT IS ONE COLUMN, BECAUSE IT IS A LETTER. The two-column
   grid existed to put a 290px portrait beside the prose; the portrait
   is a 72px stamp at the sign-off now, so there is nothing to sit
   beside. 780px is the measure a page of correspondence wants -- about
   72 characters -- and one narrow column over a wide photograph is a
   composition, where a portrait over a photograph of a room is two
   pictures arguing. */
/* UNDER THE HERO TEXT, not centred in the band. The letter began at
   330px on a 1440 page while "built from the operator's seat." began
   at 115 -- two left edges, 215px apart, on consecutive sections. The
   margin goes and the column hangs off the page gutter, so the first
   word of the letter sits directly under the first word of the
   headline. */
/* CENTRED IN THE PAGE, LEFT-ALIGNED INSIDE ITSELF. The block sits in
   the middle of the band -- so the margin off the left edge is much
   larger than the page gutter -- while every line in it still starts on
   the same left edge. Centring the TEXT would make it a poster; this is
   a letter that happens to be in the middle of the paper. */
.ab12-operator{
  display:block;
  width:min(860px, calc(100% - 2 * var(--ab-inset)));
  padding:0;margin:0 auto;
}
.ab12-operator-copy > p{max-width:none}

/* The label and the clay rule are both out of the markup now. The hero
   two lines above says "about next 12" and "built from the operator's
   seat"; a third marker before the first sentence was announcing the
   same thing again. */
/* 96px, not the band's 118. The section is a profile, not an argument;
   it does not need a full band's worth of air around it. */
/* (0,2,0) to beat .ab12-hero + .ab12-band, which is the same weight and
   earlier in the file -- this band is the first one after the hero. */
/* 30px off the headline, not 164. The hero's 60px tail plus this band's
   104px top padding put the clay rule most of a screen below the line
   it is meant to be answering, and with the hero flat dark there is
   nothing in that space at all. The picture now starts right under the
   headline and fades up out of the page's own colour, so there is no
   edge where the band begins. */
/* 14, down from 30. The hero has no bottom padding, so this number is
   the entire gap between the headline and the first line of the letter
   -- it measured 50px, which is a section break between two things that
   are meant to read as a title page and the page after it. */
.ab12-band--founder{position:relative;overflow:hidden;padding:14px 0 104px}
.ab12-hero + .ab12-band--founder{padding-top:14px}

/* ------------------ THE WAREHOUSE, ONE SECTION LOWER ------------------
   It was the hero's picture, sitting behind "built from the operator's
   seat" -- a photograph of a place under a line about a person. Behind
   "who's behind it" it is the room that person runs, which is the same
   plate doing a job instead of decorating one.

   Held well back: brightness .38 under a scrim that pools where the
   copy is and closes on the band's own colour top and bottom, so the
   picture has no edges and the prose keeps its contrast. This band
   carries four paragraphs of body text -- it is a ground, not a hero. */
/* THE PICTURE BELONGS TO .ab12-top, NOT TO THE BAND. It has to start at
   the very top of the page -- behind the masthead and the headline --
   and carry on down behind the letter. Two backgrounds on two sections
   cannot do that without matching scale and offset by hand at every
   width; one background on the element that contains both of them is
   the same picture, whole, by construction. */
/* NO isolation, AND NO z-index ON THE CHILDREN. Both were here to keep
   the picture behind the copy, and both broke the mobile menu on this
   page: `isolation:isolate` makes .ab12-top a stacking context, and
   `> * {z-index:1}` makes one of the HERO too -- and the masthead, with
   its position:fixed full-screen menu, lives inside that hero. A fixed
   element cannot escape a stacking context, so the panel was being
   painted inside the top block instead of over the page.

   None of it is needed. .ab12-top is position:relative with z-index
   auto, so it creates no context, and its ::before at z-index 0 sits in
   the same paint group as the two sections -- which are already
   position:relative -- where document order decides. The picture is
   first in the DOM, so it is behind. */
.ab12-top{position:relative}
.ab12-top::before{
  content:"";position:absolute;top:0;left:0;z-index:0;
  /* THE LAYER IS THE PICTURE'S OWN SHAPE, not the block's.

     inset:0 made this box as tall as the hero and the letter together,
     so the photograph -- drawn at full width, which fixes its height --
     ended partway down it and stopped on a line. Given the plate's own
     aspect-ratio the box IS the photograph: `cover` fills it exactly,
     nothing is cropped, and the mask below can fade the image's own
     bottom edge because the bottom of the box is the bottom of the
     image at every width. */
  width:100%;aspect-ratio:1883 / 835;height:auto;
  background-image:url('/assets/images/about-hero-2200.jpg');
  background-image:image-set(
    url('/assets/images/about-hero-2200.avif') type("image/avif"),
    url('/assets/images/about-hero-2200.webp') type("image/webp"),
    url('/assets/images/about-hero-2200.jpg')  type("image/jpeg"));
  /* THE WHOLE PLATE, AT FULL WIDTH, FROM THE TOP.

     `100% auto` is the only sizing that shows all of it: cover crops
     whichever axis is not binding, and contain pillarboxes. At 1440
     the plate draws 1440x639 -- its own proportions, nothing cut -- and
     it starts at the top of the page because this block does.

     The box is usually taller than that (the hero and the letter came
     to 765 at 1440), so the gradient below fades the picture's bottom
     edge into the ground rather than letting it stop at a line. */
  /* ZOOMED, AND AIMED RIGHT. At `cover` the plate draws exactly 1440
     wide and she stands at 74% of it -- x1066, which is inside the
     letter column (290..1150). Sizing by height instead buys horizontal
     travel: 122% renders 1,755 across, putting her at x1299, in the gap
     between the last line of type and the right edge of the screen. */
  background-size:auto 122%;
  background-position:0% 55%;
  background-repeat:no-repeat;
  /* the scrim, as a filter rather than a second element -- doing it
     here means the fades below take the picture AND its dimming out
     together.

     .28, down from .58, then .5, then .38. The letter is three
     paragraphs of 15px cream running the full width of the picture,
     and the warehouse floor behind it is the brightest part of the
     frame -- the reflections were coming up under the type. Each step
     back has been because the reading, not the photograph, is what
     this band is for. At .28 the room is still legible as a room and
     the prose has a flat ground.

     AND THE COLOUR COMES BACK A STEP. The band had no saturate at all,
     which is why the sodium lights in the bay doors were reading
     orange behind cream type -- the one warm thing on a page that is
     otherwise a letter. .82 keeps the room warm without the lamps
     competing; the phone block below already ran .8 for the same
     reason and can now come down with it. */
  filter:saturate(.82) brightness(.28);
  /* IT FADES AT BOTH ENDS. The bottom fade was already here, so the
     picture did not stop on a line partway down the block. The top one
     is new: the photograph now begins at the very top of the page,
     behind the masthead, and without this it started on an edge
     instead of emerging out of the page's own dark. */
  -webkit-mask-image:linear-gradient(180deg,
    rgba(0,0,0,0) 0%, #000 14%, #000 70%, rgba(0,0,0,0) 100%);
  mask-image:linear-gradient(180deg,
    rgba(0,0,0,0) 0%, #000 14%, #000 70%, rgba(0,0,0,0) 100%);
}
/* .ab12-top TAKES THE PLATE'S OWN PROPORTIONS. 1883x835 is 2.255:1, so
   at any desktop width the block holding the hero AND the letter is
   exactly as tall as the picture needs, and cover shows all of it with
   nothing cropped and no bars.

   It is on the wrapper rather than the band because the picture now
   starts at the top of the page: the hero is part of the frame.

   aspect-ratio sets the PREFERRED height, so if the letter ever grows
   past it the block still grows rather than clipping the text -- it is
   a floor, not a fixed height.

   Desktop only. The phone has its own 1.3:1 crop of this scene and its
   own treatment, and forcing a 2.255:1 block onto a 440px screen would
   make a 195px letterbox strip of it. */
@media(min-width:1025px){
  /* A FLOOR, NOT A RATIO. The block has to be AT LEAST as tall as the
     picture it is drawing at full width, or the bottom of the frame
     would fall outside it. Above that it grows with the letter, and
     the gradient handles whatever is left over. */
  .ab12-top{min-height:calc(100vw / 2.255)}
  /* and the two sections inside it stop painting over the picture */
  .ab12-hero{background:transparent}
  .ab12-band--founder{background:transparent}
}
/* THE POOL FOLLOWS THE LETTER LEFT. It was centred when the column
   was; with the column hung off the page gutter the dark has to sit
   over the left half and the warehouse opens out to the right, where
   she is walking in the frame. */
/* THE SCRIM IS OFF. She asked to see the plate at full size with no
   fade on it before deciding how much to put back, so this is a single
   flat wash -- just enough that cream type on the lit part of the
   warehouse floor still clears contrast, and nothing that shapes or
   hides the picture.

   The version it replaces is kept below, commented, because it is two
   passes of tuning and the numbers in it are measured ones. */
/* NO SECOND LAYER. The dimming is the ::before's own brightness now and
   the fade is its own mask, both tied to the picture rather than to the
   block, so there is nothing left for an overlay to do -- and an
   overlay spanning the whole block was lightening the flat ground below
   the picture, which is the other half of why the edge showed. */
/* .ab12-band--founder::after{
     background:
       radial-gradient(ellipse 58% 78% at 33% 50%,
         rgba(15,13,12,.76) 0%, rgba(15,13,12,.68) 44%,
         rgba(15,13,12,.42) 76%, rgba(15,13,12,.2) 100%),
       linear-gradient(180deg,
         var(--ab-ground-dark) 0%, rgba(15,13,12,.4) 14%,
         rgba(15,13,12,.4) 84%, var(--ab-ground-dark) 100%);
   } */
.ab12-band--founder > *{position:relative;z-index:2}

/* THE PORTRAIT IS A CIRCLE, and the only one on the site.

   It was a 420px rectangle with the name set over the bottom of the
   photograph behind a scrim -- which made it one more card on a page
   already built from cards, and put type over a face. A circle gives
   the page a human focal point and breaks the grid; the caption sits
   underneath where it can simply be read. */
/* NOTHING UNDER THE CIRCLE. The name and role were captioned here AND
   written again in the paragraph beside it, so the section opened with
   two introductions to the same person. Everything that is words is on
   the right now; this is only the photograph.

   290, not 320: it sits against a text block rather than a caption, and
   at 320 it was competing with the heading for the eye.

   The old .ab12-profile h3/p declarations and the tablet min-height:460
   are gone with it -- all three belonged to the rectangular version. */
/* TOP OF THE COLUMN, not the middle of it. flex + align-items:center
   inside a grid cell that is as tall as the biography was the second
   half of the 76px drop -- the grid was centring the cell and the flex
   box was centring the picture inside it. */
/* ---------------------------- THE SIGN-OFF ----------------------------
   The circle is 72px at the foot of the letter now, not 290 at the head
   of a profile. A headshot at the top of four paragraphs is a team
   member card; the same photograph beside a signature is a person
   putting their name to what they just said. */
/* LEFT, UNDER THE LETTER. It was centred on the column, which put the
   signature in a different place from every line above it -- the prose
   is left-aligned, so a centred sign-off under it reads as two
   decisions rather than one. A letter signs off on the same edge it was
   written on. */
.ab12-profile{
  display:flex;align-items:center;justify-content:flex-start;gap:18px;
  margin:44px 0 0;padding:0;border-top:0;
}
.ab12-profile figcaption{min-width:0}
/* DIRECT CHILD ONLY. The signature is a <picture> too, and it lives
   inside the same <figure> -- so an unscoped .ab12-profile picture put
   her name in a 76px circle with the portrait's crop and scale on it. */
.ab12-profile > picture{
  flex:0 0 auto;
  display:block;
  /* 76, down from 104. It is a stamp beside a signature, not a
     portrait -- and the tighter crop below does the work the extra
     28px was doing. */
  width:76px;height:76px;
  border-radius:50%;overflow:hidden;
  /* a warm grey line rather than a cream one -- it reads as the edge of
     the photograph, not as a ring drawn around it. No shadow and no
     glow: the circle is already the only round thing on the site. */
  border:1px solid rgba(193,160,150,.28);
  background:var(--ab-ground);
}
/* ZOOMED ON THE FACE. object-position alone cannot do this -- it moves
   the crop, it does not tighten it -- so the image is scaled and the
   transform-origin is set to the SAME point as the object-position.
   A plain scale() magnifies about the element's centre, which
   re-centres the crop and undoes the object-position; this is the trap
   the blog hero's lightbulb fell into.

   1.18 at 20%, loosened from 1.45 at 14%. The tighter pair cut the top
   of her head off against the ring, which at 76px reads as a mistake
   rather than as a crop. This one holds the whole head with a little
   air above it and lands the cut at the shoulders. */
.ab12-profile > picture img{
  width:100%;height:100%;display:block;
  object-fit:cover;object-position:50% 20%;
  transform:scale(1.18);transform-origin:50% 20%;
  /* down a step, so the portrait sits in the page's light instead of
     being the brightest object on a very dark screen */
  filter:saturate(.88) brightness(.94);
}

/* THE IRIS. The portrait arrives through its own circular mask rather
   than sliding up like a paragraph -- it is the one element in the
   section that is not type. clip-path does not interpolate from `none`,
   so the hidden state snaps in and only the opening animates, which
   sidesteps the reverse-transition trap the base reveal had.

   .42s inside the 240ms fade means the whole section resolves in well
   under 600ms. Reduced motion needs no rule here: the script drops .rv
   from <html> entirely, and every selector below is scoped to it.

   THE CHILD COMBINATOR IS THE POINT. There are two <picture>
   elements in this figure, the portrait and the signature, and an
   unscoped descendant selector clipped the signature to a circle too:
   circle(50%) on the signature's 766x73 box resolves to a 272px radius
   about its centre, which cuts everything left of x=111 -- the render
   read "ia Petukhova". */
.rv .ab12-profile[data-rv] > picture{
  clip-path:circle(38%);
  transition:clip-path .42s cubic-bezier(.16,1,.3,1) var(--rv-d,0ms);
}
.rv .ab12-profile[data-rv].is-rv > picture{clip-path:circle(50%)}

/* Her name, as the section's heading -- and NOT lowercased. .ab12 h2
   sets text-transform:lowercase for the band headings, which rendered
   this as "anastasia petukhova". A person's name is the one heading on
   a site that cannot be restyled into lower case.

   .ab12 h2.ab12-name, because .ab12 h2 is (0,1,1) and a bare
   .ab12-name is (0,1,0) -- the plain class lost, which is exactly what
   the first attempt did. */
/* THE SIGNATURE, IN THE SITE'S OWN HAND.

   Caveat 700 -- the face the planning hero's supporting line and every
   margin note beside the plan are written in. Kalam was a second
   handwriting for no reason other than that the article pages happened
   to load it.

   42px because Caveat runs small for its point size; planning sets its
   hero line at 30 and that is a caption, not a name. A degree and a
   half of rotation is the difference between a signature and a label
   set in a script font. */
/* IT IS HER REAL SIGNATURE NOW, so there is no typeface left to argue
   about. Eighteen script faces were tried -- copperplates, brush hands,
   the planning page's marker -- and every one of them read as a font
   pretending. Gistesy is Canva-only and cannot be served as a webfont,
   so this is the rendered artwork instead: cropped to its ink, 900px
   wide for a 300px slot, white on transparent.

   The h2 keeps its role -- the alt text carries the name, so the
   heading still has an accessible name and the outline is unbroken. */
.ab12 h2.ab12-name{
  margin:0;line-height:0;
}
.ab12-name picture{display:block}
.ab12-name img{
  display:block;
  width:min(300px,100%);height:auto;
  /* the artwork is pure white; the site's cream is #F6F1EA, and .93
     brightness with a trace of sepia lands on it rather than sitting a
     shade brighter than every other piece of type on the page */
  filter:brightness(.96) sepia(.06);
}

/* The drawn stroke under the name is gone. It was the planning hero's
   ink reused, and under a signature it read as an underline rather than
   as a flourish -- the name is doing the work on its own. */

/* ---------------------------- AND IT WRITES ITSELF ----------------------------
   The planning hero's ink draws with stroke-dashoffset, which only
   works on an SVG path -- there is no path here, there is a word. The
   equivalent for type is a mask that uncovers it left to right:
   mask-size goes from 0% to 100% of the width, and the gradient's soft
   tail means the last few pixels of each letter arrive slightly after
   the first, which is what reads as a nib moving rather than a curtain
   opening.

   IT PLAYS ON LOAD, NOT ON SCROLL, and that is deliberate. The reveal
   script never hides anything within a viewport and a half of the top
   -- correctly, so nothing a reader is already looking at is blank
   first -- and measured, the sign-off sits at 1,170px on a 900px
   desktop window, which is inside that 1,350px horizon. So it was
   never being marked and the signature never wrote itself at all on a
   desktop, while firing normally on a phone where the same block is
   1,900px down. Viewport-dependent is worse than early, so the figure
   is an onLoad item now: always marked, always released two frames
   after the page is ready. On a phone that means it writes below the
   fold and you will probably miss it.

   The 1.05s is deliberately longer than anything else on the page: a
   signature is the one thing you are meant to watch happen.

   The base .rv [data-rv] fade is cancelled on the name itself, so it
   is not fading in AND being written at the same time. */
.rv .ab12-profile[data-rv] .ab12-name{
  -webkit-mask-image:linear-gradient(90deg,#000 0 86%,rgba(0,0,0,0) 100%);
  mask-image:linear-gradient(90deg,#000 0 86%,rgba(0,0,0,0) 100%);
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-size:0% 100%;mask-size:0% 100%;
  transition:
    -webkit-mask-size 1.05s cubic-bezier(.32,.72,.36,1) .22s,
    mask-size 1.05s cubic-bezier(.32,.72,.36,1) .22s;
}
/* 118%, not 104. A copperplate's last glyph carries a tail that runs
   past the element's own box, so a mask that stops at 104 leaves the
   final letter permanently half-faded. */
.rv .ab12-profile[data-rv].is-rv .ab12-name{
  -webkit-mask-size:118% 100%;mask-size:118% 100%;
}
/* the measuring pass must not animate the mask either -- same reason
   the base reveal has its .rv-setting rule */
.rv.rv-setting .ab12-profile[data-rv] .ab12-name{transition:none}
@media(prefers-reduced-motion:reduce){
  .rv .ab12-profile[data-rv] .ab12-name{
    -webkit-mask-image:none;mask-image:none;transition:none;
  }
}
/* .ab12-operator-copy > p is (0,1,1) and both of these are <p> children
   of it. A bare class is (0,1,0) and loses -- the same specificity trap
   that once lower-cased her name. Qualified, they are (0,2,1). */
/* the role moved into the signature with the name, so it is no longer a
   child of .ab12-operator-copy and the qualifier comes off with it */
.ab12-profile .ab12-role{
  margin:8px 0 0;
  font-family:'Questrial',sans-serif;
  font-size:14px;line-height:1.45;color:rgba(246,241,234,.6);
}
/* THE LAST LINE IS NOT PART OF THE BUSINESS STORY. It is the one
   personal sentence in the section and it was running on from the
   paragraph about OCD as though it were the same thought. A rule and
   18px of air above it, and a step brighter than the body copy -- not a
   card, not a pull quote, not an aside. */
/* NO RULE, AND THE SAME SIZE AS EVERYTHING ELSE. The line had a border
   above it and its own colour, which made one sentence about a German
   Shepherd look like a footnote with legal weight. It is the last thing
   she says; it can just be the last paragraph. */
.ab12-operator-copy > p.ab12-personal{
  margin:0;padding-top:0;border-top:0;
  font-size:15px;line-height:24px;color:rgba(246,241,234,.78);
}
/* .ab12-profile span / h3 / p are gone. All three styled the caption
   that used to sit inside the rectangular card, and the figure holds
   nothing but the photograph now. */
/* THE OPENING SENTENCE CARRIES THE SECTION. 20px and near-full cream
   against 16px at 78% for everything after it, so the eye has an
   obvious place to start -- it is the ONE step in the section now, with
   every paragraph under it set identically. */
/* ONE SIZE, ALL THE WAY THROUGH: 16.5px, which is what the service
   pages set their hero subtext at. The opening line keeps the brighter
   cream so there is still somewhere to start, but it is no longer a
   different size from the rest -- a letter is written at one size. */
.ab12-operator-copy .ab12-lead{
  font-size:15px;line-height:24px;color:var(--ab-cream);
  max-width:none;margin:0 0 20px;
}
/* Every paragraph after the opening is set identically -- the lead is
   the one and only step in the section. */
.ab12-operator-copy > p{
  max-width:none;margin:0 0 20px;
  font-size:15px;line-height:24px;color:rgba(246,241,234,.78);
}
.ab12-operator-copy > p:last-child{margin-bottom:0}

/* THE PROOF. 100 hours a week is the most concrete thing on the page and
   it was sitting inside a paragraph. It is set as a figure instead, in
   the ink the site writes figures in, with the traffic that produces it
   underneath -- so the claim carries its own arithmetic rather than
   asking to be taken on trust. */
/* ITS OWN STRIP, on a lighter ground behind a clay rule. Inside the
   founder band it blended into one long black area with the biography
   above it. 44px of padding, not another full band. */
.ab12-strip{
  background:#1E1A18;
  border-top:2px solid var(--ab-accent);
  padding:44px 0;
}
.ab12-proof{
  display:grid;grid-template-columns:auto minmax(0,1fr);
  gap:0 40px;align-items:center;
  margin:0;padding:0;
  border:0;
}
.ab12-proof b{
  font-family:'League Spartan',sans-serif;font-weight:700;
  font-size:clamp(58px,7vw,88px);line-height:.88;letter-spacing:-.04em;
  color:var(--ab-ink);
}
.ab12-proof b small{
  display:block;margin-top:8px;
  font-family:'Questrial',sans-serif;font-weight:700;
  font-size:12px;letter-spacing:.14em;text-transform:uppercase;
  color:rgba(169,184,198,.72);
}
.ab12-proof p{margin:0;font-size:17px;line-height:1.6;max-width:44ch;color:rgba(246,241,234,.8)}
.ab12-proof-link{
  display:inline-flex;align-items:center;gap:9px;
  margin:12px 0 0;padding-bottom:3px;
  font-family:'Questrial',sans-serif;font-size:14.5px;font-weight:700;
  letter-spacing:.03em;color:var(--ab-accent-hi);text-decoration:none;
  border-bottom:1px solid rgba(201,144,132,.4);
  transition:border-color .2s ease,color .2s ease;
}
.ab12-proof-link:hover{color:#E0A294;border-bottom-color:#E0A294}
.ab12-proof-link svg{width:16px;height:16px;transition:transform .2s ease}
.ab12-proof-link:hover svg{transform:translateX(4px)}

/* ------------------------------ how we think ------------------------------
   One rule between the four, drawn by the grid's own gaps rather than by
   a border on every cell -- the old page drew four boxes. */
/* 42px, not 30: the pull quote that used to sit between this heading
   and the three roles is gone, and it was carrying the gap. */
/* 900, not 720, and the lede uncapped. 66ch at 16px is 581px, which
   broke one 197-character sentence over three lines in a band that has
   1210px to give it. Measured: 1743px of text over two lines wants
   about 872px of measure, so 900 is the first round number that fits
   it. */
.ab12-principles-head{max-width:900px;margin:0 0 42px}
.ab12-runs-lede{
  margin:0;max-width:none;
  font-size:15px;line-height:24px;color:rgba(246,241,234,.68);
}
.ab12-principles--three{grid-template-columns:repeat(3,minmax(0,1fr)) !important}
/* AND THE THREE COLUMNS SHARE THEIR ROWS.

   Each article is a label, a heading and a paragraph. Between about
   1025 and 1400 the first heading -- "the direction and the
   decisions." -- takes two lines while the other two take one, so its
   paragraph started 27px below theirs and the row read as stepped.
   Measured at 1180: bodies at 563, 536, 536.

   subgrid rather than a min-height on the heading. A floor would have
   to be two lines at every width, which buys a blank line under all
   three headings at 1440 and 1728 where none of them wraps. With the
   articles adopting the parent's row tracks, the heading track is
   simply as tall as the tallest heading at whatever width happens to
   be on screen, and the labels, headings and paragraphs each start on
   one line.

   Scoped to the three-up layout: below 1025 this block is one column
   and there is nothing to align across. */
@media(min-width:1025px){
  .ab12-principles--three{grid-template-rows:auto auto auto}
  .ab12-principles--three .ab12-principle{
    display:grid;
    grid-template-rows:subgrid;
    grid-row:span 3;
    /* the article's own padding stays on the article, so the rule above
       each column still sits where it did */
    row-gap:0;
  }
}
/* a role label, not a bare numeral */
.ab12-principles--three .ab12-principle span{
  font-family:'Questrial',sans-serif;
  font-size:11.5px;letter-spacing:.15em;text-transform:uppercase;
}
/* NO BOXES. Four bordered cells with hover states read as four products
   on a pricing page, which is the one thing this section is not -- these
   are principles, and they should look like something written down
   rather than something for sale.

   A rule above each, no rule around any, no hover, and the padding down
   to what separates them. The grid's column gap does the rest. */
.ab12-principles{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0 clamp(40px,5vw,80px);
}
.ab12-principle{
  padding:26px 0 30px;
  border-top:1px solid var(--ab-rule);
  transition:border-color .22s ease;
}
/* 88px, not the band's 118. The content is three short columns and the
   section was carrying more empty space than it needed above and below
   them. */
/* THE DARKER GROUND. It carried --lift (#171413) so it would step up
   off the founder band; with the warehouse behind that one there is
   nothing to step off, and the lighter panel read as a different page
   between two dark ones. (0,2,0) to beat .ab12-band--lift, which is
   (0,1,0) and earlier in the file. */
.ab12-band--runs{padding:88px 0}
.ab12-band.ab12-band--runs{background:var(--ab-ground-dark)}

/* HOVER MOVES THE RULE AND THE LABEL, AND NOTHING ELSE MOVES POSITION.
   The heading used to step 3px right with it. On three columns side by
   side that reads as the text jumping rather than as the column
   responding -- the colour change already says the same thing without
   anything shifting under the eye. */
.ab12-principle:hover{border-top-color:var(--ab-accent)}
.ab12-principle span{
  display:block;
  font-family:'League Spartan',sans-serif;font-weight:700;
  font-size:12px;letter-spacing:.16em;color:var(--ab-accent);
  transition:color .22s ease;
}
.ab12-principle:hover span{color:var(--ab-accent-hi,#C99084)}
/* NO text-transform. The headings are already written in the case they
   should render, and forcing lowercase turned "use AI where it makes
   sense." into "use ai". Third time this rule has eaten an initialism
   on this site. */
.ab12-principle h3{
  font-family:'League Spartan',sans-serif;font-weight:700;
  font-size:25px;line-height:1.06;letter-spacing:-.03em;
  color:var(--ab-cream);
  margin:20px 0 12px;
}
.ab12-principle p{font-size:15px;line-height:1.6;max-width:44ch;margin:0}

/* ------------------------------- the close -------------------------------
   THE ROAD GOES BEHIND IT. The band was a flat dark rectangle at the
   end of a page whose other four sections all carry something, and the
   last thing a visitor sees before the footer was the plainest thing on
   the page.

   The plate is 1916x821 shot at blue hour with the light in a narrow
   band on the horizon and the whole foreground in shadow -- so the
   middle third, where the heading, the paragraph and both CTAs sit,
   needs almost no scrim to stay legible. What is here is a centre pool
   for the type and a close to the band's own colour at top and bottom,
   so the picture has no edges. */
.ab12-close{position:relative;overflow:hidden;text-align:center}
.ab12-close::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-image:url('/assets/images/about-close-road2-1900.jpg');
  background-image:image-set(
    url('/assets/images/about-close-road2-1900.avif') type("image/avif"),
    url('/assets/images/about-close-road2-1900.webp') type("image/webp"),
    url('/assets/images/about-close-road2-1900.jpg')  type("image/jpeg"));
  /* 40%: this plate is 1915x821 against a band of about 1440x430, so
     cover keeps a little over half its height. 40 holds the horizon
     glow and the near foreground and drops the empty sky at the top. */
  background-size:cover;background-position:center 40%;background-repeat:no-repeat;
  /* AND NOTHING TO CORRECT. The plate this replaces measured R-B +21
     with green at -6.3, which is why it needed a saturation push and
     briefly a sepia -- and the sepia WAS the green, because sepia lifts
     G against R and B. This one measures R-B +30.2 and green -13.5
     raw: home's warmth exactly, with less green than any filtered
     version of the old one. It only wants dimming. */
  filter:brightness(.88);
}
.ab12-close::after{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    radial-gradient(ellipse 62% 58% at 50% 52%,
      rgba(15,13,12,.82) 0%, rgba(15,13,12,.6) 44%,
      rgba(15,13,12,.22) 74%, rgba(15,13,12,0) 100%),
    /* A SOFT EDGE, NOT A HAZE. The original ran from SOLID
       --ab-ground-dark at 0% to .45 at 16%, so the picture arrived out
       of a black fade across the top eighth of the band and the sky
       never got to be a sky. Flattening it entirely went too far the
       other way and the band started on a hard line. .52 closing to .3
       over the first 10% is the middle: the photograph is present at
       the very top edge and still settles into the section above it. */
    linear-gradient(180deg,
      rgba(15,13,12,.52) 0%, rgba(15,13,12,.3) 10%,
      rgba(15,13,12,.26) 42%, rgba(15,13,12,.4) 100%);
}
.ab12-close > *{position:relative;z-index:2}
.ab12-close .ab12-eyebrow,
.ab12-close h2,
.ab12-close p{margin-left:auto;margin-right:auto}
/* THE CLOSING BAND IS A BAND HEADING, not a second hero. It was
   running at 50px over a 16px paragraph against planning's closing
   block, which is 38/15 -- and planning's is the one every other page
   follows. Same numbers here now. */
/* WIDER MEASURES. 22ch broke a nine-word headline over two lines and
   64ch broke a two-sentence paragraph over three, in a band that has
   1210px to give them. 34 and 78 let both of them use the room. */
.ab12-close h2{
  max-width:34ch;
  font-size:clamp(30px,3.2vw,38px);line-height:1.04;letter-spacing:-.035em;
}
.ab12-close p{
  max-width:78ch;margin-bottom:28px;
  font-size:15px;line-height:24px;
}
.ab12-close-actions{
  display:flex;align-items:center;justify-content:center;gap:26px;flex-wrap:wrap;
}
/* cream, not clay -- the same call this page's siblings make, and the
   underline is a border, which colour does not touch. */
.ab12-close-actions .n12-cta-3{
  color:var(--ab-cream);border-bottom-color:rgba(246,241,234,.32);
}
.ab12-close-actions .n12-cta-3 svg{stroke:var(--ab-cream)}
.ab12-close-actions .n12-cta-3:hover{color:#fff;border-bottom-color:rgba(255,255,255,.6)}
.ab12-close-actions .n12-cta-3:hover svg{stroke:#fff}

/* ------------------------------- narrower ------------------------------- */
@media(max-width:1024px){
  .ab12-origin{grid-template-columns:1fr;gap:34px 0}
  /* .ab12-operator needs no stacking rule any more -- it is a single
     column at every width now, and only its measure changes. */
  .ab12-operator-copy{text-align:left}
  .ab12-principles--three{grid-template-columns:1fr !important}
}
@media(max-width:760px){
  .ab12-band{padding:76px 0}
  /* the same close-up on a phone: the hero's 64px tail plus this band's
     64px top was 128px of nothing between the headline and the rule */
  .ab12-band--founder,
  .ab12-hero + .ab12-band--founder{padding:12px 0 64px}
  .ab12-band--runs{padding:64px 0}
  .ab12-strip{padding:34px 0}
  /* 112px, the blog masthead's phone number -- the four rebuilt heroes
     start their type on the same line. */
  .ab12-hero{min-height:0;padding:128px var(--ab-inset) 0}
  /* HER OWN CROP, now under the founder band rather than the hero. She
     stands at 74% across a 2.2:1 frame, so a 390-wide cover of the
     desktop plate lands on empty floor -- the same problem the pricing
     hero's gold bars had. 32KB instead of 189.

     The scrim goes vertical here too: at phone width there is no "left
     column" for a 90deg gradient to protect, the copy is the full
     width of the screen. */
  /* ON A PHONE THE PICTURE STAYS IN THE BAND. Starting it at the top of
     the page is a desktop decision -- there the hero is 200px of a
     765px block and the photograph has room to be a scene behind both.
     On a 440px screen the hero is most of the first viewport and the
     letter is three more, so one picture across both would either be a
     blur or a letterbox. The wrapper's layer is off here and the band
     carries its own 1.3:1 crop, as it did. */
  .ab12-top::before{display:none}
  .ab12-band--founder{position:relative;overflow:hidden}
  .ab12-band--founder::before{
    content:"";position:absolute;inset:0;z-index:0;
    width:auto;aspect-ratio:auto;height:auto;
    -webkit-mask-image:none;mask-image:none;
    background-repeat:no-repeat;
    background-image:url('/assets/images/about-hero-mobile-880.jpg');
    background-image:image-set(
      url('/assets/images/about-hero-mobile-880.avif') type("image/avif"),
      url('/assets/images/about-hero-mobile-880.webp') type("image/webp"),
      url('/assets/images/about-hero-mobile-880.jpg')  type("image/jpeg"));
    /* COVER, WHICH THIS RULE NEVER SET. background-size was inherited
       from the desktop block's `auto 190%`, and 190% of a 695px band is
       1,320px tall by 2,977 wide on a 440px screen -- a seven-times
       blow-up of a 880px plate, which is why the background was an
       unreadable blur of one shoulder. This plate is already cropped
       to 1.3:1 with her whole figure and the bay doors in it; cover is
       all it needs.

       And brighter. .32 under a .72 scrim left almost nothing to see.

       31%, NOT 21% AND NOT 52%. The plate renders 888 wide in a 440
       band and she stands at 55% of it, so her rendered x is 488 and
       the offset is P x 448. 21% put her at 394 -- her shoulder and
       arm ran off the right edge on a 440 phone, which is the whole
       screen on a 16 Pro Max. 31% pulls the plate 46px further left
       and lands her at 349, with her full width inside the screen and
       about 25px of air to the edge, still right of every line of
       type. */
    background-size:cover;
    background-position:31% 50%;
    /* .72, a step down with the desktop band -- same picture, same
       reason: the bay lights were the loudest colour on the page */
    filter:saturate(.72) brightness(.52);
  }
  /* AND THE RIGHT-HAND CORNER STAYS LIGHT. The scrim was flat across
     the width, so holding the letter's contrast meant dimming the one
     part of the frame worth seeing. A 90deg pass darkens the left,
     where every line of type begins, and releases to nothing on the
     right, where she is. */
  .ab12-band--founder::after{
    content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
    background:
      linear-gradient(90deg,
        rgba(15,13,12,.34) 0%, rgba(15,13,12,.14) 58%,
        rgba(15,13,12,0) 100%),
      linear-gradient(180deg,
        var(--ab-ground-dark) 0%, rgba(15,13,12,.5) 12%,
        rgba(15,13,12,.5) 88%, var(--ab-ground-dark) 100%);
  }
  .ab12-band--founder > *{position:relative;z-index:2}
  /* THE LETTER COMES OFF THE EDGE. 20px is the site's phone gutter and
     it is right for a hero headline; for four paragraphs of body copy
     running the full width it reads as type pinned to the screen. 28
     gives it a margin to sit in without breaking step with the hero
     above, which is centred anyway. */
  .ab12-operator{width:calc(100% - 56px)}
  /* the sign-off comes down a step on a phone -- 84 rather than 104,
     and the signature with it */
  .ab12-profile{gap:16px;margin-top:34px;padding-top:0}
  .ab12-profile > picture{width:64px;height:64px}
  .ab12-name img{width:min(230px,100%)}
  .ab12-profile .ab12-role{font-size:13px}
  /* the letter is 15/24 at every width now, the same as every other
     subtext on the site -- nothing to override here */
  .ab12-operator-copy .ab12-lead,
  .ab12-operator-copy > p,
  .ab12-operator-copy > p.ab12-personal{margin-bottom:20px}
  /* AND IT BREAKS WORDS, so the right edge stops looking empty.
     The gutters here are already even -- measured, 28px of inset on
     both sides -- but at a 384px measure the rag was 48px on the first
     paragraph and worse below it: whole lines stopping short while the
     one above ran to the edge, which reads as the column being pushed
     left. Hyphenation lets the long words split instead of jumping,
     and the ragged edge closes up to a few points.
     Left-aligned still, not justified: justify closes the edge
     completely but opens the word spacing, and this is a letter.
     `hyphens` needs the document language, which <html lang="en">
     gives it. */
  .ab12-operator-copy .ab12-lead,
  .ab12-operator-copy > p{-webkit-hyphens:auto;hyphens:auto}
  /* THE RULES ARE THE SEPARATORS. One column with no gap gave 56px of
     padding between blocks and no line where a reader's eye stops; 32px
     of gap with the top rule tight above each heading turns the three
     into a list. */
  .ab12-principles{grid-template-columns:1fr;gap:32px 0}
  .ab12-principle{padding:22px 0 0}
  .ab12-proof{grid-template-columns:1fr;gap:16px 0;align-items:start}
  .ab12-close-actions{flex-direction:column;align-items:stretch;gap:18px}
  .ab12-close-actions .n12-cta-3{align-self:center}
}
