/* Dark theme overlay.
   Loaded after style-codebase.css, which is a 50,000-line compiled light
   theme. Rather than fork that file, this repaints the ~25 components the
   site actually uses, so the 578 generated check pages inherit the theme
   with no markup change and the whole conversion reverts by removing one
   <link>. Token values match assets/css/alt-home.css so the homepage and
   the rest of the site are one world. */

:root {
  --d-ink:    #0b1017;
  --d-ink-2:  #121a24;
  --d-ink-3:  #1b2531;
  --d-rule:   rgba(226, 234, 245, 0.13);
  --d-rule-2: rgba(226, 234, 245, 0.07);
  --d-fg:     #e6edf6;
  --d-fg-2:   #aab6c6;
  --d-fg-3:   #7b8797;
  --d-crit:   #ff7a7a;
}

html { color-scheme: dark; }

body,
.nk-app-root,
.nk-pages,
.nk-body { background-color: var(--d-ink) !important; color: var(--d-fg); }

/* type ---------------------------------------------------------------- */
h1, h2, h3, h4, h5, h6,
.nk-section-title,
.text-blue-1400, .text-dark, .text-gray-900, .text-black { color: var(--d-fg) !important; }
p, li, .nk-section-text, .text-gray-800, .text-muted, .card-text,
.fs-16, .text-md { color: var(--d-fg-2) !important; }
/* The eyebrow, defined once. This was a filled pill with a border while the
   about page's was a plain mono label; the two are the same thing, so they
   share a rule. See .doc-eyebrow below, which points here. */
.nk-section-subtitle, .doc-eyebrow {
  display: block;
  margin: 0 0 .9rem !important;
  padding: 0 !important;
  background: none !important;
  border: 0 !important;
  border-radius: 0 !important;
  color: var(--d-fg-3) !important;
  font-family: "JetBrains Mono", ui-monospace, monospace !important;
  font-size: .75rem !important;
  font-weight: 400 !important;
  letter-spacing: .09em !important;
  text-transform: uppercase !important;
  line-height: 1.4;
}
a { color: var(--d-fg); }
a:hover { color: #fff; }

::selection { background: var(--d-fg); color: var(--d-ink); }
* { scrollbar-color: var(--d-ink-3) var(--d-ink); scrollbar-width: thin; caret-color: var(--d-crit); }
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-track { background: var(--d-ink); }
::-webkit-scrollbar-thumb { background: var(--d-ink-3); border-radius: var(--r-control); border: 3px solid var(--d-ink); }
:focus-visible { outline: 2px solid var(--d-fg); outline-offset: 3px; }

/* surfaces ------------------------------------------------------------ */
.card, .nk-card, .nk-feature-card, .accordion-item, .nk-entry-content pre, .nk-block {
  background-color: var(--d-ink-2) !important;
  /* The template sets some card backgrounds with the `background` shorthand
     and a light gradient (.nk-feature-card is a pink one). Overriding
     background-color cannot clear a background-image, however important it
     is, so the gradient survives and the light text lands on top of it.
     Every surface reset here has to null the image as well as the colour. */
  background-image: none !important;
  border: 1px solid var(--d-rule) !important;
  color: var(--d-fg-2);
}
.card-title, .card-title a { color: var(--d-fg) !important; }
.card:hover { border-color: var(--d-fg-3) !important; }
.bg-white, .bg-light, .bg-lighter {
  background-color: var(--d-ink-2) !important;
  background-image: none !important;
}
.bg-dark, .bg-darker, .text-bg-dark { background-color: var(--d-ink-2) !important; color: var(--d-fg) !important; }

/* the decorative light blurs read as smudges on a dark ground */
.nk-mask, .nk-shape, .nk-blur { display: none !important; }

/* badges: the template's `text-bg` matches no rule, so they inherited white */
.badge, .badge.text-bg {
  background-color: var(--d-ink-3) !important;
  color: var(--d-fg) !important;
  border: 1px solid var(--d-rule) !important;
  font-weight: 600;
}

/* controls ------------------------------------------------------------ */
.btn-primary, .btn-dark {
  background-color: var(--d-fg) !important; border-color: var(--d-fg) !important;
  color: var(--d-ink) !important;
}
.btn-primary:hover, .btn-dark:hover { background-color: #fff !important; color: var(--d-ink) !important; }
.btn-outline-primary, .btn-outline-secondary, .btn-outline-dark {
  background-color: transparent !important;
  border-color: var(--d-rule) !important;
  color: var(--d-fg) !important;
}
.btn-outline-primary:hover, .btn-outline-secondary:hover, .btn-outline-dark:hover {
  background-color: var(--d-ink-3) !important; color: var(--d-fg) !important; border-color: var(--d-fg-3) !important;
}

/* navigation ---------------------------------------------------------- */
.nk-header, .nk-header-main, .nk-navbar-main {
  background-color: color-mix(in srgb, var(--d-ink) 88%, transparent) !important;
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--d-rule-2);
}
.nk-nav-link, .nk-nav-text { color: var(--d-fg-2) !important; }
.nk-nav-link:hover .nk-nav-text, .nk-nav-item:hover .nk-nav-text { color: var(--d-fg) !important; }
.nk-nav-sub, .nk-nav-sub-list {
  background-color: var(--d-ink-2) !important;
  border: 1px solid var(--d-rule) !important;
}
.nk-nav-sub-text { color: var(--d-fg-2) !important; }
.nk-nav-sub-link:hover .nk-nav-sub-text { color: var(--d-fg) !important; }
/* The template sizes the logo block from the light image, so hiding it
   collapsed the whole header-logo chain to 0 height. Size explicitly. */
.nk-header-logo, .logo-link, .logo-wrap { height: auto !important; }
.logo-img { height: 34px !important; width: auto !important; max-width: none !important; }
/* The class names describe the INK, not the theme: measured mean ink
   luminance is 216 for .logo-light and 84 for .logo-dark, so the dark
   ground needs the light-ink file. */
/* The theme hides the unused variant with opacity + visibility, not
   display, so overriding display alone left it invisible. */
.logo-dark  { display: none !important; }
.logo-light {
  display: block !important;
  opacity: 1 !important;
  visibility: visible !important;
}

/* footer -------------------------------------------------------------- */
.nk-footer { background-color: var(--d-ink) !important; border-top: 1px solid var(--d-rule-2); }
.nk-footer a { color: var(--d-fg-2) !important; }
.nk-footer a:hover { color: var(--d-fg) !important; }

/* forms --------------------------------------------------------------- */
.form-control, .form-select, input, textarea, select {
  background-color: var(--d-ink-2) !important;
  border: 1px solid var(--d-rule) !important;
  color: var(--d-fg) !important;
}
.form-control::placeholder, input::placeholder, textarea::placeholder { color: var(--d-fg-3) !important; }
.form-label, .form-group label { color: var(--d-fg-2) !important; }

/* accordion / FAQ ----------------------------------------------------- */
.accordion-button {
  background-color: var(--d-ink-2) !important;
  color: var(--d-fg) !important;
  border: 0 !important; box-shadow: none !important;
}
.accordion-body { background-color: var(--d-ink-2) !important; color: var(--d-fg-2) !important; }
.accordion-button::after { filter: invert(1) brightness(1.6); }

/* rules and dividers -------------------------------------------------- */
hr, .border-top, .border-bottom, .nk-divider { border-color: var(--d-rule) !important; }

/* imagery authored for a light ground --------------------------------- */
.nk-brand img, .nk-frame img { filter: brightness(.92) contrast(1.04); }

/* the SVG figures inherit currentColor. Under this overlay that is the
   compiled theme's dark body text, which vanished on a blog post, so set it. */
.gk-figure { color: var(--d-fg); }
.gk-figure .gk-critical     { stroke: var(--d-crit); }
.gk-figure .gk-critical-fill { fill: var(--d-crit); opacity: .14; }
.gk-figure .gk-critical-text { fill: var(--d-crit); }
.gk-figure .gk-crit-glow, .gk-figure .gk-edge-crit { stroke: var(--d-crit); }
/* the arrowhead is a fill, not a stroke, and was the one severity mark
   left on the base red while everything around it moved to --d-crit. */
.gk-figure .gk-arrow-crit { fill: var(--d-crit); }
.gk-figure .gk-link-crit { stroke: var(--d-crit); }
.gk-figure .gk-scan-crit { fill: var(--d-crit); }

/* consent banner ------------------------------------------------------ */
.cookie-consent, .cookie-consent-banner, #cookie-consent {
  background: var(--d-ink-2) !important; color: var(--d-fg-2) !important;
  border-top: 1px solid var(--d-rule) !important;
}

/* ---- surfaces the first pass missed -------------------------------- */
/* Found by scanning every page type for computed backgrounds above 180
   luminance, rather than by spotting them one at a time. */

.list-group, .list-group-item, .list-group-numbered > li {
  background-color: var(--d-ink-3) !important;
  border-color: var(--d-rule) !important;
  color: var(--d-fg-2) !important;
}

.nk-testimonial-card, .nk-testimonial, .nk-quote {
  background-color: var(--d-ink-2) !important;
  border: 1px solid var(--d-rule) !important;
  color: var(--d-fg-2) !important;
}
.nk-testimonial-card *, .nk-quote * { color: inherit !important; }
.nk-testimonial-card h3, .nk-testimonial-card h4, .nk-testimonial-card h5 { color: var(--d-fg) !important; }

/* .btn-dark now has a light ground, so an inherited .text-white on it
   produced white-on-white. Text colour follows the button, not the class. */
.btn.text-white, .btn-dark.text-white, .btn-primary.text-white { color: var(--d-ink) !important; }

.swiper-button-prev, .swiper-button-next {
  background-color: var(--d-ink-3) !important;
  color: var(--d-fg) !important;
  border: 1px solid var(--d-rule) !important;
}
.swiper-pagination-bullet { background-color: var(--d-fg-3) !important; }
.swiper-pagination-bullet-active { background-color: var(--d-fg) !important; }

/* any section still carrying a pale ground from the compiled theme */
section.bg-white, section.bg-light, section.bg-lighter,
.nk-section.bg-white, .nk-section.bg-light { background-color: var(--d-ink-2) !important; }

/* tables and code, which appear on check and blog pages */
table, .table { color: var(--d-fg-2) !important; }
.table > :not(caption) > * > * { background-color: transparent !important; border-color: var(--d-rule) !important; }
code, kbd, pre, samp {
  background-color: var(--d-ink-3) !important; color: var(--d-fg) !important;
  border: 1px solid var(--d-rule) !important;
}
blockquote { border-color: var(--d-rule) !important; color: var(--d-fg-2) !important; }

/* ---- third pass: found by per-page contrast audit ------------------- */
/* .bg-gray is a pale ground the compiled theme applies to whole sections */
.bg-gray, .bg-gray-50, .bg-gray-100, .bg-grey {
  background-color: var(--d-ink-2) !important;
}
/* blog author names kept the theme's dark ink */
.lead-text, .fw-normal.lead-text, .media-text { color: var(--d-fg-2) !important; }
.media-text strong, .media-text b { color: var(--d-fg) !important; }
/* inline SVG labels default to black fill */
svg text { fill: currentColor; }
/* the contact form's character counter inherits an explicit black */
#char-count, #char-max, [id^="char-"] { color: var(--d-fg-3) !important; }
/* .text-light means "light grey ink for a light ground" in the compiled
   theme, so on this ground it needs inverting rather than passing through */
.text-light, .overline-title.text-light { color: var(--d-fg-3) !important; }

/* ---- fourth pass: decorative art painted by pseudo-elements --------- */
/* The inside-page banners paint a pale grid through ::before, which is
   invisible to a background-color audit and left white text on a white
   ground. These are decoration, not content, so they go rather than being
   recoloured. */
.nk-banner::before, .nk-banner::after,
.nk-banner-codebase::before, .nk-banner-codebase::after,
.nk-banner-wrap::before, .nk-banner-wrap::after,
[class*="nk-banner"]::before, [class*="nk-banner"]::after { display: none !important; }

/* the banner then needs its own breathing room back */
.nk-banner { padding-block: clamp(4rem, 8vw, 7rem) !important; }


/* ---- one typographic voice across the site -------------------------- */
/* The homepage was rebuilt in Archivo while every other page stayed on the
   template's face, so the site spoke in two voices. Unified here rather
   than in the compiled stylesheet. */
body, .nk-body, button, input, textarea, select,
h1, h2, h3, h4, h5, h6, p, li, a, dt, dd, blockquote, .btn {
  font-family: "Archivo", system-ui, -apple-system, sans-serif !important;
}
h1, h2, h3, .nk-section-title { letter-spacing: -0.03em; }

/* data is data: identifiers, counts and timestamps read as monospace,
   matching the homepage's treatment */
.badge, code, kbd, pre, samp, .colophon, time,
.nk-list-meta li, .check-meta, .fkey {
  font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace !important;
}

/* ---- readable measure on the long-form pages ----------------------- */
/* about and blog posts were running at 85 characters per line against a
   65-75 comfortable range; the homepage was already corrected. */
.nk-section-text,
.nk-section-content p,
.check-steps li,
main p:not(.card-text):not(.siteftr-note):not(.lede):not(.doc-body p):not(.doc-lede):not(.nk-entry p) {
  max-width: 50ch;
}
/* A blog post's text shares its column with full-width headings, the hero
   and the diagrams, so 50ch (65 a line) read as a narrow strip beside them.
   62ch is about 80 a line: wider, and still an easy return to the next. */
.nk-entry p, .nk-entry li { max-width: 62ch; }
.text-center .nk-section-text,
.nk-section-head.text-center p { margin-inline: auto; }

/* ---- check pages: the finding vocabulary from the homepage ---------- */
/* A check page IS a finding, so it uses the same grammar: a severity chip,
   a monospace identity line, labelled rows, then the fix. */
.check { padding-block: clamp(3rem, 6vw, 5rem); }
.check .container { width: min(760px, 100% - clamp(1.25rem, 4vw, 4rem) * 2); margin-inline: auto; }

.check-back {
  display: inline-block; color: var(--d-fg-3) !important; text-decoration: none;
  font-family: "JetBrains Mono", ui-monospace, monospace !important; font-size: .75rem;
  margin-bottom: 2.2rem;
}
.check-back::before { content: "\2190\00a0"; }
.check-back:hover { color: var(--d-fg) !important; }

.check-chips { display: flex; align-items: center; gap: .7rem; margin-bottom: .9rem; flex-wrap: wrap; }
.sev {
  font-family: "JetBrains Mono", ui-monospace, monospace !important;
  /* .75rem is the site's mono step: the eyebrow and .check-meta both sit on
     it. Severity is the primary scanning signal on a 577-card page, and it
     was the one mono element a size below everything else. */
  font-size: .75rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  padding: .2rem .5rem; border-radius: var(--r-chip);
  color: var(--d-fg-2); border: 1px solid var(--d-rule); background: var(--d-ink-3);
}
/* severity colour is spent only where it is earned */
.sev-critical, .sev-high {
  color: var(--d-crit); border-color: color-mix(in srgb, var(--d-crit) 45%, transparent);
  background: color-mix(in srgb, var(--d-crit) 11%, transparent);
}
.check-meta {
  font-family: "JetBrains Mono", ui-monospace, monospace !important;
  font-size: .75rem; color: var(--d-fg-3);
}
.check-title { font-size: var(--t-4) !important; line-height: 1.12; margin: 0 0 .9rem; }
.check-lede { color: var(--d-fg-2) !important; font-size: 1.0625rem; max-width: 48ch; }

.check-facts { margin: 2.4rem 0 0; border-top: 1px solid var(--d-rule); }
.check-facts .crow {
  display: grid; grid-template-columns: 8.5rem 1fr; gap: 1rem;
  padding: .68rem 0; border-bottom: 1px solid var(--d-rule-2);
}
.check-facts dt {
  font-family: "JetBrains Mono", ui-monospace, monospace !important;
  font-size: .75rem; color: var(--d-fg-3); font-weight: 400;
}
.check-facts dd { margin: 0; color: var(--d-fg) !important; font-size: .9375rem; }

/* The 84 service group headings carry Bootstrap's .h3 utility, which is
   33.6px — against this page's own 40.8px h1 that reads as a second title
   rather than a divider. Every other page sets a section heading at 24. */
/* `main .h3` maps the utility to --t-5, also with !important and the same
   weight, and it is declared later — so this has to outrank it, not tie. */
main .check-group > h2 { font-size: var(--t-6) !important; letter-spacing: -.02em; }

.check-fix { margin-top: 3rem; }
.check-fix h2 { font-size: var(--t-7) !important; margin-bottom: .8rem; }
.check-fix p { color: var(--d-fg-2) !important; max-width: 50ch; }
.check-steps { list-style: none; counter-reset: s; margin: 1.4rem 0 0; padding: 0; border-top: 1px solid var(--d-rule-2); }
.check-steps li {
  counter-increment: s; position: relative;
  padding: .78rem 0 .78rem 2.6rem; border-bottom: 1px solid var(--d-rule-2);
  color: var(--d-fg-2) !important; font-size: .9375rem; background: none !important; border-left: 0 !important;
}
.check-steps li::before {
  content: counter(s); position: absolute; left: 0; top: .78rem;
  font-family: "JetBrains Mono", ui-monospace, monospace; font-size: .75rem;
  color: var(--d-fg-3); width: 1.7rem; text-align: right;
}

.check-cta { margin-top: 3.2rem; padding-top: 2rem; border-top: 1px solid var(--d-rule); }
.check-cta p { color: var(--d-fg-2) !important; margin-bottom: 1rem; }

/* ---- preloader --------------------------------------------------------
   A full-screen overlay at z-index 99999 that the compiled theme paints
   #e9eafd, with three periwinkle rings. It sits above everything until the
   script removes it, so every page on this layout opened with a lavender
   flash before the dark page arrived behind it. The homepage never showed
   this: the alt layout carries no preloader markup. The rings keep their
   three-step depth, in the palette's neutral ramp rather than a hue,
   because this ground spends colour only on severity. */
.preloader      { background-color: var(--d-ink); }
.loader         { border-top-color: var(--d-fg); }
.loader::before { border-top-color: var(--d-fg-2); }
.loader::after  { border-top-color: var(--d-fg-3); }

/* ---- material: the ground stops being a flat fill ---------------------
   This language was built for the homepage and lived in alt-home.css,
   which only the alt layout loads. Everything else — 578 check pages,
   about, blog, contact, consulting — got a flat fill with no gradient, no
   grain and three shadows on the whole page, so the site's best surface
   treatment reached one page in about 590. Declared here it reaches the
   rest. Values are the homepage's, deliberately: two grounds that agree
   are the point. */
body {
  /* The template's base is 20px against the homepage's 17. Nothing visible
     showed it, because every element here is explicitly sized — but anything
     unstyled inherited the wrong base, and any em-relative value resolved
     against it. One base now. */
  font-size: 1.0625rem;
  background-image:
    radial-gradient(1100px 560px at 88% -12%, rgba(154,163,255,.030), transparent 60%),
    radial-gradient(900px 520px at 6% 106%,  rgba(94,207,192,.022), transparent 58%);
  background-attachment: fixed;
}
/* fine grain, so large dark areas have tooth instead of banding */
body::before {
  content: ""; position: fixed; inset: 0; z-index: 0; pointer-events: none;
  opacity: .022; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}
/* Content sits above the fixed grain layer. The masthead is deliberately
   absent: shell.css gives it position:sticky/z-index:40, and restating
   position here would un-stick it and drop it behind the page, which is
   exactly the bug that made the nav dropdown unreachable on the homepage. */
main, .siteftr { position: relative; z-index: 1; }

/* Raised surfaces get a real edge, the way lit material does. None of
   these carry an ::after in the compiled theme, so nothing is displaced. */
.card, .nk-card, .accordion-item, .nk-testimonial-card, .nk-quote { position: relative; }
.card::after, .nk-card::after, .accordion-item::after,
.nk-testimonial-card::after, .nk-quote::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  border-radius: inherit;
  background: linear-gradient(180deg, rgba(255,255,255,.055), transparent 42%);
}

/* ---- elevation ------------------------------------------------------
   --d-ink-3 existed but was painted on exactly one element, so the site
   ran on two tiers: ground and surface. It now does the job its name
   implies — the step above a surface, for what sits on top of one. */
.card .card, .nk-card .nk-card,
.accordion-item .accordion-body pre,
.nk-entry-content pre { background-color: var(--d-ink-3) !important; }
.card:hover, .nk-card:hover { background-color: var(--d-ink-3) !important; }

/* ---- the template's accent, removed ---------------------------------
   backToTop() runs on every page of this layout, so .scroll-top put a
   #9097f7 periwinkle circle with white text on all 578 check pages. It was
   the only hue on a ground whose palette note says actions are foreground
   weight, not a hue, and whose one rule about colour is that it is spent
   on severity. */
.scroll-top {
  background-color: var(--d-ink-3) !important;
  color: var(--d-fg) !important;
  border: 1px solid var(--d-rule) !important;
  box-shadow: 0 18px 44px -18px rgba(0, 0, 0, .85) !important;
}
.scroll-top:hover {
  background-color: var(--d-ink-2) !important;
  border-color: var(--d-fg-3) !important;
}

/* ---- the accent that survived a background-color -----------------------
   dark.css already set background-color on these, but the compiled theme
   paints the accent as a background-IMAGE (linear-gradient #9097f7 →
   #64a2f9), and an image paints over a colour. So the periwinkle came
   through regardless, and the CTA at the foot of all 578 check pages — plus
   contact, consulting, the CloudTrail guide and the cookie banner — stayed
   the template's lavender pill while every other button on the site was
   foreground-weight. Null the image, then paint. */
.btn-primary, .home-codebase .btn-primary,
.badge, .home-codebase .badge, .home-codebase .nk-nav .badge,
.bg-gradient-20, .swiper-pagination-bullet-active {
  background-image: none !important;
}
.btn-primary, .home-codebase .btn-primary {
  background-color: var(--d-fg) !important;
  color: var(--d-ink) !important;
  border-color: transparent !important;
  border-radius: var(--r-control) !important;
  /* the theme title-cases every .btn; the site writes its own labels */
  text-transform: none !important;
}
.btn-primary:hover, .home-codebase .btn-primary:hover {
  background-color: #fff !important; color: var(--d-ink) !important;
}
.swiper-pagination-bullet-active { background-color: var(--d-fg) !important; }

/* ---- type scale for the pages the template still owns -----------------
   The redesign set the homepage at a 17px body, and the check pages were
   given their own scale, but about, consulting, blog, contact, the guide
   and the legal pages still ran on the template's: a 20px body under 40px
   headings, with about's h1 and h2 both landing on 40px, so a page title
   and a section heading inside it were the same size. Scoped to main, so
   the shared masthead and footer keep shell.css's sizes, and kept off the
   .check-* vocabulary, which already declares its own with !important. */
/* The template sets type by class as well as by tag, and a class outranks
   an element selector, so these have to be named or they keep the
   template's sizes: .display-6 held an h1 at 64px and .nk-section-text held
   body copy at 20px. These are the type classes our own pages actually
   use — checked, not guessed. */
main p, main li, main dd, main blockquote,
main .nk-section-text, main .lead { font-size: 1.0625rem; }
/* The template puts .nk-section-title on some h1s — about, blog and contact
   all do. `main .nk-section-title` is one class and one type, which outranks
   `main h1` at two types no matter which comes first, so those page titles
   were rendering at section-heading size. The h1 rule names the class too,
   which puts it above. */
main h2, main .nk-section-title { font-size: var(--t-5); line-height: 1.18; letter-spacing: -.025em; }
main h1, main h1.nk-section-title, main .nk-hero-title,
main .display-1, main .display-2, main .display-3,
main .display-4, main .display-5, main .display-6 {
  font-size: var(--t-2); line-height: 1.1; letter-spacing: -.03em;
}
main h3 { font-size: var(--t-6); line-height: 1.25; letter-spacing: -.02em; }
main h4 { font-size: 1.1875rem; line-height: 1.3; }
main h5, main h6 { font-size: 1.0625rem; line-height: 1.35; }

/* ---- checks index filter ----------------------------------------------
   The catalogue is 577 cards and 104 screens tall. All of it stays in the
   document for indexing; this makes it navigable for a person. Bootstrap's
   grid columns set display, which beats [hidden]'s display:none, so the
   filter needs this to hide anything at all. */
.check-card[hidden], .check-group[hidden], .checks-filter[hidden], .checks-empty[hidden] {
  display: none !important;
}
.checks-filter {
  display: grid; gap: .75rem; margin-bottom: 2rem;
  grid-template-columns: 1fr; align-items: center;
}
@media (min-width: 48rem) {
  .checks-filter { grid-template-columns: minmax(16rem, 26rem) 1fr auto; }
}
.checks-filter label {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.checks-filter input[type="search"] {
  width: 100%; padding: .6rem .8rem;
  background: var(--d-ink-2); color: var(--d-fg);
  border: 1px solid var(--d-rule); border-radius: var(--r-control);
  font-family: inherit; font-size: 1rem;
}
.checks-filter input[type="search"]::placeholder { color: var(--d-fg-3); }
.checks-filter input[type="search"]:focus-visible {
  outline: 2px solid var(--d-fg); outline-offset: 2px; border-color: transparent;
}
.checks-sev { display: flex; flex-wrap: wrap; gap: .4rem; }
.checks-sev button {
  font-family: inherit; font-size: .875rem; padding: .4rem .7rem;
  background: transparent; color: var(--d-fg-2);
  border: 1px solid var(--d-rule); border-radius: var(--r-control); cursor: pointer;
  transition: border-color 140ms ease, color 140ms ease;
}
.checks-sev button:hover { color: var(--d-fg); border-color: var(--d-fg-3); }
.checks-sev button[aria-pressed="true"] {
  color: var(--d-ink); background: var(--d-fg); border-color: transparent;
}
.checks-count {
  margin: 0; color: var(--d-fg-3); font-size: .875rem;
  font-family: "JetBrains Mono", ui-monospace, monospace; white-space: nowrap;
}
.checks-empty { color: var(--d-fg-2); font-size: 1.0625rem; padding: 2rem 0; }

/* ---- document pages ---------------------------------------------------
   about is an essay, not a pitch. Its h1 took the shared page-title size,
   which is right above a hero and too loud above 700 words of prose, and
   the lead was centred over a left-aligned body. One alignment, one
   measure, and a heading ramp that actually steps. */
.doc, .doc-proof { padding-block: clamp(3rem, 6vw, 5rem); }
.doc-proof { border-top: 1px solid var(--d-rule-2); }

/* The essay is one column, so the container is the column: a 58rem shell
   around a 36rem measure left 441px of dead gutter on the right. The quotes
   below keep the wider shell, because three of them need it. */
/* The measure is the prose column, so it is scoped away from wide pages:
   there the lead must share a left edge with body sections that use the
   theme's own .container, and inheriting it is what lines them up. */
.doc:not(.doc-wide) .container { max-width: 44rem; }
.doc-proof .container { max-width: 58rem; }

/* .doc-eyebrow is declared with .nk-section-subtitle above: one eyebrow,
   one rule. The !importants there are needed because dark.css unifies every
   p onto Archivo with !important, and the theme's pill styling uses it too. */
.doc-lead h1 {
  /* smaller than the shared page title: this heads a document, not a hero */
  font-size: var(--t-3) !important;
  line-height: 1.12; letter-spacing: -.03em; margin: 0 0 1.1rem;
}
.doc-lede {
  /* 17px and 1.62, exactly the homepage's opening lede. 18px is the
     homepage's emphasised lede and it is spent on the two differentiator
     sections; a page's opening statement is 17 there, including the hero's.
     This claimed the emphasised size on the strength of the wrong
     comparison. */
  color: var(--d-fg-2) !important; font-size: 1.0625rem !important;
  line-height: 1.62; max-width: 36rem; margin: 0;   /* same edge as the body */
}

.doc-body { margin-top: clamp(2.5rem, 5vw, 3.75rem); }
/* That gap separates the lead from the body, which is right when the body
   opens with a heading or a form. When it opens with a paragraph it is
   continuing the lede's thought, and 60px reads as a section break in the
   middle of one. .doc-actions is excluded: a button under the lede is a
   break, not a continuation. */
.doc-body:has(> p:first-child:not(.doc-actions)) { margin-top: 1.75rem; }
/* The global prose cap above is more specific than this rule and was
   winning, which is why the measure did not move; it now exempts .doc-body.
   36rem is 576px, about 69 characters at this size and face. An essay wants
   a longer line than the 50ch that suits a marketing paragraph. */
.doc-body > * { max-width: 36rem; }
/* a new topic gets more air above it than a point inside one */
.doc-body h2 {
  font-size: var(--t-6) !important; line-height: 1.2; letter-spacing: -.02em;
  margin: 3rem 0 .85rem; padding-top: 1.6rem;
  border-top: 1px solid var(--d-rule-2);
}
.doc-body > h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
/* An eyebrow belongs to the heading under it, so the divider goes above the
   pair. Left on the h2 it fell between the two and tied the eyebrow to
   whatever came before. */
.doc-body .doc-eyebrow {
  /* the shared eyebrow rule kills margin, padding and border with
     !important to strip the theme's pill, so re-stating them needs the
     same weight — specificity alone loses to it */
  margin: 3rem 0 .55rem !important;
  padding-top: 1.6rem !important;
  border-top: 1px solid var(--d-rule-2) !important;
}
.doc-body .doc-eyebrow + h2 { margin-top: 0; padding-top: 0; border-top: 0; }
.doc-body h3 {
  /* was --t-8: 18px against 17px body copy. One pixel is not a hierarchy —
     the ramp has to be legible at a glance, not by measurement. */
  font-size: var(--t-7) !important; line-height: 1.3; letter-spacing: -.015em;
  color: var(--d-fg) !important; margin: 2rem 0 .6rem;
}
.doc-body p { margin: 0 0 1.05rem; color: var(--d-fg-2) !important; }
.doc-body p:last-child { margin-bottom: 0; }

/* The rest of the document column. About is all headings and paragraphs, so
   these only appear once the other four pages moved onto the same measure:
   lists, one form, and the calls to action those pages carry. */
.doc-body ul { margin: 0 0 1.05rem; padding-left: 1.15rem; list-style: disc; }
.doc-body li {
  color: var(--d-fg-2); line-height: 1.62; margin-bottom: .55rem;
}
.doc-body li:last-child { margin-bottom: 0; }

/* A form is not prose: it keeps the container's full 44rem so its two-column
   rows do not collapse into a pair of narrow fields. */
.doc-body > form { max-width: none; }
.doc-body .form-group { margin-bottom: 0; }
.doc-body .form-label, .doc-body .form-label-group { margin-bottom: .4rem; }

.doc-actions { margin: 1.6rem 0 0; }
.doc-actions + h2 { margin-top: 3rem; }
/* an option's own call to action, inline in the column rather than a button
   stack: three of them in a row would out-shout the text they belong to */
.doc-link {
  color: var(--d-fg) !important; text-decoration: none;
  border-bottom: 1px solid var(--d-fg-3); padding-bottom: 2px;
}
.doc-link:hover { color: #fff !important; border-bottom-color: currentColor; }

.doc-lockup {
  display: flex; align-items: center; gap: 1.25rem; flex-wrap: wrap;
  margin: 0 0 1.4rem;
}
.doc-lockup img { height: 40px; width: auto; }
.doc-lockup span { color: var(--d-fg-3); font-size: 1.25rem; }

/* the download link jumps to its own heading, which the masthead would cover */
.doc-body [id] { scroll-margin-top: 6rem; }

.doc-proof h2 {
  font-size: var(--t-6) !important; line-height: 1.2; letter-spacing: -.02em; margin: 0;
}

/* ---- aligning the template-owned pages with the homepage ---------------
   These pages still carried three template habits the homepage does not.
   Scoped to main, so the shared masthead and footer are untouched. */

/* 1. Left, like every other page. The column stays centred — .row
      justify-content and .mx-auto are left alone — so the result is a
      centred measure with the text ranged left inside it, which is what
      the about page does and what the homepage does throughout. */
main .text-center,
main .nk-section-head.text-center,
main .nk-section-head { text-align: left !important; }
/* text-align does not move a flex row's items. The post meta (date, read
   time, share links) sits in a ul the template centres with a Bootstrap
   utility, so it stayed centred under a left-ranged title. The utility
   carries !important, so this needs it plus a heavier selector. */
main .nk-list-meta.justify-content-center,
main .nk-btn-group.justify-content-center { justify-content: flex-start !important; }
/* the button row is a centred flex, so text-align never reached it and the
   CTA sat in the middle under left-ranged copy */
main .nk-btn-group { justify-content: flex-start !important; }

/* 2. The copy is written in sentence case and the theme was title-casing it
      in CSS: "An expert review of your AWS security posture" was rendering
      as "An Expert Review Of Your AWS Security Posture". shell.css already
      did this for the masthead and footer; the page body was still capitalised. */
main h1, main h2, main h3, main h4, main h5, main h6,
main .btn, main .nk-section-title, main .card-title,
/* Bootstrap's utility carries !important, so it needs a class of its own
   here to be outranked. .nk-section-subtitle keeps its uppercase: that is
   an eyebrow label, and the site sets those uppercase deliberately. */
main .text-capitalize { text-transform: none !important; }

/* 3. One button shape. .btn-primary was already on the scale; .btn-dark and
      the outline variants were still 800px pills, so a single page showed
      two shapes. */
main .btn { border-radius: var(--r-control) !important; }
/* form controls sat at 8px against the 7px control step — the same one-pixel
   near-duplicate the radius scale exists to stop */
main input, main textarea, main select,
main .form-control { border-radius: var(--r-control) !important; }

/* 4. The first section opened with 112px of padding under a 62px masthead,
      which put the consulting h1 424px down and the guide's 524px. The
      homepage opens at a quarter of that. */
main > section:first-of-type { padding-top: clamp(2rem, 4vw, 3.25rem) !important; }
/* the real offender: the banner wrapper, not the section around it */
main .nk-banner-wrap { padding-top: clamp(1.5rem, 3vw, 2.5rem) !important; }

/* ---- legal pages ------------------------------------------------------
   privacy-policy and terms-and-conditions came out of a policy generator as
   standalone documents and were dropped in whole: their own <html> and
   <head>, style blocks forcing black Arial, and roughly 800 inline colour
   declarations between them. They rendered as white pages in Arial with no
   masthead, no footer and no measure. The document wrapper is gone; these
   rules override what is left. An author !important outranks a
   non-important inline style, which is the only reason this can be done
   without touching 8,000 lines of generated markup. */
.legal { padding-block: clamp(2.5rem, 5vw, 4rem); }
.legal .container { max-width: 52rem; }

.legal, .legal *:not(svg):not(path) {
  color: var(--d-fg-2) !important;
  background: transparent !important;
  font-family: "Archivo", system-ui, -apple-system, sans-serif !important;
}
/* what the generator marks as a heading, and plain emphasis, take the
   brighter foreground so the document still has a structure */
.legal [data-custom-class="title"], .legal [data-custom-class="title"] *,
.legal [data-custom-class="heading_1"], .legal [data-custom-class="heading_1"] *,
.legal [data-custom-class="heading_2"], .legal [data-custom-class="heading_2"] *,
.legal strong, .legal b, .legal h1, .legal h2, .legal h3 {
  color: var(--d-fg) !important;
}
.legal a, .legal a * {
  color: var(--d-fg) !important;
  text-decoration: underline;
  text-decoration-color: color-mix(in srgb, currentColor 38%, transparent);
  text-underline-offset: .22em;
}
.legal a:hover, .legal a:hover * { text-decoration-color: currentColor; }
.legal li { margin-bottom: .4rem; }


/* ---- scroll animation, off -------------------------------------------
   AOS is disabled in scripts.js, which is the real fix. This is the safety
   net: [data-aos^=fade] sets opacity 0 in the compiled theme, so without it
   a visitor whose JS fails would get a page of invisible content. An
   !important beats that rule whatever its specificity. */
[data-aos] {
  opacity: 1 !important;
  transform: none !important;
  transition: none !important;
}

/* ---- the sizes that were not on the scale -----------------------------
   An audit of every rendered size on every page type turned up five that
   belonged to no step, four of them one pixel or so from a step that
   already existed — the same near-duplicate problem the scale was built to
   end. */

/* Bootstrap's heading utilities size independently of the tag, so the
   checks index rendered its 84 category headings — <h2 class="h3"> — at
   32px while every other section heading on the site is 33.6. */
main .h1 { font-size: var(--t-2) !important; }
main .h2 { font-size: var(--t-5) !important; }
main .h3 { font-size: var(--t-5) !important; }
main .h4 { font-size: var(--t-6) !important; }
main .h5, main .h6 { font-size: var(--t-8) !important; }

/* .btn-sm rendered larger than a full-size button: 17.5px against 16, on
   the 661 buttons of the checks index. */
main .btn-sm { font-size: .875rem !important; }

/* .small is 0.875em — relative to whatever it sits in — so the 577 card
   descriptions landed on 14.875px rather than the 15 used everywhere else.
   A body size should not depend on its container. */
main .small, main .card-text { font-size: .9375rem !important; }

/* .btn-lg set its label at 25px, larger than any body text on the site and
   on no step. A large button is a fair choice on a lead-magnet page; it is
   one step above a normal button now, not nine pixels. */
main .btn-lg { font-size: 1.125rem !important; }

/* a label inside a button takes the button's size */
main .btn-text, main .btn-loading { font-size: inherit !important; }

/* ---- legal pages: type on the site's scale ----------------------------
   The generator sized everything inline — 940 declarations at 15px, 100 at
   19, 46 at 14.6667, one title at 26 — so these two pages read at a
   different size from every other page on the site. The markup does carry a
   clean structure in data-custom-class, so each level maps onto a step
   rather than being flattened. !important because the sizes are inline. */
.legal, .legal *:not(svg):not(path) {
  font-size: 1.0625rem !important;   /* body, 17px like everywhere else */
  line-height: 1.6 !important;
}
.legal [data-custom-class="title"], .legal [data-custom-class="title"] * {
  font-size: var(--t-3) !important; line-height: 1.12 !important;
  letter-spacing: -.03em;
}
.legal [data-custom-class="subtitle"], .legal [data-custom-class="subtitle"] * {
  font-size: 1.0625rem !important;
}
.legal [data-custom-class="heading_1"], .legal [data-custom-class="heading_1"] * {
  font-size: var(--t-6) !important; line-height: 1.2 !important; letter-spacing: -.02em;
}
.legal [data-custom-class="heading_2"], .legal [data-custom-class="heading_2"] * {
  font-size: var(--t-8) !important; line-height: 1.3 !important; letter-spacing: -.015em;
}


/* Multi-line code is authored as <code> inside <p> in the posts, carrying
   white-space: pre. At 390px those ran 562px wide and pushed the whole
   document sideways, because an inline box cannot clip. inline-block gives
   them a box that can, so they scroll in place instead. Short inline code
   is unaffected: it never reaches the cap. It does need vertical-align,
   though: an inline-block with overflow set takes its bottom edge as its
   baseline, which lifted every inline code span about 8px above the text. */
main code { display: inline-block; max-width: 100%; overflow-x: auto; vertical-align: middle; }

/* ---- blog index: the post grid ---------------------------------------
   Three problems, all of them the template's defaults meeting our type. */

/* A card's height came from its title's line count, so a one-line title
   sat 22px short of its neighbours and the row bottoms were ragged. The
   card fills its column and the byline is pushed to the foot, so the
   author rows line up however the titles wrap. */
.nk-blog-section .card { height: 100%; }
.nk-blog-section .card-body { display: flex; flex-direction: column; height: 100%; }
.nk-blog-section .card-content { display: flex; flex-direction: column; flex: 1 1 auto; }
.nk-blog-section .media-group { margin-top: auto; }
/* a column flex stretches its children, which turned the category pill into
   a full-width bar with centred text */
.nk-blog-section .badge { align-self: flex-start; }

/* A post title was 17px — exactly the body size — so the grid read as one
   flat block of text with no entry point. */
.nk-blog-section .card-title {
  font-size: var(--t-7) !important; line-height: 1.3; letter-spacing: -.01em;
}
.nk-blog-section .lead-text { font-size: .9375rem; }

/* `main li` sizes every list item at 17px, which caught the date and
   read-time meta the template had set to 12px — they rendered as large as
   the post title. One class outranks the two type selectors there, so this
   needs no !important. */
.nk-list-meta li { font-size: .8125rem; }
