mirror of
https://github.com/Patiun/com.gregkilmer.www.git
synced 2026-11-08 04:08:24 +00:00
a2f723ca2d
Phase 1 of the functional design plan. - Move the old site into legacy/, unchanged, for reference. It still builds from there until cutover. - Add packages/schema: the one definition of all 20 note types, with field titles and descriptions, note and vault checks, and JSON Schema export so later editing tools and the MCP server share it. - Add vault-kit: Obsidian templates generated from the schema, and the Site guide for 24.01_PersonalWebsite. - Add tools/migrate: turns the legacy JSON, collections, store data and page text into 545 Site folder notes and 84 images, and checks the result with the schema. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012aSbo2D1qP8cMFQCykf7kx
228 lines
8.4 KiB
Plaintext
228 lines
8.4 KiB
Plaintext
---
|
|
/**
|
|
* interests/index.astro — Interests Hub
|
|
* ---------------------------------------------------------------------------
|
|
* The "fun wing" landing page. A warm grid of cards linking into each interest
|
|
* sub-page, using the spec's taglines. Sets surface="interest" so the whole
|
|
* page reads as the craft-side night sky regardless of the global light/dark toggle.
|
|
*/
|
|
import BaseLayout from "@layouts/BaseLayout.astro";
|
|
import Reveal from "@components/motion/Reveal.astro";
|
|
import Icon from "@components/Icon.astro";
|
|
import SectionHeader from "@components/layout/SectionHeader.astro";
|
|
import AnimatedBackground from "@components/hero/AnimatedBackground.tsx";
|
|
import Motif from "@components/brand/Motif.astro";
|
|
import ConstellationField from "@components/mystic/ConstellationField.tsx";
|
|
|
|
const interests = [
|
|
{
|
|
href: "/interests/ttrpgs",
|
|
icon: "dice-multiple",
|
|
title: "TTRPGs & Tabletop",
|
|
tagline: "Have dice, will roll.",
|
|
blurb:
|
|
"Card Games, Board Games, and Long-running D&D and Daggerheart campaigns on Foundry VTT. Worldbuilding, NPC relationships, and player-driven narrative.",
|
|
image: "/images/ttrpg-dice.jpg",
|
|
alt: "Boardgame Shelf",
|
|
},
|
|
{
|
|
href: "/interests/gaming",
|
|
icon: "gamepad-variant",
|
|
title: "Gaming",
|
|
tagline: "We do not talk about my backlog.",
|
|
blurb:
|
|
"PlayStation 5, Nintendo Switch 2, and a politely out-of-hand Steam library. RPGs, strategy, and anything with a deeply layered world.",
|
|
image: "/images/gaming-setup.jpg",
|
|
alt: "Gaming setup desk",
|
|
},
|
|
{
|
|
href: "/interests/reading",
|
|
icon: "book-open-page-variant",
|
|
title: "Reading",
|
|
tagline: "Perpetually three books ahead of my to-read list.",
|
|
blurb:
|
|
"The Cosmere, Dune, the Pendergast saga, and Throne of Glass. Plus light novels, manga, manhwa, and webtoons.",
|
|
image: "/images/fantasy-books.jpg",
|
|
alt: "Fantasy bookshelf",
|
|
},
|
|
{
|
|
href: "/interests/anime",
|
|
icon: "animation-play",
|
|
title: "Anime",
|
|
tagline: "Subbed, dubbed, and somehow still behind.",
|
|
blurb:
|
|
"150+ completed series. The shonen classics, the modern hits, the isekai rabbit hole, and Frieren living rent-free in my head.",
|
|
image: "/images/anime-hero.jpg",
|
|
alt: "A cosplayer in a colorful anime-inspired costume at a convention",
|
|
},
|
|
{
|
|
href: "/interests/tv",
|
|
icon: "television-classic",
|
|
title: "TV Shows",
|
|
tagline: "My rewatch rotation has a rewatch rotation.",
|
|
blurb:
|
|
"200+ series across every prestige drama, NBC comedy, streaming original, and the full Marvel and Star Wars rosters.",
|
|
image: "/images/tv-hero.jpg",
|
|
alt: "A cozy living room with a couch facing a TV",
|
|
},
|
|
{
|
|
href: "/interests/movies",
|
|
icon: "movie-open",
|
|
title: "Movies",
|
|
tagline: "I stayed for the post-credits scene.",
|
|
blurb:
|
|
"160+ films across 17+ franchises. When I love a series I commit all the way, and The Princess Bride is always within reach.",
|
|
image: "/images/movies-hero.jpg",
|
|
alt: "Empty red seats in a vintage movie theater",
|
|
},
|
|
{
|
|
href: "/interests/making",
|
|
icon: "palette",
|
|
title: "Making & Creating",
|
|
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",
|
|
alt: "Polyhedral dice on a dark bag",
|
|
},
|
|
{
|
|
href: "/interests/tcgs",
|
|
icon: "cards",
|
|
title: "Trading Card Games",
|
|
tagline:
|
|
"Cardboard, deckbuilding, and the eternal question: one more pack?",
|
|
blurb:
|
|
"Magic: The Gathering Commander decks, Pokémon collecting, Riftbound, and the Gundam card game. Plus the proxies and props I make to play them.",
|
|
image: "/images/cards.jpg",
|
|
alt: "Trading cards and dice on a playmat",
|
|
} /*
|
|
{
|
|
href: '/interests/pokemon',
|
|
icon: 'pokeball',
|
|
title: 'Pokémon',
|
|
tagline: 'Metagross supremacy. This is not up for debate.',
|
|
blurb: 'A lifelong obsession from Red and Blue to modern competitive. Steel/Psychic, beautiful design, absolutely devastating in battle.',
|
|
image: '/images/pokemon-cards.jpg',
|
|
alt: 'Trading card collection',
|
|
},*/,
|
|
];
|
|
---
|
|
|
|
<BaseLayout
|
|
surface="interest"
|
|
title="Interests"
|
|
description="The fun wing: tabletop RPGs, gaming, reading, resin dice and 3D printing, and Pokémon. Where Greg's passions live as stories and collections."
|
|
>
|
|
<!-- Hero -->
|
|
<section class="on-sky relative overflow-hidden pb-8 pt-28 sm:pt-32">
|
|
{
|
|
/* Full animated Milky Way field + stars, matching the Home hero treatment. */
|
|
}
|
|
<AnimatedBackground client:idle className="vt-sky" />
|
|
<div
|
|
class="container-prose relative z-10 flex flex-col items-start gap-6 py-8"
|
|
>
|
|
<Reveal>
|
|
<SectionHeader
|
|
tone="hero"
|
|
kicker="The personal wing"
|
|
icon="heart"
|
|
title="Interests"
|
|
subtitle="Warmer, more visual, personality-driven. Not a list of hobbies but a collection of stories."
|
|
/>
|
|
</Reveal>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Interest grid -->
|
|
<section class="relative overflow-hidden py-12 sm:py-16">
|
|
<ConstellationField client:idle className="opacity-45" tint="teal" />
|
|
<Motif
|
|
name="tria-prima-array-seal-light"
|
|
class="absolute -left-48 bottom-0 z-0 h-[38rem] w-[38rem]"
|
|
style="opacity:.12;"
|
|
/>
|
|
<div class="container-prose relative z-10">
|
|
<div class="grid gap-5 md:grid-cols-2 lg:grid-cols-3">
|
|
{
|
|
interests.map((item, i) => (
|
|
<Reveal delay={i * 80}>
|
|
<a
|
|
href={item.href}
|
|
class="card card-interactive group flex h-full flex-col gap-4 overflow-hidden p-0"
|
|
>
|
|
<div class="aspect-[16/10] w-full overflow-hidden">
|
|
<img
|
|
src={item.image}
|
|
alt={item.alt}
|
|
loading="lazy"
|
|
decoding="async"
|
|
class="h-full w-full object-cover transition-transform duration-700 group-hover:scale-105"
|
|
/>
|
|
</div>
|
|
<div class="flex flex-col gap-3 px-5 pb-5">
|
|
<div class="flex items-center justify-between">
|
|
<span
|
|
class="inline-flex h-12 w-12 items-center justify-center rounded-xl"
|
|
style="background: color-mix(in srgb, var(--color-accent) 16%, transparent); color: var(--color-accent);"
|
|
aria-hidden="true"
|
|
>
|
|
<Icon name={item.icon} class="h-6 w-6" />
|
|
</span>
|
|
<Icon
|
|
name="arrow-right"
|
|
class="h-5 w-5 transition-transform group-hover:translate-x-1"
|
|
style="color: var(--color-accent);"
|
|
/>
|
|
</div>
|
|
<div class="flex flex-col gap-2">
|
|
<h3 class="font-display" style="color: var(--color-text);">
|
|
{item.title}
|
|
</h3>
|
|
<p
|
|
class="font-sans text-sm italic"
|
|
style="color: var(--color-secondary);"
|
|
>
|
|
{item.tagline}
|
|
</p>
|
|
</div>
|
|
<p
|
|
class="grow text-sm leading-relaxed"
|
|
style="color: var(--color-text-muted);"
|
|
>
|
|
{item.blurb}
|
|
</p>
|
|
</div>
|
|
</a>
|
|
</Reveal>
|
|
))
|
|
}
|
|
|
|
{/* Cross-link back to professional wing */}
|
|
<Reveal delay={interests.length * 80}>
|
|
<a
|
|
href="/professional"
|
|
class="card card-interactive group flex h-full flex-col justify-center gap-2 border-dashed p-5 text-center"
|
|
style="border-color: color-mix(in srgb, var(--color-accent) 40%, transparent);"
|
|
>
|
|
<Icon
|
|
name="briefcase"
|
|
class="mx-auto h-7 w-7"
|
|
style="color: var(--color-accent);"
|
|
/>
|
|
<p
|
|
class="font-sans font-semibold"
|
|
style="color: var(--color-text);"
|
|
>
|
|
The other wing
|
|
</p>
|
|
<p class="text-sm" style="color: var(--color-text-muted);">
|
|
See where curiosity meets the day job.
|
|
</p>
|
|
</a>
|
|
</Reveal>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</BaseLayout>
|