From b35605f411cdf10b62f516e4193428602b97467e Mon Sep 17 00:00:00 2001 From: nmemmert Date: Wed, 16 Sep 2026 07:32:18 -0400 Subject: [PATCH] Add clickable host bios linking to host detail pages on Nuggets; v2.0.21 Each host card on /nuggets now links to /nuggets/hosts/:hostId showing the host's full photo, bio, and listen links. Archived hosts return a graceful "not found" page with a back link. Co-Authored-By: Claude Sonnet 4.6 --- package-lock.json | 4 +-- package.json | 2 +- src/App.css | 18 +++++++++++++ src/App.tsx | 67 +++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 86 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f87ed0..4604c7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "siteforge", - "version": "2.0.3", + "version": "2.0.20", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "siteforge", - "version": "2.0.3", + "version": "2.0.20", "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", diff --git a/package.json b/package.json index 3299e85..354e898 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "siteforge", "private": true, - "version": "2.0.20", + "version": "2.0.21", "type": "module", "scripts": { "dev": "vite", diff --git a/src/App.css b/src/App.css index 5d366f0..1464201 100644 --- a/src/App.css +++ b/src/App.css @@ -9890,6 +9890,24 @@ .nuggets-host-card-name { font-family: var(--brand-font-heading); font-size: 1.05rem; color: #e8d9b5; margin: 0; } .nuggets-host-card-role { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--brand-gold); opacity: 0.85; margin: 0.2rem 0 0; } .nuggets-host-card-bio { font-size: 0.875rem; color: var(--brand-muted); line-height: 1.6; margin: 0.875rem 0 0; } +.nuggets-host-card--link { text-decoration: none; cursor: pointer; transition: border-color 0.18s, box-shadow 0.18s, transform 0.18s; } +.nuggets-host-card--link:hover { border-color: rgba(201, 168, 76, 0.45); box-shadow: 0 4px 18px rgba(0,0,0,0.28); transform: translateY(-2px); } +.nuggets-host-card--link .nuggets-host-card-name { color: #e8d9b5; } +.nuggets-host-card-cta { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--brand-gold); margin: 0.9rem 0 0; opacity: 0.75; transition: opacity 0.15s; } +.nuggets-host-card--link:hover .nuggets-host-card-cta { opacity: 1; } + +.nuggets-host-detail-layout { display: grid; grid-template-columns: 240px 1fr; gap: 3.5rem; align-items: start; padding-top: 0.5rem; } +.nuggets-host-detail-photo-col { display: flex; justify-content: center; } +.nuggets-host-detail-photo { width: 200px; height: 200px; object-fit: cover; border-radius: 50%; border: 3px solid rgba(201, 168, 76, 0.35); box-shadow: 0 6px 24px rgba(0,0,0,0.35); } +.nuggets-host-detail-bio { font-size: 1.05rem; color: var(--brand-muted); line-height: 1.7; margin: 0 0 1.5rem; } +.nuggets-host-detail-listen { margin-top: 1.5rem; } +.nuggets-host-detail-back { font-size: 0.875rem; color: var(--brand-gold); text-decoration: none; opacity: 0.8; transition: opacity 0.15s; } +.nuggets-host-detail-back:hover { opacity: 1; } + +@media (max-width: 640px) { + .nuggets-host-detail-layout { grid-template-columns: 1fr; gap: 2rem; } + .nuggets-host-detail-photo { width: 140px; height: 140px; } +} .nuggets-episodes-note { color: var(--brand-muted); margin-top: 1.5rem; } .nuggets-latest-episode { background: rgba(26, 26, 21, 0.9); border: 1px solid rgba(201, 168, 76, 0.25); border-radius: 12px; padding: 1.5rem 1.75rem; margin-top: 1.5rem; } diff --git a/src/App.tsx b/src/App.tsx index dc4a424..20ae1f6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1933,7 +1933,7 @@ function NuggetsPage({ content }: { content: SiteContent }) {

Meet the Hosts

{activeHosts.map(host => ( -
+
{host.imageUrl && {host.name}}
@@ -1942,7 +1942,8 @@ function NuggetsPage({ content }: { content: SiteContent }) {
{host.bio &&

{host.bio}

} -
+

View Profile →

+ ))}
@@ -1992,6 +1993,67 @@ function NuggetsPage({ content }: { content: SiteContent }) { ) } +function NuggetsHostDetailPage({ content }: { content: SiteContent }) { + const { hostId } = useParams<{ hostId: string }>() + const nuggets = content.nuggets ?? DEFAULTS.nuggets + const siteTitle = content.seo?.title || DEFAULTS.seo.title + const host = (nuggets.hosts ?? []).find(h => h.id === hostId && !h.archived) + + usePageMeta( + host ? `${host.name} | ${nuggets.title} | ${siteTitle}` : `Host | ${nuggets.title} | ${siteTitle}`, + host?.bio || `Meet ${host?.name}, a host on ${nuggets.title}.`, + ) + + if (!host) { + return ( +
+ + + +
+ ← Back to Nuggets +
+ + +
+ ) + } + + return ( +
+ + + +
+
+
+ {host.imageUrl && ( + {host.name} + )} +
+
+ {host.bio &&

{host.bio}

} + {(nuggets.spotifyUrl || nuggets.appleUrl) && ( +
+

Listen to {nuggets.title}

+
+ {nuggets.spotifyUrl && Listen on Spotify} + {nuggets.appleUrl && Listen on Apple Podcasts} +
+
+ )} +
+ ← Back to {nuggets.title} +
+
+
+
+ + +
+ ) +} + function BooksAndResourcesSection({ content }: { content: SiteContent }) { const books = (content.customLinks ?? []).filter(link => link.placement === 'books') const recommended = (content.customLinks ?? []).filter(link => link.placement === 'recommended') @@ -3131,6 +3193,7 @@ export default function App() { } /> } /> } /> + } /> } /> } /> } />