From 67f245a48faf6e89989aca2ea571b657fd4c8888 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Wed, 11 Jun 2025 23:20:36 +0000 Subject: feat: integrate schema.org support and enhance component structure - Added schema.org support by introducing `schema-dts` for structured data in components. - Updated `Head`, `BaseLayout`, and various page components to accept and utilize schema props for better SEO. - Created new utility schemas for blog posts and website to standardize structured data implementation. - Enhanced the `SocialLinks` section by utilizing dedicated icon components for improved maintainability. - Refactored the `Header` component to improve accessibility and structure. - Introduced new icons for social links and integrated them into the layout. --- src/pages/404.astro | 10 ++++++++-- src/pages/blog/[...slug].astro | 24 ++++++++++++++++++------ src/pages/blog/index.astro | 24 +++++++++++++++++------- src/pages/index.astro | 10 ++++++++-- 4 files changed, 51 insertions(+), 17 deletions(-) (limited to 'src/pages') diff --git a/src/pages/404.astro b/src/pages/404.astro index 8bbd18a..4215a60 100644 --- a/src/pages/404.astro +++ b/src/pages/404.astro @@ -1,13 +1,19 @@ --- import Layout from "../layouts/BaseLayout.astro"; +import websiteSchema from "../utils/schemas/websiteSchema"; const title = "404 — Page Not Found | Valentin Popov"; const description = "The page you're looking for doesn't exist!"; const lang = "en"; + +const schema = websiteSchema({ + siteUrl: new URL("/", Astro.site).toString(), + title, +}); --- - -
+ +

404

Page not found

diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro index c625057..8d5169a 100644 --- a/src/pages/blog/[...slug].astro +++ b/src/pages/blog/[...slug].astro @@ -2,6 +2,7 @@ import { type CollectionEntry, getCollection } from "astro:content"; import Comments from "../../components/Comments.astro"; import Layout from "../../layouts/BaseLayout.astro"; +import blogPostSchema from "../../utils/schemas/blogPostSchema"; import dayjs from "dayjs"; type Props = CollectionEntry<"blog">; @@ -21,10 +22,21 @@ const post = Astro.props; const { Content, remarkPluginFrontmatter } = await post.render(); -const date = dayjs(post.data.pubDate.toString()).format("MMMM DD, YYYY"); -const title = `${post.data.title} | Valentin Popov`; +const title = post.data.title; const description = post.data.description; +const author = post.data.author; const lang = post.data.lang; + +const formattedData = dayjs(post.data.pubDate.toString()).format("MMMM DD, YYYY"); +const data = post.data.pubDate.toISOString(); + +const schema = blogPostSchema({ + siteUrl: new URL("/", Astro.site).toString(), + title, + slug: post.slug, + datePublished: data, + author, +}); --- - +

-

{post.data.title}

+

{title}

Posted - - by {post.data.author} + + by {author}  •  {remarkPluginFrontmatter.minutesRead} diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro index f800268..611d0fc 100644 --- a/src/pages/blog/index.astro +++ b/src/pages/blog/index.astro @@ -3,10 +3,8 @@ import type { CollectionEntry } from "astro:content"; import { getCollection } from "astro:content"; import Layout from "../../layouts/BaseLayout.astro"; import PostElement from "../../components/PostElement.astro"; - -const title = "Valentin Popov's Blog | Software Development, Leadership & Open-Source"; -const description = "Explore Valentin Popov's blog on software development, tech leadership, and open-source experiments. Stay updated with in-depth tutorials and expert insights."; -const lang = "en"; +import blogSchema from "../../utils/schemas/blogSchema"; +import RSSIcon from "../../components/Icons/RSS.astro"; const posts = await getCollection("blog", ({ data }) => { return data.draft !== true; @@ -24,14 +22,26 @@ const postsByYear = posts.reduce[]>>((acc }, {}); const years = Object.keys(postsByYear).sort((a, b) => Number(b) - Number(a)); + +const title = "Valentin Popov's Blog | Software Development, Leadership & Open-Source"; +const description = "Explore Valentin Popov's blog on software development, tech leadership, and open-source experiments. Stay updated with in-depth tutorials and expert insights."; +const lang = "en"; + +const schema = blogSchema({ + siteUrl: new URL("/", Astro.site).toString(), + title, +}); --- - +

-

Blog posts

+

+ Blog posts + +

-
+
{ years.map((year) => (
diff --git a/src/pages/index.astro b/src/pages/index.astro index f595b94..fb52e79 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -3,13 +3,19 @@ import Layout from "../layouts/BaseLayout.astro"; import LatestPostsSection from "../components/Sections/LatestPosts.astro"; import SocialLinksSection from "../components/Sections/SocialLinks.astro"; import WelcomeSection from "../components/Sections/Welcome.astro"; +import websiteSchema from "../utils/schemas/websiteSchema"; const title = "Valentin Popov – Software Developer & Team Lead | Tech Insights"; -const description = "Valentin Popov is an experienced project manager and team lead sharing expert insights on software development, leadership, and digital innovation."; +const description = "Blog by Valentin Popov — software developer and team lead writing about code, side projects, digital tools, and fun experiments."; const lang = "en"; + +const schema = websiteSchema({ + siteUrl: new URL("/", Astro.site).toString(), + title, +}); --- - + -- cgit v1.2.3