Skip to main content
New to wireframes? Start with UI Customization Concepts and the Template Variables overview.

Overview

The Huddle feature powers real-time audio / video / screen-share huddle rooms. Variables below are available inside any <velt-huddle-...-wireframe> tag (or the per-attendee tile wireframes) via three forms:
You want to…UseExample
Display a value as text<velt-data field="var" /><velt-data field="componentConfig.huddleAttendees.length" />
Hide / show conditionallyvelt-if="{var}"velt-if="{componentConfig.meetingJoined}"
Toggle a CSS classvelt-class="'cls': {var}"velt-class="'in-huddle': {componentConfig.meetingJoined}"
This feature uses the flat-config access pattern — variables are referenced via the explicit componentConfig.<path> form. Each wireframe primitive carries its own componentConfigSignal — the root container, the tool button, and each per-attendee tile expose different variable sets (documented separately below).

Component Config — Huddle (root)

State on the <velt-huddle> root container. These variables describe the active huddle room and its attendees.
VariableTypeDescriptionExample
componentConfig.userUser | nullCurrently identified end-user.<velt-data field="componentConfig.user.name" />
componentConfig.meetingJoinedbooleanLocal user is currently in a huddle.velt-class="'in-huddle': {componentConfig.meetingJoined}"
componentConfig.isDraggingbooleanFloating huddle panel is being dragged.velt-class="'dragging': {componentConfig.isDragging}"
componentConfig.huddleCursorAvailableByAttendeeIdRecord<string, boolean>Per-attendee cursor stream is available.velt-class="'cursor-on': {componentConfig.huddleCursorAvailableByAttendeeId[attendee.userId]}"
componentConfig.localStreamMediaStream | nullLocal user’s media stream.velt-if="{componentConfig.localStream}"
componentConfig.localStreamState.audioStatebooleanLocal microphone is on.velt-class="'audio-on': {componentConfig.localStreamState.audioState}"
componentConfig.localStreamState.videoStatebooleanLocal camera is on.velt-class="'video-on': {componentConfig.localStreamState.videoState}"
componentConfig.localStreamState.screenSharingStatebooleanLocal screen-share is on.velt-class="'screen-on': {componentConfig.localStreamState.screenSharingState}"
componentConfig.huddleAttendeesAttendee[]Active attendees in the huddle.<velt-data field="componentConfig.huddleAttendees.length" />
componentConfig.remoteStreamsByUserIdRecord<string, Record<string, MediaStream>>Remote streams keyed by user id then stream id.Internal — not user-addressable.
componentConfig.localScreenSharingStreamMediaStream | nullLocal screen-share stream.velt-if="{componentConfig.localScreenSharingStream}"
componentConfig.screenSharing{ attendee?: Attendee; stream?: MediaStream } | nullActive remote screen-share, if any.velt-if="{componentConfig.screenSharing.stream}"
componentConfig.videoStateEnabledInPastByUserIdRecord<string, boolean>Whether each user has previously enabled video.velt-if="{componentConfig.videoStateEnabledInPastByUserId[attendee.userId]}"
componentConfig.peerConnectionStateMapByUserIdRecord<string, string>WebRTC peer-connection state per user.velt-class="'peer-{componentConfig.peerConnectionStateMapByUserId[attendee.userId]}': true"

Component Config — Huddle Tool

State on the <velt-huddle-tool> trigger button.
VariableTypeDescriptionExample
componentConfig.type'audio' | 'video' | 'presentation' | 'all'Which controls the tool exposes.velt-class="'tool-{componentConfig.type}': true"
componentConfig.screenSharingSupportedbooleanBrowser supports screen-sharing.velt-if="{componentConfig.screenSharingSupported}"
componentConfig.disabledbooleanTool is disabled by host configuration.velt-class="'is-disabled': {componentConfig.disabled}"
componentConfig.meetingJoinedbooleanLocal user is currently in a huddle.velt-class="'in-huddle': {componentConfig.meetingJoined}"
componentConfig.joinedHuddleToolComponentIdstring | nullId of the tool that owns the active huddle.velt-class="'is-active-tool': '{componentConfig.joinedHuddleToolComponentId} === {componentConfig.componentId}'"
componentConfig.positionsanyPer-attendee floating positions.Internal — used to compute inline style.
componentConfig.userUser | nullCurrently identified end-user.<velt-data field="componentConfig.user.name" />
componentConfig.huddleAttendeesAttendee[]Active attendees.<velt-data field="componentConfig.huddleAttendees.length" />
componentConfig.isFirstComponentbooleanTrue only on the first instance of the element on the page.velt-if="{componentConfig.isFirstComponent}"
componentConfig.bannerRemovedbooleanUser dismissed the join banner.velt-class="'banner-hidden': {componentConfig.bannerRemoved}"

Context-Specific Variables

The per-attendee tile primitives (<velt-audio-huddle-user-wireframe> and <velt-video-huddle-user-wireframe>) carry a per-attendee componentConfigSignal. These variables are only resolvable inside the tile wireframes.
VariableTypeAvailable inExample
componentConfig.attendeeAttendee<velt-audio-huddle-user-wireframe>, <velt-video-huddle-user-wireframe><velt-data field="componentConfig.attendee.name" />
componentConfig.streamMediaStreamSame tiles.velt-if="{componentConfig.stream}"
componentConfig.isLocalbooleanSame tiles.velt-class="'is-local': {componentConfig.isLocal}"
componentConfig.colorstringSame tiles. Avatar / accent colour for this attendee.Internal — used to compute inline style.
componentConfig.gainVolumenumberSame tiles. Audio gain level driving the speaking-ring animation.<velt-data field="componentConfig.gainVolume" />
The screen-share viewer (<velt-screen-sharing-huddle-wireframe>) reads componentConfig.screenSharing.stream and componentConfig.screenSharing.attendee from the root config.

Type Reference

Types referenced by the variables above:
TypeDescription
UserIdentified end-user object.
AttendeeActive huddle attendee record (userId, name, plus per-attendee state).
HuddleMessageA text message sent within a huddle’s in-call chat panel.

Subcomponents

Each subcomponent below has its own wireframe tag.

huddle-tool

The join / leave button + state controls customers place in their toolbar.
  • Public element: <velt-huddle-tool>
  • Wireframe tag: <velt-huddle-tool-wireframe>
PropertyValue
Extra variablesSee Component Config — Huddle Tool.

huddle (root container)

The huddle room container — renders attendees and the screen-share viewer.
  • Public element: <velt-huddle>
  • Wireframe tag: <velt-huddle-wireframe>
PropertyValue
Extra variablesSee Component Config — Huddle (root).
shouldShowRenders when componentConfig.meetingJoined === true.
<VeltHuddleWireframe velt-if="{componentConfig.meetingJoined}">
  <VeltAudioHuddleUserWireframe />
  <VeltVideoHuddleUserWireframe />
  <VeltScreenSharingHuddleWireframe
    velt-if="{componentConfig.screenSharing.stream}" />
  <VeltHuddleMenuPanelWireframe />
</VeltHuddleWireframe>

audio-huddle-user

Per-attendee tile for audio-only huddles. Renders a small avatar with a speaking ring.
  • Public element: <velt-audio-huddle-user>
  • Wireframe tag: <velt-audio-huddle-user-wireframe>
PropertyValue
Extra variablesPer-attendee componentConfig.attendee, stream, isLocal, color, gainVolume — see Context-Specific Variables.

video-huddle-user

Per-attendee tile for video huddles. Shows the live video feed.
  • Public element: <velt-video-huddle-user>
  • Wireframe tag: <velt-video-huddle-user-wireframe>
PropertyValue
Extra variablesSame per-attendee context as audio-huddle-user.

screen-sharing-huddle

The screen-share viewer.
  • Public element: <velt-screen-sharing-huddle>
  • Wireframe tag: <velt-screen-sharing-huddle-wireframe>
PropertyValue
Extra variablesNone at this level — read componentConfig.screenSharing.stream and componentConfig.screenSharing.attendee from the root config.
shouldShowRenders when componentConfig.screenSharing.stream is truthy.

huddle-menu-panel

In-huddle controls drawer (mute / unmute / video / screen / leave / settings).
  • Public element: <velt-huddle-menu-panel>
  • Wireframe tag: <velt-huddle-menu-panel-wireframe>
PropertyValue
Extra variablesNone beyond the root componentConfig (mute / video state read via componentConfig.localStreamState.*).

huddle-messages-panel

The text-chat panel inside the huddle.
  • Public element: <velt-huddle-messages-panel>
  • Wireframe tag: <velt-huddle-messages-panel-wireframe>
PropertyValue
Extra variablesNone beyond the root componentConfig.

Putting it together

A typical huddle room that swaps between the join trigger and the active room, shows a per-attendee video tile, and surfaces the screen-share viewer when one is active:
<VeltHuddleToolWireframe>
  <button
    className="my-huddle-trigger"
    velt-class="'is-disabled': {componentConfig.disabled}, 'is-active': {componentConfig.meetingJoined}">
    <span velt-if="!{componentConfig.meetingJoined}">Join huddle</span>
    <span velt-if="{componentConfig.meetingJoined}">Leave huddle</span>
  </button>
</VeltHuddleToolWireframe>

<VeltHuddleWireframe velt-if="{componentConfig.meetingJoined}">
  <div className="my-huddle-grid">
    <VeltVideoHuddleUserWireframe>
      <div className="my-tile" velt-class="'is-local': {componentConfig.isLocal}">
        <video />
        <span><velt-data field="componentConfig.attendee.name" /></span>
      </div>
    </VeltVideoHuddleUserWireframe>
  </div>

  <VeltScreenSharingHuddleWireframe
    velt-if="{componentConfig.screenSharing.stream}">
    <video />
    <span>
      <velt-data field="componentConfig.screenSharing.attendee.name" /> is sharing their screen
    </span>
  </VeltScreenSharingHuddleWireframe>

  <VeltHuddleMenuPanelWireframe />
</VeltHuddleWireframe>