feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization

This commit is contained in:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -1,9 +1,8 @@
// MEDIABROWSER Official Site Script
// Paca Official Site Script
// 1) IntersectionObserver Scroll Reveal
// 2) Mobile Navigation Menu Controller
// 3) Interactive Hero Workstation Simulator (Multi-Tab Switcher & Live Telemetry)
// 4) Spotlight Card Cursor Light Tracker
// 5) Dynamic Releases Renderer (releases.json)
// 4) Dynamic Releases Renderer (releases.json)
// ── 1. Scroll Reveal Controller ──────────────────────────────
(function initReveal() {
@ -31,6 +30,12 @@
const overlay = document.getElementById("mobile-menu");
if (!toggleBtn || !overlay) return;
function closeMenu() {
overlay.classList.remove("is-active");
toggleBtn.setAttribute("aria-expanded", "false");
document.body.style.overflow = "";
}
function toggleMenu() {
const isActive = overlay.classList.toggle("is-active");
toggleBtn.setAttribute("aria-expanded", String(isActive));
@ -39,6 +44,17 @@
toggleBtn.addEventListener("click", toggleMenu);
overlay.addEventListener("click", (e) => {
if (e.target === overlay) closeMenu();
});
document.addEventListener("keydown", (e) => {
if (e.key === "Escape" && overlay.classList.contains("is-active")) {
closeMenu();
toggleBtn.focus();
}
});
overlay.querySelectorAll(".mobile-menu-link").forEach((link) => {
link.addEventListener("click", () => {
overlay.classList.remove("is-active");
@ -51,8 +67,8 @@
// ── 3. Interactive Hero Workstation Simulator ────────────────
(function initHeroWorkstation() {
// Tab switcher
const tabBtns = document.querySelectorAll(".sim-tab-btn");
const tabPanels = document.querySelectorAll(".sim-tab-panel");
const tabBtns = document.querySelectorAll(".tab-btn");
const tabPanels = document.querySelectorAll(".tab-panel");
tabBtns.forEach((btn) => {
btn.addEventListener("click", () => {
@ -99,27 +115,10 @@
}, 1200);
})();
// ── 4. Spotlight Card Cursor Light Tracker ───────────────────
(function initSpotlight() {
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
const cards = document.querySelectorAll(".spotlight-card");
if (!cards.length) return;
cards.forEach((card) => {
card.addEventListener("mousemove", (e) => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
card.style.setProperty("--mouse-x", `${x}px`);
card.style.setProperty("--mouse-y", `${y}px`);
});
});
})();
// ── 5. Releases Renderer ─────────────────────────────────────
const PLATFORMS = [
{ id: "windows", label: "Windows", icon: "windows-logo", sub: "x64 및 ARM64 네이티브 설치자 (exe)",
match: (n) => /setup.*\.exe$/i.test(n) || /win/i.test(n) },
{ id: "windows", label: "Windows", icon: "windows-logo", sub: "x64 및 ARM64 네이티브 설치자 (exe, msi)",
match: (n) => /setup.*\.(exe|msi)$/i.test(n) || /\.msi$/i.test(n) || /win/i.test(n) },
{ id: "macos", label: "macOS 프리뷰", icon: "apple-logo", sub: "Apple Silicon & Intel tar.gz 프리뷰 빌드",
match: (n) => /osx|darwin|mac/i.test(n) },
{ id: "linux", label: "Linux 프리뷰", icon: "linux-logo", sub: "Ubuntu, Fedora, Arch tar.gz 프리뷰 빌드",
@ -130,7 +129,7 @@ const PLATFORMS = [
function detectPreferredAsset(name) {
const ua = navigator.userAgent;
if (/Windows/i.test(ua)) return /setup-x64\.exe$/i.test(name);
if (/Windows/i.test(ua)) return /setup-x64\.(exe|msi)$/i.test(name);
if (/Android/i.test(ua)) return /\.apk$/i.test(name);
if (/Mac/i.test(ua)) return /osx-arm64/i.test(name);
if (/Linux/i.test(ua)) return /linux-x64/i.test(name);
@ -155,7 +154,7 @@ function esc(s) {
function assetRow(a, recommended) {
return `<div class="dl-asset">
<div>
<div class="rel-asset-info">
<div class="dl-asset__name">${esc(a.name)}</div>
<div class="dl-asset__size text-mono">${fmtSize(a.size)} ${recommended ? '<span style="color:var(--accent);font-weight:700">· 현재 기기에 권장</span>' : ''}</div>
</div>
@ -204,32 +203,32 @@ function releaseCard(r, featured) {
${groupsHtml(r.assets)}`;
if (featured) {
return `<article class="bezel-shell spotlight-card"><div class="bezel-inner rel-featured">${meta}</div></article>`;
return `<article class="card rel-featured">${meta}</article>`;
}
return `<div class="bezel-shell spotlight-card"><div class="bezel-inner"><details>
return `<div class="card"><details>
<summary>
<span class="rel-featured__tag" style="font-size:1.15rem">${esc(r.name || r.tag)}</span>
${pill}
<span class="rel-featured__date text-mono">${fmtDate(r.published_at)}</span>
<svg class="icon faq-chevron" style="margin-left:8px"><use href="assets/icons.svg#caret-down"/></svg>
<svg class="icon" style="margin-left:auto;width:14px;height:14px"><use href="assets/icons.svg#arrow-right"/></svg>
</summary>
<div class="rel-old__body">
${r.notes ? `<p class="rel-featured__notes">${esc(r.notes)}</p>` : ""}
${groupsHtml(r.assets)}
</div>
</details></div></div>`;
</details></div>`;
}
function emptyState() {
return `<div class="bezel-shell rel-empty">
<svg class="icon" aria-hidden="true"><use href="assets/icons.svg#rocket-launch"/></svg>
return `<div class="card rel-empty">
<div class="detection-pulse" style="margin:0 auto 12px" aria-hidden="true"></div>
<h2>첫 공개 릴리스를 준비하고 있습니다</h2>
<p style="color:var(--text-secondary);max-width:54ch">빌드 파이프라인이 정상 작동 중이며 곧 공식 설치자가 배포됩니다. 먼저 <a href="guide.html" style="color:var(--accent);font-weight:700">사용 안내</a>를 둘러보세요.</p>
</div>`;
}
(async function initReleases() {
const root = document.getElementById("release-root");
const root = document.getElementById("release-root") || document.getElementById("releases-container");
if (!root) return;
try {
@ -249,9 +248,9 @@ function emptyState() {
}
root.innerHTML = html;
} catch (err) {
root.innerHTML = `<div class="bezel-shell rel-empty">
root.innerHTML = `<div class="card rel-empty">
<h2>릴리스 목록을 불러오지 못했습니다</h2>
<p style="color:var(--text-secondary)">네트워크 상태를 확인하고 새로고침해 주세요. 급하신 경우 <a href="https://git.chanpaca.net/Video-Downloader/releases" style="color:var(--accent);font-weight:700" target="_blank" rel="noopener">릴리스 저장소</a>에서 직접 다운로드하실 수 있습니다.</p>
<p style="color:var(--text-secondary)">네트워크 상태를 확인하고 새로고침해 주세요. 급하신 경우 <a class="link-inline" href="https://git.chanpaca.net/Paca/releases" style="color:var(--accent);font-weight:700" target="_blank" rel="noopener">릴리스 저장소</a>에서 직접 다운로드하실 수 있습니다.</p>
</div>`;
}
})();