mirror of
https://github.com/prdlk/website.git
synced 2026-08-02 17:31:41 +00:00
feat(about): add personal bio and details to about page
This commit is contained in:
+16
-27
@@ -5,8 +5,10 @@ import Project from "@/components/project/Project.astro";
|
||||
import { getAllPosts } from "@/data/post";
|
||||
import { getAllSpeaking } from "@/data/speaking";
|
||||
import PageLayout from "@/layouts/Base.astro";
|
||||
import { siteConfig, socialLinks } from "@/site.config";
|
||||
import { socialLinks } from "@/site.config";
|
||||
import { getTagIndex, getTaggedCollections } from "@/data/tags";
|
||||
import { collectionDateSort, projectDateSort } from "@/utils/date";
|
||||
import { personSchema, websiteSchema } from "@/utils/seo";
|
||||
|
||||
const MAX_POSTS = 4;
|
||||
const allPosts = await getAllPosts();
|
||||
@@ -15,36 +17,26 @@ const latestPosts = (allPosts.sort(collectionDateSort) as CollectionEntry<"writi
|
||||
MAX_POSTS,
|
||||
);
|
||||
|
||||
const MAX_PROJECTS = 2;
|
||||
const MAX_PROJECTS = 3;
|
||||
const allProjects = await getCollection("projects");
|
||||
const latestProjects = allProjects.sort(projectDateSort).slice(0, MAX_PROJECTS);
|
||||
|
||||
const MAX_TALKS = 3;
|
||||
const latestTalks = (await getAllSpeaking()).sort(collectionDateSort).slice(0, MAX_TALKS);
|
||||
const talks = (await getAllSpeaking()).sort(collectionDateSort);
|
||||
|
||||
const social = Object.fromEntries(socialLinks.map((s) => [s.friendlyName, s.link]));
|
||||
|
||||
// Skills (from all tagged content) feed the Person `knowsAbout` signal.
|
||||
const skills = [...getTagIndex(await getTaggedCollections()).values()].map((t) => t.label);
|
||||
|
||||
const meta = {
|
||||
title: "Engineer & Founder",
|
||||
description:
|
||||
"Prad Nukala — engineer and founder building decentralized identity infrastructure. Explore my projects, experience, writing, and talks.",
|
||||
};
|
||||
|
||||
const social = Object.fromEntries(socialLinks.map((s) => [s.friendlyName, s.link]));
|
||||
|
||||
// Person structured data for richer search results.
|
||||
const personSchema = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Person",
|
||||
name: siteConfig.author,
|
||||
url: siteConfig.url,
|
||||
jobTitle: "Engineer & Founder",
|
||||
description: meta.description,
|
||||
image: new URL("/avatar.png", siteConfig.url).href,
|
||||
sameAs: socialLinks.filter((s) => !s.link.startsWith("mailto:")).map((s) => s.link),
|
||||
schema: [websiteSchema(), personSchema(skills)],
|
||||
};
|
||||
---
|
||||
|
||||
<PageLayout meta={meta}>
|
||||
<script type="application/ld+json" set:html={JSON.stringify(personSchema)} is:inline />
|
||||
<section>
|
||||
<h1 class="title mb-6">Prad Nukala</h1>
|
||||
<p class="mb-4">
|
||||
@@ -52,9 +44,9 @@ const personSchema = {
|
||||
Here you'll find what I've built, where I've worked, what I write, and the talks I've given.
|
||||
</p>
|
||||
<p>
|
||||
Find me on <a class="cactus-link" href={social.GitHub} rel="noreferrer" target="_blank">Github</a>,
|
||||
<a class="cactus-link" href={social.X} rel="noreferrer" target="_blank">X</a>,
|
||||
<a class="cactus-link" href={social.LinkedIn} rel="noreferrer" target="_blank">LinkedIn</a>, or
|
||||
Find me on <a class="cactus-link" href={social.GitHub} rel="me noreferrer" target="_blank">Github</a>,
|
||||
<a class="cactus-link" href={social.X} rel="me noreferrer" target="_blank">X</a>,
|
||||
<a class="cactus-link" href={social.LinkedIn} rel="me noreferrer" target="_blank">LinkedIn</a>, or
|
||||
<a class="cactus-link" href={social.Email}>contact me directly</a>.
|
||||
</p>
|
||||
</section>
|
||||
@@ -93,13 +85,13 @@ const personSchema = {
|
||||
</a>
|
||||
</section>
|
||||
{
|
||||
latestTalks.length > 0 && (
|
||||
talks.length > 0 && (
|
||||
<section class="mt-16">
|
||||
<h2 class="title text-accent mb-6 text-xl">
|
||||
<a href="/speaking/">Speaking</a>
|
||||
</h2>
|
||||
<ul class="space-y-4" role="list">
|
||||
{latestTalks.map((talk) => (
|
||||
{talks.map((talk) => (
|
||||
<li>
|
||||
<a class="cactus-link" href={`/speaking/${talk.id}/`}>
|
||||
{talk.data.title}
|
||||
@@ -108,9 +100,6 @@ const personSchema = {
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
<a class="hover:text-link mt-6 inline-block" href="/speaking/">
|
||||
See all talks <span aria-hidden="true">→</span>
|
||||
</a>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user