LevelChatLevelChatDocs
SpeakerStage

Components

SpeakerStage

One hero tile + a thumbnail filmstrip — the canonical 'speaker view' layout.

SpeakerStage renders one large hero VideoTile with the remaining participants in a horizontal scrollable filmstrip. The hero auto-follows the dominant speaker; clicking a thumbnail pins focus on that participant until the next dominant change.

Install

pnpm add @levelchat/react-components @levelchat/web

Requirements

  • Reactreact and react-dom ^18 || ^19 (peer dependency).
  • LevelChat Web SDK@levelchat/web ^0.2.4 (peer dependency, wires hook-driven mode to the live Room).
  • Provider — wrap the tree in <LevelChatProvider> from @levelchat/web-react so hook-driven mode can subscribe to room events. Prop-driven demos work without it.
  • Styles — import the brand tokens + kit stylesheet exactly once at the app entry, before any kit component renders.

In Next.js (App Router), import the stylesheets at the top of your root layout:

TypeScript (TSX)
// app/layout.tsx
import '@levelchat/brand/tokens.css';
import '@levelchat/react-components/styles.css';

In Vite (or any plain React app), import them at the top of your entry module:

TypeScript (TSX)
// src/main.tsx
import '@levelchat/brand/tokens.css';
import '@levelchat/react-components/styles.css';

Basic usage

Hero fallback

When the active-speaker id is stale (a brief gap between SDK dominant-speaker events) or absent, the hero falls back to the first participant in the roster. The surface never goes blank. Pass renderTile to fully customize the hero + filmstrip tiles.

Props

PropTypeDefaultNotes
filmstripMaxnumber8Filmstrip cap; participants beyond this are trimmed from the strip.
includeLocalInFilmstripbooleanShow the local participant in the filmstrip alongside remotes.
cornerRadiusnumberCorner radius applied to the hero + filmstrip tiles.
renderTile(p, isActive, index) => ReactNodeCustom render for each tile (hero + filmstrip).
classNamestringContainer override.