Files
website/src/pages/index.astro
T

107 lines
3.5 KiB
Plaintext

---
import { type CollectionEntry, getCollection } from "astro:content";
import PostPreview from "@/components/blog/PostPreview.astro";
import Project from "@/components/project/Project.astro";
import { getAllPosts } from "@/data/post";
import { getAllSpeaking } from "@/data/speaking";
import PageLayout from "@/layouts/Base.astro";
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();
const latestPosts = (allPosts.sort(collectionDateSort) as CollectionEntry<"writing">[]).slice(
0,
MAX_POSTS,
);
const MAX_PROJECTS = 3;
const allProjects = await getCollection("projects");
const latestProjects = allProjects.sort(projectDateSort).slice(0, MAX_PROJECTS);
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.",
schema: [websiteSchema(), personSchema(skills)],
};
---
<PageLayout meta={meta}>
<section>
<h1 class="title mb-6">Hello World</h1>
<p class="mb-4">
Engineer and founder. I build decentralized identity infrastructure and tools for developers.
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="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>
{
latestProjects.length > 0 && (
<section class="mt-16">
<h2 class="title text-accent mb-6 text-xl">
<a href="/projects/">Projects</a>
</h2>
<ul class="space-y-6" role="list">
{latestProjects.map((project) => (
<li>
<Project project={project} as="h3" isPreview />
</li>
))}
</ul>
<a class="hover:text-link mt-6 inline-block" href="/projects/">
See all projects <span aria-hidden="true">→</span>
</a>
</section>
)
}
<section class="mt-16">
<h2 class="title text-accent mb-6 text-xl"><a href="/writing/">Writing</a></h2>
<ul class="space-y-4" role="list">
{
latestPosts.map((p) => (
<li class="grid gap-1 sm:grid-cols-[auto_1fr]">
<PostPreview post={p} />
</li>
))
}
</ul>
<a class="hover:text-link mt-6 inline-block" href="/writing/">
See all writing <span aria-hidden="true">→</span>
</a>
</section>
{
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">
{talks.map((talk) => (
<li>
<a class="cactus-link" href={`/speaking/${talk.id}/`}>
{talk.data.title}
</a>
{talk.data.event && <span class="text-muted text-sm"> · {talk.data.event}</span>}
</li>
))}
</ul>
</section>
)
}
</PageLayout>