oglasi: nic manj prikazov, vec mest za enote ki nesejo

Po podatkih AdSense (zadnjih 7 dni) prihodek nesejo folx.tv in-article
(98,93 EUR), Folx News In-Article = slot 4154017639 (82,45 EUR) in Multiplex
(63,59 EUR). Prejsnji commit je pri dveh od teh zmanjsal stevilo mest.

- odlozena zahteva (IntersectionObserver) NI vec privzeta: eager=true.
  Odlozeno nalaganje dvigne vidnost, a znizza stevilo prikazov pri enotah
  globlje na strani - in prav te nesejo denar. Pot ostaja v kodi za kasneje,
  ko bomo ucinek lahko izmerili. Popravek 3-sekundnega odstevanja ostane.
- clanek: enota 4154017639 vrnjena na stran, a pod naslovom in tik pred
  besedilom namesto kot pas nad naslovnico - isti prikazi, boljse mesto,
  naslov ne pade pod pregib.
- PageSideAds: oba stolpca spet tu. Sirina se prilagodi zaslonu prek
  --rail-w: 160x600 od 1536 px, 300x600 od 1700 px. Dodan onAdStatus, da
  prazna enota ne pusti luknje.
- naslovnica dobi Multiplex, edina strana ga ni imela.

Skupaj na clanku (telefon): display pred besedilom, in-article za uvodom,
display na sredini (in vec pri dolgih), multiplex, lepljivi pas.
This commit is contained in:
Claude
2026-08-28 09:32:45 +00:00
parent db9eac20e2
commit 5b519019d2
4 changed files with 56 additions and 24 deletions
+36 -23
View File
@@ -23,7 +23,11 @@ export default function AdSense({
style,
layout,
layoutKey,
eager = false,
// Privzeto zahtevamo takoj. Odlozena zahteva dvigne vidnost, a znizza stevilo
// prikazov pri enotah globlje na strani - in prav te (in-article, multiplex)
// nosijo prihodek. Lazy pot ostaja na voljo prek eager={false}, a je nikjer
// ne uporabljamo, dokler ucinka ne moremo izmeriti v AdSense.
eager = true,
onAdStatus,
}: AdSenseProps) {
const adRef = useRef<HTMLModElement>(null);
@@ -230,36 +234,45 @@ export function MultiplexAd() {
);
}
// En sam desni stolpec 300x600 namesto dveh 160x600.
// 160x600 je stara velikost z malo povprasevanja, dve enoti sta si konkurirali,
// prazna pa je brez onAdStatus pustila luknjo. Prikaze se sele, ko je dovolj
// prostora desno od vsebine (min-[1700px]).
export function PageSideAds({ contentHalfWidth = 640 }: { contentHalfWidth?: number }) {
const gap = 24;
const offset = contentHalfWidth + gap;
// Oba stolpca ostaneta (nic se ne odvzame), a se prilagodita sirini zaslona:
// 160x600 od 1536 px, 300x600 od 1700 px naprej, kjer je prostora dovolj.
// Sirino dolocz CSS, AdSense jo prebere ob zahtevi. Dodan onAdStatus, da prazna
// enota ne pusti luknje - prej je ni imela.
function SideRail({ side, offset }: { side: "left" | "right"; offset: number }) {
const [filled, setFilled] = useState<boolean | null>(null);
if (filled === false) return null;
return (
<div className="relative">
<div
className="hidden min-[1700px]:flex fixed top-0 bottom-0 w-[300px] z-10 items-center justify-center pointer-events-none"
style={{ right: `calc(50% - ${offset}px - 300px)` }}
data-testid="ad-right-sidebar"
>
<div className="pointer-events-auto">
<AdSense
slot="2398082838"
format="vertical"
responsive={false}
style={{ display: "block", width: "300px", height: "600px" }}
onAdStatus={setFilled}
/>
</div>
<div
className="hidden 2xl:flex fixed top-0 bottom-0 w-[160px] min-[1700px]:w-[300px] z-10 items-center justify-center pointer-events-none"
style={side === "left"
? { left: `calc(50% - ${offset}px - var(--rail-w))` }
: { right: `calc(50% - ${offset}px - var(--rail-w))` }}
data-testid={`ad-${side}-sidebar`}
>
<div className="pointer-events-auto w-full">
<AdSense
slot="2398082838"
format="vertical"
responsive={false}
style={{ display: "block", width: "100%", height: "600px" }}
onAdStatus={setFilled}
/>
</div>
</div>
);
}
export function PageSideAds({ contentHalfWidth = 640 }: { contentHalfWidth?: number }) {
const gap = 10;
const offset = contentHalfWidth + gap;
return (
<div className="relative page-side-rails">
<SideRail side="left" offset={offset} />
<SideRail side="right" offset={offset} />
</div>
);
}
export function SidebarAd() {
const [visible, setVisible] = useState(false);
+7
View File
@@ -312,3 +312,10 @@ div[class^="fc-"] {
.adsbygoogle {
contain: layout style;
}
/* Sirina stranskih stolpcev: 160x600 od 1536 px, 300x600 od 1700 px naprej.
Vrednost bere PageSideAds za izracun odmika od sredine. */
.page-side-rails { --rail-w: 160px; }
@media (min-width: 1700px) {
.page-side-rails { --rail-w: 300px; }
}
+5
View File
@@ -358,6 +358,11 @@ export default function ArticlePage() {
</div>
</div>
{/* Enota "Folx News - In-Article" (4154017639) je bila prej vrhnji pas nad
naslovnico. Ostane na clanku, a pod naslovom in tik pred besedilom:
isti prikazi, boljse mesto, naslov ne pade pod pregib. */}
<InContentDisplayAd />
{(() => {
const sanitized = sanitizeContent(article.content);
const blocks = sanitized.split(/(?=<(?:p|h[2-4]|div)[\s>])/i).filter(Boolean);
+8 -1
View File
@@ -8,7 +8,7 @@ import { Eye, Play, Images } from "lucide-react";
import { Skeleton } from "@/components/ui/skeleton";
import Header from "@/components/header";
import Footer from "@/components/footer";
import AdSense, { ArticleCardAd, SidebarAd, PageSideAds } from "@/components/adsense";
import AdSense, { ArticleCardAd, SidebarAd, PageSideAds, MultiplexAd } from "@/components/adsense";
import { PhotoGalleryWidget } from "@/components/photo-gallery";
import { HoroscopeWidget } from "@/components/horoscope-widget";
import { RecipeWidget } from "@/components/recipe-widget";
@@ -970,6 +970,13 @@ export default function Home() {
</div>
</LazySection>
{/* Multiplex je zadnjih sedem dni najhitreje rastoca enota (+500 %),
naslovnica ga edina ni imela. */}
<div className="mt-6" data-testid="ad-multiplex-home">
<div className="text-[9px] text-muted-foreground/40 text-center pb-1 uppercase tracking-widest">Anzeige</div>
<MultiplexAd />
</div>
</main>
<Footer />
<PushPromptBanner />