brand-site/src/layouts/BaseLayout.astro
Scott Scoble 5bd4237d5a
All checks were successful
Build and Deploy to Storj / build-and-deploy (push) Successful in 9s
perf: optimize hero image — 16MB PNG → 58KB WebP with responsive sources
2026-04-29 16:32:15 -07:00

117 lines
3.7 KiB
Text

---
// BaseLayout.astro — Base layout with nav, footer, SEO meta
import '../styles/global.css';
import Nav from '../components/Nav.astro';
import Footer from '../components/Footer.astro';
export interface Props {
title: string;
description: string;
ogImage?: string;
ogType?: string;
canonicalUrl?: string;
}
const {
title,
description,
ogImage = '/social-card.png',
ogType = 'website',
canonicalUrl,
} = Astro.props;
const siteTitle = 'Scott Scoble';
const fullTitle = title.includes(siteTitle) ? title : `${title} — ${siteTitle}`;
const siteUrl = 'https://scott.scoble.me';
const currentPath = canonicalUrl || Astro.url.pathname;
---
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" href="/favicon.ico" sizes="16x16 32x32 48x48" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content={Astro.generator} />
<!-- Primary Meta -->
<title>{fullTitle}</title>
<meta name="description" content={description} />
<meta name="author" content="Scott Scoble" />
<!-- Open Graph -->
<meta property="og:title" content={fullTitle} />
<meta property="og:description" content={description} />
<meta property="og:type" content={ogType} />
<meta property="og:url" content={new URL(currentPath, siteUrl).href} />
<meta property="og:image" content={new URL(ogImage, siteUrl).href} />
<meta property="og:site_name" content="Scott Scoble" />
<meta property="og:locale" content="en_US" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={fullTitle} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={new URL(ogImage, siteUrl).href} />
<!-- Canonical -->
<link rel="canonical" href={new URL(currentPath, siteUrl).href} />
<!-- RSS -->
<link rel="alternate" type="application/rss+xml" title="Scott Scoble Blog" href="/rss.xml" />
<!-- Umami Analytics -->
<script defer src="https://os.scoble.me/umami/script.js" data-website-id="4a23c88a-5397-4bac-a830-074c6aca7108"></script>
<!-- Google Fonts -->
<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=EB+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&display=swap" rel="stylesheet" />
</head>
<body>
<a href="#main-content" class="skip-link">Skip to main content</a>
<Nav currentPath={currentPath} />
<main id="main-content">
<slot />
</main>
<Footer />
</body>
</html>
<style is:global>
/* CSS Variables must be defined globally for all components to access */
:root {
--color-brown: #4a4438;
--color-brown-dark: #2d2a24;
--color-green: #3d5a3e;
--color-green-dark: #2d5a3e;
--color-cream: #faf8f5;
--color-cream-warm: #f5f0e8;
--color-amber: #c8952e;
--color-amber-light: #d4a94e;
--color-text: #2d2a24;
--color-text-muted: #6b6458;
--color-border: #e0dbd2;
--color-border-light: #ede9e2;
--color-bg: #faf8f5;
--color-bg-alt: #f5f0e8;
--font-heading: 'EB Garamond', Georgia, serif;
--font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
--size-xs: 0.75rem;
--size-sm: 0.875rem;
--size-base: 1rem;
--size-md: 1.125rem;
--size-lg: 1.25rem;
--size-xl: 1.5rem;
--size-2xl: 2rem;
--size-3xl: 2.5rem;
--size-4xl: 3rem;
}
</style>
<!-- CI/CD test: 2026-04-28T21:06:42-07:00 -->