From c1a5d2ea0d08a79e127ec5ddca0db8cb8e7a41e8 Mon Sep 17 00:00:00 2001 From: kbot Date: Mon, 6 Jul 2026 20:32:35 -0500 Subject: [PATCH] feat(portfolio): add featured project dossier card --- components/portfolio/CapabilityRows.tsx | 54 ++++++++++++++++++++++++ components/portfolio/FeaturedDossier.tsx | 4 +- components/portfolio/Manifesto.tsx | 34 +++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 components/portfolio/CapabilityRows.tsx create mode 100644 components/portfolio/Manifesto.tsx diff --git a/components/portfolio/CapabilityRows.tsx b/components/portfolio/CapabilityRows.tsx new file mode 100644 index 0000000..69b36f7 --- /dev/null +++ b/components/portfolio/CapabilityRows.tsx @@ -0,0 +1,54 @@ +"use client"; + +import { m, useReducedMotion } from "motion/react"; + +import { capabilities } from "@/lib/portfolio"; + +export function CapabilityRows() { + const shouldReduceMotion = useReducedMotion(); + + return ( +
+
+
+

CAPABILITIES

+

+ Built for hostile constraints. +

+
+

/.01—/.05

+
+ +
+ {capabilities.map((capability, index) => ( + +

+ {capability.text} +

+

+ /.{capability.index} +

+
+ ))} +
+
+ ); +} diff --git a/components/portfolio/FeaturedDossier.tsx b/components/portfolio/FeaturedDossier.tsx index c242f11..c6afd56 100644 --- a/components/portfolio/FeaturedDossier.tsx +++ b/components/portfolio/FeaturedDossier.tsx @@ -34,7 +34,7 @@ export function FeaturedDossier() { id="featured-dossier-title" className="font-display translate-y-4 text-[clamp(4.5rem,18vw,15rem)] font-semibold uppercase leading-[0.72] tracking-[-0.08em] text-blacksite-text" > - {featuredDossier.title} + {featuredDossier.title.toUpperCase()} @@ -74,7 +74,7 @@ export function FeaturedDossier() { key={link.href} href={link.href} target="_blank" - rel="noreferrer" + rel="noopener noreferrer" className="group flex items-center justify-between gap-4 border border-blacksite-line px-4 py-3 font-mono text-xs uppercase tracking-[0.14em] text-blacksite-text transition-colors hover:border-signal-cyan/70 hover:text-signal-cyan focus-visible:outline-signal-cyan" > {link.label} diff --git a/components/portfolio/Manifesto.tsx b/components/portfolio/Manifesto.tsx new file mode 100644 index 0000000..82256b2 --- /dev/null +++ b/components/portfolio/Manifesto.tsx @@ -0,0 +1,34 @@ +"use client"; + +import { m, useReducedMotion } from "motion/react"; + +import { manifesto } from "@/lib/portfolio"; + +export function Manifesto() { + const shouldReduceMotion = useReducedMotion(); + const [beforeSurvive, afterSurvive = ""] = manifesto.split("survive contact"); + const [betweenAccents, afterProof = ""] = afterSurvive.split("proof"); + + return ( + +

OPERATING PRINCIPLE

+

+ {beforeSurvive} + survive contact + {betweenAccents} + proof + {afterProof} +

+
+ ); +}