/* == nd-responsive-tables == */
/* Wrap content-area tables for horizontal scroll on small screens */
      .elementor-widget-text-editor table,
      .elementor-widget-html table,
      .entry-content table,
      .nd-compare-table {
        display: block;
        max-width: 100%;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
      }
      @media (max-width: 768px) {
        .elementor-widget-text-editor table,
        .elementor-widget-html table,
        .entry-content table,
        .nd-compare-table {
          font-size: 0.875em;
        }
        .elementor-widget-text-editor table th,
        .elementor-widget-text-editor table td {
          padding: 0.4em 0.5em;
          white-space: nowrap;
        }
        /* KaTeX math shouldn't overflow either */
        .katex-display, .katex-html {
          max-width: 100%;
          overflow-x: auto;
          overflow-y: hidden;
        }
        /* Related-article card flex rows wrap to single column */
        .elementor-widget-text-editor > .elementor-widget-container > div[style*="display:flex"] > div[style*="min-width"] {
          min-width: 100% !important;
          flex: 1 1 100% !important;
        }
      }
/* == nd-tokens == */
:root{
  --nd-deck:#0a1d3a; --nd-deep-sea:#071428; --nd-abyss:#050D18; --nd-navy:#01205F;
  --nd-azure:#0375FD; --nd-azure-hi:#5AA6FF; --nd-amber:#FFB25A; --nd-settled:#35D0A5;
  --nd-ice:#EAF3FB; --nd-foam:#F6FAFD; --nd-ink:#0C1A2E; --nd-muted:#5C6E86;
  --nd-azure-deep:#045FCB; --nd-amber-deep:#B9782E; --nd-settled-deep:#178F76;
  --nd-h1-lo:#9FB6D6; --nd-lede:#C4D2E6;
  --nd-font-display:'Lexend',system-ui,sans-serif;
  --nd-font-body:'DM Sans',system-ui,sans-serif;
  --nd-font-mono:'IBM Plex Mono',ui-monospace,Menlo,monospace;
}
/* shared components — consumed by later reskin phases; nothing on the site uses them yet */
.nd-btn{display:inline-flex;align-items:center;gap:.55em;background:var(--nd-azure);color:#fff;font-family:var(--nd-font-body);font-weight:700;font-size:15px;line-height:1;padding:15px 24px;border-radius:8px;border:0;cursor:pointer;text-decoration:none;white-space:nowrap;transition:background .15s,transform .15s}
.nd-btn:hover,.nd-btn:focus{background:#045FCB;color:#fff;transform:translateY(-1px)}
.nd-ey{font-family:var(--nd-font-mono);font-weight:500;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--nd-azure)}
.nd-data{font-family:var(--nd-font-mono);font-variant-numeric:tabular-nums}
/* ---- hero type recipe — the /services/ hero, systematised ----
   .nd-hero-ey = mono eyebrow, azure-hi, amber separator (<i>/</i> or .dot)
   .nd-lo      = the light second clause of a display H1. Dark plates only —
                 it needs a scrimmed backdrop to hold contrast.
   The .nd-hero-h1 / .nd-hero-lede rules that used to sit here were removed
   2026-07-25: they were declared on all 41 pages and applied on none. H1
   sizing is now the shared scale in nd-type-scale.php (--nd-h1-statement /
   --nd-h1-page / --nd-h1-article), which the real hero selectors consume. */
.nd-hero-ey{font-family:var(--nd-font-mono);font-weight:500;font-size:12.5px;letter-spacing:.32em;text-transform:uppercase;color:var(--nd-azure-hi);line-height:1.6;margin:0 0 20px}
.nd-hero-ey i,.nd-hero-ey .dot,.nd-hero-ey .sep{font-style:normal;color:var(--nd-amber);padding:0 4px}
.nd-lo{font-weight:300;color:var(--nd-h1-lo)}
@media (max-width:860px){
  .nd-hero-ey{font-size:11px;letter-spacing:.24em;margin:0 0 14px}
  .nd-lo{color:#AEC4E0}
}
/* Phase 2: Products dropdown as a two-column panel (Astra hides submenus via visibility/opacity; display stays block) */
@media (min-width:922px){
  .main-header-menu .menu-item-3347 > .sub-menu,
  .main-header-menu .nd-nav-products > .sub-menu{display:grid;grid-auto-flow:column;grid-template-rows:repeat(5,auto);min-width:640px;column-gap:8px}
}
/* Phase 2c: language switcher renders as a globe on desktop (text label kept for mobile drawer + screen readers) */
@media (min-width:922px){
  .main-header-menu .menu-item-5994 > .menu-link,
  .main-header-menu .pll-parent-menu-item > .menu-link{font-size:0 !important}
  .main-header-menu .menu-item-5994 > .menu-link::before,
  .main-header-menu .pll-parent-menu-item > .menu-link::before{content:"";display:inline-block;width:19px;height:19px;vertical-align:middle;background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3c2.9 2.6 4.2 5.6 4.2 9s-1.3 6.4-4.2 9c-2.9-2.6-4.2-5.6-4.2-9s1.3-6.4 4.2-9z'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3c2.9 2.6 4.2 5.6 4.2 9s-1.3 6.4-4.2 9c-2.9-2.6-4.2-5.6-4.2-9s1.3-6.4 4.2-9z'/%3E%3C/svg%3E") center/contain no-repeat}
}
/* P0 hotfix 1: POLARIS yellow button must never carry white text (was 1.46:1) */
.elementor-element-5a224b82 .elementor-button,
.elementor-element-5a224b82 .elementor-button:hover,
.elementor-element-5a224b82 .elementor-button:focus{color:#0C1A2E !important;fill:#0C1A2E !important}
/* P0 hotfix 2: home hero primary CTA red -> azure (one conversion colour site-wide begins here) */
.elementor-element-a1b2c3d .elementor-button{background-color:var(--nd-azure) !important;color:#fff !important;fill:#fff !important;border:0 !important}
.elementor-element-a1b2c3d .elementor-button:hover,
.elementor-element-a1b2c3d .elementor-button:focus{background-color:#045FCB !important;color:#fff !important;fill:#fff !important}
/* == nd-nav-products-panel == */
/* ND-NAVCSS-2026-09-07: scoped by class, not by the English menu-item id, so the nine translated menus get the panel too. */
@media (min-width:922px){
  .main-header-menu .nd-nav-products > .sub-menu{padding:14px 12px;min-width:660px;column-gap:6px;border-radius:0 0 10px 10px}
}
.main-header-menu .nd-nav-products > .sub-menu a.nd-mm{display:flex;flex-direction:column;gap:3px;padding:12px 16px;border-radius:8px}
.main-header-menu .nd-nav-products > .sub-menu a.nd-mm:hover,
.main-header-menu .nd-nav-products > .sub-menu a.nd-mm:focus{background:rgba(3,117,253,.06)}
.main-header-menu .nd-nav-products > .sub-menu a.nd-mm:focus-visible{outline:2px solid var(--nd-azure,#0375FD);outline-offset:-2px}
.nd-mm-top{display:flex;align-items:center;gap:10px;min-height:15px}
.nd-mm-wm{height:13px !important;width:auto !important;max-width:none !important;display:block}
.nd-mm-wm[src*="constellation-lockup-glyph"]{height:15.2px !important}
.nd-mm-wmtx{font-family:var(--nd-font-mono,monospace);font-size:12.5px;font-weight:600;letter-spacing:.08em;color:var(--nd-navy,#01205F)}
.nd-mm-dev{font-family:var(--nd-font-mono,monospace);font-size:11px;font-weight:500;letter-spacing:.1em;color:var(--nd-muted,#5C6E86);border:1px dashed rgba(92,110,134,.55);border-radius:4px;padding:1px 6px;line-height:1.4}
.nd-mm-role{font-family:var(--nd-font-body,sans-serif);font-size:13px;line-height:1.35;color:var(--nd-ink,#0C1A2E)}
.nd-mm-range{font-family:var(--nd-font-mono,monospace);font-size:11px;letter-spacing:.02em;color:var(--nd-muted,#5C6E86);font-variant-numeric:tabular-nums}
a.nd-mm-compare{display:flex;align-items:center;padding:12px 16px;border-top:1px solid rgba(3,117,253,.14);margin-top:4px;border-radius:0}
.nd-mm-cmp{font-family:var(--nd-font-body,sans-serif);font-size:13.5px;font-weight:700;color:var(--nd-azure,#0375FD)}
a.nd-mm-compare:hover .nd-mm-cmp{color:var(--nd-azure-deep,#045FCB)}
/* == nd-kb-skin == */
/* title band: the Elementor container that holds the page H1 */
body.nd-kbskin .elementor [data-element_type="container"]:has(h1.elementor-heading-title){
  background:linear-gradient(180deg,var(--nd-deck,#0a1d3a),var(--nd-deep-sea,#071428)) !important;
  border-top:2px solid var(--nd-azure,#0375FD);
  padding-top:clamp(40px,5vw,60px) !important;padding-bottom:clamp(40px,5vw,60px) !important;
  min-height:0 !important;
}
body.nd-kbskin h1.elementor-heading-title{
  font-family:var(--nd-font-display,'Lexend',sans-serif) !important;
  font-weight:700 !important;font-size:clamp(30px,3.2vw,42px) !important;
  line-height:1.15 !important;letter-spacing:-.02em;color:#fff !important;text-wrap:balance;
}
/* neutralize Elementor bg overlays inside the title band (DAF et al carry an indigo overlay) */
body.nd-kbskin .elementor [data-element_type="container"]:has(h1.elementor-heading-title) .elementor-background-overlay{opacity:0 !important}
body.nd-kbskin .elementor [data-element_type="container"]:has(h1.elementor-heading-title)::before{background:none !important}
/* 8145 operability-screening: retire the red hero CTA (bespoke ndcx/ndcap classes) */
body.page-id-8145 .ndcx-btn-p,body.page-id-8145 .ndcap-btn-p{background:var(--nd-azure,#0375FD) !important;color:#fff !important}
body.page-id-8145 .ndcx-btn-p:hover,body.page-id-8145 .ndcap-btn-p:hover{background:var(--nd-azure-deep,#045FCB) !important}
body.nd-kbskin h1.elementor-heading-title::before{
  content:'Knowledge Hub';display:block;
  font-family:var(--nd-font-mono,monospace);font-size:12px;font-weight:500;
  letter-spacing:.16em;text-transform:uppercase;color:var(--nd-azure-hi,#5AA6FF);
  margin-bottom:10px;
}
/* body chrome */
body.nd-kbskin h2.elementor-heading-title,
body.nd-kbskin .elementor-widget-text-editor h2,
body.nd-kbskin .elementor-widget-text-editor h3{
  font-family:var(--nd-font-display,'Lexend',sans-serif);letter-spacing:-.015em;color:var(--nd-ink,#0C1A2E);
}
body.nd-kbskin .elementor-widget-text-editor a{color:var(--nd-azure,#0375FD)}
body.nd-kbskin .elementor-widget-text-editor a:hover{color:var(--nd-azure-deep,#045FCB)}
/* generic FAQ details outside the per-page upgrade scopes */
body.nd-kbskin .elementor-widget-text-editor details,
body.nd-kbskin .e-con details:not([class]){
  border:1px solid rgba(3,117,253,.18);border-radius:10px;padding:14px 18px;margin:10px 0;background:#fff;
}
body.nd-kbskin .elementor-widget-text-editor details summary,
body.nd-kbskin .e-con details:not([class]) summary{
  font-family:var(--nd-font-display,'Lexend',sans-serif);font-weight:600;cursor:pointer;
}
/* byline strip injected under the title */
body.nd-kbskin [data-id^="nd_byline"]{
  font-family:var(--nd-font-mono,monospace);font-size:12px;letter-spacing:.05em;color:var(--nd-muted,#5C6E86);
}

/* regrade fix-pass 2026-07-11: one conversion CTA — legacy Elementor buttons to the azure r8/w700 spec on all skinned KB pages */
body.nd-kbskin .elementor-button,body.nd-kbskin .elementor-button:visited{background:var(--nd-azure,#0375FD) !important;color:#fff !important;border:none !important;border-radius:8px !important;font-weight:700 !important;letter-spacing:0 !important}
body.nd-kbskin .elementor-button:hover,body.nd-kbskin .elementor-button:focus{background:var(--nd-azure-deep,#045FCB) !important;color:#fff !important}
/* == nd-dnv-up-css == */
.nd-dnv-up{--nk:var(--nd-ink,#0C1A2E);--nm:var(--nd-muted,#5C6E86);--nf:var(--nd-muted,#5C6E86);--nh:color-mix(in srgb,var(--nd-ink,#0C1A2E) 15%,#fff);--nhs:color-mix(in srgb,var(--nd-ink,#0C1A2E) 22%,#fff);--ns2:var(--nd-foam,#F6FAFD);--nt:var(--nd-azure-deep,#045FCB);--na:var(--nd-amber-deep,#B9782E);--nax:color-mix(in srgb,var(--nd-amber-deep,#B9782E) 74%,#000);--nnavy:var(--nd-deck,#0a1d3a);--nmono:ui-monospace,"SF Mono",Menlo,monospace;font-family:inherit}
.nd-dnv-up *{box-sizing:border-box}
.nd-dnv-up .ndnv-hero{position:relative;margin:0 0 22px;border-radius:14px;overflow:hidden;background:#06131d;height:380px}
.nd-dnv-up .ndnv-herosvg{position:absolute;inset:0;width:100%;height:100%;display:block}
.nd-dnv-up .ndnv-hero .nd-figscroll{position:absolute!important;inset:0!important;width:100%!important;height:100%!important;overflow:hidden!important}
.nd-dnv-up .ndnv-hero .nd-figscroll-hint{display:none!important}
.nd-dnv-up .ndnv-hero .ndnv-herosvg{max-width:100%!important;height:100%!important}
.nd-dnv-up .ndnv-herotext{position:absolute;left:0;right:0;bottom:0;padding:26px 30px;background:linear-gradient(to top,rgba(6,19,29,.92),rgba(6,19,29,.25) 60%,transparent)}
.nd-dnv-up .ndnv-kick{font-family:var(--nmono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:700;color:var(--nd-azure-hi,#5AA6FF)}
.nd-dnv-up .ndnv-line{margin:8px 0 0;font-size:clamp(19px,2.6vw,27px);font-weight:700;color:#fff;max-width:34ch;line-height:1.25;letter-spacing:-.01em}
@media(max-width:620px){.nd-dnv-up .ndnv-hero{height:280px}.nd-dnv-up .ndnv-nodelbl{display:none}}
.nd-dnv-up .ndnv-sec{margin:30px 0}
.nd-dnv-up h2{font-size:24px;line-height:1.2;margin:0 0 8px;color:var(--nk)}
.nd-dnv-up p{margin:.6em 0;line-height:1.6}
.nd-dnv-up a{color:var(--nt);font-weight:600}
.nd-dnv-up .ndnv-tbl{overflow-x:auto;margin:14px 0}
.nd-dnv-up table{border-collapse:collapse;width:100%;min-width:640px;font-size:14px}
.nd-dnv-up th,.nd-dnv-up td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--nh);vertical-align:top}
.nd-dnv-up th:not([scope=row]){font-family:var(--nmono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--nf);font-weight:700;background:var(--ns2)}
.nd-dnv-up th[scope=row]{font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;background:transparent}
/* nd-type-scale.php floors every table th to var(--nd-label-min) !important; that floor is
   meant for column-header labels — row labels keep the body size they had as <td>. */
:root:root .nd-dnv-up th[scope=row]{font-size:inherit!important}
.nd-dnv-up .ndvhcap{position:absolute!important;width:1px;height:1px;padding:0!important;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
.nd-dnv-up .ndnv-std{font-family:var(--nmono);font-weight:700;white-space:nowrap}
.nd-dnv-up .ndnv-was{display:block;font-size:11px;color:var(--nf);margin-top:3px}
.nd-dnv-up .ndnv-strip{display:flex;gap:10px;flex-wrap:wrap;margin:14px 0 4px}
.nd-dnv-up .ndnv-q{flex:1;min-width:200px;background:var(--ns2);border:1px solid var(--nh);border-radius:9px;padding:11px 13px;font-size:13px;color:var(--nm);line-height:1.5}
.nd-dnv-up .ndnv-q b{display:block;color:var(--nk);margin-bottom:2px}
.nd-dnv-up .ndnv-q i{color:var(--nf);font-style:normal;font-size:12px}
.nd-dnv-up .ndnv-cap{font-size:12.5px;color:var(--nf);margin-top:10px}
.nd-dnv-up details.ndnv-faq{border:1px solid var(--nh);border-radius:9px;margin:8px 0;background:var(--ns2)}
.nd-dnv-up details.ndnv-faq summary{cursor:pointer;padding:13px 16px;font-weight:600;font-size:15px;list-style:none}
.nd-dnv-up details.ndnv-faq summary::-webkit-details-marker{display:none}
.nd-dnv-up details.ndnv-faq summary::after{content:"+";float:right;color:var(--nt);font-weight:700}
.nd-dnv-up details.ndnv-faq[open] summary::after{content:"\2013"}
.nd-dnv-up details.ndnv-faq div{padding:0 16px 14px;color:var(--nm);font-size:14.5px}
/* == nd-standards-reader-css == */
body.page-id-7497 .dc-wrap{max-width:1200px;margin:0 auto;padding:0 32px;box-sizing:border-box}body.page-id-7497 .dc-wrap *{box-sizing:border-box}:root:root body.page-id-7497 .ndnv-hero{height:450px!important;width:100%!important;max-width:none!important;box-sizing:border-box}:root:root body.page-id-7497 .ndnv-herotext{padding:110px max(32px,calc((100% - 1136px)/2)) 36px!important;box-sizing:border-box;background:linear-gradient(transparent,rgba(4,20,36,.95) 65%)!important}:root:root body.page-id-7497 .ndnv-herotext h1{font-size:48px!important;line-height:1.15!important;color:white;margin:17px 0!important;max-width:950px;letter-spacing:-1px}:root:root body.page-id-7497 .ndnv-herotext .ndnv-line{font-size:21px!important;font-weight:400!important;line-height:1.5!important;max-width:850px!important}body.page-id-7497 .ds-author{font-size:12px;color:#bfd7e9;margin-top:20px}body.page-id-7497 
:root:root body.page-id-7497 .ndnv-hero{height:450px!important;width:100%!important;max-width:none!important;box-sizing:border-box}
:root:root body.page-id-7497 .ndnv-herotext{max-width:none!important;width:100%!important;box-sizing:border-box;padding:130px max(24px,calc((100% - 1136px)/2)) 44px!important}
:root:root body.page-id-7497 .ndnv-herotext h1{font-size:clamp(34px,4vw,48px)!important;color:white!important;line-height:1.16!important;margin:16px 0!important}
:root:root body.page-id-7497 .ds-author{font-size:13px!important;color:#b8cedd!important;line-height:1.8!important;margin-top:20px}
.ds-wrap{max-width:1136px;margin:auto}.ds-section{padding:52px 0;border-bottom:1px solid #c7deec}.ds-kicker{font:12px monospace;letter-spacing:.12em;color:#6590ad}.ds-section h2{font:700 29px/1.3 Lexend,sans-serif;color:#315f7c;margin:13px 0}.ds-lead{font-size:18px;line-height:1.8;color:#678ca6;max-width:940px}.ds-two,.ds-three{display:grid;gap:24px;margin-top:28px}.ds-two{grid-template-columns:1fr 1fr}.ds-three{grid-template-columns:repeat(3,1fr)}.ds-two article,.ds-three article{background:white;border:1px solid #c8deed;border-radius:6px;padding:26px}.ds-section h3{font:650 21px/1.4 Lexend,sans-serif;color:#345f7b;margin:0 0 16px}.ds-section p{color:#6489a3;font-size:16px;line-height:1.8}.ds-section svg{width:100%!important;max-width:100%!important;height:auto!important;font:15px Arial,sans-serif;fill:#426c86}.ds-three article>span{display:block;font:12px monospace;color:#6895b1;margin-bottom:18px}.ds-caption{font-size:13px!important}.ds-nav{background:white;border-bottom:1px solid #c5dce9}.ds-nav .ds-wrap{display:flex;gap:24px;flex-wrap:wrap;padding:21px 0}.ds-nav a{font-size:14px;font-weight:600;color:#367ca9}.ds-product{display:flex;gap:35px;align-items:center;background:white;border-left:3px solid #4195c5;padding:30px;margin-top:26px}.ds-product img{width:210px;max-width:100%}.ds-product p{margin:8px 0}.ds-product strong{color:#315f7c}.ds-product a{color:#267eaf}.ds-section .ndnv-tbl{position:relative;max-width:100%;overflow:auto;margin-top:25px}.ds-section .ndnv-tbl table{min-width:800px}.ds-section .nd-figscroll{min-width:0;max-width:100%;overflow:hidden}.ds-section .nd-figscroll-hint{display:none!important}
@media(max-width:1190px){.ds-wrap{margin-left:24px;margin-right:24px}}@media(max-width:767px){:root:root body.page-id-7497 .ndnv-hero{height:440px!important}.ds-two,.ds-three{grid-template-columns:1fr}.ds-section{padding:34px 0}.ds-nav .ds-wrap{gap:13px 20px;padding:17px 0}.ds-section h2{font-size:25px}.ds-product{display:block;padding:24px}.ds-product img{margin-bottom:20px}.ds-two article,.ds-three article{padding:20px}}
:root:root .ds-two>article,:root:root .ds-three>article{min-width:0!important;max-width:100%!important;box-sizing:border-box}
:root:root body.page-id-7497 .ndnv-hero{background:linear-gradient(120deg,#061a2b,#123750)!important}:root:root body.page-id-7497 .ndnv-herotext{background:none!important}.ds-roles{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px;margin:28px 0}.ds-roles article,.ds-three article{min-width:0;max-width:100%;background:white;border:1px solid #c8deed;border-radius:6px;padding:26px}.ds-roles article>span,.ds-three article>span,.ds-citation>span{display:block;font:12px monospace;letter-spacing:.07em;color:#6b95b0;margin-bottom:16px}.ds-roles h3{font:700 28px/1.3 Lexend,sans-serif;letter-spacing:-.02em}.ds-roles a,.ds-link,.ds-citation a{color:#267ba7;font-size:15px;font-weight:600}.ds-citation{padding:28px;background:white;border-left:4px solid #3a8fc1;margin:25px 0}.ds-citation>strong{display:block;font:700 30px/1.3 Lexend,sans-serif;color:#315f7c}.ds-citation>p{margin:12px 0}.ds-legacy{border:1px solid #bfd8e8;border-radius:6px;background:#f8fcff;padding:20px 24px}.ds-legacy>summary{font:600 18px/1.5 Lexend,sans-serif;color:#315f7c;cursor:pointer}.ds-lineage{display:grid;grid-template-columns:1fr 35px 1fr;gap:16px;align-items:center;margin:14px 0;padding:18px;background:#e5f2fa;border-radius:4px;font:16px/1.5 monospace;color:#315f7c}.ds-lineage b{text-align:center}.ds-sources>div{display:flex;flex-wrap:wrap;gap:12px 24px;margin-top:20px}.ds-sources a{color:#277fae;font-size:15px}.ds-scope-table{position:relative!important;max-width:100%;overflow-x:auto!important}:root:root body.page-id-7497 .ds-scope-table table{min-width:920px}:root:root body.page-id-7497 .ds-scope-table caption{position:absolute!important;width:1px!important;height:1px!important;overflow:hidden!important;clip-path:inset(50%)!important}@media(max-width:767px){.ds-roles{grid-template-columns:minmax(0,1fr)}.ds-roles article,.ds-three article{padding:23px}.ds-citation{padding:22px}.ds-lineage{grid-template-columns:1fr;gap:8px;font-size:15px}.ds-lineage b{text-align:left;transform:rotate(90deg);width:24px}:root:root body.page-id-7497 .ndnv-hero{height:460px!important}}
:root:root body.page-id-7497 .ds-kicker{display:block!important}:root:root body.page-id-7497 .ds-section h2{display:block!important;border:0!important;padding:0!important;margin:13px 0!important;width:auto!important}:root:root body.page-id-7497 .ds-roles h3{font:700 28px/1.3 Lexend,sans-serif!important;margin:0 0 16px!important}.ds-roles article{display:flex;flex-direction:column}.ds-roles article>a{margin-top:auto;padding-top:12px}:root:root body.page-id-7497 .ndnv-tbl{position:relative!important;max-width:100%;overflow-x:auto!important}
/* == nd-kb-hero-media-css == */
[class^="nd-"][class$="-up"]>section[class$="-hero"]:has(>img[class$="-heroimg"]):not(.nphc-hero):not(.nsub-hero):not(.nwav-hero):not(.nahc-hero):not(.nwnd-hero):not(.noct-hero):not(.ndec-hero):not(.nqkl-hero):not(.nres-hero):not(.nrsr-hero):not(.nww-hero):not(.navp-hero):not(.naph-hero):not(.nplr-hero):not(.nspz-hero):not(.nret-hero):not(.ndr-hero){max-width:1500px;margin-left:auto;margin-right:auto}
/* == nd-lead-conversion-css == */
.nd-lead-cta{margin:34px 0;padding:28px 30px;background:#f3f7fc;color:#071a33;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:24px;align-items:center;font-style:normal}
    .nd-lead-cta *{font-style:normal}
    .nd-lead-cta__label{display:block;margin:0 0 10px;color:#0375FD;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}
    .nd-lead-cta h2{margin:0 0 10px;color:#071a33;font-size:clamp(24px,2.4vw,34px);line-height:1.08;letter-spacing:0}
    .nd-lead-cta p{margin:0;color:#233b5d;font-size:16px;line-height:1.55}
    .nd-lead-cta__actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
    .nd-lead-cta__button,.nd-lead-cta__link{display:inline-flex;align-items:center;justify-content:center;min-height:46px;padding:12px 18px;border:1px solid #0A1D3A;text-decoration:none!important;font-weight:800;font-size:14px;line-height:1.1}
    .nd-lead-cta__button{background:#0A1D3A;color:#fff!important}
    .nd-lead-cta__link{background:#fff;color:#0A1D3A!important}
    .nd-lead-cta__button:hover{background:#163d78;color:#fff!important}
    .nd-lead-cta__link:hover{background:#e8f0fb;color:#092044!important}
    @media (max-width:760px){.nd-lead-cta{grid-template-columns:1fr;padding:24px 20px}.nd-lead-cta__actions{justify-content:flex-start}.nd-lead-cta__button,.nd-lead-cta__link{width:100%}}
/* == nd-clickable-cards == */
.acard,.pbody,.svx-body,.fcard{position:relative;cursor:pointer;
  transition:transform .16s ease,box-shadow .16s ease}
/* one anchor per card, so its ::after can own the whole box */
.acard > a::after,.pbody > a::after,.svx-body > a::after,.fcard > a::after,
.acard a:only-of-type::after,.pbody a:only-of-type::after,.svx-body a:only-of-type::after,
.fcard a:only-of-type::after{
  content:"";position:absolute;inset:0;z-index:1}
/* Any OTHER link in the card - e.g. the VEGA card's inline 'motion reference unit'
   link - must sit above the overlay or the card-wide click swallows it.
   NB the PRIMARY link is deliberately excluded: it owns the ::after overlay, and
   giving it position:relative re-scopes that overlay to the link's own box
   instead of the card, silently killing the whole-card click. */
.fcard a:not(.flink){position:relative;z-index:2}
.acard a:not(:only-of-type),.pbody a:not(:only-of-type),.svx-body a:not(:only-of-type){position:relative;z-index:2}
.acard:hover,.pbody:hover,.svx-body:hover,.fcard:hover{
  transform:translateY(-2px);
  box-shadow:0 6px 22px rgba(12,26,46,.13)}
/* the real anchor still takes focus — show it on the card it now controls */
.acard:focus-within,.pbody:focus-within,.svx-body:focus-within,.fcard:focus-within{
  outline:3px solid var(--nd-azure-deep,#045FCB);outline-offset:3px}
.acard a:focus-visible,.pbody a:focus-visible,.svx-body a:focus-visible,
.fcard a:focus-visible{outline:none}
@media (prefers-reduced-motion:reduce){
  .acard,.pbody,.svx-body,.fcard{transition:none}
  .acard:hover,.pbody:hover,.svx-body:hover,.fcard:hover{transform:none}
}
/* == nd-kbmm-css == */
/* ---- desktop panel ---- */
@media (min-width: 922px) {
  :root:root #menu-item-3349 .sub-menu,
  :root:root .nd-nav-kb .sub-menu{
    width:700px; left:auto; right:-40px; padding:10px;
    border-radius:12px; box-shadow:0 18px 44px -12px rgba(7,20,40,.35);
    border:1px solid rgba(3,117,253,.16);
  }
  :root:root .ndmm{ display:grid; grid-template-columns:1fr 1fr 1.25fr; gap:6px; padding:10px 6px; }
}
:root:root .ndmm-item{ list-style:none; }
:root:root .ndmm-h{
  font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace);
  font-size:12.5px; font-weight:600; letter-spacing:.13em; text-transform:uppercase;
  color:var(--nd-muted,#5C6E86); margin:4px 12px 6px; padding-bottom:6px;
  border-bottom:1px solid rgba(3,117,253,.14);
}
:root:root .ndmm-col a{
  display:block; padding:8px 12px; border-radius:8px; text-decoration:none;
  font-size:14px; line-height:1.35; color:var(--nd-ink,#0C1A2E); font-weight:500;
}
:root:root .ndmm-col a:hover{ background:var(--nd-foam,#F6FAFD); color:var(--nd-azure-deep,#045FCB); }
:root:root .ndmm-col a:focus-visible{ outline:3px solid var(--nd-focus,#5AA6FF); outline-offset:-2px; }
:root:root .ndmm-feat a.ndmm-case, :root:root #menu-item-3349 .ndmm-feat a.ndmm-case,
  :root:root .nd-nav-kb .ndmm-feat a.ndmm-case{
  display:flex; flex-direction:column; gap:3px; background:#071428 !important;
  border-radius:10px; padding:12px 14px; margin:0 0 6px;
}
:root:root .ndmm-feat a.ndmm-case:hover{ background:#0b1d3a !important; }
:root:root .ndmm-ck{
  font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace);
  font-size:12.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--nd-amber,#FFB25A);
}
:root:root .ndmm-case .ndmm-ct{ color:#fff !important; font-weight:600; font-size:14px; line-height:1.35; }
:root:root .ndmm-case .ndmm-cd{ color:#c3d3e8 !important; font-size:12.8px; font-variant-numeric:tabular-nums; }
/* ---- mobile drawer: stack the columns, restore the CTA button ---- */
@media (max-width: 921.98px) {
  :root:root .ndmm{ display:block; padding:2px 0 8px; }
  :root:root .ndmm-h{ margin-top:14px; }
  :root:root .ndmm-col a{ min-height:44px; display:flex; align-items:center; }
  :root:root .ndmm-feat .ndmm-case{ margin:4px 10px 8px; }
  /* the drawer renders "Send your lift case" as a plain text row — give the site's
     strongest CTA its button back at the bottom of the drawer */
  :root:root .ast-mobile-header-content .nd-header-cta > a,
  :root:root .ast-mobile-popup-content .nd-header-cta > a{
    display:flex; align-items:center; justify-content:center; min-height:48px;
    width:calc(100% - 40px); box-sizing:border-box;
    margin:14px 20px; padding:12px 18px; border-radius:8px;
    background:var(--nd-azure-deep,#045FCB); color:#fff !important; font-weight:700;
  }
}
/* == nd-solution-box-palette == */
/* ground: deck -> deep-sea, the site's own dark band */
div[style*="135deg,#1A1A2E"]{
  background:linear-gradient(135deg,var(--nd-deck,#0a1d3a) 0%,var(--nd-deep-sea,#071428) 100%)!important;
  border-radius:10px!important;
  padding:20px!important;
}
/* label: mono + azure-hi + the amber dot every other ND eyebrow carries */
div[style*="135deg,#1A1A2E"] > span[style*="#8888FF"]{
  font-family:var(--nd-font-mono,ui-monospace,Menlo,monospace)!important;
  color:var(--nd-azure-hi,#5AA6FF)!important;
  font-size:11.5px!important;
  letter-spacing:.14em!important;
  font-weight:500!important;
  display:inline-flex!important;
  align-items:center!important;
  gap:.6em!important;
}
div[style*="135deg,#1A1A2E"] > span[style*="#8888FF"]::before{
  content:""!important;
  width:5px;height:5px;border-radius:50%;flex:none;
  background:var(--nd-amber,#FFB25A);
  box-shadow:0 0 6px var(--nd-amber,#FFB25A);
}
/* product link */
div[style*="135deg,#1A1A2E"] strong{
  font-size:17px!important;
  letter-spacing:-.01em!important;
  margin-top:9px!important;
}
/* description: the site's lede-on-dark */
div[style*="135deg,#1A1A2E"] > span[style*="#AAAACC"]{
  color:var(--nd-lede,#C4D2E6)!important;
  font-size:13.5px!important;
  line-height:1.5!important;
  display:block!important;
  margin-top:6px!important;
}
/* == nd-dcard-chips == */
.dcard li a{
  display:inline-flex;align-items:center;min-height:36px;
  padding:7px 14px;margin:3px 3px 3px 0;
  border-radius:999px;
  font-weight:700;font-size:13.5px;line-height:1;
  color:var(--nd-azure-deep,#045FCB);
  background:color-mix(in srgb,var(--nd-azure-deep,#045FCB) 7%,#fff);
  border:1px solid color-mix(in srgb,var(--nd-azure-deep,#045FCB) 24%,#fff);
  text-decoration:none;
  transition:background .15s ease,color .15s ease,border-color .15s ease}
.dcard li a:hover{
  background:var(--nd-azure-deep,#045FCB);
  border-color:var(--nd-azure-deep,#045FCB);
  color:#fff}
.dcard li a:focus-visible{
  outline:3px solid var(--nd-azure-deep,#045FCB);outline-offset:2px}
/* the "Products:" bullet now carries chips — label on its own line so all three
   cards break the same way instead of orphaning the capacity ranges mid-wrap */
.dcard li:has(a){line-height:1.75}
.dcard li:has(a) > b{display:block;margin-bottom:2px}
@media (prefers-reduced-motion:reduce){.dcard li a{transition:none}}
/* == nd-table-typography == */
.tbl-scroll td,.tbl-scroll th,.tdtable.cmp td,.tdtable.cmp th,.cyg-opgrid td,.cyg-opgrid th,.cyg-table td,.cyg-table th,.nd-pp-spectable td,.nd-pp-spectable th,.n103-tbl td,.n103-tbl th,.n378-tbl td,.n378-tbl th,.nahc-tbl td,.nahc-tbl th,.naph-tbl td,.naph-tbl th,.navp-tbl td,.navp-tbl th,.ndd-tbl td,.ndd-tbl th,.ndec-tbl td,.ndec-tbl th,.ndnv-tbl td,.ndnv-tbl th,.nmru-tbl td,.nmru-tbl th,.nn1-tbl td,.nn1-tbl th,.noct-tbl td,.noct-tbl th,.nphc-tbl td,.nphc-tbl th,.nplr-tbl td,.nplr-tbl th,.nqkl-tbl td,.nqkl-tbl th,.nres-tbl td,.nres-tbl th,.nret-tbl td,.nret-tbl th,.nrsr-tbl td,.nrsr-tbl th,.nshk-tbl td,.nshk-tbl th,.nspz-tbl td,.nspz-tbl th,.nsub-tbl td,.nsub-tbl th,.ntfl-tbl td,.ntfl-tbl th,.nwav-tbl td,.nwav-tbl th,.nwnd-tbl td,.nwnd-tbl th,.nww-tbl td,.nww-tbl th{
  overflow-wrap:break-word;
  word-break:normal;
  hyphens:auto;
  -webkit-hyphens:auto}
.tbl-scroll td .katex,.tbl-scroll td code,.tbl-scroll td .mono,.tbl-scroll th .katex,.tbl-scroll th code,.tbl-scroll th .mono,.tdtable.cmp td .katex,.tdtable.cmp td code,.tdtable.cmp td .mono,.tdtable.cmp th .katex,.tdtable.cmp th code,.tdtable.cmp th .mono,.cyg-opgrid td .katex,.cyg-opgrid td code,.cyg-opgrid td .mono,.cyg-opgrid th .katex,.cyg-opgrid th code,.cyg-opgrid th .mono,.cyg-table td .katex,.cyg-table td code,.cyg-table td .mono,.cyg-table th .katex,.cyg-table th code,.cyg-table th .mono,.nd-pp-spectable td .katex,.nd-pp-spectable td code,.nd-pp-spectable td .mono,.nd-pp-spectable th .katex,.nd-pp-spectable th code,.nd-pp-spectable th .mono,.n103-tbl td .katex,.n103-tbl td code,.n103-tbl td .mono,.n103-tbl th .katex,.n103-tbl th code,.n103-tbl th .mono,.n378-tbl td .katex,.n378-tbl td code,.n378-tbl td .mono,.n378-tbl th .katex,.n378-tbl th code,.n378-tbl th .mono,.nahc-tbl td .katex,.nahc-tbl td code,.nahc-tbl td .mono,.nahc-tbl th .katex,.nahc-tbl th code,.nahc-tbl th .mono,.naph-tbl td .katex,.naph-tbl td code,.naph-tbl td .mono,.naph-tbl th .katex,.naph-tbl th code,.naph-tbl th .mono,.navp-tbl td .katex,.navp-tbl td code,.navp-tbl td .mono,.navp-tbl th .katex,.navp-tbl th code,.navp-tbl th .mono,.ndd-tbl td .katex,.ndd-tbl td code,.ndd-tbl td .mono,.ndd-tbl th .katex,.ndd-tbl th code,.ndd-tbl th .mono,.ndec-tbl td .katex,.ndec-tbl td code,.ndec-tbl td .mono,.ndec-tbl th .katex,.ndec-tbl th code,.ndec-tbl th .mono,.ndnv-tbl td .katex,.ndnv-tbl td code,.ndnv-tbl td .mono,.ndnv-tbl th .katex,.ndnv-tbl th code,.ndnv-tbl th .mono,.nmru-tbl td .katex,.nmru-tbl td code,.nmru-tbl td .mono,.nmru-tbl th .katex,.nmru-tbl th code,.nmru-tbl th .mono,.nn1-tbl td .katex,.nn1-tbl td code,.nn1-tbl td .mono,.nn1-tbl th .katex,.nn1-tbl th code,.nn1-tbl th .mono,.noct-tbl td .katex,.noct-tbl td code,.noct-tbl td .mono,.noct-tbl th .katex,.noct-tbl th code,.noct-tbl th .mono,.nphc-tbl td .katex,.nphc-tbl td code,.nphc-tbl td .mono,.nphc-tbl th .katex,.nphc-tbl th code,.nphc-tbl th .mono,.nplr-tbl td .katex,.nplr-tbl td code,.nplr-tbl td .mono,.nplr-tbl th .katex,.nplr-tbl th code,.nplr-tbl th .mono,.nqkl-tbl td .katex,.nqkl-tbl td code,.nqkl-tbl td .mono,.nqkl-tbl th .katex,.nqkl-tbl th code,.nqkl-tbl th .mono,.nres-tbl td .katex,.nres-tbl td code,.nres-tbl td .mono,.nres-tbl th .katex,.nres-tbl th code,.nres-tbl th .mono,.nret-tbl td .katex,.nret-tbl td code,.nret-tbl td .mono,.nret-tbl th .katex,.nret-tbl th code,.nret-tbl th .mono,.nrsr-tbl td .katex,.nrsr-tbl td code,.nrsr-tbl td .mono,.nrsr-tbl th .katex,.nrsr-tbl th code,.nrsr-tbl th .mono,.nshk-tbl td .katex,.nshk-tbl td code,.nshk-tbl td .mono,.nshk-tbl th .katex,.nshk-tbl th code,.nshk-tbl th .mono,.nspz-tbl td .katex,.nspz-tbl td code,.nspz-tbl td .mono,.nspz-tbl th .katex,.nspz-tbl th code,.nspz-tbl th .mono,.nsub-tbl td .katex,.nsub-tbl td code,.nsub-tbl td .mono,.nsub-tbl th .katex,.nsub-tbl th code,.nsub-tbl th .mono,.ntfl-tbl td .katex,.ntfl-tbl td code,.ntfl-tbl td .mono,.ntfl-tbl th .katex,.ntfl-tbl th code,.ntfl-tbl th .mono,.nwav-tbl td .katex,.nwav-tbl td code,.nwav-tbl td .mono,.nwav-tbl th .katex,.nwav-tbl th code,.nwav-tbl th .mono,.nwnd-tbl td .katex,.nwnd-tbl td code,.nwnd-tbl td .mono,.nwnd-tbl th .katex,.nwnd-tbl th code,.nwnd-tbl th .mono,.nww-tbl td .katex,.nww-tbl td code,.nww-tbl td .mono,.nww-tbl th .katex,.nww-tbl th code,.nww-tbl th .mono{
  hyphens:none;-webkit-hyphens:none;overflow-wrap:normal}
/* == nd-layout-fixes == */
@media(min-width:922px){
html[lang="es-ES"] .main-header-menu .menu-item>.menu-link,
html[lang="fr-FR"] .main-header-menu .menu-item>.menu-link,
html[lang="pt-PT"] .main-header-menu .menu-item>.menu-link,
html[lang="pt-BR"] .main-header-menu .menu-item>.menu-link{padding-left:8px;padding-right:8px;font-size:13px}
html[lang="fr-FR"] .main-header-menu .menu-item>.menu-link{padding-left:6px;padding-right:6px;font-size:12.5px}
html[lang="es-ES"] .ast-primary-header-bar .nd-header-cta>.menu-link,
html[lang="fr-FR"] .ast-primary-header-bar .nd-header-cta>.menu-link,
html[lang="pt-PT"] .ast-primary-header-bar .nd-header-cta>.menu-link,
html[lang="pt-BR"] .ast-primary-header-bar .nd-header-cta>.menu-link{padding-left:12px!important;padding-right:12px!important;margin-left:4px}
html[lang="es-ES"] .ast-primary-header-bar .custom-logo-link img,
html[lang="fr-FR"] .ast-primary-header-bar .custom-logo-link img,
html[lang="pt-PT"] .ast-primary-header-bar .custom-logo-link img,
html[lang="pt-BR"] .ast-primary-header-bar .custom-logo-link img,
html[lang="es-ES"] .ast-primary-header-bar .site-logo-img img,
html[lang="fr-FR"] .ast-primary-header-bar .site-logo-img img,
html[lang="pt-PT"] .ast-primary-header-bar .site-logo-img img,
html[lang="pt-BR"] .ast-primary-header-bar .site-logo-img img{width:250px;max-width:250px}
html[lang="es-ES"] .ast-builder-grid-row,
html[lang="fr-FR"] .ast-builder-grid-row,
html[lang="pt-PT"] .ast-builder-grid-row,
html[lang="pt-BR"] .ast-builder-grid-row{min-width:0}
}
@media(max-width:980px){
:root:root .ndhc .eng{grid-template-columns:minmax(0,1fr)!important}
:root:root .ndhc .eng>*{min-width:0!important}
:root:root .ndhc .figcard{width:100%;max-width:100%;min-width:0;box-sizing:border-box}
}
@media(max-width:640px){
:root:root .cygp .hero .ctas .btn,:root:root .sir .hero .ctas .btn,:root:root .vga .hero .ctas .btn{white-space:normal;max-width:100%;min-width:0;box-sizing:border-box;line-height:1.3;text-align:left;overflow-wrap:anywhere}
:root:root .cygp .stickycta .btn,:root:root .sir .stickycta .btn,:root:root .vga .stickycta .btn{white-space:normal;min-width:0;box-sizing:border-box;line-height:1.25;text-align:center;overflow-wrap:anywhere;padding-top:12px;padding-bottom:12px}
}
/* == nd-cyg-table-responsive == */
@media(max-width:900px){.cyg-tech{grid-template-columns:1fr!important}}
@media(max-width:520px){.cyg-table{overflow-x:auto!important}.cyg-table table{min-width:0}.cyg-table td{padding-left:14px!important;padding-right:14px!important;word-break:break-word}.cyg-table td:first-child{width:auto!important}.cyg-num{white-space:normal!important}}
/* == nd-k9-css == */
.nd-k9-gate{--k9-navy:#01205F;--k9-azure:#045FCB;background:linear-gradient(160deg,#022869 0%,#01205F 58%,#011543 100%);color:#fff;margin:56px 0 0;padding:44px 0;border-radius:4px}
.nd-k9-gate .nd-k9-inner{display:grid;grid-template-columns:1.05fr .95fr;gap:44px;max-width:1100px;margin:0 auto;padding:0 32px;align-items:start}
.nd-k9-gate .nd-k9-eyebrow{font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:#7FB4FF;margin:0 0 10px}
.nd-k9-gate h2{color:#fff!important;font-size:29px;line-height:1.22;margin:0 0 14px;font-weight:700}
.nd-k9-gate .nd-k9-lede{color:rgba(255,255,255,.86);font-size:16px;line-height:1.6;margin:0 0 18px}
.nd-k9-gate .nd-k9-list{list-style:none;margin:0;padding:0}
.nd-k9-gate .nd-k9-list li{position:relative;padding-left:22px;margin-bottom:9px;color:rgba(255,255,255,.86);font-size:15px;line-height:1.5}
.nd-k9-gate .nd-k9-list li::before{content:"";position:absolute;left:0;top:8px;width:8px;height:8px;background:#7FB4FF}
.nd-k9-gate .nd-k9-form{background:#fff;border-radius:3px;padding:26px 24px}
.nd-k9-gate .nd-k9-form label,.nd-k9-gate .nd-k9-form .wpforms-field-label{color:var(--k9-navy)!important;font-weight:600}
.nd-k9-gate .nd-k9-form .wpforms-field-sublabel,.nd-k9-gate .nd-k9-form .wpforms-field-description{color:#5A6B85!important}
.nd-k9-gate .nd-k9-form input[type=text],.nd-k9-gate .nd-k9-form input[type=email]{width:100%!important}
.nd-k9-gate .nd-k9-form button[type=submit]{background:var(--k9-azure)!important;border-color:var(--k9-azure)!important;color:#fff!important;width:100%}
.nd-k9-gate .nd-k9-form button[type=submit]:hover{background:#0350ad!important;border-color:#0350ad!important}
.nd-k9-gate.nd-k9-compact{padding:34px 0}
.nd-k9-gate .nd-k9-inner--compact{grid-template-columns:1fr;max-width:860px}
.nd-k9-gate .nd-k9-go{display:inline-flex;align-items:center;min-height:46px;padding:12px 22px;background:var(--k9-azure);color:#fff!important;font-weight:700;text-decoration:none;border-radius:8px}
.nd-k9-gate .nd-k9-go:hover{background:#0350ad}
/* the field row is float-based on these pages, not flex — do not disable the clearfix */
@media (max-width:880px){.nd-k9-gate .nd-k9-inner{grid-template-columns:1fr;gap:28px;padding:0 22px}.nd-k9-gate h2{font-size:24px}}
/* == nd-menu-nowrap == */
@media (min-width: 922px) {
        .main-header-menu,
        .ast-builder-menu .main-header-menu,
        .ast-builder-menu-1 .main-header-menu {
          flex-wrap: nowrap !important;
        }
        .main-header-menu > .menu-item > a,
        .ast-builder-menu-1 .main-header-menu > .menu-item > a {
          white-space: nowrap !important;
        }
      }
/* == nd-wpf-antispam-hide == */
.wpforms-form .wpforms-field-hp,.wpforms-form .wpforms-field:not([data-field-id]){display:none!important}
/* == nd-twin-measure-fix == */
:root:root:root body.nd-twin-elementor p.nd-b2h{max-width:860px!important}
/* == nd-wpforms-field-align == */
/* NB: these forms render inside div.wpforms-container, NOT .wpforms-container-full — do not
   prefix with the -full variant or the rules silently stop matching (verified 2026-07-25). */

/* Force the flex layout on EVERY form. Without this, forms still on the legacy float layout
   collapse to height 0 once the clearfix below is disabled (regression 2026-07-26).
   Where the row is already flex this is a no-op — it restates the values WPForms sets. */
.wpforms-form .wpforms-field-row{
  display:flex!important;
  gap:16px!important;
  align-items:flex-start!important;
}

/* neutralise the legacy clearfix pseudo-elements — they act as flex items and offset the row */
.wpforms-form .wpforms-field-row::before,
.wpforms-form .wpforms-field-row::after{display:none!important;content:none!important}

/* drop the float-era gutter; the row's own `gap` already provides the spacing */
.wpforms-form .wpforms-field-row-block{margin-left:0!important;margin-right:0!important}

/* let the blocks share the row evenly instead of falling back to a 100px basis.
   flex-basis:0 also makes the legacy percentage widths irrelevant. */
.wpforms-form .wpforms-field-row-block{flex:1 1 0!important;min-width:0!important}

/* Stack the sub-fields on narrow screens rather than crushing First/Last to ~70px. */
@media (max-width:600px){
  .wpforms-form .wpforms-field-row{flex-direction:column!important;gap:8px!important}
}
/* == nd-rfq-attach-css == */
/* ---------------------------------------------------------------------------------------------
 * A. NO-JS FALLBACK — the native control, styled to match its siblings (as shipped 2026-07-25).
 *
 * The templates style input[type=text]/[email]/textarea but never input[type=file], so this field
 * inherits nothing and has to mirror its siblings itself. Values below are MEASURED off the live
 * forms (2026-07-25), not guessed:
 *   light  (/contact/)  text inputs: #fff on #6E7C90 border, 16px
 *   dark   (product RFQ) text inputs: rgba(255,255,255,.08) on rgba(90,166,255,.25), 16px, #fff text
 * Width matches the TEXTAREA directly above it (100%), not the 60% of the short text inputs — the
 * attachment reads as part of the same "describe your case" block.
 * NB: the input deliberately does NOT carry `wpforms-field-medium` — that class opts an element into
 * WPForms' `max-width:60%` rule, which capped this field at 344px against the textarea's 574px.
 * ------------------------------------------------------------------------------------------- */
.nd-rfq-attach-field:not(.is-on) .nd-rfq-input{display:block;width:100%;max-width:100%;box-sizing:border-box;
  padding:11px 12px;border:1px solid #6E7C90;border-radius:4px;background:#fff;
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif);font-size:16px;line-height:1.4;
  color:var(--nd-ink,#0C1A2E);cursor:pointer}
/* dark RFQ bands on the product skins */
.rgl .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,.cygp .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,
.ant .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,.pol .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,
.vga .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,.sir .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,
.con .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,.chyd .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,
.prov .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,.band-deck .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,
.band-abyss .nd-rfq-attach-field:not(.is-on) .nd-rfq-input,.band-deep .nd-rfq-attach-field:not(.is-on) .nd-rfq-input{
  background:rgba(255,255,255,.08);color:#fff;border-color:rgba(90,166,255,.25)}
.nd-rfq-attach-field:not(.is-on) .nd-rfq-input::file-selector-button{margin-right:12px;padding:8px 15px;border:0;
  border-radius:4px;background:var(--nd-azure-deep,#045FCB);color:#fff;font-weight:700;font-size:14px;
  font-family:inherit;cursor:pointer}
.nd-rfq-attach-field:not(.is-on) .nd-rfq-input::-webkit-file-upload-button{margin-right:12px;padding:8px 15px;border:0;
  border-radius:4px;background:var(--nd-azure-deep,#045FCB);color:#fff;font-weight:700;font-size:14px;
  font-family:inherit;cursor:pointer}
.nd-rfq-attach-field:not(.is-on) .nd-rfq-input:focus-visible{outline:3px solid var(--nd-azure-hi,#5AA6FF);outline-offset:2px}
.nd-rfq-attach-field:not(.is-on) .nd-rfq-chrome{display:none}
.nd-rfq-attach-field .nd-rfq-optional{font-weight:400;text-transform:none;letter-spacing:0;opacity:.7}

/* ---------------------------------------------------------------------------------------------
 * B. BRANDED PICKER — only once the script has marked the field `.is-on`.
 *
 * The real input is stretched over the whole zone at opacity 0. That is what keeps this thing
 * honest: the click that opens the file dialog, the Space/Enter activation from the keyboard, and
 * the drop of a file onto the zone are all handled by the browser's own file input, not by script.
 * ------------------------------------------------------------------------------------------- */
.nd-rfq-attach-field.is-on .nd-rfq-drop{position:relative;display:block;box-sizing:border-box;
  border:1.5px dashed #6E7C90;border-radius:6px;background:#fff;padding:16px;
  transition:border-color .16s,background-color .16s}
.nd-rfq-attach-field.is-on .nd-rfq-input{position:absolute;inset:0;width:100%;height:100%;
  margin:0;padding:0;border:0;background:none;opacity:0;font-size:0;cursor:pointer}
.nd-rfq-attach-field.is-on .nd-rfq-chrome{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  pointer-events:none}
.nd-rfq-attach-field.is-on .nd-rfq-btn{display:inline-block;padding:9px 16px;border-radius:4px;
  background:var(--nd-azure-deep,#045FCB);color:#fff;font-weight:700;font-size:14px;line-height:1.2;
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif)}
.nd-rfq-attach-field.is-on .nd-rfq-hint{font-size:var(--nd-label-min,12.5px);line-height:1.45;
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif)}
/* colour is deliberately declared at LOW specificity (0-1-0), separately from the sizing rule
   above (0-3-0): the dark-band overrides further down are 0-2-0, and a colour bundled into the
   .is-on rule would outrank them — which is exactly how the hint first shipped at 3.05:1 on the
   product RFQ bands. Keep any new colour for these parts at this specificity. */
.nd-rfq-hint{color:#5C6E86}
.nd-rfq-attach-field.is-on .nd-rfq-drop:hover{border-color:var(--nd-azure,#0375FD)}
/* the input is transparent, so the visible focus ring has to come from its wrapper */
.nd-rfq-attach-field.is-on .nd-rfq-drop:focus-within{border-color:var(--nd-azure,#0375FD);
  outline:3px solid var(--nd-azure-hi,#5AA6FF);outline-offset:2px}
.nd-rfq-attach-field.is-on .nd-rfq-drop.is-drag{border-color:var(--nd-azure,#0375FD);
  border-style:solid;background:rgba(3,117,253,.07)}

/* selected files */
.nd-rfq-attach-field .nd-rfq-list{list-style:none;margin:10px 0 0;padding:0;display:flex;
  flex-direction:column;gap:6px}
.nd-rfq-attach-field .nd-rfq-list li{display:flex;align-items:center;gap:10px;margin:0;padding:8px 10px;
  border:1px solid #d5dfec;border-radius:4px;background:#f6fafd;
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif);font-size:14px;line-height:1.4;
  color:var(--nd-ink,#0C1A2E)}
.nd-rfq-attach-field .nd-rfq-list li::marker{content:""}
.nd-rfq-attach-field .nd-rfq-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.nd-rfq-attach-field .nd-rfq-size{flex:none;color:#5C6E86;font-size:var(--nd-label-min,12.5px);
  font-variant-numeric:tabular-nums}
.nd-rfq-attach-field .nd-rfq-x{flex:none;width:26px;height:26px;padding:0;border:1px solid #c6d3e4;
  border-radius:4px;background:#fff;color:#5C6E86;font:700 15px/1 system-ui,sans-serif;cursor:pointer}
.nd-rfq-attach-field .nd-rfq-x:hover{border-color:#c0392b;color:#c0392b}
.nd-rfq-attach-field .nd-rfq-x:focus-visible{outline:3px solid var(--nd-azure-hi,#5AA6FF);outline-offset:2px}
.nd-rfq-attach-field .nd-rfq-say{margin:8px 0 0;font-size:var(--nd-label-min,12.5px);line-height:1.5;
  color:#5C6E86;font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif)}
/* the live region stays in the accessibility tree at all times — a region toggled through
   display:none is not reliably announced when it comes back */
.nd-rfq-attach-field .nd-rfq-say:empty{margin:0}
.nd-rfq-attach-field .nd-rfq-say.is-err{color:#c0392b}
.nd-rfq-attach-field.is-err.is-on .nd-rfq-drop{border-color:#c0392b}

/* dark RFQ bands on the product skins */
.rgl .nd-rfq-attach-field.is-on .nd-rfq-drop,.cygp .nd-rfq-attach-field.is-on .nd-rfq-drop,
.ant .nd-rfq-attach-field.is-on .nd-rfq-drop,.pol .nd-rfq-attach-field.is-on .nd-rfq-drop,
.vga .nd-rfq-attach-field.is-on .nd-rfq-drop,.sir .nd-rfq-attach-field.is-on .nd-rfq-drop,
.con .nd-rfq-attach-field.is-on .nd-rfq-drop,.chyd .nd-rfq-attach-field.is-on .nd-rfq-drop,
.prov .nd-rfq-attach-field.is-on .nd-rfq-drop,.band-deck .nd-rfq-attach-field.is-on .nd-rfq-drop,
.band-abyss .nd-rfq-attach-field.is-on .nd-rfq-drop,.band-deep .nd-rfq-attach-field.is-on .nd-rfq-drop{
  background:rgba(255,255,255,.05);border-color:rgba(90,166,255,.45)}
.rgl .nd-rfq-hint,.cygp .nd-rfq-hint,.ant .nd-rfq-hint,.pol .nd-rfq-hint,.vga .nd-rfq-hint,
.sir .nd-rfq-hint,.con .nd-rfq-hint,.chyd .nd-rfq-hint,.prov .nd-rfq-hint,
.band-deck .nd-rfq-hint,.band-abyss .nd-rfq-hint,.band-deep .nd-rfq-hint,
.rgl .nd-rfq-say,.cygp .nd-rfq-say,.ant .nd-rfq-say,.pol .nd-rfq-say,.vga .nd-rfq-say,
.sir .nd-rfq-say,.con .nd-rfq-say,.chyd .nd-rfq-say,.prov .nd-rfq-say,
.band-deck .nd-rfq-say,.band-abyss .nd-rfq-say,.band-deep .nd-rfq-say{color:#c7d6ea}
.rgl .nd-rfq-list li,.cygp .nd-rfq-list li,.ant .nd-rfq-list li,.pol .nd-rfq-list li,
.vga .nd-rfq-list li,.sir .nd-rfq-list li,.con .nd-rfq-list li,.chyd .nd-rfq-list li,
.prov .nd-rfq-list li,.band-deck .nd-rfq-list li,.band-abyss .nd-rfq-list li,.band-deep .nd-rfq-list li{
  background:rgba(255,255,255,.06);border-color:rgba(90,166,255,.28);color:#fff}
.rgl .nd-rfq-size,.cygp .nd-rfq-size,.ant .nd-rfq-size,.pol .nd-rfq-size,.vga .nd-rfq-size,
.sir .nd-rfq-size,.con .nd-rfq-size,.chyd .nd-rfq-size,.prov .nd-rfq-size,
.band-deck .nd-rfq-size,.band-abyss .nd-rfq-size,.band-deep .nd-rfq-size{color:#c7d6ea}
.rgl .nd-rfq-x,.cygp .nd-rfq-x,.ant .nd-rfq-x,.pol .nd-rfq-x,.vga .nd-rfq-x,.sir .nd-rfq-x,
.con .nd-rfq-x,.chyd .nd-rfq-x,.prov .nd-rfq-x,.band-deck .nd-rfq-x,.band-abyss .nd-rfq-x,
.band-deep .nd-rfq-x{background:transparent;border-color:rgba(90,166,255,.4);color:#c7d6ea}
.rgl .nd-rfq-x:hover,.cygp .nd-rfq-x:hover,.ant .nd-rfq-x:hover,.pol .nd-rfq-x:hover,
.vga .nd-rfq-x:hover,.sir .nd-rfq-x:hover,.con .nd-rfq-x:hover,.chyd .nd-rfq-x:hover,
.prov .nd-rfq-x:hover,.band-deck .nd-rfq-x:hover,.band-abyss .nd-rfq-x:hover,.band-deep .nd-rfq-x:hover{
  border-color:#ff8a80;color:#ff8a80}
.rgl .nd-rfq-say.is-err,.cygp .nd-rfq-say.is-err,.ant .nd-rfq-say.is-err,.pol .nd-rfq-say.is-err,
.vga .nd-rfq-say.is-err,.sir .nd-rfq-say.is-err,.con .nd-rfq-say.is-err,.chyd .nd-rfq-say.is-err,
.prov .nd-rfq-say.is-err,.band-deck .nd-rfq-say.is-err,.band-abyss .nd-rfq-say.is-err,
.band-deep .nd-rfq-say.is-err{color:#ff8a80}
.rgl .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,.cygp .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,
.ant .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,.pol .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,
.vga .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,.sir .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,
.con .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,.chyd .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,
.prov .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,.band-deck .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,
.band-abyss .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop,.band-deep .nd-rfq-attach-field.is-err.is-on .nd-rfq-drop{
  border-color:#ff8a80}

@media (prefers-reduced-motion:reduce){
  .nd-rfq-attach-field.is-on .nd-rfq-drop{transition:none}
}
/* == nd-panel-css-fixes == */
/* ---- E3: restore the focus ring on form controls -------------------------------------------------
 * Astra ships a bare `input{outline:none}` (no :focus qualifier) on every page, and its only
 * replacement is a border-colour change — which native checkboxes ignore. So on the RFQ checkbox
 * groups (GA drawing / calculation sheet / OrcaFlex model ...) a keyboard user could not see what
 * Space was about to toggle. WCAG 2.4.7. */
input:focus-visible, select:focus-visible, textarea:focus-visible,
[type="checkbox"]:focus-visible, [type="radio"]:focus-visible, button:focus-visible {
  outline: 3px solid #045FCB !important;   /* 5.99:1 on light ground */
  outline-offset: 2px !important;
}
/* on the dark product/RFQ bands the deep azure disappears — use the light token there */
.rgl input:focus-visible, .cygp input:focus-visible, .ant input:focus-visible, .pol input:focus-visible,
.vga input:focus-visible, .sir input:focus-visible, .con input:focus-visible, .chyd input:focus-visible,
.prov input:focus-visible, .band-deck input:focus-visible, .band-abyss input:focus-visible,
.rgl textarea:focus-visible, .cygp textarea:focus-visible, .ant textarea:focus-visible,
.pol textarea:focus-visible, .chyd textarea:focus-visible, .prov textarea:focus-visible,
.rgl [type="checkbox"]:focus-visible, .cygp [type="checkbox"]:focus-visible,
.ant [type="checkbox"]:focus-visible, .pol [type="checkbox"]:focus-visible,
.chyd [type="checkbox"]:focus-visible, .prov [type="checkbox"]:focus-visible {
  outline-color: #5AA6FF !important;       /* 6.07:1 on the navy grounds */
}

/* ---- C4: /knowledge-hub/operability-screening/ rendered its whole body in the OS UI font ----------
 * `.ndcap{font-family:-apple-system,...}` wrapped 63 elements including both CTAs, so the CONSTELLATION
 * service pitch looked different on every operating system and matched no other page. */
.ndcap, .ndcap p, .ndcap li, .ndcap td, .ndcap th, .ndcap span, .ndcap div {
  font-family: var(--nd-font-body, 'DM Sans', system-ui, sans-serif) !important;
}
.ndcap h1, .ndcap h2, .ndcap h3, .ndcap h4 {
  font-family: var(--nd-font-display, 'Lexend', system-ui, sans-serif) !important;
}

/* ---- C5: Knowledge Hub line length ---------------------------------------------------------------
 * The KB skin set no measure, so body copy ran 95-106 characters per line on desktop — ~40% over a
 * readable measure, on the site's largest reading surface. Every rebuilt template already sets 52-58ch.
 * Tables, figures and embeds keep full width. */
/* NB: KB articles do NOT carry a .nd-kbskin body class — the reliable hook is that every article is a
   child of the Knowledge Hub page (body.parent-pageid-7169). Body copy here is 14px, so 654px was
   ~93 characters per line. */
body.parent-pageid-7169 .elementor-widget-container > p,
body.parent-pageid-7169 .elementor-widget-container > ul > li,
body.parent-pageid-7169 .elementor-widget-container > ol > li {
  /* NOT ch: 1ch is the width of "0", which in DM Sans is ~9.6px at 14px text, so 72ch resolved to
     692px = the full container and changed nothing. Real prose averages ~0.49em per character here,
     so 36em gives ~74 characters per line, down from ~95. */
  max-width: 36em !important;
}

/* ---- D6: footer tap targets ----------------------------------------------------------------------
 * Below 680px the footer collapses to one column: ~40 links at an 18px hit box on a 26px pitch, so a
 * thumb aimed at POLARIS lands on VEGA. Padding gives ~44px with no change to desktop rhythm. */
@media (max-width: 680px) {
  .nd-footer-list { gap: 0 !important; }
  .nd-footer-list a { display: block; padding: 11px 0; line-height: 1.3; }
}
/* == nd-type-scale == */
:root{
  --nd-h1-statement: clamp(36px, 4.5vw, 58px); /* 2026-08-01: was 82px cap — aligned to the 58px home-hero scale (Tord: services/about read as a different font) */
  --nd-h1-page:      clamp(34px, 4.0vw, 52px);
  --nd-h1-article:   clamp(30px, 3.2vw, 44px);
  --nd-h1-weight: 700;
  --nd-h1-track: -.024em;
}
/* every step shares weight + tracking + display face; only size and line-height differ */
h1.svx-h1,
#nd-about-redesign .sl-h1, #nd-contact-redesign .sl-h1, #nd-contact-redesign .ct-h1,
.ndhc h1, .ndcx-hero h1, .ndcap h1,
.prov .h1, .rgl .h1, .cygp .h1, .ant .h1, .pol .h1, .vga .h1, .sir .h1, .con .h1, .chyd .h1, .khub .h1,
body.parent-pageid-7169 h1.elementor-heading-title,
.nd-tfl h1 {
  font-family: var(--nd-font-display, 'Lexend', system-ui, sans-serif) !important;
  font-weight: var(--nd-h1-weight) !important;
  letter-spacing: var(--nd-h1-track) !important;
}

/* ---- statement: the full-width text heroes ---- */
h1.svx-h1,
#nd-about-redesign .sl-h1,
#nd-contact-redesign .sl-h1, #nd-contact-redesign .ct-h1 {
  font-size: var(--nd-h1-statement) !important;
  line-height: 1.02 !important;
}

/* ---- page: commercial surfaces and the tool pages ---- */
.ndhc h1, .ndcx-hero h1, .ndcap h1,
.prov .h1, .rgl .h1, .cygp .h1, .ant .h1, .pol .h1, .vga .h1, .sir .h1, .con .h1, .chyd .h1 {
  font-size: var(--nd-h1-page) !important;
  line-height: 1.08 !important;
}

/* ---- article: KB reference reading ---- */
body.parent-pageid-7169 h1.elementor-heading-title,
.khub .h1, .nd-tfl h1 {
  font-size: var(--nd-h1-article) !important;
  line-height: 1.14 !important;
}

/* Home is deliberately NOT resized here. Its h1 sits in a composed hero with an inline image and its own
   responsive block (nd-home-hero-responsive-v32); forcing a step onto it reflows that composition. It
   already sits between the statement and page steps at 58px/700, which is coherent. */
/* == nd-label-floor == */
:root{
  --nd-label-min: 12.5px;   /* desktop metadata floor */
  --nd-label-min-lh: 1.4;
}
@media (max-width:768px){
  :root{ --nd-label-min: 13px; }   /* Astra drops the root to 91.2% here; px keeps the floor honest */
}
/* --- site chrome (footer, on every page) --- */
:root:root .nd-footer-title,
:root:root .nd-f-dev{ font-size: var(--nd-label-min) !important; }

/* --- Sounding Line fragments: /about/ + /contact/ --- */
:root:root #nd-about-redesign .eyebrow, :root:root #nd-contact-redesign .eyebrow,
:root:root #nd-about-redesign .kicker,  :root:root #nd-contact-redesign .kicker,
:root:root .sl-hero-eye, :root:root .sl-proof-k, :root:root .sl-scrolltip, :root:root .sl-sig-label, :root:root .sl-proc-note,
:root:root .sl-person-role, :root:root .sl-person-time, :root:root .sl-gauge-head, :root:root .sl-step-n, :root:root .sl-film-desc,
:root:root .sl-caps-also, :root:root .sl-caps-also b, :root:root .sl-cap-n, :root:root .sl-films-cap, :root:root .wmsep,
:root:root .sl-spec span, :root:root .sl-hero-readout span{ font-size: var(--nd-label-min) !important; }

@media (max-width:768px){
  :root:root .sl-gauge-row span, :root:root .sl-cta-contact a, :root:root .sl-cta-contact span,
  :root:root .sl-step-detail{ font-size: var(--nd-label-min) !important; }
}

/* --- /contact/ --- */
:root:root #nd-contact-redesign .wpforms-field-label,
:root:root #nd-contact-redesign .wpforms-field-sublabel,
:root:root #nd-contact-redesign .ct-privacy,
:root:root #nd-contact-redesign .ct-station-dl dt,
:root:root #nd-contact-redesign .ct-station-role,
:root:root #nd-contact-redesign .ct-station-coord,
:root:root #nd-contact-redesign .ct-sig-a,
:root:root #nd-contact-redesign .ct-sig-b,
:root:root #nd-contact-redesign .ct-out-deliver,
:root:root #nd-contact-redesign .ct-out-deliver-k,
:root:root #nd-contact-redesign .ct-talk-k,
:root:root #nd-contact-redesign .ct-connect-k,
:root:root #nd-contact-redesign .ct-soc{ font-size: var(--nd-label-min) !important; }
@media (max-width:768px){
  :root:root #nd-contact-redesign .wpforms-field-description,
  :root:root #nd-contact-redesign .wpforms-error,
  :root:root #nd-contact-redesign label.wpforms-error{ font-size: var(--nd-label-min) !important; }
}
/* "What comes back" was an <h2> wearing .eyebrow, so it rendered at LABEL size
   (11.5px desktop, 10.5px mobile) - under the item titles it introduces. Fixed in the
   MARKUP 2026-08-03, not here: it is now an <h3> without .eyebrow, so it takes
   --nd-h3-section (22px/600) from the Phase-1 scale like every other sub-section head.
   Nothing to override. */

/* --- RFQ + gate forms inside the product / service skins --- */
@media (max-width:768px){
  :root:root .prov .wpforms-field-label, :root:root .rgl .wpforms-field-label, :root:root .cygp .wpforms-field-label,
  :root:root .ant .wpforms-field-label,  :root:root .pol .wpforms-field-label, :root:root .vga .wpforms-field-label,
  :root:root .sir .wpforms-field-label,  :root:root .con .wpforms-field-label, :root:root .chyd .wpforms-field-label,
  :root:root .svcx .wpforms-field-label, :root:root .khub .wpforms-field-label{ font-size: var(--nd-label-min) !important; }
}
:root:root .prov .wpforms-field-sublabel, :root:root .rgl .wpforms-field-sublabel, :root:root .cygp .wpforms-field-sublabel,
:root:root .ant .wpforms-field-sublabel,  :root:root .pol .wpforms-field-sublabel, :root:root .vga .wpforms-field-sublabel,
:root:root .sir .wpforms-field-sublabel,  :root:root .con .wpforms-field-sublabel, :root:root .chyd .wpforms-field-sublabel,
:root:root .svcx .wpforms-field-sublabel, :root:root .khub .wpforms-field-sublabel{ font-size: var(--nd-label-min) !important; }

/* --- /services/ + /custom-hydraulics/ --- */
:root:root .svx-chips span, :root:root .svx-scrollcue,
:root:root .svcx .eyebrow, :root:root .svx-card .eyebrow{ font-size: var(--nd-label-min) !important; }

/* --- /products/ overview + product skins --- */
:root:root .pno, :root:root .chip, :root:root .micro, :root:root .prange, :root:root .swipecue, :root:root .nd-scrollcue,
:root:root .mxcard .mt span,
:root:root .prov td.k, :root:root .prov th.k{ font-size: var(--nd-label-min) !important; }
/* SIRIUS + VEGA carried the last sub-12px HTML text on the product pages: unit suffixes (.u) at
   9.45px, VEGA step numbers (.no) at 10.5px and the SIRIUS architecture caption at 11.5px. Scoped
   to .sir/.vga because these class names are single letters and match widely elsewhere. */
:root:root .sir .u, :root:root .vga .u,
:root:root .sir .no, :root:root .vga .no,
:root:root .sir .archcap, :root:root .vga .archcap{ font-size: var(--nd-label-min) !important; }

/* --- Knowledge Hub index cards + product/KB hero eyebrows --- */
:root:root .khub .cat, :root:root .ey{ font-size: var(--nd-label-min) !important; }

/* --- /products/constellation/ (nd-constellation-page.php is off-limits to edit, so the floor
       reaches it from here). Its label classes are single letters and two-letter names — .no,
       .rng, .l, .t, .k, .ta — so every one of them MUST stay scoped to the .con skin. --- */
:root:root .con .toclabel, :root:root .con .tocrow a,
:root:root .con .curvecard .t, :root:root .con .mxnote, :root:root .con .mxnote b,
:root:root .con .dlgrid .cell .l,
:root:root .con .cmpc .no, :root:root .con .cmpc .foot,
:root:root .con .ladc .no, :root:root .con .ladc .rng, :root:root .con .ladc .here,
:root:root .con .kbc .no, :root:root .con .phc .no,
:root:root .con .gates .gate, :root:root .con .claim .ta,
:root:root .con .rmeta, :root:root .con .rmeta a,
:root:root .con th.k, :root:root .con td.k, :root:root .con td.v .steps{ font-size: var(--nd-label-min) !important; }

/* --- home page composed sections --- */
:root:root .nd-hero-ey, :root:root .ndhero-tile-cap, :root:root .ndhero-tile-lbl,
:root:root .ndop-kpi-l, :root:root .ndop-hero-k, :root:root .ndop-basis-h, :root:root .ndop-panel-sub, :root:root .ndop-eyebrow, :root:root .ndop-gloss,
:root:root .ndwhy-label, :root:root .ndfound-label,
:root:root .ndfam-kicker, :root:root .ndsvc-kicker, :root:root .ndfound-kicker, :root:root .ndwhy-kicker, :root:root .ndapps-kicker,
:root:root .ndfam-table tbody th, :root:root .ndfam-table thead th:first-child{ font-size: var(--nd-label-min) !important; }
:root:root .ndapps-kicker{ line-height: var(--nd-label-min-lh) !important; }
@media (max-width:768px){
  :root:root .ndfam-compare-card dt,
  :root:root .ndop-legend span, :root:root .ndop-basis-gates, :root:root .ndop-caveat{ font-size: var(--nd-label-min) !important; }
  /* the hero eyebrow was pinned to 9px + white-space:nowrap so it held one line
     (nd-home-hero-responsive.php); at the floor it needs to be allowed to wrap. */
  :root:root .nd-hero-ey{ white-space: normal !important; }
}

/* --- components shared across the Knowledge Hub and product pages --- */
:root:root .nd-lead-cta__label, :root:root .nd-k9-eyebrow, :root:root .nd-fzh{ font-size: var(--nd-label-min) !important; }
@media (max-width:768px){
  :root:root .nd-k9-gate .wpforms-field-sublabel{ font-size: var(--nd-label-min) !important; }
}

/* --- Knowledge Hub article furniture (nd-daf-upgrade.php owns the markup; this is the
       shared floor reaching it, so the article plugin itself stays untouched) --- */
:root:root .nd-daf-up .ndd-rl, :root:root .nd-daf-up .ndd-el, :root:root .nd-daf-up .ndd-tag, :root:root .nd-daf-up .ndd-hero-kick,
:root:root .nd-daf-up .ndd-fs, :root:root .nd-daf-up .ndd-lgd span, :root:root .nd-daf-up .ndd-cc, :root:root .nd-daf-up .ndd-cc b,
:root:root .nd-daf-up .ndd-fig figcaption,
:root:root .nd-daf-up .ndd-tbl th{ font-size: var(--nd-label-min) !important; }
@media (max-width:768px){
  :root:root .nd-daf-up .ndd-applink, :root:root .nd-daf-up .ndd-note,
  :root:root .nd-daf-up .ndd-enote, :root:root .nd-daf-up .ndd-enote span, :root:root .nd-daf-up .ndd-enote strong,
  :root:root .nd-daf-up .ndd-enote a,
  :root:root .nd-daf-up .ndd-est label span{ font-size: var(--nd-label-min) !important; }
}

/* ============================================================================
   EYEBROW TIER LIFT — Tord's call, 2026-08-01.
   The mono uppercase micro-label idiom sat at 9–12px site-wide, under the floor
   this file establishes. Every class below was found by measuring the rendered
   pages (not guessed), so the list is the actual live inventory. Kept here rather
   than in each component plugin so parallel sessions cannot conflict, and so the
   floor has exactly one owner.
   ========================================================================== */
:root:root .nd-mm-range, :root:root .nd-mm-dev,          /* products mega-menu: spec line + IN DEV badge */
:root:root .toclabel,                                    /* "On this page" section indexes */
:root:root .kicker, :root:root .nphc-kick,
:root:root .nd-kb-funnel__eyebrow, :root:root .ndhcreel-eyebrow,
:root:root .nphc-zone b,                                 /* damping band chips */
:root:root .typechip,
:root:root .gate,
:root:root figcaption.cap,
:root:root .rmeta a,
:root:root .steps,
:root:root .case b,
:root:root .cmpc .no,                                    /* CONSTELLATION result-card kickers */
:root:root .fspec dt,                                    /* product spec definition terms */
:root:root th.k, :root:root td.k{ font-size: var(--nd-label-min) !important; }

/* Table headers are the densest "technical label" surface Sol flagged. Tables already
   sit in overflow-x wrappers with a min-width, so lifting the header text cannot
   introduce page-level overflow. */
:root:root .entry-content table th,
:root:root main table th{ font-size: var(--nd-label-min) !important; }

/* Product-page spec furniture uses very short class names (.l/.ta/.no/.dim/.here), so these
   stay scoped to their own section wrappers rather than matching globally. */
:root:root .specslab .ta, :root:root .specslab .l,
:root:root .specfig .dim,
:root:root .lane .no, :root:root .ladrow .no, :root:root .ladrow .here{ font-size: var(--nd-label-min) !important; }
/* == nd-form-privacy-css == */
.nd-form-privacy{margin:2px 0 14px;font-size:13px;line-height:1.5;color:var(--nd-muted,#5C6E86)}
.nd-form-privacy a{color:var(--nd-azure-deep,#045FCB);font-weight:600;text-decoration:underline}
.band-deck .nd-form-privacy,.band-abyss .nd-form-privacy,.band-deep .nd-form-privacy{color:rgba(255,255,255,.72)}
.band-deck .nd-form-privacy a,.band-abyss .nd-form-privacy a,.band-deep .nd-form-privacy a{color:#5AA6FF}
/* == nd-azure-contrast == */
/* ---------- 1. solid azure button fills -> #045FCB (white label = 5.99:1) ---------- */
.elementor-button.elementor-button.elementor-button.elementor-button,
button.wpforms-submit.wpforms-submit.wpforms-submit.wpforms-submit,
input.wpforms-submit.wpforms-submit.wpforms-submit.wpforms-submit,
a.ndfound-btn.ndfound-btn.ndfound-btn.ndfound-btn,
a.ndcta-btn.ndcta-btn.ndcta-btn.ndcta-btn,
a.ndop-btn-p.ndop-btn-p.ndop-btn-p, a.ndcx-btn-p.ndcx-btn-p.ndcx-btn-p,
a.ndcap-btn-p.ndcap-btn-p.ndcap-btn-p, a.ntfl-btn.ntfl-btn.ntfl-btn,
a.ndd-simcta.ndd-simcta.ndd-simcta, a.ndfam-btn.ndfam-btn.ndfam-btn,
a.ndr-cta.ndr-cta.ndr-cta,
a.ndsvc-btn.ndsvc-btn.ndsvc-btn, .nd-lead-cta__button.nd-lead-cta__button.nd-lead-cta__button,
.nd-btn.nd-btn.nd-btn, .btn.btn.btn:not(.btn-ghost) {
  background-color: #045FCB !important;
  color: #fff !important;
}
.elementor-button.elementor-button.elementor-button.elementor-button:hover,
button.wpforms-submit.wpforms-submit.wpforms-submit.wpforms-submit:hover,
a.ndfound-btn.ndfound-btn.ndfound-btn.ndfound-btn:hover,
a.ndcta-btn.ndcta-btn.ndcta-btn.ndcta-btn:hover,
a.ndr-cta.ndr-cta.ndr-cta:hover,
.nd-btn.nd-btn.nd-btn:hover, .btn.btn.btn:not(.btn-ghost):hover {
  background-color: #034FA8 !important; color: #fff !important;
}

/* Last holdout: element-scoped rules like  (home hero CTA, from nd-home-align) reach (0,4,0)+!important and beat
   the 4-class selector above.  + 5 classes = (0,5,2) settles it without hardcoding element ids. */
html body a.elementor-button.elementor-button.elementor-button.elementor-button.elementor-button,
html body button.wpforms-submit.wpforms-submit.wpforms-submit.wpforms-submit.wpforms-submit,
html body input.wpforms-submit.wpforms-submit.wpforms-submit.wpforms-submit.wpforms-submit {
  background-color: #045FCB !important; color: #fff !important;
}

/* ---------- 2. small azure TEXT (<24px) -> #045FCB on light grounds ---------- */
.nd-mm-cmp.nd-mm-cmp, .ndhero-tile-lbl.ndhero-tile-lbl, .ndop-eyebrow.ndop-eyebrow,
.ndop-basis-h.ndop-basis-h, .ndapps-kicker.ndapps-kicker, .ndfam-kicker.ndfam-kicker,
.ndwhy-kicker.ndwhy-kicker, .ndwhy-label.ndwhy-label, .kicker.eyebrow,
.wpforms-required-label.wpforms-required-label, .ct-station-role.ct-station-role,
.golink.golink, .go.go, .nd-ey.nd-ey, .nd-hero-ey.nd-hero-ey,
.nd-lead-cta__label.nd-lead-cta__label, .ndsvc-kicker.ndsvc-kicker,
.khub .cat, .pno.pno, .no.no {
  color: #045FCB !important;
}
/* the same labels where they sit on a navy band -> #5AA6FF (6.07-6.67:1)
   CORRECTION 2026-07-25: .nphc-kick / .n378-kick / .nd-kb-kick were in the LIGHT list
   above, but every KB kicker sits on a dark hero plate — measured 3.13:1 on
   /knowledge-hub/passive-heave-compensation/. They belong here. */
.band-deck .kicker, .band-deck .eyebrow, .band-abyss .kicker, .band-abyss .eyebrow,
.nphc-kick.nphc-kick, .n378-kick.n378-kick, .nd-kb-kick.nd-kb-kick,
.ndfound-label.ndfound-label, .ndfound-kicker.ndfound-kicker, .ntfl-kick.ntfl-kick,
.rgl .hero .ey, .cygp .hero .ey, .ant .hero .ey, .pol .hero .ey, .vga .hero .ey,
.sir .hero .ey, .con .hero .ey, .chyd .hero .ey, .prov .hero .ey {
  color: #5AA6FF !important;
}

/* ---------- 3. body links ---------- */
/* REGRESSION FIX (Tord, 2026-07-25): the first version recoloured EVERY <a>, which caught the header
   navigation. The primary nav sits on a dark/transparent header, so a dark blue link was unreadable.
   Site CHROME is now excluded outright — header, nav and footer keep Astra's own link colours, which
   already contrast correctly against their own backgrounds. Only CONTENT links are recoloured. */
html body a:not(.elementor-button):not(.nd-btn):not(.btn):not(.ndcta-btn):not(.ndfound-btn):not(header a):not(nav a):not(footer a):not(.site-header a):not(.site-footer a):not(.nd-global-footer a):not(.ast-mobile-header-content a):not(.menu-link):not(.ast-builder-layout-element a) { color: #045FCB; }
html body a:not(.elementor-button):not(.nd-btn):not(.btn):not(header a):not(nav a):not(footer a):not(.menu-link):hover { color: #034FA8; }
/* content links that sit on the dark bands still need the light token */
html body .band-deck a:not(.menu-link), html body .band-abyss a:not(.menu-link),
html body .band-deep a:not(.menu-link), html body .ndfound a, html body .ndcta a { color: #5AA6FF; }

/* ID-scoped holdout: the contact template styles its submit via `#nd-contact-redesign
   .wpforms-submit`, and an ID is (1,0,0) — no class chain can beat it. Match the ID directly. */
/* The contact template's own rule is `#nd-contact-redesign .wpforms-submit {background:
   var(--nd-azure,#0375FD)!important}` — SAME specificity (1,1,0) and also !important, so source order
   decided it and theirs prints later. Repeating the class takes us to (1,2,0), which wins on
   specificity regardless of order. */
#nd-contact-redesign .wpforms-submit.wpforms-submit,
#nd-contact-redesign .wpforms-submit.wpforms-submit:hover,
#nd-contact-redesign .elementor-button.elementor-button,
#nd-about-redesign .elementor-button.elementor-button,
#nd-about-redesign .sl-btn.sl-btn, #nd-contact-redesign .ct-btn.ct-btn {
  background-color: #045FCB !important; color: #fff !important;
}
#nd-contact-redesign .wpforms-submit.wpforms-submit:hover { background-color: #034FA8 !important; }

/* GHOST BUTTONS ON DARK PLATES (2026-08-01). The content-link rule above also catches ghost
   buttons — they are <a> elements carrying none of the excluded button classes. That is CORRECT on a
   light ground: .ndop-btn-g (home hero) and .ndcap-btn-g (operability screening) both measure
   5.99:1 and are left alone deliberately. But .ndcx-btn-g sits on the dark hero plate, where
   #045FCB over the 6%-white surface measures 2.74:1 — below AA for 15px text. Restore the colour the
   page itself authored (#fff on rgb(25,31,45) = 16.4:1). Class-based, so the nine locale twins of
   /knowledge-hub/operability-screening/ are fixed by the same rule. */
html body a.ndcx-btn-g.ndcx-btn-g,
html body a.ndcx-btn-g.ndcx-btn-g:visited { color: #fff !important; }
html body a.ndcx-btn-g.ndcx-btn-g:hover {
  color: #fff !important; background: rgba(255,255,255,.14) !important;
  border-color: rgba(255,255,255,.55) !important;
}
html body a.ndcx-btn-g.ndcx-btn-g:focus-visible { outline: 3px solid #5AA6FF; outline-offset: 3px; }

/* ---------- 3b. holdouts found by axe-core, 2026-08-05 ----------------------
   Two families the allowlists above miss. Measured with axe (ratios are its own).

   (a) DARK PANELS NOT IN THE band-* LIST. `.nsub-pivot` is a navy plate inside
       /knowledge-hub/subsea-lifts/. The page authored its links #7fd0d8 (9.5:1
       there); the generic content-link rule repainted them #045FCB, which is
       2.8:1 on that navy — a contrast FIX causing a contrast FAILURE, the same
       shape as the .ndcx-btn-g case above. Restore the page's own colour. */
html body .nsub-pivot a, html body .nsub-pivot a:visited { color: #7fd0d8 !important; }
html body .nsub-pivot a:hover { color: #a8e4ea !important; }

/* (b) #0375FD AS LINK TEXT ON NEAR-WHITE. The lede links and the application
       cards still carry the raw azure: 3.76:1 on #eaf3fb (constellation) and
       4.02:1 on #f6fafd (custom hydraulics), both under AA for text below 24px.
       #045FCB gives 5.39:1 and 5.63:1 on those same grounds. */
html body .lede a, html body .lede a:visited,
html body .appc p a, html body .appc p a:visited { color: #045FCB !important; }
html body .lede a:hover, html body .appc p a:hover { color: #034FA8 !important; }

/* (c) Third pass, axe-core 2026-08-05. All measured by axe on flat grounds.
       Existing tokens only — no new colours (the palette already carries 57
       near-duplicates; see the token-drift audit). */
/* #0375FD as 17px body text on white: 4.22:1. --nd-action gives 5.99:1. */
html body .wall .t { color: #045FCB !important; }
/* Table header ink #7b869b on #e7f6ff: 3.32:1 at 12.5px. --nd-ink-muted = 4.77:1. */
html body .ndct th[scope="col"], html body .nd-ct-up th[scope="col"] { color: #5C6E86 !important; }
/* Byline + dateline #64748b on #e7f6ff: 4.31:1 at 13.5px. --nd-ink-muted = 4.77:1. */
html body .ndr-byline, html body .ndr-byline strong, html body .ndr-byline time { color: #5C6E86 !important; }

/* ---------- 4. skip link — first keyboard affordance on every page ---------- */
.skip-link.skip-link, .skip-link.skip-link:focus { color: #045FCB !important; background: #fff !important; }
/* == nd-math-overflow == */
/* the scroll container — math elements themselves cannot be relied on to clip */
.nd-math-scroll,
mjx-container[jax="CHTML"][display="true"],
math[display="block"]{
  display:block;max-width:100%;overflow-x:auto;overflow-y:hidden;
  -webkit-overflow-scrolling:touch;
}
math{max-width:100%;}
/* KaTeX renders a HIDDEN MathML copy for assistive tech in .katex-mathml and the
   visible glyphs in .katex-html. On /knowledge-hub/passive-heave-compensation/ at
   least one .katex-mathml was not being clipped and laid out 2110 px wide, pushing
   the document to 2214 px. This is KaTeX's own visually-hidden intent, enforced. */
.katex-mathml{
  position:absolute!important;width:1px!important;height:1px!important;
  padding:0!important;margin:-1px!important;overflow:hidden!important;
  clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important;
}
/* the visible half may still be wider than a narrow column — let it scroll itself */
.katex-display{max-width:100%;overflow-x:auto;overflow-y:hidden;}
/* inline math must never be the thing that widens a line box */
math:not([display="block"]){overflow-wrap:anywhere;}
/* ...but the rule above must NOT reach KaTeX's visually-hidden MathML copy. That copy is
   clipped to 1px, so `overflow-x:auto` on it produced a 1px-wide box holding 152px of
   content — which axe correctly reports as a scrollable region with no keyboard access
   (scrollable-region-focusable, 86 nodes across 5 pages). It is never visible and never
   needs to scroll; the VISIBLE half keeps its own scroller via .katex-display above.
   Adding tabindex here instead would have been wrong twice over: it sits inside an
   aria-hidden subtree, which is its own violation. */
.katex-mathml math,
.katex-mathml math[display="block"]{
  overflow:visible!important; display:inline!important; max-width:none!important;
}
/* == nd-p0-resilience == */
/* =============================================================================
   P0-3  About: full-bleed that only overflows when a scrollbar exists
   -----------------------------------------------------------------------------
   The fragment ships `#nd-about-redesign{width:100vw;max-width:100vw;
   margin-inline:calc(50% - 50vw)}`. With overlay scrollbars that is a no-op
   (margin-inline computes to 0px, which is how it passed review). With a classic
   15px scrollbar, 50% of the 375px parent minus 50vw of the 390px viewport is
   -7.5px a side while the box itself is 390px wide -> a 382.5px scrollWidth in a
   375px document, exactly the 382/375 the audit measured.
   The parent (.entry-content) is ALREADY the full document width on this
   template, so the bleed buys nothing: 100% is pixel-identical without a
   scrollbar and correct with one.
   ============================================================================= */
:root:root #nd-about-redesign{width:100%;max-width:100%;margin-inline:0}

/* =============================================================================
   P0-1  Reveal animations become a progressive enhancement
   -----------------------------------------------------------------------------
   Already handled by the pages themselves: JS-disabled (a <noscript> style on
   About, and .svcx.svx-anim scoping on Services) and prefers-reduced-motion.
   NOT handled, and fixed here:
     - print / PDF export  (About loses 3,783 chars, Services 1,845)
     - IntersectionObserver present but throwing on construction
     - landing on a deep #anchor, where everything above never intersects
     - the observer never firing at all (slow device, interrupted JS)
   ============================================================================= */
@media print{
:root:root .rv,
:root:root .svx-reveal,
:root:root .nd-reveal,
:root:root [data-reveal]{opacity:1!important;transform:none!important;transition:none!important;
  animation:none!important;visibility:visible!important;clip-path:none!important}
}
html.nd-reveal-off.nd-reveal-off.nd-reveal-off .rv,
html.nd-reveal-off.nd-reveal-off.nd-reveal-off .svx-reveal,
html.nd-reveal-off.nd-reveal-off.nd-reveal-off .nd-reveal,
html.nd-reveal-off.nd-reveal-off.nd-reveal-off [data-reveal]{opacity:1!important;transform:none!important;transition:none!important;
  animation:none!important}

/* =============================================================================
   P0-2  No film ever reads as a blank black rectangle
   -----------------------------------------------------------------------------
   The embeds are YouTube iframes. Until the embed paints (slow network, blocked
   third-party frames, consent not yet given, reduced-data mode) the iframe is
   transparent over a dark card, which is the "blank navy/black rectangle" in the
   audit. An iframe's own background paints until the embedded document does, so
   one rule gives every film a branded poster state with a play affordance —
   no JS, no layout change, and it cannot fail closed.
   ============================================================================= */
:root:root iframe[src*="youtube"], :root:root iframe[src*="youtu.be"],
:root:root iframe[data-src*="youtube"], :root:root iframe[data-lazy-src*="youtube"],
:root:root iframe[src*="vimeo"]{
  background-color:#0A1D3A;
  background-image:
    url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='84' height='84' viewBox='0 0 84 84'%3E%3Ccircle cx='42' cy='42' r='40' fill='none' stroke='%235AA6FF' stroke-width='2' opacity='.85'/%3E%3Cpath d='M34 27l26 15-26 15z' fill='%23FFFFFF' opacity='.92'/%3E%3C/svg%3E"),
    linear-gradient(160deg,#0A1D3A 0%,#071428 62%,#050D18 100%);
  background-repeat:no-repeat,no-repeat;
  background-position:center center,center center;
  background-size:64px 64px,cover;
}
/* Film cards whose iframe is injected on interaction: same poster on the shell, so the
   cell is never an empty hole while the embed is still absent. */
:root:root .filmcell:not(:has(img)):not(:has(iframe)),
:root:root .film:not(:has(img)):not(:has(iframe)),
:root:root .filmside:not(:has(img)):not(:has(iframe)),
:root:root .nsub-video:not(:has(img)):not(:has(iframe)){
  background-color:#0A1D3A;
  background-image:linear-gradient(160deg,#0A1D3A 0%,#071428 62%,#050D18 100%);
}

/* =============================================================================
   P0-8  DNV / ISO proof must never be a blank box
   -----------------------------------------------------------------------------
   The badges are real images with correct alt text, but they carry loading="lazy",
   so in print, in full-page capture and on a fast scroll-past they can paint
   empty. Trust marks are small, so they are eager-loaded in PHP below.
   Deliberately NO CSS here: the badges are transparent PNG/WebP and several sit on the
   dark footer, where a light plate behind them would itself read as a broken box.
   ============================================================================= */


/* =============================================================================
   P0-4 / P0-5  Action blue: the holdouts nd-azure-contrast cannot reach
   -----------------------------------------------------------------------------
   nd-azure-contrast.php retired #0375FD as a text/small-fill colour on
   2026-07-25, but it works from an ALLOWLIST of class names, and the components
   built since then use new ones (.svx-* on the rebuilt Services page, .btn-mint
   on About, .nphc-cta, .ey, .toclabel, .nm ...). Rather than append more names,
   fix it at the token: every one of these components paints from
   var(--nd-azure) / var(--azure), so re-pointing that variable INSIDE action and
   label contexts fixes the components that exist and the ones not yet written,
   while charts, strokes, focus rings and >=24px display type keep #0375FD —
   which is what the audit asked for.

   Measured before: white on #0375FD = 4.23:1, #0375FD on white = 4.23:1.
   After: white on #045FCB = 5.99:1, #045FCB on white = 5.99:1.
   ============================================================================= */
:root:root a[class*="btn"], :root:root button, :root:root .elementor-button,
:root:root a[class*="cta"], :root:root .wpforms-submit,
:root:root input[type="submit"], :root:root [class*="-kicker"], :root:root [class*="kicker"],
:root:root [class*="eyebrow"], :root:root .ey, :root:root .toclabel, :root:root .nm,
:root:root .cat, :root:root .rmeta, :root:root .golink, :root:root .sl-person-role,
:root:root .devchip, :root:root .striplabel{
  --nd-azure:#045FCB;
  --azure:#045FCB;
}

/* Services: the primary CTA measured 1.42:1 — its own CSS fills the button with
   var(--azure) while nd-azure-contrast's content-link rule recoloured the LABEL to
   #045FCB, i.e. blue text on a blue button. The token above fixes the fill; the label
   must be forced back to white. */
:root:root a.svx-btn.primary, :root:root a.svx-btn.primary:hover,
:root:root a.svx-btn.primary:focus, :root:root a.svx-btn.primary:visited{
  color:#fff!important;
}
/* Ghost buttons on the dark plates take the same content-link recolour and land at
   3.07:1 on #071428. This is the .ndcx-btn-g case from 2026-08-01, generalised to the
   whole *-btn family so the next ghost variant does not have to be found by hand. */
:root:root .band-deck a[class*="btn"]:not([class*="primary"]),
:root:root .band-abyss a[class*="btn"]:not([class*="primary"]),
:root:root .band-deep a[class*="btn"]:not([class*="primary"]),
:root:root a.svx-btn.ghost, :root:root a.svx-btn.ghost:visited{
  color:#DBE6F5!important;
}
:root:root a.svx-btn.ghost:hover{color:#fff!important;border-color:#5AA6FF!important}

/* Small azure text sitting on the DARK bands needs the light token, not the dark one:
   #045FCB on #071428 is 3.07:1, #5AA6FF is 6.1-6.7:1. These are the pages whose bands
   do not use the .band-* class names the existing rule keys on. */
:root:root .con .golink, :root:root .con a[href^="mailto"], :root:root .con a[href^="tel"],
/* About marks its dark sections .sect--dark, plus the closing .sl-cta plate — the two
   kickers that measured 3.18:1 ("How we work", "See it work") are both in .sect--dark. */
:root:root #nd-about-redesign .sect--dark .kicker,
:root:root #nd-about-redesign .sect--dark .eyebrow,
:root:root #nd-about-redesign .sl-cta .kicker,
:root:root #nd-about-redesign .sl-cta .eyebrow,
:root:root .khub .cat, :root:root .ndfound-label, :root:root .ndfound-kicker,
:root:root .nd-hero-ey{
  color:#5AA6FF!important;
}

/* Bylines shipped 2026-08 carry an INLINE color:#64748b on the ice hero band = 4.31:1,
   just under AA for 13px body text. #5A6880 is the same hue at 5.11:1 on ice, 5.64:1 on
   white. Attribute match because an inline style cannot be beaten any other way. */
:root:root p[style*="#64748b" i], :root:root p[style*="#64748B"]{color:#5A6880!important}
/* The "you are here" card in each product ladder is the one DARK card in a row of white ones
   (background var(--nd-deck) #0A1D3A). nd-azure-contrast's blanket `.no.no{#045FCB!important}`
   repaints its step number and lands at 2.8:1. Restore what each page actually authored —
   which is also the accessible answer. Two naming conventions are in use:
     .ladc.cur      (CYGNUS, SIRIUS) — the card sets color:var(--nd-ice); .no inherits it
                                        #EAF3FB on #0A1D3A = 14.97:1
     .ladc.is-here  (VEGA)           — the page authors amber for .no explicitly
                                        #FFB25A on #0A1D3A =  9.41:1 */
:root:root .ladc.cur .no{color:#EAF3FB!important}
:root:root .ladc.is-here .no{color:#FFB25A!important}
/* CONSTELLATION's numbered step markers sit on the same deck colour. */
:root:root .con .no{color:#5AA6FF!important}

/* The RFQ drop-zone hint measured #C7D6EA on white = 1.48:1 on five product pages: a
   dark-band colour winning on a light card. nd-rfq-attachment.php's own authored value is
   #5C6E86 (5.96:1 on white), so restore exactly that rather than invent a new grey.
   The page-level source of the failure is `.rgl/.cygp/.ant/.pol .nd-rfq-hint{#c7d6ea}`.
   NO dark-band exception: the drop zone is a WHITE card (rgba(255,255,255,.05) over white)
   that happens to sit inside a .band-deck section, so keying off the band paints light text
   on a light card — measured 1.53:1. The card is white in every product RFQ, so one value
   is correct everywhere. */
:root:root .nd-rfq-hint{color:#5C6E86!important}

/* Operability-panel note text is #7A8AA3, which is 3.32-3.5:1 on the foam/white grounds it
   sits on — the last measured AA failures on the sampled pages. Not an action-blue item, so
   strictly this is section 5.3 work, but the audit already prescribes the replacement token
   (--text-muted #5C6E86 = 5.21:1 on white) so there is nothing to decide. */
:root:root .ndop-caveat, :root:root .ndop-panel-sub, :root:root .ndop-gloss,
:root:root .ndop-curve-c, :root:root .ndcap-note, :root:root .ndcap-limits{color:#5C6E86!important}

/* =============================================================================
   P0-6  Persistent technical labels below the --nd-label-min floor
   -----------------------------------------------------------------------------
   nd-type-scale.php owns the floor (12.5px desktop / 13px mobile) but it is an
   allowlist and it leaks — these are the classes measured under 12.4px across the
   22 sampled EN pages. Sizing only; colour and weight untouched.
   DELIBERATELY EXEMPT (do not add): SVG chart internals, <sub>/<sup>, KaTeX and
   MathML tiers — those are sized relative to their notation by design.
   ============================================================================= */
:root:root .rng, :root:root .naph-yn, :root:root .naph-chip, :root:root .rmeta,
:root:root .case, :root:root .devchip, :root:root .striplabel, :root:root .leads,
:root:root .ndcx-tag, :root:root .ndop-curve-c, :root:root .nd-solution-box__label,
:root:root .chyd .no, :root:root .ant .t,
/* the "On this page" rail: its .toclabel was lifted to the floor in the 2026-08 rollout,
   but the link row itself was left at 12px on all nine pages that carry it. */
:root:root nav.toc a, :root:root .tocrow a{
  font-size:12.5px!important;
}
@media (max-width:768px){
  :root:root .rng, :root:root .naph-yn, :root:root .naph-chip, :root:root .rmeta,
  :root:root .case, :root:root .devchip, :root:root .striplabel, :root:root .leads,
  :root:root .ndcx-tag, :root:root .ndop-curve-c, :root:root .nd-solution-box__label,
  :root:root .chyd .no, :root:root .ant .t,
  :root:root nav.toc a, :root:root .tocrow a{
    font-size:13px!important;
  }
}
/* == nd-p1-tokens == */
/* =============================================================================
   W2 · SEMANTIC SURFACES AND INK
   -----------------------------------------------------------------------------
   Measured 2026-08-02 across 22 EN pages: 98 distinct text colours, 27 background
   colours, 15 section-band backgrounds — including ELEVEN near-identical pale
   blues and SEVEN near-identical dark inks, each pair a fraction of a percent
   apart and none of them meaning anything different.

   Canonical ice = #EAF3FB (decided 2026-08-02). It was already the more used of
   the two candidates as a section band (16 uses / 8 pages, against #E7F6FF which
   no longer appears as a band at all), and being slightly greyer it sits with the
   navy family instead of pulling cyan.

   These are DECLARATIONS, not a retro-repaint: CSS cannot select an element by its
   computed colour, so existing hardcoded values are migrated at source as each
   component is rebuilt in W3. New work consumes the tokens.
   ============================================================================= */
:root:root{
  /* surfaces, light -> dark */
  --nd-surface-white : #FFFFFF;
  --nd-surface-foam  : #F6FAFD;   /* replaces F2F6FC EDF3F8 F1F7FE F6F9FF F6F9FB
                                     F4F7FB F4F7FC F5F8FC F6F9FC EEF3FB */
  --nd-surface-ice   : #EAF3FB;   /* replaces E7F6FF EAF2FF */
  --nd-surface-deck  : #0A1D3A;
  --nd-surface-deep  : #071428;   /* replaces 06131D 05101F */
  --nd-surface-abyss : #050D18;

  /* ink */
  --nd-ink           : #0C1A2E;   /* replaces 0F172A 0C1A27 0B1D3A 0A1F33 071A33 */
  --nd-ink-body      : #364151;
  --nd-ink-muted     : #5C6E86;
  --nd-ink-inverse   : #FFFFFF;
  --nd-ink-inverse-muted : #C4D2E6;

  /* action + state (action already enforced by nd-azure-contrast + nd-p0-resilience) */
  --nd-action        : #045FCB;
  --nd-action-hover  : #01205F;
  --nd-focus         : #5AA6FF;
  --nd-state-safe    : #178F76;
  --nd-state-warn    : #B9782E;
  --nd-state-risk    : #B8343A;
}

/* =============================================================================
   W1 · CANONICAL FONT FAMILIES
   -----------------------------------------------------------------------------
   Three families, no others. `ui-monospace` and `-apple-system` are OS keywords:
   they resolve to the viewer's system font, so the same page renders in a
   different typeface on every machine and matches no other page on the site.
   ============================================================================= */
:root:root #nd-daf-tt,
:root:root .n378-toc .toclabel,
:root:root .n378-toc a,
:root:root .ndaf-toc .toclabel,
:root:root .ndaf-toc a,
:root:root .nphc-toc .toclabel,
:root:root .nphc-toc a,
:root:root .nsub-toc .toclabel,
:root:root .nsub-toc a,
:root:root .naph-yn,
:root:root .nd-fzh,
:root:root .nd-mru-up .nmru-lbl,
:root:root .nd-n001-up .nn1-hs,
:root:root .nd-shk-up .nshk-hs,
:root:root .nd-shk-up .nshk-lbl,
:root:root .ndct td.n,
:root:root .nphc-calcwrap label,
:root:root body.page-id-4830 .entry-content a.nphc-back,
:root:root body.page-id-4830 .entry-content u,
:root:root [class$="-toc"] a,
:root:root [class$="-toc"] .toclabel{
  font-family: var(--nd-font-mono, 'IBM Plex Mono', ui-monospace, Menlo, monospace) !important;
}
/* Round 2 — the remainder, taken from the RENDERED pages rather than from source,
   because the rest of these rules are emitted from inside PHP heredocs where the
   selector cannot be grepped reliably.

   TABLE TEXT -> body font. Measured: 41 cells resolving to Arial (subsea-lifts,
   adaptive-PHC) and 22 to the OS mono. The audit's rule is "mono only for values,
   units, standards, variables and short evidence labels", so the default for a
   table cell is DM Sans and mono is opt-in per cell (below). */
:root:root .entry-content caption, :root:root main caption,
:root:root .entry-content table th, :root:root .entry-content table td,
:root:root main table th, :root:root main table td,
/* the last table cells sat behind an INLINE `font:inherit` (from the table-semantics
   pass, which makes a th look like a td). The font shorthand resets font-family, and an
   inline declaration outranks any stylesheet — so the family alone needs !important
   here. Size and weight are deliberately left to inherit.
   ⚠️ `p` is scoped to :not([class]) ON PURPOSE. A blanket `main p{...!important}` also
   repaints every mono kicker/eyebrow that happens to be a <p> — measured 13 of them on
   the pillar alone. Only the two unclassed OS-font paragraphs need this. */
:root:root .entry-content p:not([class]), :root:root main p:not([class]){
  font-family: var(--nd-font-body, 'DM Sans', system-ui, sans-serif) !important;
}
/* …with the explicitly-mono cells opting back in. `.m` / `.n` are the house
   classes for a numeric or unit cell. */
:root:root .entry-content table td.m, :root:root .entry-content table th.m,
:root:root .entry-content table td.n, :root:root .entry-content table th.n,
:root:root table td.m, :root:root table td.n{
  font-family: var(--nd-font-mono, 'IBM Plex Mono', ui-monospace, Menlo, monospace);
}
/* The mono micro-label idiom, by shape rather than by page: kickers, chips, tags,
   captions, notes and the bare `.m`/`.n` spans all belong to the mono tier. Using
   attribute matches means a new page inherits the right family without an edit. */
:root:root [class$="-kick"], :root:root [class*="-kick "],
:root:root [class$="-chip"], :root:root [class$="-tag"],
:root:root [class$="-note"], :root:root span[class$="-cap"], :root:root b[class$="-cap"],
:root:root .nphc-mut span.m, :root:root .nphc-walk span.m, :root:root .nphc-zone span.m,
:root:root .nphc-zone b, :root:root .ndd-eout div.ndd-ev, :root:root .ndd-eout div.ndd-el,
:root:root .ndd-route div.ndd-rl, :root:root .ndfound-cap, :root:root .ndcta-contact,
:root:root .kicker, :root:root .eyebrow, :root:root .ndhcreel-eyebrow, :root:root .figcap{
  font-family: var(--nd-font-mono, 'IBM Plex Mono', ui-monospace, Menlo, monospace) !important;
}
/* The pillar's "See it in action" reel rendered its captions, eyebrow and lead in
   the visitor's OS UI font, so that band matched no other section on the site. */
:root:root figcaption, :root:root figcaption span,
:root:root .ndhcreel-cap, :root:root .ndhcreel-cap span,
:root:root .ndhcreel-lead, :root:root .ndhcreel-in p{
  font-family: var(--nd-font-body, 'DM Sans', system-ui, sans-serif);
}


/* =============================================================================
   W1 · HEADING ROLES  (Tier A — outliers only)
   -----------------------------------------------------------------------------
   Measured: 55 distinct heading GEOMETRIES (H1 6 · H2 26 · H3 23) over 379
   headings. Most of that spread is three legitimate tiers used inconsistently
   (statement / section / sub-section), which the W3 component pass will map onto
   one scale. Only the outright outlier is corrected here, because remapping sizes
   changes pixels on 22 pages and wants a before/after review first.

   THE OUTLIER: /knowledge-hub/passive-heave-compensation/ renders its H1 at
   weight 600 with line-height 1.40, where every other H1 on the site is weight
   700 at ~1.08. It reads as a different template.
   ============================================================================= */
:root:root body.page-id-4830 .entry-content h1,
:root:root body.page-id-4830 h1.entry-title{
  font-family: var(--nd-font-display, 'Lexend', system-ui, sans-serif);
  font-weight: 700;
  line-height: 1.09;
  letter-spacing: -0.024em;
}

/* =============================================================================
   W2 · COLOUR-ONLY STATE ENCODING — AUDITED, NOTHING TO FIX
   -----------------------------------------------------------------------------
   The audit raises this in four places (operability heatmap, Adaptive-PHC
   comparison, GRP study gate bars, section 13). Measured across all 22 EN pages
   on 2026-08-02: 194 state-classed elements, ZERO encoded by colour alone.
     - .naph-yn cells carry the words "Yes"/"No"; colour is already redundant.
     - .lg-go/.lg-no legend chips sit inside spans reading "Workable"/"No-go".
     - The operability heatmap fills its no-go region with a hatch pattern
       (url(#ndhx)) and rings the selected design cell with a target marker.
   Verified by rendering the matrix under emulated deuteranopia, protanopia and
   achromatopsia: it stays fully readable with no hue information at all.
   NO RULE IS SHIPPED HERE ON PURPOSE — adding a redundant glyph would be a design
   change with no defect behind it. Re-check with cvdshot.mjs after any chart work.
   ============================================================================= */
/* == nd-p1-scale == */
/* =============================================================================
   W1 Tier B · HEADING SCALE — three declared surfaces
   -----------------------------------------------------------------------------
   Measured 2026-08-02: 51 distinct heading geometries over 379 headings
   (H1 6 · H2 25 · H3 20). Not one scale with drift — three legitimate tiers with
   arbitrary values scattered inside each. Collapsing to a single H2 would either
   bloat the 12-14k px articles or shrink the product pages, so the tiers stay and
   the arbitrary values inside them go. Verified by injection before shipping:
   51 -> 9 geometries, page heights -0.1% / +0.4% / +0.3% / 0.0%.

   px/vw on purpose: Astra ships html{font-size:91.2%} at <=768px, so a rem-based
   heading would shrink ~9% on exactly the screens that need it biggest.

   ⚠️ EVERY var() BELOW CARRIES A LITERAL FALLBACK. `font-size: var(--undefined)` is
   invalid at computed-value time and font-size then INHERITS — the first attempt at
   this shipped without the :root block and every heading silently collapsed to body
   size (H2 at 17px). A fallback makes that failure impossible.
   ============================================================================= */
:root:root{
  --nd-h1-statement: clamp(44px, 5vw, 72px);
  --nd-h1-campaign : clamp(38px, 4vw, 52px);
  --nd-h1-editorial: clamp(32px, 3.2vw, 44px);
  --nd-h2-statement: clamp(32px, 3.4vw, 46px);
  --nd-h2-campaign : clamp(28px, 2.8vw, 36px);
  --nd-h2-editorial: clamp(24px, 2.2vw, 28px);
  --nd-h3-large    : clamp(22px, 2vw, 26px);
  --nd-h3-section  : 22px;
  --nd-h3-card     : 17px;
}

/* ---------- statement: hero and closing-CTA plates ---------- */
:root:root .sl-hero h1, :root:root [class$="-hero"] h1, :root:root [class*="hero"] h1{
  font-size: var(--nd-h1-statement, clamp(44px, 5vw, 72px)) !important;
  line-height: 1.04 !important; font-weight: 700 !important; letter-spacing: -0.024em !important;
}
:root:root .sl-cta h2, :root:root .ndcta h2, :root:root .ndfound h2, :root:root [class$="-cta"] h2{
  font-size: var(--nd-h2-statement, clamp(32px, 3.4vw, 46px)) !important;
  line-height: 1.10 !important; font-weight: 700 !important; letter-spacing: -0.02em !important;
}

/* ---------- campaign surface ---------- */
:root:root .entry-content h1:not([class*="hero"]), :root:root main h1:not([class*="hero"]){
  font-size: var(--nd-h1-campaign, clamp(38px, 4vw, 52px)) !important;
  line-height: 1.08 !important; font-weight: 700 !important; letter-spacing: -0.024em !important;
}
:root:root .entry-content h2, :root:root main h2{
  font-size: var(--nd-h2-campaign, clamp(28px, 2.8vw, 36px)) !important;
  line-height: 1.20 !important; font-weight: 700 !important; letter-spacing: -0.015em !important;
}

/* ---------- editorial surface ---------- */
:root:root body.nd-surface-editorial main h1,
:root:root body.nd-surface-editorial .entry-content h1{
  font-size: var(--nd-h1-editorial, clamp(32px, 3.2vw, 44px)) !important; line-height: 1.14 !important;
}
:root:root body.nd-surface-editorial main h2,
:root:root body.nd-surface-editorial .entry-content h2,
:root:root [class*="nd-"][class*="-up"] h2, :root:root .nd-study h2{
  font-size: var(--nd-h2-editorial, clamp(24px, 2.2vw, 28px)) !important;
  line-height: 1.28 !important; font-weight: 700 !important; letter-spacing: -0.01em !important;
}

/* ---------- H3: three roles ---------- */
:root:root .entry-content h3, :root:root main h3{
  font-size: var(--nd-h3-section, 22px) !important; line-height: 1.30 !important; font-weight: 600 !important;
}
:root:root .card h3, :root:root [class*="card"] h3, :root:root [class*="cell"] h3,
:root:root [class*="tile"] h3, :root:root li h3{
  font-size: var(--nd-h3-card, 17px) !important; line-height: 1.30 !important;
}
:root:root [class*="related"] h3, :root:root [class*="rel"] > h3{
  font-size: var(--nd-h3-large, clamp(22px, 2vw, 26px)) !important; font-weight: 700 !important;
}
/* == nd-p1-buttons == */
/* =============================================================================
   W3 · ONE BUTTON COMPONENT (geometry only)
   -----------------------------------------------------------------------------
   Measured 2026-08-02 over 22 EN pages: 92 CTAs in 29 geometries, 22 class
   families, 10 border radii, 5 font weights, heights 37-58px, and ELEVEN under
   the 44px touch target — nine of them the "Send your lift case" submit on every
   product page, at 43px. The same primary action rendered with FOUR different
   corner radii across About (2px), Contact (3px), home (6px) and Passive HC (10px).

   Canonical values are the measured dominant, not invented: 8px radius (63 of 92),
   15px type (72 of 92), padding 14/26 -> 46px natural + 1px border = 48px.

   COLOUR IS NOT TOUCHED HERE — nd-azure-contrast.php and nd-p0-resilience.php own
   it — except the one CTA that hardcodes the retired #0375FD as a fill and so is
   unreachable by either.

   Verified by injection BEFORE shipping: 29 -> 6 geometries, 10 -> 2 radii,
   11 -> 0 under the touch target, 1 -> 0 below 4.5:1.
   ============================================================================= */

/* The component selector. Excludes controls that only LOOK like buttons:
   figure-zoom triggers wrap a whole figure, the footer accordion summaries are
   layout, and the menu toggles are chrome with their own sizing. */
:root:root a[class*="btn"]:not([class*="fz"]),
:root:root button:not([class*="fz"]):not(.nd-facc-sum):not([class*="menu-toggle"]):not([class*="wpconsent"]),
:root:root .elementor-button,
:root:root a[class*="cta"],
:root:root input[type="submit"],
:root:root .wpforms-submit{
  min-height: 48px;          /* 46 content + the 1px border outline variants carry */
  padding: 14px 26px;
  border-radius: 8px !important;   /* the primary CTA rendered at 2/3/6/10px across
                                      About, Contact, home and Passive HC — same action,
                                      four shapes. ID-scoped page rules need !important. */
  font-size: 15px;
  font-weight: 700;
  line-height: 1.2;
  box-sizing: border-box;
  gap: .55em;
}

/* ID-scoped holdout: the contact template styles its submit via
   #nd-contact-redesign .wpforms-submit, and an ID is (1,0,0) — no class chain beats
   it. Repeating the class takes us to (1,2,0). Same trick nd-azure-contrast needed for
   this exact element's colour. */
:root:root #nd-contact-redesign .wpforms-submit.wpforms-submit,
:root:root #nd-about-redesign .btn-mint.btn-mint,
:root:root #nd-about-redesign .btn-ghost.btn-ghost{
  border-radius: 8px !important;
  min-height: 48px;
  padding: 14px 26px;
  font-size: 15px;
  font-weight: 700;
}

/* Focus is a component concern and was never standardised: give every CTA the same
   visible ring on the same token. */
:root:root a[class*="btn"]:focus-visible,
:root:root button:focus-visible,
:root:root .elementor-button:focus-visible,
:root:root a[class*="cta"]:focus-visible,
:root:root .wpforms-submit:focus-visible{
  outline: 3px solid var(--nd-focus, #5AA6FF);
  outline-offset: 3px;
}

/* The one CTA that hardcodes the retired azure as a FILL rather than consuming the
   token, so neither the 2026-07-25 allowlist nor the Phase 0 token re-point reaches
   it. White on #0375FD is 4.23:1; on #045FCB it is 5.99:1. */
:root:root a.nphc-cta, :root:root a.nphc-cta:hover, :root:root a.nphc-cta:focus{
  background: #045FCB !important;
  color: #fff !important;
}
/* == nd-p1-cardfield == */
/* =============================================================================
   CARD SURFACE — one corner radius
   -----------------------------------------------------------------------------
   12px is the dominant (197 of 332). The 24 families below sit at 6/8/9/10/11/14/16px
   — near enough to 12 that each reads as drift rather than intent, and .ladc uses BOTH
   10px and 12px inside a single family. Radius only: padding, border and background
   stay per-card-type, because the audit wants explicit card TYPES (navigation, product,
   evidence, article, figure, CTA, status) that differ by surface, not by corner.
   ============================================================================= */
:root:root .ndhero-tile, :root:root .ndop-panel, :root:root .ndop-hero,
:root:root .ndfound-stat, :root:root .ct-talk, :root:root .ct-station,
:root:root .dcard, :root:root .fcard, :root:root .figcard, :root:root .acard,
:root:root .mxcard, :root:root .ladc, :root:root .appc, :root:root .howto,
:root:root .nd-kbr__card, :root:root .nphc-calcwrap, :root:root .nphc-zone,
:root:root .nsub-step, :root:root .ndcap-buy, :root:root .nsty-chart,
:root:root .nsty-env, :root:root .nsty-not, :root:root .naph-mode, :root:root .nplr-step{
  border-radius: 12px;
}

/* =============================================================================
   FORM FIELD
   -----------------------------------------------------------------------------
   The WPForms fields are already correct (16px type, 49-52px tall) — 80 of 93.
   The exceptions are the seven unclassed <select> controls in the two in-article
   calculators: Passive HC at 43px, DAF at 40px with 14px type.
   16px is not cosmetic: iOS Safari auto-zooms the viewport when a focused field's
   type is under 16px, which throws the reader out of the article mid-calculation.
   ============================================================================= */
:root:root .entry-content select, :root:root main select,
:root:root .entry-content input[type="number"], :root:root main input[type="number"]{
  min-height: 48px;
  font-size: 16px;
  border-radius: 8px;
  padding: 10px 14px;
  box-sizing: border-box;
  font-family: var(--nd-font-body, 'DM Sans', system-ui, sans-serif);
}
/* One focus affordance for every field, matching the button ring shipped in W3. */
:root:root .entry-content select:focus-visible, :root:root main select:focus-visible,
:root:root .entry-content input:focus-visible, :root:root main input:focus-visible,
:root:root .entry-content textarea:focus-visible, :root:root main textarea:focus-visible,
:root:root .wpforms-field input:focus-visible, :root:root .wpforms-field textarea:focus-visible,
:root:root .wpforms-field select:focus-visible{
  outline: 3px solid var(--nd-focus, #5AA6FF);
  outline-offset: 2px;
}
/* == nd-p1-wordmark == */
/* =============================================================================
   W4 · PRODUCT WORDMARK OPTICAL BOXES
   -----------------------------------------------------------------------------
   Measured 2026-08-02: 78 placements of the same marks at 12/13/14/15/16/20/22/
   24/26/31/54px. Sized by HEIGHT, never width — the marks run from 6.3:1 (RIGEL)
   to 17.9:1 (CONSTELLATION), so equal width gives wildly unequal cap height, which
   is how the family drifted in the first place.
   The hero box is deliberately NOT set here: all six hardware heroes already agree
   at 54px, and CONSTELLATION's 31px is a hero LAYOUT constraint (an inline <svg>
   filling a 560px column), not a sizing one — that belongs with the CONSTELLATION
   rebuild in Phase 2.
   ============================================================================= */

/* Sizing is by HEIGHT, never width: the marks have very different aspect ratios
   (RIGEL 6.3:1, ANTARES 10.8:1, CONSTELLATION 17.9:1), so equal width gives wildly
   unequal cap height — which is exactly how the family drifted. */

/* --- product-overview card: audit box 20-24px --- */
:root:root .pbody img[src*="wordmark"], :root:root .pbody img[src*="lockup"],
:root:root .fcard img[src*="wordmark"], :root:root .fcard img[src*="lockup"],
:root:root .ndd-prod img[src*="wordmark"], :root:root .ndd-prod img[src*="lockup"],
:root:root .nd-kbr__prod img[src*="wordmark"], :root:root .nd-kbr__prod img[src*="lockup"]{
  height: 22px !important; width: auto !important; max-width: 100% !important;
}

/* --- comparison / navigation card: audit box 16-18px --- */
:root:root .nm img[src*="wordmark"], :root:root .nm img[src*="lockup"],
:root:root .ladc img[src*="wordmark"], :root:root .ladc img[src*="lockup"]{
  height: 17px !important; width: auto !important; max-width: 100% !important;
}

/* Product selectors and comparison tables use one measured optical box. 14px lets
   ANTARES (the widest mark) fit a 168px product slot without object-fit shrinking it,
   so all six marks retain the same real rendered height. */
:root:root .seltbl img[src*="wordmark"], :root:root .seltbl img[src*="lockup"],
:root:root .nphc-wmlink img[src*="wordmark"], :root:root .nphc-wmlink img[src*="lockup"],
:root:root .ndfam-th-link img[src*="wordmark"], :root:root .ndfam-th-link img[src*="lockup"],
:root:root .prov .tdtable.cmp .pn img[src*="wordmark"],
:root:root .prov .tdtable.cmp .pn img[src*="lockup"]{
  display: block;
  height: 14px !important;
  width: auto !important;
  max-width: none !important;
  object-fit: contain;
}

/* --- inline / dense lists: the audit's 16px floor.
       These measured 12-14px, which is what "too small to feel intentional" means. --- */
:root:root .sl-cap-tag img[src*="wordmark"], :root:root .sl-cap-tag img[src*="lockup"],
:root:root .sl-film-name img[src*="wordmark"], :root:root .sl-film-name img[src*="lockup"]{
  height: 16px !important; width: auto !important; max-width: 100% !important;
}

/* One product-table geometry and interaction language sitewide. The six-product
   tables share a 110px label rail plus six equal 168px minimum product slots. The
   three-product PHC table uses the same rail and enough width for the widest mark. */
:root:root .ndfam-table,
:root:root .prov .tdtable.cmp table{
  display: table !important;
  overflow: visible !important;
  width: 100% !important;
  min-width: 1118px !important;
  table-layout: fixed !important;
}
:root:root .nphc-cmptbl{
  display: table !important;
  overflow: visible !important;
  width: 100% !important;
  min-width: 650px !important;
  table-layout: fixed !important;
}
:root:root .ndfam-table tr > :first-child,
:root:root .prov .tdtable.cmp tr > :first-child,
:root:root .nphc-cmptbl tr > :first-child{
  width: 110px !important;
  min-width: 110px !important;
}
:root:root .nphc-cmptbl col.nphc-label-col{
  width: 110px !important;
}
:root:root .ndfam-table thead th:not(:first-child),
:root:root .prov .tdtable.cmp thead th:not(:first-child),
:root:root .nphc-cmptbl tr:first-child th:not(:first-child){
  padding-inline: 8px !important;
}
:root:root .ndfam-th-link,
:root:root .prov .tdtable.cmp th.pn a,
:root:root .nphc-wmlink{
  width: 100%;
  justify-content: center;
}
:root:root .ndfam-table tr > :not(:first-child),
:root:root .prov .tdtable.cmp tr > :not(:first-child),
:root:root .nphc-cmptbl tr > :not(:first-child){
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
:root:root .ndfam-table .ndfam-col-hl,
:root:root .ndfam-table .nd-product-col-hl,
:root:root .nphc-cmptbl .nd-product-col-hl{
  background: #EAF1FB !important;
}
:root:root .prov .tdtable.cmp tbody .nd-product-col-hl{
  background: #EAF1FB !important;
  color: var(--nd-navy, #01205F);
}
:root:root .prov .tdtable.cmp thead .nd-product-col-hl{
  background: #163766 !important;
}
/* == nd-p1-footer == */
:root:root body.nd-surface-editorial .nd-global-footer .nd-facc-sum{
  pointer-events: auto !important;
  cursor: pointer;
}
:root:root body.nd-surface-editorial .nd-global-footer .nd-facc:not([open]) > *:not(summary){
  display: none;
}
/* Collapsing the four nav accordions alone saves NOTHING: the grid row is driven by the
   fifth cell, CONTACT, at 441px (title 26 + details 95 + address 60 + social 34 + certs
   179, the two badges stacked). So on editorial surfaces CONTACT becomes a full-width
   horizontal strip under the collapsed navs, and the cert badges sit side by side. */
@media (min-width: 761px){
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-grid{
    grid-template-columns: repeat(4, 1fr);
    row-gap: 22px;
    align-items: start;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-grid > *:last-child{
    grid-column: 1 / -1;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 14px 34px;
    border-top: 1px solid rgba(140,175,225,.18);
    padding-top: 20px;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-certs{
    flex-direction: row;
    align-items: center;
    gap: 14px;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-contact{
    display: flex; flex-wrap: wrap; gap: 6px 22px;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-addr{
    margin: 0;
  }
}
/* == nd-p1-header == */
/* A transparent header over a photograph is only as legible as the brightest pixel behind
   it. Measured 2026-08-02 by sampling the RENDERED pixels under each nav link: on the home
   page 100% of the backdrop behind Services / Knowledge Hub / About / English is below
   4.5:1, and 94% behind the CTA. A scrim makes the header's legibility independent of the
   image, which is what the audit asks for ("a consistent scrim or translucent dark surface
   over photography, plus a clearer active-state treatment").
   Painted as a background-image so it composites over whatever the header already has:
   on the transparent headers it IS the surface; on the few that carry an opaque navy it
   darkens the top few pixels imperceptibly. */
:root:root .site-header::before,
:root:root #masthead.site-header::before{
  content: "";
  position: absolute;
  left: 0; right: 0; top: 0;
  height: 138px;              /* the header is 74px; the scrim fades out below it */
  pointer-events: none;
  z-index: -1;                /* behind the nav content, above the hero beneath */
  background: linear-gradient(180deg,
      rgba(5,13,24,.80) 0%,
      rgba(5,13,24,.58) 42%,
      rgba(5,13,24,.24) 74%,
      rgba(5,13,24,0)  100%);
}

/* Active page. Only 5 of 153 nav links exposed aria-current, so the current section was
   effectively unmarked. Astra does put .current-menu-item / .current-menu-ancestor on the
   <li>, so key off that and give it a visible rule rather than colour alone. */
:root:root .main-header-menu .current-menu-item > .menu-link,
:root:root .main-header-menu .current-menu-ancestor > .menu-link,
:root:root .main-header-menu .current_page_item > .menu-link{
  font-weight: 700;
  position: relative;
}
:root:root .main-header-menu .current-menu-item > .menu-link::after,
:root:root .main-header-menu .current-menu-ancestor > .menu-link::after,
:root:root .main-header-menu .current_page_item > .menu-link::after{
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 2px;
  height: 2px;
  background: var(--nd-focus, #5AA6FF);
  border-radius: 2px;
}
/* == nd-p1-footer-mobile == */
@media (max-width: 760px){
  /* Mobile article footer. The four dropdowns are DELIBERATELY KEPT: 23 of the 44 footer
     links exist nowhere else on the page (the hamburger covers only 21), and they are
     Knowledge Hub articles. They cost 185px for 44 links at 46px tap targets — the most
     efficient part of this footer. The cost is CONTACT at 321px, stacked. */
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-contact{
    display: flex; flex-wrap: wrap; gap: 4px 20px;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-addr{
    margin: 0; display: flex; flex-wrap: wrap; gap: 2px 14px;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-addr br{ display: none; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-certs{
    flex-direction: row; align-items: center; gap: 12px;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-social{ margin: 0; }
  /* The brand tagline wraps to 70px on a 390px screen. The audit's compact footer is
     "Products, Applications, Knowledge, Contact, certifications and legal" — no tagline —
     and a reader who has just come through 12,000px of article does not need to be told
     what the company does. Logo and legal stay. */
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-tagline{ display: none; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-brandrow{ margin-bottom: 6px; }
}
/* == nd-p1-crumb == */
:root:root .nd-crumb{
  display:flex; align-items:baseline; justify-content:space-between; gap:16px;
  margin:0 0 18px; font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace);
  font-size:var(--nd-label-min,12.5px); line-height:1.5;
}
:root:root .nd-crumb-list{
  list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:0 6px; min-width:0;
}
:root:root .nd-crumb-list li{ display:inline; margin:0; }
:root:root .nd-crumb-list li + li::before{ content:"/"; margin-right:6px; color:var(--nd-ink-muted,#5C6E86); }
:root:root .nd-crumb-list a{ color:var(--nd-action,#045FCB); text-decoration:none; }
:root:root .nd-crumb-list a:hover{ text-decoration:underline; }
:root:root .nd-crumb-list li:last-child span{ color:var(--nd-ink-muted,#5C6E86); }
:root:root .nd-crumb-rt{ color:var(--nd-ink-muted,#5C6E86); white-space:nowrap; }
/* it now lives in the article body, so it inherits the content width. Guard the long
   titles: the crumb must wrap rather than push the reading time off the edge. */
:root:root .nd-crumb{ max-width:100%; flex-wrap:wrap; }
:root:root .nd-crumb-list li:last-child span{ overflow-wrap:anywhere; }
@media (max-width:760px){
  :root:root .nd-crumb{ font-size:13px; margin-bottom:14px; }
}
/* == nd-p1-autotoc == */
/* 2026-08-03 — unified on the DAF bar pattern (Tord). The nav sits inside an Elementor
   widget, so CSS sticky alone dies with that ~800px containing block; the JS below
   switches to position:fixed once scrolled past. CSS sticky stays as the no-JS fallback. */
:root:root .nd-auto-toc{
  position:sticky; top:0; z-index:50; margin:0 0 20px;
  background:rgba(255,255,255,.96);
  -webkit-backdrop-filter:blur(8px); backdrop-filter:blur(8px);
  border-bottom:1px solid #EAF3FB;
}
:root:root .nd-auto-toc.ndx-stuck{
  position:fixed; left:0; right:0; top:0; margin:0;
  box-shadow:0 10px 22px -18px rgba(10,31,68,.35);
}
:root:root body.admin-bar .nd-auto-toc.ndx-stuck{ top:32px; }
@media (max-width:782px){ :root:root body.admin-bar .nd-auto-toc.ndx-stuck{ top:46px; } }
:root:root .nd-auto-toc .tocin{
  display:flex; align-items:center; gap:14px; padding:9px 0; max-width:100%;
}
:root:root .nd-auto-toc.ndx-stuck .tocin{ max-width:860px; margin:0 auto; padding:9px 32px; }
:root:root .nd-auto-toc .toclabel{
  flex:none; font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace);
  font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--nd-ink-muted,#5C6E86);
}
/* the DAF width lesson: the label + a full pill row exceed the column at EVERY desktop
   width, and a hidden-scrollbar overflow row clips without looking broken. Desktop drops
   the decorative label (the nav keeps aria-label); mobile keeps label + scroll. */
@media (min-width:761px){
  :root:root .nd-auto-toc .toclabel{ display:none; }
  /* 2026-08-04: one scrollable line at REST too — the bar now sits full-bleed under the
     hero like DAF's, so the old column-clipping rationale for wrapping is gone, and a
     wrapped 2–3-row bar is what read as "doesn't match DAF" (Tord). The scrollspy
     auto-centres the active pill, so a hidden-scrollbar row is fine in both states. */
  :root:root .nd-auto-toc .tocrow{ flex-wrap:nowrap; overflow-x:auto; row-gap:0; }
}
:root:root .nd-auto-toc .tocrow{
  list-style:none; margin:0; padding:2px 0; display:flex; gap:8px;
  overflow-x:auto; scrollbar-width:thin; scrollbar-color:#9ab0bd transparent;
  -webkit-overflow-scrolling:touch; min-width:0;
}
:root:root .nd-auto-toc .tocrow::-webkit-scrollbar{ height:5px; }
:root:root .nd-auto-toc .tocrow::-webkit-scrollbar-thumb{ background:#9ab0bd; border-radius:999px; }
:root:root .nd-auto-toc.ndx-overflow .tocin::after{
  content:"Scroll \2192"; flex:none; color:var(--nd-ink-muted,#5C6E86);
  font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace);
  font-size:10px; letter-spacing:.06em; text-transform:uppercase;
}
:root:root .nd-auto-toc .tocrow li{ margin:0; flex:none; }
:root:root .nd-auto-toc .tocrow a{
  display:block; white-space:nowrap; text-decoration:none;
  font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace);
  font-size:12.5px; line-height:1; padding:7px 11px;
  border:1px solid #d8e4f0; border-radius:999px;
  color:var(--nd-action,#045FCB); background:#fff;
}
:root:root .nd-auto-toc .tocrow a:hover{ border-color:#0375FD; background:#F6FAFD; }
:root:root .nd-auto-toc .tocrow a.on{
  background:var(--nd-action,#045FCB); border-color:var(--nd-action,#045FCB); color:#fff;
}
:root:root .nd-auto-toc .tocrow a:focus-visible{ outline:3px solid var(--nd-focus,#5AA6FF); outline-offset:2px; }
/* Headings must clear the sticky bar when jumped to.
   ⚠️ scroll-margin keyed on [id^="ndx-"] is NOT enough: where a page already had ids the
   generator REUSES them (the GRP study's are case/configuration/results/…), so those targets
   got 0px and landed under the bar — 6 of its 7 pills. Keying on h2[id] covers every target
   regardless of how its id was produced. */
:root:root body.nd-surface-editorial h2[id]{ scroll-margin-top:76px; }
/* Generated-TOC pages land ~20px tighter than the hand-rolled four (the placeholder that
   holds the bar's slot shifts layout mid-jump), so give THEM a wider margin via :has() —
   the hand-rolled pages have no #ndx-toc and keep their tuned 76px. Engines without :has()
   fall back to 76px, which still clears the bar. */
:root:root body.nd-surface-editorial:has(#ndx-toc) h2[id]{ scroll-margin-top:96px; }
/* NB: do NOT also set scroll-padding-top on the root — the two stack and every pill then
   lands 152px down, half a screen of dead space. */
/* 2026-08-04 (Tord): position parity with the DAF page. DAF's bar sits directly UNDER
   the hero — full-bleed, centred 860 inner, ONE 52px line — while the generated bar was
   injected down at the byline area, column-bound and wrapping 2–3 rows at rest. The JS
   relocates the nav to just after the hero (class ndx-hero); this styles that rest state
   exactly like the DAF bar. Pages without a hero section keep the old placement. */
:root:root .nd-auto-toc.ndx-hero{ margin:0; }
:root:root .nd-auto-toc.ndx-hero .tocin{ max-width:860px; margin:0 auto; padding:9px 32px; }
@media (min-width:761px){
  :root:root .nd-auto-toc.ndx-hero .tocrow{ flex-wrap:nowrap; overflow-x:auto; row-gap:0; }
}
@media (max-width:760px){
  :root:root .nd-auto-toc .tocin{ gap:10px; padding:8px 0; }
  :root:root .nd-auto-toc.ndx-hero .tocin{ padding:8px 16px; }
  :root:root .nd-auto-toc .toclabel{ font-size:11px; }
}
@media print{ :root:root .nd-auto-toc{ display:none; } }
/* The three other hand-rolled bars (PHC, Subsea, ST-0378) share the DAF bar's family and
   its width bug: label + pills exceed the column at every desktop width, clipping with the
   scrollbar hidden. Same fix as DAF's: desktop drops the label, pills wrap instead of clip.
   DAF's own plugin already carries this. */
@media (min-width:761px){
  :root:root .nphc-toc .toclabel, :root:root .nsub-toc .toclabel, :root:root .n378-toc .toclabel{ display:none; }
  /* these bars are CSS-sticky for the whole page, so wrapping would pin a multi-line bar
     (ST-0378: 3 lines) and undercut the tuned 76px landings — one scrollable line instead */
  :root:root .nphc-toc .tocrow, :root:root .nsub-toc .tocrow, :root:root .n378-toc .tocrow{
    flex-wrap:nowrap; overflow-x:auto; row-gap:0;
  }
}
/* == nd-p1-b2h == */
:root:root .nd-b2h{ margin:34px 0 8px; }
:root:root .nd-b2h a{
  display:inline-flex; align-items:center; gap:.5em;
  font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace);
  font-size:var(--nd-label-min,12.5px); letter-spacing:.1em; text-transform:uppercase;
  color:var(--nd-action,#045FCB); text-decoration:none;
  padding:10px 0; min-height:44px; box-sizing:border-box;
}
:root:root .nd-b2h a:hover{ text-decoration:underline; }
:root:root .nd-b2h a:focus-visible{ outline:3px solid var(--nd-focus,#5AA6FF); outline-offset:3px; }
/* if it ever lands on a dark band, use the light token */
:root:root .band-deck .nd-b2h a, :root:root .band-abyss .nd-b2h a,
:root:root .band-deep .nd-b2h a{ color:var(--nd-focus,#5AA6FF); }
/* == nd-p1-kbcontent == */
/* ⚠️ These blocks are injected next to the byline, which on the Elementor pages sits inside a
   widget styled MONO + ITALIC — so anything dropped there INHERITS mono italic. They must
   declare their own typography, not inherit it. The heading rules also need an element+class
   selector (0,3,1): a plain .nd-brief-h (0,3,0) loses to the W1 scale's `main h2` (0,3,1). */
:root:root .nd-dek{
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif)!important;
  font-style:normal!important;
  font-size:clamp(17px,1.5vw,19px)!important; line-height:1.5; color:var(--nd-ink,#0C1A2E);
  font-weight:500; margin:0 0 18px; max-width:62ch; text-wrap:pretty;
}
:root:root .nd-brief{
  margin:22px 0 26px; padding:18px 20px; border-radius:12px;
  background:var(--nd-surface-ice,#EAF3FB); border:1px solid rgba(3,117,253,.14);
}
:root:root body.nd-surface-editorial .nd-brief h2.nd-brief-h,
:root:root .nd-brief h2.nd-brief-h{
  font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace)!important;
  font-style:normal!important;
  font-size:var(--nd-label-min,12.5px)!important; letter-spacing:.12em; text-transform:uppercase;
  color:var(--nd-action,#045FCB); margin:0 0 10px!important; line-height:1.4!important; font-weight:600!important;
}
:root:root .nd-brief ul{ margin:0; padding-left:20px; }
:root:root .nd-brief li, :root:root .nd-brief p{
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif)!important;
  font-style:normal!important; font-size:16px!important;
  margin:5px 0; color:var(--nd-ink,#0C1A2E); line-height:1.55;
}
/* appended after the last container, so they were FULL-BLEED on Elementor pages —
   constrain to the article column (the appended back-link gets the same treatment) */
:root:root .nd-rel{ max-width:860px; margin:34px auto 0; padding:0 24px; }
:root:root p.nd-b2h{ max-width:860px; margin-left:auto!important; margin-right:auto!important; padding:0 24px; box-sizing:border-box; }
:root:root body.nd-surface-editorial .nd-rel h2.nd-rel-h,
:root:root .nd-rel h2.nd-rel-h{
  font-family:var(--nd-font-mono,'IBM Plex Mono',ui-monospace,monospace)!important;
  font-style:normal!important;
  font-size:var(--nd-label-min,12.5px)!important; letter-spacing:.12em; text-transform:uppercase;
  color:var(--nd-ink-muted,#5C6E86); margin:0 0 12px!important; line-height:1.4!important; font-weight:600!important;
}
:root:root .nd-rel ul{ list-style:none; margin:0; padding:0; display:grid; gap:8px; }
:root:root .nd-rel-prod ul{ grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:10px; }
:root:root .nd-rel-lk a{ display:flex; align-items:center; justify-content:center;
  background:#fff; padding:16px 18px; min-height:72px; }
:root:root .nd-rel-lk a:hover{ background:var(--nd-surface-foam,#F6FAFD); }
:root:root .nd-rel-lk img{ height:32px; width:auto; max-width:100%; display:block; }
:root:root .nd-rel li{ margin:0; }
:root:root .nd-rel a{
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif)!important;
  font-style:normal!important; font-size:15.5px!important;
  display:block; padding:13px 16px; border-radius:12px; text-decoration:none;
  border:1px solid rgba(3,117,253,.14); background:var(--nd-surface-foam,#F6FAFD);
  color:var(--nd-action,#045FCB); min-height:44px; box-sizing:border-box;
}
:root:root .nd-rel a:hover{ border-color:var(--nd-action,#045FCB); }
:root:root .nd-rel a:focus-visible{ outline:3px solid var(--nd-focus,#5AA6FF); outline-offset:2px; }
:root:root .nd-rel-n{ display:block; font-weight:700; }
:root:root .nd-rel-d{ display:block; font-size:13.5px; color:var(--nd-ink-muted,#5C6E86); margin-top:2px; }
@media (max-width:760px){
  :root:root .nd-brief{ padding:16px; }
  :root:root .nd-rel{ padding:0 16px; }
  :root:root p.nd-b2h{ padding:0 16px; }
  :root:root .nd-rel-lk img{ height:28px; }
}
/* == nd-form-progressive-css == */
:root:root .nd-form-more{
  display:flex; align-items:center; gap:10px; width:100%;
  min-height:48px; padding:12px 16px; margin:4px 0 14px;
  border:1px dashed rgba(3,117,253,.42); border-radius:8px;
  background:transparent; color:var(--nd-action,#045FCB);
  font-family:var(--nd-font-body,'DM Sans',system-ui,sans-serif);
  font-size:15px; font-weight:700; cursor:pointer; text-align:left;
}
:root:root .nd-form-more:hover{ background:rgba(3,117,253,.06); border-style:solid; }
:root:root .nd-form-more:focus-visible{ outline:3px solid var(--nd-focus,#5AA6FF); outline-offset:3px; }
:root:root .nd-form-more-i{
  font-family:var(--nd-font-mono,'IBM Plex Mono',monospace); font-size:17px; line-height:1;
  width:20px; text-align:center; flex:none;
}
:root:root .nd-form-more.is-open .nd-form-more-i{ transform:rotate(45deg); }
:root:root .nd-form-more-n{
  margin-left:auto; font-family:var(--nd-font-mono,'IBM Plex Mono',monospace);
  font-size:var(--nd-label-min,12.5px); font-weight:500; color:var(--nd-ink-muted,#5C6E86);
}
/* on the dark RFQ bands the dashed rule and label need the light tokens */
:root:root .band-deck .nd-form-more, :root:root .band-abyss .nd-form-more,
:root:root .band-deep .nd-form-more, :root:root .prov .nd-form-more{
  color:var(--nd-focus,#5AA6FF); border-color:rgba(90,166,255,.45);
}
:root:root .band-deck .nd-form-more-n, :root:root .band-abyss .nd-form-more-n,
:root:root .band-deep .nd-form-more-n, :root:root .prov .nd-form-more-n{ color:#C4D2E6; }
:root:root .nd-form-adv[hidden]{ display:none; }
/* == nd-p1-kbhero == */
:root:root section.nahc-hero, :root:root section.navp-hero, :root:root section.naph-hero,
:root:root section.nclc-hero, :root:root section.n103-hero, :root:root section.n378-hero,
:root:root section.nn1-hero,  :root:root section.ndnv-hero, :root:root section.nwnd-hero,
:root:root section.nmru-hero, :root:root section.noct-hero, :root:root section.ndec-hero,
:root:root section.nplr-hero, :root:root section.nqkl-hero, :root:root section.nres-hero,
:root:root section.nrsr-hero, :root:root section.nshk-hero, :root:root section.nspz-hero,
:root:root section.nsub-hero, :root:root section.nret-hero, :root:root section.nwav-hero,
:root:root section.nww-hero{
	border-radius: 0 !important;
	margin-bottom: 0 !important;
}
/* == nd-a11y-axe == */
/* ---- axe: link-in-text-block (34 nodes / 4 pages) -------------------------
   An inline link inside running prose was distinguished from the surrounding
   text by colour alone, at 1.14-1.72:1 against the body ink. WCAG needs 3:1
   OR a non-colour cue. Tord is colour blind, so the cue is the right answer,
   not a colour tweak. Buttons, chips, cards and site chrome are excluded --
   they carry their own affordance. */
html body .entry-content p > a:not([class]),
html body .entry-content li > a:not([class]),
html body .entry-content dd > a:not([class]),
html body .entry-content p > a.golink,
html body .entry-content p > a.go {
  text-decoration: underline;
  text-underline-offset: .18em;
  text-decoration-thickness: from-font;
}
html body .entry-content nav a,
html body .entry-content .tocrow a,
html body .entry-content [class*="btn"],
html body .entry-content [class*="chip"],
html body .entry-content [class*="card"] a { text-decoration: none; }

/* ---- axe: scrollable-region-focusable (122 nodes / 28 pages) --------------
   Focus ring for the containers the script below makes keyboard-scrollable. */
html body [data-nd-scrollable]:focus-visible {
  outline: 3px solid var(--nd-focus, #5AA6FF);
  outline-offset: 2px;
}

/* ---- axe: empty-table-header (4 nodes / 2 pages) -------------------------
   The corner cell of the comparison tables is empty by design; give it a name
   for screen readers without changing the visual. */
.nd-sr-only {
  position: absolute !important; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
/* == nd-p1-footchev == */
@media (min-width:761px){
  :root:root body.nd-surface-editorial .nd-global-footer .nd-facc-sum{
    display:flex; align-items:center; justify-content:flex-start; gap:10px; width:fit-content; max-width:100%;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-facc-sum .nd-footer-title{
    margin:0;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-facc-sum::after{
    content:""; flex:none; width:7px; height:7px; margin:0;
    border-right:2px solid #0375FD; border-bottom:2px solid #0375FD;
    transform:translateY(-3.75px) rotate(45deg); transition:transform .18s ease;
  }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-facc[open] > .nd-facc-sum::after{
    transform:translateY(0) rotate(225deg);
  }
}
/* == nd-p1-footcompact2 == */
@media (min-width:761px){
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-inner{ padding-top:30px; padding-bottom:18px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-brandrow{ margin-bottom:20px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-grid{ gap:16px 30px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-facc-sum{ min-height:44px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-certs{ gap:10px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-certs img,
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-certs svg{ height:44px!important; width:auto!important; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-settle{ height:26px; margin-top:12px; margin-bottom:2px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-bottom{ margin-top:16px; padding-top:12px; }
}
@media (max-width:760px){
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-inner{ padding-top:26px; padding-bottom:16px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-brandrow{ margin-bottom:16px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-certs img,
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-certs svg{ height:40px!important; width:auto!important; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-settle{ height:22px; margin-top:10px; }
  :root:root body.nd-surface-editorial .nd-global-footer .nd-footer-bottom{ margin-top:14px; padding-top:10px; }
}
/* == nd-perf-lighthouse == */
/* Defensive only. Lighthouse reports image-aspect-ratio against an ISO badge on
   every page, but investigation on 2026-08-05 found the FOOTER badge is correct:
   width=300 height=96 against a 300x96 file (3.125). The flagged node is a
   SECOND, class-less copy of the badge that carries no width/height and sits
   inside a display:none ancestor (getBoundingClientRect 0x0 at both 1440px and
   390px), so it is invisible to users and costs 4 best-practices points only.
   Left alone deliberately rather than guessed at; this rule just keeps the real
   footer badge's ratio pinned to its intrinsic one. */
.nd-footer-cert { height: auto; }
/* == nd-p1-kbmech == */
/* ---- legacy "Related Articles" blocks retired (Tord 2026-08-04: "the related product
   and related reading style is not unified across KB") ----
   13 pages carry a hand-rolled Elementor block headed "Related Articles" that actually
   holds white-on-dark PRODUCT cards with inline styles. With every KB row now defining
   'prods', the W7 generator emits the wordmark lockup pills on all 28 pages, so those
   legacy blocks are a SECOND related module in a style nothing else uses. Hidden rather
   than deleted from the stores: the widget ids are stable and generic, this is one rule
   instead of 13 dual-store content edits, and it reverses by deleting these lines.
   The container that held them is zeroed too, or it leaves a padded empty band. */
:root:root body.nd-surface-editorial [data-id^="nd_kh_related_"],
:root:root body.nd-surface-editorial [data-id="nd_ahc_products"]{ display:none !important; }
/* the tagged heading is one widget; its link list is the NEXT widget — hide both */
:root:root body.nd-surface-editorial .elementor-element:has(> .elementor-widget-container > h3.nd-rel-legacy),
:root:root body.nd-surface-editorial .elementor-element:has(> .elementor-widget-container > h3.nd-rel-legacy) + .elementor-element{ display:none !important; }
/* in-flow variant: hide only the heading and the list that follows it */
:root:root body.nd-surface-editorial h3.nd-rel-legacy-inline,
:root:root body.nd-surface-editorial h3.nd-rel-legacy-inline + ul{ display:none !important; }
:root:root body.nd-surface-editorial .e-con:has(>.e-con-inner>[data-id^="nd_kh_related_"]:only-child),
:root:root body.nd-surface-editorial .e-con-inner:has(>[data-id^="nd_kh_related_"]:only-child){
  padding-top:0 !important; padding-bottom:0 !important; }
:root:root body.nd-surface-editorial #primary{ min-width:0; }
:root:root body.nd-surface-editorial .entry-content img[class*="wp-image-"]{ max-width:100%; height:auto; }
:root:root .elementor-element-0d81c63c p,
:root:root .elementor-element-a668ccfe p,
:root:root .elementor-element-b33a69fe p,
:root:root .elementor-element-9d93ade5 p,
:root:root .elementor-element-30de6c2 p,
:root:root .elementor-element-f7da7d9 p,
:root:root .elementor-element-6907d01 p,
:root:root .elementor-element-0ee9b37 p,
:root:root .elementor-element-fca1fd7 p,
:root:root .elementor-element-18fccb7 p,
:root:root .elementor-element-4a24ccc p{ font-style:normal!important; }
body.page-id-9585 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9585 .entry-content > h2,
body.page-id-9667 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9667 .entry-content > h2,
body.page-id-9668 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9668 .entry-content > h2,
body.page-id-9669 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9669 .entry-content > h2,
body.page-id-9670 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9670 .entry-content > h2,
body.page-id-9671 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9671 .entry-content > h2,
body.page-id-9672 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9672 .entry-content > h2,
body.page-id-9673 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9673 .entry-content > h2,
body.page-id-9674 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9674 .entry-content > h2,
body.page-id-9675 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-9675 .entry-content > h2,
body.page-id-5902 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6626 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-5837 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7859 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7860 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7497 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-4830 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-5772 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-5496 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6648 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7300 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7304 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7303 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7302 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7301 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7297 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7299 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7298 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6656 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7444 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7448 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7447 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7446 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7445 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7441 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7443 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7442 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6654 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7340 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7344 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7343 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7342 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7341 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7337 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7339 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7338 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7895 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7871 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7877 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7874 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7883 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7886 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7880 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7889 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7892 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7896 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7872 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7878 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7875 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7884 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7887 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7881 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7890 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7893 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6808 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7500 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7504 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7503 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7502 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7501 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7497 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7499 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7498 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6646 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7284 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7288 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7287 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7286 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7285 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7281 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7283 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7282 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6650 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7308 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7312 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7311 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7310 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7309 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7305 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7307 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7306 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6653 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7316 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7320 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7319 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7318 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7317 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7313 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7315 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7314 .entry-content h2:not(.nd-brief-h):not(.nd-k9-gate *){
  display:inline-block; border-bottom:3px solid #0A1D3A;
  padding-bottom:8px; margin-bottom:8px;
}
body.page-id-6648 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7300 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7304 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7303 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7302 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7301 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7297 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7299 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7298 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6656 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7444 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7448 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7447 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7446 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7445 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7441 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7443 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7442 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6654 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7340 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7344 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7343 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7342 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7341 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7337 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7339 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7338 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7895 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7871 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7877 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7874 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7883 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7886 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7880 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7889 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7892 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7896 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7872 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7878 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7875 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7884 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7887 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7881 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7890 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7893 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6808 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7500 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7504 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7503 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7502 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7501 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7497 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7499 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7498 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6646 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7284 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7288 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7287 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7286 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7285 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7281 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7283 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7282 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6650 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7308 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7312 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7311 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7310 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7309 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7305 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7307 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7306 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-6653 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7316 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7320 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7319 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7318 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7317 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7313 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7315 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *),
body.page-id-7314 .elementor-widget-container > h2:not(.nd-brief-h):not(.nd-k9-gate *){
  margin-left:max(0px, calc(50% - 430px)) !important; margin-right:auto !important;
}
:root:root body.nd-surface-editorial .entry-content .elementor-widget-divider--view-line{ display:none; }
body.page-id-9585 .entry-content > *,body.page-id-9667 .entry-content > *,body.page-id-9668 .entry-content > *,body.page-id-9669 .entry-content > *,body.page-id-9670 .entry-content > *,body.page-id-9671 .entry-content > *,body.page-id-9672 .entry-content > *,body.page-id-9673 .entry-content > *,body.page-id-9674 .entry-content > *,body.page-id-9675 .entry-content > *{ max-width:860px; margin-left:auto; margin-right:auto; }
body.page-id-9585 .entry-content > .ndr-hero,body.page-id-9667 .entry-content > .ndr-hero,body.page-id-9668 .entry-content > .ndr-hero,body.page-id-9669 .entry-content > .ndr-hero,body.page-id-9670 .entry-content > .ndr-hero,body.page-id-9671 .entry-content > .ndr-hero,body.page-id-9672 .entry-content > .ndr-hero,body.page-id-9673 .entry-content > .ndr-hero,body.page-id-9674 .entry-content > .ndr-hero,body.page-id-9675 .entry-content > .ndr-hero,body.page-id-9585 .entry-content > .ndr-titleband,body.page-id-9667 .entry-content > .ndr-titleband,body.page-id-9668 .entry-content > .ndr-titleband,body.page-id-9669 .entry-content > .ndr-titleband,body.page-id-9670 .entry-content > .ndr-titleband,body.page-id-9671 .entry-content > .ndr-titleband,body.page-id-9672 .entry-content > .ndr-titleband,body.page-id-9673 .entry-content > .ndr-titleband,body.page-id-9674 .entry-content > .ndr-titleband,body.page-id-9675 .entry-content > .ndr-titleband,body.page-id-9585 .entry-content > .nd-auto-toc,body.page-id-9667 .entry-content > .nd-auto-toc,body.page-id-9668 .entry-content > .nd-auto-toc,body.page-id-9669 .entry-content > .nd-auto-toc,body.page-id-9670 .entry-content > .nd-auto-toc,body.page-id-9671 .entry-content > .nd-auto-toc,body.page-id-9672 .entry-content > .nd-auto-toc,body.page-id-9673 .entry-content > .nd-auto-toc,body.page-id-9674 .entry-content > .nd-auto-toc,body.page-id-9675 .entry-content > .nd-auto-toc,body.page-id-9585 .entry-content > #ndx-toc,body.page-id-9667 .entry-content > #ndx-toc,body.page-id-9668 .entry-content > #ndx-toc,body.page-id-9669 .entry-content > #ndx-toc,body.page-id-9670 .entry-content > #ndx-toc,body.page-id-9671 .entry-content > #ndx-toc,body.page-id-9672 .entry-content > #ndx-toc,body.page-id-9673 .entry-content > #ndx-toc,body.page-id-9674 .entry-content > #ndx-toc,body.page-id-9675 .entry-content > #ndx-toc{ max-width:none; margin-left:0; margin-right:0; }
body.page-id-9585 .entry-content > h2,body.page-id-9667 .entry-content > h2,body.page-id-9668 .entry-content > h2,body.page-id-9669 .entry-content > h2,body.page-id-9670 .entry-content > h2,body.page-id-9671 .entry-content > h2,body.page-id-9672 .entry-content > h2,body.page-id-9673 .entry-content > h2,body.page-id-9674 .entry-content > h2,body.page-id-9675 .entry-content > h2{ display:table; margin-left:max(0px, calc(50% - 430px)) !important; margin-right:auto !important; }
/* == nd-svg-figure-legibility == */
.nd-figscroll{
  overflow-x:auto; overflow-y:hidden;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:thin;
  position:relative;
  /* the shadow on the right edge is the affordance that says "there is more" */
  background:
    linear-gradient(to right, var(--nd-surface-white,#fff) 30%, rgba(255,255,255,0)) left center / 28px 100% no-repeat,
    linear-gradient(to left,  var(--nd-surface-white,#fff) 30%, rgba(255,255,255,0)) right center / 28px 100% no-repeat,
    radial-gradient(farthest-side at 0   50%, rgba(12,26,46,.16), rgba(12,26,46,0)) left center / 14px 100% no-repeat,
    radial-gradient(farthest-side at 100% 50%, rgba(12,26,46,.16), rgba(12,26,46,0)) right center / 14px 100% no-repeat;
  background-attachment:local, local, scroll, scroll;
}
.nd-figscroll > svg{ display:block; max-width:none !important; height:auto; }
.nd-figscroll:focus-visible{ outline:3px solid var(--nd-focus,#5AA6FF); outline-offset:2px; }
/* dark plates: the fade must match the plate, not white */
.band-deck .nd-figscroll, .band-abyss .nd-figscroll, .band-deep .nd-figscroll,
[class*="hero"] .nd-figscroll{ background-image:none; }
.nd-figscroll-hint{
  display:block; font-family:var(--nd-font-mono,ui-monospace,monospace);
  font-size:12.5px; color:var(--nd-ink-muted,#5C6E86); margin:6px 0 0;
}
@media (min-width:1100px){ .nd-figscroll-hint{ display:none; } }
/* == nd-ndop-fit == */
@media (max-width: 880px) {
  :root:root .ndop-grid2 > * { min-width: 0; }
  /* the figure keeps its own scroller; make sure it can actually clip */
  :root:root .ndop-panel .nd-figscroll { max-width: 100%; }

  /* Same blowout in the .nsty-* study system (nd-kb-study-splash.php and
     nd-kb-case-engine.php share it): .nsty-chart sized itself to its 510px content
     inside a 350px column, and with every ancestor overflow-x:visible the page really
     did scroll sideways — 140px at 390, the ONLY page on the site that did. */
  :root:root .nsty-charts, :root:root .nsty-blk { min-width: 0; }
  :root:root .nsty-chart { min-width: 0; max-width: 100%; }
}
/* == nd-hint-contrast == */
:root:root .proof .nd-figscroll-hint,
:root:root .proof .nd-figscroll-hint a { color: #AFC4DD; }
/* == nd-header-cta-contrast == */
/* Solid azure whenever the header is opaque. On pages that already set this fill the
   declaration is identical, so nothing moves; on a dark opaque header the button becomes
   filled rather than outlined, which is still correct and still legible. Transparent
   headers sit over dark hero imagery and keep the white outline treatment. */
:root:root body:not(.ast-theme-transparent-header) .ast-primary-header-bar .nd-header-cta > a,
:root:root body:not(.ast-theme-transparent-header) .ast-primary-header-bar .nd-header-cta > a:visited{
  background: #045FCB;
  border-color: #045FCB !important;
  color: #fff !important;
}
:root:root body:not(.ast-theme-transparent-header) .ast-primary-header-bar .nd-header-cta > a:hover,
:root:root body:not(.ast-theme-transparent-header) .ast-primary-header-bar .nd-header-cta > a:focus-visible{
  background: #034FA8;
  border-color: #034FA8 !important;
  color: #fff !important;
}
/* == nd-impeccable-fixes == */
/* --- 1b. swap the two header markups at the NEW breakpoint --------------
   The `astra_header_break_point` filter moves Astra's JS breakpoint and the
   `ast-header-break-point` body class, but the CSS that shows/hides the two
   header markups is emitted separately and STILL carries the old 768.99/769
   pair -- the filter does not move it. So the desktop header has to be hidden
   here or it renders right across the broken band with the hamburger beside it.

   Keyed on the BODY CLASS, not on a media query. A media query cannot be
   trusted to agree with the class: Astra's early JS flips
   `ast-header-break-point` at max-width 921.99px, and on a DPR-2 display the
   viewport rounds such that `innerWidth === 922` while
   `matchMedia('(max-width:921.99px)')` is already true. A 921.98px cut-off
   therefore disagreed with the class by 0.01px and rendered BOTH headers at
   once -- reproduced at 922px. Keying the hide on the same class Astra's own
   `.ast-header-break-point #ast-mobile-header{display:block}` uses puts the
   two in permanent lockstep, at any DPR. */
:root:root body.ast-header-break-point #ast-desktop-header{display:none!important}
:root:root body.ast-header-break-point #ast-mobile-header{display:block!important}

/* --- 1c. NOT DONE ON PURPOSE. Above 921 the desktop nav still fits on one row,
   but between ~922 and ~960 the logo (250px) and the menu leave no gap and
   "Products" nicks the wordmark's bounding box by ~3-12px. Trimming the per-item
   padding was tried and made it WORSE, not better: the menu is laid out from its
   left edge, so shrinking the items pulls the whole row further left INTO the
   logo -- measured onLogo 153 -> 1153 px^2 at 950. Reverted. The real fix is to
   shorten a menu label or narrow the logo lockup in that band, which is a content
   /brand decision, not a CSS one. Left as-is: it is a few px of bounding-box
   overlap between two elements that do not visually collide, and it predates
   this pass. NB the breakpoint is 921 rather than 960 because
   nd-kb-megamenu.php styles the mobile header content at max-width:921.98px:
   at 960 the band 922-960 showed the hamburger but rendered the OPENED menu
   unstyled, as one overflowing row that ran off the viewport. */

/* --- 1d. THE OPENED MOBILE MENU WAS UNREADABLE: 1.06:1 -----------------
   Pre-existing, and it applied at every mobile width -- widening the header
   breakpoint just exposed it to more viewports, so it has to be fixed here.
   The transparent-header styling paints top-level nav links #EFF2FF so they
   read over the dark hero. The mobile dropdown panel's ul is #F9F9F9, and the
   white travelled with them: six links and their carets measured #EFF2FF on
   #F9F9F9 = 1.06:1, i.e. invisible. (Submenu items .nd-mm and the language
   items were already ink and were fine; li.nd-header-cta is white-on-#045FCB
   and is deliberately excluded so the CTA button keeps its label.)
   Scoped to #ast-mobile-header so the desktop nav keeps its white over the
   hero photo. No media query, for the same reason as 1b: #ast-mobile-header
   only ever renders when the body carries ast-header-break-point, so scoping
   to that element is already exactly the right condition and cannot drift out
   of step with it at fractional viewport widths. */
:root:root #ast-mobile-header .main-header-bar-navigation li:not(.nd-header-cta) > a.menu-link,
:root:root #ast-mobile-header .main-header-bar-navigation li:not(.nd-header-cta) > a.menu-link:visited{
  color:var(--nd-ink,#0C1A2E)!important;
}
:root:root #ast-mobile-header .main-header-bar-navigation .ast-menu-toggle{
  color:var(--nd-ink,#0C1A2E)!important;
}

/* --- 1e. TWO nav items underlined at once on /heave-compensation/ --------
   Reported by Tord 2026-08-05. The active-state rule paints `::after` for both
   `.current-menu-item` and `.current-menu-ancestor`. That is right on a product
   page, where the current item is a SUBMENU entry and the only visible cue is
   the "Products" ancestor. It is wrong on /heave-compensation/, which is both a
   top-level menu item AND a child page of Products, so WordPress marks
   "Heave compensation" current-menu-item and "Products" current-menu-ancestor +
   current_page_parent — two underlines for one location.
   Suppress the ancestor ONLY when a TOP-LEVEL sibling is the exact current item;
   `:has(> li.current-menu-item)` is deliberately child-scoped so product pages,
   where the current item is nested, keep the "Products" underline.
   Measured across all 23 registry pages: pillar was the only one with more than
   one underline, and every other page still shows exactly one afterwards.
   ⚠️ `:not(.current-menu-item)` is load-bearing. On /knowledge-hub/ ONE li carries
   BOTH classes — it is the current page and an ancestor of its own articles — so
   without the exclusion the rule suppressed the current item's own underline and
   the hub went from 1 underline to 0. Caught by re-running navactive.mjs.
   @supports makes the fallback explicit — without :has() the rule is skipped and
   the behaviour is simply today's, which is cosmetic, not broken. */
@supports selector(:has(*)){
  :root:root #ast-desktop-header .main-header-menu:has(> li.current-menu-item)
    > li.current-menu-ancestor:not(.current-menu-item) > .menu-link::after,
  :root:root #ast-mobile-header .main-header-menu:has(> li.current-menu-item)
    > li.current-menu-ancestor:not(.current-menu-item) > .menu-link::after{
    content:none!important;
  }
}

/* --- 2. hero scrim: hold the plateau across the text column ------------- */
@media (min-width:768px){
  :root:root body.nd-hero-type .elementor-element-8bcd764::before{
    background:linear-gradient(90deg,
      rgba(6,17,34,.88) 0%,
      rgba(6,17,34,.84) 38%,
      rgba(6,17,34,.80) 52%,
      rgba(6,17,34,.66) 68%,
      rgba(6,17,34,.22) 82%,
      rgba(6,17,34,0) 92%)!important;
  }
}
/* 768-1099 the operating-window tile is already display:none (see
   nd-home-hero-responsive.php), so there is no artwork on the right half to
   protect and the hero photo is cropped tighter -- brighter pixels land under
   the eyebrow. Hold the plateau much further right in that band. */
@media (min-width:768px) and (max-width:1099px){
  :root:root body.nd-hero-type .elementor-element-8bcd764::before{
    background:linear-gradient(90deg,
      rgba(6,17,34,.90) 0%,
      rgba(6,17,34,.88) 55%,
      rgba(6,17,34,.80) 72%,
      rgba(6,17,34,.40) 88%,
      rgba(6,17,34,.18) 100%)!important;
  }
}

/* --- 3. contrast: swap to the site's own AA-safe tokens ----------------- */
:root:root .ndwhy-stds{
  color:var(--nd-muted,#5C6E86)!important;
}
:root:root body.page-id-2 .ndwhy-label,
:root:root .ndwhy-stat .ndwhy-label{
  color:var(--nd-azure-deep,#045FCB)!important;
}
:root:root .ndop-kpi-v span,
:root:root .ndop-kpis .ndop-kpi-v span{
  color:var(--nd-azure-deep,#045FCB)!important;
}

/* --- 4. wide product-family table: inset + a desktop scroll affordance --- */
:root:root .ndfam-table-scroll{
  padding:10px 12px!important;
}
:root:root .nd-scrollcue.nd-cue-desktop{
  display:flex!important;
}
/* == nd-no-ai-tells == */
/* Chips / question cards: the left rail becomes the same hairline as the other three sides. */
:root:root .noct-chip,:root:root .ndnv-q,:root:root .nmru-chip,:root:root .nqkl-chip,
:root:root .nret-chip,:root:root .nspz-chip,:root:root .n378-chip,:root:root .ntfl-chip,
:root:root .nres-chip{border-left:1px solid var(--nh)}

/* "this is the one that matters" modifiers: colour the whole border, not a stripe. */
:root:root .nplr-hot,:root:root .nqkl-hot,:root:root .nsub-shot,
:root:root .nwav-hot,:root:root .nwnd-hot{border:1px solid var(--na)}
:root:root .nret-hot,:root:root .nspz-hot,:root:root .ntfl-hot{border:1px solid var(--nax)}

/* Callout / note / caveat boxes that already carry a frame or a tint. */
:root:root .nd-kb-funnel{border-left:1px solid #d8e1e8}
:root:root .ndop-caveat{border-left:1px solid #eef3fb;border-radius:8px}
:root:root .ndt-oos{border-left:1px solid var(--nhs)}
:root:root .nsty-env{border-left:1px solid rgba(185,120,46,.48)}
:root:root .nsty-review{border-left:0}
:root:root .ndct .callout{border-left:1px solid var(--line);border-radius:12px}
:root:root .nd-kbr{border-left:1px solid var(--kbr-line)}
:root:root .nd-lead-cta{border-left:0}
:root:root .nd-pp-oper{border-left:1px solid #b9dcc0}
:root:root .ndr-callout,:root:root .ndr-convention,
:root:root .ndr-vector,:root:root .ndr-data-qa{border-left:1px solid var(--ndr-line)}
:root:root .ndr-callout-amber{border:1px solid var(--ndr-amber)}

/* Bare notes and labels, where the stripe was the only decoration: drop it and its indent. */
:root:root .ndcp2-note,:root:root .ndcap-note,:root:root .ndcap-limits,
:root:root .naph-note,:root:root .ndr-note,
:root:root .toclabel,
:root:root .ndcx-method .it,:root:root .nd-op-sizing .it{border-left:0;padding-left:0}

/* Numbered-step rails: keep the connector, lose the glow and the azure weight. */
:root:root .rail::before{width:1px;background:rgba(12,26,46,.14);box-shadow:none}
:root:root .step::before{box-shadow:none}

/* Knowledge Hub section headings: the gradient stripe goes entirely. */
:root:root .khub .sec::before{display:none}
:root:root .khub .sec{padding-left:0}

/* Two KB pages carry the box as an inline style attribute, so this one needs !important. */
:root:root [style*="border-left:4px solid #0375FD"]{border-left:1px solid #dfe6f0!important}

/* ---- coloured glows on dark surfaces (impeccable "dark-glow") ---- */
:root:root .dot{box-shadow:none}                       /* amber eyebrow dot */
:root:root .svx-marker .node{box-shadow:none}          /* services step node */
:root:root .svx-wire{box-shadow:none}                  /* services progress wire */
:root:root .svx-btn.primary{box-shadow:none}           /* glow under the CTA button */

/* ---- radial halo / spotlight ---- */
:root:root .sl-hero-glow{display:none}
:root:root .svx-cta{background:linear-gradient(180deg,#071a37,#01205F)}

/* ---- image hover zoom ---- */
:root:root .sl-film:hover .sl-film-poster,
:root:root .chyd .delc:hover img,
:root:root .khub .feat:hover .im,
:root:root .khub .card:hover .im,
:root:root .svx-st:hover .svx-shot img{transform:none}
/* == nd-contrast-cleanup == */
/* --- 1. CONSTELLATION section numbers + film links on light panels ------- */
:root:root .con .no,
:root:root .con a.no,
:root:root .con span.no{
  color:var(--nd-azure-deep,#045FCB)!important;
}

/* --- 2. Operability acceptance-gate table column headers ----------------- */
:root:root .ndcap-gates th:not([scope="row"]){
  color:var(--nd-muted,#5C6E86)!important;
}

/* --- 3. RIGEL step numbers and before/after figures ---------------------- */
:root:root .rail .step .n,
:root:root .headline-pair .before,
:root:root .ba .pair .before{
  color:#9A6222!important;        /* amber-deep darkened on-hue: 3.63 -> 5.07 */
}
:root:root .headline-pair .after,
:root:root .ba .pair .after{
  color:#127A64!important;        /* settled-deep darkened on-hue: 4.02 -> 5.26 */
}

/* --- 4. KB hero text scrim: hold it across the kicker -------------------- */
:root:root .nphc-herotext,
:root:root .ndd-herotext,
:root:root .nplr-herotext,
:root:root .nsub-herotext,
:root:root .naph-herotext{
  background-image:linear-gradient(to top,
    rgba(6,19,29,.94) 0%,
    rgba(6,19,29,.90) 55%,
    rgba(6,19,29,.84) 100%)!important;
}

/* --- 4b. Knowledge-hub featured card: same defect a third time -----------
   `.khub .feat .fin` is an absolutely-positioned text block sitting directly on
   the card photo with NO scrim at all, so its category label measured 1.63:1.
   The smaller `.khub .card .cat` labels were never affected because they carry
   their own dark pill; only the featured card lacked one. Scrim rather than a
   pill, to match the hero treatment above and because the title and dek sit on
   the same photo. The label text is JS-rendered by nd_khub_cases()/_proof(), so
   it cannot be found by grepping the static HTML. */
:root:root .khub .feat .fin{
  background-image:linear-gradient(to top,
    rgba(5,13,24,.93) 0%,
    rgba(5,13,24,.82) 60%,
    rgba(5,13,24,.55) 100%)!important;
}

/* --- 4c. Knowledge-hub cards with the LIGHT category pill ----------------
   `.khub .card .imsvg + .cat` switches the pill to rgba(255,255,255,.8) and is
   MEANT to switch the label to #31415c with it — but only the background half
   of that rule was winning, so the label kept `--nd-azure-hi` and measured
   1.63:1 on the light pill. The sibling cards with the dark pill were always
   fine, which is why only 2 of 31 `.cat` failed. Restoring the intended colour
   gives 6.65:1 on the same backdrop; no new value invented. */
:root:root .khub .card .imsvg + .cat{
  color:#31415C!important;
}

/* --- 5. Pillar hero: in-copy link on the dark navy hero ------------------ */
:root:root .hero a[href*="/products/constellation/"],
:root:root .hero a[href*="/products/constellation/"]:visited{
  color:var(--nd-azure-hi,#5AA6FF)!important;
}
/* == nd-section-head-align == */
:root:root .ndfam-head > p,
:root:root .ndapps-head > p,
:root:root .svx-proof-top > p{
  margin-bottom:0!important;
}
/* == nd-table-frame == */
/* --- 1. home: product-family matrix -------------------------------------
   .ndfam-table-scroll owns the frame. Drop the inset that split it in two,
   Astra's top+left on the table, and the last column's right rule.
   The frame is ASSERTED, not assumed: the locale twins carry a baked copy of
   the markup without the component's own <style>, so subtracting alone would
   leave them with no frame at all. Same value the component declares.       */
:root:root .ndfam-table-scroll{
  border:1px solid #E1E7EF!important;
  padding:0!important;
}
:root:root .ndfam-table{
  border:0!important;
}
:root:root .ndfam-table tr > *:last-child{
  border-right:0!important;
}
:root:root .ndfam-table tbody tr:last-child > *{
  border-bottom:0!important;
}
/* The label column was pinned to 110px in nd-design-tokens.php, which leaves
   82px inside the 14px padding. "Form factor" is the longest label and needs
   99.2px at 12.5px/1.2px tracking with white-space:nowrap — it overran its
   cell by 17.2px (same figure at 1440 and 1024). 132px clears it with slack;
   the six product columns lose ~3.7px each.                                 */
:root:root .ndfam-table tr > :first-child{
  width:132px!important;
  min-width:132px!important;
}

/* --- 2. /heave-compensation/: selector tables ----------------------------
   .seltbl draws its own rounded frame; only the last column doubled it.     */
:root:root .ndhc .seltbl tr > *:last-child{
  border-right:0!important;
}

/* --- 3. knowledge-hub study tables ---------------------------------------
   .nsty-tw owns the frame (and the 10px radius the square table corner was
   poking through).                                                          */
:root:root .nd-study .nsty-tw table{
  border:0!important;
}
:root:root .nd-study .nsty-tw table tr > *:last-child{
  border-right:0!important;
}

/* --- 4. product comparison tables (.tdtable) -----------------------------
   .tdtable owns the frame; the component already clears the last row with
   `.prov .tdtable tr:last-child td{border-bottom:0}` but the row's leading
   th[scope=row] is not a td, so it kept Astra's rule under the wrapper's.
   Frame asserted for the same reason as (1) — same values the component
   declares, so the EN page is unchanged.

   The 3px brand-coloured top border goes with it (Tord, 2026-08-09: reads as
   an AI tell). With the 12px radius it tapered into a shallow blue bracket
   above the header row. Eight of these, all 3px/1px/1px/1px: azure on
   /products/ and /constellation/, ANTARES red, CYGNUS near-black, POLARIS
   yellow. The class sits on the wrapper on some pages and on the table on
   others, and never on both (checked), so one rule covers all of them.      */
:root:root .tdtable{
  border:1px solid rgba(3,117,253,.14)!important;
}
:root:root .prov .tdtable table{
  border:0!important;
}
:root:root .prov .tdtable.cmp table tbody tr:last-child > *{
  border-bottom:0!important;
}
:root:root .prov .tdtable.cmp table tr > *:last-child{
  border-right:0!important;
}

/* --- 5. the same accent bar on cards -------------------------------------
   Identical device to (4) — a 3px saturated top border over a 9-12px radius,
   which tapers into a coloured bracket at the corners — on rounded cards
   rather than tables. Tord, 2026-08-09: strip it sitewide. 21 of them:

     .claim           x8   3px brand colour, no other border   (product pages)
     .ndop-kpi        x4   3px azure  / 1px #E6EBF2            (home, operability)
     .nmru-flowcell   x4   3px azure or amber / 1px var(--nh)  (MRU)
     .ndcap-buy       x3   3px #1B4FD1 / 1px #E6EBF2           (operability)
     .famc            x2   3px #3E5C78 / 1px rgba(3,117,253,.14) (VEGA)

   Each top border is set to the value of the sides that card already has,
   so the frame reads as one weight and one colour. .claim carries no other
   border, so it simply loses the bar. `.nmru-flowend` recolours the bar to
   amber with a plain declaration; the shorthand here overrides both.        */
:root:root .claim{
  border-top:0!important;
}
:root:root .ndop-kpi,
:root:root .ndcap-buy{
  border-top:1px solid #E6EBF2!important;
}
:root:root .nd-mru-up .nmru-flowcell{
  border-top:1px solid var(--nh)!important;
}
:root:root .famc{
  border-top:1px solid rgba(3,117,253,.14)!important;
}

/* --- 6. the same accent as a full-bleed section rule ---------------------
   24 more of them, 2px azure across the whole viewport at a section
   boundary. Square-ended, so no bracket, but the same device — and the
   boundary it marks is already a hard colour change (white -> deep navy),
   so the rule is doing nothing the background is not. Tord approved
   stripping these too, 2026-08-09.

   They come from exactly two declarations, not 24: the KB skin puts one on
   every hero container, and the Knowledge Hub index puts one on its CTA
   band. The per-element Elementor classes in the audit are all the same
   :has() rule matching.                                                    */
:root:root body.nd-kbskin .elementor [data-element_type="container"]:has(h1.elementor-heading-title){
  border-top:0!important;
}
:root:root .khub .band-deep{
  border-top:0!important;
}

/* --- 7. /products/ sounding line -----------------------------------------
   The echo-sounder trace above the two dark bands was sitting on the band
   edge instead of above it, and was being squashed to under two thirds of
   its drawn height.

   The artwork is a 1200x40 viewBox with preserveAspectRatio='none', a
   1.8-unit stroke, and a trace that runs y 13.5-35.4 and settles at y=27
   for most of its length. It was given a 24px-tall box at top:-16px, so
   1 unit = 0.6px: the settled line landed at +0.2px — dead on the boundary,
   where it reads as part of the edge — and the 1.8-unit stroke rendered at
   1.1px.

   height:40px restores 1 unit = 1px (stroke back to its drawn 1.8px), and
   top:-35px anchors the trace's deepest point (y 35.4) on the band edge, so
   the settled line now sits ~8px clear of it.                              */
:root:root .prov .band-deck::before,
:root:root .prov .band-deep::before{
  top:-35px!important;
  height:40px!important;
}
