/* DigiJaws site.css, built 2026-10-26T15:09:09+00:00 by dj-design-system 1.0.1. Do not edit: edit the source snippets, then rebuild. */
/* dj-a11y */
.dj-skip-link{position:absolute;left:-9999px;top:0;z-index:100000;background:#38bdf8;color:#030810;padding:10px 16px;border-radius:8px;font-weight:700;text-decoration:none;}.dj-skip-link:focus{left:8px;top:8px;}
/* dj-tokens */

:root{
--dj-void:#03060d;--dj-ink:#060a15;--dj-surface:#0b1220;--dj-raise:#101a2b;
--dj-text:#e9eff8;--dj-muted:#8496b3;--dj-dim:#7d8ca8;
--dj-beam:#2f6bff;--dj-beam-2:#8fc1ff;--dj-cite:#34e0d6;--dj-weak:#ffb43d;--dj-miss:#ff4a55;
--dj-line:rgba(140,170,255,.09);--dj-line-hi:rgba(140,170,255,.20);
--dj-max:1240px;--dj-pad:clamp(20px,5vw,40px);--dj-r:14px;
--dj-e:cubic-bezier(.16,1,.3,1);--dj-e-io:cubic-bezier(.65,0,.35,1);
--dj-sans:"Instrument Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
--dj-mono:"JetBrains Mono",ui-monospace,monospace;
--dj-measure:66ch;
--dj-card:rgba(255,255,255,.027);
}

/* dj-tool-cta-css */
.dj-tool-cta{margin:38px 0 8px;}.dj-tool-cta-in{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;background:linear-gradient(135deg,rgba(56,189,248,.12),rgba(52,211,153,.08));border:1px solid rgba(56,189,248,.3);border-radius:16px;padding:18px 22px;}.dj-tool-cta-txt{display:flex;flex-direction:column;}.dj-tool-cta-txt strong{color:#fff;font-size:17px;}.dj-tool-cta-txt span{color:#94a3b8;font-size:14px;margin-top:2px;}.dj-tool-cta-btn{background:linear-gradient(135deg,#0055ff,#0088ff 55%,#22b8ef);color:#fff;font-weight:700;border-radius:12px;padding:12px 22px;text-decoration:none;white-space:nowrap;box-shadow:0 6px 20px rgba(56,189,248,.3);}
/* dj-tool-seo-css */
.dj-tool-seo{max-width:760px;margin:34px auto;color:#cbd5e1;line-height:1.7;font-size:16px;padding:0 18px;}.dj-tool-seo h2{color:#fff;font-size:24px;margin:30px 0 10px;font-family:Space Grotesk,sans-serif;}.dj-tool-seo p{margin:0 0 14px;}.dj-tool-seo .fbox{background:rgba(56,189,248,.1);border-left:3px solid #38bdf8;padding:12px 16px;border-radius:8px;color:#e2e8f0;}.dj-tool-seo ol{padding-left:20px;}.dj-tool-seo li{margin:6px 0;}.dj-tool-seo details{background:rgba(13,22,38,.6);border:1px solid rgba(148,163,184,.18);border-radius:10px;margin-bottom:8px;}.dj-tool-seo summary{padding:13px 18px;color:#e2e8f0;font-weight:600;cursor:pointer;}.dj-tool-seo details > div{padding:0 18px 14px;color:#94a3b8;}
/* dj-related-css */
.dj-related{max-width:760px;margin:34px auto 10px;padding:0 18px;}.dj-related-h{color:#fff;font-weight:700;font-size:18px;margin-bottom:12px;font-family:Space Grotesk,sans-serif;}.dj-related-grid{display:flex;flex-wrap:wrap;gap:10px;}.dj-related-grid a{background:rgba(56,189,248,.1);border:1px solid rgba(56,189,248,.3);color:#38bdf8;border-radius:10px;padding:9px 14px;text-decoration:none;font-size:14px;font-weight:600;}.dj-related-grid a:hover{background:rgba(56,189,248,.2);}
/* dj-aria-current */

header a[aria-current="page"]:not([class*="cta"]):not([class*="btn"]):not(.wp-block-button__link),
nav a[aria-current="page"]:not([class*="cta"]):not([class*="btn"]):not(.wp-block-button__link),
footer a[aria-current="page"]:not([class*="cta"]):not([class*="btn"]):not(.wp-block-button__link){
text-decoration:underline !important;text-underline-offset:4px !important;text-decoration-thickness:2px !important}

/* noid-7bcede055d */
.dj-loc-city{max-width:1000px;margin:0 auto 18px;}.dj-loc-city h2{color:#fff;font-size:17px;margin:18px 0 8px;border-left:3px solid #38bdf8;padding-left:10px;}.dj-loc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;}.dj-loc-link{display:block;padding:10px 13px;border-radius:10px;background:rgba(255,255,255,.03);border:1px solid rgba(120,170,230,.14);color:#cdd9e8;text-decoration:none;font-size:13.5px;transition:border-color .2s,background .2s,color .2s;}.dj-loc-link:hover{border-color:rgba(56,189,248,.45);background:rgba(56,189,248,.07);color:#fff;}.dj-related{max-width:1000px;margin:40px auto 0;padding-top:24px;border-top:1px solid rgba(120,170,230,.15);}.dj-related h3{color:#fff;font-size:18px;margin:0 0 4px;}.dj-related>p{color:#9fb2c8;font-size:14px;margin:0 0 14px;}.dj-related-grid{display:flex;flex-wrap:wrap;gap:8px;}.dj-related-grid a{padding:8px 13px;border-radius:999px;background:rgba(56,189,248,.08);border:1px solid rgba(56,189,248,.2);color:#7cc4ff;text-decoration:none;font-size:13px;}.dj-related-grid a:hover{background:rgba(56,189,248,.16);}
/* dj-book-css */
.dj-book{max-width:782px !important;margin:46px auto 10px !important;padding:0 20px !important;box-sizing:border-box !important;}.dj-book-in{background:linear-gradient(135deg,#0b1830,#0a1322) !important;border:1px solid rgba(56,189,248,.22) !important;border-radius:16px !important;padding:28px 30px !important;display:flex !important;flex-wrap:wrap !important;align-items:center !important;gap:20px !important;}.dj-book-t{flex:1 1 300px !important;min-width:0 !important;}.dj-book-t strong{display:block !important;color:#fff !important;-webkit-text-fill-color:#fff !important;font-size:1.18rem !important;font-weight:800 !important;letter-spacing:-.02em !important;margin-bottom:8px !important;}.dj-book-t span{display:block !important;color:#9fb2c8 !important;-webkit-text-fill-color:#9fb2c8 !important;font-size:.93rem !important;line-height:1.65 !important;}.dj-book-b{flex:0 0 auto !important;display:inline-block !important;background:#00aaff !important;background-image:none !important;color:#04121c !important;-webkit-text-fill-color:#04121c !important;font-size:.98rem !important;font-weight:800 !important;padding:14px 26px !important;border-radius:8px !important;text-decoration:none !important;white-space:nowrap !important;opacity:1 !important;}@media(max-width:560px){.dj-book-b{width:100% !important;text-align:center !important;}}
/* dj-tcap-css */
.dj-tcap{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
/* dj-fix */
.wp-block-html{max-width:100%!important;margin-left:0!important;margin-right:0!important;padding:0!important;}.wp-block-html h1,.wp-block-html h2,.wp-block-html h3,.wp-block-html h4{color:#ffffff!important;font-weight:900!important;letter-spacing:-.035em!important;}.wp-block-html p{color:#8899aa!important;}.wp-block-post-title:not(.wp-block-post *){display:none!important;}.wp-block-post-content>.wp-block-html:first-child{margin-top:-40px!important;}header.wp-block-template-part,.wp-site-blocks>header{position:sticky!important;top:0;z-index:9999;background:#ffffff!important;box-shadow:0 2px 20px rgba(0,0,0,.1);}
/* noid-0ce42fdd26 */
#dj-ambient{display:none!important}.dj-pipe,.dj-pipe-track,.dj-growth,[class*=dj-growth],.dj-hero-glow{display:none!important}.dj-pricing-grid{align-items:stretch!important}.dj-price-card{display:flex!important;flex-direction:column!important;transform:none!important;margin-top:0!important}.dj-price-card>a{margin-top:auto!important}section:has(.dj-hero-inner){padding-bottom:96px}.wp-block-navigation .wp-block-navigation-item__content{color:#10213a!important;font-weight:600!important}.wp-block-navigation .wp-block-navigation-item__content:hover{color:#0a66ff!important}.wp-block-navigation__submenu-container .wp-block-navigation-item__content{color:#e8eff8!important;font-weight:500!important}.wp-block-navigation__submenu-container .wp-block-navigation-item__content:hover{color:#7cc4ff!important}.wp-block-navigation>.wp-block-navigation__container>.wp-block-navigation-item:last-child>.wp-block-navigation-item__content,.wp-block-navigation>ul>.wp-block-navigation-item:last-child>.wp-block-navigation-item__content{color:#ffffff!important}
/* dj-contrast */
a.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn,#dj-main a.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn{-webkit-text-fill-color:currentColor !important}.wp-block-post-date,.wp-block-post-date a,.wp-block-post-date time,.wp-block-post-author-name,.wp-block-post-author-name a,.wp-block-post-terms,.wp-block-post-terms a{color:var(--dj-muted,#8496b3) !important;-webkit-text-fill-color:var(--dj-muted,#8496b3) !important}.wp-block-post-terms a:hover,.wp-block-post-author-name a:hover{color:var(--dj-text,#e9eff8) !important;-webkit-text-fill-color:var(--dj-text,#e9eff8) !important}.djfaq .djfaq-section>h1,.djfaq .djfaq-section>h2,.djfaq .djfaq-section>h3,.djfaq .djfaq-section>h4{color:var(--dj-text,#e9eff8) !important;-webkit-text-fill-color:var(--dj-text,#e9eff8) !important}.djfaq .djfaq-section>.djfaq-section-sub{color:var(--dj-muted,#8496b3) !important;-webkit-text-fill-color:var(--dj-muted,#8496b3) !important}.djnew-h{color:var(--dj-text,#e9eff8) !important;-webkit-text-fill-color:var(--dj-text,#e9eff8) !important}.djnew-card span.djnew-badge{color:#0a53d6 !important;-webkit-text-fill-color:#0a53d6 !important}a.djcta,a.djcta:visited{color:#fff !important;-webkit-text-fill-color:#fff !important}.djrel a,.djrel a:visited{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}#dj-site-footer [style*="rgba(130,180,240,.4)"]{color:rgba(130,180,240,.68) !important;-webkit-text-fill-color:rgba(130,180,240,.68) !important}#dj-site-footer [style*="rgba(140,180,240,.4)"]{color:rgba(140,180,240,.68) !important;-webkit-text-fill-color:rgba(140,180,240,.68) !important}#dj-site-footer [style*="rgba(120,170,230,.35)"]{color:rgba(120,170,230,.72) !important;-webkit-text-fill-color:rgba(120,170,230,.72) !important}#dj-main .wp-block-post-title a,#dj-main .wp-block-post-title a:visited{color:var(--dj-text,#e9eff8) !important;-webkit-text-fill-color:var(--dj-text,#e9eff8) !important}#dj-sbar button.x,#dj-sbar .x{color:#94a3b8 !important;-webkit-text-fill-color:#94a3b8 !important}/* The 10x rule at the top of this sheet matches a.dj-tool-cta-btn ONLY - both its selectors start with "a.". On /llms-txt-checker/ the CTA is a <button>, so it kept -webkit-text-fill-color:#ffffff over the pale holo gradient and still measured 1.00:1 - the original invisible-CTA bug, never fixed on button elements. Tagless and repeated 10x so it covers button, a and any other tag at (0,10,0). */.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn.dj-tool-cta-btn{color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important}/* Anchors that DID receive the holo background but not its text colour, because snippet 195 at (0,5,1) outranks the holo rules. Measured 1.76:1 on /get-started/, /free-tools/ and /free-tools/roas-calculator/. */#dj-main .djgsb-b,#dj-main a[style*="#0055ff"],#dj-main a[style*="rgb(0, 85, 255)"]{color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important}/* Review table of contents: div.dj-toc paints a near-white panel (#f7f9fb) but its links keep the dark-theme link blue #6fb6ff, measured 2.03:1. Affects every review page - 17 links on /reviews/suno-review/ alone. #1b3a6b is the same light-panel ink already used for .djrel (10.14:1 there). *//* SCOPED 10/4 after a regression I caused: .dj-toc has TWO variants. On /reviews/suno-review/ it carries inline background:#f7f9fb (light panel). On /reviews/typeform-pricing/ it is .dj-toc.rv with no inline background and composites to rgb(10,12,15) (dark). My unscoped rule put dark ink on the dark variant at 1.74:1. Keyed to the inline light background so only the light variant gets dark ink; the dark variant keeps its own light-blue links. */#dj-main .dj-toc[style*="f7f9fb"] a,#dj-main .dj-toc[style*="f7f9fb"] a:visited{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}/* Breadcrumbs and query pagination still carry #0073aa, a light-theme leftover, on the dark page: 3.92:1 at 13px and 16.6px. These are normal-size text, so unlike the 34px+ post titles they DO fail AA. #6fb6ff gives 9.28:1. */#dj-main nav.dj-crumb a,#dj-main nav.dj-crumb a:visited,#dj-main a.page-numbers,#dj-main .wp-block-query-pagination a,#dj-main .wp-block-query-pagination-next,#dj-main .wp-block-query-pagination-previous{color:#6fb6ff !important;-webkit-text-fill-color:#6fb6ff !important}/* Jetpack sharing buttons: a.sd-button paints its own white background but its visible label span keeps #6fb6ff -> 2.14:1 at 13px. The long "Share on X (Opens in new window)" span is display:none; the visible text is the short "X" / "Facebook" span, so this is real, not a screen-reader-only label. #1b3a6b on white is 11.27:1. *//* NARROWED 10/4: .sd-content a was too broad - it also caught the admin-only "Customize buttons" link, which sits on a DARK background, giving it 1.67:1. Only a.sd-button paints the white background, so only it gets dark ink. */#dj-main a.sd-button,#dj-main a.sd-button span{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}/* /ai-search-data/ download buttons: class-less anchors whose inline text colour is taken by snippet 195, leaving #6fb6ff on their own fills (1.93:1 and 2.10:1). Keyed on the inline BACKGROUND rather than a class, so the selector cannot hit a light and a dark variant the way .dj-toc did. The blue button gets its authored #fff back (4.50:1). The light button needs MORE than a restore: its authored #2f6bff on #eef3ff is only 4.05:1 at 14px, so it gets #1b3a6b (10.14:1), the same light-panel ink as .djrel. */#dj-main a[style*="background:#2f6bff"]{color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}#dj-main a[style*="background:#eef3ff"]{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}/* MOBILE TABLE CLIPPING. html and body both carry overflow-x:hidden, so a table wider than the viewport is not scrollable - it is silently CUT OFF and unreachable. Measured at 375px: /docs/api/ lost 178px of a 548px data table (3 of 6 tables), /library/ai-marketing-tool-pricing-index/ lost 331px of a 701px table, and /reviews/suno-review/ lost 203px of 573px. Tables inside figure.wp-block-table or div.djp2-tblwrap already scroll and are fine; raw tables emitted by snippets are not. Constraining width and letting cells wrap is used INSTEAD of the usual display:block;overflow-x:auto because display:block strips table semantics from the accessibility tree in Chrome. Verified: 548->370, 495->370, 573->370, zero cells clipped, display stays table. .djp2-tbl is excluded because it already scrolls. */@media (max-width:640px){#dj-main table:not(.djp2-tbl){max-width:100% !important;width:100% !important;table-layout:auto !important}#dj-main table:not(.djp2-tbl) td,#dj-main table:not(.djp2-tbl) th{word-break:break-word !important;overflow-wrap:anywhere !important}}/* Two remaining real failures, both only visible once the scroll-reveal was forced. Checked for light/dark variants first (the mistake .dj-toc taught me): span.tag is 3 elements on the home page, one colour, one dark context; .djp2-n is 5 elements on /pricing/, one colour, two dark contexts. Both dark-only, so a dark-background ink is safe. span.tag badges were #2f6bff on rgb(12,18,31) = 4.16:1 at 11px, just under the 4.5 needed; #6fb6ff gives 8.75:1. .djp2-n is the em-dash marking a feature as NOT included in the comparison table - it carries meaning and nothing else conveys it - at #4a5a6e = 2.57:1; the muted token gives ~6.4:1. */#dj-main span.tag{color:#6fb6ff !important;-webkit-text-fill-color:#6fb6ff !important}#dj-main .djp2-n{color:var(--dj-muted,#8496b3) !important;-webkit-text-fill-color:var(--dj-muted,#8496b3) !important}/* The light .dj-toc panel: I fixed its LINKS earlier but not its own text. The "On this page" heading is rgba(210,228,250,0.88) - a dark-theme ink - on the #f7f9fb panel = 1.2:1, effectively invisible. Covering the panel and its text elements, not just anchors. Scoped to the light variant only, same as the link rule, so the dark .dj-toc.rv variant is untouched. */#dj-main .dj-toc[style*="f7f9fb"],#dj-main .dj-toc[style*="f7f9fb"] p,#dj-main .dj-toc[style*="f7f9fb"] li,#dj-main .dj-toc[style*="f7f9fb"] strong,#dj-main .dj-toc[style*="f7f9fb"] b,#dj-main .dj-toc[style*="f7f9fb"] span{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}/* ============ CANONICAL PRIMARY BUTTON ============ One class instead of a growing pile of bespoke selectors. Any element carrying dj-btn is exempt from snippet 195 (whose rule already excludes [class*="btn"]) AND gets the holo treatment, so it cannot be left with a stolen or a failing authored colour. Tagless on purpose: a, span and button all need it - encoding the tag is what left the <button> CTA and the Audit my site SPAN invisible. Specificity: the class is repeated 4x (0,4,0) so it outranks rules like a[href*="get-started"]{color:#fff!important} at (0,1,1), which would otherwise put white text back on the pale holo background. #dj-main .dj-btn covers the same ground at (1,1,0) for anything inside the main wrapper. */.dj-btn.dj-btn.dj-btn.dj-btn,#dj-main .dj-btn{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* Calculator input adornments: .dj-prefix ($) and .dj-suffix (%) inside .dj-input-wrap were #64748b on rgb(11,20,34) = 3.89:1 at 15px. They label what the field expects, so they carry meaning. 3 elements, one colour, dark context only - checked before writing the rule. #94a3b8 gives about 7:1. */#dj-main .dj-input-wrap .dj-prefix,#dj-main .dj-input-wrap .dj-suffix{color:#94a3b8 !important;-webkit-text-fill-color:#94a3b8 !important}/* ===== Found 10/5 by sampling 41 pages across all 15 templates, not just the handful I had been checking. Three template-wide families, none of which had ever been scanned. ===== *//* (A) RESTORED AND WIDENED. I deleted a[style*="background:#00aaff"] after giving the one contact button a dj-btn class. That was premature: the SAME inline pattern is the primary CTA on roughly 138 city and services pages, all at 1.20:1, and those live in page content I cannot practically hand-class. Tagless and holo on purpose - on /services/ this selector matches two different composited states (#0055ff with white text, and #00aaff with stolen #6fb6ff). Holo sets BOTH background and ink, so it cannot be caught out by a variant background the way a colour-only rule would. *//* STRENGTHENED: the tagless form at (0,1,0) lost the background to a[href*="get-started"] at (0,1,1) and the colour to snippet 195 at (0,5,1), so /services/ only moved 1.20 -> 3.47. #dj-main gives (1,1,0) and the 6x repeat gives (0,6,0), either of which outranks both. */#dj-main [style*="background:#00aaff"],[style*="background:#00aaff"][style*="background:#00aaff"][style*="background:#00aaff"][style*="background:#00aaff"][style*="background:#00aaff"][style*="background:#00aaff"]{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* (B) Industries CTAs: a.btn.dj-mag at 1.08:1 - #0073aa, the light-theme leftover, on #0055ff. Note it ALREADY carries a btn class, so it is exempt from snippet 195; this colour comes from the OTHER legacy rule (.wp-block-group a:not(...)). Being btn-named is not protection. 2 elements per page, one colour, one dark background - variants checked. ~29 industries pages plus services children. */#dj-main a.btn{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* (C) Breadcrumb separators: span inside .dj-crumb at #5a6b82 = 3.75:1, 13px. My earlier crumb rule covered nav.dj-crumb a only, so the separator glyphs were missed and they are not anchors. */#dj-main .dj-crumb span{color:var(--dj-muted,#8496b3) !important;-webkit-text-fill-color:var(--dj-muted,#8496b3) !important}/* (D) A/B sample-size calculator: span.dj-metric showing the computed sample sizes was #444444 on rgb(20,21,24) = 1.87:1 - the actual answer the tool exists to give, nearly invisible. */#dj-main .dj-metric{color:var(--dj-text,#e9eff8) !important;-webkit-text-fill-color:var(--dj-text,#e9eff8) !important}/* (E) City-page geo hub CTA: a.dj-geolinks-hub in .dj-geolinks-row, no inline, background from the blue-gradient rule and colour stolen to #6fb6ff = 1.20:1. #dj-main prefix needed to outrank 195 at (0,5,1). */#dj-main a.dj-geolinks-hub{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* (F) /marketing-agency/ hero band CTAs: one authored background:#fff;color:#0a66ff whose white background is overridden, and one background:#2563eb;color:#fff whose colour is stolen (2.41:1). Both get holo. */#dj-main a[style*="background:#2563eb"],#dj-main a[style*="background:#fff;color:#0a66ff"]{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* (G) Same hero band, the text ON the blue: the eyebrow is authored #bcd4ff and the body copy #dbe7ff on #0a66ff, both 3.21:1 at 12px and 18px - failing by their own design, not by theft. Pure white on #0a66ff measures 4.82:1, so white is the smallest change that passes without touching the band colour. */#dj-main [style*="color:#bcd4ff"],#dj-main [style*="color:#dbe7ff"]{color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* (H) Tool-page CTA block: .dj-cta-tool holds TWO anchors - the get-started button, which paints its own blue gradient and was #6fb6ff on it at 1.20:1, and a plain free-tools text link on the dark card at 9.07:1 which must stay a text link. Keyed on the href so holo lands on the button only; a .dj-cta-tool a rule would have turned the text link into a pale button. */#dj-main .dj-cta-tool a[href*="get-started"]{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* ===== Found 10/5 by crawling ALL 347 review + 137 static pages (484 total, 0 fetch errors), fingerprinting each by component classes and inline colour pairs, and render-scanning one representative per distinct fingerprint - 29 of them, which together account for every one of the 484 pages. 43 failures in 18 signatures, and nearly all of them are ONE systemic bug: dark-theme inks inheriting onto LIGHT panels. =====
 * BIGGEST SINGLE WIN: div.dj-cite is the "Last verified ..." citation box on ~304 review pages, inline background:#f8fafc, and its text inherits the dark-theme inks #cbd6e6 (1.40:1) and #8b96a6 (2.86:1). That is the freshness and sourcing signal on nearly every review, effectively invisible. Single variant - always #f8fafc, one per page - checked across three review pages before writing this.
 * a and button are deliberately NOT included: the box contains a nested control that is legitimately white-on-dark, and a blanket descendant rule would have broken it. */#dj-main .dj-cite,#dj-main .dj-cite p,#dj-main .dj-cite span,#dj-main .dj-cite li,#dj-main .dj-cite strong,#dj-main .dj-cite em,#dj-main .dj-cite small,#dj-main .dj-cite time,#dj-main .dj-cite div{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}/* ===== The 17 remaining signatures from the 484-page crawl, each selector taken from the live element and each ink chosen for the measured background. ===== *//* /platform/seo/ and /platform/mission-control/ activity-feed timestamps, 8 pages: #5f7289 on rgb(6,14,26) at 11px = 3.92:1. Muted token gives about 6.4:1. */#dj-main .dj-feed-tm{color:var(--dj-muted,#8496b3) !important;-webkit-text-fill-color:var(--dj-muted,#8496b3) !important}/* /seo-agent/ family, 5 pages: the Try: prompt row #5b6b82 on rgb(10,17,30) = 3.47:1, and its example buttons #0a66ff on the light rgb(238,243,251) chip = 4.33:1, just under the 4.5 needed at 13px. */#dj-main .dsa-ex,#dj-main .dsa-ex span{color:var(--dj-muted,#8496b3) !important;-webkit-text-fill-color:var(--dj-muted,#8496b3) !important}#dj-main .dsa-ex-btn{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}/* Gutenberg buttons whose inline background is overridden: on /seo-agent/ a blue gradient with dark text (3.47:1), and on /faq/ and /marketing-agency/ an authored white or #0073aa background repainted to #00aaff with white text (2.56:1). Holo sets both background and ink so it cannot be caught out by whichever one wins. */#dj-main .wp-block-button__link[style*="#0055ff"],#dj-main .wp-block-button__link[style*="background-color:#ffffff"],#dj-main .wp-block-button__link[style*="background-color:#0073aa"]{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* /tool-finder/: .djtf is a WHITE panel carrying dark-theme inks. The h2 was #eaf2fa on white = 1.13:1, the star ratings #f5a623 = 1.97:1, and Read review #6fb6ff = 2.08:1. The stars convey the rating, so they need a darker amber - #8a5300 measures about 6.1:1 on that panel. */#dj-main .djtf h2,#dj-main .djtf h3,#dj-main .djtf p,#dj-main .djtf-card{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}#dj-main .djtf .s,#dj-main .djtf-card .s{color:#8a5300 !important;-webkit-text-fill-color:#8a5300 !important}#dj-main .djtf-card a{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}/* /ai-readiness/: a light panel, background:linear-gradient(135deg,#eef4ff,#f7faff). Its body copy is AUTHORED color:#33415a and that is being stolen by a global dark-theme rule, so restoring the authored ink is the fix - it measures 9.24:1 on this panel. The uppercase eyebrow #0a66ff was 4.36:1, also just under. */#dj-main [style*="linear-gradient(135deg,#eef4ff,#f7faff)"],#dj-main [style*="linear-gradient(135deg,#eef4ff,#f7faff)"] p,#dj-main [style*="linear-gradient(135deg,#eef4ff,#f7faff)"] div,#dj-main [style*="linear-gradient(135deg,#eef4ff,#f7faff)"] b,#dj-main [style*="linear-gradient(135deg,#eef4ff,#f7faff)"] strong,#dj-main [style*="linear-gradient(135deg,#eef4ff,#f7faff)"] span,#dj-main [style*="linear-gradient(135deg,#eef4ff,#f7faff)"] li{color:#33415a !important;-webkit-text-fill-color:#33415a !important}/* NARROWED after a regression I caused: .dj-air-guides holds links with TWO backgrounds - one carries its own light gradient (border rgba(10,102,255,.25)) where dark ink gives 10.2:1, and the rest sit on rgba(255,255,255,.043) over the DARK panel, where my dark ink gave 1.52:1. Only the light one was ever failing. Keyed on the border colour, which is the reliable discriminator between the two variants. */#dj-main .dj-air-guides a[style*="rgba(10,102,255,.25)"]{color:#1b3a6b !important;-webkit-text-fill-color:#1b3a6b !important}#dj-main a[style*="padding:.6rem 1.15rem"]{background:var(--djx-holo,linear-gradient(115deg,#ffffff,#dfeafc 20%,#eafff8 38%,#ffffff 52%,#f3e8ff 66%,#ffe9f4 82%,#ffffff)) !important;background-size:200% 100% !important;color:#0b0c16 !important;-webkit-text-fill-color:#0b0c16 !important;border:none !important;text-shadow:none !important}/* /pricing/ MOST POPULAR badge: white on a #6366f1-to-#06b6d4 gradient = 2.43:1. I fixed the Go Pro button under it and missed the badge. Pure #000 is needed here, not the usual #0b0c16: against the indigo stop #0b0c16 is only 4.31:1 while #000 reaches 4.70:1, and against the cyan stop #000 is 8.66:1. */#dj-main [style*="linear-gradient(135deg,#6366f1,#06b6d4)"]{color:#000000 !important;-webkit-text-fill-color:#000000 !important}/* /use-in-chatgpt/ Quick answer panel: I keyed the earlier light-panel rule on the /ai-readiness/ gradient and this panel uses a SOLID background:#f2f7ff, so it was never matched and stayed at 1.18:1. Keyed on its own value now. */#dj-main [style*="background:#f2f7ff"],#dj-main [style*="background:#f2f7ff"] p,#dj-main [style*="background:#f2f7ff"] b,#dj-main [style*="background:#f2f7ff"] strong,#dj-main [style*="background:#f2f7ff"] span,#dj-main [style*="background:#f2f7ff"] li{color:#33415a !important;-webkit-text-fill-color:#33415a !important}/* REGRESSION I CAUSED AND MISDIAGNOSED, fixed here. -webkit-text-fill-color is INHERITED. My .dj-cite rule set it on the citation box and its div descendants; button.dj-cite-btn then inherited the dark fill #1b3a6b while keeping its own color:#fff, and WebKit and Blink paint with the FILL - so Copy citation rendered at 2.50:1 on its #2f6bff background. I had excluded a and button from the colour rule and wrongly concluded it was safe, then checked it by comparing color to background and ignored the inherited fill, which is how I talked myself into calling a real 2.50:1 a passing 4.50:1. currentColor makes the fill follow whichever color wins. */#dj-main .dj-cite a,#dj-main .dj-cite button,#dj-main .dj-cite a *,#dj-main .dj-cite button *{-webkit-text-fill-color:currentColor !important}/* ===== 2026-10-05. Six signatures on pages that had never been rendered-scanned:   the earlier crawl fetched 77 URLs as 0 bytes, so 36 real pages were absent from   the corpus rather than passing it (41 of the 77 were redirects). ===== *//* (1) Unclassed /get-started/ CTAs keep the legacy light-blue link ink #6fb6ff while   the CTA rule paints them the brand gradient: 1.20:1 on /sitemap/, /vs-in-house-team/,   /vs-traditional-agencies/, /start-free/ and /agent-registry/. :not([class]) keeps every   classed CTA on the holo treatment it already passes with. Tail stop darkened too,   because white on #00aaff is only 2.56:1. Now 5.04:1. */#dj-main a[href*="get-started"]:not([class]){background:linear-gradient(135deg,#0055ff,#0066ee 55%,#0a70c8) !important;color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* (2) /agent-registry/ score pills: #16a34a on white = 3.30:1 -> #15803d = 5.01:1 */#dj-main .rg-rscore{color:#15803d !important;-webkit-text-fill-color:#15803d !important}/* (3) /strategy-os-builder/ field labels: #4a566f on #0a0e17 = 2.62:1 -> #9fb0c9 = 8.75:1.   Scoped to #stratos-app so form labels elsewhere are untouched. */#dj-main #stratos-app label,#dj-main #stratos-app .tl{color:#9fb0c9 !important;-webkit-text-fill-color:#9fb0c9 !important}/* (4) /strategy-call/ OUT-nn markers: rgba(0,212,255,.3) on #0a1628 = 2.01:1. Same hue   at .75 alpha composites to 6.21:1, so the dim look survives. */#dj-main .sys{color:rgba(0,212,255,.75) !important;-webkit-text-fill-color:rgba(0,212,255,.75) !important}/* (5) /free-tools/content-calendar-template/: form button is white on the #22b8ef tail   of the CTA gradient = 2.29:1; hint is #64748b on #0a111e = 3.96:1. */#dj-cct-form button{background:linear-gradient(135deg,#0055ff,#0066ee 55%,#0a70c8) !important;color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}#dj-main .dj-cct-hint{color:#94a3b8 !important;-webkit-text-fill-color:#94a3b8 !important}/* (6) /get-started/ funnel small print. Both are inline-styled translucent text on the   near-black funnel: rgba(140,200,240,.5) on #050d1e = 3.43:1 and rgba(0,212,255,.6) on   #0a1628 = 4.40:1. Raising alpha only keeps the hue and the muted look: 6.38:1 and 5.79:1.   The transparent checkmarks in this funnel are NOT a defect - they are unchecked-state   indicators, visible as #030810 on #00d4ff once checked, so they are left alone. */#dj-main #dj-funnel [style*="rgba(140,200,240,.5)"]{color:rgba(140,200,240,.75) !important;-webkit-text-fill-color:rgba(140,200,240,.75) !important}#dj-main #dj-funnel [style*="rgba(0,212,255,.6)"]{color:rgba(0,212,255,.7) !important;-webkit-text-fill-color:rgba(0,212,255,.7) !important}/* ===== 2026-10-05 (c). Light Gutenberg section blocks. The site ships a dark-theme   palette globally - snippet 195 sets html body color #cbd6e6 and the theme paints   headings #eaf2fa - while has-base-2-background-color paints the panel #f9fafb, so   near-white text lands on a near-white panel: 1.08:1 headings, 1.21:1 body copy,   effectively invisible, across 12 service pages. Verified twice (rendered scan plus a   computed-style walk of the ancestor chain).   GUARDED ON THE INLINE background-color: a sibling group carries the SAME has-base-2   class but is overlaid with linear-gradient(rgba(13,22,38,.6),rgba(8,14,24,.6)) and so   renders DARK. My first version darkened its text too and took it to 2.89:1. The light   groups declare background-color inline; the overlaid one declares only padding.   Selectors are written out in full - an earlier version used :is() and a later regex   edit cut through the commas inside it, which invalidated three whole rules. */#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"],#dj-main .wp-block-group.has-white-background-color[style*="background-color"]{color:#1b2838 !important}#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] h1,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] h2,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] h3,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] h4,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] h5,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] h6,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] h1,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] h2,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] h3,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] h4,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] h5,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] h6{color:#0e1b2e !important;-webkit-text-fill-color:#0e1b2e !important}#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] p,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] li,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] span,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] strong,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] em,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] small,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] td,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] th,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] dd,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] dt,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] blockquote,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] figcaption,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] div,#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] time,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] p,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] li,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] span,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] strong,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] em,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] small,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] td,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] th,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] dd,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] dt,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] blockquote,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] figcaption,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] div,#dj-main .wp-block-group.has-white-background-color[style*="background-color"] time{color:#1b2838 !important;-webkit-text-fill-color:#1b2838 !important}#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] a:not([class]),#dj-main .wp-block-group.has-white-background-color[style*="background-color"] a:not([class]){color:#0a58ca !important;-webkit-text-fill-color:#0a58ca !important}#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] a[class],#dj-main .wp-block-group.has-base-2-background-color[style*="preset--color--base-2"] button[class],#dj-main .wp-block-group.has-white-background-color[style*="background-color"] a[class],#dj-main .wp-block-group.has-white-background-color[style*="background-color"] button[class]{-webkit-text-fill-color:currentColor !important}/* ===== 2026-10-05 (d). The Related Services panel. Same has-base-2 class but overlaid   with a dark gradient, so the panel renders mid-grey (#696e75 composited). Two items:   the separator pipes are the paragraph own text at rgba(210,228,250,.88) = 3.48:1, and   the links are WHITE chips carrying the legacy #6fb6ff link ink = 2.14:1. White pipes   give 5.13:1 on that grey; #0a58ca on the white chips gives 6.44:1. Lower specificity   than the (c) block above, so genuinely light groups keep their dark ink. */#dj-main .wp-block-group.has-base-2-background-color p{color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}#dj-main .wp-block-group.has-base-2-background-color a:not([class]){color:#0a58ca !important;-webkit-text-fill-color:#0a58ca !important}/* ===== 2026-10-05 (e). Translucent micro-labels and small print on the dark panels.   Each is an inline rgba ink whose alpha is too low against its own panel - measured   4.26, 1.67, 2.49, 2.66 and 3.22:1 across the services hubs and sub-pages. Raising   the alpha keeps the exact hue and the intended muted look while clearing AA: the   composited results are about 5.4, 6.4, 6.4, 6.6 and 5.6:1. Keyed on the inline token   because these elements carry no class. The site writes rgba compactly (.55 not 0.55);   that spelling was confirmed by matching against the live DOM, not assumed. */#dj-main [style*="160,210,255,.55"]{color:rgba(160,210,255,.68) !important;-webkit-text-fill-color:rgba(160,210,255,.68) !important}#dj-main [style*="0,180,255,.3"]{color:rgba(0,180,255,.85) !important;-webkit-text-fill-color:rgba(0,180,255,.85) !important}#dj-main [style*="140,190,240,.4"]{color:rgba(140,190,240,.75) !important;-webkit-text-fill-color:rgba(140,190,240,.75) !important}#dj-main [style*="150,200,255,.4"]{color:rgba(150,200,255,.75) !important;-webkit-text-fill-color:rgba(150,200,255,.75) !important}#dj-main [style*="130,175,215,.55"]{color:rgba(130,175,215,.8) !important;-webkit-text-fill-color:rgba(130,175,215,.8) !important}/* ===== 2026-10-05 (f). A recurrence of the webkit-text-fill-color inheritance bug,   this time on code. .dj-cite is a LIGHT panel (#f8fafc) so my #1b3a6b ink is right   there, but it contains code.dj-cite-txt, a DARK block with inline background #0f1b2d   and color #d6e2ff. That code element kept color #d6e2ff while inheriting my dark   FILL, and WebKit paints the fill - dark on dark, 1.53:1, on all 13 pages that carry   a citation block. The earlier fix reset only anchors and buttons; resetting every   descendant to currentColor makes the fill follow whichever color actually wins. */#dj-main .dj-cite *{-webkit-text-fill-color:currentColor !important}/* (g) /services/seo/answer-engine-optimization/ source lines: rgba(130,175,215,.55)   on #0a1628 = 3.22:1. Comes from a class here, not an inline style, so the (e) token   rule could not reach it. .8 alpha composites to 5.61:1. */#dj-main span.src{color:rgba(130,175,215,.8) !important;-webkit-text-fill-color:rgba(130,175,215,.8) !important}/* ===== 2026-10-05 (h). The legacy WordPress link blue #0073aa is painting the LABEL of   eight different CTA components, so the button text is mid-blue on brand blue: 1.08 to   3.57:1 on /platform/, /state-of-ai-search-readiness/, /ga4-traffic-analyzer/,   /ai-readiness-benchmark/, /free-tools/white-label-seo-audit-tool/, /ai-overviews-tracker/   and /faq-accordion-checker/. White alone is not enough on those blues (white on #358ee2   is only 3.43:1), so the ones on blue also get the AA-safe brand gradient used elsewhere   in this file: stops 5.61 / 5.08 / 5.04:1 against white. */#dj-main .djait-btn,#dj-main .dj-btn-primary,#dj-main .djg-btn,#dj-main .djpf-btn,#dj-main .so-btn,#dj-main .db-btn,#dj-main .djkw-btn{background:linear-gradient(135deg,#0055ff,#0066ee 55%,#0a70c8) !important;color:#ffffff !important;-webkit-text-fill-color:#ffffff !important;border:none !important}/* These two already sit on dark, so they need the ink fixed and nothing else. */#dj-main .djfaq-cta-btn,#dj-main .dj-btn-secondary{color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* Step badges and the inline CTA span on /platform/: white on #0080ff-#0088ff is 3.52-3.81. */#dj-main .djpf-sn{background:#0a70c8 !important;color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* (i) Light-panel text that kept the dark-theme ink. */#dj-main .djait-eyebrow,#dj-main .djkwc-muted,#dj-main .app-card-sub{color:#4b5563 !important;-webkit-text-fill-color:#4b5563 !important}#dj-main .djait-p,#dj-main .djait-card p,#dj-main .djait-ta,#dj-main .app-dom,#dj-main .so-sec h3,#dj-main .app-settings label{color:#1b2838 !important;-webkit-text-fill-color:#1b2838 !important}#dj-main .djait-card code,#dj-main .djait-card pre{color:#1b2838 !important;-webkit-text-fill-color:#1b2838 !important}#dj-main a.djkwc-muted{color:#0a58ca !important;-webkit-text-fill-color:#0a58ca !important}#dj-main span.djkwc-muted{color:#15803d !important;-webkit-text-fill-color:#15803d !important}#dj-main .dj-serp-head{color:#5f6368 !important;-webkit-text-fill-color:#5f6368 !important}#dj-main .app-badge-g{color:#a16207 !important;-webkit-text-fill-color:#a16207 !important}/* (j) Dim ink on dark panels, lifted to the slate tones already used in this file. */#dj-main .dj-ci-step-arrow{color:#9fb0c9 !important;-webkit-text-fill-color:#9fb0c9 !important}#dj-main .dj-ci-counter,#dj-main .djkw-note{color:#94a3b8 !important;-webkit-text-fill-color:#94a3b8 !important}#dj-main .db-rlabel,#dj-main .db-rpct,#dj-main .dri-lbl{color:#c7d2e4 !important;-webkit-text-fill-color:#c7d2e4 !important}#dj-main .db-note{color:#94a3b8 !important;-webkit-text-fill-color:#94a3b8 !important}#dj-main .dj-c-num{color:#818cf8 !important;-webkit-text-fill-color:#818cf8 !important}/* (k) The example-chip buttons: #0a66ff on #eef3fb is 4.33:1, just short. */#dj-main .aea-ex-btn,#dj-main .djf-ex-btn,#dj-main .dcc-ex-btn,#dj-main .dca-ex-btn,#dj-main .dsa-ex-btn{color:#0a58ca !important;-webkit-text-fill-color:#0a58ca !important}/* (l) /about/ monogram: rgba(143,193,255,.26) is 1.77:1. It is 76.8px so AA needs 3.0;   .5 alpha composites to 3.35:1 and keeps it a watermark. */#dj-main .monogram{color:rgba(143,193,255,.5) !important;-webkit-text-fill-color:rgba(143,193,255,.5) !important}/* (m) Light-blue CTA pills on /ai-prompt-observatory/ and /ai-visibility-tracker/: the   #6fb6ff ink on a #5f96ff button is 1.35:1. White is only 2.88 there, so dark ink. *//* 2026-10-08 (w). The 2f6bff-to-8fc1ff pill CTAs on /ai-prompt-observatory/ and   /ai-visibility-tracker/. No single ink clears AA on that gradient: dark text is 4.28   on the dark end and white is 2.88 on the light end. Standardised onto the same   AA-safe brand gradient used by every other CTA in this file, with white at 5.04+. */#dj-main a[style*="8fc1ff"]{background:linear-gradient(135deg,#0055ff,#0066ee 55%,#0a70c8) !important;color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* ===== 2026-10-05 (n). The example-chip Try: label, #5b6b82 on the near-black tool   panels = 3.24-3.62:1 on /aeo-agent/, /ai-fix-generator/, /command-center/ and   /content-agent/. It carries no class, so key on its wrapper; #94a3b8 gives 7.64:1.   The colour comes from a rule rather than an inline style - an inline-token selector   was tried first and matched nothing, which is why this one is structural. */#dj-main .aea-ex>span,#dj-main .djf-ex>span,#dj-main .dcc-ex>span,#dj-main .dca-ex>span,#dj-main .dsa-ex>span{color:#94a3b8 !important;-webkit-text-fill-color:#94a3b8 !important}/* (o) /ad-copy-character-counter/ limit hints: #777 on #141619 = 4.04:1 -> #9aa3ad = 7.30:1. */#dj-main [style*="color:#777"]{color:#9aa3ad !important;-webkit-text-fill-color:#9aa3ad !important}/* ===== 2026-10-05 (p). Last four. *//* A light pull-quote callout on /cursor-vs-windsurf/ (inline background #f7f9fb) that   kept the dark-theme body ink rgba(210,228,250,.88) = 1.20:1, including its STRONG. */#dj-main [style*="background:#f7f9fb"],#dj-main [style*="background:#f7f9fb"] strong,#dj-main [style*="background:#f7f9fb"] em,#dj-main [style*="background:#f7f9fb"] span{color:#1b2838 !important;-webkit-text-fill-color:#1b2838 !important}/* Answer links inside the FAQ accordion on /faq-accordion-checker/: #6fb6ff on white = 2.14:1. */#dj-main .djfaq-faq-a a{color:#0a58ca !important;-webkit-text-fill-color:#0a58ca !important}/* Two inline-coloured spans: #8188a0 on white = 3.52:1, #5f7289 on #0b1524 = 3.71:1. */#dj-main [style*="color:#8188a0"]{color:#4b5563 !important;-webkit-text-fill-color:#4b5563 !important}#dj-main [style*="color:#5f7289"]{color:#94a3b8 !important;-webkit-text-fill-color:#94a3b8 !important}/* The Open Mission Control chip on /platform/ is white on the #0088ff stop = 3.52:1;   give it the same AA-safe gradient so white clears at 5.04:1. */#dj-main .djpf a>span[style*="linear-gradient"]{background:linear-gradient(135deg,#0055ff,#0066ee 55%,#0a70c8) !important;color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* ===== 2026-10-05 (q). /missed-clicks/ Pull my data button. Its own inline style already   declares color:#fff, but a rule with !important repaints it #bcd8ff, giving 3.55:1 on   its #2563eb background. Restoring the authored white gives 5.17:1. */#dj-main button[style*="background:#2563eb"]{color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* ===== 2026-10-05 (r). dj-faq heading parity. The free-tools FAQ shipped with the   heading as a styled DIV and every question as a DIV, so those pages had no FAQ   heading structure at all - nothing for a screen reader to navigate and nothing in   the document outline. Converting them to h2/h3 is the correct fix, but the theme   sets heading font-size, letter-spacing and margin with !important, which beat the   inline styles and blew the heading up from 12px to 32px. These rules restore the   exact rendered values measured before the change, so the markup improves and the   design does not move. */#dj-main .dj-faq h2{font-size:12px !important;font-weight:700 !important;letter-spacing:1.5px !important;line-height:1.7 !important;margin:0 0 18px !important;padding:0 !important;border:0 !important;color:#7dd3fc !important;text-transform:uppercase !important;text-align:center !important}#dj-main .dj-faq h3{font-size:16px !important;font-weight:700 !important;letter-spacing:normal !important;line-height:1.7 !important;margin:0 0 7px !important;padding:0 !important;border:0 !important;color:#eef3f9 !important;text-transform:none !important;text-align:left !important}/* ===== 2026-10-05 (s). dj-tool-prose: the explanatory sections added to the free-tool   pages. The theme sets heading size and spacing with !important, so these pages need   their own scoped rule rather than inline styles (the same trap that blew the FAQ   heading up from 12px to 32px). Ink is #eef3f9 on headings and #9fb2c8 on body against   the #030810 panel, both well clear of AA. */#dj-main .dj-tool-prose{max-width:820px;margin:34px auto 0;text-align:left}#dj-main .dj-tool-prose h2{font-size:22px !important;font-weight:800 !important;color:#eef3f9 !important;margin:30px 0 12px !important;letter-spacing:-.2px !important;line-height:1.3 !important;border:0 !important;padding:0 !important;text-transform:none !important;text-align:left !important}#dj-main .dj-tool-prose p{color:#9fb2c8 !important;font-size:15.5px !important;line-height:1.7 !important;margin:0 0 12px !important}#dj-main .dj-tool-prose ul{color:#9fb2c8 !important;font-size:15.5px !important;line-height:1.7 !important;margin:0 0 14px 20px !important;list-style:disc !important}#dj-main .dj-tool-prose li{margin:0 0 6px !important}#dj-main .dj-tool-prose strong{color:#eef3f9 !important}#dj-main .dj-tool-prose code{color:#7dd3fc !important;font-size:14px !important}/* ===== 2026-10-08 (t). Headings pinned to the left of the content column.   Measured at a 1600px viewport on /services/seo/technical/ and /industries/saas/:   paragraphs are centred (max-width 813px, margin-left and -right ~293px) but h2 and h3   compute to margin-left:0 / margin-right:0 at max-width 800px, so they sit hard left   with 600px of dead space to their right while the body text under them is centred.   Cause: a shorthand margin (e.g. margin:48px 0 14px) zeroes the horizontal margins,   and the WordPress constrained-layout rule that would centre them is written with   :where(), which has zero specificity and loses. Restoring auto horizontal margins and   matching the paragraph column width aligns the heading with the text beneath it.   Scoped to DIRECT children of .entry-content so headings inside cards, groups and   two-column blocks keep their own alignment. Vertical margins are untouched. */#dj-main .entry-content > h1,#dj-main .entry-content > h2,#dj-main .entry-content > h3,#dj-main .entry-content > h4,#dj-main .entry-content > h5,#dj-main .entry-content > h6{margin-left:auto !important;margin-right:auto !important;max-width:813px !important}/* ===== 2026-10-08 (u). The at a glance card band on the industries pages.   Its H2 introduces a 1082px card row but the heading itself is constrained to the   813px text column, so it sat 135px inside the band it labels. Measured across five   industries pages: the pattern is always an entry-content H2 followed immediately by   a plain div.rv of exactly 1082px, and no other template has a heading followed by a   div at all, so :has() targets it precisely. Matching the heading to the band width   lands both at the same left edge. */#dj-main .entry-content > h2:has(+ div.rv){max-width:1082px !important}/* ===== 2026-10-08 (v). The Be Our First button on /case-studies/. It carries the old   brand gradient #0055ff to #00aaff, which cannot be made AA with a single ink: dark   text fails on the dark end at 3.43 and white fails on the light end at 2.56. My   earlier dark-ink fix addressed the light end and left the dark end failing. Same   remedy used elsewhere in this file: darken the stops so white clears everywhere,   giving 5.61 / 5.08 / 5.04. */#dj-main .dj-c-cta{background:linear-gradient(135deg,#0055ff,#0066ee 55%,#0a70c8) !important;color:#ffffff !important;-webkit-text-fill-color:#ffffff !important}/* dj-h1-restore-tool (10/8/26): 8 tool pages where the theme post title is the only h1 on the page, and the dj-h1-restore rule above excludes them because .dj-tool sits inside the .wp-block-group. Measured before: computed display none, offsetParent null, no .entry-content h1, and no visible text at or above 20px anywhere in the top 900px of main. The tool card renders the tool name only as a 17px paragraph, so these pages had no visible heading and nothing in the document outline. Confirmed two ways: browser computed style on all 8, and DOM nesting analysis across all 79 tool pages, which independently returned the same 8. */body.page-id-1134 h1.wp-block-post-title,body.page-id-1190 h1.wp-block-post-title,body.page-id-1128 h1.wp-block-post-title,body.page-id-1109 h1.wp-block-post-title,body.page-id-1131 h1.wp-block-post-title,body.page-id-1108 h1.wp-block-post-title,body.page-id-1179 h1.wp-block-post-title,body.page-id-1280 h1.wp-block-post-title{display:block !important;margin-bottom:10px !important}@media (min-width:900px){/* dj-h1-col-align (10/8/26): tool-page post titles sat hard left at the 138px gutter with up to 926px of dead space to the right, while the tool card and body copy beneath them were centred. Measured on marketing-scorecard: H1 glyphs L138 R926, tool card L427, h2 L458. Measured on canonical-tag-generator: H1 glyphs L138 R818 against paragraphs L431 width 813. Beau asked for either a right-hand element or no hard-left heading, so the title is constrained to the same 813px column already used by the in-content headings, which brought the H1 glyph edge to L432 against paragraphs at L431, a difference of zero. Scoped to the 79 tool page ids only; other templates keep their deliberate full-width treatment pending a separate decision.  MOBILE GUARD ADDED 10/8/26: the first version of this rule zeroed the horizontal padding unconditionally, which removed the responsive gutter at narrow widths. Measured at 375px: H1 glyphs sat at L0, flush to the screen edge, against paragraphs at L21. The alignment is only needed where the dead space exists, so the whole rule is gated and narrow viewports keep the theme padding untouched. BREAKPOINT LOWERED FROM 1100 TO 900 on 10/9/26: the original gate was chosen by eye and was too conservative, leaving a 200px band untested and unfixed. Measured on marketing-scorecard in that band: at 1019px the title sat 110px left of its body text and 78px left of the tool card; at 895px it sat 47px and 19px left. With the rule active it lands within 5px of the tool card at 1019 and within 2px at 895, and the tool card is the dominant element on these pages. 900 is also where the other two breakpoints in this file sit, so the band boundaries now agree rather than overlapping awkwardly. */body.page-id-467 h1.wp-block-post-title,body.page-id-485 h1.wp-block-post-title,body.page-id-842 h1.wp-block-post-title,body.page-id-845 h1.wp-block-post-title,body.page-id-846 h1.wp-block-post-title,body.page-id-847 h1.wp-block-post-title,body.page-id-848 h1.wp-block-post-title,body.page-id-856 h1.wp-block-post-title,body.page-id-857 h1.wp-block-post-title,body.page-id-858 h1.wp-block-post-title,body.page-id-859 h1.wp-block-post-title,body.page-id-860 h1.wp-block-post-title,body.page-id-864 h1.wp-block-post-title,body.page-id-865 h1.wp-block-post-title,body.page-id-866 h1.wp-block-post-title,body.page-id-867 h1.wp-block-post-title,body.page-id-868 h1.wp-block-post-title,body.page-id-871 h1.wp-block-post-title,body.page-id-872 h1.wp-block-post-title,body.page-id-873 h1.wp-block-post-title,body.page-id-874 h1.wp-block-post-title,body.page-id-875 h1.wp-block-post-title,body.page-id-990 h1.wp-block-post-title,body.page-id-1108 h1.wp-block-post-title,body.page-id-1109 h1.wp-block-post-title,body.page-id-1128 h1.wp-block-post-title,body.page-id-1130 h1.wp-block-post-title,body.page-id-1131 h1.wp-block-post-title,body.page-id-1134 h1.wp-block-post-title,body.page-id-1136 h1.wp-block-post-title,body.page-id-1138 h1.wp-block-post-title,body.page-id-1176 h1.wp-block-post-title,body.page-id-1179 h1.wp-block-post-title,body.page-id-1190 h1.wp-block-post-title,body.page-id-1235 h1.wp-block-post-title,body.page-id-1242 h1.wp-block-post-title,body.page-id-1280 h1.wp-block-post-title,body.page-id-1526 h1.wp-block-post-title,body.page-id-1528 h1.wp-block-post-title,body.page-id-1531 h1.wp-block-post-title,body.page-id-1541 h1.wp-block-post-title,body.page-id-1544 h1.wp-block-post-title,body.page-id-1554 h1.wp-block-post-title,body.page-id-1555 h1.wp-block-post-title,body.page-id-1557 h1.wp-block-post-title,body.page-id-1558 h1.wp-block-post-title,body.page-id-1559 h1.wp-block-post-title,body.page-id-1560 h1.wp-block-post-title,body.page-id-1561 h1.wp-block-post-title,body.page-id-1562 h1.wp-block-post-title,body.page-id-1564 h1.wp-block-post-title,body.page-id-1566 h1.wp-block-post-title,body.page-id-1567 h1.wp-block-post-title,body.page-id-1569 h1.wp-block-post-title,body.page-id-1584 h1.wp-block-post-title,body.page-id-1586 h1.wp-block-post-title,body.page-id-1630 h1.wp-block-post-title,body.page-id-1632 h1.wp-block-post-title,body.page-id-1643 h1.wp-block-post-title,body.page-id-1667 h1.wp-block-post-title,body.page-id-1782 h1.wp-block-post-title,body.page-id-1786 h1.wp-block-post-title,body.page-id-1788 h1.wp-block-post-title,body.page-id-1814 h1.wp-block-post-title,body.page-id-1819 h1.wp-block-post-title,body.page-id-1857 h1.wp-block-post-title,body.page-id-1859 h1.wp-block-post-title,body.page-id-1861 h1.wp-block-post-title,body.page-id-1863 h1.wp-block-post-title,body.page-id-1865 h1.wp-block-post-title,body.page-id-1871 h1.wp-block-post-title,body.page-id-1872 h1.wp-block-post-title,body.page-id-1875 h1.wp-block-post-title,body.page-id-1878 h1.wp-block-post-title,body.page-id-1881 h1.wp-block-post-title,body.page-id-1887 h1.wp-block-post-title,body.page-id-1889 h1.wp-block-post-title,body.page-id-2012 h1.wp-block-post-title,body.page-id-3872 h1.wp-block-post-title{padding-left:0 !important;padding-right:0 !important;max-width:813px !important;margin-left:auto !important;margin-right:auto !important}}/* dj-tap-strip (10/9/26): the secondary link strip appended after .wp-site-blocks, holding Free tools, My toolkit, Locations and Comparisons, renders its links inline at 13px. At 375px they wrap into targets 16px tall spaced only 20 to 22px apart centre to centre, which fails WCAG 2.5.8 Target Size Minimum on both counts: under 24px AND too close together for the spacing exception to rescue them. Measured after this rule at 375px: every target 33px tall, minimum centre distance 33px. At 1440px the strip stays on a single line and grows from 59px to 70px. The container carries no class or id, so it is addressed by its unique inline border-top signature, verified to match exactly one element on the page. */body > div[style*="border-top:1px solid rgba(120,170,230,.10)"] a{display:inline-block !important;padding:7px 0 !important;line-height:1.45 !important}/* dj-cs-outcomes (10/9/26): on /case-studies/ the outcomes list under the heading What it is engineered to do was a single-column grid 1032px wide holding four one-line items, so every line left 719 to 797px of empty band to its right and the section read as a narrow column sitting inside a wide one. Two columns at desktop closes that gap: measured after, the worst dead space to the right of a line falls from 595px to 65px and the block shortens from 144px to 91px, with each item still fitting on one line at 502px. Gated at 900px so narrow viewports keep the single column and nothing has to wrap. The class appears on exactly one page across the 470-page corpus, so this rule cannot reach anything else. NOTE: the other grid on this page, under The system we deploy, was ALREADY three across and filling the band at 1032px, so it is deliberately left untouched. */@media (min-width:900px){.dj-c-section ul.dj-c-list{grid-template-columns:repeat(2,minmax(0,1fr)) !important;column-gap:28px !important}}/* dj-post-mobile (10/9/26): two template-level mobile defects on the review and blog posts, found by a 375px sweep. (1) YouTube embeds ship as a fixed 640x360 iframe inside span.embed-youtube with max-width none, so at 375px the iframe runs 285px past the viewport edge. (2) Link text that is a bare URL does not wrap, because overflow-wrap is normal, so a 367px URL runs 14px past. Neither shows at desktop. Blast radius measured before fixing: ZERO of the 470 pages are affected, but 7 of 24 sampled posts carry a YouTube embed and 7 of 24 carry bare-URL link text, which extrapolates to roughly 90 of the 317 posts for each. Measured after, at 375px on reviews/apollo: the iframe goes from 640x360 overflowing by 285px to 335x188 sitting 20px inside the edge, with the 16 by 9 ratio preserved exactly; the URL link lands 6px inside; and the count of elements overflowing the viewport falls from 2 to 0. Gated at max-width 899px, and verified at 1440px that the embed is byte-identical before and after, still 640x360. */@media (max-width:899px){.embed-youtube,.wp-block-embed__wrapper{display:block !important;max-width:100% !important}.embed-youtube iframe,.entry-content iframe,.wp-block-embed iframe{width:100% !important;max-width:100% !important;height:auto !important;aspect-ratio:16/9 !important}.entry-content a,.entry-content li,.entry-content p{overflow-wrap:anywhere}}/* dj-foot-align 2026-10-12 - the footer content column used max-width:1080px inside a 24px-padded footer, while the header .djn-wrap uses max-width:1180px with padding-inline:clamp(20px,5vw,44px). Two different horizontal systems, so they never aligned: measured footer 6px inside the header at >=1168px, 20px wider at 1024px, 14px wider at 768px, 4px narrower at 375px. Giving the footer the same expression as the header makes the two identical functions of viewport width. */
footer.wp-block-template-part > div,.wp-site-blocks > footer > div,.wp-site-blocks > footer > footer > div{max-width:1180px !important;margin-inline:auto !important;padding-inline:clamp(20px,5vw,44px) !important;box-sizing:border-box !important}
.wp-site-blocks > footer > footer,footer.wp-block-template-part > footer{padding-left:0 !important;padding-right:0 !important}
/* dj-home-nav-fit 2026-10-16 - the homepage nav gained a Log in link, taking its inline row to 812px of content (logo 84 + links 394 + gaps 182 + CTA 96 + 2x28 wrap gap) while the wrap offers only 801px at an 881px viewport, since --dj-pad clamps to 40px there. That left a narrow squeeze band between the 880px burger breakpoint and about 892px. Tightening the link gap across that band keeps the row on one line; below 880px the links become a stacked panel and the gap does not apply. */
@media (min-width:881px) and (max-width:980px){.dj-home .navlinks{gap:18px !important}}
/* dj-home-foot-cols 2026-10-19 - the homepage footer forked the shared footer and omitted 16 destinations the other 892 pages carry, including ALL SIX service hub links, which are money pages, plus locations, comparisons, resources and the newsletter signup. Adding a Services column takes the grid from four children to five, and the base rule is 1.6fr repeat(3,1fr), so without this the new column wraps under the brand block. Scoped to min-width 821px on purpose: the existing 820px and 520px overrides collapse the grid to two columns and then one, and they carry no !important, so an unscoped rule here would force five columns onto a phone. The main footer already runs five columns at this width, so this matches it. */
@media (min-width:821px){.dj-home .fgrid{grid-template-columns:1.6fr repeat(4,1fr) !important}}

/* dj-hero-mobile */
@media (max-width:781px){div:has(> .dj-pipe-track){display:none !important;}.dj-pipe-track{display:none !important;}section:has(.dj-hero-inner)::before{display:none !important;}section:has(.dj-hero-inner)::after{opacity:.4 !important;}.dj-hero-inner{padding:1.6rem 1.15rem 2.2rem !important;text-align:center !important;}.dj-badge{margin-left:auto !important;margin-right:auto !important;}.dj-hero-title{font-size:clamp(27px,7.8vw,40px) !important;line-height:1.13 !important;letter-spacing:-.01em !important;margin-left:auto !important;margin-right:auto !important;}.dj-hero-title br{display:none !important;}.dj-hero-sub{font-size:1rem !important;line-height:1.55 !important;max-width:36ch !important;margin-left:auto !important;margin-right:auto !important;}.dj-hero-inner form{display:flex !important;flex-direction:column !important;gap:.55rem !important;width:100% !important;max-width:360px !important;margin-left:auto !important;margin-right:auto !important;}.dj-hero-inner form input{width:100% !important;box-sizing:border-box !important;text-align:center !important;}.dj-hero-inner form button{width:100% !important;box-sizing:border-box !important;}.dj-hero-inner div:has(> .dj-hia-egb){display:flex !important;flex-wrap:wrap !important;justify-content:center !important;gap:.4rem !important;}.dj-hero-ctas{display:flex !important;flex-direction:column !important;align-items:stretch !important;gap:.6rem !important;width:100% !important;max-width:360px !important;margin:1.1rem auto 0 !important;}.dj-hero-ctas>a{width:100% !important;justify-content:center !important;text-align:center !important;box-sizing:border-box !important;}.dj-hero-micro{margin-left:auto !important;margin-right:auto !important;text-align:center !important;}.dj-trust-band{display:grid !important;grid-template-columns:1fr 1fr !important;gap:1.15rem .6rem !important;width:100% !important;max-width:320px !important;margin:1.7rem auto 0 !important;}.dj-trust-band>div{text-align:center !important;}}
/* dj-toolcard-light */
.dj-app-card{color:#1a2840 !important;}.dj-app-card h1,.dj-app-card h2,.dj-app-card h3,.dj-app-card h4{color:#0e1b2e !important;}.dj-app-card .dj-note{color:#55677d !important;}.dj-app-card label{color:#33425a !important;}.dj-cta-tool{color:#9fb2c8 !important;}.dj-cta-tool a[href*="get-started"]{display:inline-block !important;padding:.4rem 1.05rem !important;border-radius:999px !important;font-weight:700 !important;text-decoration:none !important;line-height:1.45 !important;vertical-align:middle !important;}.dj-cta-tool a[href*="get-started"],.dj-cta-tool a[href*="get-started"] *{color:#ffffff !important;}
/* dj-text-contrast */
html body{color:#cbd6e6 !important;}.entry-content li,.wp-block-list li,.entry-content p{color:#cbd6e6;}.entry-content a:not(.wp-block-button__link):not(.dj-btn-primary):not(.dj-btn-secondary):not([class*="btn"]),.wp-block-list a:not(.wp-block-button__link){color:#6fb6ff !important;}.dj-cta-tool a[href*="free-tools"]{color:#6fb6ff !important;}.dj-app-card{color:#1a2840 !important;}.dj-app-card h1,.dj-app-card h2,.dj-app-card h3,.dj-app-card h4{color:#0e1b2e !important;}.dj-app-card .dj-note{color:#55677d !important;}.dj-app-card li,.dj-app-card p{color:#28384f !important;}.dj-app-card a:not(.dj-btn-tool){color:#0a66c2 !important;}
/* dj-contrast-override */
.djsave-b.djsave-b.djsave-b.djsave-b.djsave-b.djsave-b.djsave-b{background:#ffffff !important;color:#0a2a66 !important;-webkit-text-fill-color:#0a2a66 !important}
