> ## Documentation Index
> Fetch the complete documentation index at: https://velt-mintlify-e6426361.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Customize Comments Sidebar V2 behavior

> Configure the V2 Comments Sidebar with declarative filters, mini filters, sort, group, and search inputs plus client-side filter APIs for full control.

# Filtering

The V2 sidebar exposes its filter, sort, group, and search behavior declaratively through inputs. Filters and sorts are described as data; the sidebar renders the matching surfaces and applies the selections client-side via [`applyCommentSidebarClientFilters()`](/api-reference/sdk/api/api-methods#applycommentsidebarclientfilters).

There are three filter surfaces, each driven by its own input:

* **`filters`** — the Main Filter bottom-sheet/menu surface.
* **`miniFilters`** — a single header funnel dropdown.
* **`minimalFilters`** — multiple header dropdowns. When present, these replace the single funnel dropdown.

#### filters

* Define the Main Filter panel sections.
* Pass an array of [`FilterField`](/api-reference/sdk/models/data-models#filterfield) to define sections. Built-in fields are referenced by `field` id; custom fields use `valuePath`.
* When passed an object keyed by field (e.g. `{ status: ['open'] }`) instead of `FilterField[]`, it is treated as a set of active filter selections and applied directly.

Default: `[]`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    const filters = [
      { field: 'status' },
      { field: 'assigned' },
      { field: 'authorName', label: 'Written By', valuePath: 'from.name' },
    ];

    <VeltCommentsSidebarV2 filters={filters} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2></velt-comments-sidebar-v2>
    <script>
      const sidebar = document.querySelector('velt-comments-sidebar-v2');
      sidebar.filters = [
        { field: 'status' },
        { field: 'assigned' },
        { field: 'authorName', label: 'Written By', valuePath: 'from.name' },
      ];
    </script>
    ```
  </Tab>
</Tabs>

**Active-selections object form** — pass an object keyed by field instead of a `FilterField[]` to apply active filter selections directly:

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 filters={{ status: ['open'], people: ['1.1', '2.3'] }} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2></velt-comments-sidebar-v2>
    <script>
      const sidebar = document.querySelector('velt-comments-sidebar-v2');
      sidebar.filters = { status: ['open'], people: ['1.1', '2.3'] };
    </script>
    ```
  </Tab>
</Tabs>

#### miniFilters

* Render a single header funnel dropdown with one section per field.

Default: `[]`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 miniFilters={[{ field: 'status' }, { field: 'priority' }, { field: 'involved' }]} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2></velt-comments-sidebar-v2>
    <script>
      const sidebar = document.querySelector('velt-comments-sidebar-v2');
      sidebar['mini-filters'] = [{ field: 'status' }, { field: 'priority' }, { field: 'involved' }];
    </script>
    ```
  </Tab>
</Tabs>

#### minimalFilters

* Renders one or more dropdowns in the sidebar header (these replace the single `miniFilters` funnel when present).
* Each entry in the array creates **one dropdown**. The entry's `type` decides what that dropdown contains, and the matching input (`fields`, `sorts`, or `actions`) provides its content.

Default: `[]`

##### Filter-dropdown `type` scoping

| `type`    | The dropdown shows                                                     | Built from          |
| --------- | ---------------------------------------------------------------------- | ------------------- |
| `filter`  | Category checkbox sections (e.g. status, priority, assignee)           | `fields`            |
| `sort`    | Single-select sort options (e.g. by date or unread)                    | `sorts`             |
| `quick`   | One-click filters (presets and/or path predicates)                     | `actions`           |
| `actions` | A combined menu: a sort group and a quick group separated by a divider | `sorts` + `actions` |
| *(unset)* | Default quick presets plus any configured sections                     | —                   |

A **path predicate** is a rule that keeps only comments whose value at a given field path matches. For example, `{ path: 'from.userId', value: '1.1' }` keeps comments authored by the user with id `1.1`. The `value` is a literal (there is no `@me` token), and paths auto-flatten nested arrays (e.g. `comments.taggedUserContacts.contact.userId`).

Each dropdown is rendered by the filter-dropdown primitive ([`VeltCommentSidebarV2FilterDropdown`](/ui-customization/features/async/comments/comment-sidebar/comment-sidebar-v2-primitives#veltcommentsidebarv2filterdropdown) / `velt-comment-sidebar-filter-dropdown-v2`).

The examples below show one dropdown per `type`.

**`filter` — category checkboxes** (built from `fields`):

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 minimalFilters={[{ type: 'filter', fields: [{ field: 'status' }, { field: 'priority' }] }]} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 minimal-filters='[{"type":"filter","fields":[{"field":"status"},{"field":"priority"}]}]'></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

**`sort` — sort options** (built from `sorts`):

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 minimalFilters={[{ type: 'sort', sorts: ['date', 'unread'] }]} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 minimal-filters='[{"type":"sort","sorts":["date","unread"]}]'></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

**`quick` — one-click filters** (built from `actions` — presets and/or path predicates):

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2
      minimalFilters={[
        { type: 'quick', actions: ['open', 'resolved', { label: 'Written By Me', path: 'from.userId', value: '1.1' }] },
      ]}
    />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 minimal-filters='[{"type":"quick","actions":["open","resolved",{"label":"Written By Me","path":"from.userId","value":"1.1"}]}]'></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

To match several paths in one quick filter, give an action a list of `conditions` plus an `operator`:

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2
      minimalFilters={[
        {
          type: 'quick',
          actions: [{
            label: 'Involved',
            operator: 'or',
            conditions: [
              { path: 'from.userId', value: '1.1' },
              { path: 'assignedTo.userId', value: '1.1' },
              { path: 'comments.taggedUserContacts.contact.userId', value: '1.1' },
            ],
          }],
        },
      ]}
    />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2
      minimal-filters='[{"type":"quick","actions":[{"label":"Involved","operator":"or","conditions":[{"path":"from.userId","value":"1.1"},{"path":"assignedTo.userId","value":"1.1"},{"path":"comments.taggedUserContacts.contact.userId","value":"1.1"}]}]}]'>
    </velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

**`actions` — combined sort + quick menu** (built from `sorts` + `actions`, separated by a divider):

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2
      minimalFilters={[
        {
          type: 'actions',
          sorts: ['date', 'unread'],
          actions: [
            { preset: 'resolved', label: 'Show resolved comments' },
            { label: 'Only your mentions', path: 'comments.taggedUserContacts.contact.userId', value: '1.1' },
          ],
        },
      ]}
    />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2
      minimal-filters='[{"type":"actions","sorts":["date","unread"],"actions":[{"preset":"resolved","label":"Show resolved comments"},{"label":"Only your mentions","path":"comments.taggedUserContacts.contact.userId","value":"1.1"}]}]'>
    </velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

**Combine multiple dropdowns** — pass several entries to render them side by side:

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2
      minimalFilters={[
        { type: 'filter', fields: [{ field: 'status' }] },
        { type: 'sort', sorts: ['date', 'unread'] },
        { type: 'quick', actions: ['open', 'resolved'] },
      ]}
    />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 minimal-filters='[{"type":"filter","fields":[{"field":"status"}]},{"type":"sort","sorts":["date","unread"]},{"type":"quick","actions":["open","resolved"]}]'></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

<Note>
  Prefer configuring dropdowns through `minimalFilters` as shown above. If you need to place or restyle a dropdown directly in your own markup, you can set these same inputs on the filter-dropdown primitive — see [Comment Sidebar V2 Primitives](/ui-customization/features/async/comments/comment-sidebar/comment-sidebar-v2-primitives#veltcommentsidebarv2filterdropdown).
</Note>

#### defaultMinimalFilter

* Set the default active quick filter applied on load (one of the `minimalFilters` quick presets).
* Type: `'all' | 'read' | 'unread' | 'resolved' | 'open' | 'assignedToMe' | 'reset'`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 defaultMinimalFilter="open" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 default-minimal-filter="open"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### filterOperator

* Control how active selections across different filter sections combine.
* Options: `and` or `or`

Default: `and`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 filterOperator="or" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 filter-operator="or"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### filterPanelLayout

* Change the layout of the Main Filter panel.
* Options: `bottomSheet` or `menu`

Default: `bottomSheet`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 filterPanelLayout="menu" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 filter-panel-layout="menu"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### filterOptionLayout

* Change how options render within a filter section.
* Options: `dropdown` or `checkbox`

Default: `dropdown`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 filterOptionLayout="checkbox" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 filter-option-layout="checkbox"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### filterCount

* Show per-option facet counts. Disabling improves performance.

Default: `true`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 filterCount={false} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 filter-count="false"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### systemFiltersOperator

* Specify whether system filters are combined with an `and` or `or` operator.

Default: `and`

<Tabs>
  <Tab title="React / Next.js">
    **Using Props:**

    ```jsx theme={null}
    <VeltCommentsSidebarV2 systemFiltersOperator="or" />
    ```

    **Using API:**

    ```js theme={null}
    const commentElement = client.getCommentElement();
    commentElement.setSystemFiltersOperator('or');
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 system-filters-operator="or"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### filterGhostCommentsInSidebar

* Filter out and hide ghost comments from the sidebar.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    **Using Props:**

    ```jsx theme={null}
    <VeltCommentsSidebarV2 filterGhostCommentsInSidebar={true} />
    ```

    **Using API:**

    ```js theme={null}
    const commentElement = client.getCommentElement();
    commentElement.enableFilterGhostCommentsInSidebar();
    commentElement.disableFilterGhostCommentsInSidebar();
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 filter-ghost-comments-in-sidebar="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### excludeLocationIds

* Filter out comments from certain locations. These comments are not displayed in the sidebar.

Default: `[]`

<Tabs>
  <Tab title="React / Next.js">
    **Using Props:**

    ```jsx theme={null}
    <VeltCommentsSidebarV2 excludeLocationIds={['location1', 'location2']} />
    ```

    **Using API:**

    ```js theme={null}
    const commentElement = client.getCommentElement();
    commentElement.excludeLocationIdsFromSidebar(['location1', 'location2']);
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 exclude-location-ids='["location1", "location2"]'></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### customActions

* Enable custom actions in the sidebar so you can add your own wireframe-driven controls.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    **Using Props:**

    ```jsx theme={null}
    <VeltCommentsSidebarV2 customActions={true} />
    ```

    **Using API:**

    ```js theme={null}
    const commentElement = client.getCommentElement();
    commentElement.enableSidebarCustomActions();
    commentElement.disableSidebarCustomActions();
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 custom-actions="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### applyCommentSidebarClientFilters

* Apply client-provided `CommentSidebarFilters` to a set of annotations, honoring the current `systemFiltersOperator`.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    const commentElement = client.getCommentElement();
    const filtered = commentElement.applyCommentSidebarClientFilters(annotations, filters);
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```js theme={null}
    const commentElement = Velt.getCommentElement();
    const filtered = commentElement.applyCommentSidebarClientFilters(annotations, filters);
    ```
  </Tab>
</Tabs>

# Sorting

#### sortBy

* Set the default sort field. This sets the default sort, it does not render a sort dropdown.
* Type: [`SortBy`](/api-reference/sdk/models/data-models#sortby) — a built-in preset (e.g. `'date'`, `'unread'`) or a custom field key / dot-path (e.g. `'comments.createdAt'`).

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 sortBy="comments.createdAt" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 sort-by="comments.createdAt"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### sortOrder

* Set the default sort direction.
* Type: [`SortOrder`](/api-reference/sdk/models/data-models#sortorder) (`'asc' | 'desc'`)

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 sortOrder="desc" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 sort-order="desc"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### sortData

* Provide a custom-field sort path used when sorting by a custom field.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 sortData="comments.createdAt" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 sort-data="comments.createdAt"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

# Grouping

#### groupConfig

* Configure grouping in the sidebar. Grouping defaults to by-location when enabled.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 groupConfig={{ enable: true, groupBy: 'location' }} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2></velt-comments-sidebar-v2>
    <script>
      const sidebar = document.querySelector('velt-comments-sidebar-v2');
      sidebar.setAttribute('group-config', JSON.stringify({ enable: true, groupBy: 'location' }));
    </script>
    ```
  </Tab>
</Tabs>

# Navigation

#### onCommentClick

* Listen for click events on comments in the sidebar to trigger actions like navigation.
* The event callback provides access to the clicked comment's annotation object, which includes `location` and `context` data.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 onCommentClick={onCommentClick} />

    const onCommentClick = (event) => {
      const { pageId } = event.location;
      yourNavigateToPageMethod(pageId);
    };
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```js theme={null}
    const onCommentClick = (event) => {
      const { pageId } = event.detail.location;
      yourNavigateToPageMethod(pageId);
    };

    const commentElement = document.querySelector('velt-comments-sidebar-v2');
    commentElement.addEventListener('onCommentClick', onCommentClick);
    ```
  </Tab>
</Tabs>

#### onCommentNavigationButtonClick

* Triggered when the navigation button in the comment dialog in the sidebar is clicked.
* Use this event to implement custom navigation logic.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 onCommentNavigationButtonClick={onCommentNavigationButtonClick} />

    const onCommentNavigationButtonClick = (event) => {
      const { pageId } = event.location;
      yourNavigateToPageMethod(pageId);
    };
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```js theme={null}
    const commentSidebarElement = document.querySelector('velt-comments-sidebar-v2');
    commentSidebarElement.addEventListener('onCommentNavigationButtonClick', (event) => {
      console.log('onCommentNavigationButtonClick', event.detail);
    });
    ```
  </Tab>
</Tabs>

#### urlNavigation

* Enable automatic URL navigation when clicking comments in the sidebar.
* By default, clicking a comment doesn't update the page URL where the comment was added.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    **Using Props:**

    ```jsx theme={null}
    <VeltCommentsSidebarV2 urlNavigation={true} />
    ```

    **Using API:**

    ```js theme={null}
    const commentElement = client.getCommentElement();
    commentElement.enableSidebarUrlNavigation();
    commentElement.disableSidebarUrlNavigation();
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 url-navigation="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

<Note>
  `enableUrlNavigation` is a deprecated alias for `urlNavigation`. Prefer `urlNavigation`.
</Note>

#### queryParamsComments

* Sync the selected comment to URL query params.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 queryParamsComments={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 query-params-comments="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

# UI

#### pageMode

* Adds a composer in the sidebar where users can add comments without attaching them to any specific element.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 pageMode={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 page-mode="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### focusedThreadMode

* When you click a comment in the sidebar, it opens the thread in an expanded view within the sidebar itself.
* Other threads and actions like filters and search are hidden behind a back button.
* Enabling this mode also adds a navigation button in the comment dialog.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 focusedThreadMode={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 focused-thread-mode="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### openAnnotationInFocusMode

* When enabled, opens the comment dialog in focus mode when `focusedThreadMode` is enabled and either the reply button is clicked or a comment is selected via `selectCommentByAnnotationId()`.
* Requires `focusedThreadMode` to be enabled.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 focusedThreadMode={true} openAnnotationInFocusMode={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 focused-thread-mode="true" open-annotation-in-focus-mode="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### readOnly

* Make comment dialogs in the sidebar read-only to prevent users from editing comments.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 readOnly={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 read-only="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### embedMode

* Add the sidebar inline within your component; it takes up the full width and height of its container.
* In embed mode, the sidebar does not have a close button. Implement your own open/close on the host component.

Default: `null`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <div className="sidebar-container">
      <VeltCommentsSidebarV2 embedMode={true} />
    </div>
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <div class="sidebar-container">
      <velt-comments-sidebar-v2 embed-mode="true"></velt-comments-sidebar-v2>
    </div>
    ```
  </Tab>
</Tabs>

#### floatingMode

* Open the sidebar in an overlay panel that floats over the page content.
* If you use this mode, do not add the sidebar component to your app separately.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 floatingMode={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 floating-mode="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### position

* Change the side of the viewport the sidebar opens from.
* Options: `left` or `right`

Default: `right`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 position="left" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 position="left"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### variant

* Set the layout variant of the sidebar.

Default: `sidebar`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 variant="inline" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 variant="inline"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### dialogVariant

* Set the variant for the embedded comment dialog rendered in the list.

Default: `sidebar`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 dialogVariant="sidebar" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 dialog-variant="sidebar"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### focusedThreadDialogVariant

* Set the variant for the focused-thread dialog.

Default: `sidebar`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 focusedThreadDialogVariant="sidebar" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 focused-thread-dialog-variant="sidebar"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### pageModeComposerVariant

* Set the variant for the page-mode composer.

Default: `sidebar`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 pageModeComposerVariant="sidebar" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 page-mode-composer-variant="sidebar"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### forceClose

* Force the sidebar to close on outside click, even when opened programmatically via API.

Default: `true`

<Note>
  This does not affect embed mode sidebar.
</Note>

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 forceClose={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 force-close="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### fullScreen

* Add a fullscreen toggle button to the header. In fullscreen mode the sidebar expands to fill the viewport.
* Observe state changes with the `onFullscreenClick` event.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    **Using Props:**

    ```jsx theme={null}
    <VeltCommentsSidebarV2 fullScreen={true} onFullscreenClick={(e) => console.log('fullscreen', e)} />
    ```

    **Using API:**

    ```js theme={null}
    const commentElement = client.getCommentElement();
    commentElement.enableFullScreenInSidebar();
    commentElement.disableFullScreenInSidebar();
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 full-screen="true"></velt-comments-sidebar-v2>
    <script>
      const sidebar = document.querySelector('velt-comments-sidebar-v2');
      sidebar.addEventListener('onFullscreenClick', (e) => console.log('fullscreen', e));
    </script>
    ```
  </Tab>
</Tabs>

#### fullExpanded

* Render the sidebar fully expanded.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 fullExpanded={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 full-expanded="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### shadowDom

* Render the sidebar body inside a shadow root for style isolation.
* Shadow-DOM isolation is enabled by default. Opt out by setting `shadow-dom="false"` or calling `disableSidebarShadowDOM()`.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 shadowDom={false} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 shadow-dom="false"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### currentLocationSuffix

* Adds a "(this page)" suffix to the group name when the current location matches the group's location.

Default: `false`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 currentLocationSuffix={true} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 current-location-suffix="true"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### dialogSelection

* When disabled, clicking a comment in the sidebar triggers a click event instead of opening the dialog inline.

Default: `true`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 dialogSelection={false} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 dialog-selection="false"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### expandOnSelection

* Control whether comment dialogs automatically expand when selected in the sidebar.

Default: `true`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 expandOnSelection={false} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 expand-on-selection="false"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### searchPlaceholder

* Customize the placeholder text shown in the search input of the sidebar.

Default: `Search comments`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 searchPlaceholder="New placeholder" />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 search-placeholder="New placeholder"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### commentPlaceholder

* Customize the placeholder text for the dialog composer (the comment input that appears in comment dialogs/threads).

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 commentPlaceholder="Add a comment..." />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 comment-placeholder="Add a comment..."></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### replyPlaceholder

* Customize the placeholder text for reply input fields in the sidebar.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 replyPlaceholder="Write a reply..." />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 reply-placeholder="Write a reply..."></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### pageModePlaceholder

* Customize the placeholder text for the page-mode composer.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 pageModePlaceholder="Add a page comment..." />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 page-mode-placeholder="Add a page comment..."></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### editPlaceholder

* Customize the placeholder text shown when editing an existing comment or reply.
* Use `editCommentPlaceholder` for the first comment and `editReplyPlaceholder` for replies; both take precedence over `editPlaceholder`.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2
      editPlaceholder="Edit..."
      editCommentPlaceholder="Edit comment..."
      editReplyPlaceholder="Edit reply..."
    />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2
      edit-placeholder="Edit..."
      edit-comment-placeholder="Edit comment..."
      edit-reply-placeholder="Edit reply...">
    </velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### sidebarButtonCountType

* Change what the sidebar button count reflects.
  * `default`: total count of comments in open and in-progress states.
  * `filter`: count of filtered comments.

<Tabs>
  <Tab title="React / Next.js">
    **Using Props:**

    ```jsx theme={null}
    <VeltCommentsSidebarV2 sidebarButtonCountType="filter" />
    ```

    **Using API:**

    ```js theme={null}
    const commentElement = client.getCommentElement();
    commentElement.setSidebarButtonCountType('filter');
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 sidebar-button-count-type="filter"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

#### context

* Pass custom context data to page-mode composer comments in the sidebar. The provided context object is attached to any comment added via the page-mode composer.

Default: `null`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 context={{ jobId: 'job-page-mode', jobStatus: 'page comment' }} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```js theme={null}
    const commentSidebarElement = document.querySelector('velt-comments-sidebar-v2');
    commentSidebarElement?.setAttribute('context', JSON.stringify({ jobId: 'job-page-mode', jobStatus: 'page comment' }));
    ```
  </Tab>
</Tabs>

#### Virtual scrolling

* The V2 list uses virtual scrolling. Tune it with `measuredSize` (estimated row size in px), `minBufferPx`, and `maxBufferPx`.

Defaults: `measuredSize` = `220`, `minBufferPx` = `1000`, `maxBufferPx` = `2000`

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 measuredSize={220} minBufferPx={1000} maxBufferPx={2000} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```html theme={null}
    <velt-comments-sidebar-v2 measured-size="220" min-buffer-px="1000" max-buffer-px="2000"></velt-comments-sidebar-v2>
    ```
  </Tab>
</Tabs>

# Events

#### onSidebarOpen

* Callback fired when the sidebar opens.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 onSidebarOpen={(data) => console.log('opened', data)} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```js theme={null}
    const sidebar = document.querySelector('velt-comments-sidebar-v2');
    sidebar.addEventListener('onSidebarOpen', (e) => console.log('opened', e.detail));
    ```
  </Tab>
</Tabs>

#### onSidebarClose

* Callback fired when the sidebar closes.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    <VeltCommentsSidebarV2 onSidebarClose={(data) => console.log('closed', data)} />
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```js theme={null}
    const sidebar = document.querySelector('velt-comments-sidebar-v2');
    sidebar.addEventListener('onSidebarClose', (e) => console.log('closed', e.detail));
    ```
  </Tab>
</Tabs>

# Sidebar controls

#### openCommentSidebar / closeCommentSidebar / toggleCommentSidebar

* Programmatically open, close, or toggle the sidebar.

<Tabs>
  <Tab title="React / Next.js">
    ```jsx theme={null}
    const commentElement = client.getCommentElement();
    commentElement.openCommentSidebar();
    commentElement.closeCommentSidebar();
    commentElement.toggleCommentSidebar();
    ```
  </Tab>

  <Tab title="Other Frameworks">
    ```js theme={null}
    const commentElement = Velt.getCommentElement();
    commentElement.openCommentSidebar();
    commentElement.closeCommentSidebar();
    commentElement.toggleCommentSidebar();
    ```
  </Tab>
</Tabs>

<Note>
  For V2 wireframe and primitive customization, see [Comment Sidebar V2 Structure](/ui-customization/features/async/comments/comment-sidebar-structure-v2) and [Comment Sidebar V2 Primitives](/ui-customization/features/async/comments/comment-sidebar/comment-sidebar-v2-primitives). The sidebar is shadow-DOM isolated by default.
</Note>
