Skip to main content
Source of truth: exhaustive for what it covers. Generated from Velt variable metadata. If a name isn’t on this page, it doesn’t exist: a {token} not listed for its component resolves to undefined. Never invent or guess a name; use only identifiers that appear verbatim here or that you verified against ground truth and added here. Scope: exhaustive per component for comments + notifications + core; out-of-scope component areas (video-editor, single-editor-mode, media-source-settings, audio-waveform, user-avatar) are not catalogued, and a few non-comment/-notification components (Recorder, Huddle, Presence, View) are listed for completeness but only spot-corrected, not re-enumerated.
Every {…} token you can read inside a wireframe, organized by component, with an example usage for each. For the token syntax (operators, nesting) see Wireframe tokens. Buckets: app (per-user) Β· data (per-annotation) Β· ui (per-instance) Β· feature (SDK-config flags) Β· iteration (loop-scoped). πŸ”‘ = boolean/state flag most useful in velt-if / velt-class. Two access models:
  • Structured features (Comment Dialog, Comment Bubble, Inline Comments Section, Multi-Thread Dialog, Activity Log, Comments Tool, Sidebar Button, Notifications): short names work ({annotation}, {darkMode}); full paths ({appState.user}, {featureState.enableResolve}, {uiState.…}) also valid.
  • Flat-config features (Text Comment, Autocomplete, Sidebar, Reactions, Cursor, Presence, Huddle, Recorder, Transcription, View, Area, Arrow, Selection, Rewriter): read as {componentConfig.<x>}; for name collisions (disabled, darkMode, variant, user, annotation) use the full path.
Resolution rule: a name not in the map falls through to componentConfig.<name>; an unknown name resolves to undefined. If a token shows nothing, check (a) spelling, (b) you’re in a slot that receives it, (c) flat vs structured path.
Generated from the SDK and exhaustive per component. If a name isn’t listed for a component, it isn’t available there. For the nested-access root list and operators, see Wireframe tokens.

Comment Dialog

nametypebucketmeaningexampleπŸ”‘
userobjectappcurrent end-user (nested OK)veltIf="{user.userId} === {annotation.from.userId}"
isUserAdminboolappadmin privilegesveltIf="{isUserAdmin}"πŸ”‘
isKnownUserboolappidentified vs anonymousveltIf="!{isKnownUser}"πŸ”‘
repliesUniqueUsersarrayappdistinct reply authorsNone
annotationobjectdatathe dialog’s annotation<VeltData field="annotation.annotationNumber"/>
annotation.status.id / .namestringdatastatus id / labelveltIf="{annotation.status.id} === 'OPEN'"πŸ”‘
annotation.priority.id / .namestringdatapriority id / labelveltClass="'urgent': {annotation.priority.id} === 'URGENT'"πŸ”‘
annotation.from.userId / .namestringdataauthor<VeltData field="annotation.from.name"/>
annotation.comments.lengthnumberdatathread size<VeltData field="annotation.comments.length"/>
annotation.assignedToobjectdataassignee (undefined = none)veltIf="!{annotation.assignedTo}"πŸ”‘
annotation.resolvedByUser.namestringdataresolver name<VeltData field="annotation.resolvedByUser.name"/>
annotation.context.<key>objectdatayour attached context<VeltData field="annotation.context.label"/>
annotation.agentobjectdataAI-agent author (present β†’ agent suggestion card)veltIf="{annotation.agent}"πŸ”‘
annotation.sourceTypestringdata'agent' when agent-authoredveltIf="{annotation.sourceType} === 'agent'"πŸ”‘
annotation.type / annotation.commentTypestringdata'suggestion' discriminator for agent suggestionsveltIf="{annotation.type} === 'suggestion'"πŸ”‘
annotation.suggestion.statusstringdataresolved state ('accepted'/'rejected'; absent = pending)veltIf="{annotation.suggestion.status} === 'accepted'"πŸ”‘
annotation.suggestion.resolvedBy.namestringdatawho accepted/rejected the suggestion<VeltData field="annotation.suggestion.resolvedBy.name"/>
annotation.suggestion.resolvedAtnumberdataresolution timestampNone
agentNamestringdataagent display name (annotation.agent.agentName)<VeltData field="agentName"/>
agentAvatarstringdataagent avatar URL (truthiness β†’ has-avatar)veltIf="{agentAvatar}"πŸ”‘
agentResultTitlestringdataagent result title (annotation.agent.result.title)<VeltData field="agentResultTitle"/>
commentAnnotation / commentAnnotationsobject/arraydataaliases of annotation(s)None
comment / commentObjobjectdataper-comment (thread-card scope)<VeltData field="comment.from.name"/>
annotations / allAnnotationsarraydatain-scope / unfilteredNone
ghostCommentobjectdataannotation lost its DOM targetveltIf="{ghostComment}"πŸ”‘
editComment / editCommentIndexobject/numberdatacomment being edited / its indexveltIf="{editCommentIndex} === {i}"
assignTo / selectedUserContactsobject/arraydataassign-menu selectionNone
customList / taggedUserContacts / taggedGroupsarraydataautocomplete / mentionsNone
selectedFiles / invalidSelectedFiles / selectedAttachments / attachmentsToDeletearraydatacomposer filesNone
localRecordedDataarraydatastaged recordingsNone
sidebarMode / dialogMode / inboxMode / inlineCommentSectionMode / focusedThreadMode / pageModeComposerbooluirender-mode flagsveltIf="!{sidebarMode}"πŸ”‘
composerInOpenState / isInputFocusedbooluicomposer expanded / focusedveltIf="{composerInOpenState}"πŸ”‘
composerContent / composerContentHTML (alias newComment/newCommentHTML)stringuidraft text / htmlNone
showReplies / collapsedCommentsbooluireplies shown / collapsedNoneπŸ”‘
darkMode / readOnlybooluitheme / read-onlyNoneπŸ”‘
selectedVisibility / selectedVisibilityUsersstring/arrayuivisibility selectionNone
isFocusedThreadEnabledbooluifocused-thread allowedveltIf="{isFocusedThreadEnabled}"πŸ”‘
maxReplyAvatarsnumberuireply-avatar cap (default 5)None
isTruncated / isExpandedbooluimessage truncation / expandedveltIf="{isTruncated} && !{isExpanded}"πŸ”‘
enableResolve / canResolveAnnotation / canUnresolveAnnotationboolfeatureresolve gatesveltIf="{canResolveAnnotation}"πŸ”‘
resolveStatusAccessAdminOnlyboolfeatureresolve admin-only`veltIf=”!”`πŸ”‘
enableReactions / enableEdit / enableDelete / enableAttachment / enableAssignment / enableNotifications / enablePriority / enablePrivateModeboolfeatureper-feature gatesveltIf="{enableReactions}"πŸ”‘
replyAvatarsboolfeatureshow reply-avatar stripveltIf="{replyAvatars}"πŸ”‘
userMentionsboolfeature@mentions onveltIf="{userMentions}"πŸ”‘
visibilityOptions / seenByUsersboolfeaturevisibility selector / seen-byveltIf="{seenByUsers}"πŸ”‘
customStatusesShown / statusOptions / statusObjbool/array/objectfeature/iterstatus dropdown / options / per-item<velt-data field="statusObj.name">
priorityOptions / priorityObjarray/objectfeature/iterpriority options / per-item<velt-data field="priorityObj.name">
enableSignInButton / enableUpgradeButton / enableGhostCommentsMessageboolfeatureconditional buttons/bannersveltIf="{enableSignInButton}"πŸ”‘
suggestionMode / moderatorMode / enableAutoCategorize / isPlanExpiredboolfeaturemodes / planNoneπŸ”‘
showSuggestionModeActionsbooluishow suggestion accept/reject actionsveltIf="{showSuggestionModeActions}"πŸ”‘
commentAcceptedStatus / commentRejectedStatusobjectfeaturesuggestion accept/reject status objects (compare .id)veltClass="'accepted': {annotation.status.id} === {commentAcceptedStatus.id}"
allowedFileTypes / allowedRecordings / screenSharingSupportedarray/boolfeatureattachment / recording limitsNone
recordingSummaryEnabled / enterKeyToSubmit / deleteOnBackspace / deleteThreadWithFirstCommentboolfeaturemisc behaviorNoneπŸ”‘
bubbleOnPin / dialogOnHover / popoverModeboolfeaturerender comment as bubble-on-pin / open dialog on hover / popover layoutveltIf="{popoverMode}"πŸ”‘
commentBubbleAvailablebooluia comment bubble is available to show (gates bubble vs default view)veltIf="{commentBubbleAvailable}"πŸ”‘
commentPlaceholder / replyPlaceholder / editCommentPlaceholder / editReplyPlaceholder / editPlaceholder / pageModePlaceholder / placeholderstringuicomposer/reply/edit placeholder strings (fallback placeholder)<velt-data field="commentPlaceholder"/>
file (.uploading)objectiterationper attachment (the invalid-attachments array is invalidSelectedFiles, above: there is no per-item invalidFile token)velt-class="'is-uploading': {file.uploading}"πŸ”‘
view / userName / userEmail / viewedAtobject/stringiterationper seen-by viewer<velt-data field="view.user.name">
option / itemobjectiterationper visibility / custom-chip option<velt-data field="option.label"/>
{i} / commentIndexnumberiterationloop index (0-based)veltIf="{i} === 0"πŸ”‘

Comment Bubble (structured; some need full globalConfigSignal.* / parentLocalUIState.*)

nametypebucketmeaningexampleπŸ”‘
user / isUserAdmin / isKnownUserobject/boolappuser stateveltIf="{isUserAdmin}"πŸ”‘
annotation.status.id / .namestringdatastatusveltIf="{annotation.status.id} === 'OPEN'"πŸ”‘
annotation.from.name / .priority.name / .assignedTo.namestringdataauthor / priority / assignee<VeltData field="annotation.from.name"/>
annotation.comments.lengthnumberdatareply count (β†’ CommentsCount slot)<VeltData field="annotation.comments.length"/>
annotation.unreadCount / annotation.unreadnumber/booldataunread (β†’ UnreadIcon)velt-class="'is-unread': {annotation.unread}"πŸ”‘
annotation.iam.accessModestringdata'public'/'private'veltIf="{annotation.iam.accessMode} === 'private'"
annotation.ghostCommentbooldatalost targetveltIf="{annotation.ghostComment}"πŸ”‘
annotation.context.<key>objectdatacontext<VeltData field="annotation.context.label"/>
annotations / unresolvedAnnotationsCount / unreadCountarray/numberdatapage totalsNone
commentPinSelected / commentBubbleTargetPinHover / commentBubbleHover / openDialogbooluiselected / target-pin hover / bubble hover / openvelt-class="'hover': {commentBubbleTargetPinHover}"πŸ”‘
selectedAnnotationsMapobjectuiselection mapvelt-class="'selected': {selectedAnnotationsMap[annotation.annotationId]}"
showAvatar / readOnly / darkModebooluiavatar / read-only / themeveltIf="{showAvatar}"πŸ”‘
commentCountType / variantstringui'total'/'unread' / variantNone
globalConfigSignal.featureState.customStatusesShown / .groupMatchedComments / .resolvedCommentsOnDom / .readOnlyboolfeatureglobal feature flagsNoneπŸ”‘

Comment Pin

nametypebucketmeaningexampleπŸ”‘
user / isUserAdminobject/boolappuserveltIf="{isUserAdmin}"πŸ”‘
annotation.status.idstringdatastatus (β†’ marker color)veltIf="{annotation.status.id} === 'OPEN'"πŸ”‘
annotation.priority.namestringdatapriority label<VeltData field="annotation.priority.name"/>
annotation.comments.lengthnumberdatareply count (β†’ Number badge)<VeltData field="annotation.comments.length"/>
annotation.unreadCountnumberdataunread (β†’ UnreadCommentIndicator)veltIf="{annotation.unreadCount} > 0"
annotation.visibilitystringdata'public'/'private' (β†’ PrivateCommentIndicator)veltIf="{annotation.visibility} === 'private'"πŸ”‘
annotation.context.<key>objectdatacontext<VeltData field="annotation.context.label"/>

Text Comment (flat-config: {componentConfig.<x>})

nametypebucketmeaningexampleπŸ”‘
user / user.name / isUserAdmin / isKnownUserobject/boolappuser<VeltData field="user.name"/>πŸ”‘
annotation.status.id / .name / .from.name / .priority.namestringdataannotation fieldsveltIf="{annotation.status.id} === 'RESOLVED'"πŸ”‘
(no totalComments)NoneText Comment exposes no comment-count token; document-wide counts live on the sidebar (commentAnnotationsCountByFilters / commentAnnotationsCountByStatus)None
position.top / position.leftnumberdatatoolbar position<velt-data field="position.top">
selectedWordsCount / selectedCharactersCountnumberdataselection sizevelt-class="'has-words': {selectedWordsCount} > 0"
showAdder / commentToolEnabled / isUserAllowed / enableTextCommentsbooluiadder / tool / permission / featureveltIf="{showAdder}"πŸ”‘
rewriterEnabled / rewriterDefaultUIEnabledbooluiAI rewriterveltIf="{rewriterEnabled}"πŸ”‘
uiState.disabled / uiState.isPlanExpiredbooluidisabled / planveltIf="{uiState.isPlanExpired}"πŸ”‘
MIN_ALLOWED_WORDS_COUNT / MIN_/MAX_ALLOWED_CHARACTERS_COUNTnumberuiselection thresholdsNone
darkMode / variant / parentLocalUIState.shadowDombool/stringuitheme / variant / shadowNoneπŸ”‘

Inline Comments Section (structured)

nametypebucketmeaningexampleπŸ”‘
userobjectappcurrent user<velt-data field="user.name">
featureState.readOnly / .anonymousEmail / .messageTruncation / .messageTruncationLinesbool/numberfeaturefeature gatesveltIf="{featureState.anonymousEmail}"πŸ”‘
annotations / allAnnotations / composerCommentAnnotation / statusesarray/objectdatadataveltIf="{composerCommentAnnotation}"πŸ”‘
skeletonLoading / darkModebooluiloading / themeveltIf="{skeletonLoading}"πŸ”‘
filterState.filters / .filterDropdownOpenarray/booluifilter statevelt-class="'open': {filterState.filterDropdownOpen}"πŸ”‘
sortState.sortBy / .sortOrder / .sortingDropdownOpenstring/booluisort statevelt-class="'sort-{sortState.sortOrder}': true"πŸ”‘
isResolvedCommentsOnDomFilterSelected / resolvedCommentsOnDombooluiresolved filterNoneπŸ”‘
multiThread / fullExpanded / readOnly / composerPositionbool/stringuilayoutvelt-class="'multi-thread': {multiThread}"πŸ”‘
*Placeholder (comment/reply/composer/edit…)stringuiplaceholder strings<velt-data field="commentPlaceholder">
targetElementId / folderId / documentId / locationId / context / contextOptionsstring/objectuiscope / context<velt-data field="context.something">
filter (.id/.isSelected/.metadata)objectiterationper filter itemvelt-class="'selected': {filter.isSelected}"πŸ”‘
sortOption / sortOptionText / isActive / isAscendingmixediterationper sort optionvelt-class="'active': {isActive}"πŸ”‘

Multi-Thread Comment Dialog (structured, per-instance)

nametypebucketmeaningexampleπŸ”‘
annotation / annotations / filteredAnnotationsobject/arraydataannotations<velt-data field="filteredAnnotations.length">
multiThreadAnnotationId / multiThreadCommentAnnotation / nonDraftCommentsCountstring/object/numberdatathread dataNone
data.user / context / data.contextId / containerComponentIdobject/stringdatauser / context<velt-data field="context.foo">
commentPinSelected / commentPinTypebool/stringuipin selected / typevelt-class="'pin-selected': {commentPinSelected}"πŸ”‘
inboxMode / readOnly / hideMultiThreadAnnotationComposerbooluimodesveltIf="!{hideMultiThreadAnnotationComposer}"πŸ”‘
minimalFilter (all/read/unread/resolved)stringuiminimal filtervelt-class="'filter-{minimalFilter}': true"
minimalFilterDropdownOpen / minimalActionsDropdownOpenbooluidropdowns openvelt-class="'open': {minimalFilterDropdownOpen}"πŸ”‘
noCommentsFound / noCommentsFoundForAppliedFiltersbooluiempty statesveltIf="{noCommentsFound}"πŸ”‘
darkMode / dialogVariant / variant / uiState.shadowDombool/stringuitheme / variants / shadowNoneπŸ”‘
isSelectedbooliterationminimal filter/sort item selectedvelt-class="'is-selected': {isSelected}"πŸ”‘

Autocomplete (@mentions) (flat-config)

nametypebucketmeaningexampleπŸ”‘
componentConfig.flattenedItemsarraydatavisible options (empty-state: length === 0)<velt-data field="componentConfig.flattenedItems.length">
componentConfig.contactsWithoutGroup / .groupsarraydataungrouped contacts / groupsNone
componentConfig.newUserContact / .newUserContactErrorobject/stringdatanew contact / errorveltIf="{componentConfig.newUserContactError}"πŸ”‘
componentConfig.customAutocompleteSearch / .expandMentionGroups / .showMentionGroupsFirst / .showMentionGroupsOnly / .customGroupsEnabledbooluisearch / group modesNoneπŸ”‘
option (.user/.group/.name/.email/.description)objectiterationone option<velt-data field="option.name">
chip (.label)objectiterationinline mention chip<velt-data field="chip.label">

Comments Sidebar (flat-config: {componentConfig.<x>})

nametypebucketmeaningexampleπŸ”‘
componentConfig.sidebarVisible / .darkMode / .fullScreen / .fullExpandedbooluivisibility / theme / sizevelt-if="{componentConfig.sidebarVisible}"πŸ”‘
componentConfig.embedMode / .floatingMode / .pageMode / .readOnly / .sidebarReadModestring/booluilayout/modevelt-class="'page-mode': {componentConfig.pageMode}"πŸ”‘
componentConfig.skeletonLoading / .noCommentsFound / .noCommentsFoundForAppliedFiltersbooluiloading / emptyvelt-if="{componentConfig.skeletonLoading}"πŸ”‘
componentConfig.moreFiltersVisiblebooluifilter panel openNoneπŸ”‘
componentConfig.filterPanelLayoutstringuifilter-panel layout class (controls panel arrangement)velt-class="'{componentConfig.filterPanelLayout}': true"
componentConfig.groupBy / .groupByOptionsstring/arrayuicurrent group-by key / available group-by optionsvelt-if="{componentConfig.groupBy} === 'status'"
componentConfig.documentFilterDropdownOpen / .minimalFilterDropdownOpen / .locationFilterDropdownOpen / .minimalActionsDropdownOpenbooluiper-dropdown open flagsvelt-class="'open': {componentConfig.minimalFilterDropdownOpen}"πŸ”‘
componentConfig.searchPlaceholder / .commentPlaceholder / .replyPlaceholder / .editPlaceholder / .editCommentPlaceholder / .editReplyPlaceholder / .pageModePlaceholderstringuiplaceholder strings<velt-data field="componentConfig.searchPlaceholder"/>
componentConfig.filterConfig / .filters / .systemFiltersOperatorobject/stringui/datafilter config / values / AND-OR<velt-data field="componentConfig.filters.statuses.length">
componentConfig.virtualScrollData / .commentAnnotationsCountByFilters / .searchQuery / .taggedFiltersarray/object/stringdatadata (people/tag filters are taggedFilters: there is no selectedFilterTags)None
focusedAnnotationobjectdatafocused thread<velt-data field="focusedAnnotation.from.name">
appliedFiltersCount / filteredCommentAnnotationsCount / unreadCommentAnnotationCountnumberui/datacounts/badges<velt-data field="appliedFiltersCount">
annotation / group (.expanded/.name/.count) / filter / item / tagobjectiterationloop-scopedvelt-class="'expanded': {group.expanded}"πŸ”‘

Notifications Panel & Tool (structured; short names)

nametypebucketmeaningexampleπŸ”‘
notification (.type/.from.name/.read/.createdAt/.documentName/.count)objectdataper notificationveltIf="{notification.type} === 'comment'"πŸ”‘(read)
notifications / notificationsForYouInSession / notificationsInSessionarraydatafeeds<velt-data field="notifications.length">
notificationsByUserMap / notificationsByDocumentId / notificationsByDateobject/arraydatagrouped feedsNone
unreadNotificationsForYou / currentDocumentNamenumber/stringdataunread badge / doc nameNone
settingsConfig / settingsSelectedOptionarray/objectdatasettings tree / selectionNone
selectedTab (forYou/all/documents/people) / TABS / tabConfig / tabPage / tabCountstring/objectuitab stateveltIf="{tabConfig.forYou}"
panelOpenMode / settingsLayout / pageSizestring/numberuilayoutNone
settingsOpen / settingsMutedAll / notificationsPanelVisiblebooluisettings / mute / openvelt-class="'settings-open': {settingsOpen}"πŸ”‘
settingsAccordionExpanded / usersExpanded / documentExpandedobjectuiper-key expanded mapsvelt-class="'expanded': {usersExpanded[notification.from.email]}"
settingsEnabledboolfeaturesettings availableveltIf="{settingsEnabled}"πŸ”‘
isLoadMoreVisible / isAllReadbooluiload-more / all readveltIf="{isLoadMoreVisible}"πŸ”‘
(Tool) considerAllNotifications / panelShadowDomboolfeature/uicount all / panel shadowNoneπŸ”‘

Reactions (flat-config)

nametypebucketmeaningexampleπŸ”‘
componentConfig.annotation (.emoji/.reactions/.users) / .annotationsobject/arraydatareaction data<velt-data field="componentConfig.annotation.emoji">
componentConfig.isReactionSelectedByCurrentUserboolapplocal user reactedvelt-class="'is-mine': {componentConfig.isReactionSelectedByCurrentUser}"πŸ”‘
componentConfig.typestringuipin type (comment/inline/timeline/standalone)velt-class="'pin-{componentConfig.type}': true"
componentConfig.disableTooltip / .tooltipVisiblebooluitooltip suppress / openvelt-if="!{componentConfig.disableTooltip}"πŸ”‘
componentConfig.skeletonLoading / .darkMode / .shadowDom / .variant / .excludeReactionIdsbool/string/arrayuiloading/theme/shadow/exclusionsNoneπŸ”‘
emoji.key / .value / .namestringiterationpicker emoji<velt-data field="emoji.value">
isSelectedbooliterationemoji selectedvelt-class="'is-selected': {isSelected}"πŸ”‘

Presence (flat-config)

nametypebucketmeaningexampleπŸ”‘
componentConfig.filteredPresenceUsersarraydataactive users (gate: length > 0)<velt-data field="componentConfig.filteredPresenceUsers.length">
componentConfig.userobjectdatalocal user (hover user in tooltip)None
componentConfig.maxUsersnumberuiavatar cap (default 5)None
componentConfig.isActive (tooltip)boolappactive state (no lastActiveAt token: away state comes from presenceUser.onlineStatus)NoneπŸ”‘
componentConfig.shadowDom / .variantbool/stringuishadow / variantNoneπŸ”‘
presenceUser (.name/.email/.onlineStatus/.color) / indexobject/numberiterationper avatarvelt-class="'away': {presenceUser.onlineStatus} === 'away'"πŸ”‘

Cursor (flat-config)

nametypebucketmeaningexampleπŸ”‘
componentConfig.user / .cursorUsers / .currentCursorUser / .cursorUserobject/arraydatalocal / remote pointers / per-pointer<velt-data field="componentConfig.cursorUser.name">
componentConfig.selfCursorPointerboolapppointer is local uservelt-class="'is-self': {componentConfig.selfCursorPointer}"πŸ”‘
componentConfig.showDefault / .showAvatar / .showAudio / .showVideobooluirender-mode togglesveltIf="{componentConfig.showAvatar}"πŸ”‘
componentConfig.huddleJoined / .huddleOnCursorMode / .isFirstComponentboolapphuddle / first instanceveltIf="{componentConfig.huddleJoined}"πŸ”‘
componentConfig.gainVolume / .lightenedColor / .variant / .streamnumber/string/Streamui/featurering level / color / variant / mediaveltIf="{componentConfig.stream}"

Huddle (flat-config)

nametypebucketmeaningexampleπŸ”‘
componentConfig.meetingJoinedboolapplocal user in huddlevelt-class="'in-huddle': {componentConfig.meetingJoined}"πŸ”‘
componentConfig.localStreamState.audioState / .videoState / .screenSharingStateboolappmic / cam / screenvelt-class="'audio-on': {componentConfig.localStreamState.audioState}"πŸ”‘
componentConfig.huddleAttendeesarraydataattendees<velt-data field="componentConfig.huddleAttendees.length">
componentConfig.attendee / .color / .gainVolumeobject/string/numberdata/uiper tile (no attendee.isLocal; local-vs-remote is !componentConfig.isRemoteStream)None
componentConfig.typestringuitool type (audio/video/presentation/all)velt-class="'tool-{componentConfig.type}': true"
componentConfig.screenSharingSupported / .disabled / .isDragging / .bannerRemovedboolui/appsupport / statevelt-class="'dragging': {componentConfig.isDragging}"πŸ”‘
componentConfig.isFirstComponentboolappfirst instanceveltIf="{componentConfig.isFirstComponent}"πŸ”‘

Recorder (flat-config: use full componentConfigSignal. for collisions)

nametypebucketmeaningexampleπŸ”‘
recordingInProgress / isRecording / isPlayingboolstaterecording / running / playbackvelt-class="'recording': {componentConfigSignal.recordingInProgress}"πŸ”‘
recordingType / types / recorderModesstring/array/objectdataactive type / permitted / id mapNone
screenSharingSupported / recordingCountdown / recordingTranscriptionEnabledboolfeaturesupport / countdown / transcriptvelt-if="{componentConfigSignal.screenSharingSupported}"πŸ”‘
recorderPinAnnotation / recorderPinSelected / multipleRecorderPinsSelected / draggingobject/booldata/statepin + selectionvelt-class="'selected': {componentConfigSignal.recorderPinSelected}"πŸ”‘
attachment / annotation / user / recorderInitDataobjectdatamedia / annotation / author<velt-data field="componentConfigSignal.attachment.url">
totalTimeValue / currentTimeValue / recordedTimenumberdata/statedurations (the elapsed value is recordedTime: there is no elapsedTime token)None
mode / sourceFeature / videoContainerHoveredstring/boolui/statefloating-vs-thread / origin / hovervelt-class="'mode-{componentConfigSignal.mode}': true"πŸ”‘(hover)
buttonLabel / darkMode / disabled / variant / shadowDomstring/booluilabel / theme / stateNoneπŸ”‘(bools)

Transcription (flat-config)

nametypebucketmeaningexampleπŸ”‘
modestringuifloating / sidebar / summaryModevelt-if="{componentConfig.mode} === 'floating'"
transcription / vttFileTextArrayobject/arraydatatranscript / segments<velt-data field="componentConfig.transcription">
transcriptionVisible / sidebarVisible / subtitlesVisible / dialogVisibleboolstatevisibility flagsvelt-class="'visible': {componentConfig.transcriptionVisible}"πŸ”‘
highlightedTextIndexnumberstateactive segmentNone
showMoreSummary / darkMode / showDefaultBtnboolstate/ui/featuresummary expand / theme / default btnveltIf="{componentConfig.showDefaultBtn}"πŸ”‘

Activity Log (structured)

nametypebucketmeaningexampleπŸ”‘
user / darkMode / isEnabledobject/boolapp/featureuser / theme / enabledvelt-if="{isEnabled}"πŸ”‘
allActivities / filteredActivities / groupedActivities / virtualScrollItemsarraydataactivity recordsvelt-if="{allActivities.length} > 0"
activeFilter / availableFiltersstring/arraystate/dataactive filter / optionsvelt-class="'filter-active': {activeFilter} !== 'all'"
isOpen / filterDropdownOpen / expandedGroupsbool/Setstatepanel / dropdown / expandedvelt-class="'is-open': {isOpen}"πŸ”‘
defaultVisibleCount / variantnumber/stringuiper-group count (5) / variantNone
dateGroup (.displayLabel/.totalCount) / activity (.user/.action/.target/.detail) / filterobjectiterationper row<velt-data field="activity.user.name">
isActive / isExpanded / remainingCountbool/numberiterationper-item statevelt-class="'expanded': {isExpanded}"πŸ”‘

View Analytics (flat-config)

nametypebucketmeaningexampleπŸ”‘
componentConfig.todayViewsCount / .totalUniqueViewsCountnumberdatacounts<velt-data field="componentConfig.todayViewsCount">
componentConfig.views / .usersMap / .userViewsobject/arraydataviews / viewers<velt-data field="componentConfig.userViews.length">
componentConfig.treadsVisibleboolstatedialog open (SDK spelling: β€œtreads”)velt-class="'dialog-open': {componentConfig.treadsVisible}"πŸ”‘
componentConfig.bottomSheetMode / .customButtonAdded / .isPhoneboolstate/featurebottom-sheet / custom btn / mobilevelt-if="!{componentConfig.customButtonAdded}"πŸ”‘

Comments Tool (structured; componentConfig.data.* / .uiState.*)

nametypebucketmeaningexampleπŸ”‘
commentToolEnabled / addCommentMode / popoverMode / groupMatchedCommentsboolfeature/stateenabled / add-mode / popover / groupingvelt-class="'add-mode': {addCommentMode}"πŸ”‘
componentConfig.data.commentAnnotationAvailableboolfeaturecomments placeable herevelt-if="{componentConfig.data.commentAnnotationAvailable}"πŸ”‘
componentConfig.data.context / .targetElementId / .documentId / .locationId / .disabledobject/string/booldatacontext / scope / disabled<velt-data field="componentConfig.data.context.foo">πŸ”‘(disabled)
componentConfig.uiState.showDefaultBtn / .shadowDom / .darkMode / .contextInPageModeComposerbooluidefault btn / shadow / theme / page-mode contextvelt-if="{componentConfig.uiState.showDefaultBtn}"πŸ”‘
nametypebucketmeaningexampleπŸ”‘
globalConfig.featureState.sidebarVisibleboolfeaturesidebar openvelt-class="'sidebar-open': {globalConfig.featureState.sidebarVisible}"πŸ”‘
componentConfig.data.annotations / .unreadCountarray/numberdataannotations / unread<velt-data field="componentConfig.data.unreadCount">
componentConfig.uiState.showDefaultBtn / .floatingMode / .floatingModeSidebarVisible / .darkMode / .commentCountType / .variantbool/stringuibutton / floating / theme / count typevelt-if="{componentConfig.uiState.showDefaultBtn}"πŸ”‘(bools)

Area Β· Arrow Β· Selection Β· Rewriter (flat-config)

featurekey variables
AreacomponentConfig.areaPinAnnotation, .commentPinAnnotation, .selected πŸ”‘, .hideAreaAnnotation πŸ”‘, .isResizing πŸ”‘, .areaAnnotationColor (default #625DF5), .areaProperties
Arrow (no wireframe slots yet: CSS/[template] only)componentConfig.arrowPinAnnotation, .annotationDragging πŸ”‘, .selectedAnnotationsMap
SelectioncomponentConfig.position, .userIndicatorPosition (start/end), .userIndicatorType (Avatar/Name), .selections
RewritercomponentConfig.options, .first πŸ”‘ / .last πŸ”‘, .loading πŸ”‘, .bottomSheetMode πŸ”‘, .isPhone πŸ”‘, .selectedOptionIndex

Tags

No wireframe variables / slots. Customize via the [template] input on velt-tag-pin / velt-tag-dialog, CSS, or the headless useTagAnnotations / useTagUtils hooks. See Annotations, tags, arrows, and areas.

Notes

  • Iteration {i} (aliases commentIndex) is available inside list/Threads slots, 0-based. Loop slots also inject objects (option, filter, emoji, activity, dateGroup, chip, view, file, …) + per-item booleans (isSelected, isActive, isExpanded, isAscending).
  • Function-typed variables (onClick…, initRecording, toggleSidebar, handleEmojiSelected, …) are call-handlers you bind to events, not display values.
  • For deep fields of a compound object not listed, console.log it from a hook (e.g. useCommentAnnotations()) to see the exact shape.