/* Sokosumi shared design system. Both the homepage (index.html) and every
   server-rendered sub-page load this file. Homepage-only composition
   (hero, intro, how-it-works, org chart, Florian quote) lives in
   /assets/landing.css. Header/footer chrome lives in /assets/nav.css. */

:root {
  --background: #fafaf9;
  --ink: #0f0e0d;
  --card: #ffffff;
  --muted: #f2f1f0;
  --foreground: #0f0e0d;
  /* 0.55 measured 4.13-4.28 against the three light surfaces — under the 4.5
     WCAG AA needs for body text, which failed the whole footer and the cookie
     banner. 0.60 clears it on all three (4.90-5.03) and is a small enough step
     from 0.55 to leave the hierarchy looking the same. */
  --muted-foreground: rgba(15, 14, 13, 0.6);
  --border: rgba(15, 14, 13, 0.12);
  --hairline-dark: rgba(255, 255, 255, 0.16);
  --primary: #6400ff;
  --primary-soft: rgba(100, 0, 255, 0.08);
  /* #6400ff is a light-surface accent — luminance 0.10, so it goes muddy on
     ink. This is the app's own dark-theme purple, for the dark bands. */
  --primary-on-dark: hsla(270, 64%, 63%, 1);
  --r-sm: 4px;
  --r-md: 6px;
  --r-lg: 8px;
  --ease: cubic-bezier(0.16, 1, 0.3, 1);
  --sans: "Inter", -apple-system, system-ui, sans-serif;
  /* Aliases so landing.css can say "serif" without shipping a second face.
     Both resolve to Inter — a real serif later is a token change, not a
     per-surface edit. */
  --serif: "Inter", -apple-system, system-ui, sans-serif;
  --mono: "Inter", -apple-system, system-ui, sans-serif;
}
* { margin: 0; box-sizing: border-box; }
/* `clip` rather than `hidden`: it stops a full-bleed band from ever producing
   a horizontal scrollbar without turning <html> into a scroll container. */
html { scroll-behavior: smooth; overflow-x: clip; }
/* No overflow-x on body: html's clip above already contains horizontal
   overflow, and overflow-x: hidden here made <body> its own (never-scrolling)
   scroll container — which silently broke the sticky header, so it scrolled
   away with the page instead of pinning to the top. */
body {
  font-family: var(--sans); font-size: 15px;
  background: var(--background); color: var(--foreground);
  -webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
img { max-width: 100%; }
button { font-family: inherit; }
.container-app { max-width: 1240px; margin: 0 auto; padding: 0 clamp(24px, 4vw, 56px); }
.muted { color: var(--muted-foreground); }
.icon { flex-shrink: 0; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

/* ===== reveals (site.js) ===== */
[data-reveal] {
  opacity: 0; transform: translateY(14px);
  transition: opacity 0.5s var(--ease), transform 0.5s var(--ease);
  transition-delay: calc(min(var(--i, 0), 4) * 55ms);
}
[data-reveal].in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { transition: none; opacity: 1; transform: none; }
}
/* The first block on the page is the LCP element on nearly every route, and
   starting it at opacity 0 meant the largest paint could not happen until the
   deferred site.js had run its observer — about half a second of LCP bought
   for an animation nobody sees, because it is already in view on load.
   Everything below the fold still animates. */
.page-head[data-reveal],
.page-head [data-reveal],
.blk-hero[data-reveal],
.hero [data-reveal] {
  opacity: 1;
  transform: none;
}

/* ===== buttons — same scale and states as the landing page ===== */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  height: 40px; padding: 0 18px; border-radius: var(--r-md);
  font-size: 14px; font-weight: 500; letter-spacing: 0; white-space: nowrap;
  border: 1px solid transparent; cursor: pointer;
  transition: background-color 0.25s var(--ease), border-color 0.25s var(--ease), color 0.25s var(--ease);
}
.btn:active { transform: translateY(1px); }
.btn-primary { background: var(--ink); color: #fff; }
.btn-primary:hover { background: #2b2926; }
.btn-outline { background: transparent; color: var(--foreground); border-color: var(--border); }
.btn-outline:hover { border-color: rgba(15, 14, 13, 0.4); }
.btn-ghost { background: transparent; color: var(--muted-foreground); }
.btn-ghost:hover { color: var(--foreground); }
.btn-sm { height: 34px; padding: 0 14px; font-size: 13px; }
.btn-lg { height: 44px; padding: 0 22px; font-size: 14.5px; }
.btn-lg.btn-outline { padding: 0 22px; }
.btn .orb { display: none; }

/* ===== header =====
   The whole site header — bar, dropdown panels, burger, mobile drawer, and
   the homepage's transparent overlay state — lives in /assets/nav.css, the
   one stylesheet both index.html and the server-rendered sub-pages load.
   Do not re-add header rules here: that is exactly how the two surfaces
   drifted apart before. */

/* ===== breadcrumbs ===== */
.crumbs { padding: 18px clamp(24px, 4vw, 56px) 0; font-size: 12.5px; color: var(--muted-foreground); }
.crumbs a { transition: color 0.25s var(--ease); }
.crumbs a:hover { color: var(--foreground); }
.crumbs .sep { margin: 0 4px; opacity: 0.5; }
.crumbs .current { color: var(--foreground); }

/* ===== page anatomy ===== */
main.page { min-height: 60vh; }
.page-head { padding: clamp(36px, 5vw, 64px) 0 clamp(28px, 4vw, 44px); max-width: 820px; }
.page-head .eyebrow { display: block; font-size: 13px; color: var(--muted-foreground); margin-bottom: 14px; }
.page-head h1 {
  font-weight: 300; font-size: clamp(32px, 4.4vw, 54px);
  line-height: 1.08; letter-spacing: -0.025em; text-wrap: balance;
}
.page-head .sub { margin-top: 16px; font-size: 16.5px; line-height: 1.6; color: var(--muted-foreground); max-width: 58ch; text-wrap: pretty; }
.page-head .meta-row { margin-top: 18px; display: flex; flex-wrap: wrap; gap: 8px 18px; font-size: 13px; color: var(--muted-foreground); }

.page-section { padding: clamp(36px, 5vw, 56px) 0; border-top: 1px solid var(--border); }
.page-section.flush { border-top: none; padding-top: 0; }
.page-section > h2, .section-title {
  font-weight: 300; font-size: clamp(24px, 2.8vw, 34px);
  letter-spacing: -0.02em; line-height: 1.15; margin-bottom: 10px;
}
.page-section > .sub { font-size: 15.5px; color: var(--muted-foreground); max-width: 60ch; margin-bottom: 28px; }
.section-gap { height: clamp(36px, 5vw, 64px); }

/* ===== chips / labels (monochrome) ===== */
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; letter-spacing: 0.02em; color: var(--muted-foreground);
  border: 1px solid var(--border); border-radius: var(--r-sm); padding: 3px 9px;
  background: transparent;
}
.kicker { font-size: 12px; font-weight: 500; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted-foreground); }
.tag-quiet { font-size: 11px; letter-spacing: 0.05em; color: var(--muted-foreground); }

/* ===== avatars ===== */
.avatar {
  width: 34px; height: 34px; border-radius: 999px; overflow: hidden; flex-shrink: 0;
  background: var(--muted); color: #fff; font-size: 13px; font-weight: 500;
  display: inline-flex; align-items: center; justify-content: center;
}
.avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.avatar.lg { width: 44px; height: 44px; }
.avatar.sm { width: 26px; height: 26px; font-size: 11px; }

/* ===== vendor wordmarks =====
   Aspect ratios vary wildly, so height is fixed and width follows.
   .invert flattens white-on-transparent marketplace artwork to ink so it
   reads on paper — the mirror of .band-dark .trust-logo on the landing page. */
.vendor-logo { display: inline-flex; align-items: center; flex-shrink: 0; }
.vendor-logo img { height: 22px; width: auto; max-width: 190px; object-fit: contain; display: block; }
.vendor-logo.sm { margin-right: 11px; vertical-align: middle; }
.vendor-logo.sm img { height: 19px; max-width: 132px; }
.vendor-logo.lg { margin-bottom: 18px; }
.vendor-logo.lg img { height: 30px; max-width: 240px; }
.vendor-logo.invert img { filter: brightness(0); }

/* a vendor section head: wordmark, name, and the featured chip on one line.
   The name is a group label over a grid, not a headline — so it takes the
   quiet uppercase label treatment (.filter-label, .nav-intro-label) instead
   of the display h2. The tag stays an h2 for the document outline. */
.vendor-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 8px; }
.vendor-head h2 {
  margin-bottom: 0;
  font-size: 12px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted-foreground);
}
.vendor-head .vendor-logo.sm { margin-right: 0; }
.vendor-head .chip { align-self: center; }
/* the wordmark and name link to the vendor's page; hover lifts the label to
   ink, the same move as .site-nav and .row-go */
.vendor-head-link { display: inline-flex; align-items: center; gap: 12px; min-width: 0; }
.vendor-head-link h2 { transition: color 0.25s var(--ease); }
.vendor-head-link:hover h2, .vendor-head-link:focus-visible h2 { color: var(--foreground); }
/* the vendor's one-line CMS description, between the head and the count */
.vendor-desc { font-size: 14.5px; line-height: 1.6; color: var(--muted-foreground); max-width: 60ch; margin-bottom: 6px; }

/* ===== vendor pages (/vendors, /vendors/<slug>) ===== */
/* the computed facts row in the hero — counts derived from the catalog, so
   the line is always true without editing (reuses the .cw-stats look) */
.vendor-facts { margin-top: 20px; }

/* a curated coworker as a colleague, not a link: portrait, role, what it
   does, and its chips. Builds on .card, so hover/border/go come for free. */
.vcw-card { gap: 12px; }
.vcw-head { display: flex; align-items: center; gap: 14px; }
.vcw-face {
  width: 56px; height: 56px; border-radius: var(--r-md); overflow: hidden;
  background: var(--muted); flex-shrink: 0;
}
.vcw-face img { width: 100%; height: 100%; object-fit: cover; display: block; }
.vcw-id { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.vcw-id .role { font-size: 13px; color: var(--muted-foreground); }
.vcw-card p {
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
  font-size: 14px;
}
.vcw-foot { margin-top: auto; padding-top: 4px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* what the vendor's coworkers can do: one column per offer category, on the
   .uc-steps/.stat pattern — a rule, a quiet label with the count, the tasks */
.cap-grid { display: grid; gap: 22px 28px; grid-template-columns: 1fr; }
@media (min-width: 680px) { .cap-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1020px) { .cap-grid { grid-template-columns: repeat(3, 1fr); } }
.cap-col { border-top: 1px solid var(--foreground); padding-top: 14px; display: flex; flex-direction: column; align-items: flex-start; }
.cap-label {
  font-size: 11.5px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted-foreground); margin-bottom: 8px;
  display: flex; align-items: baseline; gap: 8px;
}
.cap-label em { font-style: normal; font-variant-numeric: tabular-nums; opacity: 0.7; }
.cap-task { display: block; padding: 5px 0; font-size: 14px; line-height: 1.45; transition: color 0.2s var(--ease); }
.cap-task small { font-size: 12px; color: var(--muted-foreground); margin-left: 6px; white-space: nowrap; }
.cap-task:hover { color: var(--primary); }
.cap-more { margin-top: 5px; font-size: 12.5px; color: var(--muted-foreground); }
.cap-browse {
  display: inline-flex; align-items: center; gap: 8px; margin-top: 28px;
  font-size: 13.5px; color: var(--muted-foreground); transition: color 0.25s var(--ease);
}
.cap-browse:hover { color: var(--primary); }

/* models + hosting, aggregated across the vendor's coworkers */
.stack-rows { display: flex; flex-direction: column; gap: 14px; max-width: 720px; }
.stack-row { display: flex; align-items: baseline; gap: 10px 16px; flex-wrap: wrap; }
.stack-label {
  font-size: 11.5px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted-foreground); min-width: 72px;
}
.stack-chips { display: flex; flex-wrap: wrap; gap: 8px; }

/* run count / rating / credits under a marketplace agent's description */
.row-stats { display: block; margin-top: 6px; font-size: 12.5px; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }

/* ===== agent vs coworker explainer (/ai-coworkers) =====
   Two columns on the .stat/.uc-steps pattern: a rule, a quiet uppercase
   label, a short paragraph. Neither column is styled as the better one. */
.duo-grid { display: grid; gap: 20px; grid-template-columns: 1fr; max-width: 920px; }
@media (min-width: 720px) { .duo-grid { grid-template-columns: 1fr 1fr; gap: clamp(24px, 3vw, 40px); } }
.duo-col { border-top: 1px solid var(--foreground); padding-top: 16px; }
.duo-label {
  font-size: 11.5px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted-foreground);
}
.duo-col p { margin-top: 8px; font-size: 14.5px; line-height: 1.6; color: var(--muted-foreground); max-width: 46ch; }

/* ===== use cases ===== */
/* ===== industry filter =====
   Industries are a lens on the same set of workflows, so they read as a row
   of controls. They used to be bordered white cards in a grid, identical to
   the use-case cards below them, and nothing told a reader which was which. */
.filter-bar { padding-bottom: clamp(24px, 3vw, 34px); }
.filter-label {
  font-size: 11.5px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted-foreground); margin-bottom: 14px;
}
.ind-bar { display: flex; flex-wrap: wrap; gap: 8px; }
.ind-pill {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 8px 14px; border-radius: 999px;
  border: 1px solid var(--border); background: transparent;
  font-size: 14px; color: var(--foreground); white-space: nowrap;
  transition: border-color 0.2s var(--ease), background-color 0.2s var(--ease);
}
.ind-pill:hover { border-color: rgba(15, 14, 13, 0.4); background: var(--muted); }
.ind-pill em {
  font-style: normal; font-size: 12px; font-variant-numeric: tabular-nums;
  color: var(--muted-foreground);
}
.ind-pill:hover em { color: var(--foreground); }

@media (min-width: 760px) { .uc-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1100px) { .uc-grid { grid-template-columns: repeat(3, 1fr); } }
.uc-card { padding-top: 20px; }
/* The card's banner is the page's own seeded abstract field (templates/
   art.js) at thumbnail size — the card previews the page it links to, and
   the composition varies per slug, so the colour still does the
   distinguishing without putting one coworker's face on the work. */
.uc-card.has-art { padding-top: 0; }
.uc-art {
  display: block; margin: 0 -22px 6px;
  border-radius: var(--r-lg) var(--r-lg) 0 0; overflow: hidden;
  aspect-ratio: 5 / 2; background: var(--card);
  border-bottom: 1px solid var(--border);
}
.uc-art svg { width: 100%; height: 100%; display: block; }
.uc-eyebrow {
  font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted-foreground); margin-bottom: 2px;
}
.avatar.xs { width: 22px; height: 22px; font-size: 10px; }

.uc-steps { list-style: none; display: grid; gap: 14px; grid-template-columns: 1fr; counter-reset: none; }
@media (min-width: 800px) { .uc-steps { grid-template-columns: repeat(3, 1fr); gap: 28px; } }
.uc-steps li { display: flex; flex-direction: column; gap: 7px; padding-top: 16px; border-top: 1px solid var(--foreground); }
.uc-steps .n { font-size: 12px; letter-spacing: 0.08em; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
.uc-steps strong { font-size: 16px; font-weight: 500; letter-spacing: -0.01em; }
.uc-steps li > span:last-child { font-size: 14px; line-height: 1.55; color: var(--muted-foreground); }

/* ===== use-case detail: the HubSpot-shaped hero =====
   Centred, outcome-led copy over a seeded abstract field (templates/art.js)
   — the platform is what the hero names, the way HubSpot's hero names the
   Hub; no coworker portrait fronts the page. The art layer is decorative
   and absolutely positioned, so a page whose field fails to generate is
   simply a plain centred hero. */
.uc-hero-hs { position: relative; text-align: center; padding: clamp(64px, 9vw, 126px) 0 clamp(44px, 6vw, 76px); }
.uc-hero-art { position: absolute; inset: 0; pointer-events: none; }
.uc-hero-art svg { width: 100%; height: 100%; display: block; }
.uc-hero-copy { position: relative; }
.uc-hero-hs h1 { margin-left: auto; margin-right: auto; max-width: 22ch; }
.uc-hero-hs .sub { margin-left: auto; margin-right: auto; }
.uc-hero-hs .cta-row { justify-content: center; }
.uc-hero-hs .no-card { margin-top: 10px; }

/* ===== use-case detail: the centred value-prop intro =====
   The page's first rich text block, hoisted under the hero — HubSpot's
   "Use the Hub to…" paragraph. A centred measure, a touch larger than
   body prose; pages without rich text simply have no intro. */
.uc-intro .prose { max-width: 68ch; margin: 0 auto; font-size: 16.5px; line-height: 1.7; }
.uc-intro .prose > p:first-child { font-size: 18px; color: var(--foreground); }

/* ===== use-case detail: the mid-page CTA =====
   The outcome restated after the capability sections, with the same two
   doors as the hero — HubSpot's mid-page close, kept lighter than the ink
   band the page still ends with. */
.uc-mid-cta { text-align: center; }
.uc-mid-cta > h2 { max-width: 24ch; margin-left: auto; margin-right: auto; }
.uc-mid-cta > .sub { margin-left: auto; margin-right: auto; margin-bottom: 24px; }
.uc-mid-cta .cta-row { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; }
.uc-mid-cta .no-card { margin-top: 12px; }

/* ===== use-case detail: the numbered chapters =====
   The steps block, promoted from three small cards to the spine of the
   page: a big purple numeral, a display-size title, room to breathe. */
/* the chapters' head is HubSpot's centred value-prop lead-in */
.blk-chapters .blk-head { max-width: 640px; margin-left: auto; margin-right: auto; text-align: center; }
.blk-chapters .blk-head .sub { margin-left: auto; margin-right: auto; }
.chapters { list-style: none; margin: 0; padding: 0; }
.chapter {
  display: grid; grid-template-columns: minmax(56px, 92px) minmax(0, 1fr);
  gap: 10px clamp(20px, 4vw, 48px);
  padding: clamp(26px, 4vw, 42px) 0;
  border-top: 1px solid var(--foreground);
}
.ch-num {
  font-weight: 300; font-size: clamp(28px, 3.4vw, 44px); line-height: 1;
  letter-spacing: -0.02em; color: var(--primary); font-variant-numeric: tabular-nums;
}
.chapter h3 {
  font-weight: 300; font-size: clamp(21px, 2.6vw, 30px);
  letter-spacing: -0.02em; line-height: 1.15; max-width: 26ch; text-wrap: balance;
}
.chapter p { margin-top: 10px; font-size: 15.5px; line-height: 1.65; color: var(--muted-foreground); max-width: 58ch; }
@media (max-width: 640px) { .chapter { grid-template-columns: 1fr; gap: 8px; } }

/* ===== use-case detail: the team and their tasks =====
   Named coworkers with the template tasks behind the workflow — the proof
   this site can honestly make: real work a visitor can open and run. */
.uc-team { display: grid; gap: 14px; grid-template-columns: 1fr; }
@media (min-width: 760px) { .uc-team { grid-template-columns: repeat(2, 1fr); } }
.uc-mate {
  display: flex; flex-direction: column; gap: 12px; padding: 18px;
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg);
}
.uc-mate-tasks { display: flex; flex-direction: column; gap: 7px; border-top: 1px solid var(--border); padding-top: 12px; }
.uc-mate-tasks a {
  display: flex; align-items: baseline; gap: 8px;
  font-size: 13.5px; line-height: 1.45; color: var(--muted-foreground);
  transition: color 0.25s var(--ease);
}
.uc-mate-tasks a:hover { color: var(--foreground); }
.uc-mate-tasks .icon { position: relative; top: 1px; color: var(--primary); }

/* the nav panel's "Browse by industry" link lands on the hub's filter bar */
.filter-bar { scroll-margin-top: 84px; }

.vendor-list .row-item { grid-template-columns: minmax(150px, 330px) 1fr auto; }
.vendor-list .row-title { display: inline-flex; align-items: center; }
@media (max-width: 720px) { .vendor-list .row-item { grid-template-columns: 1fr auto; } }

/* ===== quiet index rows (lists: guides, vendors, releases…) ===== */
.row-list { border-top: 1px solid var(--border); }
.row-item {
  display: grid; grid-template-columns: minmax(150px, 260px) 1fr auto;
  gap: 10px clamp(24px, 4vw, 64px); align-items: baseline;
  padding: 22px 0; border-bottom: 1px solid var(--border);
}
/* h2 and h3 share one size here: the heading LEVEL follows the document
   outline (h2 when the card tier sits directly under the page h1), the type
   scale does not change with it */
.row-item h2, .row-item h3, .row-item .row-title { font-size: 17px; font-weight: 500; letter-spacing: -0.01em; }
.row-item p { font-size: 15px; line-height: 1.55; color: var(--muted-foreground); max-width: 62ch; }
.row-go {
  display: inline-flex; align-items: center; gap: 8px; white-space: nowrap;
  font-size: 13px; color: var(--muted-foreground); transition: color 0.25s var(--ease);
}
.row-go .icon { transition: transform 0.3s var(--ease); }
.row-item:hover .row-go { color: var(--foreground); }
.row-item:hover .row-go .icon { transform: translate(2px, -2px); }
@media (max-width: 720px) {
  .row-item { grid-template-columns: 1fr auto; }
  .row-item p { grid-column: 1 / -1; grid-row: 2; }
}

/* ===== card grids ===== */
.card-grid { display: grid; gap: 14px; grid-template-columns: 1fr; }
@media (min-width: 680px) { .card-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1020px) { .card-grid { grid-template-columns: repeat(3, 1fr); } }
/* A three-column track holding one card reads as a mistake. Collections that
   know their length cap the track instead of leaving two empty columns. */
@media (min-width: 680px) {
  .card-grid.cols-1 { grid-template-columns: minmax(0, 620px); }
  .card-grid.cols-2 { grid-template-columns: repeat(2, minmax(0, 420px)); }
}
.card {
  display: flex; flex-direction: column; gap: 10px; padding: 22px;
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg);
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease);
}
a.card:hover { border-color: rgba(15, 14, 13, 0.4); transform: translateY(-2px); }
/* same note as .row-item: h2 vs h3 is document outline, not type scale */
.card h2, .card h3 { font-size: 16.5px; font-weight: 500; letter-spacing: -0.01em; }
.card p { font-size: 13.5px; line-height: 1.55; color: var(--muted-foreground); }
.card .card-foot { margin-top: auto; padding-top: 12px; display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--muted-foreground); }
.card .card-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.card .go { margin-left: auto; opacity: 0; transform: translate(-4px, 4px); transition: opacity 0.3s var(--ease), transform 0.3s var(--ease); display: inline-flex; }
a.card:hover .go { opacity: 1; transform: none; }
/* a card that leads with artwork: the image bleeds to the card's own edges */
.card.has-media { padding-top: 0; }
.card .card-media {
  margin: 0 -22px 4px; border-radius: var(--r-lg) var(--r-lg) 0 0;
  overflow: hidden; aspect-ratio: 16 / 9; background: var(--muted);
}
.card .card-media img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* article lead image, sized to the prose measure rather than the full grid */
.post-cover { margin: 0 0 clamp(28px, 4vw, 44px); max-width: 860px; }
/* aspect-ratio, not height:auto — the cover sits above the fold on articles,
   and without a reserved box the whole article jumped down by ~480px the
   moment the image arrived. The product screenshots are already 16:9, so
   cover crops nothing for them. */
.post-cover img {
  width: 100%; aspect-ratio: 16 / 9; height: auto; object-fit: cover;
  display: block; border-radius: var(--r-lg); background: var(--muted);
}

/* ===== coworker tiles (index) ===== */
.cw-grid { display: grid; gap: 14px; grid-template-columns: repeat(2, 1fr); }
@media (min-width: 720px) { .cw-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1020px) { .cw-grid { grid-template-columns: repeat(4, 1fr); } }
.cw-tile {
  display: flex; flex-direction: column; align-items: flex-start; gap: 4px;
  padding: 0 0 14px; border-radius: var(--r-lg); overflow: hidden;
  background: var(--card); border: 1px solid var(--border);
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease);
}
.cw-tile:hover { border-color: rgba(15, 14, 13, 0.4); transform: translateY(-2px); }
.cw-tile .portrait { width: 100%; aspect-ratio: 1; background: var(--muted); overflow: hidden; margin-bottom: 12px; }
.cw-tile .portrait img { width: 100%; height: 100%; object-fit: cover; display: block; transform: scale(1.06); transition: transform 0.8s var(--ease); }
.cw-tile:hover .portrait img { transform: scale(1.12); }
.cw-tile h3 { font-size: 16px; font-weight: 500; padding: 0 16px; }
.cw-tile .role { font-size: 13px; color: var(--muted-foreground); padding: 0 16px; }
.cw-tile .count { font-size: 12.5px; color: var(--muted-foreground); padding: 6px 16px 0; }

/* ===== coworker profile ===== */
.cw-hero { display: grid; gap: clamp(28px, 4vw, 56px); grid-template-columns: 1fr; padding: clamp(32px, 4vw, 56px) 0; align-items: start; }
@media (min-width: 860px) { .cw-hero { grid-template-columns: minmax(260px, 380px) 1fr; } }
.cw-portrait { border-radius: var(--r-lg); overflow: hidden; background: var(--muted); aspect-ratio: 1; }
.cw-portrait img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* line-art icons stand for marketplace listings: contain and inset them so the
   strokes keep their weight instead of being cropped to fill a portrait frame */
.cw-portrait.is-icon { background: var(--card); border: 1px solid var(--border); }
.cw-portrait.is-icon img { object-fit: contain; padding: 26%; }
.portrait.is-icon img, .cw-tile .portrait.is-icon img { object-fit: contain; padding: 24%; }
.avatar.is-icon { background: var(--muted); }
.avatar.is-icon img { object-fit: contain; padding: 18%; }
.cw-info { display: flex; flex-direction: column; align-items: flex-start; gap: 14px; max-width: 640px; }
.cw-info .eyebrow { font-size: 13px; color: var(--muted-foreground); }
.cw-info h1 { font-weight: 300; font-size: clamp(32px, 4vw, 48px); letter-spacing: -0.025em; line-height: 1.05; }
.cw-info .role { font-size: 16px; color: var(--muted-foreground); }
.cw-tags { display: flex; flex-wrap: wrap; gap: 8px; }
.cw-desc { font-size: 15.5px; line-height: 1.65; color: var(--muted-foreground); text-wrap: pretty; }
.cw-cta { margin-top: 8px; }
.cta-note { margin-top: 10px; font-size: 12.5px; line-height: 1.5; color: var(--muted-foreground); max-width: 46ch; }
/* the reassurance line under every signup button (never in the nav).
   Paper default. Dark surfaces override: .blk-cta .no-card below, and
   .hero .no-card in landing.css (white 0.5 on the ink hero). */
.no-card { display: block; margin-top: 4px; font-size: 12px; line-height: 1.4; color: var(--muted-foreground); }
.cta-action { display: flex; flex-direction: column; align-items: flex-start; gap: 0; }
/* two classes, so it outranks .blk-cta p (16px) */
.blk-cta .no-card { margin-top: 10px; font-size: 12px; color: rgba(255, 255, 255, 0.55); }
.cw-stats { display: flex; flex-wrap: wrap; gap: 10px 28px; font-size: 13.5px; color: var(--muted-foreground); }
.cw-stats strong { color: var(--foreground); font-weight: 500; }

/* ===== offer / task cards ===== */
.offers-grid { display: grid; gap: 14px; grid-template-columns: 1fr; }
@media (min-width: 680px) { .offers-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1020px) { .offers-grid { grid-template-columns: repeat(3, 1fr); } }
.offer-card {
  display: flex; flex-direction: column; gap: 8px; padding: 20px;
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg);
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease);
}
.offer-card:hover { border-color: rgba(15, 14, 13, 0.4); transform: translateY(-2px); }
.offer-meta { display: flex; align-items: center; gap: 10px; font-size: 11.5px; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted-foreground); }
/* the output-type badge: per-type icon + label with one quiet tint each, so a
   wall of cards scans by what a task produces without turning into a rainbow.
   Hues are kept near-ink (low chroma, ≤10% alpha grounds); text is the only
   saturated-ish part and stays AA on the card white. */
.offer-type {
  display: inline-flex; align-items: center; gap: 6px; margin-left: auto;
  font-size: 10.5px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
  padding: 4px 9px; border-radius: var(--r-sm);
  background: var(--muted); color: var(--muted-foreground); white-space: nowrap;
}
.offer-type[data-out="html"] { background: rgba(100, 0, 255, 0.07); color: #5b21c9; }
.offer-type[data-out="pdf"] { background: rgba(178, 60, 44, 0.08); color: #96473a; }
.offer-type[data-out="doc"] { background: rgba(43, 84, 156, 0.08); color: #3d5d99; }
.offer-type[data-out="slides"] { background: rgba(176, 116, 24, 0.1); color: #8a651f; }
.offer-type[data-out="image"] { background: rgba(26, 122, 103, 0.09); color: #2a6f60; }
.offer-type[data-out="sheet"] { background: rgba(38, 125, 66, 0.09); color: #34694a; }
/* on the task detail page the badge sits beside the kicker, not card-right */
.task-side .offer-type { margin-left: 0; font-size: 11px; }
.offer-title { font-size: 16px; font-weight: 500; letter-spacing: -0.01em; line-height: 1.35; }
.offer-desc {
  font-size: 13.5px; line-height: 1.55; color: var(--muted-foreground);
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.offer-foot { margin-top: auto; padding-top: 12px; display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--muted-foreground); border-top: 1px solid var(--border); }
.offer-foot .go { margin-left: auto; opacity: 0; transform: translate(-4px, 4px); transition: opacity 0.3s var(--ease), transform 0.3s var(--ease); display: inline-flex; color: var(--foreground); }
.offer-card:hover .offer-foot .go { opacity: 1; transform: none; }

/* ===== task browse filters ===== */
.tasks-search {
  display: flex; align-items: center; gap: 10px; margin-top: 22px;
  width: min(560px, 100%); background: var(--card); border: 1px solid var(--border);
  border-radius: var(--r-md); padding: 0 14px; height: 46px;
}
.tasks-search:focus-within { border-color: rgba(15, 14, 13, 0.4); }
.tasks-search input { flex: 1; border: none; outline: none; font-family: inherit; font-size: 14.5px; background: transparent; color: var(--foreground); min-width: 0; }
.tasks-search input::placeholder { color: rgba(15, 14, 13, 0.4); }
.ts-icon { color: var(--muted-foreground); display: inline-flex; }
.tasks-filters { display: flex; flex-wrap: wrap; gap: 8px; padding: 4px 0 26px; }
.fchip {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  font-size: 13px; padding: 7px 14px; border-radius: var(--r-md);
  background: transparent; color: var(--muted-foreground); border: 1px solid var(--border);
  transition: background-color 0.25s var(--ease), color 0.25s var(--ease), border-color 0.25s var(--ease);
}
.fchip span { font-size: 11.5px; opacity: 0.7; }
.fchip:hover { border-color: rgba(15, 14, 13, 0.4); color: var(--foreground); }
.fchip.active { background: var(--ink); color: #fff; border-color: var(--ink); }
.fchip.active span { opacity: 0.7; }
.tasks-empty { padding: 48px 0 24px; display: flex; flex-direction: column; align-items: flex-start; gap: 14px; color: var(--muted-foreground); }

/* ===== task page ===== */
.task-layout { display: grid; gap: clamp(28px, 4vw, 56px); grid-template-columns: 1fr; padding: clamp(28px, 4vw, 48px) 0 clamp(48px, 6vw, 80px); align-items: start; }
@media (min-width: 980px) { .task-layout { grid-template-columns: 1.35fr 1fr; } }
.task-side { display: flex; flex-direction: column; gap: 20px; max-width: 560px; }
.task-side h1 { font-weight: 300; font-size: clamp(28px, 3.2vw, 40px); letter-spacing: -0.02em; line-height: 1.12; }
.task-side .lede { font-size: 15.5px; line-height: 1.65; color: var(--muted-foreground); }
.task-side .meta-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.deliverable { border: 1px solid var(--border); border-radius: var(--r-md); padding: 14px 16px; background: var(--card); }
.deliverable .label { font-size: 11.5px; font-weight: 500; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted-foreground); margin-bottom: 6px; }
.deliverable p { font-size: 14px; line-height: 1.55; }
/* the composed "What you get" panel: an optional editorial lead (deliverable
   today, longDeliverable when the CMS grows it) over three fact rows that are
   always present, so the panel holds up when the lead is empty */
.wyg .label { margin-bottom: 10px; }
.wyg-lead { padding-bottom: 12px; margin-bottom: 12px; border-bottom: 1px solid var(--border); }
.wyg-facts { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.wyg-facts li { display: flex; gap: 10px; font-size: 13.5px; line-height: 1.55; color: rgba(15, 14, 13, 0.75); }
.wyg-facts .icon { margin-top: 2px; color: var(--muted-foreground); }
.by-row { display: inline-flex; align-items: center; gap: 12px; transition: opacity 0.25s var(--ease); }
.by-row:hover { opacity: 0.75; }
.by-row .who { display: flex; flex-direction: column; line-height: 1.35; font-size: 14.5px; font-weight: 500; }
.by-row .who small { font-size: 12.5px; font-weight: 400; color: var(--muted-foreground); }
.task-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.task-actions .cta-note { flex-basis: 100%; margin-top: 2px; }

/* ===== sample preview embeds ===== */
.task-preview { border: 1px solid var(--border); border-radius: var(--r-lg); overflow: hidden; background: var(--card); }
/* loading veil for remote samples (IPFS pins, the Office viewer): sits on top
   of the embed while [data-loading] is set. The asset's load event lifts it;
   if that event never fires (dead pin, blocked viewer) a 15s delayed keyframe
   lifts it anyway, so nothing spins forever. templates/tasks.js adds a
   <noscript> rule hiding it when JS is off. */
.embed-wrap { position: relative; }
.embed-wrap[data-loading] { min-height: 320px; }
.embed-loading {
  position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 12px; padding: 24px;
  background: var(--card); color: var(--muted-foreground); font-size: 13px; text-align: center;
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity 0.35s var(--ease), visibility 0.35s;
}
.embed-wrap[data-loading] .embed-loading {
  opacity: 1; visibility: visible;
  animation: embed-veil-timeout 0s linear 15s forwards;
}
@keyframes embed-veil-timeout { to { opacity: 0; visibility: hidden; } }
.embed-spinner {
  width: 22px; height: 22px; border-radius: 999px;
  border: 2px solid var(--border); border-top-color: var(--primary);
  animation: embed-spin 0.8s linear infinite;
}
@keyframes embed-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  /* no spin — the veil becomes a static "Loading the sample…" notice; the
     delayed timeout keyframe stays, because it is a state change, not motion */
  .embed-spinner { animation: none; }
}
.embed-frame { display: block; width: 100%; height: min(72vh, 640px); border: none; background: #fff; }
.embed-image { display: block; width: 100%; height: auto; }
.embed-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-height: 320px; color: var(--muted-foreground); font-size: 14px; padding: 24px; text-align: center; }
.embed-doc-scroll { max-height: min(72vh, 640px); overflow: auto; }
.task-doc { padding: clamp(20px, 3vw, 36px); }
.task-doc-head { display: flex; align-items: center; gap: 8px; font-size: 12.5px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted-foreground); margin-bottom: 16px; }
.task-doc-body { font-size: 14.5px; line-height: 1.7; }
.task-doc-body h1, .task-doc-body h2, .task-doc-body h3 { font-weight: 500; letter-spacing: -0.01em; margin: 1.4em 0 0.5em; }
.task-doc-body h1 { font-size: 20px; } .task-doc-body h2 { font-size: 17px; } .task-doc-body h3 { font-size: 15.5px; }
.task-doc-body p, .task-doc-body li { color: rgba(15, 14, 13, 0.75); margin: 0.45em 0; }
.task-doc-body ul, .task-doc-body ol { padding-left: 1.3em; }
.embed-radio { position: absolute; opacity: 0; pointer-events: none; }
.embed-tabs { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 12px; border-bottom: 1px solid var(--border); background: var(--background); }
.embed-tabs label {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  font-size: 12.5px; padding: 6px 12px; border-radius: var(--r-sm);
  border: 1px solid var(--border); color: var(--muted-foreground);
  transition: background-color 0.25s var(--ease), color 0.25s var(--ease);
}
.task-preview.has-tabs { position: relative; }
/* the fieldset exists to name the radio group for assistive tech; it must
   not add any box of its own */
.embed-tabset { border: 0; margin: 0; padding: 0; min-width: 0; }

/* ===== prose (CMS rich text) ===== */
.prose { max-width: 720px; font-size: 16px; line-height: 1.75; }
.prose > * + * { margin-top: 0.9em; }
.prose h2 { font-weight: 400; font-size: clamp(22px, 2.4vw, 28px); letter-spacing: -0.015em; margin-top: 2em; line-height: 1.25; }
.prose h3 { font-weight: 500; font-size: 18px; letter-spacing: -0.01em; margin-top: 1.6em; }
.prose h4 { font-weight: 500; font-size: 16px; margin-top: 1.4em; }
.prose p, .prose li { color: rgba(15, 14, 13, 0.78); }
.prose ul, .prose ol { padding-left: 1.35em; }
.prose li + li { margin-top: 0.35em; }
.prose a { text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--border); transition: text-decoration-color 0.25s var(--ease); }
.prose a:hover { text-decoration-color: var(--foreground); }
.prose blockquote { border-left: 1px solid var(--foreground); padding-left: 20px; font-size: 17px; color: var(--foreground); }
.prose code { font-size: 0.9em; background: var(--muted); border-radius: var(--r-sm); padding: 2px 6px; }
.prose pre { background: var(--ink); color: #fafaf9; border-radius: var(--r-md); padding: 18px 20px; overflow-x: auto; font-size: 13.5px; line-height: 1.6; }
.prose pre code { background: none; padding: 0; }
.prose img { border-radius: var(--r-md); }
.prose hr { border: none; border-top: 1px solid var(--border); margin: 2em 0; }

/* ===== CMS blocks ===== */
.blk { padding: clamp(40px, 6vw, 80px) 0; }
.blk + .blk { border-top: 1px solid var(--border); }
.blk-hero { padding: clamp(56px, 8vw, 110px) 0 clamp(40px, 6vw, 72px); border-top: none !important; }
.blk-hero .eyebrow { display: block; font-size: 13px; color: var(--muted-foreground); margin-bottom: 16px; }
.blk-hero h1 { font-weight: 300; font-size: clamp(34px, 5vw, 62px); letter-spacing: -0.028em; line-height: 1.06; max-width: 20ch; text-wrap: balance; }
.blk-hero .sub { margin-top: 18px; font-size: 17px; line-height: 1.6; color: var(--muted-foreground); max-width: 56ch; text-wrap: pretty; }
.blk-hero .cta-row { margin-top: 30px; display: flex; flex-wrap: wrap; gap: 10px; }
.blk-head { max-width: 760px; margin-bottom: clamp(28px, 4vw, 44px); }
.blk-head h2 { font-weight: 300; font-size: clamp(26px, 3vw, 38px); letter-spacing: -0.02em; line-height: 1.12; text-wrap: balance; }
.blk-head .sub { margin-top: 12px; font-size: 15.5px; line-height: 1.6; color: var(--muted-foreground); max-width: 58ch; }

.blk-grid { display: grid; gap: 14px; grid-template-columns: 1fr; }
@media (min-width: 680px) { .blk-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1020px) { .blk-grid.cols-3 { grid-template-columns: repeat(3, 1fr); } }

.blk-stats { display: grid; gap: 14px; grid-template-columns: repeat(2, 1fr); }
@media (min-width: 860px) { .blk-stats { grid-template-columns: repeat(var(--n, 4), 1fr); } }
.stat { border-top: 1px solid var(--foreground); padding-top: 14px; }
.stat .value { font-weight: 300; font-size: clamp(30px, 3.6vw, 46px); letter-spacing: -0.02em; line-height: 1.05; }
.stat .label { margin-top: 6px; font-size: 13.5px; color: var(--muted-foreground); }

.blk-steps { display: grid; gap: clamp(20px, 3vw, 32px); grid-template-columns: 1fr; counter-reset: step; }
@media (min-width: 860px) { .blk-steps { grid-template-columns: repeat(var(--n, 3), 1fr); } }
.step { border-top: 1px solid var(--border); padding-top: 16px; }
.step .num { font-size: 12px; letter-spacing: 0.06em; color: var(--muted-foreground); }
.step h3 { margin-top: 8px; font-size: 16.5px; font-weight: 500; letter-spacing: -0.01em; }
.step p { margin-top: 6px; font-size: 14px; line-height: 1.6; color: var(--muted-foreground); }


.blk-media-text { display: grid; gap: clamp(28px, 5vw, 64px); grid-template-columns: 1fr; align-items: center; }
@media (min-width: 860px) {
  .blk-media-text { grid-template-columns: 1.05fr 1fr; }
  .blk-media-text.media-left .mt-media { order: -1; }
}
.mt-media { border-radius: var(--r-lg); overflow: hidden; background: var(--muted); }
.mt-media img { width: 100%; height: auto; display: block; }
.mt-copy h2 { font-weight: 300; font-size: clamp(24px, 2.8vw, 36px); letter-spacing: -0.02em; line-height: 1.15; }
.mt-copy p { margin-top: 14px; font-size: 15.5px; line-height: 1.65; color: var(--muted-foreground); max-width: 52ch; }
.mt-copy .btn { margin-top: 22px; }

.blk-checklist ul { list-style: none; padding: 0; max-width: 640px; }
.blk-checklist li { display: flex; gap: 12px; align-items: baseline; padding: 12px 0; border-bottom: 1px solid var(--border); font-size: 15px; line-height: 1.55; }
.blk-checklist li .icon { position: relative; top: 2px; }

.blk-pricing { display: grid; gap: 14px; grid-template-columns: 1fr; align-items: stretch; }
@media (min-width: 860px) { .blk-pricing { grid-template-columns: repeat(var(--n, 3), 1fr); } }
.plan { display: flex; flex-direction: column; gap: 12px; padding: 26px; background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg); }
.plan.highlight { border-color: var(--ink); }
.plan .name { font-size: 14px; font-weight: 500; letter-spacing: 0.02em; }
.plan .price { font-weight: 300; font-size: 38px; letter-spacing: -0.02em; line-height: 1; }
.plan .price small { font-size: 14px; letter-spacing: 0; color: var(--muted-foreground); font-weight: 400; }
.plan .desc { font-size: 13.5px; line-height: 1.55; color: var(--muted-foreground); }
.plan ul { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 8px; font-size: 13.5px; }
.plan ul li { display: flex; gap: 9px; align-items: baseline; }
.plan .btn { margin-top: auto; }

.blk-faq, .faq-list { max-width: 820px; }
.faq-list { margin: 0; }
.faq-item { border-bottom: 1px solid var(--border); }
.faq-item summary {
  display: flex; align-items: center; justify-content: space-between; gap: 20px;
  padding: 22px 4px; cursor: pointer; list-style: none;
  font-size: 16.5px; font-weight: 500; letter-spacing: -0.005em;
  transition: color 0.25s var(--ease);
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary:hover { color: rgba(15, 14, 13, 0.65); }
.faq-item summary .faq-x {
  flex-shrink: 0; width: 28px; height: 28px; border-radius: var(--r-sm);
  border: 1px solid var(--border); display: inline-flex; align-items: center; justify-content: center;
  font-size: 15px; font-weight: 300; color: var(--muted-foreground);
  transition: transform 0.35s var(--ease), background-color 0.35s var(--ease), color 0.35s var(--ease);
}
.faq-item[open] summary .faq-x { transform: rotate(45deg); background: var(--ink); color: #fff; border-color: var(--ink); }
.faq-item .faq-a { padding: 0 44px 24px 4px; font-size: 15px; line-height: 1.7; color: var(--muted-foreground); max-width: 64ch; }
/* Homepage #faq is an ink band. Without these the shared paper FAQ
   colours would sit dark-on-ink and the questions would vanish. */
.band-dark .faq-item { border-color: var(--hairline-dark); }
.band-dark .faq-item summary:hover { color: rgba(255, 255, 255, 0.75); }
.band-dark .faq-item summary .faq-x { border-color: var(--hairline-dark); color: rgba(255, 255, 255, 0.6); }
.band-dark .faq-item[open] summary .faq-x { background: #fff; color: var(--ink); border-color: #fff; }
.band-dark .faq-item .faq-a { color: rgba(255, 255, 255, 0.6); }

.cmp-table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--card); }
.cmp-table { width: 100%; border-collapse: collapse; font-size: 14px; min-width: 560px; }
.cmp-table th, .cmp-table td { padding: 14px 18px; text-align: left; border-bottom: 1px solid var(--border); }
.cmp-table tr:last-child td { border-bottom: none; }
.cmp-table thead th { font-size: 12px; font-weight: 500; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted-foreground); }
.cmp-table thead th.hl { color: var(--foreground); }
.cmp-table tbody th.row-label { font-size: 14px; text-transform: none; letter-spacing: normal; color: var(--foreground); }
.cmp-table td.hl { background: rgba(15, 14, 13, 0.025); }
.cmp-table .row-label { font-weight: 500; }
.cmp-table .row-note { display: block; font-weight: 400; font-size: 12.5px; color: var(--muted-foreground); margin-top: 2px; }
.cmp-yes, .cmp-no { display: inline-flex; width: 20px; height: 20px; border-radius: 999px; align-items: center; justify-content: center; }
.cmp-yes { background: var(--ink); color: #fff; }
.cmp-no { border: 1px solid var(--border); }
/* ===== /pricing plan rows =====
   A plan here is four lines of content — name, tagline, credits, price — so
   boxes had nothing to hold. The plans take the site's quiet index-row
   treatment (.row-item) instead: one plan per line, the credits figure and
   the price in fixed columns the eye scans straight down. Enterprise is the
   fifth row, not a slab of its own. */
.plan-list { border-top: 1px solid var(--border); }
.plan-row {
  display: grid;
  grid-template-columns: minmax(220px, 1.3fr) minmax(150px, 1fr) minmax(110px, auto);
  gap: 10px clamp(24px, 5vw, 72px);
  align-items: center;
  padding: clamp(20px, 3vw, 28px) 0;
  border-bottom: 1px solid var(--border);
}
.plan-name { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 17px; font-weight: 500; letter-spacing: -0.01em; }
.plan-row.featured .chip { color: var(--primary); border-color: rgba(100, 0, 255, 0.35); }
.plan-tagline { margin-top: 6px; font-size: 13.5px; line-height: 1.5; color: var(--muted-foreground); max-width: 46ch; }
.plan-credits .num { display: block; font-size: 22px; font-weight: 300; letter-spacing: -0.02em; line-height: 1.2; font-variant-numeric: tabular-nums; }
.plan-credits .unit { display: block; margin-top: 2px; font-size: 13px; color: var(--muted-foreground); }
/* the price is the headline figure of each row, so it takes the display
   weight (.plan .price on the landing blocks) and sits flush right */
.plan-price { text-align: right; }
.plan-price .amount { display: block; font-weight: 300; font-size: clamp(28px, 2.6vw, 34px); line-height: 1; letter-spacing: -0.03em; }
.plan-price .per { display: block; margin-top: 5px; font-size: 13px; color: var(--muted-foreground); }
.plan-note { margin-top: 22px; font-size: 14px; }
@media (max-width: 719px) {
  .plan-row { grid-template-columns: 1fr auto; row-gap: 14px; }
  .plan-price { grid-column: 2; grid-row: 1; align-self: start; }
  .plan-credits { grid-column: 1 / -1; display: flex; align-items: baseline; gap: 8px; }
  .plan-credits .num { font-size: 17px; }
  .plan-credits .unit { margin-top: 0; }
}

.blk-logos { display: flex; flex-wrap: wrap; align-items: center; gap: clamp(28px, 5vw, 64px); }
.blk-logos img { height: 24px; width: auto; object-fit: contain; opacity: 0.55; filter: grayscale(1); transition: opacity 0.3s var(--ease); }
.blk-logos img:hover { opacity: 0.9; }

.blk-video .video-frame { border-radius: var(--r-lg); overflow: hidden; border: 1px solid var(--border); aspect-ratio: 16 / 9; background: var(--ink); }
.blk-video iframe { width: 100%; height: 100%; border: none; display: block; }
.blk-video .caption, .blk-image .caption { margin-top: 12px; font-size: 13.5px; color: var(--muted-foreground); }
.blk-image .img-frame { border-radius: var(--r-lg); overflow: hidden; border: 1px solid var(--border); }
.blk-image img { width: 100%; height: auto; display: block; }

/* ===== product screenshots =====
   The renders carry their own falloff, so no frame or border: a box around
   them only draws an edge the eye has to cross (same call as the landing). */
.shot-fig { margin: 0; }
.shot-fig img { width: 100%; height: auto; display: block; border-radius: var(--r-lg); }
.shot-fig figcaption {
  margin-top: 12px; font-size: 14px; line-height: 1.55;
  color: var(--muted-foreground); max-width: 62ch;
}
.shot-fig.wide img { border-radius: var(--r-lg); }
.shot-gallery { display: grid; gap: clamp(28px, 4vw, 48px); grid-template-columns: 1fr; }
@media (min-width: 780px) { .shot-gallery { grid-template-columns: 1fr 1fr; } }

/* a screenshot beside copy, for pages that open with an explanation */
.shot-split { display: grid; gap: clamp(28px, 4vw, 56px); grid-template-columns: 1fr; align-items: center; }
@media (min-width: 900px) { .shot-split { grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); } }
.shot-split .copy h2 { font-weight: 300; font-size: clamp(24px, 2.8vw, 34px); letter-spacing: -0.02em; line-height: 1.15; }
.shot-split .copy p { margin-top: 12px; font-size: 15.5px; line-height: 1.65; color: var(--muted-foreground); max-width: 46ch; }
.shot-split .copy .btn { margin-top: 20px; }

/* Breaks a section out of `main.container-app` to the viewport edge. `50%` is
   half the container's content box, so the pull is exactly the distance to the
   window edge; --sbw (set in site.js) keeps the scrollbar out of the sum, which
   100vw alone would include. */
.full-bleed, .blk-cta {
  --vw: calc(100vw - var(--sbw, 0px));
  width: var(--vw);
  margin-left: calc(50% - var(--vw) / 2);
  margin-right: calc(50% - var(--vw) / 2);
}

/* dark CTA band (matches the landing's end-cap) */
.blk-cta { background: var(--ink); color: #fff; margin-top: clamp(40px, 6vw, 80px); border-top: none !important; padding: 0; }
/* Copy left, action right. Flex rather than a grid with an explicit row span:
   the heading, subheading and faces are each optional, and a fixed span only
   lined the button up when all of them happened to be present. */
.blk-cta .cta-inner {
  max-width: 1240px; margin: 0 auto; padding: clamp(64px, 8vw, 100px) clamp(24px, 4vw, 56px);
  display: flex; flex-direction: column; align-items: flex-start; gap: 26px;
}
.blk-cta .cta-copy { display: flex; flex-direction: column; align-items: flex-start; gap: 18px; min-width: 0; }
.blk-cta .cta-action { flex-shrink: 0; }
@media (min-width: 860px) {
  .blk-cta .cta-inner { flex-direction: row; align-items: center; justify-content: space-between; gap: 48px; }
  .blk-cta .cta-copy { flex: 1 1 auto; }
  /* the note is wider than the button, so without this the button floats off
     the right edge the note is setting */
  .blk-cta .cta-action { align-items: flex-end; text-align: right; }
}
.blk-cta h2 { font-weight: 300; font-size: clamp(30px, 3.5vw, 48px); letter-spacing: -0.025em; line-height: 1.1; max-width: 22ch; text-wrap: balance; }
.blk-cta p { font-size: 16px; color: rgba(255, 255, 255, 0.6); }
.blk-cta .btn-primary { background: #fff; color: var(--ink); }
/* a few coworker faces so the ink band reads as people, not a wall */
.cta-faces { display: inline-flex; align-items: center; }
.cta-faces img {
  width: 40px; height: 40px; border-radius: 999px; object-fit: cover;
  border: 2px solid var(--ink); margin-right: -12px; display: block;
}
.cta-faces img:last-child { margin-right: 0; }

/* ===== one pull quote, given room =====
   Replaces the old three-up grid: a single quote at display size reads as a
   statement, where a wall of them reads as filler. */
.quote-section { text-align: left; }
.quote-kicker {
  font-size: 11.5px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted-foreground); margin-bottom: 22px;
}
.pull-quote { margin: 0; }
.pull-quote blockquote {
  margin: 0; font-weight: 300; letter-spacing: -0.02em;
  font-size: clamp(24px, 3.2vw, 38px); line-height: 1.24; text-wrap: pretty;
  max-width: 30ch;
}
.pull-quote figcaption { display: flex; align-items: center; gap: 14px; margin-top: clamp(24px, 3vw, 34px); }
.pq-avatar { width: 46px; height: 46px; border-radius: 999px; overflow: hidden; flex-shrink: 0; background: var(--muted); }
.pq-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pq-who { display: flex; flex-direction: column; min-width: 0; }
.pq-who strong { font-size: 14.5px; font-weight: 500; }
.pq-who small { font-size: 13px; line-height: 1.45; color: var(--muted-foreground); }
/* Desktop: a full-width band. The kicker and attribution become a left rail
   (same shape as the nav panels' intro rail) and the quote fills the rest of
   the row behind a hairline, scaled up so the section reads as a deliberate
   statement across the whole container instead of a narrow column with two
   thirds of the row empty. */
@media (min-width: 900px) {
  .quote-section {
    display: grid; grid-template-columns: 236px minmax(0, 1fr);
    grid-template-rows: auto 1fr; column-gap: clamp(36px, 4.5vw, 64px);
  }
  .pull-quote { display: contents; }
  .quote-kicker { grid-area: 1 / 1; margin: 0; padding-right: 24px; }
  .pull-quote blockquote {
    grid-area: 1 / 2 / 3 / 3; max-width: none;
    font-size: clamp(30px, 3.3vw, 44px);
    border-left: 1px solid var(--border); padding-left: clamp(36px, 4.5vw, 64px);
    margin-left: calc(-1 * clamp(36px, 4.5vw, 64px));
  }
  .pull-quote figcaption { grid-area: 2 / 1; align-self: end; margin: 28px 24px 0 0; }
}

/* ===== agent listing form ===== */
.list-form { max-width: 720px; }
.form-section { border: none; padding: 0; margin: 0 0 clamp(34px, 4vw, 48px); display: flex; flex-direction: column; gap: 20px; }
/* A <legend> is not a flex item — in a flex fieldset it renders at the top of
   the box and the first real item slides underneath it. Floating it puts it
   back in flow so the intro below clears instead of overlapping. */
.form-section legend {
  padding: 0; font-weight: 300; font-size: clamp(21px, 2.2vw, 26px);
  letter-spacing: -0.02em; line-height: 1.2;
  float: left; width: 100%; margin-bottom: 14px;
}
.form-section legend + * { clear: both; }
.form-section-intro { font-size: 14.5px; line-height: 1.6; color: var(--muted-foreground); max-width: 58ch; }
.field-hint a { text-decoration: underline; }
.field-bullets { margin: 0; padding-left: 1.1em; font-size: 12.5px; line-height: 1.6; color: var(--muted-foreground); }
.field-label .opt { font-style: normal; font-weight: 400; color: var(--muted-foreground); }
.choice-set { display: flex; flex-direction: column; gap: 10px; }
.choice { display: flex; align-items: flex-start; gap: 10px; font-size: 14.5px; line-height: 1.5; cursor: pointer; }
.choice input { margin-top: 3px; accent-color: var(--primary); flex-shrink: 0; }
.form-confirm {
  border: 1px solid var(--border); border-radius: var(--r-lg);
  padding: 20px 22px; background: var(--card); margin-bottom: 24px;
}
.form-confirm ul { list-style: none; padding: 0; margin: 12px 0 0; display: flex; flex-direction: column; gap: 9px; }
.form-confirm li { display: flex; align-items: flex-start; gap: 10px; font-size: 13.5px; line-height: 1.55; color: var(--muted-foreground); }
.form-confirm .icon { color: var(--primary); margin-top: 3px; }

/* ===== legal documents =====
   Long contracts: a tighter measure than marketing prose, and numbering that
   survives — the Terms carry clause numbers via <ol start> and cross-reference
   themselves, so the counters must not restart. */
.legal-nav {
  display: flex; flex-wrap: wrap; gap: 8px;
  padding-bottom: clamp(20px, 3vw, 30px);
}
.legal-nav a {
  padding: 7px 13px; border-radius: 999px; border: 1px solid var(--border);
  font-size: 13px; color: var(--muted-foreground);
  transition: border-color 0.2s var(--ease), color 0.2s var(--ease);
}
.legal-nav a:hover { color: var(--foreground); border-color: rgba(15, 14, 13, 0.4); }
.legal-nav a[aria-current] { color: var(--foreground); border-color: var(--foreground); }

.legal-doc .prose { max-width: 74ch; }
.legal-doc .prose h2 { margin-top: clamp(32px, 4vw, 48px); font-size: clamp(20px, 2.2vw, 26px); }
.legal-doc .prose h3 { margin-top: 28px; font-size: 17px; }
.legal-doc .prose h4 { margin-top: 22px; font-size: 15px; font-weight: 500; }
.legal-doc .prose ol { padding-left: 1.6em; }
.legal-doc .prose ol ol { margin-top: 10px; }
.legal-doc .prose li { margin-bottom: 10px; line-height: 1.65; }
.legal-doc .prose blockquote {
  margin: 22px 0; padding-left: 16px; border-left: 2px solid var(--border);
  font-size: 14px; color: var(--muted-foreground);
}
.legal-doc .prose table { width: 100%; border-collapse: collapse; font-size: 13.5px; margin: 22px 0; display: block; overflow-x: auto; }
.legal-doc .prose th, .legal-doc .prose td { padding: 10px 14px; text-align: left; border: 1px solid var(--border); vertical-align: top; }
.legal-doc .prose th { font-weight: 500; background: var(--muted); }

/* .foot-social / .foot-legal rules moved to nav.css — the footer is shared
   chrome and index.html does not load this sheet. */

/* ===== Talk to Sales form ===== */
.lead-layout { display: grid; gap: clamp(32px, 5vw, 72px); grid-template-columns: 1fr; padding-bottom: clamp(40px, 6vw, 72px); align-items: start; }
@media (min-width: 900px) { .lead-layout { grid-template-columns: minmax(0, 1.25fr) minmax(260px, 0.75fr); } }

.lead-form { display: flex; flex-direction: column; gap: 20px; max-width: 640px; }
.field-row { display: grid; gap: 20px; grid-template-columns: 1fr; }
@media (min-width: 620px) { .field-row { grid-template-columns: 1fr 1fr; } }
.field { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.field-label { font-size: 13.5px; font-weight: 500; letter-spacing: -0.005em; }
.field-hint { font-size: 12.5px; color: var(--muted-foreground); }
.lead-form input[type="text"], .lead-form input[type="email"], .lead-form select, .lead-form textarea {
  font-family: inherit; font-size: 15px; color: var(--foreground);
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 11px 14px; width: 100%; transition: border-color 0.2s var(--ease);
}
.lead-form textarea { resize: vertical; line-height: 1.55; }
.lead-form input:focus, .lead-form select:focus, .lead-form textarea:focus {
  outline: none; border-color: var(--ink);
}
.lead-form ::placeholder { color: rgba(15, 14, 13, 0.38); }
.lead-form select { appearance: none; cursor: pointer;
  background-image: linear-gradient(45deg, transparent 50%, rgba(15,14,13,.45) 50%), linear-gradient(135deg, rgba(15,14,13,.45) 50%, transparent 50%);
  background-position: calc(100% - 19px) 50%, calc(100% - 14px) 50%;
  background-size: 5px 5px, 5px 5px; background-repeat: no-repeat; padding-right: 38px;
}

.radio-set { border: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 10px; }
.radio-set legend { padding: 0; margin-bottom: 3px; }
/* Checkbox and radio groups are <fieldset>/<legend> so the group has a real
   accessible name; strip the browser's default box so they look like every
   other field. */
fieldset.field { border: 0; padding: 0; margin: 0; min-inline-size: 0; }
/* `.form-section legend` styles the section headings at 26px and outranks
   .field-label, so a group's legend has to restate the field-label look. */
fieldset.field > legend.field-label {
  padding: 0; float: left; width: 100%;
  font-size: 13.5px; font-weight: 500; letter-spacing: -0.005em; color: inherit;
  margin: 0 0 8px;
}
fieldset.field > legend + * { clear: both; }
.radio {
  display: flex; align-items: flex-start; gap: 12px; cursor: pointer;
  border: 1px solid var(--border); border-radius: var(--r-md); padding: 13px 15px; background: var(--card);
  transition: border-color 0.2s var(--ease);
}
.radio:hover { border-color: rgba(15, 14, 13, 0.4); }
.radio:has(input:checked) { border-color: var(--ink); }
.radio input { margin: 3px 0 0; accent-color: var(--ink); flex-shrink: 0; }
.radio span { display: flex; flex-direction: column; gap: 2px; }
.radio strong { font-size: 14.5px; font-weight: 500; }
.radio small { font-size: 13px; color: var(--muted-foreground); line-height: 1.5; }

.hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.form-error {
  font-size: 14px; color: var(--foreground); background: var(--muted);
  border-left: 2px solid var(--ink); border-radius: var(--r-sm); padding: 12px 14px;
}
.form-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 18px; margin-top: 4px; }
.form-note { font-size: 12.5px; color: var(--muted-foreground); max-width: 34ch; }

.lead-aside { display: flex; flex-direction: column; gap: 16px; padding: 26px; background: var(--muted); border-radius: var(--r-lg); }
.lead-list { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.lead-list li { display: flex; gap: 10px; align-items: baseline; font-size: 14px; line-height: 1.55; color: rgba(15, 14, 13, 0.75); }
.lead-list .icon { position: relative; top: 2px; }
.lead-aside-foot { margin-top: 4px; padding-top: 16px; border-top: 1px solid var(--border); display: flex; flex-direction: column; gap: 8px; }
.lead-aside-foot .row-go { font-size: 13.5px; }

/* ===== notices / 404 ===== */
.notice { padding: clamp(72px, 12vw, 140px) 0; display: flex; flex-direction: column; align-items: flex-start; gap: 16px; max-width: 560px; }
.notice h1 { font-weight: 300; font-size: clamp(30px, 4vw, 44px); letter-spacing: -0.02em; }
.notice p { font-size: 15.5px; line-height: 1.6; color: var(--muted-foreground); }

/* ===== footer =====
   Markup comes from templates/shell.js footerHtml() on every surface, and the
   styles live in /assets/nav.css with the rest of the shared chrome (the
   homepage does not load this file, so rules here would drift). */

.sr-only {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* Skip link for keyboard users — first focusable element on every
   server-rendered page (templates/shell.js pageStart); the landing page
   carries its own identical copy in its inline style block. */
.skip-link {
  position: absolute; left: 16px; top: -60px; z-index: 100;
  background: var(--ink); color: #fff; padding: 10px 18px; border-radius: var(--r-md);
  font-size: 14px; font-weight: 500; transition: top 0.3s var(--ease);
}
.skip-link:focus { top: 16px; }

/* The cookie-consent banner styles itself — assets/consent.js injects them
   so a missing stylesheet cannot leave the banner unstyled. */


/* ===== accent =====================================================
   Purple earns its place in four roles and stays out of everything else:
   the eyebrow that opens a section, the arrow on a row you can follow,
   the focus ring, and text selection. Everything else stays ink on paper —
   the accent only reads as an accent while it is rare. */

/* the small label above a heading — the one mark on nearly every page */
.page-head .eyebrow,
.cw-info .eyebrow,
.blk-hero .eyebrow,
.uc-eyebrow { color: var(--primary); }

/* on the dark bands the same role needs the lifted tone */
.band-dark .eyebrow,
.blk-cta .eyebrow { color: var(--primary-on-dark); }

/* where you can go: the arrow on a row, and a link in body copy */
.row-item:hover .row-go { color: var(--primary); }
a.card:hover { border-color: rgba(100, 0, 255, 0.45); }
.prose a { text-decoration-color: rgba(100, 0, 255, 0.4); }
.prose a:hover { color: var(--primary); text-decoration-color: var(--primary); }
.legal-nav a[aria-current] { color: var(--primary); border-color: rgba(100, 0, 255, 0.45); }

/* the uppercase kicker above a block, where a page uses one */
.kicker { color: var(--primary); }

/* the two remaining "this one is live" states: a task card under the pointer
   (DESIGN.md specifies hover border-primary here) and the filter you picked */
.offer-card:hover { border-color: rgba(100, 0, 255, 0.45); }
.fchip.active { background: var(--primary); border-color: var(--primary); color: #fff; }

/* a blog post's own tag, the one coloured mark on the index */
.tag-quiet { color: var(--primary); }

/* Shared focus ring. Homepage used to ship a 3px offset in its inline
   block; 2px is the one value now. */
:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
  border-radius: 2px;
}
.band-dark :focus-visible,
.blk-cta :focus-visible { outline-color: var(--primary-on-dark); }

::selection { background: rgba(100, 0, 255, 0.18); }
