-
+ }
+ />
),
}))}
onSelect={(pane) => setActive(pane.id as TabKey)}
diff --git a/apps/website/src/components/solutions/SolutionDemoBlock.tsx b/apps/website/src/components/solutions/SolutionDemoBlock.tsx
index 3fbf1fe2a..85c803e96 100644
--- a/apps/website/src/components/solutions/SolutionDemoBlock.tsx
+++ b/apps/website/src/components/solutions/SolutionDemoBlock.tsx
@@ -3,7 +3,7 @@ import { tokens } from '@threadplane/design-tokens';
import { Container } from '../ui/Container';
import { Section } from '../ui/Section';
import { Eyebrow } from '../ui/Eyebrow';
-import { BrowserFrame } from '../ui/BrowserFrame';
+import { ClipPlayer } from '../ui/ClipPlayer';
import type { DemoClip } from '../../lib/demo-media';
/**
@@ -53,27 +53,7 @@ export function SolutionDemoBlock({ clip, accent }: { clip: DemoClip; accent: st
{clip.caption}
-
-
- {/*
- Silent, decorative loop. `aria-label` rather than captions: there
- is no audio track and no narration to caption, and the prose
- above already states what the clip shows.
- */}
-
-
-
+
+
+
+ {overlay}
+
+
+ );
+}
diff --git a/apps/website/src/lib/demo-media.ts b/apps/website/src/lib/demo-media.ts
index 44fcd10a2..940aecc45 100644
--- a/apps/website/src/lib/demo-media.ts
+++ b/apps/website/src/lib/demo-media.ts
@@ -41,8 +41,8 @@ export const HITL_CLIP: DemoClip = {
/**
* The LangGraph streaming demo, recorded on the canonical demo shell. Exported
- * so the section switcher does not add another hardcoded copy of these URLs.
- * `DemoShowcase` still declares its own; consolidating it is tracked separately.
+ * Shared by the homepage showcase and the section switcher, so a recut or a
+ * store move changes one place rather than three.
*/
export const LANGGRAPH_CLIP: DemoClip = {
caption: 'Tokens stream into the Angular surface as the agent produces them.',
@@ -52,6 +52,18 @@ export const LANGGRAPH_CLIP: DemoClip = {
poster: `${DEMO_CDN}/langgraph-demo-poster.webp`,
};
+/**
+ * The AG-UI runtime demo. Paired with `LANGGRAPH_CLIP` so the homepage showcase
+ * can state "same front end, two runtimes" from one place.
+ */
+export const AG_UI_CLIP: DemoClip = {
+ caption: 'The same Threadplane chat surface, running against an AG-UI backend.',
+ url: 'ag-ui.threadplane.ai',
+ videoMp4: `${DEMO_CDN}/ag-ui-demo.mp4`,
+ videoWebm: `${DEMO_CDN}/ag-ui-demo.webm`,
+ poster: `${DEMO_CDN}/ag-ui-demo-poster.webp`,
+};
+
/**
* Generative UI: the agent emits a json-render spec and the demo mounts it as
* real Angular components. Recorded by