Author API
Default Structure
Directorypackage/
Directorypublic/
- …
Directorysrc/
Directoryassets/
- …
Directorycomponents/
- …
Directorylayouts/
- …
Directorypages/
- …
Directorystyles/
- …
- index.ts
- package.json
import { z } from 'astro/zod'import defineTheme from 'astro-theme-provider';
export default defineTheme({ name: "my-theme", schema: z.object({ title: z.string(), description: z.sting().optional() })})
Options Reference
name
Type: string
Required
The name of a theme, must be unique. If you are authoring your theme as a package, it is recomended to use the package name as the name of your theme.
schema
Type: Zod Schema
Default: ZodTypeAny
A zod schema for validating the default value of a theme’s config module. The schema must be JSON serializable.
Example:
schema: z.object({ title: z.string(), description: z.string().optional()})
---import config from "my-theme:config"
console.log(config.title, config.description)---
srcDir
Type: string
Default: "src"
Directory that contains a theme’s assets (pages, components, images, css, etc). Assets inside the src directory can be accessed using virtual modules (see imports
).
pageDir
Type: string
| AstroPagesOption
Default: "pages"
Directory that contains all of the pages for a theme.
publicDir
Type: string
| AstroPublicOption
Default: "public"
Directory that contains a theme’s static assets (favicon.svg
, etc). By default, these assets act as placeholders and can be overwritten by assets located in a user’s public
real folder.
middlewareDir
Type: string
| false
Default: srcDir
Directory that contains a theme’s middleware. Relative paths are resolved relative to the theme’s srcDir
, use false
to disable middleware injection.
integrations
Type: Array<AstroIntegration | (options: { config: z.infer<Schema>, integrations: string[] }) => AstroIntegration | false | null | undefined>
An array of integrations that will be included with the theme:
integrations: [ mdx(), sitemap(),]
integrations: [ // Check for other integrations ({ integrations }) => { if (!integrations.contains('@astrojs/sitemap')) { return inoxsitemap() } },]
integrations: [ // Pass user options to integrations ({ config }) => { if (config.sitemap) { return inoxsitemap(config.sitemap) } },]
imports
Type: Record<string, Record<string, string> | string[] | string | false>
Default:
imports: { assets: "assets**.{jpeg,jpg,png,tiff,webp,gif,svg,avif}", components: "components/**.{astro,tsx,jsx,svelte,vue}", layouts: "layouts/**.astro", styles: "styles/**.{css,scss,sass,styl,less}",}
Create virtual modules to access assets inside a theme and allow users to override them.
false
:
Toggle default virtual modules off
imports: { assets: false, components: false, layouts: false, styles: false,}
string
:
Glob files into a virtual module, glob patterns are relative to a theme’s srcDir
.
Directorypackage/
Directorysrc/
Directorycomponents/
- Hero.astro
- Card.astro
- Button.astro
imports: { components: "components/**.astro",}
import { Hero, Card, Button } from "my-theme:components"
array
:
Use an array to combine imports into a single virtual module.
imports: { styles: [ "./src/styles/reset.css", "./src/styles/global.css", "./src/styles/utils.css", ],}
import "my-theme:styles"
object
:
Use an object to create more complex custom virtual modules.
imports: { components: { imports: [ "./src/styles/global.css" ], default: "./src/layout/Layout.astro", Head: "./src/components/Head.astro", Button: "./src/components/Button.astro" }}
import Layout, { Head, Button } from "my-theme:components"
log
Type: "verbose" | "minimal" | boolean
Default: true
Toggle logging for the theme.
Level | Description |
---|---|
false | Zero logging |
"minimal" | true | Log warnings |
"verbose" | Log everything, including debug information |
entrypoint
Type: string
Default: directory of the file the theme is exported from
A path to the root directory, or file inside the root directory, of a theme.
Virtual Module Reference
theme:config
A virtual module used to expose the user configuration.
The shape for this module can be define using the schema
option:
import { z } from 'astro/zod'import defineTheme from 'astro-theme-provider';
export default defineTheme({ name: "my-theme", schema: z.object({ title: z.string(), description: z.sting().optional() })})
After a schema
is defined, authors can use this virtual module to create configurable pages and components:
---import config from "my-theme:config"---
<h1>{config.title}</h1><p>{config.description}</p>
theme:context
A virtual module that contains utilities and information related to the context or enviroment a theme is running in.
declare module "theme:context" { export const pages: Map<string, string>; export const integrations: Set<string>;}
pages
A Map
that contains the final pattern that page is injected with:
---import { pages } from "my-theme:context"---
{ pages.get('/blog') && <a href={pages.get('/blog')}>Blog</a>}
integrations
A Set
that contains the name of every integration inside the user’s project.
---import { integrations } from "my-theme:context"---
{ integrations.get('@astrojs/rss') && <a href='/rss.xml'>RSS</a>}
theme:layouts
By default, all Astro files inside a theme’s src/layouts
folder are available as named exports inside the :layouts
module.
Directorypackage/
Directorysrc/
Directorylayouts/
- Layout.astro
import { Layout } from "my-theme:layouts";
This virtual module can be configured using the imports
option.
theme:components
By default, all Astro files inside a theme’s src/components
folder are available as named exports inside the :components
module.
Directorypackage/
Directorysrc/
Directorycomponents/
- Hero.astro
- Card.astro
- Button.astro
import { Hero, Card, Button } from "my-theme:components";
This virtual module can be configured using the imports
option.
theme:assets
By default, all images inside a theme’s src/assets
folder are available as named exports inside the :assets
module.
Directorypackage/
Directorysrc/
Directoryassets/
- logo.png
- background.png
import { logo, background } from "my-theme:assets";
This virtual module can be configured using the imports
option.
theme:styles
By default, all styles inside a theme’s src/styles
folder are available inside the :styles
module.
Directorypackage/
Directorysrc/
Directorystyles/
- reset.css
- styles.css
- utilities.css
import "my-theme:styles";
This virtual module can be configured using the imports
option.
Read more:
Example Project
Author a theme inside a package similar to a normal project:
Directorypackage/
Directorypublic/
- favicon.svg
Directorysrc/
Directoryassets/
- logo.png
Directorycomponents/
- Card.astro
Directorylayouts/
- Layout.astro
Directorypages/
- index.astro
Directorystyles/
- global.css
- index.ts
- package.json
- README.md
Export the theme integration from the package entrypoint:
import { z } from 'astro/zod';import defineTheme from 'astro-theme-provider';
export default defineTheme({ name: "my-theme", schema: z.object({ title: z.string(), description: z.string().optional() })})
Use the generated virtual modules to author the theme:
---import { Layout } from 'my-theme:layouts';import { Card } from 'my-theme:components';import { logo } from 'my-theme:assets';import config from 'my-theme:config';import 'my-theme:styles';
const { title, description = "Welcome to my theme"} = config---
<Layout> <Card {title} {description} img={logo}/></Layout>