Standalone Astro 6 site in /site (decoupled from the /web app monorepo): landing page, /blog with one post (Content Layer), and terms/privacy/cookie legal pages. Pure Astro, server-rendered to static HTML. - Static by default via @astrojs/vercel adapter; any route can opt into SSR with `export const prerender = false` (deploys as a Vercel Function). - SPA-style navigation with <ClientRouter />, transition:persist on the header (no icon flash), and viewport prefetch — ~6 KB gzip JS, no React. - Deploy on Vercel by setting Root Directory to 'site' (no vercel.json needed). See site/README.md for dev and deploy instructions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
40 lines
991 B
Text
40 lines
991 B
Text
---
|
|
import { ClientRouter } from 'astro:transitions';
|
|
import Header from '../components/Header.astro';
|
|
import Footer from '../components/Footer.astro';
|
|
import '../styles/global.css';
|
|
|
|
interface Props {
|
|
title: string;
|
|
description?: string;
|
|
}
|
|
|
|
const { title, description = 'KiCad in the browser — WebAssembly port.' } =
|
|
Astro.props;
|
|
const fullTitle =
|
|
title === 'KiCad in the browser'
|
|
? title
|
|
: `${title} — KiCad in the browser`;
|
|
---
|
|
|
|
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
<meta name="description" content={description} />
|
|
<title>{fullTitle}</title>
|
|
{/* SPA-style navigation: swaps the page without a full reload. */}
|
|
<ClientRouter />
|
|
</head>
|
|
<body>
|
|
<Header />
|
|
<main>
|
|
<div class="container">
|
|
<slot />
|
|
</div>
|
|
</main>
|
|
<Footer />
|
|
</body>
|
|
</html>
|