From d481fb2ed52fe43e26a0146ede9fa0b27ac99072 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Mon, 19 Oct 2026 12:29:36 +0000 Subject: [PATCH] fix(web): move the CrawlProof ad out of the footer dock to the top of the sheet The ad unit sat in the ring-dock directly before the @profullstack/footer. It now lives in its own dock pinned to the top of a home/settings sheet (under the nav), still hidden on sign-in and still filled by mountAd(). Co-Authored-By: Claude Opus 5.5 --- web/public/app.css | 30 ++++++++++++++++++++++-------- web/public/index.html | 6 +++++- web/src/app.js | 2 +- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/web/public/app.css b/web/public/app.css index 6258979..9a9d83c 100644 --- a/web/public/app.css +++ b/web/public/app.css @@ -1101,9 +1101,25 @@ body.gated .nav-items button:not(#nav-account) { display: block; color: var(--text); } -/* CrawlProof ad unit, docked above the footer: zero height until ad.js fills - it, and never on the sign-in / account screens. Filled only from - mountAd() in app.js, the first time a home or settings sheet opens. */ +/* CrawlProof ad unit, docked at the top of the sheet (under the nav): zero + height until ad.js fills it, and never on the sign-in / account screens. + Filled only from mountAd() in app.js, the first time a home or settings + sheet opens. */ +.ad-dock { + display: none; +} +#sheet:not([hidden]):not([data-screen="account"]) ~ .ad-dock { + position: absolute; + left: 0; + right: 0; + top: 0; + z-index: 11; + display: block; + color: var(--text); +} +body.nav-on #sheet:not([hidden]) ~ .ad-dock { + top: var(--nav-h); +} .cp-ad { display: block; max-width: 48rem; @@ -1115,12 +1131,10 @@ body.gated .nav-items button:not(#nav-account) { .cp-ad[data-cp-filled] { height: auto; overflow: visible; + padding: 0.6rem 1rem; } -#sheet[data-screen="account"]:not([hidden]) ~ .ring-dock .cp-ad { - display: none; -} -#sheet:not([hidden]):not([data-screen="account"]):has(~ .ring-dock .cp-ad[data-cp-filled]) { - padding-bottom: 10rem; +#sheet:not([hidden]):not([data-screen="account"]):has(~ .ad-dock .cp-ad[data-cp-filled]) { + padding-top: 4rem; } .ring-dock .pfs-footer { --pfs-footer-muted: var(--dim); diff --git a/web/public/index.html b/web/public/index.html index c812004..a08d39a 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -80,10 +80,14 @@ + +
+ -
+
diff --git a/web/src/app.js b/web/src/app.js index af198c2..65293a6 100644 --- a/web/src/app.js +++ b/web/src/app.js @@ -2204,7 +2204,7 @@ function navCurrent() { return 'live'; } -// CrawlProof ad unit in the footer dock (index.html). The element ships without +// CrawlProof ad unit in the top-of-sheet ad dock (index.html). The element ships without // a slot so ad.js's own DOMContentLoaded pass skips it; the first home or // settings sheet sets the slot and asks ad.js to fill it, once. Bounded retry // while ad.js is still loading, so a blocker never leaves a timer running.