···11+---
22+import BaseLayout from "../layouts/BaseLayout.astro";
33+import Paragraphs from "../components/Paragraphs.astro";
44+const title = "Projects";
55+66+type Relation = "owner" | "maintainer";
77+const relationTitle: Record<Relation, string> = {
88+ owner: "I am an administrator of this project",
99+ maintainer: "I am a collaborator that helps maintain this project",
1010+};
1111+type Project = {
1212+ relation: Relation;
1313+ link: string;
1414+ description: string[];
1515+};
1616+const projects: Record<string, Project> = {
1717+ gengo: {
1818+ relation: "owner",
1919+ link: "https://github.com/spenserblack/gengo",
2020+ description: [
2121+ "A multi-purpose tool to help identify the code languages within a project.",
2222+ "Works on both work trees and bare repositories."
2323+ ],
2424+ },
2525+ onefetch: {
2626+ relation: "maintainer",
2727+ link: "https://github.com/o2sh/onefetch",
2828+ description: [
2929+ "A CLI tool that analyzes your repository and prints an ASCII logo for its primary language and various repository statistics.",
3030+ ],
3131+ },
3232+ steamdown: {
3333+ relation: "owner",
3434+ link: "https://github.com/spenserblack/steamdown",
3535+ description: [
3636+ "A parser and renderer for a markdown-like syntax. Content can be rendered as Steam's formatting language, or as HTML for a preview.",
3737+ ],
3838+ },
3939+};
4040+---
4141+<BaseLayout title={title}>
4242+ <p>
4343+ Here are some of the open-source projects that I work on.
4444+ </p>
4545+ {
4646+ Object.entries(projects).map(([project, { relation, link, description }]) => (
4747+ <h2><a href={link}>{project}</a></h2>
4848+ <p><em class="badge" title={relationTitle[relation]}>{relation}</em></p>
4949+ <Paragraphs paragraphs={description} />
5050+ ))
5151+ }
5252+</BaseLayout>