--- import "../styles/global.css"; import CookieBanner from "../components/CookieBanner.astro"; import LocaleCopy from "../components/LocaleCopy.astro"; import LocaleSwitcher from "../components/LocaleSwitcher.astro"; import SectionMark from "../components/SectionMark.astro"; import { getSectionHref, launchSections } from "../data/site"; import { footerCallouts, getChromeCopy, localeMeta, localizedSections, policyLinkCopy } from "../data/locales"; interface Props { title?: string; description?: string; lang?: string; ogImage?: string; ogType?: "website" | "article"; ogArticlePublishedTime?: string; ogArticleSection?: 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", ogImage, ogType, ogArticlePublishedTime, ogArticleSection, } = Astro.props; const now = new Date(); const issueDate = { en: new Intl.DateTimeFormat("en-US", { month: "long", day: "numeric", year: "numeric", }).format(now), fr: new Intl.DateTimeFormat("fr-FR", { day: "numeric", month: "long", year: "numeric", }).format(now), nb: new Intl.DateTimeFormat("nb-NO", { day: "numeric", month: "long", year: "numeric", }).format(now), }; const pathname = Astro.url.pathname.replace(/\/+$/, "") || "/"; const siteUrl = "https://davegilligan.com"; const canonicalUrl = siteUrl + (pathname === "/" ? "" : pathname); const ogImageAbsolute = siteUrl + (ogImage ?? "/images/og/home.png"); const resolvedOgType = ogType ?? "website"; 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 articleKey = pathname.startsWith("/articles/norway") ? "norway" : pathname.startsWith("/articles/kongsberg-jazz-2026") ? "jazz" : pathname.startsWith("/articles/trivia-and-tunes-april-2026") ? "projects" : null; const chromeCopy = getChromeCopy({ activeSlug, issueDate, articleKey }); --- {resolvedOgType === "article" && ogArticlePublishedTime && ( )} {resolvedOgType === "article" && ogArticleSection && ( )} {title}

davegilligan.com

Dave Gilligan