diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 810881965..659665190 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -53,6 +53,17 @@ export default defineConfig({ buildEnd(siteConfig) { generateLlmsArtifacts(docsDir, siteConfig.outDir, siteUrl); }, + transformPageData(pageData) { + // Every guide page has a markdown rendition next to its HTML (llms.ts); + // advertise it to tools via a rel=alternate link. The API reference has none. + if (!pageData.relativePath.startsWith('api/')) { + pageData.frontmatter.head ??= []; + pageData.frontmatter.head.push([ + 'link', + { rel: 'alternate', type: 'text/markdown', href: `${siteUrl}/${pageData.relativePath}` } + ]); + } + }, themeConfig: { nav: [ { text: 'Get started', link: '/get-started/first-server', activeMatch: '^/get-started/' }, diff --git a/docs/.vitepress/theme/MarkdownSource.vue b/docs/.vitepress/theme/MarkdownSource.vue new file mode 100644 index 000000000..bca5bea7a --- /dev/null +++ b/docs/.vitepress/theme/MarkdownSource.vue @@ -0,0 +1,17 @@ + + + diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index a920efef6..b7c1d804b 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -171,3 +171,20 @@ text-decoration: underline; margin-left: 4px; } + +/* --------------------------------------------------- markdown-source footer */ + +.markdown-source { + margin-bottom: 16px; + padding-top: 16px; + border-top: 1px solid var(--vp-c-divider); + color: var(--vp-c-text-3); + font-size: 12px; + line-height: 1.5; +} + +.markdown-source a { + color: var(--vp-c-text-2); + text-decoration: underline; + font-weight: 400; +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index be94142d8..2f5bbe57d 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -3,13 +3,15 @@ import DefaultTheme from 'vitepress/theme'; import { h } from 'vue'; import Banner from './Banner.vue'; +import MarkdownSource from './MarkdownSource.vue'; import './custom.css'; export default { extends: DefaultTheme, Layout() { return h(DefaultTheme.Layout, null, { - 'layout-top': () => h(Banner) + 'layout-top': () => h(Banner), + 'doc-footer-before': () => h(MarkdownSource) }); } } satisfies Theme;