--- import { render, type CollectionEntry } from "astro:content"; import Layout from "@/layouts/Layout.astro"; import Header from "@/components/Header.astro"; import Footer from "@/components/Footer.astro"; import Tag from "@/components/Tag.astro"; import Datetime from "@/components/Datetime.astro"; import EditPost from "@/components/EditPost.astro"; import ShareLinks from "@/components/ShareLinks.astro"; import BackButton from "@/components/BackButton.astro"; import BackToTopButton from "@/components/BackToTopButton.astro"; import { getPath } from "@/utils/getPath"; import { slugifyStr } from "@/utils/slugify"; import IconChevronLeft from "@/assets/icons/IconChevronLeft.svg"; import IconChevronRight from "@/assets/icons/IconChevronRight.svg"; import { SITE } from "@/config"; type Props = { post: CollectionEntry<"blog" | "events" | "workshops" | "news" | "technical">; posts: CollectionEntry<"blog" | "events" | "workshops" | "news" | "technical">[]; }; const { post, posts } = Astro.props; const { title, author, description, ogImage: initOgImage, canonicalURL, pubDatetime, modDatetime, timezone, tags, hideEditPost, } = post.data; const { Content } = await render(post); let ogImageUrl: string | undefined; // Determine OG image source if (typeof initOgImage === "string") { ogImageUrl = initOgImage; // Remote OG image (absolute URL) } else if (initOgImage?.src) { ogImageUrl = initOgImage.src; // Local asset } // Use dynamic OG image if enabled and no remote|local ogImage if (!ogImageUrl && SITE.dynamicOgImage) { ogImageUrl = `${getPath(post.id, post.filePath)}/index.png`; } // Resolve OG image URL (or fallback to SITE.ogImage / default `og.png`) const ogImage = ogImageUrl ? new URL(ogImageUrl, Astro.url.origin).href : undefined; const layoutProps = { title: `${title} | ${SITE.title}`, author, description, pubDatetime, modDatetime, canonicalURL, ogImage, scrollSmooth: true, }; /* ========== Prev/Next Posts ========== */ const allPosts = posts.map(({ data: { title }, id, filePath }) => ({ id, title, filePath, })); const currentPostIndex = allPosts.findIndex(a => a.id === post.id); const prevPost = currentPostIndex !== 0 ? allPosts[currentPostIndex - 1] : null; const nextPost = currentPostIndex !== allPosts.length ? allPosts[currentPostIndex + 1] : null; ---

{title}


    {tags.map(tag => )}