From 9797baf82cf7a0bc1ff7616590052d7ff174a1dc Mon Sep 17 00:00:00 2001 From: molebox Date: Thu, 28 May 2026 15:26:48 +0200 Subject: [PATCH 1/7] Migrate docs app to Geistdocs canary --- apps/docs/.env.example | 5 +- apps/docs/app/[lang]/agents.md/route.ts | 10 + .../docs/app/[lang]/docs/[[...slug]]/page.tsx | 127 +- apps/docs/app/[lang]/layout.tsx | 15 +- .../app/[lang]/llms.mdx/[[...slug]]/route.ts | 36 +- apps/docs/app/[lang]/llms.txt/route.ts | 30 +- apps/docs/app/[lang]/rss.xml/route.ts | 2 +- apps/docs/app/[lang]/sitemap.md/route.ts | 212 +-- apps/docs/app/actions/feedback/index.ts | 7 +- apps/docs/app/api/chat/route.ts | 123 +- apps/docs/app/api/chat/tools.ts | 208 --- apps/docs/app/api/chat/types.ts | 26 - apps/docs/app/api/chat/utils.ts | 56 - apps/docs/app/api/search/route.ts | 59 +- apps/docs/app/global.css | 1 - apps/docs/app/styles/geistdocs.css | 440 +----- .../components/ai-elements/conversation.tsx | 100 -- apps/docs/components/ai-elements/message.tsx | 337 ----- .../components/ai-elements/open-in-chat.tsx | 365 ----- .../components/ai-elements/prompt-input.tsx | 1263 ----------------- apps/docs/components/ai-elements/shimmer.tsx | 64 - apps/docs/components/ai-elements/sources.tsx | 77 - .../components/ai-elements/suggestion.tsx | 56 - .../components/custom/framework-switcher.tsx | 211 +-- .../icons/icon-arrow-up-right-small.tsx | 35 - .../icons/icon-arrow-up-right.tsx | 27 - .../geistcn-assets/icons/icon-check.tsx | 27 - .../icons/icon-chevron-down-small.tsx | 30 - .../icons/icon-chevron-right.tsx | 27 - .../geistcn-assets/icons/icon-copy.tsx | 27 - .../geistcn-assets/icons/icon-file-text.tsx | 25 - .../geistcn-assets/icons/icon-menu-alt.tsx | 27 - .../icons/icon-slash-forward.tsx | 36 - .../geistcn-assets/icons/index.tsx | 10 - .../geistcn-assets/logos/index.tsx | 13 - .../geistcn-assets/logos/logo-ai-elements.tsx | 29 - .../geistcn-assets/logos/logo-ai-sdk.tsx | 41 - .../geistcn-assets/logos/logo-chat-sdk.tsx | 42 - .../geistcn-assets/logos/logo-flags-sdk.tsx | 42 - .../geistcn-assets/logos/logo-icon-vercel.tsx | 31 - .../geistcn-assets/logos/logo-streamdown.tsx | 32 - .../geistcn-assets/logos/logo-vercel-oss.tsx | 24 - .../logos/logo-workflow-sdk.tsx | 76 - apps/docs/components/geistdocs/ask-ai.tsx | 33 - apps/docs/components/geistdocs/callout.tsx | 40 - apps/docs/components/geistdocs/chat.tsx | 454 ------ .../components/geistdocs/code-block-tabs.tsx | 61 - apps/docs/components/geistdocs/code-block.tsx | 161 --- apps/docs/components/geistdocs/copy-chat.tsx | 56 - apps/docs/components/geistdocs/copy-page.tsx | 27 - .../components/geistdocs/desktop-menu.tsx | 67 - .../docs/components/geistdocs/docs-layout.tsx | 46 +- apps/docs/components/geistdocs/docs-page.tsx | 35 - .../docs/components/geistdocs/edit-source.tsx | 30 - apps/docs/components/geistdocs/feedback.tsx | 139 -- apps/docs/components/geistdocs/footer.tsx | 30 - .../components/geistdocs/github-button.tsx | 19 - .../docs/components/geistdocs/home-layout.tsx | 44 +- apps/docs/components/geistdocs/icons.tsx | 13 - apps/docs/components/geistdocs/installer.tsx | 58 - .../geistdocs/language-selector.tsx | 43 - .../components/geistdocs/mdx-components.tsx | 59 +- apps/docs/components/geistdocs/mermaid.tsx | 68 - .../components/geistdocs/message-metadata.tsx | 73 - .../components/geistdocs/mobile-docs-bar.tsx | 81 -- .../docs/components/geistdocs/mobile-menu.tsx | 150 -- .../docs/components/geistdocs/navbar-logo.tsx | 122 -- apps/docs/components/geistdocs/navbar.tsx | 22 - .../components/geistdocs/open-in-chat.tsx | 49 - apps/docs/components/geistdocs/provider.tsx | 56 +- apps/docs/components/geistdocs/rss-button.tsx | 10 - apps/docs/components/geistdocs/scroll-top.tsx | 21 - apps/docs/components/geistdocs/search.tsx | 84 -- apps/docs/components/geistdocs/sidebar.tsx | 131 -- .../geistdocs/theme-aware-image.tsx | 22 - .../components/geistdocs/theme-toggle.tsx | 35 - apps/docs/components/geistdocs/video.tsx | 16 - apps/docs/components/ui/command-prompt.tsx | 6 +- apps/docs/components/ui/navigation-menu.tsx | 2 +- apps/docs/geistdocs.tsx | 27 +- apps/docs/hooks/geistdocs/use-chat.ts | 23 - apps/docs/hooks/geistdocs/use-sidebar.ts | 13 - apps/docs/lib/ai-agent-detection.ts | 168 --- apps/docs/lib/geistdocs/config.tsx | 30 + apps/docs/lib/geistdocs/db.ts | 21 - apps/docs/lib/geistdocs/i18n.ts | 13 - apps/docs/lib/geistdocs/md-tracking.ts | 15 +- apps/docs/lib/geistdocs/source.ts | 56 +- apps/docs/package.json | 19 +- apps/docs/proxy.ts | 122 +- apps/docs/source.config.ts | 36 +- biome.json | 2 - package.json | 2 +- packages/flags/package.json | 1 + pnpm-lock.yaml | 661 ++++++--- 95 files changed, 733 insertions(+), 7270 deletions(-) create mode 100644 apps/docs/app/[lang]/agents.md/route.ts delete mode 100644 apps/docs/app/api/chat/tools.ts delete mode 100644 apps/docs/app/api/chat/types.ts delete mode 100644 apps/docs/app/api/chat/utils.ts delete mode 100644 apps/docs/components/ai-elements/conversation.tsx delete mode 100644 apps/docs/components/ai-elements/message.tsx delete mode 100644 apps/docs/components/ai-elements/open-in-chat.tsx delete mode 100644 apps/docs/components/ai-elements/prompt-input.tsx delete mode 100644 apps/docs/components/ai-elements/shimmer.tsx delete mode 100644 apps/docs/components/ai-elements/sources.tsx delete mode 100644 apps/docs/components/ai-elements/suggestion.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-arrow-up-right-small.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-arrow-up-right.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-check.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-chevron-down-small.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-chevron-right.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-copy.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-file-text.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-menu-alt.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/icon-slash-forward.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/icons/index.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/index.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-ai-elements.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-ai-sdk.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-chat-sdk.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-flags-sdk.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-icon-vercel.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-streamdown.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-vercel-oss.tsx delete mode 100644 apps/docs/components/geistcn-fallbacks/geistcn-assets/logos/logo-workflow-sdk.tsx delete mode 100644 apps/docs/components/geistdocs/ask-ai.tsx delete mode 100644 apps/docs/components/geistdocs/callout.tsx delete mode 100644 apps/docs/components/geistdocs/chat.tsx delete mode 100644 apps/docs/components/geistdocs/code-block-tabs.tsx delete mode 100644 apps/docs/components/geistdocs/code-block.tsx delete mode 100644 apps/docs/components/geistdocs/copy-chat.tsx delete mode 100644 apps/docs/components/geistdocs/copy-page.tsx delete mode 100644 apps/docs/components/geistdocs/desktop-menu.tsx delete mode 100644 apps/docs/components/geistdocs/docs-page.tsx delete mode 100644 apps/docs/components/geistdocs/edit-source.tsx delete mode 100644 apps/docs/components/geistdocs/feedback.tsx delete mode 100644 apps/docs/components/geistdocs/footer.tsx delete mode 100644 apps/docs/components/geistdocs/github-button.tsx delete mode 100644 apps/docs/components/geistdocs/icons.tsx delete mode 100644 apps/docs/components/geistdocs/installer.tsx delete mode 100644 apps/docs/components/geistdocs/language-selector.tsx delete mode 100644 apps/docs/components/geistdocs/mermaid.tsx delete mode 100644 apps/docs/components/geistdocs/message-metadata.tsx delete mode 100644 apps/docs/components/geistdocs/mobile-docs-bar.tsx delete mode 100644 apps/docs/components/geistdocs/mobile-menu.tsx delete mode 100644 apps/docs/components/geistdocs/navbar-logo.tsx delete mode 100644 apps/docs/components/geistdocs/navbar.tsx delete mode 100644 apps/docs/components/geistdocs/open-in-chat.tsx delete mode 100644 apps/docs/components/geistdocs/rss-button.tsx delete mode 100644 apps/docs/components/geistdocs/scroll-top.tsx delete mode 100644 apps/docs/components/geistdocs/search.tsx delete mode 100644 apps/docs/components/geistdocs/sidebar.tsx delete mode 100644 apps/docs/components/geistdocs/theme-aware-image.tsx delete mode 100644 apps/docs/components/geistdocs/theme-toggle.tsx delete mode 100644 apps/docs/components/geistdocs/video.tsx delete mode 100644 apps/docs/hooks/geistdocs/use-chat.ts delete mode 100644 apps/docs/hooks/geistdocs/use-sidebar.ts delete mode 100644 apps/docs/lib/ai-agent-detection.ts create mode 100644 apps/docs/lib/geistdocs/config.tsx delete mode 100644 apps/docs/lib/geistdocs/db.ts delete mode 100644 apps/docs/lib/geistdocs/i18n.ts diff --git a/apps/docs/.env.example b/apps/docs/.env.example index ae7d7891..cf89c762 100644 --- a/apps/docs/.env.example +++ b/apps/docs/.env.example @@ -2,4 +2,7 @@ AI_GATEWAY_API_KEY="" # Production URL (automatically set on Vercel) -NEXT_PUBLIC_VERCEL_PROJECT_PRODUCTION_URL="localhost:3000" \ No newline at end of file +NEXT_PUBLIC_VERCEL_PROJECT_PRODUCTION_URL="localhost:3000" + +# Required for precomputed feature flag URLs +FLAGS_SECRET="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" diff --git a/apps/docs/app/[lang]/agents.md/route.ts b/apps/docs/app/[lang]/agents.md/route.ts new file mode 100644 index 00000000..e49cab2d --- /dev/null +++ b/apps/docs/app/[lang]/agents.md/route.ts @@ -0,0 +1,10 @@ +import { createAgentsRoute } from '@vercel/geistdocs/routes/agents'; +import { config } from '@/lib/geistdocs/config'; + +const agentsRoute = createAgentsRoute({ + config, +}); + +export const GET = agentsRoute.GET; +export const generateStaticParams = agentsRoute.generateStaticParams; +export const revalidate = false; diff --git a/apps/docs/app/[lang]/docs/[[...slug]]/page.tsx b/apps/docs/app/[lang]/docs/[[...slug]]/page.tsx index ce439ee6..d83ce0ef 100644 --- a/apps/docs/app/[lang]/docs/[[...slug]]/page.tsx +++ b/apps/docs/app/[lang]/docs/[[...slug]]/page.tsx @@ -1,106 +1,35 @@ -import { createRelativeLink } from "fumadocs-ui/mdx"; -import type { Metadata } from "next"; -import { notFound } from "next/navigation"; -import { AskAI } from "@/components/geistdocs/ask-ai"; -import { CopyPage } from "@/components/geistdocs/copy-page"; -import { - DocsBody, - DocsDescription, - DocsPage, - DocsTitle, -} from "@/components/geistdocs/docs-page"; -import { EditSource } from "@/components/geistdocs/edit-source"; -import { Feedback } from "@/components/geistdocs/feedback"; +import { MobileDocsBar } from "@vercel/geistdocs/mobile-docs-bar"; +import { createDocsPage } from "@vercel/geistdocs/pages/docs"; import { getMDXComponents } from "@/components/geistdocs/mdx-components"; -import { MobileDocsBar } from "@/components/geistdocs/mobile-docs-bar"; -import { OpenInChat } from "@/components/geistdocs/open-in-chat"; -import { ScrollTop } from "@/components/geistdocs/scroll-top"; -import { Separator } from "@/components/ui/separator"; -import { getLLMText, getPageImage, source } from "@/lib/geistdocs/source"; import { IframeBrowser } from "@/components/custom/iframe-browser"; import { LearnMore } from "@/components/custom/learn-more"; import { ProviderList } from "@/components/custom/provider-list"; import { ThemeAwareImage } from "@/components/custom/theme-aware-image"; +import { config } from "@/lib/geistdocs/config"; +import { geistdocsSource } from "@/lib/geistdocs/source"; import { ExternalLinkIcon } from "lucide-react"; -const Page = async ({ params }: PageProps<"/[lang]/docs/[[...slug]]">) => { - const { slug, lang } = await params; - const page = source.getPage(slug, lang); - - if (!page) { - notFound(); - } - - const markdown = await getLLMText(page); - const MDX = page.data.body; - - return ( - - - - - - - - - - ), - }} - tableOfContentPopover={{ enabled: false }} - toc={page.data.toc} - > - - {page.data.title} - {page.data.description} - - - - - ); -}; - -export const generateStaticParams = () => source.generateParams(); - -export const generateMetadata = async ({ - params, -}: PageProps<"/[lang]/docs/[[...slug]]">) => { - const { slug, lang } = await params; - const page = source.getPage(slug, lang); - - if (!page) { - notFound(); - } - - const metadata: Metadata = { - title: page.data.title, - description: page.data.description, - openGraph: { - images: getPageImage(page).url, - }, - alternates: { - types: { - "text/markdown": slug ? `/docs/${slug}.md` : "/docs.md", - }, - }, - }; - - return metadata; -}; - -export default Page; +const docsPage = createDocsPage({ + config, + mdx: ({ link }) => + getMDXComponents({ + a: link, + IframeBrowser, + LearnMore, + ProviderList, + ThemeAwareImage, + ExternalSmall: ExternalLinkIcon, + }), + openGraph: { + images: true, + }, + source: geistdocsSource, + tableOfContentPopover: { + enabled: false, + }, + renderTop: ({ data }) => , +}); + +export default docsPage.Page; +export const generateStaticParams = docsPage.generateStaticParams; +export const generateMetadata = docsPage.generateMetadata; diff --git a/apps/docs/app/[lang]/layout.tsx b/apps/docs/app/[lang]/layout.tsx index e61a6054..c6d77bd6 100644 --- a/apps/docs/app/[lang]/layout.tsx +++ b/apps/docs/app/[lang]/layout.tsx @@ -1,12 +1,11 @@ import "../global.css"; +import { Footer } from "@vercel/geistdocs/footer"; +import { Navbar } from "@vercel/geistdocs/navbar"; import { VercelToolbar } from "@vercel/toolbar/next"; -import { Footer } from "@/components/geistdocs/footer"; -import { Navbar } from "@/components/geistdocs/navbar"; import { GeistdocsProvider } from "@/components/geistdocs/provider"; -import { basePath } from "@/geistdocs"; +import { config } from "@/lib/geistdocs/config"; import { mono, sans } from "@/lib/geistdocs/fonts"; import { cn } from "@/lib/utils"; -import { translations } from "@/geistdocs"; import type { Metadata } from "next"; export const metadata: Metadata = { @@ -14,7 +13,7 @@ export const metadata: Metadata = { }; export const generateStaticParams = async () => { - const langs = Object.keys(translations); + const langs = Object.keys(config.translations ?? {}); return langs.map((lang) => ({ lang })); }; @@ -29,11 +28,11 @@ const Layout = async ({ children, params }: LayoutProps<"/[lang]">) => { suppressHydrationWarning > - - + + {children} {shouldInjectToolbar && } -