Skip to content
BaseLayer Themes

Site config

How site.ts and config slices work together.

Config slices

Themes split configuration into focused files merged in src/config/site.ts:

  • identity.tsname, tagline, url, navigation (links, dropdowns, CTA), footer groups, font stacks
  • blocks.ts — default copy for <Hero01 />, <Services01 />, <CTA01 />, etc.
  • banner.ts — site-wide announcement bars (Banner01, Banner02)
  • integrations.ts — SEO metadata, contact form provider, analytics, AEO/FAQ data. seo.sameAs also feeds Footer 03 social icons.
navigation: {
  sticky: true,
  dropdownTrigger: "hover", // desktop: "hover" | "click"
  links: [
    { label: "Work", href: "/work/" },
    {
      label: "Services",
      href: "/#services",
      children: [
        { label: "Websites", href: "/#services" },
        { label: "Web apps", href: "/#services" },
      ],
    },
  ],
  cta: { label: "Start a project", href: "/contact/", size: "md" },
},

Types live in src/lib/nav.ts (NavLink, NavMegaSection, NavDropdownTrigger).

Full guide: Navigation componentschildren vs sections, featured columns, icons, widths, mobile behavior, recipes.

Chrome demos: Navbar 01, Navbar 03, Navbar 04, Navbar 05, Navbar 06.

Merged export

import { identity } from "./identity";
import { integrations } from "./integrations";
import { blocks } from "./blocks";
import { banner } from "./banner";

export const siteConfig = {
  ...identity,
  ...blocks,
  ...integrations,
  banner,
};

Each block is documented under Blocks with its config key and inline override examples. UI atoms live under Components.

Overriding on pages

Blocks accept props that override siteConfig defaults:

<Hero01 heading="Custom headline" primaryCta="Book a call" />

Production checklist

  • Set identity.url and astro.config.mjs site to your domain
  • Update integrations.seo title, description, ogImage
  • Configure integrations.contactForm.provider