Files
com.gregkilmer.www/services/site/src/components/blog/SidePanel.astro
T
Claude 99ecdc2113 Phase 5: every page of the site, the resume PDF and RSS
Landing, About, Now, Resume (with a generated PDF), Work and case studies,
Inquiries and the sent page, Library and the Shelf, Workshop and craft pages,
Tabletop, Blog with topics and posts, RSS, the Store, product lines, the
order form and the 404, all rendered from the content service's notes.

Schema: experience previousRoles, skills stack core items, page stats,
make tags and deck favorite. Icon names from notes map to brand icons in one
place, and HTML comments are dropped when Markdown renders.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012aSbo2D1qP8cMFQCykf7kx
2026-10-11 21:33:49 +00:00

48 lines
1.1 KiB
Plaintext

---
/**
* A sidebar panel on the blog pages: Midnight box, a faint seal in the
* corner, a starred kicker over a tick scale, then its rows.
*/
import Kicker from "@gk/ui/components/Kicker.astro";
import Seal from "@gk/ui/components/Seal.astro";
import type { SealName } from "@gk/ui/components/seals.ts";
interface Props {
title: string;
seal?: SealName;
/** Heading level for the title, so the outline stays correct. */
as?: "h2" | "h3";
}
const { title, seal, as: H = "h2" } = Astro.props;
---
<section class="panel">
{seal && <Seal name={seal} size={104} class="mark" />}
<H class="head"><Kicker star>{title}</Kicker></H>
<slot />
</section>
<style>
.panel {
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
gap: 10px;
padding: 18px 20px;
background: var(--gk-midnight);
border: 1px solid var(--gk-lines);
border-radius: var(--gk-radius);
}
.panel :global(.mark) {
position: absolute;
right: -26px;
top: -26px;
opacity: 0.14;
pointer-events: none;
}
.head {
margin: 0;
font: inherit;
}
</style>