blob: c310972a107f41d984e6d876faf54a4a74b88c0c [file] [log] [blame] [edit]
---
import type { CollectionEntry } from 'astro:content'
import { getConfig } from '@libs/config'
import type { Layout, LayoutOverridesHTMLAttributes } from '@libs/layout'
import Head from '@components/head/Head.astro'
import Header from '@components/header/Header.astro'
import Scripts from '@components/Scripts.astro'
import Footer from '@components/footer/Footer.astro'
import { stripMarkdown } from '@libs/utils'
// The following props can be directly passed to the base layout component from any page or layout extending it,
// e.g. <BaseLayout layout="docs" robots="noindex" />.
type Props = {
// A specific layout to use for the current page used to determine if some components should be rendered or not.
// Available layouts are defined in `src/libs/layout.ts`.
layout?: Layout
// An object containing HTML attributes that can be overridden for some HTML elements used in the base layout keyed by
// HTML element names.
overrides?: {
body?: LayoutOverridesHTMLAttributes<'body'>
// Note that main can also be overridden by the Astro slot named "main" and that the slot will take precedence over
// any override.
main?: LayoutOverridesHTMLAttributes<'main'>
}
// A string containing the robots meta tag content. If not set, the tag will not be rendered.
robots?: string
// An override for the page title. If not defined, the title will either be the content of the `title` frontmatter
// property when rendering a markdown page or default back to the one defined in the `config.yml` file.
title?: string
} & MarkdownProps
// The following props are automatically set by Astro (if defined) based on the markdown frontmatter when rendering a
// markdown page. They can be accessed through the `Astro.props.frontmatter` object but note that they won't be set when
// not rendering a markdown page.
type MarkdownProps = { frontmatter?: Partial<CollectionEntry<'docs'>['data']> }
const { frontmatter, layout, overrides, robots } = Astro.props
const title = Astro.props.title ?? frontmatter?.title ?? getConfig().title
const description = frontmatter?.description ? stripMarkdown(frontmatter.description) : getConfig().description
const thumbnail = frontmatter?.thumbnail ? `img/${frontmatter.thumbnail}` : 'brand/bootstrap-social.png'
const bodyProps = overrides?.body ?? {}
const mainProps = overrides?.main ?? {}
---
<!DOCTYPE html>
<html lang="en" data-bs-theme="auto">
<head>
<Head
description={description}
direction={frontmatter?.direction}
layout={layout}
robots={robots}
thumbnail={thumbnail}
title={title}
/>
</head>
<body {...bodyProps}>
<Header layout={layout} title={title} addedIn={frontmatter?.added} />
{
Astro.slots.has('main') ? (
<slot name="main" />
) : (
<main {...mainProps}>
<slot />
</main>
)
}
<Footer />
<Scripts layout={layout} />
{frontmatter?.extra_js && frontmatter.extra_js.map((js) => <script is:inline async={js.async} src={js.src} />)}
{
layout === 'docs' && (
<div class="position-fixed" aria-hidden="true">
<input type="text" tabindex="-1" />
</div>
)
}
</body>
</html>