Components
In this section, we'll look at how you can work with Markdown files and how you can use Svelte components inside of them.
Markdown Files
Markdown files are just Svelte components. You can use them to create layouts __layout.md
, or
break large Markdown files into multiple components and import them like so:
<script>
import Section from './Section.md'
</script>
# Quickstart ... ## Section
<Section />
The only difference between a Markdown file and Svelte component is that you can use top-level
tags such as <script>
, <script context="module">
, and <style>
multiple times.
The following is valid because KitDocs will merge top-level tags:
<script>
// ...
</script>
<script>
// ...
</script>
Frontmatter Store
We'll import the frontmatter
store for you so you can use it directly in your Markdown files like
so:
---
title: Page Title
description: Page description.
---
# {$frontmatter.title}
{$frontmatter.description}
Global Components
You can create Svelte components that are global, meaning they're imported into every single Markdown file. In addition, global components are automatically mapped to Markdown containers, on which you can pass in props and dynamic slot elements.
First, create a component in the global markdown components directory:
src
└─ kit-docs
├─ Button.svelte <-
Now, inside your markdown files you can use the <Button>
component like so:
<!-- Use the component as-is. -->
<Button />
<!-- Or, use a markdown container. -->
:::button propA="valueA"|propB=10 Default slot content here. :::
<!-- You can pass in dynamic slot elements! -->
<!-- If you omit `tag`, it'll default to `<p>`. -->
:::button (tag=h1&slot=title)=Title Default slot content here. :::
Configuration
You can configure how global Svelte components are mapped to rules or containers by setting them in your plugin like so:
kitDocsPlugin({
markdown: {
components: [
// Override inline rule.
// `Image.svelte` must be a global component.
{ name: 'Image', type: 'inline', rule: 'image' },
// Override block rule.
// `Blockquote.svelte` must be a global component.
{ name: 'Blockquote', type: 'block', rule: 'blockquote' },
// Create custom container.
// `Button.svelte` must be a global component.
{ name: 'Button', type: 'custom', container: { marker: '!' } },
],
},
})
The configuration above will transform the following Markdown like so:
![alt text](https://...)
> This is a blockquote.
!!!button
...
!!!
<Image href="https://..." alt="alt text" />
<Blockquote>This is a blockquote.</Blockquote>
<Button>...</Button>
Change Directory
By default, the global components directory is set to src/kit-docs
. You can change it in
your plugin settings like so:
kitDocsPlugin({
markdown: {
globalComponents: 'src/kit-docs/**/[^_]*.svelte',
},
})
Default Components
There's a few components we provide out of the box such as CodeFence
, CodeInline
, Link
and
others. You can find all of our default components
on GitHub.
Overriding
If you want to override any of the default components, simply create a Svelte component with the same name in your global folder and make sure it accepts the same props.
For example, you can override CodeFence
by creating it in the global directory like so:
src
└─ kit-docs
├─ CodeFence.svelte <-
Finally, you can use the following minimal boilerplate and style the component as desired.
<script>
/** @type {string} */
export let lang
/** @type {string} */
export let ext
/** @type {string} */
export let code
/** @type {number} */
export let linesCount
/** @type {[number, number][]} */
export let highlightLines = []
</script>
<div class={`lang-${lang} ext-${ext}`}>
{@html code}
</div>