From f6a2f11422ced0a60669726bc5d083b63b066d9a Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Wed, 21 Oct 2026 05:24:39 +0000 Subject: [PATCH 1/2] No ads on the homepage; low-profile text-link ads elsewhere The homepage renders no ad unit. Remaining units are a single thin text_link line per page with quiet spacing, never against the footer. Co-Authored-By: Claude Opus 5.5 --- apps/site/app/_components/ad-unit.tsx | 15 ++++++--------- apps/site/app/globals.css | 13 ++----------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/apps/site/app/_components/ad-unit.tsx b/apps/site/app/_components/ad-unit.tsx index 873a501..0bfcaf2 100644 --- a/apps/site/app/_components/ad-unit.tsx +++ b/apps/site/app/_components/ad-unit.tsx @@ -4,7 +4,8 @@ import { useEffect, useRef } from "react"; import { usePathname } from "next/navigation"; /** - * One CrawlProof ad unit, at the top of the main content on public pages. + * One low-profile CrawlProof text-link ad, at the top of the main content on + * public pages. The homepage carries no ad. * Manage the slot at https://crawlproof.com/ads/slots */ const AD_SLOT = "5500e925-8ab1-4dd9-b89d-eaafa3554f68"; @@ -23,9 +24,6 @@ const EXCLUDED_PREFIXES = [ "/play", ]; -/** 728x90 needs the full row; anything narrower gets the 300x250 rectangle. */ -const LEADERBOARD_QUERY = "(min-width: 768px)"; - const SCAN_RETRY_MS = 200; const SCAN_MAX_TRIES = 25; @@ -36,6 +34,7 @@ declare global { } function isExcluded(pathname: string): boolean { + if (pathname === "/") return true; return EXCLUDED_PREFIXES.some((p) => pathname === p || pathname.startsWith(`${p}/`)); } @@ -54,11 +53,9 @@ function AdSlot() { const el = ref.current; if (!el) return; // The server renders the element without data-slot, so ad.js's own - // DOMContentLoaded pass skips it; the format is chosen here from the real - // viewport and the unit fills exactly once. - el.dataset.format = window.matchMedia(LEADERBOARD_QUERY).matches - ? "banner_728x90" - : "banner_300x250"; + // DOMContentLoaded pass skips it; the unit fills exactly once, as a thin + // fluid text link. + el.dataset.format = "text_link"; el.dataset.slot = AD_SLOT; // ad.js scans once at DOMContentLoaded and may not have loaded yet, so diff --git a/apps/site/app/globals.css b/apps/site/app/globals.css index bab95b4..9b7d5ad 100644 --- a/apps/site/app/globals.css +++ b/apps/site/app/globals.css @@ -1731,8 +1731,7 @@ a { /* * CrawlProof ad unit: zero height until ad.js starts a fill (it sets * data-cp-filled, and removes it again on an empty response), so an unsold or - * blocked slot leaves no hole. The reserved height is the format plus the - * "Advertisement" caption ad.js draws above banners. + * blocked slot leaves no hole. The unit is a thin text_link line. */ .cp-ad { display: flex; @@ -1745,13 +1744,5 @@ a { .cp-ad[data-cp-filled] { height: auto; - margin: 2rem 0; -} - -.cp-ad[data-cp-filled][data-format="banner_728x90"] { - min-height: 106px; -} - -.cp-ad[data-cp-filled][data-format="banner_300x250"] { - min-height: 266px; + margin: 10px 0; } From 3001d1b02ed9f4b59916c14a743f4ce1c1873083 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Wed, 21 Oct 2026 05:25:57 +0000 Subject: [PATCH 2/2] Format layout.tsx (prettier, pre-existing) Co-Authored-By: Claude Opus 5.5 --- apps/site/app/layout.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/site/app/layout.tsx b/apps/site/app/layout.tsx index d47b97a..9f2ef30 100644 --- a/apps/site/app/layout.tsx +++ b/apps/site/app/layout.tsx @@ -146,10 +146,11 @@ export default function RootLayout({ children }: { children: React.ReactNode }) {/* Required fiction disclaimer (PRD ยง32), with the photosensitivity notice. */}

- NIGHTCELL 7 is a fictional work set in an invented near-future crisis. Its organizations, - facilities, operations, and characters are fictional. The game does not depict or endorse - any real government, military operation, political movement, or current event. It contains - flashing lights and can be played with flash reduction enabled. + NIGHTCELL 7 is a fictional work set in an invented near-future crisis. Its + organizations, facilities, operations, and characters are fictional. The game does not + depict or endorse any real government, military operation, political movement, or + current event. It contains flashing lights and can be played with flash reduction + enabled.