/* ============================================================================
   partner.css — the co-branded operating-partner system

   ONE stylesheet for every /partners/<slug> page. Adding a fourth partner adds
   no CSS. Everything is namespaced `.pt-` so it can never collide with
   site.css, home.css, or the deal-brief layer.

   THE ONE RULE THIS FILE EXISTS TO ENFORCE
   ----------------------------------------
   A partner's operating portfolio and the opportunities Capstaq presents are
   two different things, and a visitor must never confuse them. They are not
   the same card with a different badge. They are different objects:

     .pt-open   — an opportunity carrying a Capstaq status. A card. It has a
                  photograph, a status, and a link you can act on.
     .pt-folio  — the partner's own operating history. A ledger row. No photo,
                  no status, no link, no hover, no affordance of any kind.
                  Reading is the only thing you can do to it.

   The affordance IS the compliance boundary. A row that cannot be clicked
   cannot be mistaken for something you can invest in.

   Capstaq keeps its navigation, colour, and type on every one of these pages.
   The partner's identity is carried by its photography and by the lockup, not
   by a foreign palette. That is deliberate: it means a new partner needs zero
   brand assets before its page can look co-branded.
   ========================================================================== */

/* ---- keyboard focus on light ground ------------------------------------
   The global :focus-visible ring is a WHITE outline with a navy halo outside
   it. On the navy sections that is correct and it is left alone. On these
   pages' white and paper sections the white ring vanishes into the background,
   and the navy halo sits outside the element so `overflow: hidden` on the card
   grids clips it away: the focused insight card showed a 2px sliver on one
   edge and nothing else. These rings are drawn INSIDE the element so nothing
   can clip them, in ink on light rather than white on white. */
.pt-subnav a:focus-visible,
.pt-insight:focus-visible,
.pt-open__card .btn:focus-visible,
.pt-shut__link:focus-visible {
  outline: 2px solid var(--ink-900);
  outline-offset: -3px;
  box-shadow: inset 0 0 0 6px var(--gold-200);
}

/* An inline text link has no box to draw inside, so it keeps an outside ring —
   nothing clips it, and ink on paper is legible where white was not. */
.pt-shut__link:focus-visible {
  outline-offset: 3px;
  box-shadow: none;
}

/* ---- co-branded lockup ------------------------------------------------- */
/* Capstaq mark, a hairline cross, the partner. Equal weight on both sides:
   this is a partnership, not a listing. `.pt-lockup__logo` is the slot a real
   partner logo drops into when one is supplied and approved. */
.pt-lockup {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 14px;
  padding: 10px 16px 10px 14px;
  border: 1px solid rgba(224, 165, 54, .34);
  border-radius: var(--radius-xs);
  background: rgba(5, 15, 28, .5);
}

.pt-lockup__side { display: inline-flex; align-items: center; gap: 12px; }

.pt-lockup__mark {
  display: flex;
  align-items: flex-end;
  gap: 2px;
  height: 16px;
}

.pt-lockup__mark i {
  width: 3px;
  background: var(--gold-400);
}

.pt-lockup__mark i:nth-child(1) { height: 6px; }
.pt-lockup__mark i:nth-child(2) { height: 10px; }
.pt-lockup__mark i:nth-child(3) { height: 13px; }
.pt-lockup__mark i:nth-child(4) { height: 16px; }

.pt-lockup b,
.pt-lockup strong {
  color: #fff;
  font-size: .8rem;
  font-weight: 700;
  letter-spacing: .17em;
  text-transform: uppercase;
}

.pt-lockup__x {
  color: var(--gold-300);
  font-size: .84rem;
  font-weight: 400;
  line-height: 1;
}

.pt-lockup__logo { height: 22px; width: auto; }

/* The lockup as a link, which is what it is on a deal-brief hero: a visitor
   can land on a deal page directly, so the partnership is both named there and
   routed back to the partner section. */
/* flex + fit-content, not inline-block: the deal hero's eyebrow is inline-flex
   and sat on the lockup's baseline, running its leading hairline into the
   lockup's border. Block-level forces the line break; fit-content keeps the
   hover and focus target the size of the lockup rather than the column. */
.pt-lockup-link {
  display: flex;
  width: fit-content;
  min-height: 40px;
  margin-bottom: 20px;
}

.pt-lockup-link .pt-lockup { transition: border-color .2s ease; }
.pt-lockup-link:hover .pt-lockup { border-color: var(--gold-300); }

.pt-lockup-link:focus-visible { outline: none; }
.pt-lockup-link:focus-visible .pt-lockup { outline: 2px solid var(--gold-300); outline-offset: 2px; }

/* When the block is hosted by another page's section plate, the lockup still
   needs air under it. */
.pt-head .pt-lockup { margin-bottom: 20px; }

/* ---- hero -------------------------------------------------------------- */
.pt-hero {
  position: relative;
  padding: 56px 0 72px;
  color: var(--on-dark-700);
  background: var(--navy-950);
}

.pt-hero__grid {
  display: grid;
  grid-template-columns: minmax(0, 1.06fr) minmax(0, .94fr);
  align-items: center;
  gap: 64px;
}

.pt-hero h1 {
  margin: 22px 0 20px;
  color: #fff;
  font-size: clamp(2.5rem, 4.6vw, 4rem);
}

.pt-hero .eyebrow { margin-bottom: 0; color: var(--gold-300); }

/* .eyebrow is inline-flex, and so is the lockup, so the discipline line sat on
   the same baseline as "CAPSTAQ x OGH REAL ESTATE" and read as one run-on
   label. It gets its own line. */
.pt-hero__eyebrow { display: flex; margin: 22px 0 0; }
.pt-hero .lede { max-width: 54ch; color: var(--on-dark-700); }

.pt-hero__actions { margin-top: 30px; }

.pt-hero__visual { position: relative; }

.pt-hero__visual img {
  width: 100%;
  height: 340px;
  border-radius: var(--radius-sm);
  object-fit: cover;
}

/* the three-line partner ledger under the hero image */
.pt-ledger {
  margin: 20px 0 0;
  display: grid;
  gap: 1px;
  background: var(--navy-700);
  border: 1px solid var(--navy-700);
  border-radius: var(--radius-xs);
  overflow: hidden;
}

.pt-ledger > div {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr);
  gap: 14px;
  padding: 15px 18px;
  background: var(--navy-900);
}

.pt-ledger .ico { width: 20px; height: 20px; color: var(--gold-400); }

.pt-ledger dt {
  color: #fff;
  font-size: .88rem;
  font-weight: 600;
  line-height: 1.35;
}

.pt-ledger dd {
  margin: 5px 0 0;
  color: var(--on-dark-500);
  font-size: .8rem;
  line-height: 1.55;
}

/* ---- sticky section nav ------------------------------------------------ */
.pt-subnav {
  position: sticky;
  top: var(--nav-h);
  z-index: 40;
  border-bottom: 1px solid var(--rule);
  background: rgba(252, 253, 252, .94);
  backdrop-filter: saturate(1.4) blur(10px);
}

.pt-subnav__in {
  display: flex;
  align-items: center;
  gap: 4px;
  overflow-x: auto;
  scrollbar-width: none;
}

.pt-subnav__in::-webkit-scrollbar { display: none; }

.pt-subnav a {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  min-height: 46px;
  padding: 0 15px;
  border-bottom: 2px solid transparent;
  color: var(--ink-500);
  font-size: .8rem;
  font-weight: 650;
  letter-spacing: .01em;
  white-space: nowrap;
  transition: color .18s ease, border-color .18s ease;
}

.pt-subnav a:hover { color: var(--ink-900); }

.pt-subnav a[aria-current="true"] {
  color: var(--ink-900);
  border-bottom-color: var(--gold-400);
}

/* ---- section scaffold -------------------------------------------------- */
.pt-sec { padding: 84px 0; }
.pt-sec--white { background: var(--white); }
.pt-sec--paper { background: var(--paper); }
.pt-sec--navy { color: var(--on-dark-700); background: var(--navy-950); }
.pt-sec--navy h2, .pt-sec--navy h3 { color: #fff; }
/* .pt-index__hero is navy but carries neither .on-dark nor .section--navy, so
   it never picked up site.css's on-dark eyebrow override and inherited the
   light-ground --accent-ink (#754600) instead: 2.41:1 on navy, the worst
   contrast on the site. Same colour the sibling navy sections already use. */
.pt-sec--navy .eyebrow,
.pt-index__hero .eyebrow { color: var(--gold-300); }
.pt-sec--navy .lede { color: var(--on-dark-700); }

.pt-head { max-width: 780px; margin-bottom: 44px; }
.pt-head h2 { margin-bottom: 18px; }

/* ---- capabilities ------------------------------------------------------ */
/* Fixed column counts, not auto-fit. auto-fit gave 1440px five columns for six
   cards, so the sixth sat alone and the other four cells showed the container's
   hairline grey as one large empty block. Three columns divide six exactly, and
   the generator pads any other count with blank white cells so the hairlines
   stay regular whatever a partner supplies. */
.pt-caps {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  background: var(--rule);
  border: 1px solid var(--rule);
  border-radius: var(--radius-xs);
  overflow: hidden;
}

.pt-cap { padding: 28px 26px; background: var(--white); }
.pt-cap--void { padding: 0; }
.pt-cap .ico { width: 24px; height: 24px; color: var(--gold-600); }

.pt-cap h3 {
  margin: 16px 0 8px;
  color: var(--ink-900);
  font-size: 1.1rem;
  font-weight: 650;
  letter-spacing: -.01em;
}

.pt-cap p { margin: 0; color: var(--ink-500); font-size: .89rem; line-height: 1.6; }

/* Leadership reuses the capability cell, but NOT the capability grid's width.
   Capabilities are always six, so the grid is always full. Leadership is one,
   two or three: Storage Caves publishes a single principal, OGH publishes two.
   Left at three columns, one card renders beside two empty boxes with the
   hairlines still drawn, and an empty box under the heading "The People
   Accountable for the Plan" reads as a person who is missing.

   So the frame narrows to the record instead of padding it. The percentages
   are the capability card's own share of the row, which keeps a leadership
   card exactly as wide as the capability card above it. Each breakpoint
   restates them against that breakpoint's column count, and at one column
   they stop applying because a full-width single card is already correct. */
.pt-caps--n1 { grid-template-columns: minmax(0, 1fr); max-width: 33.33%; }
.pt-caps--n2 { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 66.66%; }

/* Leadership reuses the capability cell. The headshot slot is styled now so it
   is correct the day approved photographs arrive rather than the day after. */
.pt-team__shot {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  object-fit: cover;
  background: var(--paper);
}

/* ---- leadership, on a deal page ----------------------------------------
   The same `team` array the section above renders, in the compact form the
   deal-brief operator section needs. It lives HERE, not in deal-brief.css,
   for the same reason `.pt-lockup` does: the partner system owns how a
   partner is presented, and both surfaces load this file. Two stylesheets for
   one array is how the two surfaces start disagreeing.

   A name with no role renders as a name. No dash, no placeholder, no reserved
   empty line: OGH supplies two names and no titles, and the row is simply
   shorter. Rows are hairline-separated rather than boxed so the block reads as
   a credit under the lede and never competes with the capability ledger
   beside it. */
.pt-lead {
  margin: 0 0 24px;
  padding-top: 20px;
  border-top: 1px solid var(--rule);
}

p.pt-lead__h {
  margin: 0 0 12px;
  color: var(--ink-900);
  font-size: .75rem;
  font-weight: 700;
  letter-spacing: .09em;
  text-transform: uppercase;
}

.pt-lead ul {
  display: grid;
  gap: 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.pt-lead li + li {
  padding-top: 12px;
  border-top: 1px solid var(--rule-soft);
}

.pt-lead b {
  display: block;
  color: var(--ink-900);
  font-size: .95rem;
  font-weight: 650;
}

.pt-lead span {
  display: block;
  margin-top: 3px;
  max-width: 52ch;
  color: var(--ink-500);
  font-size: .85rem;
  line-height: 1.5;
}

/* ---- who does what ----------------------------------------------------- */
/* The same block, worded identically, on every partner page and every partner
   deal page. Built once in make_partners.py: `who_does_what_html()`. */
.pt-who__line {
  max-width: 46ch;
  margin: 0 0 48px;
  color: #fff;
  font-size: clamp(1.22rem, 2.1vw, 1.62rem);
  font-weight: 500;
  line-height: 1.45;
  letter-spacing: -.015em;
}

/* align-items: start, so each column is the height of its own content. The
   operator carries four responsibilities and Capstaq six; stretched to a
   common height the operator's card ran a third empty and read as a rendering
   fault rather than as a shorter list. */
.pt-who__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr));
  align-items: start;
  gap: 24px;
}

.pt-who__col {
  padding: 30px 28px 26px;
  border: 1px solid var(--navy-700);
  border-radius: var(--radius-xs);
  background: var(--navy-900);
}

/* Capstaq's column is the one that carries the platform's own accent. The
   operator's column is deliberately quieter: the operator is the subject of
   the page, Capstaq is the constant. */
.pt-who__col--capstaq { border-color: rgba(224, 165, 54, .4); }

.pt-who__col > h3 {
  margin: 0 0 22px;
  color: #fff;
  font-size: 1.16rem;
  font-weight: 650;
  letter-spacing: -.01em;
}

.pt-who__role {
  margin: 0 0 22px;
  padding-bottom: 20px;
  border-bottom: 1px solid var(--navy-700);
  color: var(--gold-300);
  font-size: .69rem;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
}

.pt-who__col ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 20px; }

.pt-who__col li {
  display: grid;
  grid-template-columns: 20px minmax(0, 1fr);
  gap: 14px;
}

/* The operator column is the quieter of the two. Capstaq's column carries the
   platform accent because Capstaq is the constant across every partner page;
   the operator changes. Two columns of gold read as one undifferentiated block. */
.pt-who__col li .ico { width: 19px; height: 19px; margin-top: 2px; color: var(--on-dark-500); }
.pt-who__col--capstaq li .ico { color: var(--gold-400); }
.pt-who__col li b { display: block; color: #fff; font-size: .91rem; font-weight: 600; }

.pt-who__col li span {
  display: block;
  margin-top: 4px;
  color: var(--on-dark-500);
  font-size: .83rem;
  line-height: 1.6;
}

/* ============================================================================
   THE INVESTMENT AREA — opportunities carrying a Capstaq status
   ========================================================================== */

/* the boundary statement that opens the section */
.pt-boundary {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr);
  gap: 14px;
  max-width: 760px;
  margin: 0 0 40px;
  padding: 18px 20px;
  border: 1px solid var(--rule);
  border-left: 3px solid var(--gold-500);
  border-radius: var(--radius-xs);
  background: var(--paper-alt);
}

.pt-boundary .ico { width: 20px; height: 20px; margin-top: 1px; color: var(--gold-600); }
.pt-boundary p { margin: 0; color: var(--ink-700); font-size: .87rem; line-height: 1.62; }
.pt-boundary p + p { margin-top: 8px; color: var(--ink-500); }

/* --- tier label above each availability group --- */
.pt-tier {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 12px;
  margin: 0 0 22px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--rule);
}

.pt-tier h3 {
  margin: 0;
  color: var(--ink-900);
  font-size: 1.05rem;
  font-weight: 650;
  letter-spacing: .01em;
}

.pt-tier span { color: var(--ink-500); font-size: .82rem; }
.pt-group + .pt-group { margin-top: 56px; }

/* --- status pill --- */
.pt-st {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 5px 11px;
  border: 1px solid;
  border-radius: 999px;
  font-size: .69rem;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  white-space: nowrap;
}

.pt-st::before {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: currentColor;
}

.pt-st--available { color: #14603a; border-color: rgba(29, 122, 69, .4); background: rgba(29, 122, 69, .1); }
.pt-st--review    { color: var(--gold-700); border-color: rgba(143, 89, 0, .34); background: rgba(224, 165, 54, .14); }
.pt-st--closed,
.pt-st--pipeline  { color: var(--ink-500); border-color: var(--rule); background: var(--paper-alt); }

/* --- TIER 1: an opportunity you can act on. A full card. --- */
.pt-open {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr));
  gap: 24px;
}

/* auto-fill, not auto-fit: with one open deal, auto-fit collapsed the track to
   the full 1400px and the concept image became a billboard taller than the rest
   of the section. A single open opportunity gets its own horizontal treatment
   instead, which reads as deliberate rather than stretched. */
.pt-open--solo { grid-template-columns: minmax(0, 1fr); max-width: 1080px; }
.pt-open--solo .pt-open__card { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); }
.pt-open--solo .pt-open__media { aspect-ratio: auto; height: 100%; min-height: 340px; }

.pt-open__card {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--rule);
  border-radius: var(--radius-sm);
  background: var(--white);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
}

.pt-open__media { position: relative; aspect-ratio: 16 / 9; background: var(--paper); }
.pt-open__media img { width: 100%; height: 100%; object-fit: cover; }

.pt-open__media .pt-st {
  position: absolute;
  top: 14px;
  left: 14px;
  background: rgba(255, 255, 255, .95);
  backdrop-filter: blur(6px);
}

.pt-open__body { display: flex; flex-direction: column; flex: 1; padding: 24px 24px 22px; }

.pt-open__body h4 {
  margin: 0 0 8px;
  color: var(--ink-900);
  font-size: 1.24rem;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -.015em;
}

.pt-open__loc {
  display: flex;
  align-items: center;
  gap: 7px;
  margin: 0 0 14px;
  color: var(--ink-500);
  font-size: .84rem;
}

.pt-open__loc .ico { width: 16px; height: 16px; color: var(--gold-600); }
.pt-open__lede { margin: 0 0 18px; color: var(--ink-700); font-size: .89rem; line-height: 1.6; }

.pt-open__facts {
  display: grid;
  gap: 1px;
  margin: 0 0 20px;
  background: var(--rule-soft);
  border-block: 1px solid var(--rule-soft);
}

.pt-open__facts > div {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  padding: 9px 0;
  background: var(--white);
}

.pt-open__facts dt { color: var(--ink-500); font-size: .8rem; }
.pt-open__facts dd { margin: 0; color: var(--ink-900); font-size: .8rem; font-weight: 650; }

.pt-open__cta { margin-top: auto; }

/* --- TIER 2: published, has a Capstaq status, is NOT open. A demoted row. ---
   No photograph, no shadow, no CTA button. The link reads "overview", never
   "invest", because reading is the only action available. */
.pt-shut { display: grid; gap: 10px; }

.pt-shut__row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 18px 24px;
  padding: 18px 22px;
  border: 1px solid var(--rule);
  border-radius: var(--radius-xs);
  background: var(--paper-alt);
}

.pt-shut__row h4 {
  margin: 0 0 4px;
  color: var(--ink-900);
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -.01em;
}

.pt-shut__meta { display: flex; align-items: center; gap: 8px; color: var(--ink-500); font-size: .82rem; }
.pt-shut__meta .ico { width: 15px; height: 15px; }
.pt-shut__right { display: flex; align-items: center; gap: 20px; }

.pt-shut__link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 40px;
  color: var(--accent-ink);
  font-size: .82rem;
  font-weight: 650;
  white-space: nowrap;
}

.pt-shut__link .ico { width: 15px; height: 15px; transition: transform .2s ease; }
.pt-shut__link:hover .ico { transform: translateX(4px); }

/* A list, not a table. Left unbounded it stretched to 1400px and put a metre of
   dead space between a property name and its status. */
.pt-shut { max-width: 1000px; }

/* the four statuses, spelled out once under the section */
/* THE EMPTY-CELL RULE, shared with .pt-insights below.
   These read as hairline tables: a rule-coloured ground showing through a 1px
   gap. That works only while the items fill every track. At 768px auto-fit
   gave three tracks to four statuses and the fourth sat alone, leaving two
   thirds of a row painted flat grey — it read as a rendering fault, not as a
   short list. The ground is now the card colour and the hairlines come from
   each card's own 1px shadow, so an unfilled track is invisible at any item
   count the generator produces. */
.pt-key {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr));
  gap: 1px;
  margin-top: 48px;
  background: var(--white);
  border: 1px solid var(--rule);
  border-radius: var(--radius-xs);
  overflow: hidden;
}

.pt-key > div { padding: 18px 20px; background: var(--white); box-shadow: 0 0 0 1px var(--rule); }
.pt-key dt { margin-bottom: 8px; }
.pt-key dd { margin: 0; color: var(--ink-500); font-size: .81rem; line-height: 1.55; }

/* ============================================================================
   THE CREDIBILITY AREA — the partner's own operating portfolio
   Deliberately not a card, not clickable, not photographed, not badged.
   ========================================================================== */
.pt-folio__note {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr);
  gap: 14px;
  max-width: 760px;
  margin: 0 0 32px;
  padding: 16px 20px;
  border: 1px solid var(--navy-700);
  border-radius: var(--radius-xs);
  background: var(--navy-900);
}

.pt-folio__note .ico { width: 20px; height: 20px; margin-top: 1px; color: var(--on-dark-500); }
.pt-folio__note p { margin: 0; color: var(--on-dark-700); font-size: .87rem; line-height: 1.6; }

.pt-folio__wrap { overflow-x: auto; }

.pt-folio {
  width: 100%;
  min-width: 560px;
  border-collapse: collapse;
  font-variant-numeric: tabular-nums;
}

.pt-folio caption {
  padding-bottom: 14px;
  color: var(--on-dark-500);
  font-size: .8rem;
  text-align: left;
}

.pt-folio th {
  padding: 0 18px 12px 0;
  border-bottom: 1px solid var(--navy-700);
  color: var(--on-dark-500);
  font-size: .69rem;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  text-align: left;
}

.pt-folio td {
  padding: 15px 18px 15px 0;
  border-bottom: 1px solid var(--navy-800);
  color: var(--on-dark-700);
  font-size: .87rem;
  vertical-align: top;
}

.pt-folio td:first-child { color: #fff; font-weight: 600; }
.pt-folio td:last-child { padding-right: 0; }
.pt-folio .pt-folio__yr { font-family: var(--font-mono); font-size: .82rem; }

/* ---- insights ---------------------------------------------------------- */
/* Card ground, not rule ground — see THE EMPTY-CELL RULE on .pt-key. The
   insight count comes from partners.json and is not guaranteed to divide the
   track count, so this cannot be solved by picking the right number of
   columns. */
.pt-insights { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(268px, 100%), 1fr)); gap: 1px; background: var(--white); border: 1px solid var(--rule); border-radius: var(--radius-xs); overflow: hidden; }

.pt-insight {
  display: flex;
  flex-direction: column;
  min-height: 190px;
  padding: 26px 24px 22px;
  background: var(--white);
  box-shadow: 0 0 0 1px var(--rule);
  transition: background .2s ease;
}

.pt-insight:hover { background: var(--paper-alt); }

.pt-insight__kicker {
  color: var(--accent-ink);
  font-size: .69rem;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
}

.pt-insight h3 {
  margin: 14px 0 0;
  color: var(--ink-900);
  font-size: 1.05rem;
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: -.01em;
}

.pt-insight .link-arrow { margin-top: auto; padding-top: 20px; }

/* ---- closing rail ------------------------------------------------------ */
.pt-next {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
  gap: 24px;
  margin-top: 8px;
}

.pt-next a {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 40px;
  padding: 24px 26px;
  border: 1px solid var(--navy-700);
  border-radius: var(--radius-xs);
  background: var(--navy-900);
  transition: border-color .2s ease;
}

.pt-next a:hover { border-color: var(--gold-400); }
.pt-next span { color: var(--on-dark-500); font-size: .83rem; }
.pt-next strong { color: #fff; font-size: 1.02rem; font-weight: 600; }

.pt-disclosure {
  padding: 40px 0 56px;
  color: var(--ink-500);
  font-size: .79rem;
  line-height: 1.65;
  background: var(--paper);
}

.pt-disclosure p { max-width: 96ch; margin: 0; }

/* ============================================================================
   THE PARTNER INDEX — operating-partners.html
   ========================================================================== */
.pt-index__hero { padding: 64px 0 8px; color: var(--on-dark-700); background: var(--navy-950); }
.pt-index__hero h1 { margin: 20px 0 22px; color: #fff; font-size: clamp(2.4rem, 4.4vw, 3.8rem); }
.pt-index__hero .lede { max-width: 62ch; color: var(--on-dark-700); }
.pt-index__hero .pt-who__line { margin-top: 36px; margin-bottom: 0; }

.pt-index__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
  gap: 24px;
  padding: 56px 0 0;
}

.pt-card {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--navy-700);
  border-radius: var(--radius-sm);
  background: var(--navy-900);
  overflow: hidden;
  transition: border-color .22s ease, transform .22s ease;
}

.pt-card:hover { border-color: var(--gold-400); transform: translateY(-2px); }
.pt-card__media { aspect-ratio: 16 / 10; background: var(--navy-800); }
.pt-card__media img { width: 100%; height: 100%; object-fit: cover; }
.pt-card__body { display: flex; flex-direction: column; flex: 1; padding: 24px 24px 22px; }

.pt-card__body .pt-lockup {
  align-self: flex-start;
  margin-bottom: 16px;
  padding: 7px 12px 7px 10px;
  gap: 10px;
}

.pt-card__body .pt-lockup b,
.pt-card__body .pt-lockup strong { font-size: .69rem; }

.pt-card h2 { margin: 0 0 6px; color: #fff; font-size: 1.34rem; font-weight: 600; letter-spacing: -.015em; }
.pt-card__disc { margin: 0 0 16px; color: var(--gold-300); font-size: .78rem; font-weight: 650; letter-spacing: .06em; text-transform: uppercase; }
.pt-card__count { margin: 0 0 20px; color: var(--on-dark-500); font-size: .86rem; line-height: 1.55; }
.pt-card__count b { color: #fff; font-weight: 650; }
.pt-card .link-arrow { margin-top: auto; min-height: 40px; align-items: center; color: var(--gold-300); }

.pt-index__routes { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr)); gap: 24px; padding: 56px 0 0; }

/* ---- responsive -------------------------------------------------------- */
@media (max-width: 1000px) {
  .pt-hero__grid { grid-template-columns: minmax(0, 1fr); gap: 40px; }
  .pt-hero__visual img { height: 260px; }
  .pt-sec { padding: 64px 0; }
  .pt-caps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pt-caps--n1 { max-width: 50%; }
  .pt-caps--n2 { max-width: 100%; }
  .pt-cap--void { display: none; }
  .pt-open--solo .pt-open__card { grid-template-columns: minmax(0, 1fr); }
  .pt-open--solo .pt-open__media { aspect-ratio: 16 / 9; min-height: 0; }
}

@media (max-width: 720px) {
  .pt-hero { padding: 36px 0 56px; }
  .pt-hero h1 { font-size: clamp(2.05rem, 8.4vw, 2.7rem); }
  .pt-sec { padding: 52px 0; }
  .pt-head { margin-bottom: 32px; }
  .pt-caps { grid-template-columns: minmax(0, 1fr); }
  .pt-caps--n1, .pt-caps--n2 { max-width: 100%; grid-template-columns: minmax(0, 1fr); }
  .pt-cap { padding: 24px 22px; }
  .pt-who__col { padding: 26px 22px 24px; }
  .pt-open__body { padding: 20px 20px 18px; }

  /* The demoted row stacks. The status and the link do not fit on one line at
     390px, and putting them side by side overflowed by 24px. They stack in
     this order on purpose: the "not open" reading always lands before the
     affordance, never beside it. */
  .pt-shut__row { grid-template-columns: minmax(0, 1fr); gap: 14px; padding: 18px; }

  .pt-shut__right {
    flex-direction: column;
    align-items: flex-start;
    gap: 12px;
    width: 100%;
  }
  .pt-boundary, .pt-folio__note { padding: 16px; }

  /* Two buttons of different widths stacked left-aligned read as ragged.
     Full width is tidier and gives both a 48px target. */
  .pt-hero__actions .btn { width: 100%; }
  .pt-index__grid, .pt-index__routes { padding-top: 40px; }
  .pt-disclosure { padding: 32px 0 44px; }
}

@media (prefers-reduced-motion: reduce) {
  .pt-card, .pt-card:hover,
  .link-arrow .ico, .pt-shut__link .ico { transition: none; transform: none; }
}

/* ===========================================================================
   THE OPERATING PARTNERS PAGE, 2026-09-08
   ---------------------------------------------------------------------------
   "This cannot be a partner directory. Logo. Company name. Asset class. Six
   published deals. Learn more. That wastes the opportunity."

   It was exactly that: three cards, 205 words. Each operator now gets a full
   band rather than a card, and the bands alternate ground so scrolling the
   page feels like moving between three companies rather than reading a list.

   THE STATUS COLOURS ARE THE COMPLIANCE POINT, not decoration. "If it's
   operating, say OPERATING. If it's under construction, say UNDER
   CONSTRUCTION. If it's planned, say IN DEVELOPMENT. That honesty makes the
   whole presentation stronger." Six of the ten opportunities on this page are
   pipeline, and pipeline must never read as investable.
   ========================================================================= */

.op-open{padding:clamp(64px,8vw,120px) 0 clamp(30px,4vw,48px)}
.op-open .lede{max-width:52ch;margin-top:clamp(14px,1.8vw,22px)}

.op-world{padding-block:clamp(48px,6vw,92px);border-top:1px solid var(--hd-line-d)}
/* Alternating ground. Three operators, three distinct environments. */
.op-world--2{background:var(--hd-navy-deep)}
.op-world .lede{max-width:56ch;margin-top:12px}
.op-world h2{margin:6px 0 0}

/* Big verified numbers. Only Wealth and Storage Caves have any; OGH gets no
   strip rather than a strip of dashes. */
.op-figs{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(min(180px,100%),1fr));
  gap:clamp(16px,2.4vw,32px);
  margin:clamp(26px,3.2vw,40px) 0 0;padding-block:clamp(20px,2.4vw,28px);
  border-block:1px solid var(--hd-line-d);
}
.op-figs > div{display:grid;grid-row:span 2;grid-template-rows:subgrid;gap:6px;align-content:start}
.op-figs dt{font-size:11px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--hd-fg-3);line-height:1.35}
.op-figs dd{margin:0;font-family:var(--hd-serif);font-weight:400;font-size:clamp(2.1rem,4.4vw,3.2rem);line-height:1;color:var(--hd-accent);font-variant-numeric:tabular-nums}

.op-people{display:flex;flex-wrap:wrap;gap:clamp(18px,3vw,44px);margin:clamp(22px,2.6vw,32px) 0 0;padding:0;list-style:none}
.op-people b{display:block;color:var(--hd-fg)}
.op-people span{display:block;margin-top:3px;max-width:34ch;font-size:.9375rem;color:var(--hd-fg-2)}

.op-sub{margin:clamp(30px,3.6vw,44px) 0 0;font-size:11px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--hd-fg-3)}

.op-opps{display:grid;gap:1px;margin:14px 0 0;padding:0;list-style:none;background:var(--hd-line-d)}
.op-opp a{
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:baseline;
  gap:6px clamp(14px,2vw,26px);padding:clamp(14px,1.8vw,20px);
  background:var(--hd-navy);text-decoration:none;
}
.op-world--2 .op-opp a{background:var(--hd-navy-deep)}
.op-opp a:hover{background:var(--hd-navy-2)}
.op-opp b{color:var(--hd-fg);font-weight:600}
.op-opp__m{grid-column:1;color:var(--hd-fg-3);font-size:.875rem}
.op-opp__s{
  grid-row:1 / span 2;grid-column:2;align-self:center;white-space:nowrap;
  padding:5px 11px;border-radius:999px;
  font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
}
.op-opp.is-open     .op-opp__s{color:#5FD39B;background:rgba(29,122,69,.20)}
.op-opp.is-review   .op-opp__s{color:var(--hd-gold);background:rgba(217,164,65,.14)}
.op-opp.is-pipeline .op-opp__s{color:var(--hd-fg-3);background:rgba(255,255,255,.05)}
.op-opp.is-closed   .op-opp__s{color:var(--hd-fg-3);background:rgba(255,255,255,.05)}

/* THE CLOSE. "No sales pitch. No giant CTA... If they're an investor, they
   barely notice it. If they're a developer looking for capital? They know
   EXACTLY what it means."

   So it is the quietest block on the page: no panel, no accent ground, no
   button. A line and a link, at body weight. */
.op-quiet{padding-block:clamp(52px,6.5vw,96px);border-top:1px solid var(--hd-line-d)}
.op-quiet__h{margin:0;font-family:var(--hd-serif);font-weight:400;font-size:clamp(1.15rem,2.2vw,1.5rem);color:var(--hd-fg)}
.op-quiet__b{margin:10px 0 18px;max-width:54ch;color:var(--hd-fg-2)}
.op-quiet__f{margin:16px 0 0;font-size:.8125rem;color:var(--hd-fg-3)}

@media (max-width:560px){
  .op-opp a{grid-template-columns:1fr}
  .op-opp__s{grid-row:auto;grid-column:1;justify-self:start;margin-top:8px}
}
