Skip to main content
VeltCommentDialog, VeltMultiThreadCommentDialog, VeltCommentText, VeltInlineCommentsSection, and VeltInlineReactionsSection are the comment-thread rendering surfaces: they render an annotation’s thread (and its composer) in a specific context. This file owns the layer above Props for these five: what every prop does at runtime, its default, and how it combines with the others, plus the default behaviors you get with no prop at all.
  • Anchored vs static (the key axis):
    • VeltCommentDialog is the anchored, Velt-positioned floating pin dialog: it renders one comment thread (one annotation) and Velt anchors it to its pin/overlay. It does not place itself: it only emits a reposition request on resize. See Behaviors → Positioning ownership.
    • VeltMultiThreadCommentDialog is the same anchored surface, but it hosts many comment threads (annotations) at one pin location: a list with per-thread filter/sort, mark-all-read/resolved bulk actions, a “new thread” button, and an empty placeholder. Single dialog = one thread; multi-thread dialog = a container of selectable threads at one anchor.
    • VeltInlineCommentsSection is statically placed / in-flow: it renders a thread list inside your own layout (a plain role="region" container), scoped to a targetElementId/folder/context: not a floating overlay. It actively suppresses the floating pin avatars on its target element (comments live in the section list instead).
    • VeltInlineReactionsSection is the reactions analogue: a statically-placed emoji/reaction bar bound to a target element.
    • VeltCommentText turns a piece of your own content into a clickable, comment-anchored hotspot: it projects your content and opens the bound annotation’s dialog (single or multi-thread) as a floating overlay on hover/selection.
  • Anchored-vs-static classification: see Component definitions.
  • Shared deep behaviors: the dialog’s collapse structure (collapsedComments × collapsedRepliesPreview), composer open/collapsed lifecycle, variant → context scoping, the dialog state machine, placeholder priority, and fullExpanded vs default all live in Behaviors. The per-prop rows below give what each prop does and link there for the full interaction/state-machine detail: they do not repeat the long explanations.

Per-prop behavior (exhaustive)

The exhaustive per-prop behavior for these five surfaces is organized per component below: each ## Velt… subsection carries that component’s full prop table (default + runtime behavior + interactions) and its own ### Default behaviors (no prop needed) block, the nested shape the template sanctions. Every prop in Props for these components is covered; see Provable coverage.

VeltCommentDialog

The single-thread, anchored pin dialog. It renders one annotation’s thread plus its composer, and selects one of three internal layout modes from mutually-exclusive predicates: dialog/inbox mode (the default floating-pin branch), sidebar mode (sidebarMode), and inline-section mode (inlineCommentSectionMode). The top-level render gate is the visibility condition AND the show-default condition.
PropDefaultBehaviorInteractions & gotchas
annotationId(none)Binds the dialog to a specific annotation; resolves/creates that annotation’s shared config so the real thread loads (vs. an empty composer). Falls back to the annotation-id attribute when unset.Required for standalone use. Superseded when a parent passes the annotation object / config directly. Changing it re-syncs the thread. Also the anonymousEmail override no-ops without it.
multiThreadAnnotationId(none)Selects one thread within a multi-thread pin; written into UI state and adds the --multi-thread-mode host class.Styling/scoping only: no separate layout branch here. Meaningful only when the annotation is part of a multi-thread pin.
defaultConditiontrueRender gate. true honors the normal “config + annotation present” visibility check; false short-circuits it so the dialog always renders (testing/docs escape hatch).Tri-state string-coerced (''/'true' → true). Only affects visibility, not mode selection.
inlineCommentSectionModefalseSwitches the dialog into inline-section layout (used when rendered inside VeltInlineCommentsSection).Mutually exclusive with sidebarMode and dialog mode. Forced false for the standalone annotation-id path unless explicitly set. Only this mode honors composerPosition top/bottom.
commentPinSelectedfalseWhether the source pin is selected. OR’d with fullExpanded into the dialog’s selected state → selected host class, which (with default expandOnSelection) reveals all comments + composer. On select it marks an unread annotation read and requests overlay reposition; on deselect it saves/cancels any draft.String-coerced ('' → true). Drives the selection half of the dialog state machine. Interacts with fullExpanded, expandOnSelection, focusedThreadMode, pageModeComposer.
fullExpandedfalseForces the thread fully expanded (every comment, no message truncation) regardless of selection. OR’d with commentPinSelected into the selected state.Opposite end from collapsedComments: don’t set both. See Behaviors → fullExpanded vs default.
shadowDomtrueShadow-DOM style isolation for the dialog. Priority: explicit prop value → host’s dialogShadowDOM → default true. When explicitly true, wraps the wireframe host in an internal shadow-DOM element.String-coerced: only literal 'false' turns it off. See Behaviors → shadowDom vs dialogShadowDom.
darkModefalseDark theme; stored in UI state and synced to the themed component. Purely visual.Component-level value overrides global/feature dark mode.
readOnlyfalseView-only. When true, hides the header, composer, and composer-top/bottom (the templates guard on !readOnly).Both composerPosition resolvers require !readOnly, so a read-only dialog shows no composer in any position.
sidebarModefalseSwitches the dialog into sidebar layout (the dialog as rendered inside the comments sidebar).Mutually exclusive with inline-section and dialog modes. Pairs with expandOnSelection={false} for selection-without-expansion in the sidebar list.
isFocusedThreadEnabledfalseEnables focused-thread affordances (consumed by child header/primitives).Pairs with focusedThreadMode / openAnnotationInFocusMode. No direct template branch in the dialog itself.
openAnnotationInFocusModefalseMarks that selecting the annotation should open it in focus mode (emitted via the open-focused-thread output).Emits the focus-mode request; this reference does not document the receiving surface.
expandOnSelectiontrueWhether selecting the dialog expands it (replies + composer) or only selects it. false lets a sidebar thread be selected without expanding (stays a first+last preview, composer stays hidden).Sidebar-context behavior. The selection→expanded edge of the state machine.
inlineCommentModefalseAdds the inline-comment-mode classes (a styling mode distinct from inline-section mode), but only when isInsidePdfViewer is false.Suppressed inside a PDF viewer. Do not confuse with inlineCommentSectionMode.
inboxModefalseInbox rendering: adds the inbox classes and forces show-all-comments on. Rendered inside the dialog/inbox branch.Shares the dialog-mode branch with the default floating dialog.
isInsidePdfViewerfalseAdjusts behavior inside a PDF viewer; in particular it suppresses the inlineCommentMode classes.Gates inlineCommentMode. Also set automatically from bottom-sheet data.
multiThreadfalseMarks this dialog as part of a multi-thread annotation (feature-state flag).Styling via multiThreadAnnotationId; the actual many-threads list is VeltMultiThreadCommentDialog. No direct branch here.
commentComposerModefalseComposer-only styling mode: adds the --comment-composer-mode class.None
dialogSelectiontrueGoverns whether sidebar selection behavior is allowed (consumed by sidebar parents).No local template branch; this reference documents no downstream effect beyond enabling sidebar selection.
dialogModetrue (effective)Drives the dialog/--dialog-mode classes and the “all comments” button.Gotcha: the input is effectively inert as a wire-through: the component sets dialog mode to true independently rather than reading this prop. Passing false has no documented effect in this reference.
focusedThreadModefalseFocused-thread layout: adds the --focused-thread-mode class. Critically, when true it skips draft auto-save / abandon-draft on destroy/change (back-nav safety).Interacts with draft behavior, pageModeComposer.
pageModeComposerfalsePage-mode composer instance: adds the --page-mode-composer class; never creates/saves drafts; only this instance answers page-mode focus requests; overrides the sidebar branch so the dialog branch renders.The page-level composer for sidebar pageMode: see Behaviors → embedMode / pageMode.
messageTruncationfalseTruncates long message bodies with show-more/less.Pairs with messageTruncationLines. Independent of how many comment cards render. See Behaviors → fullExpanded vs default.
initialEditCommentIndexnullOpens the dialog with a specific comment index in edit mode (after view init, if the index is in range, enters edit mode for that comment).number | string | null; out-of-range / negative is ignored. The timeout is cleared on destroy.
messageTruncationLines4Max lines shown before truncation.Only effective when messageTruncation is true. String-coerced via parseInt, falling back to 4.
variant'dialog'Picks the named dialog wireframe variant: resolves velt-comment-dialog-wireframe---<variant> for a custom template.The variant is also the scoping key. Setting it on VeltComments changes the floating pin dialog only; sidebar/inline/page contexts have their own variant props. See Behaviors → Variant → context scoping.
composerPosition'bottom' (effective)Composer placement in inline-section mode: 'top' renders the composer above the thread, unset/'bottom' below.No effect in dialog/sidebar mode (composer is always bottom there). Both resolvers also require !readOnly.
sortBy(none → natural/creation order)Sort field for the comment list ('createdAt' / 'lastUpdated'). Only written when defined.Applied together with sortOrder. Ordering only: does not collapse/hide cards. See Behaviors → sortBy × sortOrder.
sortOrder(none)Sort direction ('asc' / 'desc'). Only written when defined.Pairs with sortBy.
commentPinType'pin'The pin type this dialog belongs to ('bubble' | 'pin' | 'chart' | 'text'); appended to the wireframe cache key so each pin type can resolve a distinct template.Normally set by the portal, not by you. No layout branch.
containerComponentId(none, '')Id of the owning container component; used for scoping.No local template branch.
targetElementId(none)Anchor element id. Used to match incoming composer file-attachment events: a batch applies when its target id is empty or equals this.Not stored in the dialog config: it is an event filter, not a positioning input (Velt owns placement).
targetComposerElementId(none)Composer anchor element id, passed down to every composer instance to anchor the composer to an external element.Re-applied after config swaps.
locationVersion(none, '')Version tag for the annotation’s location, stored in UI state.No local branch; used downstream for location resolution.
locationDisplayName(none)Intended display name for the location.Gotcha: declared but never read in the dialog or its primitives: effectively inert here. This reference documents no other consuming surface.
context(none)Free-form key/value object set at the config root; new comments created here carry it, and velt-data children can interpolate {context.xxx}.Updated on the annotation and composer paths. Does not retro-tag existing comments.
placeholder(none)Generic composer placeholder set at the config root with the highest priority: overrides commentPlaceholder / replyPlaceholder.Written only when truthy. See the placeholder priority chain.
commentPlaceholder(none)Placeholder for the new-comment composer (thread has no comments yet).Overridden by placeholder; never co-applies with replyPlaceholder (comment count decides which is live). See the priority chain.
replyPlaceholder(none)Placeholder for the reply composer (thread already has comments).Overridden by placeholder. See the priority chain.
editPlaceholder(none)Generic edit-mode placeholder.The edit chain is separate from the new-comment chain; editCommentPlaceholder / editReplyPlaceholder are the more specific edit placeholders.
editCommentPlaceholder(none)Placeholder when editing a top-level comment.More specific than editPlaceholder.
editReplyPlaceholder(none)Placeholder when editing a reply.More specific than editPlaceholder; use the specific top-level/reply placeholders when you need different copy for each edit context.
anonymousEmail(none)Per-annotation override for whether anonymous email mentions are allowed in this dialog’s annotation context. When set, applies a local override for the annotation; when cleared, removes it.No-op without an annotationId (it keys on the annotation). Per-annotation override of the global setting without mutating it.

Default behaviors (no prop needed)

  • Collapsed preview until selected: the dialog shows the first comment only until its pin is selected; selecting reveals all comments and (with default expandOnSelection) the composer. The composer is hidden until selection when the thread already has comments. Full collapse/preview structure (first + “N more replies” + last) lives in Behaviors → collapsedComments × collapsedRepliesPreview.
  • Composer opens collapsed: the composer renders collapsed (single line) and expands to full actions on focus/click, then collapses on submit: see Behaviors → Composer lifecycle / state machine.
  • Velt owns positioning: the dialog never places itself; it emits a reposition request when its size changes (composer expands, recording starts) and the host re-anchors. See Behaviors → Positioning ownership.
  • Selection / composer state is per dialog instance: the sidebar list, a focused thread, and a floating pin dialog for the same annotation do not leak selection/composer state into each other.

VeltMultiThreadCommentDialog

The many-threads-at-one-anchor dialog. It subscribes to all child comment-annotations under one multiThreadAnnotationId and renders them as a list with a comment-count, filter + sort dropdowns, mark-all-read / mark-all-resolved bulk actions, a “new thread” button, and an empty placeholder. Drilling into one child thread hides the top-level composer. State lives in a per-instance context config.
PropDefaultBehaviorInteractions & gotchas
annotationId(none)Standalone-primitive binding only: keys the per-instance context config (falling back to the multi-thread-annotation-id / annotation-id attribute), subscribing the annotations for that id.On the full root dialog this path is unused (the root assigns its own context id). With nothing set it uses the 'default' context.
multiThreadAnnotationId(none)The identifier of the multi-thread pin (the grouping of many threads). Drives the annotation subscription that populates the thread list, and seeds a fresh annotation with this id.Re-syncs on change and (for temporary annotations) re-subscribes. Passed to add-comment only when not a temporary id. The core scoping input.
annotation(none, required)The multi-thread annotation object passed directly. For a temporary annotation, the SDK subscribes by its child commentAnnotations keys instead of by id. Its location / metadata / context / targetElementId are extracted for new comments.On change, hides the top-level composer when a child annotation is selected, and (temporary case) re-subscribes when the child-comment count changes.
usernew User()The current/author user object, propagated down to composer/author context via the config signal.This reference documents config propagation only; no additional downstream consumer is listed.
commentPinSelectedfalseSelection/visual-state flag exposed in UI state for the source pin.No logic branch in this component; treat it as state for downstream styling and wireframes.
commentPinType(none, null)Categorizes the pin type, exposed in UI state.No branching here; use it as styling/wireframe state.
dialogVariant'dialog'Distinguishes the dialog presentation mode (e.g. 'dialog' vs bottom-sheet), stored in UI state and passed to child dialog primitives.Distinct from variant; this reference documents pass-through to child dialog primitives only.
variant(none → base wireframe)Picks the named wireframe variant: appends ---<variant> to velt-multi-thread-comment-dialog-wireframe to load a variant-specific template; also drives the dynamic-template directive. Stored in the per-instance local UI state.The template/skin selector for the multi-thread dialog. See Behaviors → Variant → context scoping.
inboxModefalseToggles the --inbox-mode container class, switching the dialog into inbox layout.Directly drives the host class (not just pass-through).
containerComponentId(none, null)Scopes new comments to a container component instance: passed straight into add-comment.None
context(none, null)Free-form context passed as the context argument when saving a new comment.For a temporary annotation, that annotation’s own context overrides this.
readOnlyfalseView-only flag exposed in UI state to suppress editing/composer affordances.Composer disabling happens downstream; this reference documents the read-only state handoff.
defaultConditiontrueRender gate via the conditional-render directive: true honors the normal visibility conditions, false bypasses them (always shows).Tri-state string-coerced (''/'true' → true).
onSaveComment(callback)Fires when a comment is saved. Gotcha: as exposed, it is wired through the component’s internal save method + the public saveComment output + a config function wrapper; persistence goes through the action service → add-comment, after which the new-thread annotation resets and the list scrolls to the bottom.Both the React on* output binding and config callback wrapper exist; this reference treats them as the same save hook surface.

Default behaviors (no prop needed)

  • Many threads, one anchor: unlike VeltCommentDialog (one thread), this dialog holds an array of annotations under one pin and renders list-only affordances (count, filter, sort, bulk mark-all, new-thread, empty placeholder).
  • Composer hides on drill-in: selecting one child thread hides the top-level “new thread” composer.
  • Standalone state from the factory: mounted as a standalone primitive without a root, its state comes from the default multi-thread config factory (e.g. shadow-DOM on, dialogVariant: 'dialog', minimal-filter 'all'), not from these inputs.

VeltCommentText

A content hotspot, not a text renderer. It projects your own content (ng-content) and, on hover/selection, opens the bound annotation’s dialog as a floating overlay anchored to the element. Both inputs are mutually-exclusive alternatives: supply one. Almost all of its runtime state (hover, selection, mode flags) is internal, populated from services/pointer events, not author-settable props.
PropDefaultBehaviorInteractions & gotchas
annotationId(none)Resolves the single-thread comment annotation and binds it as the hotspot’s annotation. On hover/selection, opens VeltCommentDialog in the overlay. Toggles a comment-available host attribute when the annotation resolves; self-removes from the DOM (~500ms) when the annotation is deleted.Visibility gating: a resolved/terminal annotation may be hidden unless resolved-comments-on-DOM display is enabled (or it is currently selected). This reference does not list the public toggle name for showing resolved comments. Use one of annotationId / multiThreadAnnotationId.
multiThreadAnnotationId(none)Resolves the multi-thread comment annotation and binds it; selecting opens VeltMultiThreadCommentDialog in the overlay (the multi-thread branch) instead of the single dialog. Self-removes on annotation delete.No terminal/resolved gating (adopted unconditionally). Mutually exclusive with annotationId.

Default behaviors (no prop needed)

  • Renders projected content + overlay, not a comment string: the component shows whatever you wrap inside it plus a connected-overlay dialog: it does not itself render “the latest comment text.” If you need the raw comment body as text, that is a Data-layer read (see Data models), not this component.
  • Pointer-driven open: pointerover / pointerout toggle hover; pointerup toggles pin selection, which surfaces the dialog overlay.

VeltInlineCommentsSection

A statically-placed, in-flow thread list scoped to a target element / folder / context. It renders a plain role="region" container (no portal, no pin anchor) and suppresses the floating pin avatars on its target (it sets data-velt-comment-disabled on the target and hides any pin portals the global system creates, restoring them on destroy). The section renders only when one of its gating values (targetElementId / folderId / context) is present.
PropDefaultBehaviorInteractions & gotchas
config(none)Inert in V2: the section manages state via services/signals; the V1 config setter was removed (its parsed value was discarded).Passing it is a no-op. Use targetElementId for identity.
targetInlineCommentElementId(none)@deprecated → targetElementId. Lowest-priority fallback in the target-coalescing chain; a change triggers a re-fetch.Ignored when targetElementId or targetCommentElementId is set.
targetCommentElementId(none)@deprecated → targetElementId. Middle-priority fallback; change triggers re-fetch.Overrides targetInlineCommentElementId; superseded by targetElementId.
targetElementId(none)Primary identity/target: trimmed and used as the instance id (standalone primitives sharing it read the same context), drives initialization/query, and is the element whose floating pins get suppressed.Highest of the three target inputs; one of the render-gating values.
darkModefalseDark theme; resolved through component > feature > global precedence and synced to the container’s .dark class.Component value overrides global/feature dark mode.
variant(none → inline wireframe)Picks the section wireframe variant: appends ---<variant> to the wireframe name when not 'inline'.Custom/registered wireframe lookup. See Behaviors → Variant → context scoping.
dialogVariant'inline'Variant passed to the per-thread/dialog primitives to pick the inner dialog rendering.Independent of variant; this reference documents pass-through to child primitives.
composerVariant'inline'Variant selecting the composer rendering in child primitives.Pairs with composerPosition; this reference documents pass-through to child primitives.
shadowDomtrueShadow-DOM isolation: when truthy (and no custom template) the content is wrapped in an internal shadow-DOM element. A separate explicit-flag tracks whether the attribute was actually passed.With a custom template, shadow wrapping applies only when shadowDom was passed explicitly. See Behaviors → shadowDom vs dialogShadowDom.
multiThreadtrueWhether the section shows multiple threads (default) vs. a single thread.Note this default differs from the dialog’s multiThread default (false). This reference documents the prop handoff, not the complete single-vs-multi rendering diff.
sortData(no input in V2)@deprecated. Not present on the V2 component; sorting is driven by sortBy / sortOrder.Passing it has no effect. Treat it as removed from the V2 runtime surface.
composerPosition(none)Positions the composer (e.g. top/bottom) in child primitives.Pairs with composerVariant; this reference documents pass-through to child primitives.
sortBy'createdAt'Sort field; synced into the sort state and re-sorts the thread list on change.Combined with sortOrder to derive the active sort option. See Behaviors → sortBy × sortOrder.
sortOrder'asc'Sort direction; synced into sort state and triggers the same re-sort.Combined with sortBy.
fullExpandedfalseRenders threads/composer fully expanded rather than collapsed.See Behaviors → fullExpanded vs default.
context(none)Free-form context (object or JSON string; parse errors ignored) pushed into the targeting config; part of the query and a render-gating value. Change triggers re-fetch.Combines with contextOptions.
contextOptions(none)Resolution options (object or JSON string) modifying how context is applied to the query; change triggers re-fetch.Only meaningful alongside context.
locationId(none)Scopes the comments query to a Velt location; change triggers re-fetch.None
documentId(none)Scopes to a document; the client id is converted to the internal server document id; change triggers re-fetch.None
folderId(none)Scopes to a folder; the server folder id is derived from it; change triggers re-fetch.One of the render-gating values.
commentPlaceholder(none)Placeholder for the new-comment composer.Overlaps with composerPlaceholder; prefer placeholder for global override or the more specific comment/reply placeholders for explicit context.
replyPlaceholder(none)Placeholder for the reply composer.None
composerPlaceholder(none)Placeholder for the composer.Overlaps with commentPlaceholder; prefer placeholder for global override or the more specific comment/reply placeholders for explicit context.
editPlaceholder(none)Placeholder when editing.Fallback for the two specific edit placeholders; use editCommentPlaceholder or editReplyPlaceholder when context-specific copy matters.
editCommentPlaceholder(none)Placeholder when editing a top-level comment.More specific than editPlaceholder.
editReplyPlaceholder(none)Placeholder when editing a reply.More specific than editPlaceholder.
readOnlyfalseView-only; also pushed as a per-instance local read-only setting to disable the composer/actions for this section instance.Per-instance override (does not mutate global state).
anonymousEmail(none)Per-instance override for anonymous email mentions; applied on init (if set early) and on change.Tri-state: takes effect only when explicitly provided; undefined/null leaves it unset.
messageTruncationfalseClamps long comment text.Gates messageTruncationLines.
messageTruncationLines4Lines shown before truncating.String parsed via parseInt, falling back to 4; only meaningful with messageTruncation.
defaultConditiontrueRender gate via the conditional-render directive: true honors the section’s visibility conditions, false bypasses them (always shows).Tri-state string-coerced.

Default behaviors (no prop needed)

  • In-flow, not anchored: the section renders inside your layout where you place it; it does not float and does not place itself.
  • Pin suppression on the target: to avoid double UI, it disables and hides the global floating pin avatars on its target element (restoring them when unmounted): comments appear in the section list instead.
  • Multi-thread by default: unlike the dialog, the section defaults to showing multiple threads (multiThread default true).

VeltInlineReactionsSection

A statically-placed reactions/emoji bar bound to a target element. On init it fetches existing reaction annotations for the target’s section id and renders them; users add via the emoji picker or by clicking an existing reaction pill, all scoped to the target. It renders only when both targetReactionElementId and a logged-in user are present.
PropDefaultBehaviorInteractions & gotchas
targetReactionElementId(none)The required anchor: identifies which element/section the reaction bar belongs to. Setting it fetches that section’s reaction annotations; all add/update calls are scoped to this id.Nothing renders until this is set and a user is present.
darkModefalseDark theme (boolean or string); resolved value pushed into the component config.Precedence: component darkMode > feature > global theme.
variant(none → inline wireframe)Picks the wireframe variant: resolves velt-inline-reactions-section-wireframe---<variant> when set, else the base wireframe.Must match a registered variant or it falls back to the default inline layout. See Behaviors → Variant → context scoping.
shadowDomtrueShadow-DOM isolation; when true, content renders inside an internal shadow-DOM element. A separate explicit flag is used with custom templates.With a custom template, shadow wrapping applies only if shadowDom="true" was passed explicitly.
customReactions(none → service default {})Overrides the default emoji set offered in the picker. A ReactionMap: a keyed map of reactionId → { url?, svg?, emoji? } (each entry supplies the reaction’s visual as a hosted image URL, raw SVG, or an emoji character: all three fields optional). Accepts an object or JSON string.Set via the reaction service, so it affects reactions globally, not just this instance. This reference documents no per-instance scoping for other reaction components.

Default behaviors (no prop needed)

  • Gated on target + user: renders only when both targetReactionElementId and a logged-in user exist.
  • Reads existing reactions: on mount it loads the target section’s existing reaction annotations and shows them as pills; clicking a pill or picking an emoji adds/updates the user’s reaction scoped to the target.
  • Default emoji set: with no customReactions, the picker offers Velt’s default reaction set (service default {} → built-in set).

Default behaviors (no prop needed)

Each surface’s zero-prop baseline is documented in its ### Default behaviors (no prop needed) block above. In brief:
  • VeltCommentDialog: collapsed first-comment preview until the pin is selected; composer hidden until selection (on a thread that already has comments) and opens collapsed; Velt owns positioning; selection/composer state is per instance.
  • VeltMultiThreadCommentDialog: holds many threads at one anchor with list-only affordances (count, filter, sort, bulk mark-all, new-thread, empty placeholder); the top-level composer hides on drill-in; standalone state comes from the multi-thread config factory.
  • VeltCommentText: renders your projected content plus a connected overlay dialog (not a comment string); pointer events drive hover/selection.
  • VeltInlineCommentsSection: in-flow (not anchored); suppresses the floating pin avatars on its target; multi-thread by default.
  • VeltInlineReactionsSection: renders only when both a target id and a logged-in user exist; loads existing reactions; offers Velt’s default emoji set with no customReactions.

Prop-interaction matrix

Pairwise interactions are documented in each prop’s Interactions & gotchas column above. The cross-cutting, multi-prop matrices that span these surfaces: the collapsedComments × collapsedRepliesPreview collapse structure, the composer open/collapsed lifecycle, sortBy × sortOrder, shadowDom vs dialogShadowDom, the placeholder-priority chain, fullExpanded vs default, and variant → context scoping: live in the behaviors index and are linked from the rows above rather than duplicated here.

Positioning & composition

VeltCommentDialog and VeltMultiThreadCommentDialog are anchored / Velt-positioned: they anchor to their pin/overlay and emit a reposition request on resize; they take no coordinate input (targetElementId is an event filter, not a position). VeltInlineCommentsSection, VeltInlineReactionsSection, and VeltCommentText’s host are statically placed: they render in your own layout flow where you mount them (VeltCommentText then opens an anchored overlay on selection). See Behaviors → Positioning ownership and the anchored-vs-static classification in Component definitions.

Provable coverage

Counted against Props ### VeltCommentDialog / ### VeltMultiThreadCommentDialog / ### VeltCommentText / ### VeltInlineCommentsSection / ### VeltInlineReactionsSection:
  • VeltCommentDialog: 44/44: annotationId, multiThreadAnnotationId, defaultCondition, inlineCommentSectionMode, commentPinSelected, fullExpanded, shadowDom, darkMode, readOnly, sidebarMode, isFocusedThreadEnabled, openAnnotationInFocusMode, expandOnSelection, inlineCommentMode, inboxMode, isInsidePdfViewer, multiThread, commentComposerMode, dialogSelection, dialogMode, focusedThreadMode, pageModeComposer, messageTruncation, initialEditCommentIndex, messageTruncationLines, variant, composerPosition, sortBy, sortOrder, commentPinType, containerComponentId, targetElementId, targetComposerElementId, locationVersion, locationDisplayName, context, placeholder, commentPlaceholder, replyPlaceholder, editPlaceholder, editCommentPlaceholder, editReplyPlaceholder, anonymousEmail. (props.md lists 43 rows; “~44” estimate matched: every row covered.)
  • VeltMultiThreadCommentDialog: 14/14: annotationId, multiThreadAnnotationId, annotation, user, commentPinSelected, commentPinType, dialogVariant, variant, inboxMode, containerComponentId, context, readOnly, defaultCondition, onSaveComment. (props.md lists 14 rows; “~15” estimate: every row covered.)
  • VeltCommentText: 2/2: annotationId, multiThreadAnnotationId. (props.md lists 2 rows; the component has exactly two @Inputs in source, so the list is complete: the “~3” estimate counted the prose line.)
  • VeltInlineCommentsSection: 32/32: config, targetInlineCommentElementId, targetCommentElementId, targetElementId, darkMode, variant, dialogVariant, composerVariant, shadowDom, multiThread, sortData, composerPosition, sortBy, sortOrder, fullExpanded, context, contextOptions, locationId, documentId, folderId, commentPlaceholder, replyPlaceholder, composerPlaceholder, editPlaceholder, editCommentPlaceholder, editReplyPlaceholder, readOnly, anonymousEmail, messageTruncation, messageTruncationLines, defaultCondition: plus the two deprecated aliases counted inline. Every row covered.
  • VeltInlineReactionsSection: 5/5: targetReactionElementId, darkMode, variant, shadowDom, customReactions. Every row covered.
Coverage limits documented inline: VeltCommentDialog: dialogMode as a live wire-through, openAnnotationInFocusMode / dialogSelection downstream surfaces, locationDisplayName being read anywhere, the precedence among the three edit placeholders. VeltMultiThreadCommentDialog: commentPinSelected / commentPinType / dialogVariant visual effects, user consumer, onSaveComment as output vs config callback. VeltCommentText: the public toggle name for showing resolved/terminal annotations. VeltInlineCommentsSection: dialogVariant / composerVariant / composerPosition rendering effects, single-vs-multi-thread rendering, commentPlaceholder vs composerPlaceholder precedence, the edit-placeholder precedence, sortData alias intent. VeltInlineReactionsSection: no per-instance customReactions scoping is documented. No prop is skipped.