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 Multithread Comments wireframe (a multi-thread comment dialog) hosts multiple comment threads in a single panel. Variables below are available inside any <velt-multi-thread-comment-dialog-...-wireframe> tag via three forms:
You want to…UseExample
Display a value as text<velt-data field="var" /><velt-data field="nonDraftCommentsCount" />
Hide / show conditionallyvelt-if="{var}"velt-if="{noCommentsFound}"
Toggle a CSS classvelt-class="'cls': {var}"velt-class="'filter-{minimalFilter}': true"
All variables are mapped — reference them by their short name. You do not need the componentConfig. prefix.
Naming conflicts — use full path. A few names collide with mappings used by Comment Dialog. Inside a Multithread Comments wireframe, prefer the explicit path on the right when reading these values:
Conflicting nameUse this in Multithread Comments
userdata.user
shadowDomparentLocalUIState.shadowDom (per-render) or uiState.shadowDom (per-instance)
The list iterates through the standard Comment Dialog primitives — see Comment Dialog Wireframe Variables for variables that resolve inside nested dialog tags.

Data State

Per-instance data: the live thread list, the focused / draft annotation, and host-application context.
VariableTypeDescriptionExample
annotationCommentAnnotation | nullCurrently focused annotation.velt-if="{annotation}"
annotation.annotationIdstringId of the focused annotation.<velt-data field="annotation.annotationId" />
annotationsCommentAnnotation[]All annotations in scope.<velt-data field="annotations.length" />
filteredAnnotationsCommentAnnotation[]Annotations after filter / sort is applied.<velt-data field="filteredAnnotations.length" />
multiThreadAnnotationIdstring | nullId of the multi-thread anchor annotation.<velt-data field="multiThreadAnnotationId" />
multiThreadCommentAnnotationCommentAnnotationAnchor annotation object.<velt-data field="multiThreadCommentAnnotation.annotationId" />
nonDraftCommentsCountnumberCount of non-draft threads.<velt-data field="nonDraftCommentsCount" />
data.userUser | nullCurrently identified end-user.<velt-data field="data.user.name" />
containerComponentIdstring | nullOwning container id (host wiring).<velt-data field="containerComponentId" />
contextanyFree-form annotation context.<velt-data field="context.foo" />
data.contextIdstring | nullContext id linking this dialog to a host context.<velt-data field="data.contextId" />

UI State

Per-instance UI flags driven by the dialog itself.
VariableTypeDescriptionExample
commentPinSelectedbooleanPin associated with the focused annotation is selected.velt-class="'pin-selected': {commentPinSelected}"
commentPinTypestring | nullPin shape ('pin', 'bubble', etc.).<velt-data field="commentPinType" />
inboxModebooleanInbox-style layout is active.velt-class="'inbox': {inboxMode}"
readOnlybooleanDialog is in read-only mode.velt-class="'readonly': {readOnly}"
hideMultiThreadAnnotationComposerbooleanAnchor-annotation composer should be hidden.velt-if="!{hideMultiThreadAnnotationComposer}"
dialogVariantstringVariant forwarded to nested comment-dialogs.<velt-data field="dialogVariant" />
minimalFilter'all' | 'read' | 'unread' | 'resolved'Currently selected filter row.velt-class="'filter-{minimalFilter}': true"
selectedMinimalFilterDropdownOption.sortingSidebarSortingCriteriaCurrently selected sort row.<velt-data field="selectedMinimalFilterDropdownOption.sorting" />
selectedMinimalFilterDropdownOption.filter'all' | 'read' | 'unread' | 'resolved'Selected filter (mirrors minimalFilter).velt-class="'selected-{selectedMinimalFilterDropdownOption.filter}': true"
minimalFilterDropdownOpenbooleanFilter+sort dropdown menu is open.velt-class="'open': {minimalFilterDropdownOpen}"
minimalActionsDropdownOpenbooleanBulk-actions dropdown menu is open.velt-class="'open': {minimalActionsDropdownOpen}"
noCommentsFoundForAppliedFiltersbooleanFilters reduced the list to zero.velt-if="{noCommentsFoundForAppliedFilters}"
noCommentsFoundbooleanNo annotations exist in scope.velt-if="{noCommentsFound}"
darkModebooleanDark mode is active.velt-class="'dark': {darkMode}"
variantstring | nullPer-instance variant tag set on the host element.<velt-data field="variant" />
uiState.shadowDombooleanShadow-DOM rendering is enabled (per-instance).Host config — set via element attribute.
parentLocalUIState.darkModebooleanDark-mode flag (per-render). Alias for darkMode.Host config — set via element attribute.
parentLocalUIState.variantstringVariant tag (per-render). Alias for variant.Host config — set via element attribute.
parentLocalUIState.shadowDombooleanShadow-DOM flag (per-render).Host config — set via element attribute.

Common Props

Every Multithread Comments primitive accepts:
React PropHTML AttributeTypeDefaultDescription
defaultConditiondefault-conditionboolean | "true" | "false"trueWhen false, the component always renders regardless of internal state.
Signal inputs (for parent-child component composition):
  • [componentConfigSignal] — shared per-instance config signal (annotation list, filter / sort state).
  • [parentLocalUIState] — per-instance UI state signal.

Context-Specific Variables

Only resolvable inside the nested wireframe tags noted in the Available in column.
VariableTypeAvailable inExample
isSelectedbooleanAll six *-minimal-filter-dropdown-content-{filter,sort}-* tagsvelt-class="'is-selected': {isSelected}"

Type Reference

Types referenced by the variables above are documented in Data Models:
TypeDescription
CommentAnnotationThe annotation thread (id, status, comments, etc.).
UserIdentified end-user object.
SidebarSortingCriteriaSort-option discriminator shared with the sidebar ('date', 'unread', or null).

Subcomponents

Each subcomponent below has its own wireframe tag.

multi-thread-comment-dialog-panel

The customer-facing root panel container.
  • Public element: <velt-multi-thread-comment-dialog-panel>
  • Wireframe tag: <velt-multi-thread-comment-dialog-panel-wireframe>
PropertyValue
Extra variablesNone — root only sees common variables.

multi-thread-comment-dialog-list

Iterates filteredAnnotations and renders a comment-dialog primitive per annotation. Inside, the standard Comment Dialog Wireframe Variables apply.
  • Public element: <velt-multi-thread-comment-dialog-list>
  • Wireframe tag: <velt-multi-thread-comment-dialog-list-wireframe>
PropertyValue
Extra variablesNone at the list level. The nested comment-dialog tags receive commentObj / commentIndex from each iteration.

multi-thread-comment-dialog-comment-count

The count label at the top.
  • Public element: <velt-multi-thread-comment-dialog-comment-count>
  • Wireframe tag: <velt-multi-thread-comment-dialog-comment-count-wireframe>
PropertyValue
Extra variablesNone beyond common variables.
<VeltMultiThreadCommentDialogWireframe.CommentCount>
  <velt-data field="nonDraftCommentsCount" /> threads
</VeltMultiThreadCommentDialogWireframe.CommentCount>

multi-thread-comment-dialog-empty-placeholder

Empty-state shown when filters reduce the list to zero or no annotations exist.
  • Public element: <velt-multi-thread-comment-dialog-empty-placeholder>
  • Wireframe tag: <velt-multi-thread-comment-dialog-empty-placeholder-wireframe>
PropertyValue
Extra variablesNone beyond common variables.
shouldShow`noCommentsFoundnoCommentsFoundForAppliedFilters`
<VeltMultiThreadCommentDialogWireframe.EmptyPlaceholder
  velt-if="{noCommentsFound} || {noCommentsFoundForAppliedFilters}">
  <p>No threads to show.</p>
</VeltMultiThreadCommentDialogWireframe.EmptyPlaceholder>

multi-thread-comment-dialog-close-button

The close button.
  • Public element: <velt-multi-thread-comment-dialog-close-button>
  • Wireframe tag: <velt-multi-thread-comment-dialog-close-button-wireframe>
PropertyValue
Extra variablesNone.

multi-thread-comment-dialog-new-thread-button

The add-thread button.
  • Public element: <velt-multi-thread-comment-dialog-new-thread-button>
  • Wireframe tag: <velt-multi-thread-comment-dialog-new-thread-button-wireframe>
PropertyValue
Extra variablesNone.

multi-thread-comment-dialog-reset-filter-button

Shown inside the empty placeholder when filters are active.
  • Public element: <velt-multi-thread-comment-dialog-reset-filter-button>
  • Wireframe tag: <velt-multi-thread-comment-dialog-reset-filter-button-wireframe>
PropertyValue
Extra variablesNone.
shouldShownoCommentsFoundForAppliedFilters

multi-thread-comment-dialog-composer-container

The new-thread composer container.
  • Public element: <velt-multi-thread-comment-dialog-composer-container>
  • Wireframe tag: <velt-multi-thread-comment-dialog-composer-container-wireframe>
PropertyValue
Extra variablesNone at the container level. The nested composer injects editMode / commentObj / commentIndex — see Comment Dialog Wireframe Variables.
shouldShow!hideMultiThreadAnnotationComposer

Deeply-Nested Wireframe Tags

The filter+sort dropdown and bulk-actions dropdown decompose further. Each tag below has its own <velt-multi-thread-comment-dialog-...-wireframe> registration.

Multi-Thread root tag

TagNotesExample
<velt-multi-thread-comment-dialog-wireframe>Outer wireframe — wraps the entire panel. The panel child is the visible container.(composes the panel)

Minimal filter dropdown tags

The filter+sort dropdown (similar to the sidebar’s minimal-filter-dropdown). Each row exposes isSelected.
TagNotesExample
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-wireframe>Root.velt-class="'open': {minimalFilterDropdownOpen}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-trigger-wireframe>Trigger pill.(click handler)
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-wireframe>Open menu.velt-class="'open': {minimalFilterDropdownOpen}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-filter-all-wireframe>”All” filter row. Exposes isSelected.velt-class="'is-selected': {isSelected}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-filter-read-wireframe>”Read” filter row. Exposes isSelected.velt-class="'is-selected': {isSelected}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-filter-unread-wireframe>”Unread” filter row. Exposes isSelected.velt-class="'is-selected': {isSelected}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-filter-resolved-wireframe>”Resolved” filter row. Exposes isSelected.velt-class="'is-selected': {isSelected}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-selected-icon-wireframe>Per-row selected tick.velt-if="{isSelected}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-sort-date-wireframe>”Sort by date” row. Exposes isSelected.velt-class="'is-selected': {isSelected}"
<velt-multi-thread-comment-dialog-minimal-filter-dropdown-content-sort-unread-wireframe>”Sort by unread” row. Exposes isSelected.velt-class="'is-selected': {isSelected}"

Minimal actions dropdown tags

The bulk-actions dropdown (“Mark all as read”, “Mark all as resolved”).
TagNotesExample
<velt-multi-thread-comment-dialog-minimal-actions-dropdown-wireframe>Root.velt-class="'open': {minimalActionsDropdownOpen}"
<velt-multi-thread-comment-dialog-minimal-actions-dropdown-trigger-wireframe>Trigger (”⋯”).(click handler)
<velt-multi-thread-comment-dialog-minimal-actions-dropdown-content-wireframe>Open menu.velt-class="'open': {minimalActionsDropdownOpen}"
<velt-multi-thread-comment-dialog-minimal-actions-dropdown-content-mark-all-read-wireframe>”Mark all as read” action row.(click handler)
<velt-multi-thread-comment-dialog-minimal-actions-dropdown-content-mark-all-resolved-wireframe>”Mark all as resolved” action row.(click handler)

Putting it together

A typical Multithread Comments header that shows the thread count, swaps an empty placeholder when filters reduce the list to zero, and lights up the filter pill while the dropdown is open:
<VeltMultiThreadCommentDialogPanelWireframe>
  <header className="my-mt__header">
    <VeltMultiThreadCommentDialogWireframe.CommentCount>
      <velt-data field="nonDraftCommentsCount" /> threads
    </VeltMultiThreadCommentDialogWireframe.CommentCount>
    <VeltMultiThreadCommentDialogWireframe.MinimalFilterDropdown.Trigger
      velt-class="'open': {minimalFilterDropdownOpen}">
      <span><velt-data field="minimalFilter" /></span>
    </VeltMultiThreadCommentDialogWireframe.MinimalFilterDropdown.Trigger>
  </header>

  <VeltMultiThreadCommentDialogWireframe.List />

  <VeltMultiThreadCommentDialogWireframe.EmptyPlaceholder
    velt-if="{noCommentsFound} || {noCommentsFoundForAppliedFilters}">
    <p>No threads to show.</p>
    <VeltMultiThreadCommentDialogWireframe.ResetFilterButton />
  </VeltMultiThreadCommentDialogWireframe.EmptyPlaceholder>

  <VeltMultiThreadCommentDialogWireframe.ComposerContainer
    velt-if="!{hideMultiThreadAnnotationComposer}" />
</VeltMultiThreadCommentDialogPanelWireframe>