diff --git a/apps/docs/.env.example b/apps/docs/.env.example index ae7d7891..68fb00e8 100644 --- a/apps/docs/.env.example +++ b/apps/docs/.env.example @@ -1,5 +1,12 @@ # AI Gateway API Key (optional - for AI chat) AI_GATEWAY_API_KEY="" +# Optional central Geistdocs chat proxy. When set, this is used instead of AI Gateway. +GEISTDOCS_CHAT_PROXY_URL="" +GEISTDOCS_CHAT_PROXY_TOKEN="" + # 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]/home/[code]/page.tsx b/apps/docs/app/[lang]/home/[code]/page.tsx index 3c0597fa..5691256a 100644 --- a/apps/docs/app/[lang]/home/[code]/page.tsx +++ b/apps/docs/app/[lang]/home/[code]/page.tsx @@ -1,9 +1,9 @@ +import { Button } from '@vercel/geistdocs/components/button'; import { generatePermutations } from 'flags/next'; import { FlagValues } from 'flags/react'; import { ArrowRight } from 'lucide-react'; import type { Metadata } from 'next'; import Link from 'next/link'; -import { Button } from '@/components/ui/button'; import { enableBannerFlag, enableDitheredHeroFlag, 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 && } -