Skip to main content

Libraries

  • @veltdev/react
  • @veltdev/client
  • @veltdev/sdk
5.0.1-beta.3
February 16, 2026

Improvements

  • [Comments]: Added backward compatibility so V4 custom wireframes using property names allowAssignment, allowEdit, allowToggleNotification, and allowChangeCommentAccessMode automatically resolve to their v5 equivalents. No changes to your wireframe code are required when upgrading from v4 to v5.
  • [Comments]: Added edit composer wireframe reuse in comment thread cards so it now applies the same velt-comment-dialog-composer-wireframe customization as the reply composer. Previously the edit composer always rendered the default template.

Bug Fixes

  • [Comments]: Fixed custom wireframes for nested comment dialog components — including thread cards, priority/status dropdowns, attachment layouts, reply avatars, and seen dropdowns — silently falling back to the default template instead of rendering correctly. This restores the v4 behavior where parent components extracted nested wireframes via querySelector and passed them to children.
  • [Comments]: Fixed veltDynamicTemplate placement in multiple components so it wraps only the replaceable inner content (e.g., an icon) instead of the entire component structure. Previously the default template always rendered and the wireframe content was never injected.
  • [Comments]: Fixed velt-class conditional styling in custom wireframes not resolving correctly for per-item data such as {commentObj.*}, {attachment.*}, and {file.*}. Added applyConditionalClasses() calls with per-item data contexts across 40+ comment dialog primitive components.
  • [Comments]: Fixed click event handlers being lost when custom wireframes replace default content by moving handlers from inside veltDynamicTemplate blocks to wrapper elements outside the template directive. This restores click functionality for custom wireframes on mark-as-read, dropdown items, options, and priority/status items.
  • [Comments]: Fixed per-dialog state (localUIStateSignal) not being propagated to child primitives and veltDynamicTemplate contexts throughout the entire comment dialog component tree, including through wireframe-replaced sections.
  • [Comments]: Fixed custom wireframes using data bindings like <VeltData field="attachment.name" /> displaying empty content by adding per-item data fields (attachment, commentObj, file, item, etc.) to veltDynamicTemplate context objects.
  • [Comments]: Fixed layout issues caused by styled wrapper elements persisting outside the template when wireframes replaced inner content. Visual styling classes (width, height, padding) are now inside the veltDynamicTemplate default content.
  • [Comments]: Restored CSS class names on the priority dropdown content item components to their v4 names (velt-priority-dropdown-content-item, velt-priority-dropdown-content-item-tick, s-priority-*) so existing CSS overrides continue to work without changes.
  • [Comments]: Fixed mark-as-read not firing when clicking a comment in sidebar focused-thread mode or inline comment section mode. Previously the comment dialog is always in a selected state in these modes, preventing the mark-as-read path from triggering.
  • [Comments]: Fixed the attachment image download button not hiding for anonymous users, disabled states, and expired plans. The button now correctly matches v4 behavior.
  • [Comments]: Fixed attachment loading spinners crashing when config.uiState is not yet initialized (e.g., in standalone usage or during initialization race conditions).
  • [Comments]: Fixed sidebar deselection accidentally re-selecting an annotation that was already removed from the selected annotations map by another code path.
5.0.1-beta.2
February 16, 2026

New Features

  • [Comments]: Added enableAttachmentDownload() / disableAttachmentDownload() API methods and an attachmentDownload prop on <VeltComments> to control whether clicking an attachment triggers a file download. A new attachmentDownloadClicked event fires on every attachment click regardless of the download setting, letting you intercept clicks for custom viewers, analytics, or access control. Download is enabled by default so there is no breaking change.
// Declarative prop
<VeltComments attachmentDownload={false} />

// Using API methods
const commentElement = client.getCommentElement();
commentElement.enableAttachmentDownload();
commentElement.disableAttachmentDownload();

// Listening to the event
const handleAttachmentDownloadClicked = useCommentEventCallback('attachmentDownloadClicked');

useEffect(() => {
  if (handleAttachmentDownloadClicked) {
    console.log('Attachment clicked:', handleAttachmentDownloadClicked.attachment.attachmentId);
    console.log('Annotation ID:', handleAttachmentDownloadClicked.annotationId);
  }
}, [handleAttachmentDownloadClicked]);
The exported AttachmentDownloadClickedEvent interface has the following shape:
interface AttachmentDownloadClickedEvent {
  annotationId: string;
  commentAnnotation: CommentAnnotation;
  attachment: Attachment;
  metadata?: VeltEventMetadata;
}

Improvements

  • [Comments]: The wireframe template for the resolve and unresolve buttons in the assignee banner is now nested inside the button component rather than wrapping it, giving custom wireframes direct access to button state, styling, and event handlers. The affected wireframes are velt-comment-dialog-assignee-banner-resolve-button-wireframe and velt-comment-dialog-assignee-banner-unresolve-button-wireframe.
  • [Comments]: Added CSS classes to comment composer attachment components to reflect loading and edit-mode states: .velt-composer-attachment-container, .velt-composer-attachment--loading, and .velt-composer-attachment--edit-mode.
  • [Comments]: Added .s-comment-dialog-assign-to-menu and .velt-thread-card--assign-to-menu CSS classes to the assign-to menu component for more granular styling control.

Bug Fixes

  • [Comments]: Added 'iframe' to the list of non-nestable elements so that getHostElement() returns the iframe’s parent element instead of attempting to place a comment pin inside the iframe document context.
  • [Comments]: Fixed a regression where navigating back from a focused thread triggered an unintended draft auto-save. A guard now skips auto-save when the focused thread dialog is destroyed via back navigation.
  • [Comments]: Fixed stale selection state in the sidebar after back-navigating from a focused annotation. The annotation is now properly deselected from the internal selection map on exit.
  • [Comments]: Thread card attachment components now use isTemplateEmpty() to detect empty wireframe templates instead of a truthy check, so attachments correctly fall back to default rendering when an empty wireframe is provided.
  • [Comments]: Custom thread card wireframes that do not include an edit composer wireframe now automatically render the default edit composer, so inline comment editing remains functional without requiring wireframe changes.
5.0.1-beta.1
February 13, 2026

New Features

  • [Comments]: Added clearContext option to PageModeComposerConfig to control whether comment context is cleared after page mode composer submission. Set clearContext: false to preserve context data across submissions (defaults to true).
// Using Hooks
const commentElement = useCommentUtils();
commentElement.setContextInPageModeComposer({
  context: { documentId: '123', section: 'intro' },
  targetElementId: 'my-element',
  clearContext: false
});

// Using API methods
const commentElement = client.getCommentElement();
commentElement.setContextInPageModeComposer({
  context: { documentId: '123', section: 'intro' },
  targetElementId: 'my-element',
  clearContext: false
});

Bug Fixes

  • [Comments]: Removed host CSS classes velt-composer-open and velt-composer-input-focused from the Comment Dialog Composer component. If your custom styles targeted these classes, update your selectors accordingly.
  • [Comments]: Fixed wireframe template forwarding in Comment Dialog so custom templates set via dialogTemplate are now correctly applied to all child components.
  • [Comments]: Fixed nested wireframe template extraction in Comment Dialog Threads so custom velt-comment-dialog-thread-card-wireframe and velt-comment-dialog-more-reply-wireframe templates are correctly applied.
  • [Comments]: Fixed Mark as Read/Unread wireframe template structure so custom wireframe templates now provide proper control over the button’s internal elements.
  • [Comments]: Added proper wireframe template wrapper to the parent Mark as Read component with a clickable container that includes accessibility attributes for the toggle action.
  • [Comments]: Fixed comment annotation data resolution in button click handlers so commentAnnotation context data now correctly resolves from the updated component config structure.
5.0.0-beta.13
February 10, 2026

New Features

  • [Notifications]: Added ability to enable organization-level notification settings. This allows you to configure notifications once for all documents in an organization instead of per document.
  <VeltNotificationsPanel
    enableSettingsAtOrganizationLevel={true}
    settings={true}
  />
  {/* or */}
  <VeltNotificationsTool
    enableSettingsAtOrganizationLevel="true"
    settings={true}
  />

// Using API methods
const notificationElement = client.getNotificationElement();
// Enable organization-level settings
notificationElement.enableSettingsAtOrganizationLevel();

// Disable organization-level settings
notificationElement.disableSettingsAtOrganizationLevel();
5.0.0-beta.12
February 6, 2026

Improvements

  • [Comments]: Comments sidebar group-by views now display “Unassigned” for annotations without assignees and “Untagged” for annotations without tagged users.

Bug Fixes

  • [Comments]: Fixed an issue where image attachments in comment dialog were not opening in a lightbox view.
  • [Comments]: Fixed an issue where sometimes user mentions did not include the leading @ symbol in display text.
  • [Comments]: Fixed an issue where the recorder control panel in comment dialog composer did not appear when a valid comment dialog ID was not present in component configuration.
  • [Comments]: Fixed an issue where assignment and private comment options did not respect explicit configuration in sidebar mode.
  • [Comments]: Fixed an issue where the comment dialog internal tag was changed from snippyly-comment-dialog to velt-comment-dialog-internal for correct sidebar focus and keyboard behavior.
5.0.0-beta.11
February 4, 2026

Improvements

  • [Comments]: Added ability to enable/disable Private Comments feature in Velt Console
5.0.0-beta.10
February 3, 2026

Improvements

  • [Comments]: Added batchedPerDocument mode for getCommentAnnotationsCount() that makes the query more efficient by up to 80% while maintaining per-document granularity. Very useful for UIs that need to display comment counts for 100 documents or less on the same page.
// Using hook
const commentElement = useCommentUtils();
const counts = commentElement.getCommentAnnotationsCount({
  documentIds: ['doc-1', 'doc-2', ..., 'doc-100'],
  batchedPerDocument: true
});

// Using API method
const client = useVeltClient();
const commentElement = client.getCommentElement();
const counts = commentElement.getCommentAnnotationsCount({
  documentIds: ['doc-1', 'doc-2', ..., 'doc-100'],
  batchedPerDocument: true,
  debounceMs: 5000
});
Return Format:
{
  data: {
    "doc-1": { total: 10, unread: 2 },
    "doc-2": { total: 15, unread: 5 }
  }
}
5.0.0-beta.9
January 31, 2026

Bug Fixes

  • [Comments]: Fixed draft mode not working properly. Draft content is now preserved when the dialog is closed and the shake animation now works as expected.
  • [Comments]: Fixed context property access in velt-data elements. Templates can now access context properties using {context.propertyName} patterns.
  • [Comments]: Fixed edit mode state persisting after dialog close. Reopening the dialog now shows the normal view instead of the edit composer.
  • [Comments]: Fixed text reappearing when using select-all-and-delete in edit mode composer. Users can now properly delete all text in edit mode.
  • [Comments]: Fixed links in comment body not clickable. Clicking links in comment text now opens them in a new tab.
  • [Comments]: Fixed paste handling. Pasting a URL over selected text creates a hyperlink, multiline text preserves line breaks, and images paste as attachments.
  • [Comments]: Fixed ghost comment banners not displaying. “Comment is syncing…” messages now properly show while annotation data is loading.
  • [Comments]: Fixed priority selection not working on new annotations. Users can now set priority before submitting the first comment.
  • [Comments]: Fixed email detection after @ symbol. Typing @user@example.com and pressing space now creates an email mention.
  • [Comments]: Fixed recording in progress flag not clearing. Dialog now properly closes on click outside after recording finishes.
  • [Comments]: Fixed links and @here mentions not highlighted in comment text. URLs are now styled as clickable links and @here mentions are properly highlighted.
5.0.0-beta.8
January 30, 2026

New Features

  • [Comments]: Introducing Private Comments feature: Added updateVisibility() method to programmatically set comment access (public, organization, or private). Learn more
// Using hook
const commentElement = useCommentUtils();

// Set comment to organization-only
commentElement.updateVisibility({
  annotationId: "annotationId",
  type: 'organization',
  organizationId: 'org-123'
});

// Set comment to private (specific users)
commentElement.updateVisibility({
  annotationId: "annotationId",
  type: 'self',
  userIds: ['user-1', 'user-2']
});

// Set comment to public
commentElement.updateVisibility({
  annotationId: "annotationId",
  type: 'public'
});

// Using API method
const client = useVeltClient();
const commentElement = client.getCommentElement();
commentElement.updateVisibility({
  annotationId: "annotationId",
  type: 'organization',
  organizationId: 'org-123'
});

Bug Fixes

  • [Comments]: Fixed mentioned users not receiving notifications. Users @mentioned in comments now correctly receive notifications.
  • [Comments]: Fixed notification action type validation. Clients only receive data for valid event types.
  • [Comments]: Fixed status reset when deleting comments. Status now only resets when current status is terminal.
5.0.0-beta.7
January 28, 2026

New Features

  • [Comments]: Added addCommentAnnotationDraft event to dynamically set context when creating comment annotations. Triggered before addCommentAnnotation event clicks on the comment tool and the composer is rendered.
// Using hook
const addCommentAnnotationDraftEvent = useCommentEventCallback('addCommentAnnotationDraft');

useEffect(() => {
    if (addCommentAnnotationDraftEvent?.addContext) {
        addCommentAnnotationDraftEvent.addContext({
            questionId: '123',
            questionText: 'What is the capital of France?',
        });
    }
}, [addCommentAnnotationDraftEvent]);

// Using API method
const client = useVeltClient();
const commentElement = client.getCommentElement();
commentElement.on('addCommentAnnotationDraft').subscribe((event) => {
    if (event?.addContext) {
        event.addContext({
            questionId: '123',
            questionText: 'What is the capital of France?',
        });
    }
});

Improvements

  • [Comments]: Added setContextProvider method to set a global context provider for all comment annotations. Also added useSetContextProvider hook for React applications.
// Using hook
import { useCallback, useEffect } from 'react';
import { useSetContextProvider } from '@veltdev/react';

const contextProvider = useCallback((documentId, location) => {
    return {
        questionId: '123',
        questionText: 'What is the capital of France?',
    }
}, []);

const { setContextProvider } = useSetContextProvider();

useEffect(() => {
    if (setContextProvider && contextProvider) {
        setContextProvider(contextProvider);
    }
}, []);

// Using API method
const client = useVeltClient();
const commentElement = client.getCommentElement();
commentElement.setContextProvider((documentId, location) => {
    return {
        questionId: '123',
        questionText: 'What is the capital of France?',
    }
});
5.0.0-beta.6
January 28, 2026

Bug Fixes

  • [Core]: Fixed package integrity issue in v5.0.0-beta.5.
5.0.0-beta.5
January 28, 2026

Bug Fixes

  • [Comments]: Fixed page mode and multi-thread annotation ID not found error. Page mode and multi-thread comments now work as expected.
  • [Comments]: Fixed updateOverlayPosition function not triggering. Comment dialog now opens in the correct position.
  • [Comments]: Fixed unread status issues in inline and focused thread modes. Annotations are now marked as read when opened or clicked.
  • [Comments]: Fixed three-dot menu not visible in sidebar.
  • [Comments]: Fixed composer not being focused when opened.
  • [Comments]: Fixed comments navigating on click. Comments now only navigate when the navigation button is clicked.
5.0.0-beta.4
January 23, 2026

Bug Fixes

  • [Comments]: Fixed lastUpdated timestamp not being updated when changing context in comment annotation via SDK. Ensures context updates are properly synced to other users.
5.0.0-beta.3
January 22, 2026

Improvements

  • [Core]: Added robustness to initialization when VeltProvider was re-rendered multiple times over a slow network.

Bug Fixes

  • [Comments]: Refactored submitComment method to fix resolver issue for velt-comment-composer. Now follows the standard comment submission flow.
  • [Comments]: Fixed unread status not updating correctly in bottom sheet. This was a regression in v5.
  • [Comments]: Fixed navigation button not working properly. This was a regression in v5.
  • [Comments]: Fixed disable recording option not working in velt-comment-composer. This was a regression in v5.
5.0.0-beta.2
January 22, 2026

New Features

  • [Core]: Added globalStyles option to control whether Velt’s global CSS is loaded. Set to false to disable default styles when implementing custom theming.
// Using VeltProvider
<VeltProvider apiKey='API_KEY' config={{
    globalStyles: false
}}>
    {/* Your app content */}
</VeltProvider>

// Using API method
const client = useVeltClient();
client.initConfig('API_KEY', {
  globalStyles: false
});
  • [Comments]: Added submitComment(targetElementId) method to programmatically trigger comment submission. Enables custom buttons or keyboard shortcuts for submitting comments. Learn more

<VeltCommentComposer targetElementId="composer-1" />
<VeltCommentDialogComposer targetElementId="composer-2" />

// Using hook
const commentElement = useCommentUtils();
commentElement.submitComment('composer-1');

// Using API method
const client = useVeltClient();
const commentElement = client.getCommentElement();
commentElement.submitComment('composer-1');
  • [Comments]: Added placeholder prop to customize input placeholder text in comment composer. Overrides default placeholders. Learn more
<VeltCommentComposer placeholder="Share your thoughts..." />
<VeltCommentDialogComposer placeholder="Add a comment..." />
  • [Comments]: Added composerTextChange event that fires when text changes in any comment composer. Enables features like auto-save drafts, character counters, or real-time validation. Learn more
// Using hook
const composerTextChangeEvent = useCommentEventCallback('composerTextChange');
useEffect(() => {
    if (composerTextChangeEvent) {
        console.log('Text changed:', composerTextChangeEvent.text);
    }
}, [composerTextChangeEvent]);

// Using API method
const client = useVeltClient();
const commentElement = client.getCommentElement();
commentElement.on('composerTextChange').subscribe((event) => {
    console.log('Text changed:', event.text);
});
5.0.0-beta.1
January 21, 2026

Bug Fixes

Comment Dialog Primitives

Released 115+ primitive components for building custom comment dialogs. Each subcomponent can now be used independently without requiring the full dialog structure.
// Pattern 1: ID-Based (Standalone)
<VeltCommentDialogHeader annotationId="abc123" />
<VeltCommentDialogComposer annotationId="abc123" />

// Pattern 2: Context Wrapper
<VeltCommentDialogContextWrapper annotationId="abc123">
  <VeltCommentDialogHeader />
  <VeltCommentDialogComposer />
  <VeltCommentDialogBody />
</VeltCommentDialogContextWrapper>
Available Components:
  • Header/Body: Header, Body, CloseButton
  • Thread: ThreadCard with Avatar, Name, Time, Message, Reactions, Recordings, Reply, Options, and more
  • Composer: Composer, ComposerInput, ComposerActionButton, ComposerAttachmentButton, ComposerRecorderButton, ComposerRecorderPlayer, ComposerFiles
  • Dropdowns: StatusDropdown, PriorityDropdown, OptionsDropdown, CustomAnnotationDropdown (each with full sub-component breakdown)
  • Additional: ReplyAvatars, AssigneeBanner, ResolveButton, UnresolveButton, CopyLink, DeleteButton, PrivateBanner, NavigationButton, and 90+ more
View full documentation → | API Methods | Data Models