Premium - poprawki stopka z rejestracją
This commit is contained in:
@@ -25,11 +25,25 @@ type TvAddon = {
|
||||
group_mode?: string;
|
||||
};
|
||||
|
||||
// ✅ OPCJA A: metadane grupy + CTA
|
||||
type GroupCta = {
|
||||
label?: string;
|
||||
href?: string;
|
||||
title?: string;
|
||||
opis?: string;
|
||||
};
|
||||
|
||||
type GroupMeta = {
|
||||
tytul?: string;
|
||||
rejestracja?: GroupCta;
|
||||
};
|
||||
|
||||
type TvAddonsDoc = {
|
||||
tytul?: string;
|
||||
opis?: string;
|
||||
cena_opis?: string;
|
||||
dodatki?: TvAddon[];
|
||||
grupy?: Record<string, GroupMeta>;
|
||||
};
|
||||
|
||||
const doc = yaml.load(
|
||||
@@ -40,6 +54,9 @@ const pageTitle = doc?.tytul ?? "Dodatkowe pakiety TV";
|
||||
const pageDesc = doc?.opis ?? "";
|
||||
const addons: TvAddon[] = Array.isArray(doc?.dodatki) ? doc.dodatki : [];
|
||||
|
||||
// ✅ mapa meta grup
|
||||
const groupMeta: Record<string, GroupMeta> = doc?.grupy ?? {};
|
||||
|
||||
// --- dynamic param ---
|
||||
const tidParam = Astro.params.tid; // np. "49"
|
||||
const tid = Number(tidParam);
|
||||
@@ -63,95 +80,83 @@ if (pickedGroup) {
|
||||
viewAddons = [picked];
|
||||
}
|
||||
|
||||
// stabilne sortowanie (np. po tid, żeby HBO/Disney nie skakały)
|
||||
// (jak miałeś) sortowanie w grupie — możesz zostawić albo wywalić
|
||||
viewAddons = viewAddons
|
||||
.slice()
|
||||
.sort((a, b) => Number(a?.tid ?? 0) - Number(b?.tid ?? 0));
|
||||
|
||||
// tytuł/description strony
|
||||
const singleTitle = pickedGroup ? (pickedGroup.toUpperCase() || pageTitle) : (String(picked?.nazwa ?? "").trim() || pageTitle);
|
||||
const singleTitle = pickedGroup
|
||||
? (groupMeta[pickedGroup]?.tytul ?? pickedGroup.toUpperCase() ?? pageTitle)
|
||||
: (String(picked?.nazwa ?? "").trim() || pageTitle);
|
||||
|
||||
const singleDesc = pageDesc;
|
||||
|
||||
// ✅ CTA dla tej grupy (jeśli istnieje)
|
||||
const footerCta: GroupCta | undefined =
|
||||
pickedGroup ? groupMeta[pickedGroup]?.rejestracja : undefined;
|
||||
---
|
||||
|
||||
<DefaultLayout title={singleTitle} description={singleDesc}>
|
||||
<!-- (opcjonalnie) nagłówek strony -->
|
||||
<!-- <section class="f-section">
|
||||
<div class="f-section-grid-single">
|
||||
<h1 class="f-section-title">{singleTitle}</h1>
|
||||
{singleDesc && <Markdown text={singleDesc} />}
|
||||
</div>
|
||||
</section> -->
|
||||
{/* Opcjonalnie: box jak na stronie ogólnej, tylko jeśli jesteśmy w grupie */}
|
||||
<div class={pickedGroup ? "f-addon-group" : ""}>
|
||||
{
|
||||
viewAddons.map((addon: TvAddon, index: number) => {
|
||||
const isAboveFold = index === 0;
|
||||
|
||||
{
|
||||
viewAddons.map((addon: TvAddon, index: number) => {
|
||||
const isAboveFold = index === 0;
|
||||
const pkgName = String(addon?.nazwa ?? "").trim();
|
||||
const hasYamlImage = !!String(addon?.image ?? "").trim();
|
||||
const assumeHasMedia = pkgName ? true : hasYamlImage;
|
||||
|
||||
const pkgName = String(addon?.nazwa ?? "").trim();
|
||||
const hasYamlImage = !!String(addon?.image ?? "").trim();
|
||||
const assumeHasMedia = pkgName ? true : hasYamlImage;
|
||||
const anchorId = addon?.tid != null ? `tid-${addon.tid}` : undefined;
|
||||
|
||||
const anchorId = addon?.tid != null ? `tid-${addon.tid}` : undefined;
|
||||
return (
|
||||
<section class="f-section" id={anchorId}>
|
||||
<div
|
||||
class={`f-section-grid f-addon-grid f-addon-section ${
|
||||
assumeHasMedia ? "md:grid-cols-2" : "md:grid-cols-1"
|
||||
}`}
|
||||
data-addon-section
|
||||
data-has-media={assumeHasMedia ? "1" : "0"}
|
||||
>
|
||||
<div class="f-addon-text">
|
||||
{pkgName && <h2 class="f-section-title">{pkgName}</h2>}
|
||||
{addon?.opis && <Markdown text={addon.opis} />}
|
||||
</div>
|
||||
|
||||
return (
|
||||
<section class="f-section" id={anchorId}>
|
||||
<div
|
||||
class={`f-section-grid f-addon-grid f-addon-section ${
|
||||
assumeHasMedia ? "md:grid-cols-2" : "md:grid-cols-1"
|
||||
}`}
|
||||
data-addon-section
|
||||
data-has-media={assumeHasMedia ? "1" : "0"}
|
||||
>
|
||||
<div class="f-addon-text">
|
||||
{pkgName && <h2 class="f-section-title">{pkgName}</h2>}
|
||||
{addon?.opis && <Markdown text={addon.opis} />}
|
||||
<div class="f-addon-media">
|
||||
{pkgName ? (
|
||||
<AddonChannelsGrid
|
||||
client:idle
|
||||
packageName={pkgName}
|
||||
fallbackImage={String(addon?.image ?? "")}
|
||||
aboveFold={isAboveFold}
|
||||
title={pkgName}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="f-addon-media">
|
||||
{pkgName ? (
|
||||
<AddonChannelsGrid
|
||||
client:idle
|
||||
packageName={pkgName}
|
||||
fallbackImage={String(addon?.image ?? "")}
|
||||
aboveFold={isAboveFold}
|
||||
title={pkgName}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
<script is:inline>
|
||||
function __scrollToHashWithOffset(behavior = "auto") {
|
||||
if (!location.hash) return;
|
||||
|
||||
const id = decodeURIComponent(location.hash.slice(1));
|
||||
const el = document.getElementById(id);
|
||||
if (!el) return;
|
||||
|
||||
const nav =
|
||||
document.querySelector(".f-navbar") ||
|
||||
document.querySelector("header") ||
|
||||
document.querySelector("[data-navbar]");
|
||||
|
||||
const navH = nav ? nav.getBoundingClientRect().height : 84;
|
||||
const extra = 8;
|
||||
|
||||
const top = el.getBoundingClientRect().top + window.pageYOffset - navH - extra;
|
||||
|
||||
window.scrollTo({ top: Math.max(0, top), behavior });
|
||||
</section>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
function __runFix() {
|
||||
__scrollToHashWithOffset("auto");
|
||||
requestAnimationFrame(() => __scrollToHashWithOffset("auto"));
|
||||
setTimeout(() => __scrollToHashWithOffset("auto"), 120);
|
||||
setTimeout(() => __scrollToHashWithOffset("auto"), 600);
|
||||
}
|
||||
{/* ✅ STOPKA GRUPY: tylko na stronach grupowych */}
|
||||
{pickedGroup && footerCta?.href && footerCta?.label ? (
|
||||
<div class="f-addon-group-footer fuz-markdown max-w-none">
|
||||
{footerCta.opis ? <p>{footerCta.opis}</p> : null}
|
||||
|
||||
<a
|
||||
class="btn btn-primary"
|
||||
href={footerCta.href}
|
||||
title={footerCta.title ?? footerCta.label}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{footerCta.label}
|
||||
</a>
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
window.addEventListener("load", __runFix);
|
||||
window.addEventListener("hashchange", () => __scrollToHashWithOffset("smooth"));
|
||||
</script>
|
||||
</DefaultLayout>
|
||||
|
||||
Reference in New Issue
Block a user