Skip to main content
What every <VeltComments> prop actually does at runtime, its default behavior, and how it combines with related props. Props gives the name/type/default; this file gives the behavior. See the behaviors index for the cross-component state machines, positioning ownership, and the collapsedComments × collapsedRepliesPreview / composer matrices (referenced below, not duplicated). Field-level data shapes live in Data models. Every prop maps to a feature-service flag. Booleans coerce strings: "true"/"false" are JSON-parsed, an omitted prop never runs the setter (so the service default stands), and an empty-string boolean (darkMode with no value) counts as true. Array/object props are JSON-parsed if passed as a string. A malformed value is swallowed silently because the setter catches parse failures: the flag keeps its prior value rather than throwing.

Per-prop behavior (exhaustive)

<VeltComments> is a single host component with ~122 active props. Its exhaustive per-prop behavior is grouped by prop family below: Core feature toggles, Mentions / autocomplete, Layout / interaction modes, Placeholders, Shadow DOM & dark mode, and Callbacks: followed by the deprecated aliases. Each row states the prop’s default, its runtime effect, and how it interacts with related props. The zero-prop baseline is summarized in Default behaviors (no prop needed); every prop in Props Part 1 is covered (see Coverage).

Core feature toggles

PropDefaultBehavior (runtime)Interactions & gotchas
reactionstrueToggles emoji-reaction affordance on comments (enableReactions/disableReactions).Independent of customReactions: disabling hides reactions entirely regardless of any custom set.
attachmentstrueenableAttachment(bool): shows/hides the attach-file affordance in the composer and attachment rendering on comments.allowedFileTypes filters what may attach; attachmentDownload / attachmentNameInMessage only matter when this is on.
attachmentDownloadtrueShows the download button on rendered attachments.No effect if attachments={false}.
attachmentNameInMessagefalseRenders the attachment filename inline in the message body rather than only as a thumbnail/chip.Pairs with attachments; cosmetic, does not change storage.
allowedFileTypes[] (all)setAllowedFileTypes(array): whitelist of MIME/extension strings the file picker and drop accept. Empty array means all types allowed.JSON-parsed if a string. Restricts only attachments, not recordings/screenshots.
customReactionsNonesetCustomReactions(ReactionMap): replaces the default emoji set with your map.Shape in Component config. Requires reactions on.
recordings'audio,video,screen'CSV string, not boolean. setAllowedRecordings([...]) after splitting on , and trimming. Each token enables that recorder type in the composer. "none" disables all recording.Passing a boolean does nothing useful: it must be a string. recordingTranscription/recordingCountdown refine recordings once enabled.
recordingTranscriptiontrueRouted to the recorder service (enableRecordingTranscription/disable): produces transcript/summary for recordings.Supersedes deprecated recordingSummary. No effect if recordings="none".
recordingCountdown(off)enableRecordingCountdown/disable: shows a 3-2-1 countdown before capture starts.Only relevant when a recorder type is enabled.
screenshotfalseenableScreenshot/disable: adds a capture-screenshot affordance in the composer.Independent of recordings.
statustruesetEnableStatus(bool): shows the status field/dropdown on comments.customStatus defines the option set; resolveButton is a separate one-click resolve, not the status field. resolveStatusAccessAdminOnly gates resolve, not status.
customStatusNonesetCustomStatuses(array): replaces default statuses. Each entry has type:'default'|'ongoing'|'terminal'; a terminal status marks the thread resolved/closed.Use this for workflow states only: not arbitrary tags (use customCategory for categories). Requires status on.
priorityfalsesetEnablePriority(bool): shows the priority field.customPriority defines options; field is hidden unless this is on.
customPriorityNonecustomFilterService.setCustomPriorityFilters(array): replaces priority options.Stored via the custom-filter service (so it also feeds sidebar priority filters). Requires priority on to surface in the composer.
customCategoryNonecustomFilterService.setCustomCategories(array): defines selectable comment categories.The correct tool for arbitrary tagging/grouping; pairs with autoCategorize and sidebar category filters.
autoCategorizefalsesetEnableAutoCategorize(bool): server/AI auto-assigns a category to new comments.Needs customCategory defined to have categories to assign.
resolveButtontruesetEnableResolve(bool): shows the one-click resolve toggle on a thread.Separate from status. resolveStatusAccessAdminOnly restricts who can press it.
resolveStatusAccessAdminOnlyfalseenableResolveStatusAccessAdminOnly/disable: only admins may resolve/unresolve.Non-admins still see the button but cannot toggle. No effect if resolveButton={false}.
visibilityOptionsfalsesetEnableVisibilityOptions(bool): per-comment private/team visibility picker in the composer.Distinct from privateCommentMode (which forces all comments private).
seenByUserstrueenableSeenByUsers/disable: renders “seen by” avatars on comments.Reads read-receipt data; no effect on whether reads are tracked.
deviceInfofalseshowScreenSizeInfo(bool): captures and displays device + screen-size metadata on comments.Feeds deviceIndicatorOnCommentPins; the badge needs this data captured.
deviceIndicatorOnCommentPinsfalseenableDeviceIndicatorOnCommentPins/disable: device-type badge on each pin.Meaningful only when deviceInfo is capturing device data.
commentIndexfalseshowCommentIndex(bool): numeric index label (1, 2, 3…) on pins for sequential reference.Pure labeling; independent of sort order.
replyAvatarsfalseenableReplyAvatars/disable: shows reply-author avatars on the collapsed thread card.maxReplyAvatars caps the count; no effect if off.
maxReplyAvatars3setMaxReplyAvatars(n): max avatars before a “+N” overflow chip.parseInt from string. Only applies when replyAvatars on.
sidebarButtonOnCommentDialogfalseenableSidebarButtonOnCommentDialog/disable: adds an “open sidebar” button inside the dialog.Click fires onSidebarButtonOnCommentDialogClick; you wire the open yourself.
ghostCommentsfalseenableGhostComments/disable: keeps showing comments whose target DOM node was removed (orphaned annotations).ghostCommentsIndicator controls the accompanying message; ghost comments are otherwise hidden by default.
ghostCommentsIndicatortrueenableGhostCommentsMessage/disable: the indicator/message shown for ghost comments.Only visible when ghostComments is on.
minimapfalseenableMinimap/disable: renders a comments minimap overlay marking pin positions.minimapPosition sets the corner; the standalone <VeltCommentsMinimap> is the alternative.
minimapPositionNoneWrites minimapPosition into the component config signal + analytics config: corner placement of the minimap.Only effective with minimap on.
hotkeyfalseenableHotkey/disable: keyboard shortcut to enter add-comment mode.Complements commentTool; either can trigger comment mode.
bubbleOnPinfalseenableBubbleOnPin/disable: shows a persistent comment-preview bubble attached to the pin.bubbleOnPinHover is the hover-only variant; this is always-on preview.
bubbleOnPinHoverfalseenableBubbleOnPinHover/disable (feature-state default false): preview bubble appears on pin hover.Off by default: the bare pin shows no hover preview. With dialogOnHover (default true) the dialog still opens on hover; enable bubbleOnPinHover to add a preview bubble.
pinDragtrueenablePinDrag/disable: allows dragging a pin to reposition its annotation anchor.Repositioning rewrites the annotation location. Disable to lock pins in place.
pinCursorImage''setPinCursorImage(url || ''): custom cursor image while placing a comment.Empty string restores the default crosshair cursor.
commentPinHighlighterNoneenableCommentPinHighlighter/disable: highlights the target element when its pin is active/selected.Visual association aid; no data effect.
formatOptionsfalseenableFormatOptions/disable: rich-text formatting toolbar (bold/italic/lists) in the composer.Stored content gains formatting markup.
deleteOnBackspacetrueenableDeleteOnBackspace/disable: Backspace on a selected comment/attachment deletes it.Disable to prevent accidental deletes. Interacts with deleteReplyConfirmation (confirmation still applies).
enterKeyToSubmitfalseenableEnterKeyToSubmit/disable: Enter submits instead of inserting a newline.When off, Cmd/Ctrl+Enter submits and Enter is a newline.
forceCloseAllOnEscfalseenableForceCloseAllOnEsc/disable: pressing Esc closes all open dialogs at once.When off, Esc closes only the focused dialog.
scrollToCommenttrueenableScrollToComment/disable: auto-scrolls the viewport/thread to a selected or deep-linked comment.Drives the ?commentId= deep-link focus behavior; disabling leaves position unchanged on select.
commentTooltrueenableCommentTool/disable: the floating add-comment button.Disabling removes the built-in entry point; pins/dialogs still render for existing comments.
deleteReplyConfirmationfalseenableDeleteReplyConfirmation/disable: shows a confirm step before deleting a reply.Applies to replies; first-comment deletion is governed by deleteThreadWithFirstComment.
deleteThreadWithFirstCommenttrueenableDeleteThreadWithFirstComment/disable: deleting the first comment deletes the whole thread.When off, deleting the first comment promotes the next reply to lead instead of destroying the thread.
draftModetrueenableDraftMode/disable: unsent composer text is persisted as a draft and restored when the composer reopens.Drafts are per-annotation/composer; disabling discards text on close.
collapsedCommentsfalseenableCollapsedComments/disable: keeps the thread collapsed (first + last only, “N more replies” divider between) even when selected.Full interaction matrix with collapsedRepliesPreview and showAllComments in behaviors index.
collapsedRepliesPreviewfalseRenders the first + “N more replies” + last teaser before selection.See the exact rendered-structure matrix in behaviors index.
fullExpandedfalseenableFullExpanded/disable: forces threads fully expanded (all comments, no collapse) regardless of selection.Overrides the default first-comment preview; opposite of collapsedComments.
shortUserNametrueenableShortUserName/disable: displays shortened/first-name user labels.Cosmetic; full names still in data.
svgAsImgfalseenableSvgAsImg/disable: renders SVG content as <img> tags instead of inline SVG.Sandboxing/styling workaround for hostile SVG.
readOnlyfalseenableReadOnly/disable: disables add/edit/delete; comments become view-only.Affects the whole surface. Per-surface readOnly exists on dialog/sidebar/section too.
linkCallbackfalseenableLinkCallback/disable: link clicks in comment text route through a callback instead of navigating.You handle navigation yourself (e.g. SPA routing).

Mentions / autocomplete

PropDefaultBehavior (runtime)Interactions & gotchas
userMentionstrueenableUserMentions/disable: @-mention autocomplete in the composer.Source of mention data is the contact list unless customAutocompleteSearch is on.
customAutocompleteSearchfalseenableCustomAutocompleteSearch/disable: mention search delegates to your data source instead of the SDK contact list.Supply data via ContactElement/AutocompleteElement. Without those, the list will be empty.
paginatedContactListfalseenablePaginatedContactList/disable: fetches the contact list in pages for large directories.Pairs with autoCompleteScrollConfig for scroll-triggered fetch.
expandMentionGroupsfalseenableExpandMentionGroups/disable: a group mention expands into its individual members.When off, the group is mentioned as a single entity.
showMentionGroupsFirstfalseenableShowMentionGroupsFirst/disable: orders groups above individuals in the dropdown.Ordering only; showMentionGroupsOnly hides individuals entirely.
showMentionGroupsOnlyfalseenableShowMentionGroupsOnly/disable: dropdown lists only groups, no individuals.Overrides the practical effect of showMentionGroupsFirst.
atHereEnabledNonecontactService.enableAtHere/disable: enables the @here broadcast mention.atHereLabel/atHereDescription customize its row.
atHereLabelNonecontactService.setAtHereLabel(str): label text for the @here entry (only set when truthy).Effective only with atHereEnabled.
atHereDescriptionNonecontactService.setAtHereDescription(str): description/subtext for the @here entry (only when truthy).Pairs with atHereLabel.
customListDataOnAnnotationNonecreateCustomListDataOnAnnotation(data): injects a custom dropdown dataset scoped to the annotation level.CustomAnnotationDropdownData shape; for per-annotation pickers.
customListDataOnCommentNoneautocompleteService.create(data): registers a custom autocomplete dataset at the comment level.AutocompleteData shape; independent of customAutocompleteSearch (this seeds a named list, that swaps the mention backend).
assignToType'dropdown'setAssignToType({type}): assignee picker UI style ('dropdown' vs 'checkbox').Cosmetic picker change; assignment data identical.
autoCompleteScrollConfig(service)setAutoCompleteScrollConfig(obj): scroll/virtualization config for autocomplete lists.Most useful with paginatedContactList.
anonymousEmailtrueenableAnonymousEmail/disable: allows mentioning/inviting by raw email for users not in the contact list.Per-surface overrides exist on dialog/section.

Layout / interaction modes

PropDefaultBehavior (runtime)Interactions & gotchas
textModetrueenableTextComments/disable: text/inline-selection commenting (highlight text → comment).Independent of pin commenting; both can be on.
inlineCommentModefalseenableInlineCommentMode/disable: renders comments inline in document flow rather than as floating dialogs.Distinct from <VeltInlineCommentsSection> (a separate placed surface).
popoverModefalseenablePopoverMode/disable: dialog renders as a popover anchored to the pin.popoverTriangleComponent adds the caret; floatingCommentDialog is the broader free-position mode.
popoverTriangleComponenttrueenablePopoverTriangleComponent/disable: the popover caret/triangle pointer.Only visible in popoverMode.
floatingCommentDialogtruedisableFloatingComments(!value): when true the dialog floats (Velt-anchored near pin); false places it inline/in-flow.Inverted setter. With popoverMode, popover positioning takes over.
dialogOnHovertruesetEnableDialogOnHover(bool) (service default true): open dialog on pin hover.With dialogOnTargetElementClick off, only the pin (not the underlying element) opens the dialog.
dialogOnTargetElementClickfalsesetEnableDialogOnTargetElementClick(bool) (service default false): clicking the annotated element opens its dialog.Lets users open a thread by clicking the content, not just the pin.
inboxModefalseenableInboxMode/disable: inbox-style flat listing of comments rather than anchored pins.Changes the container’s render branch; pairs with sidebar/inbox surfaces.
moderatorModefalsesetModeratorMode(bool): grants moderator capabilities (manage others’ comments).Capability gate, server-enforced; UI exposes moderator actions.
streamModefalsesetStreamMode(bool): stream-style continuous comment view.Requires streamViewContainerId to target the stream container.
streamViewContainerIdNonePlain string input: id of the element that hosts the stream view.Only meaningful with streamMode.
suggestionModefalsesetSuggestionMode(bool): comments become edit-proposals (accept/reject suggestions).Fires onCommentAccept/onCommentReject on resolution.
mobileModetruesetMobileMode(bool): mobile-optimized layout (bottom-sheet dialogs, touch sizing).On by default: SDK adapts to viewport; force off for desktop-only embeds.
privateCommentModefalseenablePrivateCommentMode/disable: all new comments default to private.Broader than visibilityOptions (which offers a per-comment choice).
persistentCommentModefalseenablePersistentCommentMode/disable: an always-present, persistent composer (does not collapse/hide).This is the “always show composer” mechanism the pin dialog lacks. persistentCommentShadowDom isolates it.
composerMode'default'setComposerMode(value): 'default' opens collapsed (expands on focus); 'expanded' renders full actions immediately.See the composer matrix in behaviors index.
multiThreadfalseenableMultiThread/disable: multiple independent threads per single location/pin.Supersedes deprecated multiThreadMode (identical handler).
groupMatchedCommentsfalseenableGroupMatchedComments/disable: groups comments that target the same element into one cluster.Supersedes deprecated groupMultipleMatch (identical handler).
commentsOnDomtrueshowCommentsOnDom/hideCommentsOnDom: anchor pins to DOM elements.Off → no DOM pins; comments still reachable via sidebar/inbox. resolvedCommentsOnDom/filterCommentsOnDom refine which DOM pins show.
resolvedCommentsOnDomfalseshowResolvedCommentsOnDom/hide: also render resolved comments as DOM pins.When off, resolving a comment removes its DOM pin. Needs commentsOnDom on.
filterCommentsOnDomfalseenableFilterCommentsOnDom/disable: applies active sidebar filters to which DOM pins render.Lets filters drive the on-canvas pin set, not just the list.
areaCommenttrueenableAreaComment/disable: drag-a-box region comments (annotate an area, not a point).On by default; disable for point-only pins.
unreadIndicatorMode'minimal'setUnreadIndicatorMode(value): 'minimal' (dot) vs 'verbose' (count/label) unread styling.Cosmetic; both read the same unread state.
allowedElementIds[]setAllowedElementIds(array): restricts pin placement to elements with these ids.JSON-parsed if string. Combined with the className/querySelector lists as an allow-set.
allowedElementClassNames[]setAllowedElementClassNames(array): restricts placement to elements with these classes.Same allow-set; commentToNearestAllowedElement controls snap behavior.
allowedElementQuerySelectors[]setAllowedElementQuerySelectors(array): restricts placement to elements matching these selectors.Most flexible of the three allow-lists.
commentToNearestAllowedElementfalseenableCommentToNearestAllowedElement/disable: clicks outside an allowed element snap to the nearest allowed one.Only meaningful when an allow-list is set; otherwise no constraint to snap to.
changeDetectionInCommentModefalseenableChangeDetectionInCommentMode/disable: keeps Angular change detection running while in comment mode.Default off pauses CD during comment mode for performance; enable if your page mutates pin targets live (used in the comment-mode add path).
signInButtonfalseenableSignInButton(bool): shows a sign-in button for gated/anonymous commenting.Click fires onSignIn. Pairs with gated-commenting flows.
upgradeButtonfalseenableUpgradeButton(bool): shows an upgrade button when a paid feature is gated.Click fires onUpgrade.

Placeholders

PropDefaultBehavior (runtime)Interactions & gotchas
commentPlaceholderNonesetCommentplaceholder(str): placeholder text for a new top-level comment composer.Falls back to SDK default string when unset.
replyPlaceholderNonesetReplyplaceholder(str): placeholder for the reply composer.Independent of commentPlaceholder.
editPlaceholderNonesetEditplaceholder(str): generic edit-mode placeholder.editCommentPlaceholder/editReplyPlaceholder are the more specific overrides.
editCommentPlaceholderNonesetEditcommentplaceholder(str): placeholder when editing a comment specifically.More specific than editPlaceholder.
editReplyPlaceholderNonesetEditreplyplaceholder(str): placeholder when editing a reply.More specific than editPlaceholder.

Shadow DOM & dark mode

PropDefaultBehavior (runtime)Interactions & gotchas
shadowDomNoneMaster setter: writes shadowDOM/persistentCommentShadowDOM/isExplicitShadowDom into config, then enables/disables all four per-surface shadow roots (dialog, pin, text-comment-tool, text-comment-toolbar) and sets the dialog-shadow-explicit flag.Set false to style with selector CSS (R6). Marks shadow DOM as explicit, so it wins over per-surface defaults.
pinShadowDomfalseenablePinShadowDOM/disable: shadow-isolates the pin surface only.The pin is the exception: its shadow default is false while dialog/text-tool/toolbar default true. Overridden if master shadowDom is set explicitly.
dialogShadowDomtrueenableDialogShadowDOM/disable: shadow-isolates the dialog only.Overridden by explicit master shadowDom.
textCommentToolShadowDomtrueenableTextCommentToolShadowDOM/disable: isolates the text-comment tool.Toggled en masse by master shadowDom.
textCommentToolbarShadowDomtrueenableTextCommentToolbarShadowDOM/disable: isolates the text-comment toolbar.Toggled en masse by master shadowDom.
persistentCommentShadowDomNoneWrites persistentCommentShadowDOM into config + analytics: isolates the persistent composer.Set to true by master shadowDom; only relevant with persistentCommentMode.
darkModefalsesetCommentContainerDarkMode(value === '' || value === 'true'): master dark theme for the comments container (empty-string attribute counts as true).Per-surface dark-mode props below inherit from this unless explicitly set.
dialogDarkModeNoneDialog-level dark mode override. There is no dedicated container setter; the dialog surface reads container dark mode or its own darkMode prop on <VeltCommentDialog>.Prefer setting darkMode on the container, or darkMode directly on <VeltCommentDialog>.
pinDarkModenull (inherit)enablePinDarkMode/disable: dark theme for the pin surface.Inherits master darkMode when unset.
textCommentToolDarkModenull (inherit)enableTextCommentToolDarkMode/disable: dark theme for the text-comment tool.Inherits master darkMode when unset.
textCommentToolbarDarkModenull (inherit)enableTextCommentToolbarDarkMode/disable: dark theme for the text-comment toolbar.Inherits master darkMode when unset.

Callbacks

<VeltComments> exposes these as @Output event emitters. Pass a handler function; it fires on the named action.
PropFires onBehavior & gotchas
onSignInSign-in button clickOnly fires when signInButton is enabled. You perform the actual auth.
onUpgradeUpgrade button clickOnly fires when upgradeButton is enabled.
onCommentAddA comment is addedLegacy: wired via setCommentAddedEmitter. Prefer the event hook useAddCommentAnnotation; see Events.
onCommentUpdateA comment is updatedLegacy: prefer the update event hooks.
onCommentAcceptA suggestion is acceptedOnly meaningful with suggestionMode.
onCommentRejectA suggestion is rejectedOnly meaningful with suggestionMode.
onCopyLinkA comment link is copiedEmits the copied link string.
onCustomPinInjectThe SDK needs a custom pin element injectedLets you supply a custom pin DOM element per annotation.
onSidebarButtonOnCommentDialogClickIn-dialog sidebar button clickPairs with sidebarButtonOnCommentDialog; you open the sidebar in the handler.
onCommentSelectionChangeThe selected comment changesEmits CommentSelectionChangeData (which annotation/comment is now selected).

Deprecated aliases (handled, but don’t use)

These still resolve to a working setter but are superseded:
PropRoutes toReplacement
recordingSummaryenableRecordingSummary/disablerecordingTranscription
multiThreadModeenableMultiThread/disable (identical to multiThread)multiThread
groupMultipleMatchenableGroupMatchedComments/disable (identical to groupMatchedComments)groupMatchedComments

Default behaviors (no prop needed)

The baseline <VeltComments> renders with: verified against the comments-container component and comment feature service:
BehaviorDefault stateHow to change
Floating comment tool buttoncommentTool defaults on: a floating add-comment button mounts so users can enter comment mode and drop pins.commentTool={false} removes it; drive comment mode yourself via the comment API / a <VeltCommentTool>.
Pins on DOM, dialog on clickcommentsOnDom defaults on: each annotation renders an anchored pin on its target element. Clicking a pin selects it and opens its dialog.commentsOnDom={false} stops DOM pins (sidebar/inbox surfaces still list comments).
Open dialog on pin hoverdialogOnHover defaults on (service BehaviorSubject(true)): hovering a pin opens its dialog without a click.dialogOnHover={false} requires a click. dialogOnTargetElementClick defaults off, so clicking the underlying element does not open a dialog unless enabled.
Dialog floats, free-positionedfloatingCommentDialog defaults on: the dialog is Velt-positioned (anchored) near its pin rather than inline.floatingCommentDialog={false} calls disableFloatingComments(true), switching to inline/anchored-in-flow placement.
Composer collapses, dialog previews first commentComposer opens collapsed (composerMode: 'default'); an unselected pin dialog shows only the first comment; selecting expands to all.See the composer + collapse matrices in behaviors index.
Shadow DOM wrappeddialogShadowDom/pinShadowDom/textCommentToolShadowDom/textCommentToolbarShadowDom default on; the container shadowDOM signal defaults true.Set master shadowDom={false} (or a per-surface flag) to style with selector CSS.
@-mentions, reactions, attachments, status, resolve, seen-by ON; priority, visibility, screenshot OFFThe on/off baseline.See Feature flags.
Enter = newline; Cmd/Ctrl+Enter = submitenterKeyToSubmit defaults off.enterKeyToSubmit={true} makes Enter submit.

Prop-interaction matrix

The pairwise interactions for each prop are documented in the Interactions & gotchas column of the tables above. The headline multi-prop matrices that span <VeltComments>: collapsedComments × collapsedRepliesPreview (the exact rendered reply structure), the composer collapsed/open lifecycle, sortBy × sortOrder, shadowDom vs the per-surface shadow flags, visibilityOptions requiring the private-comments capability, the commentPlaceholder vs replyPlaceholder priority chain, and fullExpanded vs collapsedComments precedence: live in the behaviors index and are linked from the rows above rather than duplicated here.

Positioning & composition

<VeltComments> is the host that owns positioning for the anchored comment surfaces: it places pins where the user clicks, anchors each pin dialog to its pin, and re-anchors on resize (floatingCommentDialog true by default). The comment dialog itself takes no coordinate input: it only requests re-anchoring. You keep this anchoring for free in wireframes; primitives/headless take over positioning. The statically-placed comment surfaces (sidebar, inline section, notifications panel) are positioned by your own layout. See Behaviors → Positioning ownership and the anchored-vs-static classification in Component definitions.

Coverage

This file documents all 122 distinct active props of <VeltComments> listed in Props Part 1: every prop across Core feature toggles (52), Mentions/autocomplete (14), Layout/interaction modes including streamViewContainerId (30), Placeholders (5), Shadow DOM & dark mode (11), and Callbacks (10): plus the 3 deprecated aliases (recordingSummary, multiThreadMode, groupMultipleMatch) that props.md’s Part 1 lists, for 125 entries total against props.md’s stated 129 (the remaining 4 are duplicate-row count artifacts in props.md: the combined atHereLabel/atHereDescription, allowedElement* triple, per-surface dark-mode triple, and per-surface shadow rows: each is documented individually above). No prop is skipped. Only dialogDarkMode has limited runtime coverage: it has no dedicated container setter, so its effect is described as inherited/forwarded rather than invented.