// NEKO — Anasayfa page component // Requires site-core.jsx + site-shop.jsx function DiscordButton({ theme, lg }) { return ( ); } function HeroMeta() { return (
{NEKO.online} oyuncu çevrimiçi Sürüm {NEKO.version}
); } // Hero background video — silent, native forward loop. // // NOTE — PRE-BAKED PING-PONG ASSET REQUIRED: // The yoyo (forward → backward → forward) effect must be baked into the video // file itself; runtime reverse playback via currentTime seeking stutters. // Before production, export `uploads/bgvideo.mp4` as forward + reversed // concatenated into one file (and strip the audio track), e.g. with ffmpeg: // ffmpeg -i bgvideo.mp4 -filter_complex \ // "[0:v]reverse[r];[0:v][r]concat=n=2:v=1:a=0[v]" \ // -map "[v]" -an -c:v libx264 -crf 23 -pix_fmt yuv420p \ // -movflags +faststart bgvideo.mp4 // The code below plays that combined file normally with the native `loop` // attribute, so the browser only ever plays forward — smooth, no seeking. // // NekoSky stays underneath as the poster/fallback layer while loading or on error. function HeroVideoBackdrop({ theme }) { const videoRef = React.useRef(null); const [failed, setFailed] = React.useState(false); const [ready, setReady] = React.useState(false); React.useEffect(() => { const video = videoRef.current; if (!video) return; video.muted = true; // belt-and-braces: never any audio const reduced = window.matchMedia("(prefers-reduced-motion: reduce)"); const onCanPlay = () => { setReady(true); if (!reduced.matches && video.paused) { video.play().catch(() => {}); } }; const onError = () => setFailed(true); const onMotionChange = () => { if (reduced.matches) { video.pause(); } else { video.play().catch(() => {}); } }; video.addEventListener("canplay", onCanPlay); video.addEventListener("error", onError); if (reduced.addEventListener) reduced.addEventListener("change", onMotionChange); if (reduced.matches) video.pause(); return () => { video.removeEventListener("canplay", onCanPlay); video.removeEventListener("error", onError); if (reduced.removeEventListener) reduced.removeEventListener("change", onMotionChange); }; }, []); if (failed) return ; return ( ); } function HomeHero({ theme, variant }) { if (variant === "2") { const corner = (pos) => ({ position: "absolute", width: 18, height: 18, background: "var(--c-accent)", zIndex: 2, ...(pos.includes("t") ? { top: -6 } : { bottom: -6 }), ...(pos.includes("l") ? { left: -6 } : { right: -6 }), }); return (

NEKO

Keşif, görev ve topluluk odaklı hayatta kalma sunucusu. Sezon 4 şimdi açık.

sunucu ekran görüntüsü — 16:10{"\n"}(sur / kale gün batımı çekimi)
); } // Variant 1 — Sinematik Merkez return (
YAŞAYAN BİR MINECRAFT DÜNYASI

NEKO

Surların ardında görevler, dostluklar ve keşfedilmemiş topraklar seni bekliyor.

Sunucuya Katıl
); } function ModeCard({ m, theme }) { const body = (
{m.mascot ? : null}
{m.name}

{m.desc}

{m.stat} {m.href ? : null}
); if (m.href) { return {body}; } return body; } function NewsCard({ n }) { return (
{n.ph}
{n.cat} {n.date}

{n.title}

); } function HomePage() { const [theme, setTheme] = useNekoTheme(); const [tw, setTw] = useNekoTweaks(); const cart = useCart(); const [cartOpen, setCartOpen] = React.useState(false); return ( İçeriğe geç setCartOpen(true)} />
{/* Server modes */}
{NEKO_MODES.map((m) => )}
{/* Living world split */}
dünya görseli — 4:3{"\n"}(zindan girişi / sur manzarası)

Bilinmeyene Cesaret Et

Haftalık görev zincirleri, oyuncuların kurduğu kasabalar, zindan rotaları ve cuma akşamları hep birlikte savunduğumuz surlar. Neko'da dünya senin izini taşır.

Sunucuya Katıl
{/* Store preview */}
Mağazayı Gör} />
{["rank-gezgin", "koz-sapka", "pet-tilki", "diyar-bayrak", "paket-sezon", "tag-kasif", "fx-ender"] .map((id) => NEKO_PRODUCTS.find((p) => p.id === id)) .filter(Boolean) .map((p) => ( ))}
{/* Credits preview */}
Kredi Yükle} />
{NEKO_PACKS.slice(0, 3).map((k) => (
{k.popular && En popüler}
{k.amount}
Kredi {k.bonus ? "· " + k.bonus : ""}
Seç
))}
{/* Discord CTA — community gathering card */}

Topluluğa Katıl

Duyurular, etkinlik takvimi ve yardım kanalı Discord'da. {NEKO.discord}

{/* News */}
Tüm Duyurular} />
{NEKO_NEWS.map((n) => )}
{/* Recent supporters — hover/focus expands to a profile preview */}
{/* Final join CTA */}

Surlar Seni Bekliyor

{NEKO.ip} · Sürüm {NEKO.version} · {NEKO.discord}

setCartOpen(false)} />
); } ReactDOM.createRoot(document.getElementById("root")).render();