Initial Astro redesign and deploy workflow
This commit is contained in:
@@ -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>
|
||||
Reference in New Issue
Block a user