/* ============================================================
   ABOUT PAGE — page-specific components
   ============================================================
   Rides on top of case-study.css (bands, frames, ribbon,
   typography). Rainbow theme (.theme-rainbow) set on <body>.

   Sections:
   · Hero hook — typographic, centered
   · Who I am — prose + wedding portrait + crying-lineup strip
   · Favorites / Fanatic — interests strip + 4-up game photos
   · How I think — prose + four principle cards (2×2)
   · What I'm looking for — prose + CTA
   ============================================================ */

/* ── Hero hook ─────────────────────────────────────────────── */
.about-hero {
  padding-top: var(--sp-7);
  padding-bottom: var(--sp-7);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--sp-3);
}

/* Hero portrait — rounded square, same frame treatment as every
   other photo on the page (the band's ribbon is ring enough) */
.about-headshot {
  width: 160px;
  height: 160px;
  object-fit: cover;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  margin-bottom: var(--sp-2);
}

/* ── Flip cards ─────────────────────────────────────────────
   Tilted photo card in the column beside a section's prose.
   Hover or focus straightens the card and flips it (3-D,
   rotateY) to a captioned back. Cards keep the site-wide photo
   frame; each back's dash is keyed to a ribbon stripe via --pc. */
.about-side {
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  align-items: stretch;
}

/* kicker + H2 + prose live inside the left cell so the card can
   top-align with the kicker and bottom-align with the last line */
.about-side-left {
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.pcard {
  position: relative;
  perspective: 1200px;
  outline: none;
  cursor: pointer;                  /* it flips: say so */
  transition: transform 0.3s var(--ease-out);
}
.pcard-side {
  width: 100%;
  max-width: 380px;
  height: 100%;                     /* row height = left column height */
  justify-self: end;
}
/* rest-state cue: a second card peeks out from behind the photo,
   offset and slightly rotated, so the pair reads as a stack with
   something on the other side. It tucks away as the card lifts
   and turns; the certificate back is what it was promising. */
.pcard::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;                      /* perspective makes .pcard a stacking context, so this sits behind the faces, above the page */
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
  transform: translate(10px, 10px) rotate(2.5deg);
  pointer-events: none;             /* the peek must not extend the hover area, or it drops hover as it tucks away */
  transition: transform 0.45s var(--ease-out), opacity 0.45s var(--ease-out);
}
.pcard:hover::before,
.pcard:focus::before { transform: translate(0, 0) rotate(0deg); opacity: 0; }
.pcard:hover,
.pcard:focus-visible { z-index: 10; }
/* lift rides on .pcard-inner, not .pcard — see the .principle-card
   note above: a hover target that moves drops its own hover. */
.pcard:focus-visible { outline: 2px solid var(--pc); outline-offset: 4px; }

.pcard-inner {
  position: relative;
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
  transition: transform 0.65s var(--ease-out);
}
.pcard:hover .pcard-inner,
.pcard:focus .pcard-inner { transform: translateY(-4px) rotateY(180deg); }    /* :focus, not :focus-visible — tap-to-flip on touch */

.pcard-face {
  position: absolute;
  inset: 0;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  backface-visibility: hidden;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);
}
.pcard-front img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 32%;         /* keep faces in frame as the crop shortens */
  display: block;
}
.pcard-back {
  transform: rotateY(180deg);
  background: var(--surface);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 14px;
  padding: 48px 40px;               /* clear of the certificate frame */
  text-align: center;
}

/* certificate frame — formal double rule in the ink brown
   (heavy outer, hairline inner), the classic award-card border.
   Ribbon colors stay in the ornaments: corner starbursts,
   laurel leaves, and the divider diamond. */
.pcard-back::before {
  content: "";
  position: absolute;
  inset: 14px;
  border: 3px solid var(--text-secondary);
  border-radius: 2px;
  pointer-events: none;
}
.pcard-back::after {
  content: "";
  position: absolute;
  inset: 21px;
  border: 1px solid var(--text-secondary);
  border-radius: 1px;
  pointer-events: none;
}

/* corner starbursts — retro four-point sparkles bursting off
   the outer rule's corners, filled with the card's ribbon
   stripe (--pc) over an ink stroke */
.pcard-corner {
  position: absolute;
  width: 26px;
  height: 26px;
  color: var(--text-primary);
  z-index: 1;
}
.pcard-corner.tl { top: 2px;    left: 2px; }
.pcard-corner.tr { top: 2px;    right: 2px; }
.pcard-corner.bl { bottom: 2px; left: 2px; }
.pcard-corner.br { bottom: 2px; right: 2px; }

/* emblem row — the drawn icon flanked by mirrored laurel
   sprigs, leaves cycling the four ribbon colors */
.pcard-emblem {
  display: flex;
  align-items: center;
  gap: 8px;
}
.pcard-laurel {
  flex: none;
  width: 22px;
  height: 46px;
  color: var(--text-primary);
}
.pcard-laurel.right { transform: scaleX(-1); }

.pcard-eyebrow {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: 0.6875rem;             /* 11px */
  letter-spacing: .01em;
  color: var(--text-muted);
}

/* divider — hairline rules meeting a diamond in the card's
   ribbon stripe (--pc), the certificate's closing flourish */
.pcard-divider {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 55%;
}
.pcard-divider::before,
.pcard-divider::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--border);
}
.pcard-divider span {
  flex: none;
  width: 7px;
  height: 7px;
  transform: rotate(45deg);
  background: var(--pc);
}

/* icon — ink strokes + palette fills, matching the site's
   drawn-line illustration style */
.pcard-icon {
  flex: none;
  width: 44px;
  height: 44px;
  color: var(--text-primary);
}

.pcard-caption {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.125rem;              /* 18px */
  line-height: 1.5;
  color: var(--text-primary);
  text-wrap: balance;
}

@media (prefers-reduced-motion: reduce) {
  .pcard, .pcard::before, .pcard-inner, .pc-lift, .pc-ribbon span { transition: none; }
}

.about-sub {
  font-family: var(--font-sans);
  font-weight: 300;
  font-size: 1.125rem;              /* 18px */
  line-height: 1.65;
  color: var(--text-secondary);
  text-align: center;
  text-wrap: balance;               /* single line on desktop; even halves when it wraps */
}

/* ── Hero vouch ─────────────────────────────────────────────
   One excerpted line from a manager's LinkedIn recommendation:
   evidence for the subhead's claims, not a testimonial wall. */
.about-vouch {
  max-width: 700px;
  margin-top: var(--sp-2);
  text-align: center;
}
.about-vouch-quote {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.0625rem;             /* 17px */
  line-height: 1.6;
  color: var(--text-secondary);
  text-wrap: balance;
}
.about-vouch-cite {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: 14px;
  font-family: var(--font-mono);
  font-style: normal;
  font-weight: 300;
  font-size: 0.6875rem;             /* 11px */
  letter-spacing: .01em;
  color: var(--text-muted);
}
.about-vouch-cite .pc-dash { --pc: var(--rainbow-4); }

/* ── Section kicker ─────────────────────────────────────────
   Eyebrow above each H2 — same dash + slab-label anatomy as
   the principle cards, keyed to a ribbon stripe via --pc. */
.about-kicker {
  display: flex;
  align-items: center;
  gap: 12px;
}
.about-kicker .pc-num {
  font-size: 0.6875rem; letter-spacing: .01em;
}

/* ── Inline emphasized links (dance / Traitors / email) ─────
   Same treatment as the case-study hero's .u links. */
.about-band .u {
  font-weight: 700;
  text-decoration: underline;
  text-underline-position: from-under;
  color: inherit;
}
.about-band a.u:hover,
.about-band a.u:focus-visible {
  color: var(--study-accent);
}

/* ── Who I am ──────────────────────────────────────────────── */
.about-who {
  padding-top: 40px;
  /* 40px, not 60: matches the *visible* gap between the photos
     and the ribbon (60px to band bottom minus the 20px rail) */
  padding-bottom: 40px;
  display: flex;
  flex-direction: column;
  gap: var(--sp-5);
}

/* prose column runs a touch wider than the portrait */
.about-who .study-two-col {
  grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
}

.about-portrait {
  width: 100%;
  aspect-ratio: 1200 / 1083;        /* pre-cropped to the family */
  object-fit: cover;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}

/* ── Favorites / Fanatic strip ─────────────────────────────── */
.about-fans {
  /* no padding-top: the 60px under .about-who is the whole gap,
     matching the 60px between the photos and the band's ribbon */
  padding-bottom: 60px;
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.strip-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px 0;
}

.strip-label {
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: 1.125rem;              /* 18px */
  color: var(--text-primary);
  margin-right: var(--sp-3);
  min-width: 96px;                  /* Favorites/Fanatic logos start on the same column */
}

/* Logo lineup — assets/images/about/logos/, from Figma Frame 5167.
   40px tall, natural widths, 28px apart (Figma spec is 16; opened
   up a touch for the wider page column). */
.strip-items {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 12px 28px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.strip-items li { display: flex; align-items: center; }

.strip-items img {
  height: 40px;
  width: auto;
  display: block;
}

/* Topo Chico ships as a square photo — the circle mask from the
   Figma comp is cheaper done right here */
.strip-items .logo-circle {
  width: 40px;
  object-fit: cover;
  border-radius: 50%;
}

/* Hover lift on both strips — the one keeper from the rejected drawn
   icon set. The <li> is the hover target and never moves; the asset
   inside it scales, and growing on hover can't retract an edge out
   from under the cursor the way the principle cards used to
   (see the .principle-card note below). */
.strip-items li img,
.strip-items li .strip-emoji {
  transition: transform 0.2s var(--ease-out);
  transform-origin: center;
}
.strip-items li:hover img,
.strip-items li:hover .strip-emoji { transform: scale(1.12); }
.strip-items .strip-emoji { display: block; }

/* Coffee is the emoji, same as the comp */
.strip-emoji {
  font-size: 34px;
  line-height: 1;
}

/* 4-up game snapshots */
.about-fanrow {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--sp-2);
}
.about-fanrow img {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}

/* ── How I think / principles ──────────────────────────────── */
.about-think {
  padding-top: 40px;
  padding-bottom: 60px;
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.about-think .study-richtext { max-width: 820px; }

/* 2026-09-08: the lead-in above the principles dropped to H2 + frame
   sentence (neither picojr.com/about nor larrypelty.com/about runs
   prose there), and BOTH flip cards moved down to What I'm Looking
   For as a fanned pair, after the three-photo header on
   jacobolenick.com/about. The fan sizes by aspect ratio, not by row
   height, because two prose paragraphs are shorter than the cards.
   The tilt is static on .pcard (a hover target must not move under
   the pointer); hover still lifts and flips .pcard-inner as before. */
.about-side.is-fan {
  grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
  align-items: start;
}
.about-pcards.is-fan {
  display: flex;
  justify-content: flex-end;
  align-items: flex-start;
  padding: 12px 8px 40px 0;         /* room for the tilt corners + the lower card's drop */
}
.is-fan .pcard-pair {
  flex: 0 0 auto;
  width: min(264px, 58%);
  aspect-ratio: 3 / 4;
}

/* The fan shrank the card to min(264px, 58%) at 3/4, but .pcard-back kept its
   full-size padding and caption, so both certificate backs overflowed their
   cards. MEASURED at 1280 (content = children offsetHeights + row gaps +
   vertical padding, against the card's own offsetHeight): the Digital Channels
   Cup back needed 425px inside a 311px card, 114 over, clipping the eyebrow and
   dropping "cup." onto the bottom inner rule; White Chocolate 60 over. This block holds them at 297px and 253px inside a 311px card.
   ⛑ THE CUP BACK HAS 14px OF SLACK, measured 2026-09-11: one more caption line
   is 22px and overflows it. Re-measure before adding a word. (The 275px this
   comment used to claim was the pre-fix figure; widening the horizontal padding
   to 30px below took that caption from five lines to six. White Chocolate is
   four lines either way, which is why the error was easy to miss.)
   ⚑ It does NOT hold below ~440px on its own: there the fan's geometry is the
   binding constraint, not the padding, so the pair stacks at the 480 breakpoint
   further down. Do not delete that block thinking this one covers it.
   Added 2026-09-10, corrected the same day against browser measurement. */
.about-pcards.is-fan .pcard-back {
  padding: 32px 30px;               /* 26px left the italic caption 5px off the ::after hairline at inset 21px; 30px buys 4px back per side */
  gap: 10px;
}
.about-pcards.is-fan .pcard-caption {
  font-size: 0.9375rem;             /* 15px, from 18px */
  line-height: 1.47;                /* ~22px, from 27px */
}
/* ⚑ SPECIFICITY TRAP, fixed 2026-09-10: the rule above is 0,3,0 and the mobile
   step in the 860px query below is 0,1,0, so the fan was overriding it and
   phone captions got BIGGER (14px to 15px) when this block landed. Re-state the
   mobile step at the fan's own weight. */
@media (max-width: 860px) {
  .about-pcards.is-fan .pcard-caption { font-size: 0.875rem; }
}
/* the LEFT card is on top, as on Jacob's page (his outer cards sit over
   the middle one). Both photos put Daniel on the right-hand side, so a
   front card on the right would cover his face on the back card; a front
   card on the left only trims the back card's left edge. Overlap kept
   to 14% for the same reason. */
.is-fan .pcard-pair:first-child { transform: rotate(-6deg); z-index: 2; }
.is-fan .pcard-pair:last-child  { transform: rotate(5deg) translateY(36px); margin-left: -14%; z-index: 1; }
.is-fan .pcard:hover,
.is-fan .pcard:focus-visible { z-index: 10; }
.is-fan .pcard::before { display: none; }

.about-principles {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--sp-3);
  margin-top: var(--sp-2);
}

/* Each card carries its ribbon stripe via --pc (set inline).
   Order matches the rainbow scale: crimson, rust, gold, teal. */
/* The <article> is the hover target and a bare box: it NEVER moves.
   The visual card is .pc-lift inside it, and that is what translates
   on hover. Reason (Daniel caught this 2026-08-16): when the moving
   element is also the :hover target, translate(-2px,-2px) pulls the
   right and bottom edges out from under a cursor resting on them, so
   hover drops, the card returns, hover fires again — a visible loop at
   the top-right and bottom-right corners. A child can move freely
   because the parent's hit box stays put. This also ends a latent
   conflict with .reveal, which animates transform on this same
   element. */
.principle-card {
  display: flex;
  height: 100%;
}
.pc-lift {
  flex: 1;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 28px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  /* resting shadow sits at zero offset (hidden behind the card)
     so hover animates the OFFSET — the shadow slides out as the
     card lifts, instead of a formed shadow fading in */
  box-shadow: 0 0 0 var(--pc);
  transition:
    border-color 0.25s ease,
    transform 0.25s var(--ease-out),
    box-shadow 0.25s var(--ease-out);
}
/* hover = hard offset shadow in the card's stripe: the 70s
   print take on a lift */
.principle-card:hover .pc-lift {
  border-color: var(--pc);
  transform: translate(-2px, -2px);
  box-shadow: 5px 5px 0 var(--pc);
}

.pc-head {
  display: flex;
  align-items: center;
  gap: 12px;
}
.pc-dash {
  width: 26px;
  height: 4px;
  border-radius: 2px;
  background: var(--pc);
  transition: width 0.3s var(--ease-out);
}
.pc-num {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: 0.6875rem;             /* 11px */
  letter-spacing: 1.5px;
  color: var(--text-muted);
}

/* mini ribbon — each principle card's dash is a miniature of
   the site ribbon (crimson→teal, homepage order): the same
   four-stripe mark on all four cards says "one set"; the
   card's own stripe is lit + stretched to say which member
   this is. Hover: the whole ribbon saturates and the lit
   stripe stretches further. */
.pc-ribbon {
  display: flex;
  align-items: center;
  gap: 5px;
}
.pc-ribbon span {
  width: 7px;
  height: 4px;
  border-radius: 2px;
  opacity: 0.28;
  transition: width 0.3s var(--ease-out), opacity 0.25s ease;
}
.pc-ribbon span:nth-child(1) { background: var(--rainbow-4); }
.pc-ribbon span:nth-child(2) { background: var(--rainbow-3); }
.pc-ribbon span:nth-child(3) { background: var(--rainbow-2); }
.pc-ribbon span:nth-child(4) { background: var(--rainbow-1); }
.pc-ribbon .active { width: 24px; opacity: 1; }
.principle-card:hover .pc-ribbon span { opacity: 1; }
.principle-card:hover .pc-ribbon .active { width: 38px; }

/* numbers stay in the kicker's muted brown (AA contrast on the
   card surface, 4.57:1); the lit ribbon stripe alone carries
   the color mapping */

.pc-title {
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: 1.25rem;               /* 20px */
  line-height: 1.3;
  color: var(--text-primary);
}

.pc-body {
  font-family: var(--font-sans);
  font-size: 0.9375rem;             /* 15px */
  line-height: 1.65;
  color: var(--text-secondary);
}

/* ── What I'm looking for ──────────────────────────────────── */
.about-looking {
  padding-top: 40px;
  padding-bottom: 60px;
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
}
.about-looking .study-richtext { max-width: 820px; }
.about-looking .study-cta { align-self: flex-start; }

/* ── Closing CTA row: THE VINYL BUTTON ─────────────────────
   The component (.about-cta / .about-btn / -primary, the record img and
   the .lbl span) MOVED to css/styles.css on 2026-09-09 so the case-study
   closers can use it (those pages never load this file). Nothing here. */

/* Inline case-study links inside principle cards: quiet at
   rest, card color on hover — a link mid-sentence, not a CTA,
   so the serif title keeps the hierarchy */
.pc-body a {
  color: inherit;
  text-decoration: underline;
  text-underline-position: from-under;
}
.pc-body a:hover,
.pc-body a:focus-visible { color: var(--pc); }

/* ── Responsive ────────────────────────────────────────────── */
@media (max-width: 860px) {
  .about-hero { padding-top: var(--sp-6); padding-bottom: var(--sp-6); }
  .about-side { grid-template-columns: 1fr; }
  .pcard-side { justify-self: center; max-width: 280px; height: auto; aspect-ratio: 3 / 4; }
  .about-side.is-fan { grid-template-columns: 1fr; }
  .about-pcards.is-fan { justify-content: center; padding-right: 0; }
  .pcard-caption { font-size: 0.875rem; }
  .about-who .study-two-col { grid-template-columns: 1fr; }
  .about-portrait { max-width: 480px; }
  .about-principles { grid-template-columns: 1fr; }
  .about-fanrow { grid-template-columns: 1fr 1fr; }
  .strip-row { flex-direction: column; gap: 12px; }
  .strip-items { gap: 10px 20px; }
  .strip-items img { height: 34px; }
  .strip-items .logo-circle { width: 34px; }
  .strip-emoji { font-size: 29px; }
}

/* Below 480 the fan stops being survivable. A side-by-side pair is bounded by
   2W - 0.14C <= C, where C is the container: `margin-left: -14%` resolves against
   the container inline size, NOT the card. So W <= 0.57C, about 197px at 386, and no padding or type reduction fits a 105-character caption into the
   240px of height that buys. Measured after the padding fix, forcing the fan geometry
   back on at 386: the Cup back still runs over, the eyebrow gone entirely and the
   divider clipped. (Two passes measured the overage differently, 90-101px and
   48-57px, about one gap-delta apart; the sign and the conclusion are what matter.) The fan is kept everywhere it fits (481 and up all
   measured clean); this is its geometry's fallout, not a change of direction.
   Replaced the old `width: 52%` rule, which only kept the tilted card inside the
   gutter and never addressed the overflow. 2026-09-10. */
/* Between 481 and ~545 the fanned pair broke the page's 20px gutter: the left
   card's tilted corner measured -2px at 481, 1px at 500 and 12px at 520, so the
   certificate ran flush into the screen edge while the paragraph above it stayed
   inset. Silent, because nothing scrolls horizontally. Clamping the card here
   puts that edge at 34px and keeps the tilt, the overlap and the hover lift
   exactly as they are everywhere else the fan survives. 2026-09-11. */
@media (min-width: 481px) and (max-width: 560px) {
  .is-fan .pcard-pair { width: 50%; }
}

@media (max-width: 480px) {
  .about-pcards.is-fan {
    flex-direction: column;
    align-items: center;
    gap: 20px;
  }
  .is-fan .pcard-pair { width: 82%; }   /* 316x421 at 386, against a 275px need */
  .is-fan .pcard-pair:first-child,
  .is-fan .pcard-pair:last-child { transform: none; margin-left: 0; }

  /* The H1 joke puts "dinner for six." on its own line at 1280 and 1440, and at
     386 it degraded to a one-word orphan ("six." alone on line four, 50px wide)
     that also split "dinner for / six.". Balance fixes it here (205/250/234/267)
     but MUST stay scoped: unscoped it evens the H1 to 639/638 at 1280 and kills
     the settled break. 2026-09-10. */
  .about-hero .study-title { text-wrap: balance; }
}
