diff --git a/src/components/docs/DocsArticlePage.astro b/src/components/docs/DocsArticlePage.astro index 894ed169..4280a091 100644 --- a/src/components/docs/DocsArticlePage.astro +++ b/src/components/docs/DocsArticlePage.astro @@ -9,6 +9,7 @@ import { DocsTableOfContents } from '@/components/DocsTableOfContents'; import { DocsPageDropdown } from '@/components/DocsPageDropdown'; import { Prose } from '@/components/Prose'; import { DocsLanding } from '@/components/docs/DocsLanding'; +import IntegrationResourceBar from '@/components/docs/IntegrationResourceBar.astro'; import { docsLandings } from '@/components/docs/docsLandings'; import { Icon, faPencil } from '@rivet-gg/icons'; import { sitemap } from '@/sitemap/mod'; @@ -17,6 +18,7 @@ import { findActiveTab, findPageForHref } from '@/lib/sitemap'; import { getContentSlugPath } from '@/lib/content-path'; import { productAccent } from '@/lib/product-accent'; import { getProductMetadata } from '@/sitemap/product-metadata'; +import { integrationFor } from '@/data/integrations'; import * as mdxComponents from '@/components/mdx'; import { jsonLdString } from '@/lib/jsonLd'; import { @@ -97,6 +99,9 @@ const slugPath = routeSlugOverride ?? getContentSlugPath(routeEntryId); const landing = docsLandings[entrySlugPath ?? '']; const isLanding = Boolean(landing); const fullPath = slugPath ? `${routePrefix}/${slugPath}/` : `${routePrefix}/`; +const integration = productId && tabId === 'integrations' && slugPath + ? integrationFor(productId, slugPath) + : undefined; const discovered = findActiveTab(fullPath, sitemap); const routeOwnedTab = productId && tabId ? sitemap.find((tab) => tab.href.replace(/\/$/, '') === `/${productId}/${tabId}`) @@ -222,6 +227,7 @@ const breadcrumbSchema = { )}

{title}

{description &&

{description}

} + {integration && }
diff --git a/src/components/docs/IntegrationResourceBar.astro b/src/components/docs/IntegrationResourceBar.astro new file mode 100644 index 00000000..87949500 --- /dev/null +++ b/src/components/docs/IntegrationResourceBar.astro @@ -0,0 +1,40 @@ +--- +import { Icon, faGithub } from '@rivet-gg/icons'; +import type { Integration } from '@/data/integrations'; + +interface Props { + integration: Integration; +} + +interface ResourceLink { + label: string; + href: string; +} + +const { integration } = Astro.props; +const links: ResourceLink[] = []; +if (integration.exampleUrl) { + links.push({ label: 'Complete example', href: integration.exampleUrl }); +} +links.push({ label: 'Integration source', href: integration.sourceUrl }); +--- + + diff --git a/src/data/integrations.ts b/src/data/integrations.ts index a5a35bb4..98f5c4fe 100644 --- a/src/data/integrations.ts +++ b/src/data/integrations.ts @@ -20,6 +20,8 @@ export interface Integration extends SeoOverrides { category: string; icon: { src: string }; badge?: string; + exampleUrl?: string; + sourceUrl: string; } const ACTORS: Integration[] = [ @@ -30,6 +32,8 @@ const ACTORS: Integration[] = [ category: "Agents", icon: { src: "/images/vendors/flue.svg" }, badge: "Beta", + exampleUrl: "https://github.com/rivet-dev/agentos/tree/main/examples/flue", + sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/flue", }, { title: "Vercel Eve", @@ -38,6 +42,9 @@ const ACTORS: Integration[] = [ category: "Agents", icon: { src: "/images/vendors/eve.svg" }, badge: "Beta", + exampleUrl: + "https://github.com/rivet-dev/agentos/tree/main/examples/vercel-eve", + sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/eve", }, { title: "Workflow SDK", @@ -46,13 +53,19 @@ const ACTORS: Integration[] = [ category: "Workflows", icon: { src: "/images/vendors/workflow.svg" }, badge: "Beta", + exampleUrl: + "https://github.com/rivet-dev/rivet/tree/main/examples/workflow-sdk", + sourceUrl: + "https://github.com/rivet-dev/rivet/tree/main/integrations/workflow-world", }, { title: "Durable Streams", - description: "Real-time streams with durable, replayable history, backed by Rivet Actors.", + description: + "Real-time streams with durable, replayable history, backed by Rivet Actors.", slug: "durable-streams", category: "Streams", icon: { src: "/images/vendors/durable-streams.svg" }, + sourceUrl: "https://github.com/rivet-dev/rivet-durable-streams", }, ]; @@ -64,6 +77,8 @@ const AGENTOS: Integration[] = [ category: "Frameworks", icon: { src: "/images/vendors/flue.svg" }, badge: "Beta", + exampleUrl: "https://github.com/rivet-dev/agentos/tree/main/examples/flue", + sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/flue", }, { title: "Vercel Eve", @@ -72,6 +87,9 @@ const AGENTOS: Integration[] = [ category: "Frameworks", icon: { src: "/images/vendors/eve.svg" }, badge: "Beta", + exampleUrl: + "https://github.com/rivet-dev/agentos/tree/main/examples/vercel-eve", + sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/eve", }, { title: "Rivet Actors", @@ -79,6 +97,10 @@ const AGENTOS: Integration[] = [ slug: "rivet-actors", category: "Platform", icon: { src: "/images/vendors/rivet.svg" }, + exampleUrl: + "https://github.com/rivet-dev/agentos/tree/main/examples/quickstart-app", + sourceUrl: + "https://github.com/rivet-dev/agentos/tree/main/packages/agentos", }, ]; @@ -92,6 +114,15 @@ export function integrationsFor(productId: string): Integration[] { return INTEGRATIONS[productId] ?? []; } +export function integrationFor( + productId: string, + slug: string, +): Integration | undefined { + return integrationsFor(productId).find( + (integration) => integration.slug === slug, + ); +} + /** * Integrations sidebar for a product: an Overview entry, then one section per * category in first-seen order. diff --git a/src/styles/main.css b/src/styles/main.css index e830ece8..351258e0 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -504,7 +504,7 @@ flex-shrink: 0; width: 1.05rem; height: 1.05rem; - margin-top: 0.2rem; + margin-top: 0.375rem; } .mdx-callout__body { min-width: 0;