Board game updated pass 1

This commit is contained in:
Greg Kilmer
2026-07-06 21:50:41 -04:00
parent 7808c2ead8
commit bb4924a988
10 changed files with 997 additions and 85 deletions
+1 -2
View File
@@ -49,8 +49,7 @@ const interests = [
href: "/interests/making",
icon: "palette",
title: "Making & Creating",
tagline:
"If it involves really nice cardboard or mastering a new craft, I am in.",
tagline: "A magnet for super glue and nice cardboard.",
blurb:
"Resin dice in a pressure pot, fun and functional prints on the P1s, custom TCG proxies and decks. Passion and utility.",
image: "/images/making-resin.jpg",
+149 -35
View File
@@ -5,31 +5,95 @@
* Per-interest template with the spec's reading highlights table (status pills
* mapped from spec emoji statuses), anime favorites, and movies/TV note.
*/
import BaseLayout from '@layouts/BaseLayout.astro';
import Reveal from '@components/motion/Reveal.astro';
import InterestHero from '@components/layout/InterestHero.astro';
import InterestCard from '@components/cards/InterestCard.astro';
import SectionHeader from '@components/layout/SectionHeader.astro';
import RelatedInterests from '@components/layout/RelatedInterests.astro';
import Icon from '@components/Icon.astro';
import BaseLayout from "@layouts/BaseLayout.astro";
import Reveal from "@components/motion/Reveal.astro";
import InterestHero from "@components/layout/InterestHero.astro";
import InterestCard from "@components/cards/InterestCard.astro";
import SectionHeader from "@components/layout/SectionHeader.astro";
import RelatedInterests from "@components/layout/RelatedInterests.astro";
import Icon from "@components/Icon.astro";
// Spec reading highlights, with status mapped from the spec's emoji statuses.
const reading = [
{ icon: 'check-decagram', title: 'Brandon Sanderson — Cosmere', status: 'Complete', body: 'Complete. Every novel, every era. The gold standard for me.' },
{ icon: 'check-decagram', title: 'Frank Herbert — Dune', status: 'Complete', body: 'Books 1-3 complete.' },
{ icon: 'autorenew', title: 'Douglas Preston & Lincoln Child — Pendergast', status: 'Rereading', body: 'Currently rereading. Up to Reliquary.' },
{ icon: 'autorenew', title: 'Sarah J. Maas — Throne of Glass', status: 'Reading', body: 'Currently on Heir of Fire (Book 3).' },
{ icon: 'new-box', title: 'Wistoria: Wand and Sword', status: 'New', body: 'Recently added to the reading list.' },
{
icon: "check-decagram",
title: "Brandon Sanderson — Cosmere",
status: "Complete",
body: "Complete. Every novel, every era. The gold standard for me.",
},
{
icon: "check-decagram",
title: "Frank Herbert — Dune",
status: "Complete",
body: "Books 1-3 complete.",
},
{
icon: "bookmark",
title: "Emily Rodda — Deltora Quest",
status: "Reread-pending",
body: "Planning to listen to audiobooks to reread.",
},
{
icon: "volume-high",
title: "J.R.R. Tolkein — The Lord of the Rings",
status: "Listening",
body: "Rereading by listening to the Andy Serkis audiobooks.",
},
{
icon: "autorenew",
title: "Douglas Preston & Lincoln Child — Pendergast",
status: "Rereading",
body: "Currently rereading. Up to Cabinet of Curiosities.",
},
{
icon: "autorenew",
title: "Sarah J. Maas — Throne of Glass",
status: "Reading",
body: "Currently Tandem reading Heir of Fire (Book 3) and Tower of Dawn (Book 4).",
},
{
icon: "bookmark",
title: "Fonda Lee — Green Bone Saga",
status: "Next",
body: "Next Series to Read.",
},
{
icon: "bookmark",
title: "That Time I Got Reincarnated as a Slime",
status: "New",
body: "Read up to Volume 13 before, planning to finish now that it is complete.",
},
{
icon: "new-box",
title: "Wistoria: Wand and Sword",
status: "New",
body: "Recently added to the reading list. After finishing season 2",
},
];
const anime = [
'One Piece', 'Bleach', 'Gundam (all series)', 'Code Geass',
'Magi', 'That Time I Got Reincarnated as a Slime', 'Overlord',
"One Piece",
"Bleach",
"Gundam (all series)",
"Code Geass",
"Magi",
"That Time I Got Reincarnated as a Slime",
"Overlord",
];
const related = [
{ href: '/interests/ttrpgs', title: 'TTRPGs & Tabletop', icon: 'dice-multiple', blurb: 'Worldbuilding inspiration flows both ways.' },
{ href: '/interests/making', title: 'Making & Creating', icon: 'palette', blurb: 'Props and displays for the stories I love.' },
{
href: "/interests/ttrpgs",
title: "TTRPGs & Tabletop",
icon: "dice-multiple",
blurb: "Worldbuilding inspiration flows both ways.",
},
{
href: "/interests/making",
title: "Making & Creating",
icon: "palette",
blurb: "Props and displays for the stories I love.",
},
];
---
@@ -48,54 +112,104 @@ const related = [
<div class="container-prose flex flex-col gap-20 py-12 sm:py-16">
{/* Overview */}
<section class="flex flex-col gap-5 text-lg leading-relaxed" style="color: var(--color-text-muted);">
<Reveal><p>I read like it's a competitive sport. Fantasy is my native language, Brandon Sanderson's Cosmere is fully consumed and eagerly awaiting the next era. Frank Herbert's Dune trilogy shaped how I think about worldbuilding. Douglas Preston & Lincoln Child's Pendergast saga is my comfort reread. And I'm currently working through Sarah J. Maas's Throne of Glass series.</p></Reveal>
<Reveal delay={80}><p>Beyond novels, I read light novels, comic books, manhwa, and manga. I watch anime and film extensively. If a story exists in any format, I'm probably consuming it.</p></Reveal>
<section
class="flex flex-col gap-5 text-lg leading-relaxed"
style="color: var(--color-text-muted);"
>
<Reveal
><p>
I read like it's a competitive sport. Fantasy is my native language,
Brandon Sanderson's Cosmere is fully consumed and I am eagerly
awaiting the next era. Frank Herbert's Dune trilogy shaped how I think
about worldbuilding. Douglas Preston & Lincoln Child's Pendergast saga
showed me that a well-crafted narrative can keep me engaged outside of
a Tolkein-esque fantasy world. And I'm currently working through Sarah
J. Maas's Throne of Glass series.
</p></Reveal
>
<Reveal delay={80}
><p>
Beyond novels, I read light novels, comic books, manhwa, and manga. I
watch anime and film extensively. If a story exists in any format, I'm
probably consuming it in some capacity.
</p></Reveal
>
</section>
{/* Reading highlights */}
<section class="flex flex-col gap-6">
<Reveal><SectionHeader kicker="On the shelf" icon="bookshelf" title="Reading highlights" /></Reveal>
<Reveal
><SectionHeader
kicker="On the shelf"
icon="bookshelf"
title="Reading highlights"
/></Reveal
>
<div class="grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
{reading.map((r, i) => (
<Reveal delay={i * 70}>
<InterestCard icon={r.icon} title={r.title} status={r.status}>{r.body}</InterestCard>
</Reveal>
))}
{
reading.map((r, i) => (
<Reveal delay={i * 70}>
<InterestCard icon={r.icon} title={r.title} status={r.status}>
{r.body}
</InterestCard>
</Reveal>
))
}
</div>
</section>
{/* Anime */}
<section class="flex flex-col gap-5">
<Reveal><SectionHeader kicker="Animated" icon="television-classic" title="Anime favorites" /></Reveal>
<Reveal
><SectionHeader
kicker="Animated"
icon="television-classic"
title="Anime favorites"
/></Reveal
>
<Reveal delay={80}>
<ul class="flex flex-wrap gap-3">
{anime.map((a) => (
<li class="pill text-sm">
<Icon name="play-circle" class="h-3.5 w-3.5" />
{a}
</li>
))}
{
anime.map((a) => (
<li class="pill text-sm">
<Icon name="play-circle" class="h-3.5 w-3.5" />
{a}
</li>
))
}
</ul>
</Reveal>
</section>
{/* Movies & TV */}
<section class="flex flex-col gap-5">
<Reveal><SectionHeader kicker="Beyond the page" icon="movie-open" title="Movies & TV" /></Reveal>
<Reveal
><SectionHeader
kicker="Beyond the page"
icon="movie-open"
title="Movies & TV"
/></Reveal
>
<Reveal delay={80}>
<div class="grid gap-5 sm:grid-cols-[1fr_18rem]">
<blockquote
class="border-l-2 pl-5 text-lg leading-relaxed"
style="border-color: var(--color-secondary); color: var(--color-text-muted);"
>
Watches extensively across genres. Particularly drawn to sci-fi, fantasy, and animated film.
Watches extensively across genres. Particularly drawn to sci-fi,
fantasy, and animated film.
</blockquote>
<figure
class="relative overflow-hidden rounded-xl border"
style="border-color: color-mix(in srgb, var(--color-accent) 35%, transparent);"
>
<img src="/images/fantasy-books.jpg" alt="Fantasy and media collection" loading="lazy" decoding="async" class="aspect-[4/3] w-full object-cover" />
<img
src="/images/fantasy-books.jpg"
alt="Fantasy and media collection"
loading="lazy"
decoding="async"
class="aspect-[4/3] w-full object-cover"
/>
</figure>
</div>
</Reveal>
+132 -48
View File
@@ -6,25 +6,67 @@
* (narrative, verbatim), Highlights (card grid, spec emojis -> mdi), Currently,
* then the Board Games sub-section, then RelatedInterests cross-links.
*/
import BaseLayout from '@layouts/BaseLayout.astro';
import Reveal from '@components/motion/Reveal.astro';
import InterestHero from '@components/layout/InterestHero.astro';
import InterestCard from '@components/cards/InterestCard.astro';
import SectionHeader from '@components/layout/SectionHeader.astro';
import RelatedInterests from '@components/layout/RelatedInterests.astro';
import Placeholder from '@components/layout/Placeholder.astro';
import BaseLayout from "@layouts/BaseLayout.astro";
import Reveal from "@components/motion/Reveal.astro";
import InterestHero from "@components/layout/InterestHero.astro";
import InterestCard from "@components/cards/InterestCard.astro";
import SectionHeader from "@components/layout/SectionHeader.astro";
import RelatedInterests from "@components/layout/RelatedInterests.astro";
import Placeholder from "@components/layout/Placeholder.astro";
import BoardGameShelf from "@components/ttrpgs/BoardGameShelf.tsx";
import boardgames from "@/data/boardgames.json";
const highlights = [
{ icon: 'castle', title: 'Dungeons & Dragons', body: 'Long-running campaign on Foundry VTT. Focus on rich worldbuilding, meaningful NPC relationships, and player-driven narrative.' },
{ icon: 'sword-cross', title: 'Daggerheart', body: "Darrington Press's dice-building RPG. Currently running a campaign and exploring how its mechanics create different story rhythms than D&D." },
{ icon: 'bird', title: 'Crows (Playtest)', body: "MCDM's tactical RPG in active playtest. Hex-based travel, revised travel roles, Miasma mechanics. Contributing playtest feedback." },
{ icon: 'monitor', title: 'Foundry VTT', body: 'Self-hosted on the home server (Cosmos Lenovo Tiny). Building custom modules, maps, and automation for campaigns.' },
{ icon: 'target', title: 'Draw Steel', body: "MCDM's upcoming tactical combat game. Interested in running it when it releases." },
{
icon: "castle",
title: "Dungeons & Dragons",
body: "Lately 5th Edition. Long-running campaigns on and off Foundry VTT. Focus on rich worldbuilding, meaningful NPC relationships, and player-driven narrative.",
},
{
icon: "sword-cross",
title: "Daggerheart",
body: "Darrington Press's dice-building RPG. Currently running a campaign and exploring how its mechanics create different story rhythms than D&D.",
},
{
icon: "target",
title: "Draw Steel",
body: "MCDM's fantasy tactical cinematic combat game. Interested in running it when I get a chance.",
},
{
icon: "shield-moon-outline",
title: "Cypher System",
body: "Monte Cook's narrative-focused system. Played a few one-shots and short form campaigns.",
},
{
icon: "knife-military",
title: "Blades in the Dark",
body: "A gritty, cinematic system for heists and criminal enterprises. Interested in playing short campaigns in it one day.",
},
{
icon: "weather-windy",
title: "Avatar the Last Airbender RPG",
body: "A narrative-focused system set in the world of Avatar. Interested in exploring bending mechanics and character-driven stories.",
},
{
icon: "monitor",
title: "Foundry VTT",
body: "Self-hosted on the home server. Building custom modules, maps, and automation for campaigns.",
},
];
const related = [
{ href: '/interests/making', title: 'Making & Creating', icon: 'palette', blurb: 'Dice and terrain made for campaigns.' },
{ href: '/interests/gaming', title: 'Gaming', icon: 'gamepad-variant', blurb: 'Digital RPGs as another expression of the same impulse.' },
{
href: "/interests/making",
title: "Making & Creating",
icon: "palette",
blurb: "Dice and terrain made for campaigns.",
},
{
href: "/interests/gaming",
title: "Gaming",
icon: "gamepad-variant",
blurb: "Digital RPGs as another expression of the same impulse.",
},
];
---
@@ -43,24 +85,72 @@ const related = [
<div class="container-prose flex flex-col gap-20 py-12 sm:py-16">
{/* Overview */}
<section class="flex flex-col gap-5 text-lg leading-relaxed" style="color: var(--color-text-muted);">
<Reveal><p>Tabletop gaming isn't a hobby for me, it's a practice. I run Dungeons & Dragons and Daggerheart campaigns that span years of real-time play, maintaining worlds, NPCs, and narrative threads that my players remember years later. I host everything on Foundry VTT, which lets me build the kind of dynamic, visually rich experiences that keep players invested session after session.</p></Reveal>
<Reveal delay={80}><p>Right now, I'm also playtesting MCDM's <em>Crows</em>, Matt Colville's forthcoming RPG built around hex-crawling, faction play, and hard travel rules. The playtest has already influenced how I think about overland encounters in my own campaigns.</p></Reveal>
<section
class="flex flex-col gap-5 text-lg leading-relaxed"
style="color: var(--color-text-muted);"
>
<Reveal
><p>
I love playing tabletop games from trading card games to role-playing
games. I run Dungeons & Dragons and Daggerheart campaigns that span
years of real-time play, maintaining worlds, NPCs, and narrative
threads that my players remember years later. I host everything on
Foundry VTT, which lets me build the kind of dynamic, visually rich
experiences that keep players invested session after session and lets
me flex my technical skills.
</p></Reveal
>
<Reveal delay={60}
><p>
I also love board games, from strategy to social deduction. My
collection is growing, and I enjoy hosting game nights with friends. I
have a particular fondness for games that challenge players to think
critically and creatively, and I appreciate the social aspect of
gaming as much as the gameplay itself. Although, I do love the ability
to play some of the engine building and deck-building games solo.
Spirit Island and Wyrmspan have been my favorites lately, and I am
always on the lookout for new games to add to my collection.
</p></Reveal
>
<Reveal delay={100}
><p>
I have played a few trading card games and collected many cards. I
have been a lifelong Pokémon and Magic: The Gathering fan, and I enjoy
the strategy and collection aspects of both games in different ways.
While I mostly enjoy looking at Pokemon cards, I spend most of my time
with Magic deck building and playing Elder Dragon Highlander (or
Commander). I recently picked up Riftbound and have had my eye on the
Gundam TCG game as well. The mechanical differences of these games are
fascinating, and I enjoy exploring the different strategies and
deck-building techniques that each game offers.
</p></Reveal
>
</section>
{/* Highlights */}
<section class="flex flex-col gap-6">
<Reveal><SectionHeader kicker="Highlights" icon="view-grid" title="Systems & tools" /></Reveal>
<Reveal
><SectionHeader
kicker="Highlights"
icon="view-grid"
title="Systems & tools"
/></Reveal
>
<div class="grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
{highlights.map((h, i) => (
<Reveal delay={i * 70}>
<InterestCard icon={h.icon} title={h.title}>{h.body}</InterestCard>
</Reveal>
))}
{
highlights.map((h, i) => (
<Reveal delay={i * 70}>
<InterestCard icon={h.icon} title={h.title}>
{h.body}
</InterestCard>
</Reveal>
))
}
</div>
</section>
{/* Currently */}
{
/* Currently
<section class="flex flex-col gap-6">
<Reveal><SectionHeader kicker="Currently" icon="calendar-clock" title="On the schedule" /></Reveal>
<div class="grid gap-4 sm:grid-cols-3">
@@ -69,42 +159,36 @@ const related = [
<Placeholder label="Crows playtest" hint="Ongoing sessions." />
</div>
</section>
*/
}
{/* Board games */}
<section class="flex flex-col gap-6">
<Reveal><SectionHeader kicker="Beyond RPGs" icon="cards-playing" title="Board games" /></Reveal>
<Reveal
><SectionHeader
kicker="Beyond RPGs"
icon="cards-playing"
title="Board games"
/></Reveal
>
<Reveal delay={80}>
<blockquote
class="border-l-2 pl-5 text-lg leading-relaxed"
style="border-color: var(--color-secondary); color: var(--color-text-muted);"
>
Beyond RPGs, I maintain a growing board and card game collection.
Favorites span strategy, deck-building, and social deduction. Game night
is a regular event, and yes, there's always room for one more.
Favorites span strategy, deck-building, and social deduction. Game
night is a regular event, and yes, there's always room for one more.
Hover a title to preview its cover; click to open it on BoardGameGeek.
</blockquote>
</Reveal>
<Reveal delay={140}>
<div class="grid gap-4 sm:grid-cols-[2fr_1fr]">
<blockquote
class="border-l-2 pl-5 text-lg leading-relaxed"
style="border-color: var(--color-secondary); color: var(--color-text-muted);"
>
Beyond RPGs, I maintain a growing board and card game collection.
Favorites span strategy, deck-building, and social deduction. Game night
is a regular event, and yes, there's always room for one more.
</blockquote>
<figure
class="relative overflow-hidden rounded-xl border"
style="border-color: color-mix(in srgb, var(--color-accent) 35%, transparent);"
>
<img src="/images/ttrpg-dice.jpg" alt="Dice and game pieces" loading="lazy" decoding="async" class="h-full w-full object-cover" />
</figure>
</div>
</Reveal>
<Reveal delay={200}>
<Placeholder
label="Board game shelf"
hint="Replace this with a real photo of your game shelf once you have one."
<BoardGameShelf
client:idle
games={boardgames}
shelfImage="/images/ttrpg-boardgame-shelf.jpg"
shelfAlt="Greg's board game shelf"
shelfCaption="The shelf"
/>
</Reveal>
</section>