Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.velt.dev/llms.txt

Use this file to discover all available pages before exploring further.

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

Overview

The Comment Dialog wireframe exposes the variables below. Use them inside any <velt-comment-dialog-...-wireframe> tag via three forms:
You want to…UseExample
Display a value as text<velt-data field="var" /><velt-data field="annotation.from.name" />
Hide / show conditionallyvelt-if="{var}"velt-if="{enableResolve} && {canResolveAnnotation}"
Toggle a CSS classvelt-class="'cls': {var}"velt-class="'is-private': {isPrivateComment}"
All variables are mapped — reference them by their short name. You do not need the componentConfig. prefix unless explicitly noted (see Root-Level Properties).

App State

App-wide values resolved from the shared per-annotation signal.
VariableTypeDescriptionExample
userUserCurrently identified end-user.<velt-data field="user.name" />
isUserAdminbooleanTrue when user.isAdmin === true.velt-if="{isUserAdmin}"
isKnownUserbooleanTrue when the user has been identified (vs. anonymous).velt-class="'is-known': {isKnownUser}"
repliesUniqueUsersUser[]Distinct authors of replies on the current annotation.<velt-data field="repliesUniqueUsers.length" />

Data State

Per-annotation data: the live annotation, comment list, edit / draft state, attachments, and recordings.
VariableTypeDescriptionExample
annotationCommentAnnotationAnnotation this dialog represents.<velt-data field="annotation.from.name" />
annotationsCommentAnnotation[]All annotations in scope (for sidebar usage).<velt-data field="annotations.length" />
allAnnotationsCommentAnnotation[]Unfiltered annotation list.<velt-data field="allAnnotations.length" />
ghostCommentGhostComment | nullSet when the annotation has lost its DOM target.velt-if="{ghostComment}"
assignToUserContactCurrently selected assignee.<velt-data field="assignTo.name" />
selectedUserContactsUserContact[]Selected user contacts (for assign / mention).<velt-data field="selectedUserContacts.length" />
customListany[]Autocomplete reference list (when registered).<velt-data field="customList.length" />
toOrganizationUserGroupany[]Organization user-group contacts.<velt-data field="toOrganizationUserGroup.length" />
taggedUserContactsAutocompleteUserContactReplaceData[]Users tagged via @mention in the active composer.<velt-data field="taggedUserContacts.length" />
taggedGroupsany[]Groups tagged via @mention in the active composer.<velt-data field="taggedGroups.length" />
customChipDataCustomAnnotationDropdownData | nullCustom-chip dropdown config for this annotation.velt-if="{customChipData}"
selectedCustomChipSetSet<string>IDs currently selected in the custom-chip dropdown.<velt-data field="selectedCustomChipSet.size" />
currentDialogViewRecord<string, any>Seen-by aggregation keyed by commentId.<velt-data field="currentDialogView[annotation.annotationId].count" />
selectedFilesFileData[]Files staged in the composer.velt-if="{selectedFiles.length} > 0"
invalidSelectedFilesInvalidFileData[]Files rejected by validation.velt-if="{invalidSelectedFiles.length} > 0"
selectedAttachmentsany[]Attachments staged for the new comment.<velt-data field="selectedAttachments.length" />
editCommentComment | nullComment currently being edited in this dialog.velt-if="{editComment}"
editCommentIndexnumber | nullIndex of the comment being edited.<velt-data field="editCommentIndex" />
localRecordedDataRecordedData[]Recordings staged in the composer.<velt-data field="localRecordedData.length" />
attachmentsToDeleteany[]Attachments queued for deletion on save.<velt-data field="attachmentsToDelete.length" />

UI State

Per-instance UI flags driven by the dialog itself. Grouped by area for readability — the underlying shape is flat. Layout modes — which rendering mode the dialog is in.
VariableTypeDescriptionExample
sidebarModebooleanDialog is rendered inside the comments sidebar.velt-class="'is-sidebar': {sidebarMode}"
inboxModebooleanDialog is rendered inside the inbox layout.velt-class="'is-inbox': {inboxMode}"
dialogModebooleanDefault popup-dialog layout.velt-class="'is-dialog': {dialogMode}"
inlineCommentModebooleanInline-comment-pin styling.velt-class="'is-inline': {inlineCommentMode}"
inlineCommentSectionModebooleanInline comments section layout.velt-class="'is-inline-section': {inlineCommentSectionMode}"
focusedThreadModebooleanFocused-thread layout is active.velt-class="'is-focused': {focusedThreadMode}"
isFocusedThreadEnabledbooleanFocused-thread navigation is allowed.velt-if="{isFocusedThreadEnabled}"
pageModeComposerbooleanPage-level composer mode (sidebar).velt-class="'page-composer': {pageModeComposer}"
bottomSheetModebooleanBottom-sheet layout is active.velt-class="'bottom-sheet': {bottomSheetMode}"
commentComposerModebooleanComposer-only layout (no thread).velt-class="'composer-only': {commentComposerMode}"
multiThreadAnnotationIdstring | nullMulti-thread context id (when in multi-thread mode).velt-if="{multiThreadAnnotationId}"
dialogOpenedInSidebarbooleanDialog opened in sidebar context.velt-class="'in-sidebar': {dialogOpenedInSidebar}"
dialogShadowDOMbooleanShadow-DOM rendering is enabled.velt-if="{dialogShadowDOM}"
containerComponentIdstringOwning container id (scoping).<velt-data field="containerComponentId" />
commentDialogUniqueIdstringUnique id for this dialog instance.<velt-data field="commentDialogUniqueId" />
deviceTypestringDevice-type modifier ('desktop', 'mobile', etc.).velt-class="'device-{deviceType}': true"
darkModebooleanDark mode is active.velt-class="'theme-dark': {darkMode}"
variantstringPer-instance variant tag set on the host element.<velt-data field="variant" />
disabledbooleanDialog is disabled.velt-class="'is-disabled': {disabled}"
readOnlybooleanPer-instance read-only mode.velt-class="'readonly': {readOnly}"
commentPinSelectedbooleanPin associated with this dialog is selected.velt-class="'pin-selected': {commentPinSelected}"
commentDialogSelectedbooleanThis dialog is the currently selected one.velt-class="'selected': {commentDialogSelected}"
fullExpandedbooleanDialog is fully expanded (sidebar).velt-class="'expanded': {fullExpanded}"
expandOnSelectionbooleanSidebar expands on click vs. just visually selecting.velt-if="{expandOnSelection}"
composerPositionstringComposer position ('top' or 'bottom').velt-class="'composer-{composerPosition}': true"
selectedVisibilityCommentVisibilityOptionTypeCurrently selected visibility option.velt-class="'visibility-{selectedVisibility}': true"
selectedVisibilityUsersany[]Users selected when selectedVisibility === 'selected_people'.<velt-data field="selectedVisibilityUsers.length" />
locationVersionstringAnnotation location version.<velt-data field="locationVersion" />
Composer state — input, draft, and submission state.
VariableTypeDescriptionExample
composerContentstringPlain-text composer draft.<velt-data field="composerContent" />
composerContentHTMLstringRich-text composer draft.<velt-data field="composerContentHTML" />
newCommentstringAlias for composerContent.<velt-data field="newComment" />
newCommentHTMLstringAlias for composerContentHTML.<velt-data field="newCommentHTML" />
composerInOpenStatebooleanComposer is currently expanded.velt-class="'composer-open': {composerInOpenState}"
composerMode'default' | 'expanded'Current composer mode.velt-class="'composer-{composerMode}': true"
isInputFocusedbooleanComposer input has keyboard focus.velt-class="'input-focused': {isInputFocused}"
showCommentButtonsbooleanComposer’s action-button row should render.velt-if="{showCommentButtons}"
isAutocompleteDropdownOpenboolean@-mention autocomplete dropdown is open.velt-class="'autocomplete-open': {isAutocompleteDropdownOpen}"
uploadingAttachmentsbooleanOne or more attachments are uploading.velt-class="'uploading': {uploadingAttachments}"
recorderInitConfiganyActive recorder configuration (or null).velt-class="'recording-{recorderInitConfig.type}': true"
Reactions, replies, and dropdowns.
VariableTypeDescriptionExample
showRepliesbooleanReply list is currently shown.velt-class="'show-replies': {showReplies}"
collapsedCommentsbooleanComments are collapsed (only first comment visible).velt-class="'collapsed': {collapsedComments}"
showAllCommentsboolean”Show all” mode is active.velt-if="{showAllComments}"
showReplyComposerbooleanReply composer is currently visible.velt-if="{showReplyComposer}"
maxReplyAvatarsnumberMaximum reply avatars to show before “+N”.<velt-data field="maxReplyAvatars" />
showSuggestionModeActionsbooleanSuggestion-mode accept/reject actions visible.velt-if="{showSuggestionModeActions}"
reactionToolOpenIndexnumberComment index whose reaction picker is open (-1 if none).velt-class="'reaction-open': '{reactionToolOpenIndex} === {commentIndex}'"
openDropdownIndexValuenumberComment index whose options dropdown is open (-1 if none).velt-class="'dropdown-open': '{openDropdownIndexValue} === {commentIndex}'"
hasReactionsByCommentIdRecord<string, boolean>Map keyed by commentId → has-reactions flag.velt-if="{hasReactionsByCommentId[comment.commentId]}"
assignToMenuOpenedbooleanAssign-to menu is open.velt-class="'assign-open': {assignToMenuOpened}"
isPrivateCommentbooleanAnnotation is in private mode.velt-class="'private': {isPrivateComment}"
showGhostCommentMessagebooleanGhost-comment banner should show.velt-if="{showGhostCommentMessage}"
playVideoInFullScreenbooleanRecordings play full-screen.velt-class="'fullscreen-video': {playVideoInFullScreen}"
shouldScrollToBottombooleanInternal transient signal — triggers auto-scroll to latest comment.Internal — not typically used in wireframes.
showScreenSizeInfobooleanScreen-size information overlay is visible.velt-if="{showScreenSizeInfo}"
sidebarButtonOnCommentDialogVisibleboolean”View all comments” sidebar button is visible on the dialog.velt-if="{sidebarButtonOnCommentDialogVisible}"

Feature State

Capability flags toggled via SDK config. All Shared — the same value applies to every dialog instance for the same annotation.
VariableTypeDescriptionExample
canResolveAnnotationbooleanCurrent user is allowed to resolve this annotation.velt-if="{canResolveAnnotation}"
canUnresolveAnnotationbooleanCurrent user is allowed to unresolve this annotation.velt-if="{canUnresolveAnnotation}"
dialogSelectedByKnownUserbooleanSelected dialog belongs to an identified user.velt-class="'known-user-selected': {dialogSelectedByKnownUser}"
enableResolvebooleanResolve action enabled by config.velt-if="{enableResolve}"
resolveStatusAccessAdminOnlybooleanOnly admins can change resolve status.`velt-if=”!”`
enableSignInButtonbooleanSign-in button is rendered for anonymous users.velt-if="{enableSignInButton}"
enableUpgradeButtonbooleanUpgrade button is rendered when plan is expired.velt-if="{enableUpgradeButton}"
enableGhostCommentsMessagebooleanGhost-comment banner is enabled.velt-if="{enableGhostCommentsMessage}"
replyAvatarsbooleanReply-avatars strip is enabled.velt-if="{replyAvatars}"
userMentionsboolean@-mention autocomplete is enabled.velt-if="{userMentions}"
recordingSummaryEnabledbooleanRecording AI-summary feature enabled.velt-if="{recordingSummaryEnabled}"
enableAttachmentbooleanFile attachments enabled.velt-if="{enableAttachment}"
allowedFileTypesstring[]File-type allow-list.<velt-data field="allowedFileTypes.length" />
allowedRecordingsstring[]Recording types enabled ('audio' / 'video' / 'screen').<velt-data field="allowedRecordings.0" />
screenSharingSupportedbooleanBrowser supports screen-sharing.velt-if="{screenSharingSupported}"
enterKeyToSubmitbooleanEnter key submits (vs. inserts a newline).velt-class="'enter-submit': {enterKeyToSubmit}"
deleteOnBackspacebooleanBackspace on empty composer deletes the comment.velt-class="'backspace-delete': {deleteOnBackspace}"
enableReactionsbooleanEmoji reactions enabled.velt-if="{enableReactions}"
isInsidePdfViewerbooleanDialog is inside a PDF viewer.velt-class="'in-pdf': {isInsidePdfViewer}"
enableStatusbooleanStatus dropdown enabled.velt-if="{enableStatus}"
customStatusesShownbooleanCustom-status decoration enabled.velt-class="'custom-statuses': {customStatusesShown}"
statusOptionsCustomStatus[]Available status options.<velt-data field="statusOptions.length" />
enablePrioritybooleanPriority dropdown enabled.velt-if="{enablePriority}"
priorityOptionsCustomPriority[]Available priority options.<velt-data field="priorityOptions.length" />
visibilityOptionsbooleanVisibility dropdown enabled.velt-if="{visibilityOptions}"
enableAssignmentbooleanAssign-to dropdown enabled.velt-if="{enableAssignment}"
enableNotificationsbooleanNotification toggle enabled.velt-if="{enableNotifications}"
enableEditbooleanEdit action enabled.velt-if="{enableEdit}"
enableDeletebooleanDelete action enabled.velt-if="{enableDelete}"
enablePrivateModebooleanPrivate-mode toggle enabled.velt-if="{enablePrivateMode}"
deleteThreadWithFirstCommentbooleanDeleting the first comment deletes the entire thread.velt-class="'delete-cascade': {deleteThreadWithFirstComment}"
seenByUsersboolean”Seen by” feature enabled.velt-if="{seenByUsers}"
commentAcceptedStatusCustomStatusAccepted-suggestion status object.<velt-data field="commentAcceptedStatus.name" />
commentRejectedStatusCustomStatusRejected-suggestion status object.<velt-data field="commentRejectedStatus.name" />
enableAutoCategorizebooleanAuto-categorize feature enabled.velt-if="{enableAutoCategorize}"
suggestionModebooleanSuggestion mode is active.velt-class="'suggestion-mode': {suggestionMode}"
moderatorModebooleanModerator mode is active.velt-class="'moderator': {moderatorMode}"
isPlanExpiredbooleanWorkspace plan is expired.velt-class="'plan-expired': {isPlanExpired}"

Common Props

Every Comment Dialog primitive accepts a small shared set of attributes. The most useful ones inside wireframes:
React PropHTML AttributeTypeDefaultDescription
annotationIdannotation-idstringStandalone mode — pin this primitive to an annotation id.
inlineCommentSectionModeinline-comment-section-modeboolean | "true" | "false"falseSwitch to inline-section behavior.
defaultConditiondefault-conditionboolean | "true" | "false"trueWhen false, bypasses shouldShow so the primitive always renders.
Signal inputs (auto-wired in parent-child component composition):
  • [componentConfigSignal] — shared per-annotation config signal.
  • [parentLocalUIState] — per-instance UI state signal.
For the full per-subcomponent prop list, see Comment Dialog Primitives.

Context-Specific Variables

These are only resolvable inside the nested wireframe tags noted in the Available in column. Each is injected by the iteration primitive that owns the tag.
VariableTypeAvailable inExample
commentObjComment<velt-comment-dialog-thread-card-wireframe> and descendants<velt-data field="commentObj.commentText" />
commentCommentSame as above (alias of commentObj)<velt-data field="comment.from.name" />
commentIndexnumberSame as above. 0 on the parent comment.velt-class="'is-first': '{commentIndex} === 0'"
commentAnnotationCommentAnnotationAvailable everywhere (alias of annotation)<velt-data field="commentAnnotation.from.userId" />
commentAnnotationsCommentAnnotation[]Available everywhere (alias of annotations)<velt-data field="commentAnnotations.length" />
userContactUserContactUser-selector items<velt-data field="userContact.email" />
contextRecord<string, any>Inline-comment-section context<velt-data field="context.foo" />
Aliases: commentObjcomment, annotationcommentAnnotation, annotationscommentAnnotations. Either name resolves; the friendly short form is preferred.

Version 1 Backward-Compatibility Aliases

Inherited from v4 SDK config signals. They are mapped so wireframes written for v4 keep working — the Maps to column tells you the v5 equivalent.
Version 1 AliasMaps toDescription
allowAssignmentenableAssignmentWas in CommentDialogOptionsDropdownConfig.
allowToggleNotificationenableNotificationsWas the per-comment notification toggle flag.
allowEditenableEditWas the per-comment edit-permission flag.
allowChangeCommentAccessModeenablePrivateModeWas the access-mode toggle flag.
notificationEnablednotificationEnabled (passthrough)Pass-through; the data context must provide it.
mainCommentIdannotation.comments.0.commentIdConvenience alias for the first comment’s id.
The resolver also unwraps two legacy signal-name prefixes — commentDialogOptionsDropdownConfigSignal.* and commentDialogStatusDropdownConfigSignal.* — so an old wireframe written as {commentDialogOptionsDropdownConfigSignal.allowAssignment} keeps working.

Root-Level Properties (Use Full Path)

These properties live at the root of componentConfigSignal and are not entries in the variable map. To use them, write the full componentConfigSignal.<name> path.
VariableTypeDescription
componentConfigSignal.unreadCommentsMapRecord<string, number> | nullMap keyed by annotationId to unread count. Combine with bracket notation: {componentConfigSignal.unreadCommentsMap[annotation.annotationId]}.
componentConfigSignal.unreadIndicatorMode'minimal' | 'detailed'Unread-indicator display mode.
componentConfigSignal.commentplaceholderstringPlaceholder for the new-comment composer.
componentConfigSignal.replyplaceholderstringPlaceholder for the reply composer.
componentConfigSignal.editplaceholderstringPlaceholder for the generic edit composer.
componentConfigSignal.editcommentplaceholderstringPlaceholder for the edit-comment composer.
componentConfigSignal.editreplyplaceholderstringPlaceholder for the edit-reply composer.
componentConfigSignal.placeholderstringGeneric placeholder; takes priority over the others.
One root-level helper is mapped:
VariableTypeDescription
unreadCommentAnnotationCountnumberMapped explicitly. Populated for the unread counter on the dialog/sidebar entry-points. Read as {unreadCommentAnnotationCount}.

Type Reference

Types referenced by the variables above are documented in Data Models:
TypeDescription
UserIdentified end-user object (userId, name, email, photoUrl, isAdmin).
CommentA single message inside an annotation thread.
CommentAnnotationThe annotation thread (id, status, comments, from, etc.).
UserContactSelectable user contact (assign-to, mention).
AttachmentSaved attachment record on a comment.
RecordedDataAudio / video / screen recording metadata.
CustomStatusStatus definition (id, name, color, icon).
CustomPriorityPriority definition (id, name, color, icon).
CustomAnnotationDropdownDataCustom-chip dropdown configuration.
CustomAnnotationDropdownItemA single chip option in the custom-annotation dropdown.
CommentVisibilityOptionTypeVisibility mode ('public', 'organization', 'selected_people', 'private').
AutocompleteUserContactReplaceDataTagged-mention replacement payload.
CommentAnnotationContextFree-form annotation context.
GhostCommentPlaceholder set when the annotation has lost its DOM target.
FileDataPending file selection (composer-staged file).
InvalidFileDataRejected file selection (composer-staged file with a validation error).

Subcomponents

Each subcomponent below has its own wireframe tag. The tables show extra variables beyond the common set, the shouldShow condition, and host CSS classes.

comment-dialog (root)

The root primitive — the <velt-comment-dialog> element customers place in their app.
  • Public element: <velt-comment-dialog>
  • Wireframe tag: <velt-comment-dialog-wireframe>
  • Children: *-header, *-body, *-composer, *-close-button
PropertyValue
Extra variablesNone — root only sees common variables.
shouldShowRenders when defaultCondition === false or componentConfig exists with a non-null annotation.
<VeltCommentDialogWireframe>
  <div
    className="my-dialog"
    velt-class="'my-dialog--dark': {darkMode}, 'my-dialog--readonly': {readOnly}">
    <VeltCommentDialogWireframe.Header />
    <VeltCommentDialogWireframe.Body />
    <VeltCommentDialogWireframe.Composer />
  </div>
</VeltCommentDialogWireframe>

comment-dialog-header

The header strip across the top of the dialog: status, priority, custom-chip, options dropdown, copy-link, resolve / unresolve buttons.
  • Public element: <velt-comment-dialog-header>
  • Wireframe tag: <velt-comment-dialog-header-wireframe>
  • Children: *-status-dropdown, *-priority-dropdown, *-custom-annotation-dropdown, *-options-dropdown, *-resolve-button, *-unresolve-button, *-copy-link
PropertyValue
Extra variablesNone beyond common variables.
shouldShowdefaultCondition === false or annotation.comments.length > 0. Hidden on a brand-new annotation.
Host classvelt-header

comment-dialog-body

The middle section: threads list, reply avatars, toggle / hide-reply controls.
  • Public element: <velt-comment-dialog-body>
  • Wireframe tag: <velt-comment-dialog-body-wireframe>
  • Children: *-threads, *-reply-avatars, *-toggle-reply, *-hide-reply, *-more-reply
PropertyValue
Extra variablesNone at the body level.
shouldShowdefaultCondition === false or annotation.comments.length > 0.
Host classvelt-body

comment-dialog-threads

The list container. Iterates annotation.comments and renders one thread-card per comment.
  • Public element: <velt-comment-dialog-threads>
  • Wireframe tag: <velt-comment-dialog-threads-wireframe>
  • Children: *-thread-card
The threads container injects per-iteration variables into each thread-card:
VariableTypeExample
commentObjComment<velt-data field="commentObj.commentText" />
commentComment (alias)<velt-data field="comment.from.name" />
commentIndexnumbervelt-class="'is-first': '{commentIndex} === 0'"
PropertyValue
shouldShowEach thread-card renders only when `!isDialogSelected() ? !i : (!collapsedComments!i)` — i.e. only the first comment when collapsed, all comments when expanded.
<VeltCommentDialogWireframe.Threads>
  <VeltCommentDialogWireframe.ThreadCard>
    <article className="my-thread">
      <velt-data field="comment.from.name" />
      <velt-data field="comment.commentText" />
      <span velt-if="{commentIndex} === 0" className="my-thread__badge">
        Original
      </span>
    </article>
  </VeltCommentDialogWireframe.ThreadCard>
</VeltCommentDialogWireframe.Threads>

comment-dialog-close-button

Close button that dismisses the dialog.
  • Public element: <velt-comment-dialog-close-button>
  • Wireframe tag: <velt-comment-dialog-close-button-wireframe>
PropertyValue
Extra variablesNone.
shouldShowAlways renders when the dialog is shown.

comment-dialog-composer

The composer assembly — owns the per-instance composer state machine and emits change events as the user types.
  • Public element: <velt-comment-dialog-composer>
  • Wireframe tag: <velt-comment-dialog-composer-wireframe>
  • Children: *-input, *-avatar, *-action-button, *-attachments, *-recordings, *-private-badge, *-format-toolbar, *-assign-user
The composer injects extras for its child tags:
VariableTypeExample
editModebooleanvelt-class="'is-editing': {editMode}"
commentObjComment (edit mode only)<velt-data field="commentObj.commentText" />
commentIndexnumber (edit mode only)<velt-data field="commentIndex" />
PropertyValue
shouldShowRenders when !disabled && isKnownUser && !isPlanExpired, and edit-mode parity matches (!!editComment === editMode), and for new-comment mode one of annotation.comments.length === 0, commentDialogSelected, or focusedThreadMode is true.
Host classvelt-composer
<VeltCommentDialogWireframe.Composer>
  <div className="my-composer" velt-class="'my-composer--editing': {editMode}">
    <VeltCommentDialogWireframe.Composer.PrivateBadge />
    <VeltCommentDialogWireframe.Composer.Attachments />
    <VeltCommentDialogWireframe.Composer.Input />
    <div className="my-composer__actions" velt-if="{composerInOpenState}">
      <VeltCommentDialogWireframe.Composer.ActionButton type="autocomplete" />
      <VeltCommentDialogWireframe.Composer.ActionButton type="attachments" />
      <VeltCommentDialogWireframe.Composer.ActionButton type="submit" />
    </div>
  </div>
</VeltCommentDialogWireframe.Composer>

comment-dialog-composer-action-button

A polymorphic action button — the same primitive renders different controls depending on its type attribute.
  • Public element: <velt-comment-dialog-composer-action-button>
  • Wireframe tag: <velt-comment-dialog-composer-action-button-wireframe>
Supported type values: userMentions, autocomplete, file, attachments, audio, video, screen, format, submit.
PropertyValue
Extra variablesNone.
shouldShow (per type)userMentions / autocomplete: userMentions === true. file / attachments: enableAttachment === true. audio / video / screen: corresponding entry in allowedRecordings. format: enableFormatOptions === true. submit: always renders.
Host classvelt-comment-dialog-composer-action-button
<VeltCommentDialogWireframe.Composer.ActionButton type="audio">
  <button className="my-mic">Mic</button>
</VeltCommentDialogWireframe.Composer.ActionButton>
<VeltCommentDialogWireframe.Composer.ActionButton type="submit">
  <button className="my-submit">Send</button>
</VeltCommentDialogWireframe.Composer.ActionButton>

comment-dialog-composer-input

The contenteditable input area with autocomplete (@mention) support.
  • Public element: <velt-comment-dialog-composer-input>
  • Wireframe tag: <velt-comment-dialog-composer-input-wireframe>
PropertyValue
Extra variablesNone.
shouldShow!editMode && !isRecordingActive for new-comment; editMode && commentObj && !isRecordingActive for edit-comment.
Host classvelt-composer-input

comment-dialog-composer-avatar

The current user’s avatar shown next to the composer in inline-section mode.
  • Public element: <velt-comment-dialog-composer-avatar>
  • Wireframe tag: <velt-comment-dialog-composer-avatar-wireframe>
PropertyValue
Extra variablesNone.
shouldShowinlineCommentSectionMode === true and annotation.comments.length === 0.

comment-dialog-composer-attachments

The display row that lists files staged for upload and any rejected files.
  • Public element: <velt-comment-dialog-composer-attachments>
  • Wireframe tag: <velt-comment-dialog-composer-attachments-wireframe>
PropertyValue
Extra variablesNone.
shouldShoweditComment is set, selectedFiles.length > 0, or invalidSelectedFiles.length > 0.
Host classvelt-composer--attachments

comment-dialog-composer-recordings

The display row that lists active and pending recordings.
  • Public element: <velt-comment-dialog-composer-recordings>
  • Wireframe tag: <velt-comment-dialog-composer-recordings-wireframe>
PropertyValue
Extra variablesNone.
shouldShowRenders when localRecordedData.length > 0 or a recording session is active.

comment-dialog-composer-private-badge

The “Only for your team” badge shown above the composer when private mode is active.
  • Public element: <velt-comment-dialog-composer-private-badge>
  • Wireframe tag: <velt-comment-dialog-composer-private-badge-wireframe>
PropertyValue
Extra variablesNone.
shouldShowisPrivateComment === true and annotation.comments.length === 0.
Host classvelt-private-badge

comment-dialog-composer-format-toolbar

The bold / italic / underline / strikethrough toolbar.
  • Public element: <velt-comment-dialog-composer-format-toolbar>
  • Wireframe tag: <velt-comment-dialog-composer-format-toolbar-wireframe>
PropertyValue
Extra variablesNone.
shouldShowformatToolbarOpen === true and enableFormatOptions === true.
Host classvelt-format-toolbar

comment-dialog-composer-assign-user

The assign-to dropdown shown beneath the composer when the user opens the @-mention picker.
  • Public element: <velt-comment-dialog-composer-assign-user>
  • Wireframe tag: <velt-comment-dialog-composer-assign-user-wireframe>
PropertyValue
Extra variablesNone.
shouldShowuserMentions === true and composerInOpenState === true.

comment-dialog-thread-card

A single comment inside the thread list. Renders avatar, name, time, message, options, reactions, recordings, and edit-composer.
  • Public element: <velt-comment-dialog-thread-card>
  • Wireframe tag: <velt-comment-dialog-thread-card-wireframe>
  • Children: *-avatar, *-name, *-time, *-message, *-edited, *-options, *-reactions, *-reaction-tool, *-recordings, *-seen-dropdown, *-attachments, *-edit-composer, *-assign-button, *-unread, *-draft, *-device-type
VariableTypeExample
commentObjComment<velt-data field="commentObj.commentText" />
commentComment (alias)<velt-data field="comment.from.name" />
commentIndexnumbervelt-class="'is-first': '{commentIndex} === 0'"
PropertyValue
shouldShowRenders when comment resolves to a truthy value (triple-input lookup found a comment).
Host classvelt-thread-card--container
<VeltCommentDialogWireframe.ThreadCard>
  <article className="my-card" velt-class="'my-card--mine': '{comment.from.userId} === {user.userId}'">
    <header>
      <VeltCommentDialogWireframe.ThreadCard.Avatar />
      <VeltCommentDialogWireframe.ThreadCard.Name />
      <VeltCommentDialogWireframe.ThreadCard.Time />
      <VeltCommentDialogWireframe.ThreadCard.Options />
    </header>
    <VeltCommentDialogWireframe.ThreadCard.Message />
  </article>
</VeltCommentDialogWireframe.ThreadCard>

comment-dialog-thread-card-avatar

The author’s avatar.
  • Public element: <velt-comment-dialog-thread-card-avatar>
  • Wireframe tag: <velt-comment-dialog-thread-card-avatar-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
Host classcomment-dialog-user-avatar

comment-dialog-thread-card-name

The author’s display name.
  • Public element: <velt-comment-dialog-thread-card-name>
  • Wireframe tag: <velt-comment-dialog-thread-card-name-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
Host classvelt-thread-card--name

comment-dialog-thread-card-time

The comment’s lastUpdated timestamp formatted as relative time.
  • Public element: <velt-comment-dialog-thread-card-time>
  • Wireframe tag: <velt-comment-dialog-thread-card-time-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
Host classvelt-thread-card--time

comment-dialog-thread-card-message

The comment body. Renders text, HTML, or voice player. Supports message truncation.
  • Public element: <velt-comment-dialog-thread-card-message>
  • Wireframe tag: <velt-comment-dialog-thread-card-message-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
Host classvelt-thread-card--message

comment-dialog-thread-card-edited

Small “Edited” badge shown when a comment has been modified.
  • Public element: <velt-comment-dialog-thread-card-edited>
  • Wireframe tag: <velt-comment-dialog-thread-card-edited-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
shouldShowcomment.isEdited === true or a local edit draft exists.

comment-dialog-thread-card-options

The ”…” options dropdown trigger on a comment.
  • Public element: <velt-comment-dialog-thread-card-options>
  • Wireframe tag: <velt-comment-dialog-thread-card-options-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
shouldShowDialog is selected and the comment belongs to the current user or user is admin.

comment-dialog-thread-card-reactions

Emoji reaction badges displayed below a comment.
  • Public element: <velt-comment-dialog-thread-card-reactions>
  • Wireframe tag: <velt-comment-dialog-thread-card-reactions-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
shouldShowenableReactions === true and the comment has reactions.

comment-dialog-thread-card-recordings

Recordings attached to a comment (audio / video / screen).
  • Public element: <velt-comment-dialog-thread-card-recordings>
  • Wireframe tag: <velt-comment-dialog-thread-card-recordings-wireframe>
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
shouldShowcomment.recorders.length > 0.

comment-dialog-thread-card-seen-dropdown

“Seen by” dropdown showing which users have viewed the comment.
  • Public element: <velt-comment-dialog-thread-card-seen-dropdown>
  • Wireframe tag: <velt-comment-dialog-thread-card-seen-dropdown-wireframe>
  • Children: *-trigger, *-content
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
shouldShowseenByUsers === true and commentIndex === 0.

comment-dialog-thread-card-attachments

Attachments (images and other files) attached to a comment.
  • Public element: <velt-comment-dialog-thread-card-attachments>
  • Wireframe tag: <velt-comment-dialog-thread-card-attachments-wireframe>
  • Children: *-image, *-other
PropertyValue
Extra variablesInherits commentObj, comment, commentIndex from thread-card.
shouldShowcomment.attachments.length > 0.

comment-dialog-status-dropdown

The annotation status dropdown in the header.
  • Public element: <velt-comment-dialog-status-dropdown>
  • Wireframe tag: <velt-comment-dialog-status-dropdown-wireframe>
  • Children: *-trigger, *-content
Per-iteration context inside content items:
VariableTypeExample
statusObjCustomStatus<velt-data field="statusObj.name" />
PropertyValue
shouldShowenableStatus === true.
Host classvelt-status-dropdown

comment-dialog-priority-dropdown

The annotation priority dropdown in the header.
  • Public element: <velt-comment-dialog-priority-dropdown>
  • Wireframe tag: <velt-comment-dialog-priority-dropdown-wireframe>
  • Children: *-trigger, *-content
Per-iteration context inside content items:
VariableTypeExample
priorityObjCustomPriority<velt-data field="priorityObj.name" />
PropertyValue
shouldShowenablePriority === true.
Host classvelt-priority-dropdown

comment-dialog-custom-annotation-dropdown

The custom-chip dropdown in the header.
  • Public element: <velt-comment-dialog-custom-annotation-dropdown>
  • Wireframe tag: <velt-comment-dialog-custom-annotation-dropdown-wireframe>
  • Children: *-trigger, *-content
Per-iteration context inside content items:
VariableTypeExample
itemCustomAnnotationDropdownItem<velt-data field="item.label" />
PropertyValue
shouldShowcustomChipData is set.

comment-dialog-options-dropdown

The per-comment ”…” options dropdown. Contains assign, delete, edit, make-private, mark-as-read, and notification items.
  • Public element: <velt-comment-dialog-options-dropdown>
  • Wireframe tag: <velt-comment-dialog-options-dropdown-wireframe>
  • Children: *-trigger, *-content
PropertyValue
Extra variablesNone beyond common variables.
shouldShowDialog is selected and the current comment’s options should be visible.

comment-dialog-resolve-button

The “Resolve” button. Sets the annotation status to a resolving status.
  • Public element: <velt-comment-dialog-resolve-button>
  • Wireframe tag: <velt-comment-dialog-resolve-button-wireframe>
PropertyValue
Extra variablesNone.
shouldShowcanResolveAnnotation === true and annotation has no assignedTo and (!resolveStatusAccessAdminOnly or user is author or user is admin).

comment-dialog-unresolve-button

The “Reopen” / unresolve button.
  • Public element: <velt-comment-dialog-unresolve-button>
  • Wireframe tag: <velt-comment-dialog-unresolve-button-wireframe>
PropertyValue
Extra variablesNone.
shouldShowcanUnresolveAnnotation === true and annotation has no assignedTo.

comment-dialog-private-button

The “Make private” button.
  • Public element: <velt-comment-dialog-private-button>
  • Wireframe tag: <velt-comment-dialog-private-button-wireframe>
PropertyValue
Extra variablesNone.
shouldShowenablePrivateMode === true.

comment-dialog-delete-button

The “Delete” button. Click triggers thread deletion.
  • Public element: <velt-comment-dialog-delete-button>
  • Wireframe tag: <velt-comment-dialog-delete-button-wireframe>
PropertyValue
Extra variablesNone.
shouldShowannotation.from.userId === user.userId (only the original author can delete).

comment-dialog-suggestion-action

Renders accept/reject buttons in suggestion mode.
  • Public element: <velt-comment-dialog-suggestion-action>
  • Wireframe tag: <velt-comment-dialog-suggestion-action-wireframe>
  • Children: *-accept, *-reject
PropertyValue
Extra variablesNone.
shouldShowshowSuggestionModeActions === true.
Host classvelt-suggestion-actions

comment-dialog-suggestion-action-accept

Accept-suggestion button.
  • Public element: <velt-comment-dialog-suggestion-action-accept>
  • Wireframe tag: <velt-comment-dialog-suggestion-action-accept-wireframe>
PropertyValue
Extra variablesNone.

comment-dialog-suggestion-action-reject

Reject-suggestion button.
  • Public element: <velt-comment-dialog-suggestion-action-reject>
  • Wireframe tag: <velt-comment-dialog-suggestion-action-reject-wireframe>
PropertyValue
Extra variablesNone.

comment-dialog-approve

Moderator-mode “Approve” button shown only when an admin is reviewing a not-yet-approved comment.
  • Public element: <velt-comment-dialog-approve>
  • Wireframe tag: <velt-comment-dialog-approve-wireframe>
PropertyValue
Extra variablesNone.
shouldShowDialog is selected, annotation has comments, moderatorMode === true, annotation is not approved, and isUserAdmin === true.

comment-dialog-assignee-banner

A horizontal banner shown above the dialog when the annotation has been assigned to a user.
  • Public element: <velt-comment-dialog-assignee-banner>
  • Wireframe tag: <velt-comment-dialog-assignee-banner-wireframe>
  • Children: *-resolve-button, *-unresolve-button, *-user-avatar, *-user-name
PropertyValue
Extra variablesNone.
shouldShow!inlineCommentMode and annotation.assignedTo is set.
Host classvelt-assignee-banner--heading
<VeltCommentDialogWireframe.AssigneeBanner>
  <div className="my-banner">
    <VeltCommentDialogWireframe.AssigneeBanner.UserAvatar />
    <VeltCommentDialogWireframe.AssigneeBanner.UserName />
    <VeltCommentDialogWireframe.AssigneeBanner.ResolveButton />
  </div>
</VeltCommentDialogWireframe.AssigneeBanner>

comment-dialog-private-banner

Banner shown above the dialog when the comment thread is in private mode.
  • Public element: <velt-comment-dialog-private-banner>
  • Wireframe tag: <velt-comment-dialog-private-banner-wireframe>
PropertyValue
Extra variablesNone.
shouldShowisPrivateComment === true and annotation.comments.length > 0.
Host classvelt-private-comment--heading

comment-dialog-ghost-banner

Banner shown when the annotation has lost its DOM target.
  • Public element: <velt-comment-dialog-ghost-banner>
  • Wireframe tag: <velt-comment-dialog-ghost-banner-wireframe>
PropertyValue
Extra variablesNone.
shouldShowshowGhostCommentMessage === true and !inlineCommentMode and annotation.comments.length > 0.
Host classvelt-ghost-banner

comment-dialog-visibility-banner

The “Public / Private / Selected people” banner shown above the dialog when visibility-options are enabled.
  • Public element: <velt-comment-dialog-visibility-banner>
  • Wireframe tag: <velt-comment-dialog-visibility-banner-wireframe>
  • Children: *-dropdown, *-icon, *-text
PropertyValue
Extra variablesNone.
shouldShowvisibilityOptions === true and private comments feature is enabled.
Host classvelt-visibility-banner
<VeltCommentDialogWireframe.VisibilityBanner>
  <VeltCommentDialogWireframe.VisibilityBanner.Icon />
  <VeltCommentDialogWireframe.VisibilityBanner.Text />
  <VeltCommentDialogWireframe.VisibilityBanner.Dropdown />
</VeltCommentDialogWireframe.VisibilityBanner>

comment-dialog-metadata

Renders an annotation.metadata.metadataTemplate strip above the comment list.
  • Public element: <velt-comment-dialog-metadata>
  • Wireframe tag: <velt-comment-dialog-metadata-wireframe>
PropertyValue
Extra variablesNone.
shouldShowannotation.metadata.metadataTemplate.length > 0 and annotation.comments.length > 0.
Host classvelt-comment-dialog--metadata-container

comment-dialog-comment-category

Category chip(s) shown when auto-categorization is enabled.
  • Public element: <velt-comment-dialog-comment-category>
  • Wireframe tag: <velt-comment-dialog-comment-category-wireframe>
PropertyValue
Extra variablesNone.
shouldShowenableAutoCategorize === true and annotation.commentCategories.length > 0.
Host classvelt-comment-category

comment-dialog-comment-index

Numeric index label — the “1 of N” indicator (sidebar mode).
  • Public element: <velt-comment-dialog-comment-index>
  • Wireframe tag: <velt-comment-dialog-comment-index-wireframe>
PropertyValue
Extra variablesNone.
shouldShowannotation.annotationIndex is set.
Host classvelt-comment-index

comment-dialog-comment-number

The annotation’s annotationNumber (the human-friendly “Comment #42” identifier).
  • Public element: <velt-comment-dialog-comment-number>
  • Wireframe tag: <velt-comment-dialog-comment-number-wireframe>
PropertyValue
Extra variablesNone.
shouldShowannotation.annotationNumber is set.
Host classvelt-comment-number

comment-dialog-comment-suggestion-status

The “Accepted” / “Rejected” badge shown in suggestion mode.
  • Public element: <velt-comment-dialog-comment-suggestion-status>
  • Wireframe tag: <velt-comment-dialog-comment-suggestion-status-wireframe>
PropertyValue
Extra variablesNone.
shouldShowsuggestionMode === true and the annotation’s status id matches the configured accepted or rejected status.
Host classvelt-comment-suggestion-status

comment-dialog-reply-avatars

The collapsed-state strip showing avatars of users who have replied.
  • Public element: <velt-comment-dialog-reply-avatars>
  • Wireframe tag: <velt-comment-dialog-reply-avatars-wireframe>
  • Children: *-list, *-remaining-count
PropertyValue
Extra variablesNone.
shouldShowrepliesUniqueUsers.length > 0.
Host classvelt-comment-dialog-reply-avatars

comment-dialog-toggle-reply

The “View replies (N)” / “Hide replies” toggle below a collapsed thread.
  • Public element: <velt-comment-dialog-toggle-reply>
  • Wireframe tag: <velt-comment-dialog-toggle-reply-wireframe>
  • Children: *-count, *-icon, *-text
PropertyValue
Extra variablesNone.
shouldShow`(!isDialogSelectedcollapsedComments)**and**annotation.comments.length > 0`.
Host classvelt-toggle-reply
<VeltCommentDialogWireframe.ToggleReply>
  <VeltCommentDialogWireframe.ToggleReply.Count />
  <VeltCommentDialogWireframe.ToggleReply.Text />
  <VeltCommentDialogWireframe.ToggleReply.Icon />
</VeltCommentDialogWireframe.ToggleReply>

comment-dialog-hide-reply

The “Hide replies” link shown when the dialog is expanded.
  • Public element: <velt-comment-dialog-hide-reply>
  • Wireframe tag: <velt-comment-dialog-hide-reply-wireframe>
PropertyValue
Extra variablesNone.
shouldShow!collapsedComments and isDialogSelected and annotation.comments.length > 1.
Host classvelt-comment-dialog-hide-reply-container

comment-dialog-more-reply

The “Show N more replies…” expander row between the first comment and the rest.
  • Public element: <velt-comment-dialog-more-reply>
  • Wireframe tag: <velt-comment-dialog-more-reply-wireframe>
PropertyValue
Extra variablesNone.
shouldShowisDialogSelected and !showAllComments and annotation.comments.length > 2.
Host classvelt-hidden-count

comment-dialog-navigation-button

Sidebar-mode pin-navigation button that scrolls to the related annotation in the document.
  • Public element: <velt-comment-dialog-navigation-button>
  • Wireframe tag: <velt-comment-dialog-navigation-button-wireframe>
PropertyValue
Extra variablesNone.
shouldShow!annotation.isPageAnnotation.

comment-dialog-all-comment

The “View all comments” footer button that opens the comments sidebar.
  • Public element: <velt-comment-dialog-all-comment>
  • Wireframe tag: <velt-comment-dialog-all-comment-wireframe>
PropertyValue
Extra variablesNone.
shouldShowisDialogSelected and annotation.comments.length > 0 and dialogMode === true and sidebarButtonOnCommentDialogVisible === true.

The “Copy link” button — copies a deep-link to this annotation to the clipboard.
  • Public element: <velt-comment-dialog-copy-link>
  • Wireframe tag: <velt-comment-dialog-copy-link-wireframe>
PropertyValue
Extra variablesNone.

comment-dialog-sign-in

“Sign in” button shown to anonymous users.
  • Public element: <velt-comment-dialog-sign-in>
  • Wireframe tag: <velt-comment-dialog-sign-in-wireframe>
PropertyValue
Extra variablesNone.
shouldShowisDialogSelected and annotation.comments.length > 0 and user is anonymous and enableSignInButton === true.

comment-dialog-upgrade

“Upgrade” button shown when the workspace plan has expired.
  • Public element: <velt-comment-dialog-upgrade>
  • Wireframe tag: <velt-comment-dialog-upgrade-wireframe>
PropertyValue
Extra variablesNone.
shouldShowisDialogSelected and annotation.comments.length > 0 and isPlanExpired === true and enableUpgradeButton === true.

Deeply-Nested Wireframe Tags

The primitives below decompose further into per-element wireframe tags. Each tag is registered separately and inherits the relevant parent’s context variables.

Composer attachments tags

The composer-attachments primitive renders three sub-trees: selected (valid pending uploads — image vs. other file), invalid (rejected files), and other non-image files.
TagNotesExample
<velt-comment-dialog-composer-attachments-selected-wireframe>Valid-files row container.<velt-data field="selectedFiles.length" />
<velt-comment-dialog-composer-attachments-invalid-wireframe>Invalid-files row container.velt-if="{invalidSelectedFiles.length} > 0"
<velt-comment-dialog-composer-attachments-invalid-item-wireframe>A single invalid-file row.<velt-data field="invalidFile.errorMessage" />
<velt-comment-dialog-composer-attachments-invalid-item-message-wireframe>Error-message text.<velt-data field="invalidFile.errorMessage" />
<velt-comment-dialog-composer-attachments-invalid-item-preview-wireframe>Thumbnail preview of the rejected file.(per-iteration)
<velt-comment-dialog-composer-attachments-invalid-item-delete-wireframe>Delete (×) button.(click handler)
<velt-comment-dialog-composer-attachments-image-wireframe>Image-attachment row.<velt-data field="file.url" />
<velt-comment-dialog-composer-attachments-image-preview-wireframe>Image preview thumbnail.<velt-data field="file.url" />
<velt-comment-dialog-composer-attachments-image-loading-wireframe>Loading-state shimmer.velt-class="'is-uploading': {file.uploading}"
<velt-comment-dialog-composer-attachments-image-download-wireframe>Download button.(click handler)
<velt-comment-dialog-composer-attachments-image-delete-wireframe>Delete (×) button.(click handler)
<velt-comment-dialog-composer-attachments-other-wireframe>Non-image attachment row.<velt-data field="file.file.name" />
<velt-comment-dialog-composer-attachments-other-icon-wireframe>File-type icon.velt-class="'icon-{file.fileType}': true"
<velt-comment-dialog-composer-attachments-other-name-wireframe>File name.<velt-data field="file.file.name" />
<velt-comment-dialog-composer-attachments-other-size-wireframe>File-size label.<velt-data field="file.file.size" />
<velt-comment-dialog-composer-attachments-other-loading-wireframe>Loading shimmer.velt-class="'is-uploading': {file.uploading}"
<velt-comment-dialog-composer-attachments-other-download-wireframe>Download button.(click handler)
<velt-comment-dialog-composer-attachments-other-delete-wireframe>Delete button.(click handler)

Status / Priority / Custom-annotation dropdown tags

TagNotesExample
<velt-comment-dialog-status-dropdown-content-item-icon-wireframe>Icon inside a status-option row.<velt-data field="statusObj.svg" />
<velt-comment-dialog-status-dropdown-content-item-name-wireframe>Name inside a status-option row.<velt-data field="statusObj.name" />
<velt-comment-dialog-priority-dropdown-content-item-icon-wireframe>Icon inside a priority-option row.<velt-data field="priorityObj.svg" />
<velt-comment-dialog-priority-dropdown-content-item-name-wireframe>Name inside a priority-option row.<velt-data field="priorityObj.name" />
<velt-comment-dialog-priority-dropdown-content-item-tick-wireframe>Selected-tick inside a priority-option row.velt-class="'is-selected': '{priorityObj.id} === {annotation.priority.id}'"
<velt-comment-dialog-custom-annotation-dropdown-trigger-list-item-wireframe>A single selected-chip pill in the trigger.<velt-data field="item.label" />
<velt-comment-dialog-custom-annotation-dropdown-content-item-icon-wireframe>Icon inside a custom-chip option row.<velt-data field="item.icon" />
<velt-comment-dialog-custom-annotation-dropdown-content-item-label-wireframe>Label inside a custom-chip option row.<velt-data field="item.label" />

Options dropdown content variants

The options-dropdown-content rows have variant-specific tags so customers can override “delete comment” vs “delete thread”, “subscribe” vs “unsubscribe”, etc.
TagNotesExample
<velt-comment-dialog-options-dropdown-content-delete-comment-wireframe>”Delete comment” variant.velt-if="{commentIndex} !== 0"
<velt-comment-dialog-options-dropdown-content-delete-thread-wireframe>”Delete entire thread” variant.velt-if="{commentIndex} === 0"
<velt-comment-dialog-options-dropdown-content-make-private-enable-wireframe>”Make private” variant.velt-if="!{isPrivateComment}"
<velt-comment-dialog-options-dropdown-content-make-private-disable-wireframe>”Make public” variant.velt-if="{isPrivateComment}"
<velt-comment-dialog-options-dropdown-content-mark-as-read-mark-read-wireframe>”Mark as read” variant.velt-if="{annotation.unread}"
<velt-comment-dialog-options-dropdown-content-mark-as-read-mark-unread-wireframe>”Mark as unread” variant.velt-if="!{annotation.unread}"
<velt-comment-dialog-options-dropdown-content-notification-subscribe-wireframe>”Subscribe” variant.velt-if="!{notificationEnabled}"
<velt-comment-dialog-options-dropdown-content-notification-unsubscribe-wireframe>”Unsubscribe” variant.velt-if="{notificationEnabled}"

Thread-card / seen-dropdown / reply-avatars tags

TagNotesExample
<velt-comment-dialog-thread-card-message-show-more-wireframe>”Show more” link on a truncated message.velt-if="{isTruncated} && !{isExpanded}"
<velt-comment-dialog-thread-card-message-show-less-wireframe>”Show less” link on an expanded message.velt-if="{isExpanded}"
<velt-comment-dialog-thread-card-seen-dropdown-content-item-avatar-wireframe>Per-viewer avatar inside the seen-dropdown items.<velt-data field="user.photoUrl" />
<velt-comment-dialog-thread-card-seen-dropdown-content-item-name-wireframe>Per-viewer name.<velt-data field="user.name" />
<velt-comment-dialog-thread-card-seen-dropdown-content-item-time-wireframe>Per-viewer viewed-at timestamp.<velt-data field="viewedAt" />
<velt-comment-dialog-reply-avatars-list-item-wireframe>Single reply-avatars list item.<velt-data field="user.photoUrl" />

Visibility banner tags

The visibility banner’s dropdown decomposes into trigger (icon + label + selected-avatar list) + content (per-option rows).
TagNotesExample
<velt-comment-dialog-visibility-banner-dropdown-trigger-wireframe>Trigger pill of the visibility-banner dropdown.velt-class="'mode-{selectedVisibility}': true"
<velt-comment-dialog-visibility-banner-dropdown-trigger-icon-wireframe>Icon inside the trigger.velt-class="'visibility-{selectedVisibility}': true"
<velt-comment-dialog-visibility-banner-dropdown-trigger-label-wireframe>Label inside the trigger.<velt-data field="selectedVisibility" />
<velt-comment-dialog-visibility-banner-dropdown-trigger-avatar-list-wireframe>Selected-people avatar list inside the trigger.<velt-data field="selectedVisibilityUsers.length" />
<velt-comment-dialog-visibility-banner-dropdown-trigger-avatar-list-item-wireframe>Per-user avatar inside the trigger list.<velt-data field="user.photoUrl" />
<velt-comment-dialog-visibility-banner-dropdown-trigger-avatar-list-remaining-count-wireframe>”+N” badge on the trigger list.<velt-data field="remainingCount" />
<velt-comment-dialog-visibility-banner-dropdown-content-wireframe>Open menu wrapper.(visibility-options list)
<velt-comment-dialog-visibility-banner-dropdown-content-item-wireframe>Per-option row.velt-class="'selected': '{option.value} === {selectedVisibility}'"
<velt-comment-dialog-visibility-banner-dropdown-content-item-icon-wireframe>Per-option icon.<velt-data field="option.icon" />
<velt-comment-dialog-visibility-banner-dropdown-content-item-label-wireframe>Per-option label.<velt-data field="option.label" />

Putting it together

A typical custom Comment Dialog that gates the resolve button by capability + permission, swaps in an “editing” indicator while a comment is being edited, and renders the iterating comment text:
<VeltCommentDialogWireframe>
  <div className="my-dialog" velt-class="'is-editing': {editComment}">
    <VeltCommentDialogWireframe.Header>
      <VeltCommentDialogWireframe.ResolveButton
        velt-if="{enableResolve} && {canResolveAnnotation}">
        Resolve
      </VeltCommentDialogWireframe.ResolveButton>
    </VeltCommentDialogWireframe.Header>

    <VeltCommentDialogWireframe.Threads>
      <VeltCommentDialogWireframe.ThreadCard>
        <article className="my-comment">
          <strong><velt-data field="comment.from.name" /></strong>
          <p><velt-data field="comment.commentText" /></p>
        </article>
      </VeltCommentDialogWireframe.ThreadCard>
    </VeltCommentDialogWireframe.Threads>

    <VeltCommentDialogWireframe.Composer />
  </div>
</VeltCommentDialogWireframe>