/* SHOO IN interior pages: layout atoms on top of style.css */

.page-hero { padding: clamp(2.6rem, 6vw, 4.6rem) 0 clamp(1.8rem, 4vw, 2.8rem); }
/* When the hero feeds straight into a prose block (blog posts, legal pages,
   text-only service pages), trim its bottom padding so the lede flows into the
   body as a dek rather than floating over a doubled gap. */
.page-hero:has(+ .sec-flush) { padding-bottom: clamp(0.8rem, 2vw, 1.4rem); }
.ph-kicker { font-size: 0.82rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--azure-deep); }
.ph-title { font-weight: 500; font-size: clamp(2rem, 4.6vw, 3.4rem); letter-spacing: -0.03em; line-height: 1.06; max-width: 22ch; margin-top: 0.5rem; }
.ph-title b { font-weight: 800; color: var(--azure); }
.ph-lede { margin-top: 1.1rem; max-width: 62ch; color: var(--grey); font-size: 1.07rem; }
/* Blog-post subtitle only (heroes that carry the read-time/date band): italic and
   body-sized, so it reads as an article standfirst. Other pages' heroes are unaffected. */
.page-hero:has(.ph-meta) .ph-lede { font-style: italic; font-size: 1rem; }
/* Article byline band: set the read-time/date apart from the lede with space and
   a hairline rule so it reads as distinct metadata, not a stray line under the dek. */
.ph-meta { margin-top: 1.5rem; padding-top: 1.1rem; border-top: 1px solid var(--line); max-width: 60ch; color: var(--grey); font-size: 0.85rem; font-weight: 600; letter-spacing: 0.02em; }
.ph-cta { margin-top: 1.6rem; }

.page-photo { width: 100%; max-height: 430px; object-fit: cover; border-radius: 18px; display: block; box-shadow: 0 22px 44px -24px rgba(22, 33, 30, 0.35); }
/* Photo that introduces a prose-only page (About): cap to the prose measure and
   left-align (block default) so the image matches the prose column's width and
   left edge. Scoped to .narrow so full-width service-page photos are untouched. */
.page-photo.narrow { max-width: 70ch; }

/* About body: one centered reading column with the team photo at the top of it
   (full column width). Nothing is aligned to the hero watermark. */
.about-col { max-width: 70ch; margin: 0 auto; }
.about-col .prose-col { max-width: none; }
.about-photo { width: 100%; height: clamp(260px, 34vw, 400px); object-fit: cover; border-radius: 18px; display: block; box-shadow: 0 22px 44px -24px rgba(22, 33, 30, 0.35); margin-bottom: 1.8rem; }

.prose-col { max-width: 70ch; }
/* Blog posts only. The default 70ch column stopped well short of the hero mark and
   read as wasted space (X, 2026-07-27).
   MEASURED TWICE. The first attempt used 92ch, which aligned to the SVG ELEMENT's
   bounding box (right edge 1451px) rather than to the artwork drawn inside it
   (1415px), so it overshot by 37px and lined up with the header button instead of
   the mark. 1040px is the content width that lands on the visible artwork.
   The font bump is not cosmetic: at 16px this column runs about 89 characters,
   which is past a comfortable measure. At 1.06rem the same pixel width reads at
   about 84, so the space X wanted filled stays filled and the line gets shorter. */
.prose-col.prose-wide { max-width: 1040px; }
.prose-col.prose-wide p, .prose-col.prose-wide li { font-size: 1.06rem; line-height: 1.65; }
/* Justified, per X 2026-07-27. Justification fails at NARROW measures, where too few
   word gaps absorb the slack and you get rivers. At 84 characters there are plenty of
   gaps, so the stretch per gap stays small and the block reads as deliberate. Two
   conditions make it safe and both are met: hyphens:auto, and <html lang="en-AU"> so
   the browser has a hyphenation dictionary. Turned OFF below 760px, where the measure
   shortens and justification starts costing more than it buys. */
@media (min-width: 760px) {
  .prose-col.prose-wide p { text-align: justify; hyphens: auto; -webkit-hyphens: auto; }
}
/* Figures are authored on a 640-unit viewBox and scale to their container, so widening
   the column to 1040px magnified every label by 1.63x and the figures started shouting
   over the body text (X, 2026-07-27). Capping at 840px puts a 12-unit label at about
   15.7px against 17px body text, so the diagram sits just under the prose instead of
   above it. Applies to every blog figure, not only the one this was found on. */
/* Centred, because capping the width inside a 1040px column left 200px of dead
   white down the right of every figure (X, 2026-07-27). The cap and the centring
   have to travel together; one without the other is the bug. */
.prose-col.prose-wide figure svg { max-width: 840px; margin-left: auto; margin-right: auto; }
.prose-col.prose-wide figcaption { max-width: 840px; margin-left: auto; margin-right: auto; }
.prose-col h2 { font-weight: 800; font-size: 1.35rem; letter-spacing: -0.02em; margin: 1.9rem 0 0.6rem; }
.prose-col > :first-child { margin-top: 0; }
.prose-col p { color: var(--grey); margin-bottom: 0.9rem; }
.prose-col a { color: var(--azure-deep); font-weight: 600; }
.prose-col b { color: var(--ink); }

.svc-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; }
.svc-tile { display: flex; flex-direction: column; gap: 0.5rem; text-decoration: none; background: var(--tint-2); border: 1px solid var(--line); border-radius: 18px; padding: 1.6rem 1.5rem; transition: transform 0.22s, box-shadow 0.22s, border-color 0.22s; }
.svc-tile:hover { transform: translateY(-4px); border-color: var(--azure); box-shadow: 0 16px 32px -20px rgba(12, 147, 132, 0.35); }
.svc-tile h3 { font-size: 1.08rem; font-weight: 800; }
.svc-tile p { font-size: 0.92rem; color: var(--grey); flex: 1; }
.svc-tile span { font-size: 0.8rem; font-weight: 700; color: var(--azure-deep); }

.tick-list { list-style: none; max-width: 70ch; display: grid; gap: 0.55rem; }
.tick-list li { padding-left: 1.7rem; position: relative; color: var(--ink); font-weight: 500; }
.tick-list li::before { content: "\2713"; position: absolute; left: 0; color: var(--azure); font-weight: 800; }

.vet-note { max-width: 70ch; background: var(--tint); border: 1px solid var(--line); border-radius: 12px; padding: 0.9rem 1.1rem; font-size: 0.95rem; color: var(--grey); }
.vet-note a { color: var(--azure-deep); font-weight: 700; }
.vet-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; }
.vet-card { background: var(--tint-2); border: 1px solid var(--line); border-radius: 18px; padding: 1.5rem 1.4rem; }
.vet-card h3 { font-weight: 800; font-size: 1.05rem; margin-bottom: 0.5rem; }
.vet-card p { font-size: 0.93rem; color: var(--grey); }
.vet-banner { margin-top: 1.6rem; background: var(--navy); color: #d9efe9; border-radius: 14px; padding: 1.1rem 1.4rem; font-size: 0.97rem; }
.vet-banner b { color: #ffffff; }
.vet-banner a { color: var(--sky); font-weight: 700; }

.addons { margin-top: 1.8rem; border: 1px solid var(--line); border-radius: 14px; padding: 1.2rem 1.4rem; background: var(--tint-2); }
.addons h3 { font-weight: 800; font-size: 1rem; margin-bottom: 0.3rem; }
.addons p { color: var(--grey); font-size: 0.95rem; }

.translator { max-width: 720px; border: 1px solid var(--line); border-radius: 18px; padding: 1.6rem; background: var(--tint-2); }
.tr-controls { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.2rem; }
.tr-controls label { font-size: 0.8rem; font-weight: 700; color: var(--grey); display: grid; gap: 0.35rem; }
.tr-controls select { font-family: var(--sans); font-size: 1rem; font-weight: 600; padding: 0.6rem 0.9rem; border: 1px solid var(--line); border-radius: 10px; background: var(--white); color: var(--ink); min-width: 220px; }
.tr-row { display: grid; gap: 0.15rem; padding: 0.85rem 0; border-top: 1px solid var(--line); }
.tr-row span { font-size: 0.75rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--grey-soft); }
.tr-row b { font-size: 1.02rem; color: var(--ink); }
.tr-row.trap b { color: var(--azure-deep); }
.tr-note { margin-top: 0.9rem; font-size: 0.85rem; color: var(--grey-soft); }

.tf-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.2rem; }
.tf-card { border: 1px solid var(--line); border-radius: 16px; overflow: hidden; background: var(--white); }
.tf-before { padding: 1.1rem 1.3rem; color: var(--grey-soft); text-decoration: line-through; text-decoration-color: rgba(12, 147, 132, 0.5); background: var(--tint-2); font-size: 0.95rem; }
.tf-after { padding: 1.1rem 1.3rem; color: var(--ink); font-weight: 600; font-size: 0.98rem; border-top: 1px solid var(--line); }

.demo-note { font-size: 0.85rem; color: var(--grey-soft); max-width: 70ch; }
.demo-note a, .demo-note b { color: var(--azure-deep); }
.legal-note { font-size: 0.85rem; font-style: italic; color: var(--grey-soft); border-top: 1px solid var(--line); padding-top: 0.9rem; margin-top: 1.4rem; }
.byline { font-size: 0.85rem; color: var(--grey-soft); border-top: 1px solid var(--line); padding-top: 0.9rem; }

.foot-cols { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 2rem; padding-bottom: 1.6rem; }
.foot-cols a { display: block; font-size: 0.88rem; color: #a7c0b8; text-decoration: none; padding: 0.22rem 0; }
.foot-cols a:hover { color: var(--sky); }
.foot-h { font-size: 0.78rem; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: #ffffff; margin-bottom: 0.5rem; }
.foot-blurb { font-size: 0.88rem; color: #a7c0b8; margin-top: 0.8rem; max-width: 30ch; }

@media (max-width: 960px) {
  .svc-cards { grid-template-columns: 1fr; }
  .vet-grid { grid-template-columns: 1fr; }
  .tf-grid { grid-template-columns: 1fr; }
  .foot-cols { grid-template-columns: 1fr 1fr; }
  .price-grid[style] { grid-template-columns: 1fr !important; }
}

@media print {
  .nav, footer, .closing, .pill, .ph-cta { display: none !important; }
  body { font-size: 12pt; }
  .page-hero { padding: 0 0 1rem; }
}

.ph-art { position: absolute; right: clamp(1rem, 4vw, 4rem); top: 1.2rem; width: 300px; height: 188px; opacity: 0.92; pointer-events: none; }
/* The watermark is anchored to a FIXED top-right position (not vertically
   centered), so it sits identically on every hero and never drifts. The hero
   reserves a min-height to contain it, and the heading text reserves a right
   gutter the width of the watermark so a long heading can never run under it
   (the products "...price of lunch." heading did). Scoped to where the art
   shows (it is display:none below 1100px). */
@media (min-width: 1101px) {
  .page-hero { min-height: 300px; }
  .page-hero .ph-kicker, .page-hero .ph-title, .page-hero .ph-lede, .page-hero .ph-meta { max-width: calc(100% - 384px); }
}
.page-hero { position: relative; overflow: hidden; }
.page-hero .wrap { position: relative; }
@media (max-width: 1100px) { .ph-art { display: none; } }

.cmp { margin-top: 2rem; border: 1px solid var(--line); border-radius: 16px; padding: 1.5rem 1.6rem; background: var(--white); }
.cmp h3 { font-weight: 800; font-size: 1.15rem; }
.cmp-sub { color: var(--grey); font-size: 0.92rem; margin: 0.4rem 0 1rem; max-width: 72ch; }
.cmp-table { width: 100%; border-collapse: collapse; }
.cmp-table th { text-align: left; font-size: 0.75rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--grey-soft); padding: 0.5rem 0.4rem; border-bottom: 1px solid var(--line); }
.cmp-table td { padding: 0.7rem 0.4rem; border-bottom: 1px solid var(--line); font-size: 0.98rem; }
.cmp-table td:last-child { font-weight: 700; }
.blur-name { display: inline-block; height: 14px; max-width: 60vw; border-radius: 7px; background: linear-gradient(90deg, #c7d9d4, #e3edea 60%, #d3e4df); filter: blur(4px); }
.cmp-avg td { color: var(--grey); font-style: italic; }
.cmp-us td { background: var(--tint); font-weight: 800; color: var(--azure-deep); }
.cmp-us td:first-child { border-radius: 8px 0 0 8px; }
.cmp-us td:last-child { border-radius: 0 8px 8px 0; }
.cmp-note { margin-top: 0.9rem; font-size: 0.82rem; color: var(--grey-soft); max-width: 72ch; }

.cap-banner { background: #123f38; color: #d9efe9; text-align: center; font-size: 0.9rem; font-weight: 600; padding: 0.7rem 1.2rem; }
.paused-tag { font-style: normal; font-size: 0.68rem; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: #b0682a; background: #fdf1e3; border-radius: 99px; padding: 0.15rem 0.55rem; vertical-align: middle; margin-left: 0.4rem; }

.cv-gallery { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; }
.cv-gallery img { width: 100%; border: 1px solid var(--line); border-radius: 10px; box-shadow: 0 14px 30px -18px rgba(22,33,30,0.35); }
@media (max-width: 960px) { .cv-gallery { grid-template-columns: 1fr; } }
/* Fan anchored to the card's RIGHT (X approved option D, 2026-07-29). It used to hang
   left:-168px off the card, pointing INWARD at the copy column. Once .hero-grid was capped
   at 1180px the card moved left and the fan slid under the hero paragraph, overlapping it
   by 138px. Anchored right it bleeds outward toward the page margin, clear of every piece
   of text at any width, and .hero-outer's overflow-x:clip handles the bleed. Rotations are
   mirrored so the fan opens away from the card. Do not restore a left offset here. */
.hero-fan { position: absolute; right: -260px; bottom: 26px; width: 300px; height: 220px; z-index: 1; pointer-events: none; }
/* z-index 1, not -1: at -1 the fan rendered BEHIND .hero-grid::before, the big mint
   panel, which is what made it look washed out and half hidden. The card is lifted to
   z-index 2 so the fan still passes behind it. */
.review-card { position: relative; z-index: 2; }
.hero-fan img { position: absolute; bottom: 0; width: 172px; border: 1px solid var(--line); border-radius: 9px; box-shadow: 0 22px 44px -14px rgba(22,33,30,0.42); background: #fff; transform-origin: bottom center; }
.hero-fan img:nth-child(1) { left: 88px; transform: rotate(10deg); }
.hero-fan img:nth-child(2) { left: 44px; transform: rotate(3deg); }
.hero-fan img:nth-child(3) { left: 0; transform: rotate(-5deg); }

@media (max-width: 1100px) { .hero-fan { display: none; } }

.prose-col ol, .prose-col ul { padding-left: 1.5rem; margin: 0 0 1.1rem; }
.prose-col li { color: var(--grey); margin-bottom: 0.5rem; padding-left: 0.15rem; }
.prose-col li b { color: var(--ink); }
/* Do NOT reintroduce `counter-reset: none` here. It suppresses each <ol>'s own
   reset, so any <li> earlier in the column keeps counting: a <ul> of 16 job
   families made the next ordered list start at 17 (found 2026-07-29, on 5 pages,
   one of them already signed off). It also silently overrode the start="13"
   attribute the 24-point checklist uses, which then only worked by coincidence. */
.lvl-list { list-style: none; padding-left: 0 !important; display: grid; gap: 0.6rem; }
.lvl-list li { border-left: 3px solid var(--sky); padding-left: 0.9rem !important; }
.tf-why { padding: 0.9rem 1.3rem 1.1rem; font-size: 0.85rem; color: var(--grey); background: var(--tint-2); border-top: 1px solid var(--line); }
.tf-why b { color: var(--azure-deep); }

.tf-person { border: 1px solid var(--line); border-radius: 16px; background: var(--white); overflow: hidden; margin-bottom: 1.4rem; }
.tf-person-head { display: flex; align-items: baseline; justify-content: space-between; gap: 0.8rem; flex-wrap: wrap; padding: 1.1rem 1.3rem 0.9rem; }
.tf-person-head h2 { font-size: 1.15rem; margin: 0; color: var(--ink); letter-spacing: -0.01em; }
.tf-tag { font-size: 0.68rem; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--azure-deep); background: var(--tint-2); border: 1px solid var(--line); border-radius: 999px; padding: 0.25rem 0.7rem; white-space: nowrap; }
.tf-person .tf-before, .tf-person .tf-after { border-top: 1px solid var(--line); }
.tf-person-src { padding: 0.85rem 1.3rem 1.05rem; font-size: 0.85rem; color: var(--grey); border-top: 1px solid var(--line); background: var(--tint-2); }
.tf-person-src a { color: var(--azure-deep); font-weight: 700; }
.which { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.9rem; margin-bottom: 1.6rem; }
.which-item { display: block; border: 1px solid var(--line); border-radius: 14px; padding: 0.95rem 1.1rem; background: var(--tint-2); text-decoration: none; transition: border-color 0.18s ease, transform 0.18s ease; }
.which-item:hover { border-color: var(--azure); transform: translateY(-2px); }
.which-item b { display: block; color: var(--ink); font-size: 0.95rem; font-weight: 800; letter-spacing: -0.01em; }
.which-item span { display: block; color: var(--grey); font-size: 0.83rem; margin-top: 0.2rem; line-height: 1.45; }
@media (max-width: 720px) { .which { grid-template-columns: 1fr; } }

/* Industry filter chips + per-card kicker labels. One neutral colour for
   every industry (labels carry the meaning, colours do not). */
.ind-filter { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.3rem; }
.ind-chip { font: inherit; font-size: 0.8rem; font-weight: 700; letter-spacing: 0.02em; color: var(--azure-deep); background: var(--white); border: 1px solid var(--line); border-radius: 99px; padding: 0.42rem 1.05rem; cursor: pointer; transition: border-color 0.18s ease, background 0.18s ease, color 0.18s ease; }
.ind-chip:hover { border-color: var(--azure); }
.ind-chip.active { background: var(--azure); border-color: var(--azure); color: #fff; }
.prod-kicker { font-size: 0.68rem; font-weight: 800; letter-spacing: 0.09em; text-transform: uppercase; color: var(--grey-soft); margin-bottom: 0.3rem; }
.prod-card.ind-hide { display: none; }

/* Equal 2-across cards on shared subgrid rows: kicker, title, sub, chips,
   price, look-inside, expander, CTA and fine print each occupy one track
   shared across the pair, so price aligns with price and strip with strip
   whatever wraps above them. Browsers without subgrid get per-card rows:
   same cards, no cross-card alignment. The cover art spans the five head
   tracks in column 2. Every in-flow child is placed explicitly; the flag
   stays absolutely positioned outside the grid flow. */
.prod-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.3rem; }
/* Grid/flex items default to min-width:auto, so a full-resolution page render
   inside a card forces its column wider than the page (the 2x images are
   1520px at natural size). Zero the min-widths so width:100% actually caps. */
.prod-grid > *, .li-strip > *, .prod-card > * { min-width: 0; }
.li-thumb img, .lb img { max-width: 100%; }
.prod-card { position: relative; grid-row: span 9; display: grid; grid-template-rows: subgrid; grid-template-columns: 1fr auto; column-gap: 1.1rem; row-gap: 0; border: 1px solid var(--line); border-radius: 18px; padding: 1.8rem 1.7rem; background: var(--white); transition: transform 0.18s ease, box-shadow 0.18s ease; }
.prod-card:hover { transform: translateY(-3px); box-shadow: 0 22px 40px -26px rgba(18,63,56,0.35); }
.prod-kicker { grid-column: 1; grid-row: 1; }
.prod-card h3 { grid-column: 1; grid-row: 2; }
.prod-sub { grid-column: 1; grid-row: 3; }
.spec-chips { grid-column: 1; grid-row: 4; align-self: start; }
.prod-pricebox { grid-column: 1; grid-row: 5; align-self: start; }
.prod-vet { font-size: 0.78rem; font-weight: 700; color: var(--azure-deep); margin: -0.5rem 0 0.9rem; }
.prod-cover { grid-column: 2; grid-row: 1 / 6; align-self: start; justify-self: end; border-radius: 6px; box-shadow: 0 10px 26px -10px rgba(13,49,44,0.45); transform: rotate(2.5deg); margin-top: 0.2rem; }
.look-inside { grid-column: 1 / -1; grid-row: 6; }
.prod-more { grid-column: 1 / -1; grid-row: 7; }
.prod-card .pill { grid-column: 1 / -1; grid-row: 8; align-self: end; }
.buy-sub { grid-column: 1 / -1; grid-row: 9; }
@media (max-width: 560px) { .prod-cover { width: 84px !important; } }
.spec-chips { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.65rem; }
.spec-chips span { font-size: 0.72rem; font-weight: 700; letter-spacing: 0.02em; color: var(--azure-deep); background: var(--tint); border-radius: 99px; padding: 0.24rem 0.7rem; }
.prod-more { margin: 0 0 1.15rem; }
/* The expander reads as a control, per X 2026-07-24: bordered full-width
   row with a rotating chevron; deliberately no blur or teaser (blurred text
   is the visual language of locked content, wrong signal for this page). */
.prod-more summary, .price-more summary { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; border: 1px solid var(--line); border-radius: 10px; padding: 0.55rem 0.9rem; cursor: pointer; font-size: 0.85rem; font-weight: 700; color: var(--azure-deep); list-style: none; transition: border-color 0.18s ease, background 0.18s ease; }
.prod-more summary::-webkit-details-marker, .price-more summary::-webkit-details-marker { display: none; }
.prod-more summary::after, .price-more summary::after { content: "\25BE"; font-size: 0.9rem; transition: transform 0.18s ease; }
.prod-more summary:hover, .price-more summary:hover { border-color: var(--azure); background: var(--tint-2); }
.prod-more[open] summary, .price-more[open] summary { margin-bottom: 0.7rem; }
.prod-more[open] summary::after, .price-more[open] summary::after { transform: rotate(180deg); }
.prod-prov { font-size: 0.8rem; color: var(--grey); border-left: 3px solid var(--azure); padding-left: 0.8rem; margin-bottom: 1.1rem; line-height: 1.5; }
.buy-sub { text-align: center; font-size: 0.76rem; color: var(--grey-soft); margin-top: 0.55rem; }
.look-inside { margin-bottom: 1.1rem; }
.li-label { font-size: 0.8rem; font-weight: 700; color: var(--ink); margin-bottom: 0.5rem; }
.li-strip { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.7rem; }
/* A two-thumb strip keeps the 3-column grid so each thumb renders at the same
   width as a three-thumb strip; the third cell stays empty. */
.li-strip.two { grid-template-columns: repeat(3, 1fr); }
.li-thumb { border: 1px solid var(--line); border-radius: 10px; padding: 0.45rem 0.45rem 0.5rem; background: var(--white); cursor: zoom-in; transition: border-color 0.18s ease, transform 0.18s ease; font: inherit; }
.li-thumb:hover { border-color: var(--azure); transform: translateY(-2px); }
.li-thumb img { width: 100%; height: auto; border-radius: 6px; display: block; border: 1px solid var(--line); }
.li-thumb span { display: block; font-size: 0.7rem; color: var(--grey); margin-top: 0.4rem; text-align: center; }
.lb { border: none; border-radius: 14px; padding: 0.6rem; max-width: min(720px, 92vw); box-shadow: 0 40px 90px -30px rgba(13,49,44,0.6); }
.lb::backdrop { background: rgba(13,49,44,0.55); }
.lb img { width: 100%; height: auto; display: block; border-radius: 8px; }
.lb-close { position: absolute; top: 0.4rem; right: 0.6rem; border: none; background: var(--navy); color: #fff; width: 2rem; height: 2rem; border-radius: 99px; font-size: 1.1rem; cursor: pointer; line-height: 1; }
.prod-flag { position: absolute; top: -0.8rem; left: 1.7rem; background: var(--azure); color: #fff; font-size: 0.68rem; font-weight: 800; letter-spacing: 0.09em; text-transform: uppercase; border-radius: 99px; padding: 0.3rem 0.9rem; }
.prod-card h3 { font-size: 1.28rem; font-weight: 800; letter-spacing: -0.02em; }
.prod-sub { font-size: 0.9rem; color: var(--grey); margin-top: 0.15rem; }
.prod-price { font-weight: 800; font-size: 2.4rem; letter-spacing: -0.03em; margin: 0.7rem 0 0.9rem; color: var(--ink); }
.prod-launch { font-size: 0.78rem; font-weight: 700; color: #b0700f; margin: -0.6rem 0 0.9rem; }
.prod-price sup { font-size: 0.42em; color: var(--grey-soft); }
.prod-list { list-style: none; display: grid; gap: 0.5rem; margin-bottom: 1rem; }
.prod-list li { font-size: 0.92rem; color: var(--grey); padding-left: 1.5rem; position: relative; }
.prod-list li::before { content: "\2713"; position: absolute; left: 0; color: var(--azure); font-weight: 800; }
.prod-list li b { color: var(--ink); }
.prod-note { font-size: 0.86rem; color: var(--azure-deep); background: var(--tint-2); border-radius: 10px; padding: 0.7rem 0.9rem; margin-bottom: 1.1rem; }
.prod-card .pill { display: block; text-align: center; }
.magnet { display: flex; gap: 1.6rem; align-items: flex-start; border: 1px solid var(--line); border-radius: 18px; background: var(--white); padding: 1.6rem 1.8rem; margin-bottom: 1.6rem; flex-wrap: wrap; }
.magnet img.magnet-cover { width: 130px; height: auto; border-radius: 6px; border: 1px solid var(--line); box-shadow: 0 10px 22px -8px rgba(0,0,0,0.25); flex-shrink: 0; }
.magnet > div { flex: 1; min-width: 260px; }
.magnet h3 { font-size: 1.2rem; color: var(--ink); letter-spacing: -0.01em; }
.magnet .magnet-kicker { font-size: 0.72rem; font-weight: 800; letter-spacing: 0.09em; text-transform: uppercase; color: var(--azure-deep); margin-bottom: 0.35rem; }
.magnet p { color: var(--grey); font-size: 0.92rem; margin-top: 0.55rem; max-width: 68ch; }
.magnet .pill { margin-top: 1rem; display: inline-block; }
.magnet .magnet-fine { font-size: 0.8rem; color: var(--grey-soft); margin-top: 0.6rem; }
.bundle { margin-top: 1.4rem; display: flex; justify-content: space-between; align-items: center; gap: 1.5rem; flex-wrap: wrap; background: var(--navy); border-radius: 18px; padding: 1.6rem 1.8rem; }
.bundle-fan { display: flex; align-items: center; flex-shrink: 0; }
.bundle-fan img { width: 58px; height: auto; border-radius: 4px; box-shadow: 0 8px 18px -6px rgba(0,0,0,0.5); }
.bundle-fan img:nth-child(1) { transform: rotate(-7deg); z-index: 3; }
.bundle-fan img:nth-child(2) { transform: rotate(2deg); margin-left: -18px; z-index: 2; }
.bundle-fan img:nth-child(3) { transform: rotate(9deg); margin-left: -18px; z-index: 1; }
.bundle h3 { color: #fff; font-size: 1.15rem; font-weight: 800; }
.bundle p { color: #b8d2ca; font-size: 0.92rem; margin-top: 0.2rem; max-width: 46ch; }
.bundle-price { display: flex; align-items: center; gap: 1rem; }
.bundle-price span { color: #8ba79f; text-decoration: line-through; font-size: 0.95rem; }
.bundle-price b { color: #fff; font-size: 2rem; font-weight: 800; letter-spacing: -0.02em; }
@media (max-width: 960px) { .prod-grid { grid-template-columns: 1fr; } }

/* Industries hub. Five equal options, so the grid is deliberately even and no
   card is visually promoted: same fill, same border, same height, one accent
   only on hover. Three across on desktop wraps 3 + 2, which reads as a set
   rather than a ranking. The card is taller than svc-tile because five choices
   need enough on each to choose between them. */
.ind-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.1rem; align-items: stretch; }
.ind-card { display: flex; flex-direction: column; text-decoration: none; background: var(--tint-2); border: 1px solid var(--line); border-radius: 18px; padding: 1.5rem 1.45rem 1.25rem; transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease; }
.ind-card:hover { transform: translateY(-4px); border-color: var(--azure); box-shadow: 0 16px 32px -20px rgba(12, 147, 132, 0.35); }
.ind-head { display: flex; align-items: center; gap: 0.62rem; margin-bottom: 0.5rem; }
.ind-mark { flex: 0 0 auto; }
.ind-card h3 { font-size: 1.2rem; font-weight: 800; line-height: 1.15; letter-spacing: -0.022em; color: var(--ink); }
.ind-promise { font-size: 0.885rem; line-height: 1.45; color: var(--grey); margin-bottom: 0.85rem; }
/* The sixth cell. Quieter on purpose: no mark, dashed edge, paper fill, so six cards
   read as five options plus a way out rather than six equal industries. */
.ind-card-other { background: transparent; border-style: dashed; }
.ind-card-other h3 { color: var(--grey); }
.ind-card-other:hover { background: var(--tint-2); border-style: solid; }
/* Keyboard users got only the browser default before this, which the radius half hides. */
.ind-card:focus-visible, .ind-chip:focus-visible { outline: 3px solid var(--azure); outline-offset: 3px; }
.ind-card ul { list-style: none; display: grid; gap: 0.34rem; margin: 0 0 1.1rem; flex: 1; }
.ind-card li { position: relative; padding-left: 0.95rem; font-size: 0.855rem; line-height: 1.45; color: var(--grey); }
.ind-card li::before { content: ""; position: absolute; left: 0; top: 0.55em; width: 5px; height: 5px; border-radius: 50%; background: var(--azure); }
.ind-meta { display: flex; flex-direction: column; gap: 0.28rem; padding-top: 0.85rem; border-top: 1px solid var(--line); }
.ind-meta span { font-size: 0.79rem; font-weight: 700; color: var(--ink); }
.ind-meta em { font-size: 0.79rem; font-weight: 700; font-style: normal; letter-spacing: 0.01em; color: var(--azure-deep); }
.ind-card:hover .ind-meta em::after { transform: translateX(3px); }
.ind-meta em::after { content: " \2192"; display: inline-block; transition: transform 0.18s ease; }

/* The evidence strip. Four counted findings, presented as plain claims with
   their sample sizes, which is the one thing on the hub a competitor cannot
   copy without doing the reading. */
.ind-evidence { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem 1.5rem; }
.ind-evidence > div { border-left: 2px solid var(--azure); padding: 0.15rem 0 0.15rem 1.1rem; }
.ind-evidence b { display: block; font-size: 0.95rem; font-weight: 800; color: var(--ink); letter-spacing: -0.01em; margin-bottom: 0.25rem; }
.ind-evidence span { display: block; font-size: 0.875rem; line-height: 1.55; color: var(--grey); }

@media (max-width: 960px) {
  .ind-grid { grid-template-columns: 1fr; }
  .ind-evidence { grid-template-columns: 1fr; }
}


/* Homepage industry chips. They replace seven sector words that were plain text and
   linked nowhere, two of which named industries with no page behind them. Same slot,
   same visual weight, and now they are the fastest route into the site. 44px minimum
   height so they are a real touch target. */
.ind-chips { display: flex; flex-wrap: wrap; gap: 0.5rem; justify-content: center; }
.ind-chip { display: inline-flex; align-items: center; gap: 0.5rem; min-height: 44px;
  padding: 0.5rem 1rem 0.5rem 0.7rem; border: 1px solid var(--line); border-radius: 999px;
  background: #fff; text-decoration: none; color: var(--ink); font-size: 0.87rem; font-weight: 700;
  transition: border-color 0.18s ease, transform 0.18s ease, box-shadow 0.18s ease; }
.ind-chip:hover { border-color: var(--azure); transform: translateY(-2px);
  box-shadow: 0 12px 24px -18px rgba(12, 147, 132, 0.5); }
.ind-chip-more { font-weight: 800; color: var(--azure-deep); padding-left: 1rem; }
@media (max-width: 700px) { .ind-chip { font-size: 0.82rem; padding-left: 0.6rem; } }

/* Roles we write for. Capped list in columns: a reader scans for their own title, so the
   column layout matters more than the prose around it. */
.role-cols { list-style: none; columns: 3; column-gap: 2rem; margin: 0; padding: 0; }
.role-cols li { break-inside: avoid; position: relative; padding-left: 1rem; margin-bottom: 0.42rem;
  font-size: 0.9rem; color: var(--ink); }
.role-cols li::before { content: ""; position: absolute; left: 0; top: 0.58em; width: 5px; height: 5px;
  border-radius: 50%; background: var(--azure); }
@media (max-width: 900px) { .role-cols { columns: 2; } }
@media (max-width: 560px) { .role-cols { columns: 1; } }

/* Specimens. Published as watermarked images at half render resolution, never as files. */
.spec-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.6rem; }
.spec-fig { margin: 0; }
.spec-fig img { display: block; width: 100%; height: auto; border: 1px solid var(--line);
  border-radius: 10px; background: #fff; }
.spec-fig figcaption { font-size: 0.85rem; color: var(--grey); margin-top: 0.6rem; line-height: 1.45; }
.spec-fig figcaption b { color: var(--ink); }
@media (max-width: 760px) { .spec-grid { grid-template-columns: 1fr; } }

/* Blog: industry signals and the key points block. */
.ph-industry { display: inline-flex; align-items: center; gap: 0.4rem; margin-top: 0.5rem;
  font-size: 0.82rem; font-weight: 800; color: var(--azure-deep); letter-spacing: 0.01em; }
.ph-industry svg { flex: 0 0 auto; }
.blog-tile { position: relative; }
.blog-tag { display: inline-flex; align-items: center; gap: 0.38rem; margin-bottom: 0.55rem;
  font-size: 0.72rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--grey); }
.blog-tag svg { flex: 0 0 auto; }
.keypoints { background: var(--tint-2); border: 1px solid var(--line); border-left: 3px solid var(--azure);
  border-radius: 0 14px 14px 0; padding: 1.15rem 1.3rem 1.05rem; margin: 0 0 1.8rem; }
.keypoints h2 { font-size: 0.76rem !important; font-weight: 800; text-transform: uppercase;
  letter-spacing: 0.1em; color: var(--azure-deep); margin: 0 0 0.6rem !important; padding: 0 !important;
  border: 0 !important; }
.keypoints ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.5rem; }
.keypoints li { position: relative; padding-left: 1.15rem; font-size: 0.925rem; line-height: 1.5;
  color: var(--ink); }
.keypoints li::before { content: ""; position: absolute; left: 0; top: 0.6em; width: 6px; height: 6px;
  border-radius: 50%; background: var(--azure); }
/* Marks beside a heading sit on the cap height rather than the baseline, which made them
   read as low. Align to the text box and nudge for optical centre. */
.prose h2 svg, h2 svg.ind-mark { vertical-align: -0.18em; }
/* Optical alignment: a mark measures centred against the line box, and uppercase-weighted
   heading text has no descenders, so the geometric centre reads low. Nudge to cap height. */
.prose svg.ind-mark { transform: translateY(-2px); }

/* Draft figure placeholder. Deliberately unfinished-looking so it cannot be mistaken for
   shipped work, and reported by the build as NOT LAUNCH READY until it is replaced or removed. */
.fig-placeholder { display: block; margin: 1.7rem 0 0.6rem; padding: 1.5rem 1.4rem;
  border: 2px dashed var(--grey-soft); border-radius: 14px; background: repeating-linear-gradient(
    135deg, transparent, transparent 10px, rgba(139,163,156,0.07) 10px, rgba(139,163,156,0.07) 20px); }
.fig-placeholder b { display: block; font-size: 0.76rem; font-weight: 800; text-transform: uppercase;
  letter-spacing: 0.1em; color: var(--grey-soft); margin-bottom: 0.35rem; }
.fig-placeholder span { display: block; font-size: 0.92rem; color: var(--grey); max-width: 62ch; }
