feat(site): /projects consolidation, homelab copy pass, theme fix #6
@@ -1,68 +1,24 @@
|
|||||||
import type { Metadata } from "next";
|
"use client";
|
||||||
import Widget from "@/components/Widget";
|
|
||||||
import { archiveProjects } from "@/data/projects";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
import { useEffect } from "react";
|
||||||
title: "Archive | Tyler Koenig",
|
|
||||||
description: "Earlier projects and experiments — browser extensions, canvas apps, and bootcamp work.",
|
export default function ArchiveRedirect() {
|
||||||
};
|
useEffect(() => {
|
||||||
|
window.location.replace("/projects/");
|
||||||
|
}, []);
|
||||||
|
|
||||||
export default function ArchivePage() {
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="mb-4lh">
|
<meta httpEquiv="refresh" content="0; url=/projects/" />
|
||||||
<p className="font-mono text-sm font-bold text-[var(--color-text)] mb-1lh">
|
<p className="font-mono text-sm text-[var(--color-text)]">
|
||||||
<span className="text-[var(--color-accent-green)] select-none mr-1ch" aria-hidden="true">❯</span>
|
This page moved.{" "}
|
||||||
tyler/projects/archive
|
|
||||||
</p>
|
|
||||||
<p className="font-mono text-sm text-[var(--color-text)] leading-relaxed max-w-xl opacity-80">
|
|
||||||
Experiments, browser extensions, and bootcamp projects. Kept here for context — not
|
|
||||||
representative of current work.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Widget title="tyler/projects/archive" badge={archiveProjects.length} as="section">
|
|
||||||
<div className="flex flex-col gap-px bg-[var(--color-border)]">
|
|
||||||
{archiveProjects.map((project) => (
|
|
||||||
<a
|
<a
|
||||||
key={project.slug}
|
href="/projects/"
|
||||||
href={project.githubUrl}
|
className="text-[var(--color-accent-green)] underline"
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
className="bg-[var(--color-surface)] hover:bg-[var(--color-surface-raised)] flex items-start justify-between gap-2ch px-2ch py-1lh group"
|
|
||||||
>
|
>
|
||||||
<div className="flex flex-col gap-1ch flex-1 min-w-0">
|
/projects/
|
||||||
<div className="flex items-center gap-1ch">
|
|
||||||
{project.year && (
|
|
||||||
<span className="font-mono text-sm text-[var(--color-text-dim)] shrink-0">
|
|
||||||
{project.year}
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
<span className="font-mono text-sm text-[var(--color-text)] group-hover:text-[var(--color-accent-green)] truncate">
|
|
||||||
{project.title}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<p className="font-mono text-sm text-[var(--color-text)] leading-relaxed opacity-75">
|
|
||||||
{project.description}
|
|
||||||
</p>
|
|
||||||
<div className="flex flex-wrap gap-x-1ch gap-y-0.5">
|
|
||||||
{project.tags.map((tag) => (
|
|
||||||
<span key={tag} className="font-mono text-sm text-[var(--color-text-dim)]">
|
|
||||||
{tag}
|
|
||||||
</span>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span
|
|
||||||
className="font-mono text-sm text-[var(--color-text-label)] group-hover:text-[var(--color-text)] shrink-0 mt-0.5"
|
|
||||||
aria-hidden="true"
|
|
||||||
>
|
|
||||||
↗
|
|
||||||
</span>
|
|
||||||
</a>
|
</a>
|
||||||
))}
|
</p>
|
||||||
</div>
|
|
||||||
</Widget>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import Hero from "@/components/Hero";
|
import Hero from "@/components/Hero";
|
||||||
import Skills from "@/components/Skills";
|
|
||||||
import Timeline from "@/components/Timeline";
|
import Timeline from "@/components/Timeline";
|
||||||
import ProjectCard from "@/components/ProjectCard";
|
|
||||||
import Widget from "@/components/Widget";
|
|
||||||
import { featuredProjects } from "@/data/projects";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Tyler Koenig",
|
title: "Tyler Koenig",
|
||||||
@@ -17,14 +13,6 @@ export default function Home() {
|
|||||||
<>
|
<>
|
||||||
<Hero />
|
<Hero />
|
||||||
<Timeline />
|
<Timeline />
|
||||||
<Widget title="tyler/projects" badge={featuredProjects.length}>
|
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-1ch">
|
|
||||||
{featuredProjects.map((project) => (
|
|
||||||
<ProjectCard key={project.slug} project={project} />
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</Widget>
|
|
||||||
<Skills />
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
77
src/app/projects/page.tsx
Normal file
77
src/app/projects/page.tsx
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import Widget from "@/components/Widget";
|
||||||
|
import ProjectCard from "@/components/ProjectCard";
|
||||||
|
import { featuredProjects, archiveProjects } from "@/data/projects";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Projects | Tyler Koenig",
|
||||||
|
description:
|
||||||
|
"Featured projects and earlier work — homelab, open-pact, helm, and bootcamp/experiment archive.",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function ProjectsPage() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mb-4lh">
|
||||||
|
<p className="font-mono text-sm font-bold text-[var(--color-text)] mb-1lh">
|
||||||
|
<span className="text-[var(--color-accent-green)] select-none mr-1ch" aria-hidden="true">❯</span>
|
||||||
|
projects
|
||||||
|
</p>
|
||||||
|
<p className="font-mono text-sm text-[var(--color-text)] leading-relaxed max-w-xl opacity-80">
|
||||||
|
Featured work first. Earlier experiments, browser extensions, and bootcamp projects below — kept for context.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Widget title="projects/featured" badge={featuredProjects.length} as="section">
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-1ch">
|
||||||
|
{featuredProjects.map((project) => (
|
||||||
|
<ProjectCard key={project.slug} project={project} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Widget>
|
||||||
|
|
||||||
|
<Widget title="projects/archive" badge={archiveProjects.length} as="section">
|
||||||
|
<div className="flex flex-col gap-px bg-[var(--color-border)]">
|
||||||
|
{archiveProjects.map((project) => (
|
||||||
|
<a
|
||||||
|
key={project.slug}
|
||||||
|
href={project.githubUrl}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="bg-[var(--color-surface)] hover:bg-[var(--color-surface-raised)] flex items-start justify-between gap-2ch px-2ch py-1lh group"
|
||||||
|
>
|
||||||
|
<div className="flex flex-col gap-1ch flex-1 min-w-0">
|
||||||
|
<div className="flex items-center gap-1ch">
|
||||||
|
{project.year && (
|
||||||
|
<span className="font-mono text-sm text-[var(--color-text-dim)] shrink-0">
|
||||||
|
{project.year}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
<span className="font-mono text-sm text-[var(--color-text)] group-hover:text-[var(--color-accent-green)] truncate">
|
||||||
|
{project.title}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="font-mono text-sm text-[var(--color-text)] leading-relaxed opacity-75">
|
||||||
|
{project.description}
|
||||||
|
</p>
|
||||||
|
<div className="flex flex-wrap gap-x-1ch gap-y-0.5">
|
||||||
|
{project.tags.map((tag) => (
|
||||||
|
<span key={tag} className="font-mono text-sm text-[var(--color-text-dim)]">
|
||||||
|
{tag}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
className="font-mono text-sm text-[var(--color-text-label)] group-hover:text-[var(--color-text)] shrink-0 mt-0.5"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
↗
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Widget>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ import { useTheme } from "@/context/ThemeContext";
|
|||||||
const links = [
|
const links = [
|
||||||
{ href: "/", label: "tyler" },
|
{ href: "/", label: "tyler" },
|
||||||
{ href: "/homelab/", label: "homelab" },
|
{ href: "/homelab/", label: "homelab" },
|
||||||
{ href: "/archive/", label: "archive" },
|
{ href: "/projects/", label: "projects" },
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function Nav() {
|
export default function Nav() {
|
||||||
|
|||||||
Reference in New Issue
Block a user