/* v27 PREVIEW (10 Nov 2026): the whole site in IBM Plex Sans instead of Arial. Not decided; remove by deleting the
   pages_v27_plex call in pages_v4.py (see PLEX_PREVIEW.md). Fonts: IBM's own split woff2 files, unmodified (OFL 1.1,
   /assets/fonts/OFL.txt), weights 400 and 700, served from /assets/fonts/ only. Palette and layout unchanged. */
@font-face{font-family:"IBM Plex Sans";font-style:normal;font-weight:400;font-display:swap;src:url(fonts/IBMPlexSans-Regular-Latin1.woff2) format("woff2");
  unicode-range:U+0000,U+000D,U+0020-007E,U+00A0-00FF,U+0131,U+0152-0153,U+02C6,U+02DA,U+02DC,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2039-203A,U+2044,U+20AC,U+2122,U+2212,U+FB01-FB02}
@font-face{font-family:"IBM Plex Sans";font-style:normal;font-weight:700;font-display:swap;src:url(fonts/IBMPlexSans-Bold-Latin1.woff2) format("woff2");
  unicode-range:U+0000,U+000D,U+0020-007E,U+00A0-00FF,U+0131,U+0152-0153,U+02C6,U+02DA,U+02DC,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2039-203A,U+2044,U+20AC,U+2122,U+2212,U+FB01-FB02}
/* arrows and check mark (← → ↓ ✓): IBM's "Pi" file, fetched only on a page that shows one of these characters */
@font-face{font-family:"IBM Plex Sans";font-style:normal;font-weight:400;font-display:swap;src:url(fonts/IBMPlexSans-Regular-Pi.woff2) format("woff2");
  unicode-range:U+0E3F,U+2000-200D,U+2015,U+2028-2029,U+202F,U+2032-2033,U+2070,U+2074-2079,U+2080-2089,U+2113,U+2116,U+2126,U+212E,U+2150-2151,U+2153-215E,U+2190-2199,U+21A9-21AA,U+21B0-21B3,U+21B6-21B7,U+21BA-21BB,U+21C4,U+21C6,U+2202,U+2206,U+220F,U+2211,U+2215,U+221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+25CA,U+2713,U+274C,U+2B0E-2B11}
@font-face{font-family:"IBM Plex Sans";font-style:normal;font-weight:700;font-display:swap;src:url(fonts/IBMPlexSans-Bold-Pi.woff2) format("woff2");
  unicode-range:U+0E3F,U+2000-200D,U+2015,U+2028-2029,U+202F,U+2032-2033,U+2070,U+2074-2079,U+2080-2089,U+2113,U+2116,U+2126,U+212E,U+2150-2151,U+2153-215E,U+2190-2199,U+21A9-21AA,U+21B0-21B3,U+21B6-21B7,U+21BA-21BB,U+21C4,U+21C6,U+2202,U+2206,U+220F,U+2211,U+2215,U+221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+25CA,U+2713,U+274C,U+2B0E-2B11}
/* Arial (or its metric twin Liberation Sans) scaled to Plex's width and line metrics, shown while Plex loads, so the
   swap barely moves anything. Values from the site's own text: avg. advance Plex/Arial = 100.78% (400), 98.38% (700);
   Plex hhea 1025/-275/0 per 1000, divided by size-adjust. */
@font-face{font-family:"Plex Fallback";font-style:normal;font-weight:400;src:local("Arial"),local("ArialMT"),local("Liberation Sans"),local("LiberationSans");
  size-adjust:100.78%;ascent-override:101.7%;descent-override:27.29%;line-gap-override:0%}
@font-face{font-family:"Plex Fallback";font-style:normal;font-weight:700;src:local("Arial Bold"),local("Arial-BoldMT"),local("Liberation Sans Bold"),local("LiberationSans-Bold");
  size-adjust:98.38%;ascent-override:104.19%;descent-override:27.95%;line-gap-override:0%}
:root{--kf:"IBM Plex Sans","Plex Fallback",Arial,-apple-system,"Segoe UI",Roboto,sans-serif}
/* One family everywhere (text, buttons, form fields, SVG labels, the assistant widget). Code keeps its monospace.
   !important because the Arial stacks sit in ~40 rules across nine stylesheets, many as the `font:` shorthand. */
html body,html body *:not(code):not(kbd):not(pre):not(samp){font-family:var(--kf)!important}
/* Tracking. Plex Bold has tighter default spacing than Arial Bold, so the negative tracking tuned for Arial looks
   cramped on display headings. Same sizes and line-heights; tracking eased (H1 64-68%, H2 38-70% of the Arial values), in em
   so one rule covers every breakpoint ("html" prefix: one step more specific than the rules it eases). Uppercase
   labels (positive tracking) and the big figures (Plex figures are wider than Arial's, so they keep their tracking)
   are left as they are. */
html .k-hero h1{letter-spacing:-.018em}
html h1.h-display,html .page-hero .wrap h1.h-display,html .hero .wrap h1.h-display,html .page-hero h1,html .hero.v6 h1{letter-spacing:-.019em}
html h1.h-article,html .page-hero .wrap h1.h-article,html .hero .wrap h1.h-article{letter-spacing:-.015em}
html h1{letter-spacing:-.012em}
html h2,html .k-band h2,html .k-end h2,html .cta h2,html .vb-band h2,html .s21-mail h2,html .ks-story .ks-h{letter-spacing:-.011em}
html .prose h2,html .vm-ch h2,html .ks-on .ks-t,html .ro-sheet h2{letter-spacing:-.01em}
html .ro-sheet h2.ro-title,html .ro-answer p,html .ro-big{letter-spacing:-.015em}
/* The "← " crumb: Plex's arrow fills its whole advance, so the gap before the link text closes up; give it back. */
html .crumb::before{padding-right:.18em}
/* Case-study hero, phones. In Arial the before/after pair sits side by side from 390 px up and each figure stays on
   one line at 360. Plex's wider figures broke both (the pair stacked at 390: +65 px hero). Slightly smaller gaps and
   a touch more tracking on the two figures restore Arial's behaviour at 360, 375, 390 and 414. */
@media (max-width:480px){html .c-hero .c-read{column-gap:8px}html .c-hero .c-v{gap:8px}html .c-hero .c-b,html .c-hero .c-a{letter-spacing:-.5px}}
/* Below 390 px Arial stacks the pair; stack it there in Plex too, so the row never flips when the font swaps in. */
@media (max-width:389px){html .c-hero .c-read>.c-m+.c-m{flex-basis:100%}}
@media (max-width:380px){html .c-hero .c-v{gap:6px}html .c-hero .c-b,html .c-hero .c-a{letter-spacing:-.6px}}
/* /contact/: the phone link's trailing 20 px margin (invisible at the end of the line) made the line 6 px too long
   in Plex, so the number wrapped. Dropping that trailing margin keeps the visible gap between the two links. */
html .ka-cnext p.ka-direct a:last-child{margin-right:0}
/* The three consultant pages, whose H1 has a long word ("implementation", "manufacturing") in the narrow hero column:
   tighter tracking wherever that hero has two columns (from 961 px). At 1280 the word now fits; at 1024 it overflows
   in Arial too, and Plex now overflows by about the same. Browsers without :has() keep the eased tracking. */
@media (min-width:961px){html .vb-hgrid:has(canvas[data-vb="flow"],canvas[data-vb="buffer"],canvas[data-vb="release"]) h1.h-display{letter-spacing:-.032em}}
