jatui

VideoPlayer

One video surface: waveform scrubber, chapters, diarized speakers, bookmarks and transcript — every intelligence prop optional

Everything on

Scroll over the band to zoom (double-click or Esc resets); scroll over the video for volume (Shift + scroll seeks). Hover a legend chip to raise that speaker on the timeline, click it to solo, and use the speaker icon to skip them. Chapter flags sit on the top edge, bookmark diamonds on the bottom.

0:00 0:10

No waveform — the speaker lane takes over

Without an envelope the band falls back to a flat rail, and the slim lane beneath it carries who-spoke-when. Only ever one speaker surface, never two stacked strips saying the same thing.

0:00 0:00

Bare mp4 — no intelligence data at all

Every extra prop is optional. With none of them you still get the band as a real scrubber (hover for time, click to seek, arrows to step) plus wheel volume and the keyboard map.

0:00 0:00

Side transcript

0:00 0:10

Presentation mode — aspect-lock + autoplay + loop

The same component is the presentation primitive: aspect locks the stage box from the first frame (poster convention — the poster fills the ratio until the first frame decodes), autoplay starts it muted (honouring prefers-reduced-motion — under that preference it holds on the poster), and loop repeats it.

0:00 0:00

Props

PropTypeDefaultDescription
srcstringVideo URL (required)
posterstring | nullnullPoster frame
captionsSrcstring | nullnullVTT captions track
chaptersVideoChapter[][]Flags on the top edge; sections in the envelope; hover card titles
speakersVideoSpeakerTurn[][]Diarized turns — colour the envelope, or the fallback lane
transcriptVideoTranscriptSegment[][]Transcript pane + "what's being said here" on hover
bookmarksVideoBookmark[][]Diamonds on the bottom edge
waveformVideoWaveform | nullnullAudio envelope; peaks normalise against their own max
talkTimeVideoSpeakerTalkTime[][]Precomputed totals; derived from turns/transcript when omitted
startAtnumber | nullnullSeek here once metadata lands
transcriptPosition'below' | 'side''below'Transcript beneath, or beside on wide viewports
onTimeUpdate(video) => voidEvery timeupdate tick (watch-progress reporting)
onAddBookmark(sec, label) => voidPresent ⇒ renders the add-bookmark control
onBookmarkContext(sec, existing, x, y) => voidRight-click on the band; the host owns the panel

Keyboard

  • Space / K — play / pause
  • / J L — seek ±5s (Shift for ±10s)
  • — volume ±5%, M — mute
  • Home / End — jump to start / end
  • Band focused: arrows seek, Esc resets zoom