diff --git a/web/app/about/page.tsx b/web/app/about/page.tsx index 2e6833d1..139f861f 100644 --- a/web/app/about/page.tsx +++ b/web/app/about/page.tsx @@ -6,7 +6,7 @@ import { HomePosterText } from '../../components/home/HomePosterText'; import { ScribbleUnderline } from '../../components/home/icons'; import { SiteFooter } from '../../components/SiteFooter'; import { SiteNav } from '../../components/SiteNav'; -import { HOME_OG_IMAGE_PATH, ogImage } from '../../lib/og-meta'; +import { DEFAULT_OG_IMAGE_PATH, ogImage } from '../../lib/og-meta'; import { absoluteUrl } from '../../lib/site'; import s from '../landing.module.css'; @@ -53,14 +53,14 @@ export const metadata: Metadata = { 'Communication infrastructure for software teams moving from human-centered tools to agent-centered engineering.', url: absoluteUrl('/about'), type: 'website', - images: [ogImage(HOME_OG_IMAGE_PATH, 'Agent Relay')], + images: [ogImage(DEFAULT_OG_IMAGE_PATH, 'Agent Relay')], }, twitter: { card: 'summary_large_image', title: 'Agent Relay', description: 'Communication infrastructure for software teams moving from human-centered tools to agent-centered engineering.', - images: [absoluteUrl(HOME_OG_IMAGE_PATH)], + images: [absoluteUrl(DEFAULT_OG_IMAGE_PATH)], }, }; diff --git a/web/app/flows/FlowExamples.tsx b/web/app/flows/FlowExamples.tsx new file mode 100644 index 00000000..1d8f6870 --- /dev/null +++ b/web/app/flows/FlowExamples.tsx @@ -0,0 +1,13 @@ +import type { ReactNode } from 'react'; +import { highlightCode } from '../../lib/syntax'; +import { flowExamples } from './flow-examples'; +import { FlowScriptCarousel } from './FlowScriptCarousel'; + +export async function FlowExamples({ introductoryCode }: { introductoryCode: ReactNode }) { + const examples = await Promise.all(flowExamples.map(async ({ code, ...example }, index) => ({ + ...example, + codeHtml: index === 0 ? '' : (await highlightCode(code, 'typescript')).codeHtml, + }))); + + return ; +} diff --git a/web/app/flows/FlowScriptCarousel.tsx b/web/app/flows/FlowScriptCarousel.tsx new file mode 100644 index 00000000..82437b8d --- /dev/null +++ b/web/app/flows/FlowScriptCarousel.tsx @@ -0,0 +1,86 @@ +'use client'; + +import { useId, useState, type ReactNode } from 'react'; +import Link from 'next/link'; +import { ArrowRight } from 'lucide-react'; +import s from './flows.module.css'; + +type Example = { + id: string; + label: string; + title: string; + description: string; + filename: string; + codeHtml: string; +}; + +export function FlowScriptCarousel({ examples, introductoryCode }: { + examples: Example[]; + introductoryCode: ReactNode; +}) { + const [active, setActive] = useState(0); + const id = useId(); + const example = examples[active]; + + return ( +
+
+
+

{active === 0 ? 'A Flow is a script that runs your agents.' : example.title}

+

+ {active === 0 + ? 'You write the steps in TypeScript: which agent does the work, what it should produce, and what to check before continuing.' + : example.description} +

+

+ When the flow runs, you've got a dependable, auditable script that babysits your agents for you. +

+
+ + + Explore the docs
+ +
+
+ + {example.filename} +
+
+ +
+ + {active === 0 ? introductoryCode : ( +
+              
+            
+ )} +
+
+
+
+

Explore use cases

+ {example.label} +
+ {examples.map((item, index) => ( + + ))} +
+
+
+ ); +} diff --git a/web/app/flows/IntegrationMarquee.tsx b/web/app/flows/IntegrationMarquee.tsx new file mode 100644 index 00000000..a3fd1ea4 --- /dev/null +++ b/web/app/flows/IntegrationMarquee.tsx @@ -0,0 +1,84 @@ +'use client'; + +import { useLayoutEffect, useRef, useState, type CSSProperties } from 'react'; +import Image from 'next/image'; +import { DatabaseBackup } from 'lucide-react'; +import { SiPostgresql, SiRedis, SiPosthog } from 'react-icons/si'; +import s from './flows.module.css'; + +function brand(name: string, slug: string) { + return { name, logo: }; +} + +const integrations = [ + brand('GitHub', 'github'), + brand('Linear', 'linear'), + brand('Slack', 'slack'), + brand('Jira', 'jira'), + brand('Notion', 'notion'), + brand('Stripe', 'stripe'), + brand('HubSpot', 'hubspot'), + brand('Intercom', 'intercom'), + { name: 'Postgres', logo: