@@ -900,7 +956,7 @@ function SearchResults({ focusedIndex }: { focusedIndex: number }) {
selectedFramework,
setSelectedLibrary,
setSelectedFramework,
- libraryItems: _libraryItems,
+ libraryItems,
frameworkItems,
} = useSearchFilters()
@@ -956,22 +1012,28 @@ function SearchResults({ focusedIndex }: { focusedIndex: number }) {
Libraries
- {libraries
- .filter((lib) => 'bgStyle' in lib)
- .map((lib) => (
+ {libraryItems.map((item) => {
+ const lib = libraries.find((l) => l.id === item.value)
+ if (!lib) {
+ return null
+ }
+
+ return (
- ))}
+ )
+ })}
)}
diff --git a/src/libraries/libraries.ts b/src/libraries/libraries.ts
index a68835646..dbf759cac 100644
--- a/src/libraries/libraries.ts
+++ b/src/libraries/libraries.ts
@@ -32,7 +32,7 @@ export const query: LibrarySlim = {
defaultDocs: 'framework/react/overview',
sitemap: {
includeLandingPage: true,
- includeTopLevelDocsPages: true,
+ includeDocsPages: true,
},
installPath: 'framework/$framework/installation',
legacyPackages: ['react-query'],
@@ -223,7 +223,7 @@ export const router: LibrarySlim = {
docsRoot: 'docs/router',
sitemap: {
includeLandingPage: true,
- includeTopLevelDocsPages: true,
+ includeDocsPages: true,
},
legacyPackages: ['react-location'],
hideCodesandboxUrl: true,
@@ -292,7 +292,7 @@ export const start: LibrarySlim = {
defaultDocs: 'framework/react/overview',
sitemap: {
includeLandingPage: true,
- includeTopLevelDocsPages: true,
+ includeDocsPages: true,
},
installPath: 'framework/$framework/build-from-scratch',
embedEditor: 'codesandbox',
@@ -338,7 +338,7 @@ export const table: LibrarySlim = {
defaultDocs: 'introduction',
sitemap: {
includeLandingPage: true,
- includeTopLevelDocsPages: true,
+ includeDocsPages: true,
},
corePackageName: '@tanstack/table-core',
legacyPackages: ['react-table'],
@@ -411,7 +411,7 @@ export const form: LibrarySlim = {
ogImage: 'https://github.com/tanstack/form/raw/main/media/repo-header.png',
sitemap: {
includeLandingPage: true,
- includeTopLevelDocsPages: true,
+ includeDocsPages: true,
},
}
@@ -441,6 +441,10 @@ export const virtual: LibrarySlim = {
ogImage: 'https://github.com/tanstack/query/raw/main/media/header.png',
defaultDocs: 'introduction',
legacyPackages: ['react-virtual'],
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const ranger: LibrarySlim = {
@@ -455,6 +459,7 @@ export const ranger: LibrarySlim = {
borderStyle: 'border-black/50 dark:border-gray-100/50',
textStyle: 'text-black dark:text-gray-100',
textColor: 'text-black dark:text-gray-100',
+ badgeTextStyle: 'text-white dark:text-gray-900',
colorFrom: 'from-black dark:from-gray-100',
colorTo: 'to-gray-600 dark:to-gray-400',
accentColorFrom: 'from-blue-500',
@@ -470,6 +475,10 @@ export const ranger: LibrarySlim = {
availableVersions: ['v0'],
scarfId: 'dd278e06-bb3f-420c-85c6-6e42d14d8f61',
ogImage: 'https://github.com/tanstack/ranger/raw/main/media/headerv1.png',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const store: LibrarySlim = {
@@ -496,6 +505,10 @@ export const store: LibrarySlim = {
scarfId: '302d0fef-cb3f-43c6-b45c-f055b9745edb',
ogImage: 'https://github.com/tanstack/store/raw/main/media/repo-header.png',
defaultDocs: 'overview',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const pacer: LibrarySlim = {
@@ -524,6 +537,10 @@ export const pacer: LibrarySlim = {
scarfId: '302d0fef-cb3f-43c6-b45c-f055b9745edb',
ogImage: 'https://github.com/tanstack/pacer/raw/main/media/repo-header.png',
defaultDocs: 'overview',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const hotkeys: LibrarySlim = {
@@ -551,6 +568,10 @@ export const hotkeys: LibrarySlim = {
availableVersions: ['v0'],
ogImage: 'https://github.com/tanstack/hotkeys/raw/main/media/repo-header.png',
defaultDocs: 'overview',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const db: LibrarySlim = {
@@ -579,6 +600,7 @@ export const db: LibrarySlim = {
defaultDocs: 'overview',
sitemap: {
includeLandingPage: true,
+ includeDocsPages: true,
},
}
@@ -606,6 +628,10 @@ export const ai: LibrarySlim = {
availableVersions: ['v0'],
ogImage: 'https://github.com/tanstack/ai/raw/main/media/repo-header.png',
defaultDocs: 'getting-started/overview',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const intent: LibrarySlim = {
@@ -631,6 +657,10 @@ export const intent: LibrarySlim = {
availableVersions: ['v0'],
ogImage: 'https://github.com/tanstack/intent/raw/main/media/repo-header.png',
defaultDocs: 'overview',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const config: LibrarySlim = {
@@ -646,6 +676,7 @@ export const config: LibrarySlim = {
borderStyle: 'border-black/50 dark:border-gray-100/50',
textStyle: 'text-black dark:text-gray-100',
textColor: 'text-black dark:text-gray-100',
+ badgeTextStyle: 'text-white dark:text-gray-900',
colorFrom: 'from-black dark:from-gray-100',
colorTo: 'to-gray-600 dark:to-gray-400',
accentColorFrom: 'from-blue-500',
@@ -660,6 +691,10 @@ export const config: LibrarySlim = {
latestBranch: 'main',
availableVersions: ['v0'],
ogImage: 'https://github.com/tanstack/config/raw/main/media/repo-header.png',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const devtools: LibrarySlim = {
@@ -691,6 +726,10 @@ export const devtools: LibrarySlim = {
availableVersions: ['v0'],
ogImage:
'https://github.com/tanstack/devtools/raw/main/media/repo-header.png',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const mcp: LibrarySlim = {
@@ -751,6 +790,10 @@ export const cli: LibrarySlim = {
availableVersions: ['v0'],
ogImage: 'https://github.com/tanstack/cli/raw/main/media/repo-header.png',
defaultDocs: 'overview',
+ sitemap: {
+ includeLandingPage: true,
+ includeDocsPages: true,
+ },
}
export const libraries: LibrarySlim[] = [
diff --git a/src/libraries/types.ts b/src/libraries/types.ts
index 12c9a6f4b..8002e950a 100644
--- a/src/libraries/types.ts
+++ b/src/libraries/types.ts
@@ -82,7 +82,7 @@ export type LibrarySlim = {
visible?: boolean
sitemap?: {
includeLandingPage?: boolean
- includeTopLevelDocsPages?: boolean
+ includeDocsPages?: boolean
}
}
diff --git a/src/routes/$libraryId/$version.docs.$.tsx b/src/routes/$libraryId/$version.docs.$.tsx
index ee525cec5..07b8fa3a7 100644
--- a/src/routes/$libraryId/$version.docs.$.tsx
+++ b/src/routes/$libraryId/$version.docs.$.tsx
@@ -61,19 +61,28 @@ export const Route = createFileRoute('/$libraryId/$version/docs/$')({
}
},
head: ({ loaderData, params }) => {
- const { libraryId } = params
+ const { libraryId, version, _splat: docsPath } = params
const library = findLibrary(libraryId)
if (!library) {
throw notFound()
}
+ const frameworkVariantLinks = (loaderData?.frameworks ?? []).map(
+ (framework) => ({
+ rel: 'alternate',
+ type: 'text/markdown',
+ href: `/${libraryId}/${version}/docs/${docsPath}.md?framework=${framework}`,
+ }),
+ )
+
return {
meta: seo({
title: `${loaderData?.title} | ${library.name} Docs`,
description: loaderData?.description,
noindex: library.visible === false,
}),
+ links: frameworkVariantLinks,
}
},
component: Docs,
diff --git a/src/utils/docs.functions.ts b/src/utils/docs.functions.ts
index dbfeea200..2b266c7dd 100644
--- a/src/utils/docs.functions.ts
+++ b/src/utils/docs.functions.ts
@@ -8,8 +8,10 @@ import {
fetchApiContents,
fetchRepoFile,
isRecoverableGitHubContentError,
+ shouldUseLocalDocsFiles,
} from '~/utils/documents.server'
import { renderMarkdownToRsc } from './markdown'
+import { extractFrameworksFromMarkdown } from './markdown/filterFrameworkContent'
import { getCachedDocsArtifact } from './github-content-cache.server'
import { buildRedirectManifest, type RedirectManifestEntry } from './redirects'
import { removeLeadingSlash } from './utils'
@@ -115,11 +117,79 @@ function isDocsManifest(value: unknown): value is DocsManifest {
)
}
+async function buildDocsManifest({
+ repo,
+ branch,
+ docsRoot,
+}: {
+ repo: string
+ branch: string
+ docsRoot: string
+}): Promise