Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/app/[lang]/(home)/components/cta.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Link from 'next/link';
import { Button } from '@/components/ui/button';
import { Button } from '@vercel/geistdocs/components/button';

export const CTA = () => (
<section className="px-8 sm:px-12 py-10 flex flex-col md:flex-row md:items-center md:justify-between gap-4">
Expand Down
2 changes: 1 addition & 1 deletion docs/app/[lang]/(home)/components/hero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
} from '@/components/ui/command-prompt';

const COMMAND_FOR_HUMANS = 'npm install workflow';
const COMMAND_FOR_AGENTS = 'npx skills add vercel/workflow@workflow-init';
const COMMAND_FOR_AGENTS = 'npx skills add vercel/workflow';

type HeroProps = {
title: string;
Expand Down
4 changes: 2 additions & 2 deletions docs/app/[lang]/(home)/components/preview-badge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import { CheckIcon, CopyIcon, ExternalLinkIcon, EyeIcon } from 'lucide-react';
import { useState } from 'react';
import { toast } from 'sonner';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Button } from '@vercel/geistdocs/components/button';
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from '@/components/ui/dialog';
} from '@vercel/geistdocs/components/dialog';

type PreviewBadgeProps = {
deploymentUrl: string;
Expand Down
2 changes: 1 addition & 1 deletion docs/app/[lang]/(home)/components/run-anywhere.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Link from 'next/link';
import type { ComponentProps } from 'react';
import { CodeBlock } from '@/app/[lang]/(home)/components/code-block';
import { Button } from '@/components/ui/button';
import { Button } from '@vercel/geistdocs/components/button';
import { cn } from '@/lib/utils';

const DigitalOcean = (props: ComponentProps<'svg'>) => (
Expand Down
2 changes: 1 addition & 1 deletion docs/app/[lang]/(home)/components/templates/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Image from 'next/image';
import Link from 'next/link';
import { Button } from '@/components/ui/button';
import { Button } from '@vercel/geistdocs/components/button';
import { examplesRepositoryUrl } from '@/geistdocs';
import { cn } from '@/lib/utils';
import Flight from './flight-v2.png';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { JSX } from 'react';
import { cn } from '@/lib/utils';
import { useState, useEffect, useRef } from 'react';
import { AnimatePresence, motion, useInView } from 'motion/react';
import { Spinner } from '@/components/ui/spinner';
import { Spinner } from '@vercel/geistdocs/components/spinner';

export function DowntimeVisual(): JSX.Element {
return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Link from 'next/link';
import type { JSX, ReactNode } from 'react';

import { Button } from '@/components/ui/button';
import { Button } from '@vercel/geistdocs/components/button';
import { AgentsVisual } from './agents-visual';
import { AiSdkVisual } from './ai-sdk-visual';
import { O11yVisual } from './o11y-visual';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Link from 'next/link';
import type { JSX } from 'react';
import { Button } from '@/components/ui/button';
import { Button } from '@vercel/geistdocs/components/button';
import { O11yDashboard } from './o11y-dashboard';

export function VercelSection(): JSX.Element {
Expand Down
8 changes: 8 additions & 0 deletions docs/app/[lang]/.well-known/mcp.json/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { createMcpManifestRoute } from '@vercel/geistdocs/routes/mcp';
import { config } from '@/lib/geistdocs/config';

export const { GET, generateStaticParams, revalidate } = createMcpManifestRoute(
{
config,
}
);
6 changes: 6 additions & 0 deletions docs/app/[lang]/agents.md/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { createAgentsRoute } from '@vercel/geistdocs/routes/agents';
import { config } from '@/lib/geistdocs/config';

export const { GET, generateStaticParams, revalidate } = createAgentsRoute({
config,
});
172 changes: 43 additions & 129 deletions docs/app/[lang]/cookbook/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,135 +1,49 @@
import { Step, Steps } from 'fumadocs-ui/components/steps';
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
import { createRelativeLink } from 'fumadocs-ui/mdx';
import type { Metadata } from 'next';
import { notFound } from 'next/navigation';
import type { ComponentProps } from 'react';
import {
rewriteCookbookUrl,
rewriteCookbookUrlsInText,
} from '@/lib/geistdocs/cookbook-source';
import { MobileDocsBar } from '@/components/geistdocs/mobile-docs-bar';
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 type { ComponentProps, ComponentType } from 'react';
import { getMDXComponents } from '@/components/geistdocs/mdx-components';
import { OpenInChat } from '@/components/geistdocs/open-in-chat';
import { ScrollTop } from '@/components/geistdocs/scroll-top';
import { Badge } from '@/components/ui/badge';
import { Separator } from '@/components/ui/separator';
import { getLLMText, getPageImage, source } from '@/lib/geistdocs/source';

const Page = async ({ params }: PageProps<'/[lang]/cookbook/[[...slug]]'>) => {
const { slug, lang } = await params;

// Prepend 'cookbook' to resolve from the docs source
const resolvedSlug = slug ? ['cookbook', ...slug] : ['cookbook'];
const page = source.getPage(resolvedSlug, lang);

if (!page) {
notFound();
}

const publicUrl = rewriteCookbookUrl(page.url);
const publicPage = { ...page, url: publicUrl } as typeof page;

const markdown = rewriteCookbookUrlsInText(await getLLMText(page));
const MDX = page.data.body;

const RelativeLink = createRelativeLink(source, publicPage);
const PublicCookbookLink = (props: ComponentProps<typeof RelativeLink>) => {
const href =
typeof props.href === 'string'
? rewriteCookbookUrl(props.href)
: props.href;
return <RelativeLink {...props} href={href} />;
};

return (
<DocsPage
full={page.data.full}
tableOfContent={{
style: 'clerk',
footer: (
<div className="my-3 space-y-3">
<Separator />
<EditSource path={page.path} />
<ScrollTop />
<Feedback />
<CopyPage text={markdown} />
<AskAI href={publicUrl} />
<OpenInChat href={publicUrl} />
</div>
),
}}
tableOfContentPopover={{ enabled: false }}
toc={page.data.toc}
>
<MobileDocsBar toc={page.data.toc} />
<DocsTitle>{page.data.title}</DocsTitle>
<DocsDescription>{page.data.description}</DocsDescription>
<DocsBody>
<MDX
components={getMDXComponents({
a: PublicCookbookLink,
Badge,
Step,
Steps,
Tabs,
Tab,
})}
/>
</DocsBody>
</DocsPage>
);
};

export const generateStaticParams = () => {
// Generate params for all cookbook pages
const allParams = source.generateParams();
return allParams
.filter((p) => Array.isArray(p.slug) && p.slug[0] === 'cookbook')
.map((p) => ({
...p,
slug: (p.slug as string[]).slice(1), // Remove 'cookbook' prefix
}));
};

export const generateMetadata = async ({
params,
}: PageProps<'/[lang]/cookbook/[[...slug]]'>) => {
const { slug, lang } = await params;
const resolvedSlug = slug ? ['cookbook', ...slug] : ['cookbook'];
const page = source.getPage(resolvedSlug, lang);

if (!page) {
notFound();
}

const publicPath = rewriteCookbookUrl(page.url);

const metadata: Metadata = {
title: page.data.title,
description: page.data.description,
openGraph: {
images: getPageImage(page).url,
},
import { config } from '@/lib/geistdocs/config';
import { rewriteCookbookUrl } from '@/lib/geistdocs/cookbook-source';
import { cookbookSource } from '@/lib/geistdocs/source';

const docsPage = createDocsPage({
config,
source: cookbookSource,
mdx: ({ link }) => getMDXComponents({ a: link }),
resolveLink: ({ link }) => {
const Link = link as ComponentType<ComponentProps<'a'>>;
const PublicCookbookLink = (props: ComponentProps<'a'>) => {
const href =
typeof props.href === 'string'
? rewriteCookbookUrl(props.href)
: props.href;

return <Link {...props} href={href} />;
};

return PublicCookbookLink;
},
openGraph: {
images: true,
},
tableOfContentPopover: {
enabled: false,
},
renderTop: ({ data }) => <MobileDocsBar toc={data.toc} />,
metadata: ({ metadata, page }) => ({
...metadata,
alternates: {
canonical: publicPath,
...metadata.alternates,
canonical: page.url,
types: {
'text/markdown': `${publicPath}.md`,
...metadata.alternates?.types,
'text/markdown':
page.url === '/cookbook' ? '/cookbook.md' : `${page.url}.md`,
},
},
};

return metadata;
};
}),
});

export default Page;
export default docsPage.Page;
export const generateStaticParams = docsPage.generateStaticParams;
export const generateMetadata = docsPage.generateMetadata;
8 changes: 7 additions & 1 deletion docs/app/[lang]/cookbook/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { DocsLayout } from '@/components/geistdocs/docs-layout';
import { getCookbookTree } from '@/lib/geistdocs/cookbook-source';
import { LATEST_VERSION } from '@/lib/geistdocs/versions';

const Layout = async ({
children,
Expand All @@ -9,7 +10,12 @@ const Layout = async ({

return (
<div className="bg-background-100">
<DocsLayout tree={getCookbookTree(lang)}>{children}</DocsLayout>
<DocsLayout
currentVersion={LATEST_VERSION.id}
tree={getCookbookTree(lang)}
>
{children}
</DocsLayout>
</div>
);
};
Expand Down
Loading
Loading