feat(site): 🚀 add Astro marketing/content site
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>
This commit is contained in:
parent
d677ffca51
commit
d55a8a0afa
20 changed files with 6154 additions and 0 deletions
75
site/README.md
Normal file
75
site/README.md
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
# site
|
||||
|
||||
Public-facing marketing/content site for the KiCad WebAssembly project: landing
|
||||
page, blog, and legal pages. Built with **Astro 6**.
|
||||
|
||||
This is a **standalone** project — it is intentionally decoupled from the `/web`
|
||||
app monorepo (which is the product itself: React frontend + Fastify backend).
|
||||
It uses **npm** (not the monorepo's pnpm) and has its own `package-lock.json`.
|
||||
|
||||
## What it ships
|
||||
|
||||
- Static by default: every page is prerendered to HTML and ships **zero client
|
||||
JavaScript**. A visitor downloads HTML + CSS only — no React/JS bundle.
|
||||
- SSR-capable: the Vercel adapter is wired in, so any individual route can be
|
||||
switched to per-request server rendering without ripping anything out (see
|
||||
below).
|
||||
|
||||
## Routes
|
||||
|
||||
| Route | Source |
|
||||
| --------------------- | --------------------------------------- |
|
||||
| `/` | `src/pages/index.astro` |
|
||||
| `/blog` | `src/pages/blog/index.astro` |
|
||||
| `/blog/<id>` | `src/pages/blog/[slug].astro` |
|
||||
| `/terms` | `src/pages/terms.astro` |
|
||||
| `/privacy` | `src/pages/privacy.astro` |
|
||||
| `/cookies` | `src/pages/cookies.astro` |
|
||||
|
||||
Blog posts are Markdown files in `src/content/blog/`, validated by the schema in
|
||||
`src/content.config.ts`. Add a post by dropping a new `.md` file there with
|
||||
`title`, `description`, and `pubDate` frontmatter.
|
||||
|
||||
## Local development
|
||||
|
||||
Requires **Node ≥ 22.12** (Astro 6 requirement).
|
||||
|
||||
```bash
|
||||
cd site
|
||||
npm install
|
||||
npm run dev # http://localhost:4321
|
||||
npm run build # outputs to dist/ (+ .vercel/output for the adapter)
|
||||
npm run preview # serve the production build locally
|
||||
```
|
||||
|
||||
## SSR per route
|
||||
|
||||
Pages are static by default. To render a specific page or endpoint on demand
|
||||
(per request, as a Vercel Function), add this to its frontmatter:
|
||||
|
||||
```astro
|
||||
---
|
||||
export const prerender = false;
|
||||
---
|
||||
```
|
||||
|
||||
That's the only change needed — the `@astrojs/vercel` adapter in
|
||||
`astro.config.mjs` already provides the server runtime. The rest of the site
|
||||
stays static.
|
||||
|
||||
## Deploying to Vercel
|
||||
|
||||
The `@astrojs/vercel` adapter emits the Vercel Build Output API format, so **no
|
||||
`vercel.json` is required**.
|
||||
|
||||
1. Push this repo to GitHub.
|
||||
2. Vercel dashboard → **New Project** → import this repo.
|
||||
3. Click **Edit** next to **Root Directory** and set it to **`site`**. This is
|
||||
the standard way to deploy a project that lives in a subdirectory.
|
||||
4. Vercel auto-detects the **Astro** framework preset and the package manager
|
||||
from the lockfile. Leave the build/install commands at their defaults.
|
||||
5. Deploy. Static pages are served from the CDN; any route with
|
||||
`prerender = false` is deployed as a Vercel Function automatically.
|
||||
|
||||
Note: do **not** use `vercel.json` for URL rewrites with Astro — use Astro's
|
||||
`redirects` option in `astro.config.mjs` instead.
|
||||
Loading…
Reference in a new issue