Skip to main content
This file owns the layer above Props for the async-media + live-collaboration family: the recorder (VeltRecorderControlPanel, VeltRecorderPlayer, and the VeltRecorderTool / VeltRecorderNotes siblings), the media surfaces (VeltVideoPlayer, VeltVideoEditor), and the live surfaces (VeltHuddle, VeltUserInviteTool). For each component below you get what every prop does at runtime, its default, and how it combines with the others, plus the default behaviors you get with no prop at all. For the cross-component default table and prop-interaction matrix that spans the whole SDK, see Behaviors. These components share two recurring mechanics, documented once here:
  • Boolean → string attribute conversion. The React wrappers convert a boolean prop to the string 'true' / 'false' only when the value is literally true or false ([true, false].includes(value) ? (value ? 'true' : 'false') : undefined); any other value (including undefined) leaves the attribute unset, so the element keeps its own default. The underlying element setters then JSON.parse the string back to a boolean. Net effect: omitting a boolean prop = “use the element/service default”, not “false”.
  • Feature-service backing. Recorder and huddle boolean props don’t hold local state: they flip a process-wide BehaviorSubject on a feature service (e.g. enableRecordingCountdown() / disableRecordingCountdown()). That subject carries the real default, and because it is shared, the last component to set it wins if you mount two control panels with different values. Those service defaults are the “Default” column below.

Per-prop behavior (exhaustive)

The exhaustive per-prop behavior for the async-media + live-collaboration family is organized per component below: each ## Velt… subsection carries that component’s full prop table (default + runtime behavior + interactions) and its own ### Default behaviors (no prop needed) block (sibling tools are folded into their parent’s subsection). Every prop in Props for these components is covered; see Provable coverage.

VeltRecorderControlPanel

The control panel is the recording UI: it drives device selection, the countdown, the live recording session, pause/resume, and the post-recording hand-off (preview, editor, transcription). Its layout is chosen by mode; every other prop toggles a recorder feature-service flag.

Default behaviors (no prop needed)

  • Layout: floating control panel (mode defaults to 'floating').
  • Countdown + transcription on: the pre-record countdown and speech-to-text transcription are both enabled by default (their service subjects default true). This is the one place the recorder defaults are “on, opt out” rather than “off, opt in”.
  • Editor off: no video editor, no auto-open, no retake, no timeline preview, no PiP: all default false. Settings open as a modal (settingsEmbedded false).
  • No duration cap: recording continues until the user stops it (maxRecordingLength is null).
  • No completion callback: with no onRecordedData, the recording completes and is stored, but nothing is handed back to your code.

VeltRecorderPlayer

The player renders a finished recording (the one identified by recorderId): preview thumbnail, playback, transcription/summary, optional edit + delete. Several of its booleans share the same recorder feature-service flags as the control panel.

Default behaviors (no prop needed)

  • Needs a recorderId: with none, the player is an empty shell and logs that the id is required.
  • Summary shown: both summary gates default 'true', so a summary renders: provided the recording has a transcript (which requires recordingTranscription to have been on at record time). No transcript → nothing to summarize.
  • Shadow-DOM isolated (shadowDom true) and click-to-play preview on (playbackOnPreviewClick true).
  • Editor / retake / fullscreen off unless enabled (the editor follows the shared recorder-service flag, default off).
  • Delete control present but inert until you supply onDelete.

VeltRecorderTool & VeltRecorderNotes (siblings)

  • VeltRecorderTool: the button that starts a recording, bound to a panel via panelId. Its recordingCountdown, retakeOnVideoEditor, pictureInPicture, and maxLength flip the same recorder/PiP service flags documented above (same defaults). shadowDom defaults true; darkMode defaults off (the string "false" is treated as off). variant picks the named tool wireframe (...-wireframe---<variant>, falling back to base). buttonLabel sets the button text. type (RecorderMode, default 'video') selects the capture mode: 'audio' / 'video' / 'screen' start that mode directly; 'all' shows a dropdown of all three; a comma-separated string (e.g. 'audio, video') is split into a types array and rendered as a dropdown limited to those options (internally the type is set to 'all').
  • VeltRecorderNotes: a notes-oriented recorder surface; its shadowDom, videoEditor, recordingCountdown, recordingTranscription, playVideoInFullScreen, and videoEditorTimelinePreview props behave identically to the control-panel props of the same name (same shared service flags and defaults).

VeltVideoPlayer

A collaborative video player for an arbitrary src (not a Velt recording): playback controls plus an optional timestamped comment tool and an optional cross-collaborator playback sync. Comment markers render on the timeline (VeltCommentPlayerTimeline).

Default behaviors (no prop needed)

  • Plays the src with full controls (play/pause, scrub, volume, speed, fullscreen) in light theme.
  • Comment tool on: users can drop timestamped comments by default; markers show on the timeline. Sync is off: playback is local to each viewer.
  • Timeline shadow-DOM isolated (shadowDom true).

VeltVideoEditor

A standalone/embedded editor for a recording supplied as a blob or url (or resolved from an annotation): trim, zoom (scale), split/cut, optional retake, then Apply to write the edit back.

Default behaviors (no prop needed)

  • Needs a source: a standalone editor renders nothing useful without blob or url; an embedded editor needs annotationId/recorderId.
  • Mode: 'standalone' unless annotationId/recorderId is set (then 'embed').
  • Editing tools: trim and zoom (scale) are available, split/cut is enabled, Apply and Delete controls render. Default zoom factor is 1.5×, max 3×, with preset steps [1, 1.25, 1.5, 1.75, 2, 2.5, 3]. This reference documents the discrete tools, but not the exact default-active section composition in the empty toolbar; the section arrays start empty and are populated at runtime.
  • Retake hidden unless the bound recorder enables it (showRetakeButton defaults false).
  • Light theme and base wireframe (no variant).

VeltHuddle

The live audio/video huddle surface: renders participant streams and screen share, with optional in-huddle chat and follow (“flock”) mode. Huddle booleans flip shared huddle-service flags.

Default behaviors (no prop needed)

  • Chat on, server fallback on, flock off: note the asymmetry: chat and serverFallback default true, only flockModeOnAvatarClick defaults false. (This corrects the intuitive “all flags off” assumption.)
  • No active media until joined: the huddle renders participant slots, but audio/video transmission begins only after a user joins via the huddle tool. Screen share renders when active.
  • Re-join on refresh: the tool re-joins a prior session automatically if the user was in a huddle before reload.

VeltHuddleTool (sibling)

The button that starts/joins a huddle. type (default 'audio'; allowed 'audio' | 'video' | 'presentation' | 'all') sets what the first click starts: 'audio' audio-only, 'video' audio+video, 'presentation' audio+screenshare, 'all' everything; if a huddle is already running, clicking joins the existing huddle with its type instead. Screen-share modes require navigator.mediaDevices.getDisplayMedia support. darkMode (default off; "false" parses to off) toggles the dark theme by adding/removing the dark attribute.

VeltUserInviteTool

The button + dialog for inviting/sharing access to a document: an email autocomplete input, an optional role (access-control) dropdown, an optional list of people already on the document, and a copy-link affordance.

Default behaviors (no prop needed)

  • type is 'share': share icon, share-style dialog.
  • Both dialog sections on: the access-control dropdown and the document-user list both default true, so the dialog shows role selection and existing members (the member list still requires the document to have users).
  • Dialog text defaults come from the dialog component ('Share project' title, 'Add email address' placeholder) when the props are omitted.
  • Copy-link uses the current page (window.location.href) when inviteUrl is unset.
  • Light theme, and the tool is enabled (disabled defaults false).

Default behaviors (no prop needed)

Each component’s zero-prop baseline is documented in its ### Default behaviors (no prop needed) block above. In brief:
  • Control panel: opens as a floating layout with the pre-record countdown and transcription on (the one “on, opt out” corner); editor/auto-open/retake/timeline-preview/PiP all off; no duration cap; no completion callback.
  • Player: needs a recorderId, shows the summary when a transcript exists, click-to-play, shadow-DOM isolated; editor/retake/fullscreen off.
  • VeltVideoPlayer: plays its src with the comment tool on and sync off.
  • VeltVideoEditor: 'standalone' (needs blob/url) unless an annotationId/recorderId flips it to 'embed'; light theme; retake hidden unless the recorder enables it.
  • VeltHuddle: chat on and server-fallback on by default, flock off.
  • VeltUserInviteTool: defaults type: 'share' with both the access-control dropdown and document-user list on; copy-link uses the current page.

Prop-interaction matrix

No separate multi-prop matrix for this group: pairwise effects live in each prop’s Interactions & gotchas column above. The cross-prop rules to restate: recorder/huddle boolean props flip shared feature-service BehaviorSubjects, so if two panels/tools set the same flag the last setter wins; videoEditor gates autoOpenVideoEditor / retakeOnVideoEditor / videoEditorTimelinePreview (they no-op without it); on the player, the summary renders only when showSummary AND summary are both truthy; VeltRecorderTool/VeltRecorderNotes share the same service flags (and defaults) as the control panel; and a recording’s summary depends on recordingTranscription having been on at record time.

Positioning & composition

These surfaces are statically placed: you mount the players, editor, huddle, and invite/recorder tools in your own layout and control their position. The two anchored notes: the recorder control panel’s mode: 'floating' renders an expandable floating control panel (Velt-managed chrome, still mounted in your tree), and reactions/comments produced on a video timeline are anchored to media-timeline position rather than the page. See the anchored-vs-static classification in Component definitions and Behaviors → Positioning ownership.

Provable coverage

Counted against Props ### VeltRecorderControlPanel / ### VeltRecorderPlayer / ### VeltVideoPlayer / ### VeltVideoEditor / ### VeltHuddle / ### VeltUserInviteTool:
  • VeltRecorderControlPanel: 13/13: mode, panelId, onRecordedData, recordingCountdown, recordingTranscription, videoEditor, settingsEmbedded, autoOpenVideoEditor, playVideoInFullScreen, retakeOnVideoEditor, pictureInPicture, maxLength, videoEditorTimelinePreview. (props.md lists 13 rows; “~14” estimate included.)
  • VeltRecorderPlayer: 9/9: recorderId, onDelete, showSummary (deprecated, counted inline), summary, shadowDom, videoEditor, playVideoInFullScreen, retakeOnVideoEditor, playbackOnPreviewClick. (props.md lists 9 rows; “~10” estimate included.) Plus the VeltRecorderTool / VeltRecorderNotes sibling props from the props.md note, covered in the sibling subsection.
  • VeltVideoPlayer: 5/5: src, darkMode, sync, commentTool, shadowDom. (props.md lists 5 rows; “~6” estimate included.)
  • VeltVideoEditor: 6/6: darkMode, variant, blob, url, annotationId, recorderId. (props.md lists 6 rows; “~7” estimate included.)
  • VeltHuddle: 3/3: chat, flockModeOnAvatarClick, serverFallback. (props.md lists 3 rows; “~4” estimate included.) Plus VeltHuddleTool (type, darkMode) in the sibling subsection.
  • VeltUserInviteTool: 8/8: type, source, title, placeholder, inviteUrl, accessControlDropdown, documentUserAccessList, darkMode (the deprecated hideAccessControlDropdown is documented inline under accessControlDropdown). (props.md lists 8 rows; “~9” estimate included.)
Coverage note: the exact set of VeltVideoEditor toolbar sections enabled in the empty default toolbar is not documented here; the section arrays initialize empty and are populated at runtime. The discrete tools: trim, zoom/scale, split, apply, delete: are covered.