The page shell, with html, head and body. It writes the SEO tags, runs the no-js swap before paint and restores a stored colour mode.

Last updated

SiteLayout wraps every page: <html>, <head>, <body>. It renders the SEO tags from its props, swaps no-js for js before paint, and restores a colour mode the visitor picked. With nothing stored, the page follows the system setting.

Add

npx @ava-ui/apogee add site-layout

It lands in src/layouts/SiteLayout.astro, not in the components folder. Open it and import your global stylesheet in the frontmatter.

Usage

---
import SiteLayout from '../layouts/SiteLayout.astro'
---

<SiteLayout title="Pricing — Example" description="Plans for teams of every size.">
  <link slot="head" rel="icon" href="/favicon.svg" type="image/svg+xml" />
  <main>…</main>
</SiteLayout>

API

Prop Type Default Notes
title string required Browser tab and search results; also og:title.
description string — description and og:description.
socialImage string — og:image. A path resolves against site in astro.config.
canonical string this page on site <link rel="canonical"> and og:url. Omitted when there’s no site.
type 'website' | 'article' 'website' og:type.
excludeFromSearch boolean false Adds <meta name="robots" content="noindex">.
theme 'light' | 'dark' — Fixes the mode for the page. Unset: the stored choice, else the system.
lang string 'en' Any other <html> attribute passes through, including dir="rtl".

Slots: head (fonts, icons, analytics), default (the page).

AVA

Each SEO prop carries an @seo tag (@seo title, @seo socialImage, …), so the AVA editor adopts this layout as the site’s SEO convention and edits those props per page. It doesn’t scaffold a second <head>. AVA reads layouts from src/layouts/, so keep the file there.