/* ==========================================================================
   Altius IT — site stylesheet
   Direction A: refined classic. Responsive: one set of pages, no mobile site.

   Palette after GMK Red Samurai (RedSuns), from Ii Naomasa's armour:
     Pantone 7421 C  burgundy   -> pushed toward red for the accent
     Pantone 426 C   near-black -> header strip, footer, body text, and the
                                   whole neutral scale
     Pantone 465 C   tan/gold   -> secondary accent

   Every grey is a tint of 426 C: hue 204deg, saturation 6%, lightness varied.
   All foreground/background pairs clear WCAG AA (>= 4.5).
   ========================================================================== */

:root {
	/* Neutrals: tints of Pantone 426 C (#25282A) -- hue 204, saturation 6.3%,
	   varying only in lightness, so every grey belongs to the same family as
	   the header and footer.
	   Caveat at the light end: a 6.3% tint is not representable above ~96%
	   lightness in 8-bit colour. The channel spread works out below one RGB
	   step, so --gray-990 and --gray-950 round to near-neutral no matter what
	   hue they are nominally derived from. They are not "wrong" -- the tint is
	   simply finer than the format can carry. */
	--gray-990: #FBFBFB;   /* page background                              */
	--gray-950: #F4F5F6;   /* section bands                                */
	--gray-700: #DDDFE1;   /* hairlines (was #DDE0E1, hue 195 -- off-family)*/

	--ink:      #25282A;   /* Pantone 426 C                                */
	--muted:    #484D51;   /* hero subtitles. Same hue/saturation as --ink
	                          (204deg, 6.3%) at 30% lightness, so it reads as
	                          a step down from the headline rather than a
	                          different grey. On the 90%-white hero panel it
	                          holds 6.98 against the darkest photo behind it. */
	--surface:  var(--gray-950);
	--dark:     #25282A;   /* Pantone 426 C                                */

	/* Resources band. It now carries the FOOTER's palette -- dark ground, warm
	   off-white body text, gold headings -- so the two heavy blocks on the page
	   read as one system rather than two unrelated slabs.
	   Light greys were tried here at length and all rejected: a lightened 465 C
	   gold (became its own warm plane on a cool site), a cool tint of --dark, a
	   near-neutral, and a warm-leaning grey. The band is the largest single
	   surface on the site, and inverting it turned out to be the treatment that
	   actually made it look intentional. */

	/* Text on the dark ground. Shared by the footer and the band; naming them
	   makes that relationship explicit rather than a coincidence of two
	   hardcoded hex values drifting apart later.
	   Against --dark: 9.87, 5.62 and 5.40 respectively. */
	--on-dark:      #D8D2C8;   /* links and emphasis                        */
	--on-dark-mute: #A79E92;   /* body copy -- the footer tagline's colour  */

	/* Text on the BURGUNDY surfaces -- the footer and the testimonial cards.
	   Both use --accent-d rather than --accent: over a large area the lighter
	   burgundy is loud, and the deeper one lifts every role by 1.3-2.5 points
	   (links 7.14 -> 9.19, stars 4.72 -> 6.08). --accent stays for small,
	   deliberately bright things -- buttons, the ribbon, links. Burgundy is much lighter than --dark, so
	   the on-dark set does not transfer: --gold falls to 3.21 there and
	   --on-dark-mute to 3.34, both under AA. These are lightened until they
	   match what the charcoal footer achieved, so moving the footer to
	   burgundy costs no legibility on what is the smallest text on the site
	   (13-14px).  charcoal -> burgundy:  links 9.87 -> 7.14,
	   headings 5.40 -> 5.27, body 5.62 -> 5.59. */
	--on-burg:      #EAE7E1;   /* links and emphasis                        */
	--on-burg-mute: #D3CDC5;   /* body copy, legal line                     */

	--accent:   #8A2434;   /* burgundy-red, hue 351                        */
	--accent-d: #6E1B29;   /* hue 350                                      */

	/* Gold family. All four sit on Pantone 465 C's hue (38) and differ only
	   in lightness and saturation; they had drifted to 38/39/41/42, which is
	   small but means "the gold" was four slightly different colours. */
	--gold:     #B9975B;   /* Pantone 465 C                                */
	--gold-d:   #8C692C;   /* link hover and the focus ring. Was #96762F,
	                          which gave only 4.26 on white and 3.90 on
	                          --surface -- hovering a link made it HARDER to
	                          read. This gives 5.03 and 4.61.              */
	--gold-lt:  #D6BA8A;   /* THE gold for burgundy grounds. True 465 C
	                          reaches only 3.21 on --accent and 4.13 on
	                          --accent-d, both under the 4.5 small text
	                          needs -- burgundy cannot carry Pantone 465 C
	                          at 14px, which is why this exists at all.
	                          4.72 on --accent, 6.08 on --accent-d, 7.95
	                          on --dark.
	                          Absorbed --on-burg-head (#DDC59D), a second
	                          lightened gold doing the same job 7/11/19
	                          away -- too close to distinguish deliberately,
	                          far enough to read as drift.               */
	--gold-hi:  #E4CEA8;   /* hover brightening of --gold-lt on the quote
	                          button and call bar. Was an untokenised
	                          #E4D2A8 repeated in two rules.               */
	--line:      var(--gray-700);
	--line-dark: #3B3E40;  /* hairline ON the dark ground -- 426 C at 24%    */

	--wrap:     1180px;
	--radius:   4px;
}

/* --------------------------------------------------------------- base --- */

*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; }

body {
	/* The OS's own interface face: SF Pro on macOS and iOS, Segoe UI on
	   Windows, Roboto on Android. Better letterforms than Arial at every size
	   for no cost -- no webfont file, no extra request, no flash of unstyled
	   text. Arial stays at the end of the stack as the floor.
	   Metrically close enough to Arial that nothing needed retuning: measured
	   across the site, the longest page moved 3357px -> 3363px and no headline
	   changed its line count. */
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
	             Helvetica, Arial, sans-serif;
	margin: 0;
	color: var(--ink);
	font-size: 16px;
	line-height: 1.6;
	background: var(--gray-990);
	overflow-x: hidden;
}

img { max-width: 100%; height: auto; border: 0; }

/* The 14 section icons were sourced separately and have eight different natural
   sizes (76x78, 77x76, 77x77, 77x78, 77x79, 78x77, 78x78, 80x77). The markup
   copies each file's own dimensions, and `max-width: 100%` above then squeezes
   some further inside narrow cells -- 21 distinct rendered sizes across the
   site, eight of them on services.html alone.
   CSS beats HTML presentational attributes, so this normalises every one of
   them without editing a single page. Forcing square costs at most 4%
   distortion (worst case 80x77), invisible on a rounded-square icon. */
img[src*="images/icon"] {
	width: 64px !important;
	height: 64px !important;
	max-width: none !important;
}

a { color: var(--accent); text-decoration: none; }
a:hover { color: var(--gold-d); text-decoration: underline; }

/* Keyboard focus. There was no focus style at all, so tabbing through the site
   was invisible. --gold-d clears the 3:1 required of a non-text indicator on
   every light surface; the footer, header and call bar are dark, so they take
   the lighter gold. */
:focus-visible {
	outline: 3px solid var(--gold-d);
	outline-offset: 2px;
	border-radius: 2px;
}
.site-footer :focus-visible,
.callbar :focus-visible,
.site-header :focus-visible { outline-color: var(--gold); }

p { margin: 0 0 1em; }

/* `background: none` matters: six <hr color="black"> tags across five pages set
   a pure-black background via the presentational attribute. It does not paint
   today because the element has zero content height, but it is one stray
   height away from a black bar. */
hr { border: 0; border-top: 1px solid var(--line); background: none; margin: 28px auto; }

/* ------------------------------------------------- legacy <font> tags ---
   630 <font size=N> tags carry real intent (section headings etc), so map
   them onto a fluid scale rather than flattening them all to body size.    */

font { font-family: inherit !important; }

/* Three more places the typeface leaked, all found by measuring the rendered
   font on all 76 pages rather than reading the markup.

   1. Form controls do not inherit font by default -- browsers hand them to the
      OS. The payment dropdowns on templates.html, projectapproval.html and one
      blog post rendered their <option>s in Arial while the page around them was
      the system face.
   2. privacy.html and privacydonotsell.html are Word exports carrying inline
      font-family on 54 and 6 elements between them. Inline beats a stylesheet,
      so those two pages were wholesale in a different typeface. Only those two
      pages have any inline font-family -- verified before writing this rule so
      it cannot catch anything it should not.
   3. The cookie notice, which is ours and inherits already. */
button, input, select, textarea, option { font-family: inherit; }
[style*="font-family"] { font-family: inherit !important; }
font[size="1"] { font-size: 12px !important; }
font[size="2"] { font-size: 14px !important; }
font[size="3"] { font-size: 16px !important; }
font[size="4"] { font-size: clamp(17px, 1.6vw, 19px) !important; }
font[size="5"] { font-size: clamp(19px, 2.2vw, 23px) !important; line-height: 1.3; }
font[size="6"] { font-size: clamp(22px, 3vw, 30px) !important; line-height: 1.25; }
/* Each page's main heading was `<p align="center"><font size="6">...</font></p>`,
   which renders large but tells a search engine or a screen reader nothing.
   The whole paragraph is now a real <h1 align="center">.
   Replacing only the <font> would NOT work: <h1> is not permitted inside <p>,
   so the parser implicitly closes the paragraph before it -- which discards the
   align="center" and adds a line break. Measured: the heading jumped from
   centred to left-aligned and every page grew 16px.
   So this rule reproduces the <p> box it replaces exactly:
     margin 0 0 1em   -- matches the `p` rule above
     font-weight 400  -- <h1> defaults to bold; <font size="6"> does not
   and the align attribute keeps doing the centring, as it did on the <p>. */
/* Bare <h2> matches <h1>: services.html's "Services" is a section title under
   the hero h1, and should not shrink to the browser default. The scoped h2s in
   .qs-head and .indep-in set their own size and win on specificity. */
h2 {
	font-size: clamp(22px, 3vw, 30px);
	line-height: 1.25;
	font-weight: 400;
	margin: 0 0 16px;
}

h1 {
	font-size: clamp(22px, 3vw, 30px);
	line-height: 1.25;
	font-weight: 400;
	/* 16px, NOT 1em. The <p> this replaces inherited the 16px body size, so its
	   `margin: 0 0 1em` was 16px. On the <h1>, 1em resolves against the
	   heading's own 30px, which would nearly double the gap below it. */
	margin: 0 0 16px;
}
font[size="7"] { font-size: clamp(26px, 4vw, 36px) !important; line-height: 1.2; }

/* Blog posts carry their own centred logo above the title, redundant now that
   they have a header logo. Hidden here rather than edited out of 43 files.
   Scoped to pages that HAVE a header, so a page without one would keep its
   own logo. */
body:has(.site-header) p[align="center"] > a > img[src*="altiusitlogo"] { display: none; }
body:has(.site-header) p[align="center"]:has(> a > img[src*="altiusitlogo"]) { margin: 0; }

/* Legacy link classes kept so existing markup keeps working */
.navlinks, .normal, .endlinks { font-family: inherit; font-size: 16px; }
.normal { color: var(--ink); padding: 0 10px; line-height: 1.6; }
.normal a { color: var(--accent); text-decoration: underline; }

/* ------------------------------------------------------------- header --- */

/* Charcoal, not --surface. The site's argument is that we are certified
   auditors who sign opinions, and a dark bar carries that better than a white
   one. It also absorbs the 8px strip that already sat above it, so the two
   read as one block instead of a stripe over a plate.
   The logo had to change with it: images/altiusitlogo.gif is dark-on-
   transparent and disappears here. tools/logo.py builds the light lockup. */
.site-header {
	background: var(--dark);
	border-bottom: 0;
	position: relative;
	z-index: 50;
}
/* The 8px strip that used to open the header is gone. Its job was giving a
   LIGHT header a defined dark top edge; the header is charcoal now and does
   that itself, so a burgundy stripe above it was decoration at 1.68 contrast.
   The hero's matching 8px border stays -- it still divides the photograph from
   the band below it, which is a job, not an echo. */

.site-header .wrap {
	max-width: var(--wrap);
	margin: 0 auto;
	padding: 10px 18px;
	display: flex;
	align-items: center;
	gap: 26px;
}

.site-header .brand { display: flex; align-items: center; flex: 0 0 auto; order: 0; }
.site-header .brand img { height: 46px; width: auto; display: block; }

.site-nav { display: flex; align-items: center; gap: 24px; margin-left: 8px; order: 1; }
.site-nav a {
	color: var(--on-dark);
	font-size: 14px;
	letter-spacing: .02em;
	text-transform: uppercase;
	white-space: nowrap;
	padding: 6px 0;
	border-bottom: 2px solid transparent;
}
/* --accent on charcoal is 1.68:1. Gold is the only brand colour that survives
   this ground: 5.40 against --dark. */
.site-nav a:hover { color: var(--gold); text-decoration: none; border-bottom-color: var(--gold); }

.btn-quote {
	order: 3;
	margin-left: auto;
	/* Burgundy box, gold text. --accent for the fill rather than --accent-d:
	   the deeper one sinks into the charcoal bar and stops reading as a
	   button from any distance.
	   Text is --gold-lt, not true 465 C. It has to be -- real gold on this
	   fill is 3.21, and --gold-lt reaches 4.72. This is the same constraint
	   that produced the token: burgundy cannot carry Pantone 465 C at body
	   size, which is also why the footer headings are --gold-lt.
	   The fill measures 1.68 against the header, under the 3.0 WCAG 1.4.11
	   wants for a component boundary. That check is luminance-only and red
	   against grey separates by hue, so it reads far better than the number
	   suggests -- but a contrast checker will flag it. A 2px --gold rule
	   closes it properly at 5.40 if that is ever needed. */
	background: var(--accent);
	color: var(--gold-lt) !important;
	font-weight: 700;
	font-size: 14px;
	padding: 11px 18px;
	border-radius: var(--radius);
	white-space: nowrap;
	flex: 0 0 auto;
}
.btn-quote:hover { background: var(--accent-d); color: var(--gold-hi) !important; text-decoration: none; }

/* CSS-only hamburger — no JavaScript anywhere on the site */
.nav-toggle { position: absolute; opacity: 0; pointer-events: none; }
.nav-burger {
	display: none;
	order: 4;
	margin-left: auto;
	width: 44px; height: 44px;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	gap: 5px;
	cursor: pointer;
}
.nav-burger span {
	display: block; width: 24px; height: 3px;
	background: var(--on-dark); border-radius: 2px;
	transition: transform .2s ease, opacity .2s ease;
}

/* --------------------------------------------------------------- hero --- */

/* Scoped to td deliberately. templates.html also puts class="recliningphoto" on
   the two paragraphs inside the cell, so an unscoped selector gave each of them
   the band height and padding -- a 1450px hero with the subject pushed off the
   bottom. Only the cell is the hero. */
td.freedomphoto, td.recliningphoto, td.thumbupphoto,
td.mantabletphoto, td.manphonephoto, td.manstandingphoto,
td.aboutusphoto, td.mediaphoto {
	background-position: center top;
	background-repeat: no-repeat;
	background-size: cover;
	height: auto !important;
	padding: clamp(34px, 6vw, 74px) 0;
	/* Closes the hero with the same 8px strip that opens the header, so the
	   photograph reads as a bounded band rather than bleeding into the section
	   below it. A border rather than an inset shadow: a shadow would crop the
	   image. This used to echo an 8px strip at the top of the header; that
	   strip is gone, but the divider is still doing work here. */
	border-bottom: 8px solid var(--dark);
}

td.freedomphoto     { background-image: url(images/imagefreedom.jpg); }
td.recliningphoto   { background-image: url(images/imagereclining.jpg); }
td.thumbupphoto     { background-image: url(images/imagethumbup.jpg); }
td.mantabletphoto   { background-image: url(images/imagemantablet.jpg); }
td.manphonephoto    { background-image: url(images/imagemanphone.jpg); }
td.manstandingphoto { background-image: url(images/imagemanstanding.jpg); }
td.aboutusphoto     { background-image: url(images/imageaboutus.jpg); }
td.mediaphoto       { background-image: url(images/imagemedia.jpg); }

/* A 50vw band (= 1/2.0) matches the 2.0:1 crop of the reprocessed hero
   photographs, so `cover` has nothing to trim up to 1320px wide and subjects
   keep head and torso however short the headline is. Above the 660px cap the
   band is proportionally shorter, but `background-position: center top` means
   the trim comes off the bottom -- losing feet rather than faces.
   ONLY classes whose source has been re-cropped to 2.0:1 may use this. The
   three unused hacker* classes still point at ~1.5:1 originals and are
   deliberately excluded. */
@media (min-width: 769px) {
td.manstandingphoto, td.mantabletphoto, td.manphonephoto,
td.thumbupphoto, td.recliningphoto, td.freedomphoto,
td.aboutusphoto, td.mediaphoto {
		/* on a <td>, `height` behaves as a minimum -- `min-height` does not
		   apply reliably to table cells, so it is set here instead */
		height: min(50vw, 660px) !important;
		vertical-align: middle;
	}
}

/* index.html marks its hero headline as the page <h1>: it IS the page title,
   and the alternative was a second heading below the fold repeating it. The
   other three manstandingphoto pages still use <p> and are unaffected.
   templates.html does the same in its reclining hero. Miss one of these three
   selectors and the headline drops to the body size while its own subtitle
   keeps the hero size, so the subtitle renders LARGER than the heading. */
.freedomphoto p, .recliningphoto p, .thumbupphoto p,
.mantabletphoto p, .manphonephoto p, .manstandingphoto p,
.aboutusphoto p, .mediaphoto p,
.manstandingphoto h1, .mantabletphoto h1, .recliningphoto h1 {
	font-size: clamp(22px, 4.2vw, 40px);
	line-height: 1.2;
	font-weight: 700;
	color: var(--ink);
	background: rgba(255,255,255,.90);
	border-left: 5px solid var(--accent);
	/* A 90%-white panel on a bright photograph has almost no edge. Measured on
	   templates.html the panel sat on photo at luminance 0.82, a separation of
	   1.21:1, and the card simply dissolved into the window behind it; services
	   was 1.20:1. A shadow separates the panel at any background brightness,
	   which is one rule against re-grading eight photographs, and it holds up
	   on the dark heroes too where a lighter treatment would not. */
	box-shadow: 0 2px 14px rgba(37,40,42,.22);
	padding: 14px 18px;
	margin: 0 auto 14px 4%;
	max-width: min(58%, 620px);
	width: fit-content;
}

/* These hero photos have their subject on the LEFT, so the copy sits on the
   RIGHT to avoid covering them. Every other hero has the subject on the right,
   where the default left-aligned copy is correct.
     mantablet -> aboutus, auditexternal, auditmobile, auditnetworksecurity,
                  auditprivacy, blog, newsletter, services, sitemap
     manphone  -> news
     freedom   -> auditaiapplication, auditcompliance, riskassessment
                  (the jumper leaps left-to-right; the clear sky is on the right)
     media     -> media (the sharp subject is the woman on the left)
   aboutus is deliberately NOT here. Its photo is uniformly soft-focus with no
   single subject to dodge, so the copy stays on the default left, which also
   aligns it with the standing presenter rather than the seated group. */
.mantabletphoto p, .manphonephoto p, .freedomphoto p, .mediaphoto p,
.mantabletphoto h1 {
	margin-left: auto;
	margin-right: 4%;
	/* fixed rather than fit-content, so the headline and the supporting
	   paragraph share a left edge instead of sizing to their own text */
	width: min(58%, 620px);
}

/* second and later paragraphs in a hero are supporting copy, not headlines.
   `.manstandingphoto h1 ~ p` covers index.html, where the headline is an <h1>
   so `p ~ p` no longer matches the subtitle. More specific than the headline
   rule above, so it wins. */
.freedomphoto p ~ p, .recliningphoto p ~ p, .thumbupphoto p ~ p,
.mantabletphoto p ~ p, .manphonephoto p ~ p, .manstandingphoto p ~ p,
.aboutusphoto p ~ p, .mediaphoto p ~ p,
.manstandingphoto h1 ~ p, .mantabletphoto h1 ~ p, .recliningphoto h1 ~ p {
	font-size: clamp(15px, 1.9vw, 19px);
	font-weight: 400;
	line-height: 1.5;
	color: var(--muted);
	margin-top: -6px;
	border-left-color: var(--gold);
}
.freedomphoto br, .recliningphoto br, .thumbupphoto br,
.mantabletphoto br, .manphonephoto br, .manstandingphoto br,
.aboutusphoto br, .mediaphoto br { display: none; }

/* ------------------------------------------------------------ content --- */

/* Service columns become cards — Direction A: white, red top rule.
   Icons live in their own <tr> above the copy. They are left unboxed and sit
   directly on the section background; only the copy cell becomes a card. */
/* Child combinators matter: a bare table:has(td[width="33%"]) also matches every
   ANCESTOR table, which put 14px of border-spacing on the outer wrappers and
   inset the whole page by 28px. Only the cells' direct parent should match. */
table:has(> tbody > tr > td[width="33%"]) { border-spacing: 14px 0 !important; margin-top: 20px; }

table:has(> tbody > tr > td[width="33%"]) td[align="center"]:has(> a > img),
table:has(> tbody > tr > td[width="33%"]) td[align="center"]:has(> img) {
	background: none;
	border: 0;
	padding: 0 0 12px !important;
}

td[width="33%"] {
	background: #FFFFFF;
	border: 1px solid var(--line);
	border-top: 3px solid var(--gold);
	border-radius: var(--radius);
	padding: 20px 18px !important;
	vertical-align: top;
}
td[width="33%"] > p[align="center"]:first-child { margin-top: 0; }

ul, ol { padding-left: 22px; }
li { margin-bottom: 6px; }

/* Section bands keep their existing bgcolor attributes; add breathing room.
   Tables are capped at 100% because cell padding is added OUTSIDE the content
   box in auto table layout, so a full-width cell plus padding otherwise pushes
   its table past the viewport. */
table { max-width: 100%; }
td[bgcolor="#F2F2F2"] { background-color: var(--surface) !important; }

/* Section rhythm. Every page is laid out hero -> grey -> band -> grey, so the
   first and last sections were the same tone and long pages read as one grey
   mass with no sense of where a section ends. The section tables are siblings,
   so any grey section AFTER the band flips to white. That alternates the page
   (grey / band / white) and keeps the white service cards on grey, where they
   still lift off the background. */
table:has(td[bgcolor="#929fad"]) ~ table td[bgcolor="#F2F2F2"] {
	background-color: #FFFFFF !important;
}

/* ---------------------------------------------- the Resources band ---
   Carries the footer's palette: dark ground, gold headings, warm off-white
   links, muted body copy. The two heavy blocks on the page now match.

   QUIRKS MODE WARNING. No page here has a DOCTYPE, so all 75 render in
   quirks mode -- and in quirks mode a <table> does NOT inherit colour from
   its ancestors. Setting colour on the band cell alone stops dead at the
   first nested table, which is most of the content. The first attempt made
   the entire 180-item policy catalogue on templates.html render in --ink on
   an --ink background: invisible. Hence table/tbody/tr/td/p/b/font are all
   named explicitly below. Do not "simplify" this to a single selector. */
td[bgcolor="#929fad"] {
	background-color: var(--dark) !important;
	background-image: none !important;
}
td[bgcolor="#929fad"],
td[bgcolor="#929fad"] table,
td[bgcolor="#929fad"] tbody,
td[bgcolor="#929fad"] tr,
td[bgcolor="#929fad"] td,
td[bgcolor="#929fad"] p,
td[bgcolor="#929fad"] b,
td[bgcolor="#929fad"] font { color: var(--on-dark-mute) !important; }

/* Air under the band's headings. The markup is `<font size="5">Audit
   Resources</font><p align="left">` with no gap, so the first link sat 3px
   under the heading and the two read as one block.
   Scoped to `+ p` deliberately: 13 of the 16 pages carrying this band follow
   the heading with a <br> instead, where a margin here would stack on top of
   the line break. Only index.html and 404.html use the <p> form. */
td[bgcolor="#929fad"] font[size="5"] + p { margin-top: 20px; }

/* The other half of the band's spacing. On the 13 pages where the heading is
   followed by a <br> rather than a <p>, the rule above cannot reach it and the
   sub-heading sat ON its first line of copy -- measured at -4px on
   services.html. Making it a block with its own margin fixes that, and the
   <br> it made redundant is hidden so the gap does not double. */
td[bgcolor="#929fad"] font[size="5"] { display: block; margin-bottom: 9px; }
td[bgcolor="#929fad"] font[size="5"] + br { display: none; }

/* And the foot of the band: a trailing <br> inside the copy cell plus the last
   element's own bottom margin left 79px under the final bullet against 31px
   above the heading. */
td[bgcolor="#929fad"] td > br:last-child { display: none; }
td[bgcolor="#929fad"] td > *:last-child { margin-bottom: 0; }
/* Hiding that <br> is not enough on its own: it is still the last child, so
   the element BEFORE it keeps its 1em bottom margin and 16px of the gap
   survives. :has() reaches the real last visible block. */
td[bgcolor="#929fad"] td > *:has(+ br:last-child) { margin-bottom: 0; }

/* Trim the dead space under the band. The FrontPage markup wraps its table in
   a <br> above and below, on top of the 30px cell padding, and the last
   paragraph keeps its 1em bottom margin. That left 79px under the final link
   against 48px above the first heading -- visibly bottom-heavy.
   `> br` only: the <br> tags used for line breaks inside the cells are nested
   and must survive. Padding is not touched; it is shared with the light
   content sections and reducing it would reflow every page. */
td[bgcolor="#929fad"] > br { display: none; }
td[bgcolor="#929fad"] p:last-child { margin-bottom: 0; }

/* Headings in gold, exactly as the footer's column heads. */
td[bgcolor="#929fad"] h1,
td[bgcolor="#929fad"] font[size="6"],
td[bgcolor="#929fad"] font[size="5"] { color: var(--gold) !important; }

/* Links follow footer behaviour: off-white, gold on hover. Burgundy is
   unusable here -- 1.68 against the dark ground. */
td[bgcolor="#929fad"] a,
td[bgcolor="#929fad"] a font,
td[bgcolor="#929fad"] a b { color: var(--on-dark) !important; }
td[bgcolor="#929fad"] a:hover,
td[bgcolor="#929fad"] a:hover font { color: var(--gold) !important; }

/* Five font tags carry hardcoded dark colours that would vanish on dark. */
td[bgcolor="#929fad"] font[color="#333333"],
td[bgcolor="#929fad"] font[color="#000000"] { color: var(--on-dark-mute) !important; }

td[bgcolor="#929fad"] hr { border-top-color: var(--line-dark) !important; }

/* The icons were drawn for a light background. Dimming settles them into the
   dark ground without touching their colour, which is what makes them
   readable as distinct services. */
td[bgcolor="#929fad"] img[src*="images/icon"] { filter: brightness(.82) saturate(.9); }

/* templates.html nests a LIGHT section INSIDE the band (the FAQ / payment /
   terms block). It stays light. Listed after and more specific, so it wins. */
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] { background-color: var(--surface) !important; }
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"],
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] table,
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] tbody,
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] tr,
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] td,
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] p,
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] b,
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] font { color: var(--ink) !important; }
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] a,
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] a font { color: var(--accent) !important; }
td[bgcolor="#929fad"] td[bgcolor="#F2F2F2"] img[src*="images/icon"] { filter: none; }
/* Content wrap. The header and footer are centred in a 1180px wrap but the body
   was not, so at a 1600px viewport the logo and footer columns started at 228px
   while body text started at 0 and ran to the edge -- visibly out of line with
   the chrome, and prose stretched to roughly 200 characters per line.
   The padding is applied to the section cell rather than a max-width on the
   table, so the background stays full-bleed and only the content is inset.
   Below 1180px this collapses to the old 18px and nothing changes. */
td[bgcolor="#F2F2F2"], td[bgcolor="#929fad"], td[bgcolor="#adb7c1"] {
	padding-left:  max(18px, calc((100% - 1180px) / 2)) !important;
	padding-right: max(18px, calc((100% - 1180px) / 2)) !important;
}
td[bgcolor="#F2F2F2"], td[bgcolor="#929fad"] { padding-top: 30px !important; padding-bottom: 30px !important; }

/* ------------------------------------------------------------- footer --- */

/* The footer is burgundy while the Resources band above it is --dark. The two
   used to share a ground; giving the footer the accent makes the page end on a
   deliberate full stop rather than a third charcoal slab, now that the header
   strip and the hero both close with one. */
.site-footer { background: var(--accent-d); color: var(--on-burg); margin-top: 0; }
.site-footer .wrap {
	max-width: var(--wrap);
	margin: 0 auto;
	padding: 36px 18px 26px;
	display: grid;
	grid-template-columns: 1.4fr 1fr 1fr;
	gap: 34px;
}
.site-footer h4 {
	/* --gold reaches only 3.21 on burgundy; --on-burg-head is the same hue
	   lightened until it clears AA at 5.27. */
	color: var(--gold-lt); font-size: 14px; text-transform: uppercase;
	letter-spacing: .08em; margin: 0 0 14px;
}
.site-footer a { color: var(--on-burg); display: block; padding: 4px 0; font-size: 14px; }
.site-footer a:hover { color: var(--gold-lt); text-decoration: underline; }
.site-footer .tagline { font-size: 14px; line-height: 1.7; color: var(--on-burg-mute); margin: 0 0 14px; }
.site-footer .contact { font-size: 15px; line-height: 1.9; }
.site-footer .contact strong { color: #fff; }
.site-footer .legal {
	border-top: 1px solid var(--accent-d);
	max-width: var(--wrap);
	margin: 0 auto;
	padding: 16px 18px 22px;
	font-size: 13px;
	color: var(--on-burg-mute);
	display: flex; flex-wrap: wrap; gap: 8px 20px; align-items: center;
}
.site-footer .legal a { display: inline; padding: 0; font-size: 13px; }

/* ----------------------------------------------------- sticky callbar --- */

.callbar { display: none; }

/* ============================================ policy templates page ===
   Ported from the 2024 redesign of policies.htm, which had a stronger sales
   layout than the FrontPage original: a value proposition, priced tiers, a
   feature grid and testimonial cards.

   The content is the same -- same prices, same quotes, same people -- but the
   presentation is rebuilt on this site's palette and typeface. The original
   used Inter, navy #1e3a6d and a yellow #ffc107 star; none of that survives.
   Everything below is drawn from the existing tokens, so this section cannot
   drift from the rest of the site.

   Scoped under .tpl so none of it can leak into the 74 other pages, which are
   still FrontPage tables. */

/* in-page jump targets are bare <a name> tags with no box, so without this the
   heading they precede lands flush against the top edge and looks clipped */
a[name] { scroll-margin-top: 26px; }
/* smooth only for users who have not asked for reduced motion */
@media (prefers-reduced-motion: no-preference) {
	html { scroll-behavior: smooth; }
}

.tpl { max-width: var(--wrap); margin: 0 auto; padding: 0 18px; }
.tpl * { box-sizing: border-box; }

/* ---- 1. value proposition ---- */
/* Burgundy band, matching index.html's independence band: same --accent-d,
   same full-bleed structure (a plain <td> holding a background div, with the
   content re-centred inside it). It could not stay inside .tpl -- that is
   capped at --wrap, so a background there would have been a panel, not a band.
   Text uses the on-burgundy tokens, and the stars switch to star-lt.svg, the
   lightened gold the testimonial cards already use on this ground; true 465 C
   reaches only 3.21 against burgundy. */
/* Shared by templates.html and services.html: both open on a burgundy band
   carrying the page's lede, so the rule lives once rather than twice. */
.tpl-band, .lede-band { background: var(--accent-d); }
.tpl-lede, .lede-band .lede {
	text-align: center;
	max-width: var(--wrap);
	margin: 0 auto;
	padding: 44px 18px 34px;
}

/* services.html's band carries one sentence and nothing else -- the page
   heading belongs to the section below it, not here.
   Typed like "Why an Altius IT audit stands up" on the home page's band --
   21px, bold, --gold-lt -- but centred rather than left. That heading sits
   above three left-aligned columns and shares their spine; this one stands
   alone on its band with nothing to line up against. */
.lede-band .lede { padding-top: 30px; padding-bottom: 30px; }
/* auditor.html puts its <h1> on the band rather than a kicker line. It keeps
   the site-wide h1 size so it reads as the page title, and only takes the
   on-burgundy colour and loses the bottom margin, since nothing follows it
   inside the band. */
.lede-band h1 {
	color: var(--gold-lt);
	margin: 0;
}
.lede-band .kicker {
	font-size: 21px;
	line-height: 1.3;
	font-weight: 700;
	color: var(--gold-lt);
	margin: 0;
}
/* The band heading is an <h2>, not the page <h1>. templates.html now carries
   its <h1> in the hero like index.html and services.html, so this line is the
   supporting hook below it. The site-wide h1 and h2 rules are identical, so
   the demotion changes the document outline and nothing about the look. */
.tpl-lede h2 { color: var(--gold-lt); }
.tpl-rating { color: var(--on-burg) !important; }
.tpl-rating span { color: var(--on-burg-mute) !important; }
/* No size/weight of its own: the site-wide h2 rule above already defines the
   heading look (30px, weight 400) that every other page uses, and this must
   match them. Only the bottom margin differs, to sit closer to its subtitle. */
.tpl-lede h2 { margin: 0 0 14px; }
.tpl-lede p {
	font-size: clamp(16px, 1.5vw, 19px);
	line-height: 1.5;
	color: var(--on-burg-mute);
	max-width: 860px;
	margin: 0 auto 18px;
}
.tpl-stars { display: flex; justify-content: center; gap: 4px; margin-bottom: 8px; }
.tpl-stars img { width: 20px; height: 20px; }
/* `.tpl-lede p` is more specific than `.tpl-rating` (class+type beats class),
   so its `margin: 0 auto 18px` was winning here and adding 18px under the
   rating on top of the band's padding. Scoped to match. */
/* `margin: 0 auto`, not `margin: 0`: this inherits max-width 860px from
   `.tpl-lede p`, so without the auto sides the block sits left of centre
   inside the 1180px band and the centred text goes with it. */
.tpl-lede .tpl-rating { font-size: 15px; font-weight: 700; margin: 0 auto; }
.tpl-rating span { display: block; font-weight: 400; color: var(--muted); font-size: 14px; }

/* ---- 2. priced tiers ---- */
.tpl h3 {
	font-size: clamp(20px, 2.4vw, 26px);
	font-weight: 700;
	color: var(--ink);
	margin: 46px 0 20px;
}
.tpl-tiers { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.tpl-tier {
	position: relative;
	background: #FFFFFF;
	border: 1px solid var(--line);
	border-radius: var(--radius);
	padding: 28px 26px 24px;
	display: flex; flex-direction: column;
	overflow: hidden;
}
/* the recommended tier is marked with the gold, matching the ribbon */
.tpl-tier.is-featured { border: 2px solid var(--gold); }
.tpl-tier > img { width: 30px; height: 30px; margin-bottom: 18px; }
.tpl-tier h4 { font-size: 21px; font-weight: 700; color: var(--ink); margin: 0 0 6px; }
.tpl-tier.is-featured h4 { color: var(--gold-d); }
.tpl-tier .sub { font-size: 16px; font-weight: 700; color: var(--ink); margin: 0 0 18px; }
.tpl-tier .who { font-size: 15px; font-weight: 700; color: var(--ink); margin: 0 0 10px; }
.tpl-tier li, .tpl-tier p.plain {
	font-size: 15px; line-height: 1.5; color: var(--muted); margin: 0 0 10px;
}
.tpl-tier ul { list-style: none; margin: 0; padding: 0; }
.tpl-tier li { display: flex; gap: 10px; align-items: flex-start; }
.tpl-tier li img { width: 15px; height: 15px; flex: 0 0 auto; margin-top: 3px; }
/* "Most Popular" corner ribbon.
   Built as a clipped square holding a rotated band, rather than one rotated
   element hung off the corner. The single-element version put the label hard
   against the clip line and let the card's 2px gold border cut across it; here
   the band is centred inside its own box and the ends are trimmed cleanly. */
.tpl-ribbon {
	position: absolute; top: 0; right: 0;
	width: 128px; height: 128px;
	overflow: hidden;
	pointer-events: none;
}
.tpl-ribbon span {
	/* Geometry, so this is adjustable rather than guessed. For a band rotated
	   45deg inside a BxB corner box, the label only centres if the band's own
	   centre sits on the perpendicular from the corner -- i.e. cx + cy = B.
	   The first attempt summed to 107 against a 128 box, which offset the band
	   ~14px ALONG its own axis and left the text high with a long empty tail.
	   Here: cy 44 + cx 84 = 128. The chord across the corner is 2*cy*sqrt(2)
	   = 124px, so a 150px band overhangs 13px at each end and its cut ends are
	   hidden by the box. */
	position: absolute; left: 9px; top: 30px;
	width: 150px; padding: 7px 0;
	background: var(--accent);
	color: var(--gold-lt);
	font-size: 12.5px; font-weight: 700; letter-spacing: .05em;
	text-align: center;
	transform: rotate(45deg);
	box-shadow: 0 1px 3px rgba(37,40,42,.25);
}

.tpl-buy {
	margin-top: auto; padding-top: 20px;
	display: flex; align-items: center; justify-content: space-between; gap: 16px;
}
.tpl-price { font-size: 34px; font-weight: 700; color: var(--ink); }
.tpl-price sub { font-size: 14px; font-weight: 400; color: var(--muted); vertical-align: baseline; }
.tpl-cta {
	background: var(--accent); color: var(--gold-lt) !important;
	font-weight: 700; font-size: 15px;
	padding: 12px 22px; border-radius: var(--radius);
	white-space: nowrap; text-decoration: none !important;
	min-height: 44px; display: inline-flex; align-items: center;
}
.tpl-cta:hover { background: var(--accent-d); color: var(--gold-hi) !important; }
.tpl-payopt {
	display: flex; align-items: center; justify-content: center;
	gap: 8px; margin: 20px 0 0; font-size: 15px;
}
.tpl-payopt img { width: 18px; height: 18px; }

/* ---- 3. samples ---- */
.tpl-samples {
	margin: 46px 0 0;
	background: var(--surface);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	padding: 22px 24px;
	display: flex; flex-wrap: wrap; align-items: center;
	justify-content: space-between; gap: 16px;
}
.tpl-samples .ask strong { display: block; font-size: 18px; color: var(--ink); }
.tpl-samples .ask span { font-size: 15px; color: var(--muted); }
.tpl-samples nav { display: flex; flex-wrap: wrap; gap: 10px; }
/* Ink rather than burgundy. These are secondary actions -- look before you buy
   -- sitting a few lines under the two burgundy Buy Now buttons; in burgundy
   they competed with the primary action. Ink also lifts them from 8.07 to
   13.59 on --surface. */
.tpl-samples nav a {
	border: 1px solid var(--ink);
	color: var(--ink);
	padding: 10px 16px; border-radius: var(--radius);
	font-size: 15px; font-weight: 700; text-decoration: none;
	min-height: 44px; display: inline-flex; align-items: center;
}
.tpl-samples nav a:hover { background: var(--ink); color: var(--gold-lt); text-decoration: none; }
.tpl-reseller { font-size: 15px; color: var(--muted); margin: 16px 0 0; text-align: center; }

/* ---- 4. feature grid ---- */
.tpl-feature {
	display: flex; gap: 44px; align-items: center;
	margin: 46px 0;
}
.tpl-feature > figure {
	flex: 0 0 350px; max-width: 350px;
	position: relative; margin: 0;
	border-radius: 10px; overflow: hidden;
	aspect-ratio: 7 / 5;
}
.tpl-feature figure img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tpl-feature figcaption {
	position: absolute; inset: 0;
	/* the label has to hold on any part of the photo, hence the wash */
	background: rgba(37,40,42,.46);
	color: #FFFFFF; font-size: 20px; font-weight: 700; line-height: 1.2;
	display: flex; align-items: center; justify-content: center; text-align: center;
}
.tpl-grid { flex: 1 1 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 26px 34px; }
.tpl-item img.ico { width: 20px; height: 20px; display: block; margin-bottom: 8px; }
.tpl-item h4 { font-size: 16px; font-weight: 700; color: var(--ink); margin: 0 0 6px; }
.tpl-item p { font-size: 15px; line-height: 1.5; color: var(--muted); margin: 0; }
.tpl-item .tpl-stars { justify-content: flex-start; margin: 4px 0 6px; }
.tpl-item .tpl-stars img { width: 16px; height: 16px; }

/* ---- 5. testimonials ---- */
.tpl-quotes { margin: 54px 0 40px; }
.tpl-quotes header { text-align: center; margin-bottom: 26px; }
.tpl-quotes header h3 { margin: 0 0 4px; }
.tpl-quotes header p { font-size: 16px; color: var(--muted); margin: 0; }
.tpl-cards { columns: 2; column-gap: 24px; }
.tpl-card {
	/* Burgundy, not charcoal. The policy-list band immediately below these cards
	   is --dark; charcoal cards sat directly above it in the same colour,
	   separated only by a thin white gap, so the two read as one interrupted
	   dark mass. Burgundy gives the page burgundy -> white -> charcoal.
	   The text roles are the --on-burg set built for the footer: --on-dark-mute
	   would fail here at 3.34. */
	background: var(--accent-d);
	color: var(--on-burg);
	border-radius: var(--radius);
	padding: 24px 26px;
	margin: 0 0 24px;
	break-inside: avoid;
}
.tpl-card blockquote {
	margin: 0 0 20px; font-size: 16px; line-height: 1.55; font-weight: 700;
}
.tpl-card blockquote img { width: 17px; height: 17px; display: block; margin-bottom: 10px; }
.tpl-card footer { display: flex; align-items: center; justify-content: space-between; gap: 14px; }
.tpl-who { display: flex; align-items: center; gap: 10px; }
.tpl-who img { width: 26px; height: 26px; flex: 0 0 auto; }
.tpl-who span { font-size: 14px; line-height: 1.35; color: var(--on-burg-mute); }
.tpl-who b { display: block; color: var(--on-burg); font-weight: 700; }
.tpl-card .tpl-stars { gap: 3px; }
.tpl-card .tpl-stars img { width: 15px; height: 15px; }

/* ============================================ home page: two questions ===
   index.html's service block. It used to restate services.html in ~200 words
   per column; then three question-headed columns; now two sections, because
   the offering splits cleanly in two and the second half is 22 engagements
   deep.

     Security Testing & Penetration Testing   "Are you secure?"     6 services
     Audits, Compliance & Risk Assessments    "Can you prove it?"  22 engagements

   The question is the SUBTITLE, not the heading. As a heading it carried no
   search terms, and "Are we secure?" read as Altius IT asking about itself --
   the whole site speaks in our voice, so "we" is us, not the reader.

   Linking differs between the sections on purpose, and the rule is colour:
   burgundy means clickable, wherever it sits.
     Section 1  category has no page  -> title plain, each service links
     Section 2  category IS the page  -> title links, engagements plain
   Four links to one URL taught the reader the list was decorative.

   See docs/superpowers/specs/2026-07-30-home-page-three-questions-design.md */

/* ---- independence band ---- */
/* Burgundy, not --dark. The page already had a charcoal band lower down for
   Audit Resources, and two charcoal slabs doing different jobs -- one makes an
   argument, one lists links -- read as two of the same thing. Burgundy
   separates them and bookends the page against the footer, which is the same
   --accent-d. Large surface, so --accent-d rather than --accent.
   Text switches to the on-burgundy tokens: heading and label 6.78, body 7.19
   (better than the 5.62 it had on charcoal), links 9.19. */
.indep { background: var(--accent-d); }
.indep-in {
	max-width: var(--wrap); margin: 0 auto; padding: 34px 18px;
	display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 30px; text-align: left;
}
/* Left, matching every other heading on the page. Both section h2s below start
   at the same x as this one, so left-aligning puts all three on one vertical
   line; centred, this was the page's only centred heading. That it covers all
   three columns is already said by its spanning the full width. */
.indep-in h2 {
	grid-column: 1 / -1; margin: 0; font-size: 21px; font-weight: 700;
	color: var(--gold-lt);
}
.indep-item b { display: block; font-size: 16px; color: var(--gold-lt); margin-bottom: 6px; }
.indep-item span { font-size: 15px; line-height: 1.55; color: var(--on-burg-mute); }
/* the site link colour is --accent, which is the ground here. Links take the
   on-burgundy token the footer already uses: 9.19:1. */
.indep-item a { color: var(--on-burg); text-decoration: underline; }
.indep-item a:hover { color: var(--gold-hi); }

/* ---- a question section ---- */
.qs { max-width: var(--wrap); margin: 0 auto; padding: 0 18px; text-align: left; }
.qs-head { padding: 40px 0 0; }
.qs-head h2 {
	font-size: clamp(22px, 3vw, 30px); font-weight: 400; color: var(--ink); margin: 0 0 6px;
}
/* Capped measure. Uncapped these run the full 1144px of the wrap: the second
   subtitle's first line was 1133px, roughly 155 characters, well past the
   45-75 that reads comfortably. 760px brings it to ~100. The first subtitle is
   only 555px wide, so the cap never touches it. Not centred and not
   auto-margined -- the left edge stays on the page's 148px spine. */
.qs-head p { font-size: 16px; line-height: 1.5; color: var(--muted); margin: 0; max-width: 760px; }

.q3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 22px; margin: 22px 0 0; }
.q3-item {
	background: #FFFFFF;
	border: 1px solid var(--line);
	border-top: 3px solid var(--gold);
	border-radius: var(--radius);
	padding: 22px 20px;
	display: flex; flex-direction: column;
}
/* icon beside the title, as .svc-head does on services.html */
.q3-head { display: flex; align-items: center; gap: 16px; margin-bottom: 14px; }
.q3-head img { flex: 0 0 auto; }
.q3-item h3 { font-size: 19px; line-height: 1.3; font-weight: 700; color: var(--ink); margin: 0; }
/* Burgundy where the head IS a link -- it is the only thing to click at the top
   of those cards. Deliberately unlike .svc-head, where ten 23px titles in link
   colour would out-shout the page. */
a.q3-head { text-decoration: none; }
a.q3-head h3 { color: var(--accent); }
a.q3-head:hover h3 { color: var(--gold-d); text-decoration: underline; }

.q3-item ul { list-style: none; margin: 0; padding: 0; flex: 1 1 auto; }
.q3-item li { font-size: 15px; line-height: 1.45; padding: 7px 0; border-top: 1px solid var(--line); }
/* 4px of vertical padding takes these from a 17px hit target to 25px, clearing
   the 24x24 WCAG 2.2 AA minimum. They are list items, so the "inline in a
   sentence" exemption does not apply to them. Padding on an inline element
   grows the hit area without moving anything; there is no background or border
   to show it. */
.q3-item li a { font-weight: 700; padding: 4px 0; }
.q3-item li.plain { color: var(--ink); font-weight: 700; }
/* a service with no page yet: muted and upright, not italic -- italic reads as
   a formatting error, muted reads as "listed, not yet linked" */
.q3-soon { color: var(--muted); }
.q3-note { display: block; font-size: 13px; font-weight: 400; color: var(--muted); }
.q3-rest { font-size: 13px; line-height: 1.5; color: var(--muted); padding: 10px 0 0; margin: 0; }
.q3-more { display: block; margin-top: 14px; padding: 3px 0; font-size: 15px; font-weight: 700; }
.q3-more::after { content: "\00A0\203A"; font-size: 19px; line-height: 1; }

/* A note that belongs to the three cards rather than to the heading. It was
   the second half of the section subtitle, which made that subtitle 155
   characters wide; here it sits next to the evidence -- HIPAA is visible in
   all three cards directly above. Same left edge as everything else. */
.qs-note {
	font-size: 15px;
	line-height: 1.55;
	color: var(--muted);
	max-width: 760px;
	margin: 18px 0 0;
}

/* ==================================================== services listing ===
   Two columns, ported from the 2024 redesign of services.htm. The FrontPage
   original was a 9-row table -- icon in a 10% cell, copy in a 70% cell -- one
   tall column of nine paragraphs with no headings to scan.

   Note this does NOT shorten the page: measured at 1440px the listing goes
   1273px -> 1352px, about 6% taller. Halving the column width roughly doubles
   each description's line count, and each card now also carries a title line
   and a "Learn More". The gain is scannability -- nine linked titles you can
   compare side by side instead of nine undifferentiated paragraphs -- not
   compactness. Worth knowing before anyone "fixes" the height.

   The reference used Inter, a navy title and a blue "Learn More". None of that
   is carried over: the typeface, sizes and colours below are the ones these
   titles already had, per the brief to keep the current icons and fonts. What
   IS carried over is the structure -- icon and title as a single link, then the
   description, then a "Learn More" at the foot of the card.

   Scoped under .svc so nothing here reaches the other 74 pages. */

.svc {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 38px 46px;
	max-width: var(--wrap);
	/* The heading block above runs on a 28px rhythm (h1 -> rule -> intro line).
	   Matching it here made the intro read as a fourth line of that stack
	   rather than the sentence that closes it, so the listing takes a wider
	   gap to start a unit of its own. Scales down on narrow screens, where
	   46px of dead space is a large share of the viewport. */
	margin: clamp(32px, 3.5vw, 46px) auto 0;
	/* the FrontPage wrapper is <div align="center">, which the cards inherit */
	text-align: left;
}
.svc-item { display: flex; flex-direction: column; }

/* Icon and title are ONE link, as in the reference. Previously the icon was a
   link and the title was not -- the title sat as plain text with a separate
   link buried mid-paragraph, so the most obvious thing to click was the only
   thing that wasn't clickable. */
.svc-head {
	display: flex;
	align-items: center;
	gap: 18px;
	margin-bottom: 14px;
	text-decoration: none;
	/* not --accent: a 23px heading in link-burgundy reads as a warning, and
	   nine of them stacked would carry more colour than the whole page */
	color: var(--ink);
}
.svc-head img { flex: 0 0 auto; }
.svc-head h3 {
	/* exactly what font[size="5"] resolves to above, which is what these
	   titles rendered at before. Weight stays 400 for the same reason. */
	font-size: clamp(19px, 2.2vw, 23px);
	line-height: 1.3;
	font-weight: 400;
	margin: 0;
}
/* a.svc-head, not .svc-head: the Ransomware card has no page yet, so its head
   is a plain <div> and must not offer hover feedback it cannot honour */
a.svc-head:hover h3 { color: var(--accent); text-decoration: underline; }

.svc-item p {
	font-size: 16px;
	line-height: 1.6;
	color: var(--muted);
	/* grows to fill the card, so every "Learn More" in a row lands on the same
	   baseline however uneven the descriptions are */
	flex: 1 1 auto;
	margin: 0 0 14px;
}
.svc-more {
	align-self: flex-start;
	font-size: 16px;
	font-weight: 700;
	color: var(--accent);
}
/* a chevron rather than an arrow image: the reference loaded an SVG and
   rotated it 90deg, which is a request and a filter for one glyph */
.svc-more::after { content: "\00A0\203A"; font-size: 19px; line-height: 1; }
.svc-more:hover { color: var(--gold-d); }

/* ================================================== responsive: tablet === */

@media (max-width: 900px) {
	/* the 350px photo plus a 2-up grid stops fitting here */
	.tpl-feature { flex-direction: column; align-items: stretch; gap: 22px; }
	.tpl-feature > figure { flex: 1 1 auto; max-width: none; }
	.tpl-grid { grid-template-columns: 1fr 1fr; gap: 22px 26px; }
	.site-nav { gap: 16px; }
	.site-nav a { font-size: 13px; }
	.site-footer .wrap { grid-template-columns: 1fr 1fr; }
}

/* ================================================== responsive: phone === */

@media (max-width: 768px) {
	/* one column; the icon+title link stays intact, unlike the table icons
	   elsewhere on the site which are hidden at this width */
	.svc { grid-template-columns: 1fr; gap: 30px; }
	.q3 { grid-template-columns: 1fr; gap: 16px; }
	/* The band is three columns of 98px at 390px without this -- two or three
	   words per line. Missed when the block was ported from the mockup, where
	   .q3 and .indep-in shared one rule. */
	.indep-in { grid-template-columns: 1fr; gap: 22px; }
	.tpl { padding: 0 14px; }
	.tpl-tiers { grid-template-columns: 1fr; gap: 18px; }
	.tpl-grid { grid-template-columns: 1fr; }
	.tpl-cards { columns: 1; }
	.tpl-samples { flex-direction: column; align-items: flex-start; }
	.tpl-samples nav { width: 100%; }
	.tpl-samples nav a { flex: 1 1 auto; justify-content: center; }
	.tpl-buy { flex-direction: column; align-items: flex-start; gap: 12px; }
	.tpl-cta { width: 100%; justify-content: center; }
	/* smaller corner box on a narrow card, so the band does not cut across
	   the tier name underneath it */
	/* same geometry at a smaller box: cy 36 + cx 70 = 106, chord 102 */
	.tpl-ribbon { width: 106px; height: 106px; }
	.tpl-ribbon span { left: 7px; top: 22px; width: 126px; font-size: 11px; padding: 6px 0; }


	/* --- nav becomes a hamburger drawer --- */
	.nav-burger { display: flex; }
	.site-header .wrap { padding: 8px 14px; gap: 10px; flex-wrap: wrap; }
	.site-header .brand img { height: 38px; }

	.btn-quote { margin-left: auto; font-size: 13px; padding: 9px 13px; order: 2; }
	.nav-burger { order: 3; margin-left: 4px; }

	.site-nav {
		order: 4;
		display: none;
		width: 100%;
		flex-direction: column;
		align-items: stretch;
		gap: 0;
		margin: 8px 0 0;
		border-top: 1px solid var(--line);
	}
	.nav-toggle:checked ~ .site-nav { display: flex; }
	.site-nav a {
		padding: 14px 4px;
		border-bottom: 1px solid var(--line);
		font-size: 15px;
		min-height: 44px;
		display: flex;
		align-items: center;
	}
	.nav-toggle:checked ~ .nav-burger span:nth-child(1) { transform: translateY(8px) rotate(45deg); }
	.nav-toggle:checked ~ .nav-burger span:nth-child(2) { opacity: 0; }
	.nav-toggle:checked ~ .nav-burger span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }

	/* --- layout tables stop being layout --- */
	table, tbody, tr, td, th {
		display: block !important;
		width: auto !important;
		height: auto !important;
		max-width: 100% !important;
	}
	td { padding: 0 !important; }
	td[bgcolor="#F2F2F2"], td[bgcolor="#929fad"] { padding: 24px 16px !important; }

	/* Give the re-cropped heroes enough height on a phone to actually show the
	   person. Without this the band is only as tall as its headline, and on a
	   short-headline page like media.html the photograph is almost entirely
	   hidden behind the text panels. Cells are display:block here, so
	   min-height applies normally and still grows for longer headlines. */
td.manstandingphoto, td.mantabletphoto, td.manphonephoto,
td.thumbupphoto, td.recliningphoto, td.freedomphoto,
td.aboutusphoto, td.mediaphoto { min-height: 56vw; }

	/* Hero copy goes full width on a phone. There is no room to dodge the
	   subject at 390px, so the left/right offset used on desktop is reset --
	   including for the two heroes whose subject is on the left. */
.freedomphoto p, .recliningphoto p, .thumbupphoto p,
.mantabletphoto p, .manphonephoto p, .manstandingphoto p,
.aboutusphoto p, .mediaphoto p,
.manstandingphoto h1, .mantabletphoto h1, .recliningphoto h1 {
		width: auto;
		max-width: none;
		margin-left: 4%;
		margin-right: 4%;
		padding: 12px 14px;
	}

	/* Decorative icons sit in their own table row, so once rows become blocks
	   every icon separates from the copy it belongs to and they pile up at the
	   top of the section. They carry no information the headings don't, so
	   they are hidden on phones rather than shown out of context.

	   The :not() guard is not optional. Without it this matches any cell that
	   merely CONTAINS an icon, including one where the icon is inline with the
	   copy -- and then display:none takes the copy with it. That is exactly
	   what happened to the old case-studies fragment: a single cell held the
	   icon and all seven studies, and the whole page went blank. The guard
	   states what the rule always meant, which is to hide the cell only when
	   the icon is the only thing in it. */
	td:has(> img[src*="images/icon"]):not(:has(> :not(img):not(a):not(br))),
	td:has(> a > img[src*="images/icon"]):not(:has(> :not(img):not(a):not(br))) {
		display: none !important;
	}

	/* stacked cards need air between them */
	td[width="33%"] { margin-bottom: 14px; }

	/* tap targets */
	.btn-quote { min-height: 44px; display: flex; align-items: center; font-size: 13px; }
	.callbar a, .site-nav a { min-height: 48px; }

	/* --- sticky call bar --- */
	/* The Call half is --accent, which is now also the footer's ground. With
	   the footer scrolled behind it the button would vanish, so the bar takes
	   a gold top rule to hold its own edge. */
	.callbar {
		border-top: 2px solid var(--gold-lt);
		display: flex;
		position: fixed;
		left: 0; right: 0; bottom: 0;
		z-index: 200;
		box-shadow: 0 -2px 10px rgba(0,0,0,.22);
	}
	.callbar a {
		flex: 1;
		text-align: center;
		padding: 13px 6px;
		font-size: 14px;
		font-weight: 700;
		/* one gold across both halves -- they sit side by side, so using
		   465 C on the dark half and a lighter gold on the burgundy would
		   read as a mistake. #D6BC8A clears AA on both (4.79 / 8.07);
		   true 465 C only reaches 3.21 on the burgundy. */
		color: var(--gold-lt) !important;
		text-decoration: none;
		min-height: 48px;
		display: flex;
		align-items: center;
		justify-content: center;
		gap: 7px;
	}
	.callbar .call  { background: var(--accent); }
	.callbar .email { background: var(--dark); }
	.callbar a:hover { text-decoration: none; color: var(--gold-hi) !important; }

	body { padding-bottom: 48px; }   /* clear the fixed bar */

	/* keep the cookie notice clear of the sticky call bar */
	.cookie-banner { bottom: 48px; }

	.site-footer .wrap { grid-template-columns: 1fr; gap: 24px; padding: 28px 16px 20px; }
	.site-footer .legal { padding: 14px 16px 20px; }
}

@media (max-width: 480px) {
	body { font-size: 15px; }
	.site-header .brand img { height: 34px; }
	.btn-quote { font-size: 13px; padding: 8px 12px; min-height: 44px; }
	td[bgcolor="#F2F2F2"], td[bgcolor="#929fad"] { padding: 20px 13px !important; }
}

/* ---------------------------------------------------------- utilities --- */

@media print {
	.site-header, .site-footer, .callbar { display: none; }
}

/* The one Current Happenings item on media.html with no PDF behind it. The
   other thirteen titles are links and therefore burgundy; without this the
   odd one out reads as body copy and the group looks like it has a hole in
   it. Same token as the links so they match exactly. */
.news-title { color: var(--accent); }

/* ---------------------------------------------- media.html video grid ---
   Keeps the shape the page used for its four self-hosted clips: a small still
   on the left, the title beside it. Two columns of five rather than one of
   ten, so the section stays about the height the four rows used to be.

   Column-major, so the ten read newest-first down the left column and then
   down the right. `grid-auto-flow: column` with five explicit rows does that;
   the default row flow would number them across the page instead.

   Thumbnails are hotlinked from i.ytimg.com rather than copied into images/,
   so a re-uploaded or re-thumbnailed video updates itself instead of going
   stale. mqdefault, not hqdefault: hqdefault is 480x360, a 4:3 frame with the
   16:9 still letterboxed inside it, so it had to be cropped to fit and the
   crop ate the top and bottom of every thumbnail -- which matters here because
   these stills carry burnt-in text. mqdefault is 320x180, exactly 16:9, and
   was present for all ten. At a 128px box that is still 2.5x, so it is sharp
   on a retina screen. object-fit stays as a guard if a future still is not
   16:9. */
.vids {
	display: grid;
	grid-template-columns: 1fr 1fr;
	grid-template-rows: repeat(5, auto);
	grid-auto-flow: column;
	gap: 20px 40px;
	max-width: var(--wrap);
	margin: 0 auto;
	text-align: left;
}
.vid {
	display: flex;
	align-items: flex-start;
	gap: 14px;
	text-decoration: none;
}
/* content-box, and an explicit height rather than aspect-ratio. Under the
   site-wide border-box the 1px border came out of the picture, leaving a
   126x70 content area at ratio 1.800 against the still's 1.778, and
   object-fit: cover trimmed the difference off the top and bottom of every
   thumbnail. content-box puts the border outside the 128x72, which is exactly
   16:9, so there is nothing left to crop.
   No object-fit for the same reason: mqdefault is always 320x180, so the
   image fills an exactly-16:9 box with neither crop nor distortion. */
.vid-thumb {
	flex: 0 0 128px;
	position: relative;
	box-sizing: content-box;
	width: 128px;
	height: 72px;
	overflow: hidden;
	background: var(--ink);
	border: 1px solid var(--gray-700);
}
.vid-thumb img { width: 100%; height: 100%; display: block; }
/* The play badge is drawn, not an image file: one fewer request, and it scales
   without a second asset for retina. */
.vid-thumb::after {
	content: "";
	position: absolute;
	top: 50%; left: 50%;
	width: 0; height: 0;
	transform: translate(-38%, -50%);
	border-left: 14px solid rgba(255,255,255,.95);
	border-top: 9px solid transparent;
	border-bottom: 9px solid transparent;
	filter: drop-shadow(0 1px 3px rgba(0,0,0,.55));
}
.vid-body { display: block; }
.vid-title {
	display: block;
	font-size: 15px;
	line-height: 1.35;
	font-weight: 700;
	color: var(--ink);
}
.vid-date { display: block; font-size: 13px; color: var(--muted); margin-top: 3px; }
.vid:hover .vid-title { color: var(--accent); }
.vid:hover .vid-thumb { border-color: var(--accent); }
.vid-lede { text-align: center; margin: 0 auto 22px; }
.vid-more { text-align: center; margin: 26px 0 0; font-weight: 700; }

@media (max-width: 700px) {
	/* One column below this: two columns of 128px stills plus their titles
	   leaves the title about 60px wide, which wraps to five or six lines. */
	.vids { grid-template-columns: 1fr; grid-template-rows: none; grid-auto-flow: row; gap: 18px; }
	.vid-thumb { flex-basis: 112px; width: 112px; height: 63px; }   /* 112/63 is 16:9 exactly */
}

/* ------------------------------------------------ case studies ---
   Seven choices in a rail with the study beside them, which is how the page
   read before the rebuild. Radio inputs and labels, no JavaScript, so it
   survives scripts being off and the radio group gives arrow-key navigation.

   Sizing was raised across the board after the first pass measured too small
   to be a primary control: 14px labels beside 22px icons, and section labels
   at 15px against 16px body, which is not a hierarchy. The reading column was
   the worse problem at about 114 characters a line, roughly double what is
   comfortable.

   No side stripes. The selected item is marked by a filled ground and a
   weight change, and the section labels by scale, which is what those devices
   are for. */
.cs {
	display: grid;
	grid-template-columns: 268px minmax(0, 1fr);
	gap: 0 52px;
	max-width: var(--wrap);
	margin: 0 auto;
	text-align: left;
}
/* Off-screen rather than display:none, which would drop them out of the focus
   order and put the tabs beyond reach of a keyboard. */
.cs-radio { position: absolute; opacity: 0; width: 1px; height: 1px; }

.cs-tabs { display: flex; flex-direction: column; gap: 2px; }
.cs-tabs label {
	display: flex;
	align-items: center;
	gap: 13px;
	padding: 13px 15px;
	font-size: 16px;
	font-weight: 600;
	line-height: 1.3;
	color: var(--muted);
	cursor: pointer;
	border-radius: 7px;
	transition: background-color .18s cubic-bezier(.22,1,.36,1), color .18s cubic-bezier(.22,1,.36,1);
}
.cs-tabs label:hover { background: rgba(37,40,42,.055); color: var(--ink); }
/* The site-wide rule forces every images/icon to 64px !important, which suits
   a section icon and is far too large in a list. */
.cs-tabs img { width: 30px !important; height: 30px !important; }
.cs-head img { width: 52px !important; height: 52px !important; }

.cs-panel { display: none; }
.cs-head { display: flex; align-items: center; gap: 18px; margin-bottom: 26px; }
.cs-head img { flex: 0 0 52px; }
.cs-kicker {
	display: block;
	font-size: 12px;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--gold-d);
	margin-bottom: 3px;
}
.cs-head h3 { font-size: clamp(24px, 3vw, 32px); line-height: 1.15; margin: 0; }
/* 20px against 16px body is the 1.25 step the flat 15px never had. Separation
   comes from the space above, which is why it is much larger than the space
   below. */
.cs h4 {
	font-size: 20px;
	font-weight: 700;
	line-height: 1.3;
	color: var(--ink);
	margin: 32px 0 9px;
}
.cs-panel > .cs-head + h4 { margin-top: 0; }
/* Capped at a readable measure. The panel is 910px at 1280px wide, which put
   the copy at about 114 characters a line. */
.cs-body { max-width: 68ch; }
.cs-body p { margin: 0 0 12px; line-height: 1.65; }
.cs-body ul { margin: 10px 0 12px; padding-left: 24px; }
.cs-body li { margin-bottom: 6px; line-height: 1.6; }

#cs1:checked ~ .cs-tabs label[for="cs1"],
#cs2:checked ~ .cs-tabs label[for="cs2"],
#cs3:checked ~ .cs-tabs label[for="cs3"],
#cs4:checked ~ .cs-tabs label[for="cs4"],
#cs5:checked ~ .cs-tabs label[for="cs5"],
#cs6:checked ~ .cs-tabs label[for="cs6"],
#cs7:checked ~ .cs-tabs label[for="cs7"] {
	background: rgba(138,36,52,.085);
	color: var(--accent);
	font-weight: 700;
}
#cs1:checked ~ .cs-panels .cs-panel:nth-child(1),
#cs2:checked ~ .cs-panels .cs-panel:nth-child(2),
#cs3:checked ~ .cs-panels .cs-panel:nth-child(3),
#cs4:checked ~ .cs-panels .cs-panel:nth-child(4),
#cs5:checked ~ .cs-panels .cs-panel:nth-child(5),
#cs6:checked ~ .cs-panels .cs-panel:nth-child(6),
#cs7:checked ~ .cs-panels .cs-panel:nth-child(7) {
	display: block;
}
.cs-radio:focus-visible ~ .cs-tabs label { outline: 2px solid var(--accent); outline-offset: 2px; }

@media (prefers-reduced-motion: reduce) {
	.cs-tabs label { transition: none; }
}

@media (max-width: 860px) {
	/* One column. A 268px rail here would leave the study too narrow to read,
	   so the list stacks above it, still vertical, still full width. */
	.cs { grid-template-columns: 1fr; gap: 0; }
	.cs-tabs {
		gap: 0;
		border: 1px solid var(--gray-700);
		border-radius: 8px;
		overflow: hidden;
		margin-bottom: 26px;
	}
	.cs-tabs label {
		border-radius: 0;
		min-height: 48px;
		padding: 12px 14px;
	}
	.cs-tabs label + label { box-shadow: inset 0 1px 0 var(--gray-700); }
	/* The 68ch cap stays. Dropping it here put the measure at 84 characters
	   right at the 860px boundary, where the panel is full width but still
	   wide. Below that the container is narrower than the cap anyway. */
}

/* ------------------------------------------------ FAQ accordion ---
   Thirteen questions ran as one column of italic <i>Q:</i> lines at body size
   and body weight, so nothing separated a question from the answer above it
   and the section read as a single slab. Finding one answer meant reading
   past all of them.

   <details> and <summary> rather than a scripted accordion: native keyboard
   handling, correct screen-reader semantics, findable by in-page search in
   current browsers, and it degrades to plain visible text if the CSS never
   arrives.

   Hairlines, not cards. Thirteen bordered boxes would be thirteen times the
   visual weight for the same information. */
.faq { max-width: 68ch; }
.faq-item { border-top: 1px solid var(--gray-700); }
.faq-item:last-child { border-bottom: 1px solid var(--gray-700); }
.faq summary {
	position: relative;
	list-style: none;
	cursor: pointer;
	padding: 17px 44px 17px 0;
	font-size: 17px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--ink);
	transition: color .18s cubic-bezier(.22,1,.36,1);
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary:hover { color: var(--accent); }
/* The marker is drawn, so there is no second asset and it scales with the
   text. Rotating a transform rather than animating a layout property. */
.faq summary::after {
	content: "";
	position: absolute;
	right: 8px;
	top: 50%;
	width: 9px;
	height: 9px;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: translateY(-70%) rotate(45deg);
	transition: transform .2s cubic-bezier(.22,1,.36,1);
}
.faq-item[open] > summary { color: var(--accent); }
.faq-item[open] > summary::after { transform: translateY(-30%) rotate(225deg); }
.faq summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.faq-a { padding: 0 44px 20px 0; }
.faq-a p { margin: 0 0 11px; line-height: 1.65; }
.faq-a p:last-child { margin-bottom: 0; }

@media (prefers-reduced-motion: reduce) {
	.faq summary, .faq summary::after { transition: none; }
}

/* ------------------------------------------------ forms ---
   The quote form on request-a-quote.html and the short message form on
   contactus.html. Both post to /api/form, a Cloudflare Pages Function, as an
   ordinary form: no fetch, no JSON, no script, so they work with JavaScript
   off and the server answers with a redirect.

   Inputs inherit the site typeface explicitly. Browsers do not inherit font
   into form controls, and without this the fields render in the UA default
   while every label beside them is in the site stack. */
.frm { max-width: 640px; margin: 0 auto; text-align: left; }
.frm-note { font-size: 15px; color: var(--muted); margin: 0 0 22px; }
.frm-row { margin-bottom: 18px; }
.frm-two { display: grid; grid-template-columns: 1fr 1fr; gap: 0 18px; }
.frm label {
	display: block;
	font-size: 15px;
	font-weight: 600;
	color: var(--ink);
	margin-bottom: 6px;
}
.frm input, .frm select, .frm textarea {
	font: inherit;
	font-size: 16px;                 /* under 16px, iOS Safari zooms on focus */
	width: 100%;
	box-sizing: border-box;
	padding: 11px 13px;
	min-height: 46px;
	color: var(--ink);
	background: #FFFFFF;
	border: 1px solid #B9BDC1;       /* 3:1 against the panel, so the field edge
	                                    is a visible boundary, not a hint */
	border-radius: 5px;
}
.frm textarea { min-height: 118px; resize: vertical; line-height: 1.5; }
.frm input:focus, .frm select:focus, .frm textarea:focus {
	outline: 2px solid var(--accent);
	outline-offset: 1px;
	border-color: var(--accent);
}
.frm-send {
	font: inherit;
	font-size: 16px;
	font-weight: 700;
	padding: 13px 30px;
	min-height: 48px;
	color: var(--gold-lt);
	background: var(--accent);
	border: 0;
	border-radius: 4px;
	cursor: pointer;
	transition: background-color .18s cubic-bezier(.22,1,.36,1);
}
.frm-send:hover { background: var(--accent-d); color: var(--gold-hi); }
.frm-send:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.frm-alt { font-size: 15px; color: var(--muted); margin: 18px 0 0; }
/* The Turnstile widget renders in its own iframe at a fixed size, so this
   only has to place it. */
.frm-cap { margin: 20px 0 18px; }
/* Shown only when the option it explains is the one selected. The note
   applies to a single choice out of twelve, so carrying it permanently
   would be noise on every other request. :has() with option:checked does
   this without script; the site already depends on :has() in eleven other
   rules, so this needs no wider browser support than it already has. */
.frm-hint { display: none; font-size: 14px; line-height: 1.5; color: var(--muted);
	margin: 9px 0 0; padding-left: 13px; }
.frm:has(#q-service option[value="Administrative Safeguards Audit"]:checked) .frm-hint {
	display: block;
}
/* "Not sure which audit" is a checkbox rather than a thirteenth option in the
   list. Two reasons. It is not a service, so it did not belong among eleven
   service names. And an <option> cannot be styled at all in the native macOS
   popup, which draws its own list and discards the page's CSS, so burgundy and
   bold were correct in the stylesheet and invisible on screen. A checkbox and
   its label are ordinary elements and take styling everywhere. */
.frm-check {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 14px 0 0;
}
.frm-check input {
	width: 22px;
	height: 22px;
	min-height: 0;
	flex: 0 0 22px;
	margin: 0;
	padding: 0;
	accent-color: var(--accent);
}
/* Burgundy, at normal weight. Both together made it heavier than the field
   labels it sits under, which are 600, so the option out-ranked the question
   it answers. The colour alone separates it from the black labels around it,
   and normal weight keeps it reading as a choice rather than a heading. */
.frm-check label {
	margin: 0;
	font-size: 15px;
	font-weight: 400;
	color: var(--accent);
	cursor: pointer;
}
/* The honeypot. Off-screen rather than display:none or hidden, because some
   bots skip anything obviously hidden but will fill a field they can read. */
.frm-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

@media (max-width: 560px) {
	.frm-two { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
	.frm-send, .social a { transition: none; }
}

/* ------------------------------------------------ social links ---
   contactus.html. Four inline SVGs rather than four image files.

   The Facebook icon these replace was a 32px JPEG: it had the page's old
   background baked into its corners, it softened on any display over 1x, and
   JPEG is the wrong codec for a flat two-colour mark. A path has no
   resolution and no background, and inline it costs no extra request.

   Monochrome in the site charcoal, burgundy on hover, rather than each
   brand's own colour. Four saturated logos would out-shout the address they
   sit under, and the page already has exactly one accent.

   40px boxes around 22px glyphs. WCAG 2.5.8 asks for 24x24 and the glyph
   alone would only just clear it, so the padding is what makes the target. */
.social { display: flex; gap: 10px; margin: 6px 0 0; }
.social a {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	flex: 0 0 40px;
	border-radius: 6px;
	color: var(--ink);
	background: rgba(37, 40, 42, .055);
	transition: background-color .18s cubic-bezier(.22,1,.36,1), color .18s cubic-bezier(.22,1,.36,1);
}
.social a:hover { background: var(--accent); color: var(--gold-lt); text-decoration: none; }
.social a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* fill, not color: the paths carry no fill of their own, and currentColor is
   what lets one hover rule recolour all four. */
.social svg { width: 22px; height: 22px; fill: currentColor; display: block; }

/* ------------------------------------------------ cookie notice ---
   Ours, replacing cookieconsent@3, which was pulled from a jsDelivr CDN on
   index.html alone. Three things were wrong with that: it was on one page of
   75, it never touched Google Consent Mode so the tags fired whatever the
   visitor clicked, and it put a third-party CDN in the critical path of a
   site whose own argument is that you should audit your supply chain.

   Charcoal on the site's own palette rather than the library's blue-grey, and
   it sits above the call bar on a phone rather than over it. */
.cookie-banner {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 60;                      /* over the call bar, under nothing else */
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 14px 26px;
	padding: 16px 22px;
	background: var(--dark);
	border-top: 3px solid var(--accent);
	box-shadow: 0 -2px 18px rgba(37, 40, 42, .28);
	/* Slides up rather than appearing: an element that materialises over the
	   content reads as an error. translateY, not height, so it never reflows
	   the page underneath it. */
	transform: translateY(110%);
	transition: transform .42s cubic-bezier(.22, 1, .36, 1);
}
.cookie-banner--visible { transform: translateY(0); }
.cookie-banner-text {
	margin: 0;
	max-width: 74ch;
	font-size: 14px;
	line-height: 1.55;
	color: var(--on-dark-mute);
}
.cookie-banner-text a { color: var(--gold); text-decoration: underline; }
.cookie-banner-text a:hover { color: var(--gold-hi); }
.cookie-banner-btns { display: flex; gap: 10px; flex: 0 0 auto; }
.cookie-banner-btn {
	font: inherit;
	font-size: 15px;
	font-weight: 700;
	/* 44px, not the 24x24 floor of SC 2.5.8. Declining must be exactly as easy
	   as accepting, so the two buttons are the same size and weight; a smaller
	   or quieter Decline is a dark pattern and regulators have said so. */
	min-height: 44px;
	padding: 10px 22px;
	border-radius: 4px;
	cursor: pointer;
	transition: background-color .18s cubic-bezier(.22, 1, .36, 1);
}
.cookie-banner-btn.accept { color: var(--ink); background: var(--gold); border: 1px solid var(--gold); }
.cookie-banner-btn.accept:hover { background: var(--gold-hi); }
.cookie-banner-btn.reject { color: var(--on-dark); background: transparent; border: 1px solid var(--on-dark-mute); }
.cookie-banner-btn.reject:hover { background: rgba(216, 210, 200, .12); }
.cookie-banner-btn:focus-visible { outline: 2px solid var(--gold-hi); outline-offset: 2px; }

@media (max-width: 600px) {
	.cookie-banner { flex-direction: column; align-items: stretch; text-align: left; }
	.cookie-banner-btns { justify-content: stretch; }
	.cookie-banner-btn { flex: 1 1 0; }
}
@media (prefers-reduced-motion: reduce) {
	.cookie-banner { transition: none; }
}

/* ---------------------------------------- the opt-out control ---
   privacydonotsell.html. The page tells a California resident they can opt
   out "in this browser at any time", so this is a control, not a link, and it
   has to look like one. Burgundy like every other action on the site; the
   disabled state is what a visitor already opted out sees, including one
   arriving with Global Privacy Control set. */
.optout-btn {
	font: inherit;
	font-size: 16px;
	font-weight: 700;
	min-height: 48px;
	padding: 13px 26px;
	color: var(--gold-lt);
	background: var(--accent);
	border: 0;
	border-radius: 4px;
	cursor: pointer;
	transition: background-color .18s cubic-bezier(.22, 1, .36, 1);
}
.optout-btn:hover:not(:disabled) { background: var(--accent-d); color: var(--gold-hi); }
.optout-btn:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
/* Not greyed to illegibility: this state carries the answer to the question
   the visitor came to ask, so it stays readable. --muted is the site's own
   mid grey and white on it measures 8.5:1. */
.optout-btn:disabled { background: var(--muted); color: #FFFFFF; cursor: default; }
.optout-status:not(:empty) { font-size: 15px; line-height: 1.55; color: var(--accent); margin: 10px 0 1em; }

@media (prefers-reduced-motion: reduce) {
	.optout-btn { transition: none; }
}

/* ------------------------------------------------ blog categories ---
   blog.html. Four jump links into the sections below. They were a bullet
   list inside a centred <table>, which centred the table but left the text
   ragged inside it, so the block sat left of centre under a centred h1.

   As cards they gain the thing the list could not show: how much is in each
   section. Organization Manager has 17 posts and Security Governance has 6,
   and a reader deciding where to start should be able to see that.

   The icons are the ones each section already uses further down the page, so
   the card and its destination look like the same thing. */
.blogcat { max-width: var(--wrap); margin: 0 auto; padding: 0 18px 6px; }
.blogcat * { box-sizing: border-box; }
.blogcat h2 { text-align: center; margin: 0 0 22px; }
.blogcat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
.blogcat-item {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	padding: 22px 20px 18px;
	background: #FFFFFF;
	border: 1px solid var(--line);
	border-top: 3px solid var(--accent);
	text-decoration: none;
	transition: box-shadow .18s cubic-bezier(.22,1,.36,1), transform .18s cubic-bezier(.22,1,.36,1);
}
.blogcat-item:hover {
	text-decoration: none;
	box-shadow: 0 3px 16px rgba(37, 40, 42, .13);
	transform: translateY(-2px);
}
.blogcat-item:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* The site-wide icon rule forces every images/icon to 64px !important, which
   is too heavy at a quarter of the width. */
.blogcat-item img { width: 44px !important; height: 44px !important; margin: 0 0 14px; }
.blogcat-item b {
	font-size: 17px;
	line-height: 1.25;
	color: var(--accent);
	margin-bottom: 6px;
}
.blogcat-item:hover b { color: var(--gold-d); }
.blogcat-item span { font-size: 14px; line-height: 1.5; color: var(--muted); flex: 1 1 auto; }
/* Set apart from the description rather than styled as another line of it:
   it is a fact about the section, not part of its name. */
.blogcat-item em {
	font-style: normal;
	font-size: 13px;
	font-weight: 700;
	color: var(--ink);
	margin-top: 12px;
	padding-top: 10px;
	border-top: 1px solid var(--line);
	width: 100%;
}

@media (max-width: 900px) {
	.blogcat-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 520px) {
	.blogcat-grid { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
	.blogcat-item { transition: none; }
	.blogcat-item:hover { transform: none; }
}

/* ------------------------------------------------ blog listing ---
   blog.html. The 47 entries were separated by whatever markup happened to be
   there: <p></p> 26 times, but also a bare <br>, an unclosed <p>, and
   </p><p></p>. Measured in the browser the gap between consecutive posts took
   13 distinct values from 52px to 205px. Every entry is now the same block and
   this rule is the only thing that sets the space between them. */
.post { margin: 0 0 22px; line-height: 1.55; }
.post:last-child { margin-bottom: 0; }
.post > a { font-weight: 600; }
/* The tag line was <font size="1" color="#808080">, which is 3.63:1 on the
   panel: below the 4.5:1 that 12px text needs. --muted is the site's own grey
   and reaches 8.16:1, so the tags are now readable rather than decorative. */
.post-tags {
	display: block;
	margin-top: 5px;
	font-size: 12px;
	line-height: 1.45;
	color: var(--muted);
}
