Initial Astro redesign and deploy workflow

This commit is contained in:
2026-04-06 13:00:53 +02:00
parent 5753258ce9
commit aec24d92b6
42 changed files with 8176 additions and 51 deletions
+142
View File
@@ -0,0 +1,142 @@
---
import "../styles/global.css";
import SectionMark from "../components/SectionMark.astro";
import { getSectionHref, launchSections } from "../data/site";
interface Props {
title?: string;
description?: string;
lang?: string;
}
const {
title = "Dave Gilligan | Blue Note Logic",
description = "A literary, jazzy, technically serious online magazine for writing, consulting, education, languages, family, and AI.",
lang = "en",
} = Astro.props;
const issueDate = new Intl.DateTimeFormat("en-US", {
month: "long",
day: "numeric",
year: "numeric",
}).format(new Date());
const pathname = Astro.url.pathname.replace(/\/+$/, "") || "/";
const activeSlug = pathname === "/" ? "home" : pathname.split("/").filter(Boolean)[0];
const primarySlugs = ["business", "education", "writing", "jazz-music", "ai-lab", "norway"];
const primaryNav = launchSections.filter((section) => primarySlugs.includes(section.slug));
const footerNav = launchSections.filter((section) => !primarySlugs.includes(section.slug));
const currentSection = launchSections.find((section) => section.slug === activeSlug);
const articleMeta = pathname.startsWith("/articles/norway")
? {
label: "Article / Norway desk",
note: "Field report / family life / fathers / immigrants",
}
: pathname.startsWith("/articles/kongsberg-jazz-2026")
? {
label: "Article / Jazz and Music",
note: "Field report / Kongsberg x Paris",
}
: pathname.startsWith("/articles/trivia-and-tunes-april-2026")
? {
label: "Article / Projects desk",
note: "Field report / music trivia / Blue Note Rhino / April build",
}
: null;
const issueLabel = currentSection
? `Section ${currentSection.label} / ${currentSection.title}`
: articleMeta
? articleMeta.label
: "Founding issue / Personal edition";
const ribbonNote = currentSection?.tone
?? (articleMeta
? articleMeta.note
: "Ringwood / Villanova / Brussels / Paris / Krakow / Oslo / Kongsberg");
---
<!doctype html>
<html lang={lang}>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content={description} />
<meta name="generator" content={Astro.generator} />
<meta name="theme-color" content="#f6f0e1" />
<link rel="icon" href="/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Instrument+Serif:ital@0;1&family=Newsreader:opsz,wght@6..72,400;6..72,500;6..72,600&display=swap"
rel="stylesheet"
/>
<title>{title}</title>
</head>
<body>
<header class="site-ribbon">
<div class="container site-ribbon__row">
<span>Founding issue / {issueDate}</span>
<span>{ribbonNote}</span>
</div>
</header>
<div class="site-masthead">
<div class="container masthead">
<div class="masthead__row">
<span>{issueLabel}</span>
<span>Jazz desk / machine room / family archive / pataphysical bulletin</span>
</div>
<a href="/" class="masthead__brand masthead__brand--site">
<p class="masthead__domain">davegilligan.com</p>
<strong>Dave Gilligan</strong>
<p class="masthead__prompt">Hybrid IT. Private AI. Jazz rooms. Literary weather.</p>
<span>
A personal site edited like a bright retro paper: systems, music, languages, Norway,
civic weather, and useful mischief under one masthead.
</span>
</a>
<nav class="site-nav" aria-label="Primary sections">
{primaryNav.map((section) => (
<a
href={getSectionHref(section)}
class={`site-nav__link ${activeSlug === section.slug ? "site-nav__link--active" : ""}`}
>
<SectionMark slug={section.slug} className="section-mark--nav" />
<span>{section.title}</span>
</a>
))}
</nav>
</div>
</div>
<slot />
<footer class="site-footer">
<div class="container site-footer__top">
<div class="site-footer__brand">
<p>davegilligan.com</p>
<strong>Jazz desk, machine room, and civic archive.</strong>
<span>
Built in Astro with React islands, backed by PHP and SQL, and art-directed like a
magazine instead of a brochure.
</span>
</div>
<div class="footer-links">
{footerNav.map((section) => (
<a href={getSectionHref(section)}>
<SectionMark slug={section.slug} className="section-mark--footer" />
<span>{section.title}</span>
</a>
))}
</div>
</div>
<div class="container footer-note">
<span>Astro + React islands + PHP + SQL</span>
<span>Blue Note Logic / Gilligan TECH / Kongsberg / multilingual edition</span>
</div>
</footer>
</body>
</html>