diff --git a/docusaurus/docs/React/assets/search-results-empty-theme-v2.png b/docusaurus/docs/React/assets/search-results-empty-theme.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-empty-theme-v2.png
rename to docusaurus/docs/React/assets/search-results-empty-theme.png
diff --git a/docusaurus/docs/React/assets/search-results-inline-theme-v2.png b/docusaurus/docs/React/assets/search-results-inline-theme.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-inline-theme-v2.png
rename to docusaurus/docs/React/assets/search-results-inline-theme.png
diff --git a/docusaurus/docs/React/assets/search-results-loading-theme-v2.png b/docusaurus/docs/React/assets/search-results-loading-theme.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-loading-theme-v2.png
rename to docusaurus/docs/React/assets/search-results-loading-theme.png
diff --git a/docusaurus/docs/React/assets/search-results-popup-theme-v2.png b/docusaurus/docs/React/assets/search-results-popup-theme.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-popup-theme-v2.png
rename to docusaurus/docs/React/assets/search-results-popup-theme.png
diff --git a/docusaurus/docs/React/basics/overview.mdx b/docusaurus/docs/React/basics/overview.mdx
index 666e49ab41..490b83369c 100644
--- a/docusaurus/docs/React/basics/overview.mdx
+++ b/docusaurus/docs/React/basics/overview.mdx
@@ -14,12 +14,13 @@ Use cases include team and social messaging, virtual events, livestream gaming,
- Text input commands (ex: Giphy and @mentions)
- Image and file uploads
- Video playback
+- Audio recording
- Read state and typing indicators
- Channel and message lists
## Where to get started
-If you are new to our SDK it is best to go through a of our [tutorial](https://getstream.io/chat/react-chat/tutorial/).
+If you are new to our SDK it is best to go through our [tutorial](https://getstream.io/chat/react-chat/tutorial/).
After that, our [getting started page](./getting-started.mdx) is a great next step.
@@ -32,4 +33,4 @@ If you are integrating our SDK, please pay attention to our [Theming](../theming
A common pattern in the library is the use of context provider hooks. These custom hooks allow for effective value sharing between parent components and their children.
This makes customization straightforward, as you can use our exported hooks in your custom components to receive the exact values needed, while also subscribing to context changes.
-The left navigation will guide you to the various documentation sections for information on everything regarding our robust component library. Check out the instructions below for adding the library to your React project.
+The left navigation will guide you to the various documentation sections for information on everything regarding our robust component library. Check out the instructions for adding the library to your React project.
diff --git a/docusaurus/docs/React/components/contexts/channel-state-context.mdx b/docusaurus/docs/React/components/contexts/channel-state-context.mdx
index c153e1a3b8..54e761fef2 100644
--- a/docusaurus/docs/React/components/contexts/channel-state-context.mdx
+++ b/docusaurus/docs/React/components/contexts/channel-state-context.mdx
@@ -18,7 +18,7 @@ const { channel, watchers } = useChannelStateContext();
### acceptedFiles
-A list of accepted file upload types.
+The value is forwarded to the context from the `Channel` component [prop `acceptedFiles`](../../components/core-components/channel.mdx#acceptedfiles).
| Type |
| -------- |
@@ -48,9 +48,24 @@ The configurations object for the currently active channel.
| ------ |
| object |
+### channelUnreadUiState
+
+The read state maintained for use by components representing channel unread state (for example `UnreadMessagesSeparator`, `UnreadMessagesNotification`).
+
+| Property | Type | Description |
+| --------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **last_read** | `Date` | Date when the channel was marked read the last time. |
+| **unread_messages** | `number` | The count of unread messages in a given channel. Unread count refers only to foreign (not own) unread messages. |
+| **first_unread_message_id** | `string` or `undefined` | The ID of the message that was marked unread (`notification.mark_unread` event). The value is available only when a message is marked unread. Therefore, cannot be relied on to place unread messages UI. |
+| **last_read_message_id** | `string` or `undefined` | The ID of the message preceding the first unread message. |
+
+| Type |
+| ---------------------- |
+| `ChannelUnreadUiState` |
+
### dragAndDropWindow
-If true, chat users will be able to drag and drop file uploads to the entire channel window.
+The value is forwarded to the context from the `Channel` component [prop `dragAndDropWindow`](../../components/core-components/channel.mdx#draganddropwindow).
| Type | Default |
| ------- | ------- |
@@ -66,8 +81,7 @@ Number of milliseconds to debounce firing the URL enrichment queries when typing
### enrichURLForPreview
-A global flag to toggle the URL enrichment and link previews in `MessageInput`. By default, the feature is disabled. It can be overridden on Thread and MessageList level through `additionalMessageInputProps`
-or directly on `MessageInput` level through `urlEnrichmentConfig` prop.
+The value is forwarded to the context from the `Channel` component [prop `enrichURLForPreview`](../../components/core-components/channel.mdx#enrichurlforpreview).
| Type | Default |
| ------- | ------- |
@@ -91,18 +105,18 @@ Custom function to identify URLs in a string for later generation of link previe
### giphyVersion
-The giphy version to use when displaying giphies.
+The value is forwarded to the context from the `Channel` component [prop `giphyVersion`](../../components/core-components/channel.mdx#giphyversion).
-| Type |
-| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `'original'` \| `'fixed_height'` \| `'fixed_height_still'` \| `'fixed_height_downsampled'` \| `'fixed_width'` \| `'fixed_width_still'` \| `'fixed_width_downsampled'` |
+| Type | Default |
+| ------ | -------------- |
+| string | 'fixed_height' |
### imageAttachmentSizeHandler
-A custom function to provide size configuration for image attachments
+The value is forwarded to the context from the `Channel` component [prop `imageAttachmentSizeHandler`](../../components/core-components/channel.mdx#imageattachmentsizehandler).
-| Type |
-| ---------------------------------------------------------------- |
+| Type |
+| ----------------------------------------------------------------- |
| `(a: Attachment, e: HTMLElement) => ImageAttachmentConfiguration` |
### hasMore
@@ -145,7 +159,7 @@ Boolean for the `channel` loading more messages.
| ------- |
| boolean |
-### loadingMoreNewer?
+### loadingMoreNewer
Flag signalling whether newer messages are being loaded as the user scrolls down in the message list. Used internally by `VirtualizedMessageList`.
@@ -155,7 +169,7 @@ Flag signalling whether newer messages are being loaded as the user scrolls down
### maxNumberOfFiles
-The maximum number of attachments allowed per `message`, defaults to the Stream Chat API maximum.
+The value is forwarded to the context from the `Channel` component [prop `maxNumberOfFiles`](../../components/core-components/channel.mdx#maxnumberoffiles).
| Type | Default |
| ------ | ------- |
@@ -179,7 +193,7 @@ Array of [message objects](https://getstream.io/chat/docs/javascript/message_for
### multipleUploads
-Whether to allow multiple attachment uploads on a message.
+The value is forwarded to the context from the `Channel` component [prop `multipleUploads`](../../components/core-components/channel.mdx#multipleuploads).
| Type | Default |
| ------- | ------- |
@@ -209,21 +223,6 @@ Custom function to react to link preview dismissal. See the guide [Link Previews
| ------------------------------------ |
| `(linkPreview: LinkPreview) => void` |
-### channelUnreadUiState
-
-The read state maintained for use by components representing channel unread state (for example `UnreadMessagesSeparator`, `UnreadMessagesNotification`).
-
-| Property | Type | Description |
-|-----------------------------|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| **last_read** | `Date` | Date when the channel was marked read the last time. |
-| **unread_messages** | `number` | The count of unread messages in a given channel. Unread count refers only to foreign (not own) unread messages. |
-| **first_unread_message_id** | `string` or `undefined` | The ID of the message that was marked unread (`notification.mark_unread` event). The value is available only when a message is marked unread. Therefore, cannot be relied on to place unread messages UI. |
-| **last_read_message_id** | `string` or `undefined` | The ID of the message preceding the first unread message. |
-
-| Type |
-|-----------------------|
-| `ChannelUnreadUiState` |
-
### pinnedMessages
The messages that are pinned in the `channel`.
@@ -258,7 +257,7 @@ Flag signalling whether the scroll to the bottom is prevented. Used internally b
### shouldGenerateVideoThumbnail
-You can turn on/off thumbnail generation for video attachments
+The value is forwarded to the context from the `Channel` component [prop `shouldGenerateVideoThumbnail`](../../components/core-components/channel.mdx#shouldgeneratevideothumbnail).
| Type |
| --------- |
@@ -306,7 +305,7 @@ Flag signalling whether the scroll to the bottom is prevented in thread. Used in
### videoAttachmentSizeHandler
-A custom function to provide size configuration for video attachments
+The value is forwarded to the context from the `Channel` component [prop `videoAttachmentSizeHandler`](../../components/core-components/channel.mdx#videoattachmentsizehandler).
| Type |
| ----------------------------------------------------------------- |
diff --git a/docusaurus/docs/React/components/contexts/chat-context.mdx b/docusaurus/docs/React/components/contexts/chat-context.mdx
index 3ac710535a..fd54d3fe8b 100644
--- a/docusaurus/docs/React/components/contexts/chat-context.mdx
+++ b/docusaurus/docs/React/components/contexts/chat-context.mdx
@@ -18,7 +18,7 @@ const { client, setActiveChannel } = useChatContext();
### client
-The `StreamChat` client instance. Any methods from the `stream-chat-js` API interface can be run off this object.
+The value is forwarded to the context from the `Chat` component [prop `client`](../../components/core-components/chat.mdx#client).
| Type |
| ------ |
@@ -49,7 +49,7 @@ The `queryInProgress` values are:
- `null` - at least one channels page has been loaded and there is no query in progress at the moment
| Type |
-|----------------------|
+| -------------------- |
| `ChannelsQueryState` |
### closeMobileNav
@@ -62,8 +62,7 @@ The function to close mobile navigation.
### customClasses
-Object containing custom CSS classnames to override the library's default container CSS. See [CSS and Theming](../../guides/theming/css-and-theming.mdx)
-for implementation assistance.
+The value is forwarded to the context from the `Chat` component [prop `customClasses`](../../components/core-components/chat.mdx#customclasses)
| Type |
| ------ |
@@ -120,25 +119,15 @@ You can override the default behavior by pulling it from context and then utiliz
### theme
-Deprecated and to be removed in a future major release. Use the `customStyles` prop to adjust CSS variables and [customize the theme](../../guides/theming/css-and-theming.mdx#css-variables) of your app.
+The value is forwarded to the context from the `Chat` component [prop `theme`](../../components/core-components/chat.mdx#theme)
-| Type |
-| ----- |
-| Theme |
-
-### themeVersion
-
-Stream chat theme version 2 has been introduced with the release of stream-chat-react v10.0.0. This flag is used internally by some UI components of the SDK and the integrators shouldn't need to use it. The value is extracted from a CSS variable `--str-chat__theme-version`. You can set it to values `'1'` or `'2'` in your stylesheets and import the corresponding v2 stylesheet from `stream-chat-react/dist`. Find out more about benefits that the theme version 2 brings to the integrators with [the theming guide](../../theming/introduction.mdx).
-
-| Type | Default |
-| -------------- | ------- |
-| `'1'` \| `'2'` | `'1'` |
+| Type |
+| ------ |
+| string |
### useImageFlagEmojisOnWindow
-Windows 10 does not support country flag emojis out of the box. It chooses to render these emojis as characters instead.
-Stream Chat can override this behavior by loading a custom web font that will render images instead (PNGs or SVGs depending
-on the platform). Set this prop to true if you want to use these custom emojis for Windows users.
+The value is forwarded to the context from the `Chat` component [prop `useImageFlagEmojisOnWindow`](../../components/core-components/chat.mdx#useimageflagemojisonwindow).
| Type | Default |
| ------- | ------- |
diff --git a/docusaurus/docs/React/components/contexts/component-context.mdx b/docusaurus/docs/React/components/contexts/component-context.mdx
index 3968c483a3..0dedce6aba 100644
--- a/docusaurus/docs/React/components/contexts/component-context.mdx
+++ b/docusaurus/docs/React/components/contexts/component-context.mdx
@@ -36,14 +36,6 @@ Custom UI component to display a attachment previews in `MessageInput`.
| --------- | ---------------------------------------------------------------------------------------------- |
| component | |
-### AutocompleteSuggestionHeader
-
-Custom UI component to override the default suggestion header component.
-
-| Type | Default |
-| --------- | ------------------------------------------------------------------------ |
-| component | |
-
### AutocompleteSuggestionItem
Custom UI component to override the default suggestion Item component.
@@ -346,11 +338,11 @@ Custom UI component to display the header of a `Thread`.
### ThreadInput
-Custom UI component to replace the `MessageInput` of a `Thread`. For the applications using [theme version 1](../../guides/theming/css-and-theming.mdx), the default is `MessageInputSmall`. Applications using [theme version 2](../../theming/introduction.mdx) will use `MessageInputFlat` by default.
+Custom UI component to replace the `MessageInput` of a `Thread`. The component uses `MessageInputFlat` by default.
-| Type | Default |
-| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| component | / |
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------ |
+| component | |
### ThreadStart
diff --git a/docusaurus/docs/React/components/core-components/channel.mdx b/docusaurus/docs/React/components/core-components/channel.mdx
index a852f52097..ad0cc3b353 100644
--- a/docusaurus/docs/React/components/core-components/channel.mdx
+++ b/docusaurus/docs/React/components/core-components/channel.mdx
@@ -6,7 +6,7 @@ title: Channel
import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
The `Channel` component is a React Context provider that wraps all the logic, functionality, and UI for an individual chat channel.
-It provides five separate contexts to its children:
+It provides four separate contexts to its children:
- [`ChannelStateContext`](../contexts/channel-state-context.mdx) - stateful data (ex: `messages` or `members`)
- [`ChannelActionContext`](../contexts/channel-action-context.mdx) - action handlers (ex: `sendMessage` or `openThread`)
@@ -142,14 +142,6 @@ Custom UI component to display an attachment previews in `MessageInput`.
| --------- | ---------------------------------------------------------------------------------------------- |
| component | |
-### AutocompleteSuggestionHeader
-
-Custom UI component to override the default suggestion header component.
-
-| Type | Default |
-| --------- | ------------------------------------------------------------------------ |
-| component | |
-
### AutocompleteSuggestionItem
Custom UI component to override the default suggestion Item component.
@@ -439,14 +431,6 @@ export const MessageInput = (props: MessageInputProps) => {
| ------- | ------- |
| boolean | true |
-### markReadOnMount
-
-Configuration parameter to mark the active channel as read when mounted (opened). By default, the channel is marked read on mount.
-
-| Type | Default |
-| ------- | ------- |
-| boolean | true |
-
### Input
Custom UI component handling how the message input is rendered.
@@ -479,6 +463,14 @@ Custom UI component to render while the `MessageList` is loading new messages.
| --------- | ------------------------------------------------------------------------------- |
| component | |
+### markReadOnMount
+
+Configuration parameter to mark the active channel as read when mounted (opened). By default, the channel is marked read on mount.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
### maxNumberOfFiles
The maximum number of attachments allowed per message, defaults to the Stream Chat API maximum.
@@ -691,11 +683,11 @@ Custom UI component to display the header of a `Thread`.
### ThreadInput
-Custom UI component to replace the `MessageInput` of a `Thread`. For the applications using [theme version 1](../../guides/theming/css-and-theming.mdx), the default is `MessageInputSmall`. Applications using [theme version 2](../../theming/introduction.mdx) will use `MessageInputFlat` by default.
+Custom UI component to replace the `MessageInput` of a `Thread`. The component uses `MessageInputFlat` by default.
-| Type | Default |
-| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| component | / |
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------ |
+| component | |
### ThreadStart
diff --git a/docusaurus/docs/React/components/core-components/chat.mdx b/docusaurus/docs/React/components/core-components/chat.mdx
index 0740a33e82..91d0a015da 100644
--- a/docusaurus/docs/React/components/core-components/chat.mdx
+++ b/docusaurus/docs/React/components/core-components/chat.mdx
@@ -46,30 +46,55 @@ const channel = client.channel('messaging', {
### customClasses
-Object containing custom CSS classnames to override the library's default container CSS. See [CSS and Theming](../../guides/theming/css-and-theming.mdx)
-for implementation assistance.
+Object containing custom CSS classnames to override the library's default container CSS. Many of the high level React components in the library come with predefined CSS container classes that inject basic display styling.
+To remove or replace these wrapper classes entirely, the `Chat` component takes a `customClasses` prop. This prop accepts a mapping of overridable container classnames.
+
+In the below example we will replace two of the default container classes, `str-chat` (maps to the `chat` key) and
+`str-chat-channel` (maps to the `channel`) key. Once replaced, add whatever styles you want in your own stylesheets.
+
+```tsx
+const customClasses: CustomClasses = {
+ chat: 'custom-chat-class',
+ channel: 'custom-channel-class',
+};
+
+const App = () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+```
-| Type |
-| ------ |
-| object |
+The accepted object keys and the default classnames they override are as follows:
-### customStyles
+- chat - `str-chat`
+- chatContainer - `str-chat__container`
+- channel - `str-chat-channel`
+- channelList - `str-chat-channel-list`
+- message - `str-chat__li str-chat__li--${groupStyles}`
+- messageList - `str-chat__list`
+- thread - `str-chat__thread`
+- threadList - `str-chat__list--thread`
+- virtualMessage - `str-chat__virtual-list-message-wrapper`
+- virtualizedMessageList - `str-chat__virtual-list`
-Object containing custom styles to override the default CSS variables. See [CSS and Theming](../../guides/theming/css-and-theming.mdx)
-for implementation assistance.
+:::caution
+Be careful overriding the default styles on the `VirtualizedMessageList` component, as our defaults handle much of the logic
+that makes the list UI perform optimally.
+:::
| Type |
| ------ |
| object |
-### darkMode
-
-If true, toggles the CSS variables to the default dark mode color palette.
-
-| Type | Default |
-| ------- | ------- |
-| boolean | false |
-
### defaultLanguage
Sets the default fallback language for UI component translation, defaults to 'en' for English.
@@ -126,11 +151,11 @@ Here, the list will take the whole width of the screen on small devices once the
### theme
-Deprecated and to be removed in a future major release. Use the `customStyles` prop to adjust CSS variables and [customize the theme](../../guides/theming/css-and-theming.mdx#css-variables) of your app.
+Used for injecting className/s to the `Channel` and `ChannelList` components.
-| Type |
-| ----- |
-| Theme |
+| Type |
+| ------ |
+| string |
### useImageFlagEmojisOnWindows
@@ -139,7 +164,7 @@ Stream Chat can override this behavior by loading a custom web font that will re
on the platform). Set this prop to true if you want to use these custom emojis for Windows users.
:::caution
-If you're moving from older versions to `11.0.0` then make sure to import related stylesheet from `stream-chat-react/css/v2/emoji-replacement.css` as it has been removed from our main stylesheet to reduce final bundle size for integrators who do not wish to use this feature.
+If you're moving from older versions to `11.0.0` then make sure to import related stylesheet from `stream-chat-react/css/emoji-replacement.css` as it has been removed from our main stylesheet to reduce final bundle size for integrators who do not wish to use this feature.
:::
| Type | Default |
diff --git a/docusaurus/docs/React/components/core-components/thread.mdx b/docusaurus/docs/React/components/core-components/thread.mdx
index fc7873e963..7b419f463f 100644
--- a/docusaurus/docs/React/components/core-components/thread.mdx
+++ b/docusaurus/docs/React/components/core-components/thread.mdx
@@ -179,11 +179,11 @@ If true, displays the thread at 100% width of its parent container, useful for m
### Input
-Custom thread input UI component used to override the optional `Input` value stored in `ComponentContext` or the default. For the applications using [theme version 1](../../guides/theming/css-and-theming.mdx), the default is `MessageInputSmall`. Applications using [theme version 2](../../theming/introduction.mdx) will use `MessageInputFlat` by default.
+Custom UI component to replace the `MessageInput` of a `Thread`. The component uses `MessageInputFlat` by default.
-| Type | Default |
-| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| component | / |
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------ |
+| component | |
### Message
diff --git a/docusaurus/docs/React/components/message-components/attachment.mdx b/docusaurus/docs/React/components/message-components/attachment.mdx
index 6da2302374..27f06ed86a 100644
--- a/docusaurus/docs/React/components/message-components/attachment.mdx
+++ b/docusaurus/docs/React/components/message-components/attachment.mdx
@@ -110,7 +110,7 @@ The following section details how the width and height of images and videos uplo
#### Maximum size
-You can control the maximum width and height of images and videos with the [`--str-chat__attachment-max-width`](../../theming/component-variables.mdx) CSS variable (available only in [theme-v2](../../theming/introduction.mdx)). The value of this variable must be a value that can be computed to a valid pixel value using the [`getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) method (for example: `300px`, `10rem`, `calc(300px - var(--margin))`, but not `100%`). If you provide an invalid value, the image and video sizing can break, which can lead to scrolling issues inside the message list (for example the message list isn't scrolled to the bottom when you open a channel).
+You can control the maximum width and height of images and videos with the [`--str-chat__attachment-max-width`](../../theming/component-variables.mdx) CSS variable. The value of this variable must be a value that can be computed to a valid pixel value using the [`getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) method (for example: `300px`, `10rem`, `calc(300px - var(--margin))`, but not `100%`). If you provide an invalid value, the image and video sizing can break, which can lead to scrolling issues inside the message list (for example the message list isn't scrolled to the bottom when you open a channel).
If you set an invalid value to the variable, you'll see a warning on the browser's console:
@@ -124,8 +124,6 @@ For example if an image has `max-width` and `max-height` set to `300px` and the
#### Aspect ratio
-The following description is applicable for [theme-v2](../../theming/introduction.mdx).
-
The SDK will try to display images and videos with their original aspect ratio, however this isn't always guaranteed (in those cases a cropped image will be displayed). Three notable exceptions are:
1. if a message contains multiple lines of texts and/or multiple attachments, the image/video might be stretched to its `max-width`
diff --git a/docusaurus/docs/React/components/message-components/message-ui.mdx b/docusaurus/docs/React/components/message-components/message-ui.mdx
index 48023cc614..e8ad602d39 100644
--- a/docusaurus/docs/React/components/message-components/message-ui.mdx
+++ b/docusaurus/docs/React/components/message-components/message-ui.mdx
@@ -59,34 +59,7 @@ const CustomMessage = () => {
`MessageSimple` and `FixedHeightMessage` are both designed to be guides to help build a custom Message UI component. At a high level,
these pre-built, default components wrap a subset of composable components that each serve specific logic and design-based purposes.
-There is a different order in which components are stacked inside the `MessageSimple` component depending on the [`themeVersion`](../contexts/chat-context.mdx/#themeversion).
-
-For example, if we strip `MessageSimple` down to its core pieces, the component resembles the following snippet with the `themeVersion` `'1'`:
-
-```jsx
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-The `themeVersion` `'2'` markup is a bit different:
+If we strip `MessageSimple` down to its core pieces, the component resembles the following snippet:
```jsx
@@ -308,11 +281,10 @@ Function that flags a message (overrides the function stored in `MessageContext`
Function that marks the message and all the following messages as unread in a channel. (overrides the function stored in `MessageContext`).
-| Type | Default |
-| ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleMarkUnread']](../contexts/message-context.mdx#handleMarkUnread) |
-
### handleMute
Function that mutes the sender of a message (overrides the function stored in `MessageContext`).
diff --git a/docusaurus/docs/React/components/message-input-components/input-ui.mdx b/docusaurus/docs/React/components/message-input-components/input-ui.mdx
index 67b40760b5..52e664e9c4 100644
--- a/docusaurus/docs/React/components/message-input-components/input-ui.mdx
+++ b/docusaurus/docs/React/components/message-input-components/input-ui.mdx
@@ -51,10 +51,6 @@ For example, if we strip `MessageInputFlat` down to its core pieces, the compone
```
-:::note
-`ImageDropzone` and `FileUploadButton` are imported from ['react-file-utils'](https://www.npmjs.com/package/react-file-utils).
-:::
-
We recommend building an Input UI component in a similar way. You can mix and match any of the UI subcomponents and arrange
in a layout that meets your design specifications. All of these UI subcomponents are exported by the library and may be used within
your custom Input UI component. Each subcomponent consumes the `MessageInputContext` and requires no/minimal props to run.
diff --git a/docusaurus/docs/React/components/utility-components/avatar.mdx b/docusaurus/docs/React/components/utility-components/avatar.mdx
index 4ef2d78747..3236cb522b 100644
--- a/docusaurus/docs/React/components/utility-components/avatar.mdx
+++ b/docusaurus/docs/React/components/utility-components/avatar.mdx
@@ -3,48 +3,38 @@ id: avatar
title: Avatar
---
-The `Avatar` component displays a user's image, with fallback to the first letter of the optional name prop.
+The `Avatar` component displays an image, with fallback to the first letter of the optional name prop.
## Basic Usage
A typical use case for the `Avatar` component would be to import and use in your custom components that will completely override a header component, preview component, or similar.
-**Example 1** - Here's an example of using the `Avatar` component within a custom preview component:
+Here's an example of using the `Avatar` component within a custom preview component:
```tsx
import { Avatar } from 'stream-chat-react';
const YourCustomChannelPreview = (props) => {
return (
- ;
-
Other channel info needed in the preview
- )
+
+
+
Other channel info needed in the preview
+
+ );
};
-
-```
-
-**Example 2** - a basic example with rounded shape:
-
-```tsx
-import { Avatar } from './Avatar';
-const image = 'https://pbs.twimg.com/profile_images/897621870069112832/dFGq6aiE_400x400.jpg';
-const name = 'roy';
-
-;
+;
```
## UI Customization
-You can also take advantage of the `Avatar` props on the `ChannelHeader` and `ChannelList` components to override just that aspect of these components specifically, see the example below.
+You can also take advantage of the `Avatar` prop on the `ChannelHeader` and `ChannelList` components to override just that aspect of these components specifically, see the example below.
-**Example 3** - an example of overriding just the `Avatar` component in the default `ChannelPreviewMessenger` component.
+An example of overriding just the `Avatar` component in the default `ChannelPreviewMessenger` component.
```tsx
const CustomAvatar = (props) => {
- return ;
+ return ;
};
} />;
@@ -52,9 +42,17 @@ const CustomAvatar = (props) => {
## Props
+### className
+
+Custom class that will be merged with the default class.
+
+| Type |
+| ------------------- |
+| string \| undefined |
+
### image
-The image URL or default is an image of the first initial of the name if there is one.
+The image URL. If the image fails to load the default is an image of the first initial of the name if there is one.
| Type | Default |
| -------------- | ------------------------- |
@@ -62,7 +60,7 @@ The image URL or default is an image of the first initial of the name if there i
### name
-An optional name of the image, used for title tag fallback.
+Used to extract a first letter to create the image fallback.
| Type |
| -------------- |
@@ -70,7 +68,7 @@ An optional name of the image, used for title tag fallback.
### onClick
-The click event handler.
+The click event handler applied to the root `div` of the component.
| Type |
| ----------------------------------------- |
@@ -78,31 +76,15 @@ The click event handler.
### onMouseOver
-The mouseOver event handler.
+The mouseOver event handler applied to the root `div` of the component.
| Type |
| ----------------------------------------- |
| (event: React.BaseSyntheticEvent) => void |
-### shape
-
-The shape of the avatar image.
-
-| Type | Default |
-| --------------------------------- | ------- |
-| 'circle' \| 'rounded' \| 'square' | circle |
-
-### size
-
-The size in pixels of the avatar image.
-
-| Type | Default |
-| ------ | ------- |
-| number | 32px |
-
### user
-The entire user object for the chat user displayed in the component.
+The entire user object for the chat user represented by the Avatar component. This props is not used by the default `Avatar` component.
| Type |
| ------ |
diff --git a/docusaurus/docs/React/components/utility-components/channel-search.mdx b/docusaurus/docs/React/components/utility-components/channel-search.mdx
index f94d07744b..2302988c12 100644
--- a/docusaurus/docs/React/components/utility-components/channel-search.mdx
+++ b/docusaurus/docs/React/components/utility-components/channel-search.mdx
@@ -11,14 +11,10 @@ import ImageInactiveSearchBarNoAppMenu from '../../assets/inactive-searchbar-no-
import ImageInactiveSearchBarWithAppMenu from '../../assets/inactive-searchbar-with-app-menu.png';
import ImageActiveSearchBarNoText from '../../assets/active-searchbar-no-text.png';
import ImageActiveSearchBarWithText from '../../assets/active-searchbar-with-text.png';
-import ImageSearchResultsInlineThemeV2 from '../../assets/search-results-inline-theme-v2.png';
-import ImageSearchResultsPopupThemeV2 from '../../assets/search-results-popup-theme-v2.png';
-import ImageSearchResultsInlineThemeV1 from '../../assets/search-results-inline-theme-v1.png';
-import ImageSearchResultsPopupThemeV1 from '../../assets/search-results-popup-theme-v1.png';
-import ImageSearchResultsLoadingThemeV2 from '../../assets/search-results-loading-theme-v2.png';
-import ImageSearchResultsLoadingThemeV1 from '../../assets/search-results-loading-theme-v1.png';
-import ImageSearchResultsEmptyThemeV2 from '../../assets/search-results-empty-theme-v2.png';
-import ImageSearchResultsEmptyThemeV1 from '../../assets/search-results-empty-theme-v1.png';
+import ImageSearchResultsInlineTheme from '../../assets/search-results-inline-theme.png';
+import ImageSearchResultsPopupTheme from '../../assets/search-results-popup-theme.png';
+import ImageSearchResultsLoadingTheme from '../../assets/search-results-loading-theme.png';
+import ImageSearchResultsEmptyTheme from '../../assets/search-results-empty-theme.png';
`ChannelSearch` is a UI component that searches for chat users and displays the results in a list. It can be used standalone or in the `ChannelList` via the `showChannelSearch` prop (default is false).
The input searches for users by default, but you can utilize the `searchForChannels` prop to also search for `channels`. Completely override the querying via the `searchFunction` prop.
@@ -42,18 +38,14 @@ Selection of a search result will set the active channel with the selected user,
```
-## ChannelSearch according to theme version
-
The `ChannelSearch` component renders 2 components:
1. the search input
2. the search results list
-If opted in the use of [theme version 2](../../theming/introduction.mdx), the `ChannelSearch` will render a more complex search input component called [`SearchBar`](./#searchbar-component). Otherwise, the [`SearchInput`](./#searchinput-component) is rendered.
-
-### Search input vs.SearchResults state
+### Search input and SearchResults state
-The input naturally transitions between 3 states regardless of theme version:
+The input naturally transitions between 3 states:
| Input state | Input | Search results |
| ------------- | -------------------------------- | -------------- |
@@ -143,23 +135,13 @@ The default styling of the first two states are as follows:
border
items={[
{
- image: ImageSearchResultsLoadingThemeV1,
- caption: Search results list content when loading (theme v1),
- alt: 'Image of search results list content when loading',
- },
- {
- image: ImageSearchResultsEmptyThemeV1,
- caption: Empty search results (theme v1),
- alt: 'Image of empty search results',
- },
- {
- image: ImageSearchResultsLoadingThemeV2,
- caption: Search results list content when loading (theme v2),
+ image: ImageSearchResultsLoadingTheme,
+ caption: Search results list content when loading,
alt: 'Image of search results list content when loading',
},
{
- image: ImageSearchResultsEmptyThemeV2,
- caption: Empty search results (theme v2),
+ image: ImageSearchResultsEmptyTheme,
+ caption: Empty search results,
alt: 'Image of empty search results',
},
]}
@@ -173,24 +155,14 @@ The search results can be rendered in place of the channel list or above the cha
border
items={[
{
- image: ImageSearchResultsInlineThemeV1,
- caption: Search results displayed inline (theme v1),
- alt: 'Image of search results displayed inline (theme v1)',
- },
- {
- image: ImageSearchResultsPopupThemeV1,
- caption: Search results displayed floating above the channel list (theme v1),
- alt: 'Image of search results displayed floating above the channel list (theme v1)',
- },
- {
- image: ImageSearchResultsInlineThemeV2,
- caption: Search results displayed inline (theme v2),
- alt: 'Image of search results displayed inline (theme v2)',
+ image: ImageSearchResultsInlineTheme,
+ caption: Search results displayed inline,
+ alt: 'Image of search results displayed inline',
},
{
- image: ImageSearchResultsPopupThemeV2,
- caption: Search results displayed floating above the channel list (theme v2),
- alt: 'Image of search results displayed floating above the channel list (theme v2)',
+ image: ImageSearchResultsPopupTheme,
+ caption: Search results displayed floating above the channel list,
+ alt: 'Image of search results displayed floating above the channel list',
},
]}
/>
@@ -245,7 +217,7 @@ const { client } = useChatContext();
### AppMenu
-Application menu / drop-down to be displayed when clicked on [`MenuIcon`](./#menuicon). Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is only available with the use of the [theming v2](../../theming/introduction.mdx). No default component is provided by the SDK. The library does not provide any CSS for `AppMenu`. Consult the customization tutorial on how to [add AppMenu to your application](../../guides/customization/channel-search.mdx/#adding-menu). The component is passed a prop `close`, which is a function that can be called to hide the app menu (e.g. on menu item selection).
+Application menu / drop-down to be displayed when clicked on [`MenuIcon`](./#menuicon). Prop is consumed only by the [`SearchBar` component](./#searchbar). No default component is provided by the SDK. The library does not provide any CSS for `AppMenu`. Consult the customization tutorial on how to [add AppMenu to your application](../../guides/customization/channel-search.mdx/#adding-menu). The component is passed a prop `close`, which is a function that can be called to hide the app menu (e.g. on menu item selection).
| Type | Default |
| --------------------- | ----------- |
@@ -261,7 +233,7 @@ The type of `channel` to create on user result selection.
### ClearInputIcon
-Custom icon component used as a content of the button used to clear the search input. Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is rendered with `themeVersion` `'2'` only.
+Custom icon component used as a content of the button used to clear the search input. Prop is consumed only by the [`SearchBar` component](./#searchbar).
| Type | Default |
| --------------------- | --------------------------------------------------------------- |
@@ -285,7 +257,7 @@ Disables execution of the search queries and makes the search text input element
### ExitSearchIcon
-Custom icon component used as a content of the button used to exit the search UI. Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is rendered with `themeVersion` `'2'` only.
+Custom icon component used as a content of the button used to exit the search UI. Prop is consumed only by the [`SearchBar` component](./#searchbar).
| Type | Default |
| --------------------- | -------------------------------------------------------------------- |
@@ -293,7 +265,7 @@ Custom icon component used as a content of the button used to exit the search UI
### MenuIcon
-Custom icon component used as a content of the button used to invoke the [`AppMenu`](./#appmenu). Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is rendered with `themeVersion` `'2'` only. The menu icon button is displayed only if `AppMenu` component has been passed to `ChannelSearch` props.
+Custom icon component used as a content of the button used to invoke the [`AppMenu`](./#appmenu). Prop is consumed only by the [`SearchBar` component](./#searchbar). The menu icon button is displayed only if `AppMenu` component has been passed to `ChannelSearch` props.
| Type | Default |
| --------------------- | ------------------------------------------------------------------ |
@@ -345,7 +317,7 @@ Display search results as an absolutely positioned popup, defaults to false and
### SearchBar
-Custom component to be rendered instead of the default . This component is displayed only if `themeVersion` is `'2'`. With the theme version 1 only the `SearchInput` is rendered. The default `SearchBar` component is a composite of multiple buttons and a search input. You can find more information about its features in an [above section](./#searchbar-component).
+Custom component to be rendered instead of the default . The default `SearchBar` component is a composite of multiple buttons and a search input. You can find more information about its features in an [above section](./#searchbar-component).
| Type | Default |
| -------------------------------------- | ----------------------------------------------------------------------- |
diff --git a/docusaurus/docs/React/components/utility-components/indicators.mdx b/docusaurus/docs/React/components/utility-components/indicators.mdx
index 183e859c43..24562c45c4 100644
--- a/docusaurus/docs/React/components/utility-components/indicators.mdx
+++ b/docusaurus/docs/React/components/utility-components/indicators.mdx
@@ -186,14 +186,6 @@ Custom UI component to display user's avatar.
| --------- | ---------------------------------------------------------- |
| component | |
-### avatarSize
-
-The size in pixels of the avatar image.
-
-| Type | Default |
-| ------ | ------- |
-| number | 32px |
-
### threadList
Boolean that signals whether the typing indicator is in a `Thread`.
diff --git a/docusaurus/docs/React/guides/customization/suggestion-list.mdx b/docusaurus/docs/React/guides/customization/suggestion-list.mdx
index 9b9c582dc3..891a839b76 100644
--- a/docusaurus/docs/React/guides/customization/suggestion-list.mdx
+++ b/docusaurus/docs/React/guides/customization/suggestion-list.mdx
@@ -105,7 +105,7 @@ const CustomSuggestionItem = (props) => {
if (!('native' in item) && 'id' in item) {
children = (
<>
-
+
{item.name ?? item.id}
>
);
diff --git a/docusaurus/docs/React/guides/customization/system-message.mdx b/docusaurus/docs/React/guides/customization/system-message.mdx
index 681dc31e82..9a2c08b725 100644
--- a/docusaurus/docs/React/guides/customization/system-message.mdx
+++ b/docusaurus/docs/React/guides/customization/system-message.mdx
@@ -42,7 +42,7 @@ const CustomSystemMessage = (props: EventComponentProps) => {
Actor:
-
+
{user?.name}
diff --git a/docusaurus/docs/React/guides/theming/actions/attachment-actions.mdx b/docusaurus/docs/React/guides/theming/actions/attachment-actions.mdx
index 80aa8c5064..9fa839dfd3 100644
--- a/docusaurus/docs/React/guides/theming/actions/attachment-actions.mdx
+++ b/docusaurus/docs/React/guides/theming/actions/attachment-actions.mdx
@@ -106,7 +106,7 @@ const CustomAttachment: React.FC = (props) => (
To add our `attachmentActions` to an uploaded image and trigger the render of the `CustomAttachmentActions` component,
we provide custom logic to override the `MessageInput` component's default submit handling behavior. For a detailed,
-step-by-step example, see the [Input Submit Handler](../../override-submit-handler.mdx) custom code example.
+step-by-step example, see the [Input Submit Handler](../../../customization/override_submit_handler) custom code example.
Simply put, if an `image` type message attachment exists, we update the `attachments` array on the `message` object
by adding the `attachmentActions`.
diff --git a/docusaurus/docs/React/guides/theming/message-ui.mdx b/docusaurus/docs/React/guides/theming/message-ui.mdx
index 52e092be89..d846e42aca 100644
--- a/docusaurus/docs/React/guides/theming/message-ui.mdx
+++ b/docusaurus/docs/React/guides/theming/message-ui.mdx
@@ -36,7 +36,7 @@ To see our changes we'll need to pass this component down to either `Channel` or

-You can see that all of the messages are now on one side and we have no idea who's the message coming from, let's adjust that with the help of some CSS, and to render the name of the sender we'll need to access `user` property of the `message` object.
+You can see that all the messages are now on one side and we have no idea who's the message coming from, let's adjust that with the help of some CSS, and to render the name of the sender we'll need to access `user` property of the `message` object.
Our message will be on the right and the message of the other senders will be on the left side of the screen.
diff --git a/docusaurus/docs/React/hooks/message-hooks.mdx b/docusaurus/docs/React/hooks/message-hooks.mdx
index ea0e8921e0..3e3d8d19c7 100644
--- a/docusaurus/docs/React/hooks/message-hooks.mdx
+++ b/docusaurus/docs/React/hooks/message-hooks.mdx
@@ -207,7 +207,7 @@ const MyCustomReactionsList = () => {
};
```
-This function limits the number of loaded reactions to 1200. To customize this behavior, provide [your own loader function](../message-components/reactions.mdx#handlefetchreactions) instead.
+This function limits the number of loaded reactions to 1200. To customize this behavior, provide [your own loader function](../components/message-components/reactions.mdx#handlefetchreactions) instead.
### useRetryHandler
diff --git a/docusaurus/docs/React/release-guides/upgrade-to-v12.mdx b/docusaurus/docs/React/release-guides/upgrade-to-v12.mdx
new file mode 100644
index 0000000000..bc99b94118
--- /dev/null
+++ b/docusaurus/docs/React/release-guides/upgrade-to-v12.mdx
@@ -0,0 +1,251 @@
+---
+id: upgrade-to-v12
+title: Upgrade to v12
+keywords: [migration guide, upgrade, v12, breaking changes]
+---
+
+## Avatar changes
+
+The `Avatar` styles are applied through CSS from the version 12 upwards. Therefore, the following changes were applied:
+
+1. Props `shape` and `size` were removed. Subsequently, the class `str-chat__avatar--${shape}` was removed.
+
+2. Another class we removed is `str-chat__avatar-image--loaded` that was applied to `img` element in the `Avatar` component.
+
+3. New prop `className` has been added to `Avatar`. Integrators can now optionally apply custom styles to custom classes.
+
+4. There have also been added new classes to `Avatar` root `div` in different components:
+
+| Component | `Avatar` root CSS class |
+| ------------------------------------------- | ----------------------------------------- |
+| `ChannelHeader` | `str-chat__avatar--channel-header` |
+| `ChannelPreviewMessenger` | `str-chat__avatar--channel-preview` |
+| `MessageStatus` | `str-chat__avatar--message-status` |
+| `ReactionsList` | `stream-chat__avatar--reaction` |
+| `QuotedMessage` | `str-chat__avatar--quoted-message-sender` |
+| `SearchResultItem` | `str-chat__avatar--channel-preview` |
+| `UserItem` rendered by `SuggestionListItem` | `str-chat__avatar--autocomplete-item` |
+
+5. As a consequence of the `Avatar` props changes, the `TypingIndicator` prop `avatarSize` have been removed as well.
+
+:::important
+**Action required**
+1 Migrate CSS applied to `.str-chat__avatar--${shape}` or re-apply the class through `Avatar` `className` prop.
+2 Migrate CSS applied to `.str-chat__avatar-image--loaded` to `.str-chat__avatar-image` class.
+3 If needed, apply custom styles to newly added classes based on the component that renders the `Avatar`.
+:::
+
+## Removal of deprecated components
+
+### Attachment rendering utility functions
+
+The attachment rendering functions were replaced with their component equivalents:
+
+:::important
+**Action required**
+Replace the render functions in your custom components with container components alternatives.
+:::
+
+| Rendering function | Component equivalent |
+| --------------------------------- | ---------------------------- |
+| `renderAttachmentWithinContainer` | `AttachmentWithinContainer` |
+| `renderAttachmentActions` | `AttachmentActionsContainer` |
+| `renderGallery` | `GalleryContainer` |
+| `renderImage` | `ImageContainer` |
+| `renderCard` | `CardContainer` |
+| `renderAudio` | `AudioContainer` |
+| `renderMedia` | `MediaContainer` |
+
+## Change import of default styles
+
+Until now, it was possible to import two stylesheets as follows:
+
+```
+import 'stream-chat-react/dist/css/v2/index.css';
+```
+
+The legacy stylesheet has been removed from the SDK bundle, and therefore it is only possible to import one stylesheet from now on:
+
+```
+import 'stream-chat-react/dist/css/v2/index.css';
+```
+
+:::important
+**Action required**
+Make sure you are importing the default styles correctly as `import 'stream-chat-react/dist/css/v2/index.css';`
+:::
+
+## Removal of legacy styles
+
+With the version 10 of `stream-chat-react` new stylesheet has been introduced. The stylesheet used previously became a legacy stylesheet. Legacy stylesheet had often times CSS classes and SDK components, that were not supported with the new stylesheet. Now, the legacy stylesheet and corresponding CSS classes and SDK component are being removed.
+
+:::caution
+These changes will impact you only, if you have imported the CSS as one of the following (you have used the legacy styles):
+
+```
+import 'stream-chat-react/css/index.css';
+```
+
+```
+import '@stream-io/stream-chat-css/dist/css/index.css';
+```
+
+:::
+
+### Removal of themeVersion from ChatContext
+
+Supporting two stylesheet lead to introduction of a flag `themeVersion` into the `ChatContext`. This flag is no more necessary and has been removed from the context value.
+
+:::important
+**Action required**
+Make sure you are not using `themeVersion in your custom components.
+:::
+
+### Removal of styles related Chat props
+
+With legacy stylesheet we have removed legacy approach to applying styles via component props. Two `Chat` component props were removed as a consequence:
+
+- `customStyles`
+- `darkMode`
+
+Also associated parts of code were removed:
+
+- `Theme` type
+- `useCustomStyles` hook
+
+:::important
+**Action required**
+1 The styles applied through `customStyles` should be applied through custom CSS.
+2 Theme (not only dark theme) can be through `Chat` prop `theme` instead of `darkMode`
+:::
+
+### Removal from ComponentContext
+
+- `AutocompleteSuggestionHeader` - the up-to-date SDK markup does not count with a header in the `ChatAutoComplete` suggestion list
+
+:::important
+**Action required**
+Make sure you are passing these custom components to the `Channel` component.
+:::
+
+### Removal of legacy components
+
+The following components are not available anymore as they were related to legacy stylesheet and are not used by the latest SDK components.
+
+:::important
+**Action required**
+1 Remove imports of these components from `stream-chat-react` in your custom components.
+2 If importing `SendIconV2` rename it to `SendIcon`.
+3 Remove the listed classes if used in your CSS.
+:::
+
+| Component | Details | Removed CSS classes |
+| ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
+| `ChatDown` | used to be rendered as the default for `LoadingErrorIndicator` by `ChannelListMessenger` (the default `ChannelList` UI component). The default is now a null component (renders `null`) | `str-chat__down` and `str-chat__down-main` |
+| `DefaultSuggestionListHeader` | rendered only with legacy stylesheet in the `ChatAutoComplete`. As a consequence the `AutocompleteSuggestionHeader` prop has been removed from `Channel` props | |
+| Icons rendered `Message` component when legacy styles applied | `ReplyIcon`, `DeliveredCheckIcon`, `ErrorIcon` | |
+| Icons rendered `MessageInput` component when legacy styles applied | `EmojiIconLarge`, `EmojiIconSmall`, `FileUploadIcon`, `FileUploadIconFlat`, `SendIconV1` (`SendIconV2` renamed to `SendIcon`) | |
+| `MessageInputSmall` | Used to be rendered in `Thread`, but was deprecated since v10 and replaced by `MessageInputFlat` | all the classes starting with `str-chat__small-message-input` |
+| `UploadsPreview` | Used to be rendered in `MessageInput` but was deprecated since v10 and replaced with `AttachmentPreviewList` | |
+| `FilePreviewer` was rendered by `UploadsPreview` | Used by component removed from the SDK | |
+| `ImagePreviewer` was rendered by `UploadsPreview` | Used by component removed from the SDK | |
+| `AttachmentIcon` | Not used by the SDK | |
+| `PictureIcon` | Not used by the SDK | |
+| `FileUploadButton` | Not used by the SDK | |
+| `ImageUploadButton` | Not used by the SDK | |
+| `ThumbnailPlaceholder` | Not used by the SDK | |
+| `Thumbnail` | Not used by the SDK | |
+
+### Removal of legacy attachment file icons
+
+The `FileIcon` component does not accept argument `version` anymore. This parameter used to determine the file icon set. There were two sets - version `'1'` and `'2'`. The icons of version `'1'` have been rendered with legacy stylesheets in the SDK components. The icons displayed under the version `'1'` have been removed now.
+
+:::important
+**Action required**
+Remove prop `version` if the `FileIcon` is used in your custom components.
+:::
+
+### Removal of legacy CSS classes
+
+We have removed classes that were used in the legacy CSS stylesheet only and thus are redundant. We recommend to use classes that were already available previously and are used by the SDK stylesheet:
+
+:::important
+**Action required**
+Replace the removed classes with their alternatives in the custom CSS.
+:::
+
+| Component | Class removed | Class to be used instead |
+| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
+| `MediaContainer` | `str-chat__attachment-media` | `str-chat__attachment` |
+| suggestion list in `ReactTextAreaAutocomplete` | `rta__autocomplete` | `str-chat__suggestion-list-container` |
+| `Avatar` root `` | `str-chat__avatar--circle`, `str-chat__avatar--square`, `str-chat__avatar--rounded` | `str-chat__avatar` possibly combined with custom class |
+| `Avatar` element `` | `str-chat__avatar-image--loaded` |
+| `Channel` root `` | `str-chat-channel` | `str-chat__channel` |
+| `ChannelHeader` root `` | `str-chat__header-livestream` | `str-chat__channel-header` |
+| `ChannelHeader` root `` children | `str-chat__header-livestream-left` | `str-chat__channel-header-end` |
+| `ChannelHeader` root `` children | `str-chat__header-livestream-left--title` | `str-chat__channel-header-title` |
+| `ChannelHeader` root `` children | `str-chat__header-livestream-left--subtitle` | `str-chat__channel-header-subtitle` |
+| `ChannelHeader` root `` children | `str-chat__header-livestream-left--members` | `str-chat__channel-header-info` |
+| `ChannelList` root `` | `str-chat-channel-list` | `str-chat__channel-list` |
+| `ChannelPreviewMessenger` root `` children | `str-chat__channel-preview-messenger--right` | `str-chat__channel-preview-end` |
+| `SearchResults` root `` children | `str-chat__channel-search-container` | `str-chat__channel-search-result-list` |
+| `SuggestionList` (rendered by `ChatAutoComplete`) container `` | `str-chat__emojisearch` | `str-chat__suggestion-list-container` |
+| `SuggestionList` (rendered by `ChatAutoComplete`) root `` | `str-chat__emojisearch__list` | `str-chat__suggestion-list` |
+| `SuggestionListItem` (rendered by `SuggestionList`) root `` | `str-chat__emojisearch__item` | `str-chat__suggestion-list-item` |
+| `EmojiPicker` root `` | `str-chat__emojiselect-wrapper` (only applied with legacy styles) | `str-chat__message-textarea-emoji-picker` |
+| `EmojiPicker` button | `str-chat__input-flat-emojiselect` (only applied with legacy styles) | `str-chat__emoji-picker-button` |
+| `Emoji` (rendered by `Message`) | `inline-text-emoji` | the `` element has been removed, no substitute class |
+| `MessageRepliesCountButton` (rendered by `Message`) root `` | `str-chat__message-simple-reply-button` | `str-chat__message-replies-count-button-wrapper` |
+| `Message` wrapper `` around `MessageStatus` & `MessageTimestamp` | `str-chat__message-data`, `str-chat__message-simple-data` | `str-chat__message-metadata` |
+| `QuotedMessage` root `` | `quoted-message` | `str-chat__quoted-message-preview` |
+| `QuotedMessage` bubble | `quoted-message-inner` | `str-chat__quoted-message-bubble` |
+| `EditMessageForm` | `str-chat__edit-message-form-options` | no alternative |
+| `EditMessageForm` | `str-chat__fileupload-wrapper` | no alternative |
+| `EditMessageForm` | `str-chat__input-fileupload` | no alternative |
+| `MessageInputFlat` root `` | all classes starting with `str-chat__input-flat` | see the current implementation of `MessageInputFlat` |
+| `QuotedMessagePreviewHeader` (rendered by `QuotedMessagePreviewHeader`) root `` | `quoted-message-preview-header` | `str-chat__quoted-message-preview-header` |
+| `QuotedMessagePreviewHeader` (rendered by `QuotedMessagePreviewHeader`) child `` | `str-chat__square-button` | `str-chat__quoted-message-remove` |
+| `QuotedMessagePreview` root `` | `quoted-message-preview` | no alternative |
+| `QuotedMessagePreview` | `quoted-message-preview-content` | `str-chat__quoted-message-preview` |
+| `QuotedMessagePreview` | `quoted-message-preview-content-inner` | `str-chat__quoted-message-bubble` |
+| `MessageList` | `str-chat__list--thread` | `str-chat__thread-list` |
+| `InfiniteScroll` rendered by `MessageList` | `str-chat__reverse-infinite-scroll` | `str-chat__message-list-scroll` |
+| `ScrollToBottomButton` | `str-chat__message-notification-right` | `str-chat__message-notification-scroll-to-latest` |
+| `ScrollToBottomButton` | `str-chat__message-notification-scroll-to-latest-unread-count` | `str-chat__jump-to-latest-unread-count` |
+| `ReactionsListModal` | `emoji` | `str-chat__message-reaction-emoji` or `str-chat__message-reaction-emoji--with-fallback` |
+| `SimpleReactionList` | `str-chat__simple-reactions-list-tooltip` | no alternative - markup removal |
+| `ThreadHeader` | `str-chat__square-button` | `str-chat__close-thread-button` |
+| `TypingIndicator` | `str-chat__typing-indicator__avatars` | no alternative - markup removal |
+
+### Added classes
+
+Migration to non-legacy styles leads to rendering of markup with the following classes:
+
+:::important
+**Action required**
+Verify your app layout is not broken and adjust the CSS if necessary.
+:::
+
+| Class | Details |
+| ---------------------------- | --------------------------------------------------------------------------- |
+| `str-chat__main-panel-inner` | A `` with this class wraps `MessageList` and `VirtualizedMessageList` |
+
+### Removed types
+
+:::important
+**Action required**
+Import type alternatives if necessary.
+:::
+
+| Removed type | Details | To be used instead |
+| -------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------- |
+| `CustomMessageActionsType` | Props for component `CustomMessageActionsList`, that renders custom messages actions in `MessageActionsBox` | `CustomMessageActionsListProps` |
+
+### TypingIndicator component without Avatars
+
+The `TypingIndicator` component does not render avatars as it used to with legacy stylesheet. Therefore, its prop `Avatar` has been removed.
+
+:::important
+**Action optional**
+Provide custom `TypingIndicator` through the `Channel` prop.
+:::
diff --git a/docusaurus/react-docusaurus-dontent-docs.plugin.js b/docusaurus/react-docusaurus-dontent-docs.plugin.js
index 6cee9d6658..05562b7064 100644
--- a/docusaurus/react-docusaurus-dontent-docs.plugin.js
+++ b/docusaurus/react-docusaurus-dontent-docs.plugin.js
@@ -6,6 +6,9 @@ module.exports = {
lastVersion: 'current',
versions: {
current: {
+ label: 'v12',
+ },
+ '11.x.x': {
label: 'v11',
},
'11.x.x-legacy': {
diff --git a/docusaurus/react_versioned_docs/version-11.x.x-legacy/components/message-input-components/input-ui.mdx b/docusaurus/react_versioned_docs/version-11.x.x-legacy/components/message-input-components/input-ui.mdx
index 460b970606..a235f261bb 100644
--- a/docusaurus/react_versioned_docs/version-11.x.x-legacy/components/message-input-components/input-ui.mdx
+++ b/docusaurus/react_versioned_docs/version-11.x.x-legacy/components/message-input-components/input-ui.mdx
@@ -52,10 +52,6 @@ For example, if we strip `MessageInputFlat` down to its core pieces, the compone
```
-:::note
-`ImageDropzone` and `FileUploadButton` are imported from ['react-file-utils'](https://www.npmjs.com/package/react-file-utils).
-:::
-
We recommend building an Input UI component in a similar way. You can mix and match any of the UI subcomponents and arrange
in a layout that meets your design specifications. All of these UI subcomponents are exported by the library and may be used within
your custom Input UI component. Each subcomponent consumes the `MessageInputContext` and requires no/minimal props to run.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/_docusaurus-components/GHComponentLink.jsx b/docusaurus/react_versioned_docs/version-11.x.x/_docusaurus-components/GHComponentLink.jsx
new file mode 100644
index 0000000000..d719d528be
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/_docusaurus-components/GHComponentLink.jsx
@@ -0,0 +1,14 @@
+import React from 'react';
+
+const GHComponentLink = ({ text, as: As = React.Fragment, path, branch = 'master' }) => {
+ return (
+
+ {text}
+
+ );
+};
+
+export default GHComponentLink;
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/AgoraDashboardRoles.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/AgoraDashboardRoles.png
new file mode 100644
index 0000000000..41123dd94b
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/AgoraDashboardRoles.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/AgoraDashboardSetPermission.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/AgoraDashboardSetPermission.png
new file mode 100644
index 0000000000..19e1669df7
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/AgoraDashboardSetPermission.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentActions1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentActions1.png
new file mode 100644
index 0000000000..8c02d6259b
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentActions1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentActions2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentActions2.png
new file mode 100644
index 0000000000..20b830f2d4
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentActions2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentSizeWarning.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentSizeWarning.png
new file mode 100644
index 0000000000..fe35fe6ad0
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/AttachmentSizeWarning.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/BasicStreamSetup.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/BasicStreamSetup.png
new file mode 100644
index 0000000000..e40f7eba79
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/BasicStreamSetup.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/ChannelHeaderVideo.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/ChannelHeaderVideo.png
new file mode 100644
index 0000000000..ab3e49d3e2
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/ChannelHeaderVideo.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/CleanSetup.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/CleanSetup.png
new file mode 100644
index 0000000000..65e4d585e9
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/CleanSetup.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/ConnectionStatus.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/ConnectionStatus.png
new file mode 100644
index 0000000000..662104fd9a
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/ConnectionStatus.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomChannelHeader.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomChannelHeader.png
new file mode 100644
index 0000000000..e8b76f4fcf
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomChannelHeader.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomChannelSearch.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomChannelSearch.png
new file mode 100644
index 0000000000..eac963e901
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomChannelSearch.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomNotification.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomNotification.png
new file mode 100644
index 0000000000..2887903aae
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomNotification.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomPreview.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomPreview.png
new file mode 100644
index 0000000000..cf8174ace7
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomPreview.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomThreadHeader.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomThreadHeader.png
new file mode 100644
index 0000000000..a845914039
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/CustomThreadHeader.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Diacritics.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Diacritics.png
new file mode 100644
index 0000000000..2639fd230c
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Diacritics.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Gallery.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Gallery.png
new file mode 100644
index 0000000000..e8f5330af0
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Gallery.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation1.png
new file mode 100644
index 0000000000..43bf626196
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation2.png
new file mode 100644
index 0000000000..5a4a62b708
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation3.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation3.png
new file mode 100644
index 0000000000..d0efb3f5b2
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation3.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation4.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation4.png
new file mode 100644
index 0000000000..5e2b70365f
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Geolocation4.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/GiphyPreview.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/GiphyPreview.png
new file mode 100644
index 0000000000..fe784492e4
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/GiphyPreview.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/HMSGuideAfter.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/HMSGuideAfter.png
new file mode 100644
index 0000000000..b86ba34378
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/HMSGuideAfter.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/HMSGuideBefore.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/HMSGuideBefore.png
new file mode 100644
index 0000000000..35b2e098c5
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/HMSGuideBefore.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing1.png
new file mode 100644
index 0000000000..ea73ba9d48
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing2.png
new file mode 100644
index 0000000000..4c327afe1e
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing3.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing3.png
new file mode 100644
index 0000000000..38ec296a13
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/ImageSizing3.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Localization1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Localization1.png
new file mode 100644
index 0000000000..c1e5ea643d
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Localization1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Localization2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Localization2.png
new file mode 100644
index 0000000000..22d5efc4c3
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Localization2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/MentionClick.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/MentionClick.png
new file mode 100644
index 0000000000..1b2d1778ba
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/MentionClick.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/MentionHover.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/MentionHover.png
new file mode 100644
index 0000000000..9b331b9d66
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/MentionHover.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/SubmitHandler.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/SubmitHandler.png
new file mode 100644
index 0000000000..f37254a595
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/SubmitHandler.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions1.png
new file mode 100644
index 0000000000..4714641291
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions2.png
new file mode 100644
index 0000000000..09864bf8bf
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions3.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions3.png
new file mode 100644
index 0000000000..9bf6c10be9
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Suggestions3.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming1.png
new file mode 100644
index 0000000000..3b3f46ebcd
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming2.png
new file mode 100644
index 0000000000..8672bb9e8c
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming3.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming3.png
new file mode 100644
index 0000000000..6416a8b0f6
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Theming3.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/Transliteration.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/Transliteration.png
new file mode 100644
index 0000000000..0acf9d86c4
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/Transliteration.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/TypingIndicator.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/TypingIndicator.png
new file mode 100644
index 0000000000..5f178de858
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/TypingIndicator.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/_link-preview-message-input.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/_link-preview-message-input.png
new file mode 100644
index 0000000000..4907f498ca
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/_link-preview-message-input.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/active-searchbar-no-text.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/active-searchbar-no-text.png
new file mode 100644
index 0000000000..e298670d17
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/active-searchbar-no-text.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/active-searchbar-with-text.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/active-searchbar-with-text.png
new file mode 100644
index 0000000000..22af6eabcb
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/active-searchbar-with-text.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-paused.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-paused.png
new file mode 100644
index 0000000000..66f3a87054
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-paused.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-permission-denied-notification.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-permission-denied-notification.png
new file mode 100644
index 0000000000..818f3f86c5
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-permission-denied-notification.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-recording.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-recording.png
new file mode 100644
index 0000000000..c856c39fa3
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-recording.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-start-recording-button.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-start-recording-button.png
new file mode 100644
index 0000000000..2774a68c58
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-start-recording-button.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-stopped.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-stopped.png
new file mode 100644
index 0000000000..f2acd43acc
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/audio-recorder-stopped.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-attachment-gallery.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-attachment-gallery.png
new file mode 100644
index 0000000000..69945802dc
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-attachment-gallery.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-attachment-preview.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-attachment-preview.png
new file mode 100644
index 0000000000..f3c854c7bd
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-attachment-preview.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-image-attachment.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-image-attachment.png
new file mode 100644
index 0000000000..37b3813c23
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/base-image-fallback-in-image-attachment.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-counter.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-counter.png
new file mode 100644
index 0000000000..7111b74cb0
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-counter.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-error.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-error.png
new file mode 100644
index 0000000000..e77c27adc3
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-error.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-loading.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-loading.png
new file mode 100644
index 0000000000..d792f26190
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-loading.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-custom.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-custom.png
new file mode 100644
index 0000000000..6803a190cd
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-custom.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-selected.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-selected.png
new file mode 100644
index 0000000000..8a83b6b80b
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-selected.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-timestamp.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-timestamp.png
new file mode 100644
index 0000000000..9c5ccf2fb3
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview-timestamp.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview.png
new file mode 100644
index 0000000000..15204f2733
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-preview.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-separator.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-separator.png
new file mode 100644
index 0000000000..9060e2ad07
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list-separator.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list.png
new file mode 100644
index 0000000000..cb68a59ec9
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-list.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-anatomy.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-anatomy.png
new file mode 100644
index 0000000000..a91ef8764d
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-anatomy.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-channels.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-channels.png
new file mode 100644
index 0000000000..9cddbc2898
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-channels.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-item.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-item.png
new file mode 100644
index 0000000000..0b073246cc
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-item.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-messages.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-messages.png
new file mode 100644
index 0000000000..f9b858f049
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-messages.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-users.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-users.png
new file mode 100644
index 0000000000..f860b81fb0
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search-users.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search.png
new file mode 100644
index 0000000000..5b87b40c61
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/channel-search.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-emoji-picker.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-emoji-picker.png
new file mode 100644
index 0000000000..5f2ccf0b23
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-emoji-picker.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-action.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-action.png
new file mode 100644
index 0000000000..e1559fdc31
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-action.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-0.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-0.png
new file mode 100644
index 0000000000..4b560ee6d7
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-0.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-1.png
new file mode 100644
index 0000000000..6149392cbe
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-2.png
new file mode 100644
index 0000000000..93a0b09098
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-3a.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-3a.png
new file mode 100644
index 0000000000..cb673539d8
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-3a.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-3b.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-3b.png
new file mode 100644
index 0000000000..38d99b005b
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-3b.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-4.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-4.png
new file mode 100644
index 0000000000..26ee9b6bdc
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-4.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-5.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-5.png
new file mode 100644
index 0000000000..8479738102
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-5.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-6.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-6.png
new file mode 100644
index 0000000000..20a02290f7
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-6.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-7.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-7.png
new file mode 100644
index 0000000000..5932556790
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-7.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-8.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-8.png
new file mode 100644
index 0000000000..87fd8206a8
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-message-ui-8.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-pin-indicator-css.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-pin-indicator-css.png
new file mode 100644
index 0000000000..572bb6409d
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-pin-indicator-css.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-pin-indicator.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-pin-indicator.png
new file mode 100644
index 0000000000..cfc131fdda
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-pin-indicator.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-system-message.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-system-message.png
new file mode 100644
index 0000000000..a51de24f40
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/custom-system-message.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/default-channel-header.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-channel-header.png
new file mode 100644
index 0000000000..456324fd2e
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-channel-header.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/default-channel-list.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-channel-list.png
new file mode 100644
index 0000000000..cf2cec0a29
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-channel-list.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/default-emoji-picker.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-emoji-picker.png
new file mode 100644
index 0000000000..707d71fbb2
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-emoji-picker.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/default-message-input.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-message-input.png
new file mode 100644
index 0000000000..7dfe8f4a9b
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-message-input.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/default-message-list.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-message-list.png
new file mode 100644
index 0000000000..a800402059
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-message-list.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/default-system-message.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-system-message.png
new file mode 100644
index 0000000000..359be0a1bd
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-system-message.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/default-thread.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-thread.png
new file mode 100644
index 0000000000..2620410510
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/default-thread.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/file-attachment-icon-set-v2-alt.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/file-attachment-icon-set-v2-alt.png
new file mode 100644
index 0000000000..5f914966c1
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/file-attachment-icon-set-v2-alt.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/file-attachment-icon-set-v2-standard.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/file-attachment-icon-set-v2-standard.png
new file mode 100644
index 0000000000..4cfeeddf6a
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/file-attachment-icon-set-v2-standard.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/inactive-searchbar-no-app-menu.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/inactive-searchbar-no-app-menu.png
new file mode 100644
index 0000000000..7a7530400f
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/inactive-searchbar-no-app-menu.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/inactive-searchbar-with-app-menu.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/inactive-searchbar-with-app-menu.png
new file mode 100644
index 0000000000..a3d79f3d72
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/inactive-searchbar-with-app-menu.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/link-preview-edit-message-form.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/link-preview-edit-message-form.png
new file mode 100644
index 0000000000..b05f7081d7
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/link-preview-edit-message-form.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/link-preview-message-input.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/link-preview-message-input.png
new file mode 100644
index 0000000000..6527149281
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/link-preview-message-input.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/margin-inspector.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/margin-inspector.png
new file mode 100644
index 0000000000..c1661f802d
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/margin-inspector.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-actions-box-custom-actions.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-actions-box-custom-actions.png
new file mode 100644
index 0000000000..2f9dc91dc8
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-actions-box-custom-actions.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-height.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-height.png
new file mode 100644
index 0000000000..0894467d04
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-height.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-attachments.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-attachments.png
new file mode 100644
index 0000000000..848ffd9824
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-attachments.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-command-autocomplete.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-command-autocomplete.png
new file mode 100644
index 0000000000..e1c7be6a2f
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-command-autocomplete.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-command-suggestions.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-command-suggestions.png
new file mode 100644
index 0000000000..18c7745086
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-command-suggestions.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-cooldown.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-cooldown.png
new file mode 100644
index 0000000000..09dc9480a2
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-cooldown.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-emoji-autocomplete.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-emoji-autocomplete.png
new file mode 100644
index 0000000000..b0ca0ccfb3
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-emoji-autocomplete.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-emoji-suggestions.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-emoji-suggestions.png
new file mode 100644
index 0000000000..8af24a1e80
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-emoji-suggestions.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-kitchensink.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-kitchensink.png
new file mode 100644
index 0000000000..5dca31d6ff
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-kitchensink.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-link.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-link.png
new file mode 100644
index 0000000000..a52eff5403
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-link.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-simple.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-simple.png
new file mode 100644
index 0000000000..05f3574852
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-simple.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions-header.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions-header.png
new file mode 100644
index 0000000000..25638f9ec0
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions-header.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions-localized.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions-localized.png
new file mode 100644
index 0000000000..0dfb35c6f5
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions-localized.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions.png
new file mode 100644
index 0000000000..12e3433752
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-suggestions.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-upload-button.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-upload-button.png
new file mode 100644
index 0000000000..556e7281d0
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-upload-button.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-user-autocomplete.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-user-autocomplete.png
new file mode 100644
index 0000000000..cf756143a4
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-user-autocomplete.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-user-suggestions.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-user-suggestions.png
new file mode 100644
index 0000000000..00965dbdc6
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-input-ui-user-suggestions.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/message-payload-custom-fields.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-payload-custom-fields.png
new file mode 100644
index 0000000000..f2a53fb009
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/message-payload-custom-fields.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-completed.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-completed.png
new file mode 100644
index 0000000000..87ab57f539
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-completed.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-no-preview.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-no-preview.png
new file mode 100644
index 0000000000..92f9ccf45a
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-no-preview.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-order.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-order.png
new file mode 100644
index 0000000000..10ca71f300
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-order.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-start.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-start.png
new file mode 100644
index 0000000000..791dacd8e8
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-start.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-updated.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-updated.png
new file mode 100644
index 0000000000..2ea012ea6a
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/payment-attachment-updated.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/reaction-selector-w-custom-options.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/reaction-selector-w-custom-options.png
new file mode 100644
index 0000000000..2bccc26991
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/reaction-selector-w-custom-options.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-and-reaction-selector.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-and-reaction-selector.png
new file mode 100644
index 0000000000..e200014ed5
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-and-reaction-selector.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-modal.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-modal.png
new file mode 100644
index 0000000000..f25e1bfb40
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-modal.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-w-custom-options.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-w-custom-options.png
new file mode 100644
index 0000000000..cc77687811
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/reactions-list-w-custom-options.png differ
diff --git a/docusaurus/docs/React/assets/search-results-empty-theme-v1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-empty-theme-v1.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-empty-theme-v1.png
rename to docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-empty-theme-v1.png
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-empty-theme-v2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-empty-theme-v2.png
new file mode 100644
index 0000000000..f66a8857cd
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-empty-theme-v2.png differ
diff --git a/docusaurus/docs/React/assets/search-results-inline-theme-v1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-inline-theme-v1.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-inline-theme-v1.png
rename to docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-inline-theme-v1.png
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-inline-theme-v2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-inline-theme-v2.png
new file mode 100644
index 0000000000..df217094f9
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-inline-theme-v2.png differ
diff --git a/docusaurus/docs/React/assets/search-results-loading-theme-v1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-loading-theme-v1.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-loading-theme-v1.png
rename to docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-loading-theme-v1.png
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-loading-theme-v2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-loading-theme-v2.png
new file mode 100644
index 0000000000..273fcd4f4f
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-loading-theme-v2.png differ
diff --git a/docusaurus/docs/React/assets/search-results-popup-theme-v1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-popup-theme-v1.png
similarity index 100%
rename from docusaurus/docs/React/assets/search-results-popup-theme-v1.png
rename to docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-popup-theme-v1.png
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-popup-theme-v2.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-popup-theme-v2.png
new file mode 100644
index 0000000000..bc99b1375e
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/search-results-popup-theme-v2.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-layout-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-layout-screenshot.png
new file mode 100644
index 0000000000..240d6a1eda
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-layout-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-screenshot.png
new file mode 100644
index 0000000000..edf1655a56
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-theme-customization-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-theme-customization-screenshot.png
new file mode 100644
index 0000000000..82451bdf6e
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-chat-ui-theme-customization-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-custom-avatar-color-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-custom-avatar-color-screenshot.png
new file mode 100644
index 0000000000..f1cb121d0d
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-custom-avatar-color-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-custom-dark-theme-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-custom-dark-theme-screenshot.png
new file mode 100644
index 0000000000..7651965aa4
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-custom-dark-theme-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-dark-ui-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-dark-ui-screenshot.png
new file mode 100644
index 0000000000..e871cfcde4
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-dark-ui-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-customization-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-customization-screenshot.png
new file mode 100644
index 0000000000..dd3f0d2a97
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-customization-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-customization2-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-customization2-screenshot.png
new file mode 100644
index 0000000000..27a486a1dc
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-customization2-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-screenshot.png
new file mode 100644
index 0000000000..2c9d16500e
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-message-color-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-rtl-layout-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-rtl-layout-screenshot.png
new file mode 100644
index 0000000000..a83946ca4f
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-rtl-layout-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-square-theme-screenshot.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-square-theme-screenshot.png
new file mode 100644
index 0000000000..8afae493c9
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-chat-css-square-theme-screenshot.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-video-graphic.jpg b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-video-graphic.jpg
new file mode 100644
index 0000000000..ddf964896a
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/stream-video-graphic.jpg differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-audio.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-audio.png
new file mode 100644
index 0000000000..7aa7e4acc9
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-audio.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-image.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-image.png
new file mode 100644
index 0000000000..7cc84a41d5
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-image.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-video.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-video.png
new file mode 100644
index 0000000000..1031577658
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-card-video.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-empty-channel-list.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-empty-channel-list.png
new file mode 100644
index 0000000000..9bb4590d04
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-empty-channel-list.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-empty-message-list.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-empty-message-list.png
new file mode 100644
index 0000000000..ed84fcf894
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-empty-message-list.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-scroll-to-bottom-button-theme-v1.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-scroll-to-bottom-button-theme-v1.png
new file mode 100644
index 0000000000..0ab2880e5b
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-scroll-to-bottom-button-theme-v1.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-svg-attachment.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-svg-attachment.png
new file mode 100644
index 0000000000..abe26659ab
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/theme-v2-svg-attachment.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-empty-waveform-data.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-empty-waveform-data.png
new file mode 100644
index 0000000000..ec1b3996d6
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-empty-waveform-data.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-fallback-title.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-fallback-title.png
new file mode 100644
index 0000000000..9315652c40
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-fallback-title.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-file-size-fallback.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-file-size-fallback.png
new file mode 100644
index 0000000000..e293abf526
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-file-size-fallback.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-in-progress.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-in-progress.png
new file mode 100644
index 0000000000..79b99e4118
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-in-progress.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-stopped-repro.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-stopped-repro.png
new file mode 100644
index 0000000000..eb519c1ced
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player-stopped-repro.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player.png
new file mode 100644
index 0000000000..4565928797
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-player.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted-fallback-title.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted-fallback-title.png
new file mode 100644
index 0000000000..010d803fe8
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted-fallback-title.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted-file-size-fallback.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted-file-size-fallback.png
new file mode 100644
index 0000000000..5c1a9c8c55
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted-file-size-fallback.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted.png
new file mode 100644
index 0000000000..d3343ccb6f
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-quoted.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-response-payload.png b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-response-payload.png
new file mode 100644
index 0000000000..258d5c6311
Binary files /dev/null and b/docusaurus/react_versioned_docs/version-11.x.x/assets/voice-recording-response-payload.png differ
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/basics/getting-started.mdx b/docusaurus/react_versioned_docs/version-11.x.x/basics/getting-started.mdx
new file mode 100644
index 0000000000..18597c7a32
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/basics/getting-started.mdx
@@ -0,0 +1,163 @@
+---
+id: getting_started
+title: Getting Started
+---
+
+This section provides a high level overview of the library setup, core components, and how they fit together. It's a great starting point and you can follow along in your code editor. For a complete, step-by-step guide in terms setting up a React project or instructions on creating specific files, see our [React Chat tutorial](https://getstream.io/chat/react-chat/tutorial/).
+
+## Your First App with Stream Chat React
+
+Before starting, make sure you have installed `stream-chat-react` (and `stream-chat`), as directed in the
+[Installation](./installation.mdx) section.
+
+You'll also need to [register](https://getstream.io/chat/trial/) and create a free tier (for up to 25 MAU) Stream application to access credentials from which you'll be able to [generate a token](https://getstream.io/chat/docs/react/token_generator/) for a user which can access your chat application.
+
+The example below is all the code you'll need to launch a fully functioning chat experience. The [`Chat`](../components/core-components/chat.mdx) and [`Channel`](../components/core-components/channel.mdx) components are React context providers that pass a variety of values to their children, including UI components, stateful data, and action handler functions.
+
+```jsx
+import {
+ Chat,
+ Channel,
+ ChannelList,
+ Window,
+ ChannelHeader,
+ MessageList,
+ MessageInput,
+ Thread,
+ useCreateChatClient,
+} from 'stream-chat-react';
+import 'stream-chat-react/dist/css/v2/index.css';
+
+const apiKey = 'your-api-key';
+const userId = 'user-id';
+const token = 'authentication-token';
+
+const filters = { members: { $in: [userId] }, type: 'messaging' };
+const options = { presence: true, state: true };
+const sort = { last_message_at: -1 };
+
+const App = () => {
+ const client = useCreateChatClient({
+ apiKey,
+ tokenOrProvider: token,
+ userData: { id: userId },
+ });
+
+ if (!client) return
Loading...
;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+```
+
+## Chat Client & Connecting User
+
+To communicate with the Stream Chat API the SDK requires a client with an established connection. The hook mentioned in the code above (`useCreateChatClient`) handles client instantiation, establishes proper connection and handles cleanups and disconnects for you. If you wish to have more control over how all of the previously mentioned is being handled see [Client and User](../guides/client-and-user.mdx) guide.
+
+## Creating a Channel
+
+Channels are at the core of Stream Chat. Within a channel you send/receive messages and interact with other users. Once a channel
+object has been initialized, the `Channel` component consumes the object and renders your chat app's functionality.
+
+By default, the Stream Chat API provides support for five different [channel types](https://getstream.io/chat/docs/react/channel_features)
+of varying use cases. A channel type is required when creating a channel and dictates the available features and permissions.
+The defaults include:
+
+- `messaging`
+- `livestream`
+- `team`
+- `gaming`
+- `commerce`
+
+:::note
+You can also create [custom channel types](https://getstream.io/chat/docs/react/channel_features/#creating-a-channel-type)
+and define your own permission sets.
+:::
+
+To create an instance of a channel, call the `channel` method on your client instance. This method takes the following parameters:
+
+- channel type
+- channel ID (optional, will be auto-generated by the backend if not supplied)
+- channel data
+
+```jsx
+const channel = client.channel('messaging', {
+ image: 'https://cdn.com/image.png',
+ name: 'Just Chatting',
+ members: ['dave-matthews', 'trey-anastasio'],
+ // option to add custom fields
+});
+```
+
+## Setting Up the Components
+
+Now that we have a client instance, a connected user, and a channel, it's time to look at the core components involved in building
+a fully functioning chat application.
+
+### Chat
+
+The [`Chat`](../components/core-components/chat.mdx) component is a React Context provider that wraps the entire Stream Chat application. It provides the [`ChatContext`](../components/contexts/chat-context.mdx) to its children, which includes the `StreamChat` client instance. All other components within the library must be nested as children of `Chat` to maintain proper functionality.
+
+The client instance can be accessed with our custom context hook:
+
+```jsx
+import { useChatContext } from 'stream-chat-react';
+
+// ...
+
+const { client } = useChatContext();
+```
+
+### Channel
+
+The [`Channel`](../components/core-components/channel.mdx) component is a React Context provider that wraps all of the logic, functionality, and UI for an individual chat channel. It provides five separate contexts to its children:
+
+- [`ChannelStateContext`](../components/contexts/channel-state-context.mdx) - stateful data (ex: `messages` or `members`)
+- [`ChannelActionContext`](../components/contexts/channel-action-context.mdx) - action handlers (ex: `sendMessage` or `openThread`)
+- [`ComponentContext`](../components/contexts/component-context.mdx) - custom component UI overrides (ex: `Avatar` or `Message`)
+- [`TypingContext`](../components/contexts/typing-context.mdx) - object of currently typing users (i.e., `typing`)
+
+### ChannelList
+
+The [`ChannelList`](../components/core-components/channel-list.mdx) component renders a list of channels and provides a preview for each. Though the `ChannelList` is essential in many chat apps, it isn't a required piece of the library. If a `ChannelList` component is used, a channel object should not be placed as a prop on the `Channel` component, as the `ChannelList` handles channel setting internally.
+
+### Window
+
+The [`Window`](../components/utility-components/window.mdx) component handles width changes in the main channel to ensure a seamless user experience when opening and closing a `Thread`.
+
+### ChannelHeader
+
+The [`ChannelHeader`](../components/utility-components/channel-header.mdx) displays pertinent information regarding the currently active channel, including image and title.
+
+### MessageList
+
+The [`MessageList`](../components/core-components/message-list.mdx) component renders a list of messages and consumes the various contexts setup from `Channel`. This component accepts a wide variety of optional props for customization needs.
+
+### MessageInput
+
+The [`MessageInput`](../components/message-input-components/message-input.mdx) component is a React Context provider that wraps all of the logic, functionality, and UI for the message input displayed in a channel. It provides the [`MessageInputContext`](../components/contexts/message-input-context.mdx) to its children.
+
+### Thread
+
+The [`Thread`](../components/core-components/thread.mdx) component renders a list of replies tied to a single parent message in a channel's main message list. A `Thread` maintains its own state and renders its own `MessageList` and `MessageInput` components.
+
+### Emojis (picker & autocomplete)
+
+The SDK is equipped with features designed to facilitate seamless integration, enabling developers to effortlessly incorporate [emoji picker](../guides/customization/emoji-picker.mdx) and emoji autocomplete (built on top of [`emoji-mart`](https://github.com/missive/emoji-mart)) functionalities for a comprehensive chat experience.
+
+Make sure to read [_Dropping support for built-in `EmojiPicker`_](../release-guides/upgrade-to-v11.mdx#dropping-support-for-built-in-emojipicker) and [_Dropping support for built-in `EmojiIndex`_](../release-guides/upgrade-to-v11.mdx#dropping-support-for-built-in-emojiindex) release guides for more information.
+
+:::note
+Read more about customization in our [Theming](../theming/introduction.mdx) and [Customizing Components](../guides/customization/overview.mdx) guides.
+:::
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/basics/installation.mdx b/docusaurus/react_versioned_docs/version-11.x.x/basics/installation.mdx
new file mode 100644
index 0000000000..1c0fec5f1e
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/basics/installation.mdx
@@ -0,0 +1,31 @@
+---
+id: installation
+title: Installation
+---
+
+We recommended using the component library through a package manager. Stream Chat React is based on top of Stream's [JavaScript Client](https://getstream.io/chat/docs/javascript/?language=javascript).
+
+### Install with NPM
+
+```bash
+npm install stream-chat stream-chat-react
+```
+
+### Install with Yarn
+
+```bash
+yarn add stream-chat stream-chat-react
+```
+
+### Install via CDN
+
+In case you are not using a package manager, or you wish to build a simple proof of concept in CodePen for example, you can load the library through a direct script link.
+If you choose to do this, make sure you explicitly specify the version of the library to prevent breaking releases from affecting your app.
+
+```html
+
+
+
+```
+
+With the installation out of the way, let's get started exploring the basics of the library.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/basics/overview.mdx b/docusaurus/react_versioned_docs/version-11.x.x/basics/overview.mdx
new file mode 100644
index 0000000000..666e49ab41
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/basics/overview.mdx
@@ -0,0 +1,35 @@
+---
+id: overview
+slug: /
+title: Overview
+---
+
+Building on top of the Stream Chat API, the Stream Chat React component library includes everything you need to build feature-rich and high-functioning chat user experiences out of the box.
+The library includes an extensive set of performant and customizable React components which allow you to get started quickly with little to no plumbing required.
+Use cases include team and social messaging, virtual events, livestream gaming, and customer support. The library supports:
+
+- Rich media messages
+- Reactions
+- Threads and quoted replies
+- Text input commands (ex: Giphy and @mentions)
+- Image and file uploads
+- Video playback
+- Read state and typing indicators
+- Channel and message lists
+
+## Where to get started
+
+If you are new to our SDK it is best to go through a of our [tutorial](https://getstream.io/chat/react-chat/tutorial/).
+
+After that, our [getting started page](./getting-started.mdx) is a great next step.
+
+:::tip
+If you are integrating our SDK, please pay attention to our [Theming](../theming/introduction.mdx) and [Customizing Components](../guides/customization/overview.mdx) sections in our guides. We see that most of our users can get very far by utilizing the flexibility of our SDKs.
+:::
+
+## Architecture
+
+A common pattern in the library is the use of context provider hooks. These custom hooks allow for effective value sharing between parent components and their children.
+This makes customization straightforward, as you can use our exported hooks in your custom components to receive the exact values needed, while also subscribing to context changes.
+
+The left navigation will guide you to the various documentation sections for information on everything regarding our robust component library. Check out the instructions below for adding the library to your React project.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-action-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-action-context.mdx
new file mode 100644
index 0000000000..b8d18a8cb8
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-action-context.mdx
@@ -0,0 +1,213 @@
+---
+id: channel_action_context
+title: ChannelActionContext
+---
+
+The `ChannelActionContext` is one of the context providers exposed in the [`Channel`](../core-components/channel.mdx) component and is consumable by all of the `Channel` children components. The context provides all of the action properties and handlers for a `channel`,
+and you can access these by calling the `useChannelActionContext` custom hook.
+
+## Basic Usage
+
+Pull values from context with our custom hook:
+
+```jsx
+const { closeThread, loadMoreThread } = useChannelActionContext();
+```
+
+## Values
+
+### addNotification
+
+Function to add a temporary notification to `MessageList`, and it will be removed after 5 seconds.
+
+| Type |
+| -------- |
+| function |
+| |
+
+### closeThread
+
+The function to close the currently open `Thread`.
+
+| Type |
+| -------- |
+| function |
+
+### dispatch
+
+The dispatch function for the [`ChannelStateReducer`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Channel/channelState.ts).
+
+| Type |
+| ------------------------- |
+| ChannelStateReducerAction |
+
+### editMessage
+
+A function that takes a message to be edited, returns a Promise.
+
+| Type |
+| -------- |
+| function |
+
+### jumpToFirstUnreadMessage
+
+Jumps to the first unread message in the channel, if such message exists. If the message is not found, jumps to last read message. Does not jump if the last read message is not defined. The parameter `queryMessageLimit` specifies the message page size around the first unread message in case it is not found in the local app state and has to be retrieved through and API call.
+
+| Type |
+| --------------------- |
+| `(queryMessageLimit?: number) => Promise` |
+
+### jumpToLatestMessage
+
+Used in conjunction with `jumpToMessage`. Restores the position of the message list back to the most recent messages.
+
+| Type |
+| --------------------- |
+| `() => Promise` |
+
+### jumpToMessage
+
+When called, `jumpToMessage` causes the current message list to jump to the message with the id specified in the `messageId` parameter.
+Here's an example of a button, which, when clicked, searches for a given message and navigates to it:
+
+```tsx
+const JumpToMessage = () => {
+ const { jumpToMessage } = useChannelActionContext();
+
+ return (
+
+ );
+};
+
+// further down the line, add the JumpToMessage to the component tree as a child of `Channel`
+// ...
+return (
+
+
+
+
+
+
+);
+```
+
+| Type |
+| -------------------------------------- |
+| `(messageId: string) => Promise` |
+
+### loadMore
+
+The function to load next page/batch of `messages` (used for pagination).
+
+| Type |
+| -------- |
+| function |
+
+### loadMoreNewer
+
+The function to load next page/batch of `messages` (used for pagination).
+
+| Type |
+| ------------------------------------ |
+| (limit?: number) => Promise |
+
+### loadMoreThread
+
+The function to load next page/batch of `messages` in a currently active/open `Thread` (used for pagination).
+
+| Type |
+| -------- |
+| function |
+
+### markRead
+
+Throttled function that executes the API request and updates the local channel read state for own user. The behavior can be configured via the single `options` parameter of type `MarkReadWrapperOptions`. The `options` parameter has the following structure:
+
+| Field | Type | Optional | Description |
+|------------------------|-----------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `updateChannelUiUnreadState` | `boolean` | yes | Signal, whether the `channelUnreadUiState` should be updated. The local state update is prevented when the Channel component is mounted. This is in order to keep the UI indicating the original unread state, when the user opens a channel. If the value for `updateChannelUiUnreadState` is not provided, the state is updated. |
+ |
+
+| Type |
+| -------- |
+| `(options?: MarkReadWrapperOptions) => void` |
+
+### onMentionsClick
+
+Custom action handler function to execute when @mention is clicked, takes a DOM click event object and an array of mentioned users.
+
+| Type |
+| -------- |
+| function |
+
+### onMentionsHover
+
+The function to execute when @mention is hovered in a `message`, takes a DOM click event object and an array of mentioned users.
+
+| Type |
+| -------- |
+| function |
+
+### openThread
+
+The function to execute when replies count button is clicked, takes the parent message of the `Thread` to be opened and optionally a DOM click event.
+
+| Type |
+| -------- |
+| function |
+
+### removeMessage
+
+The function to remove a `message` from `MessageList`, handled by the `Channel` component. Takes a `message` object.
+
+| Type |
+| -------- |
+| function |
+
+### retrySendMessage
+
+The function to resend a `message`, handled by the `Channel` component.
+
+| Type |
+| -------- |
+| function |
+
+### sendMessage
+
+The function to send a `message` on `Channel`. Takes a `message` object with the basic message information as the first argument, and custom data as the second argument.
+
+| Type |
+| -------- |
+| function |
+
+### setQuotedMessage
+
+The function to send a `QuotedMessage` on a `Channel`, take a `message` object.
+
+| Type |
+| -------- |
+| function |
+
+### updateMessage
+
+The function to update a `message` on `Channel`, takes a `message` object.
+
+| Type |
+| -------- |
+| function |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-list-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-list-context.mdx
new file mode 100644
index 0000000000..d2ddf659a7
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-list-context.mdx
@@ -0,0 +1,113 @@
+---
+id: channel_list_context
+title: ChannelListContext
+---
+
+The context value is provided by `ChannelListContextProvider` which wraps the contents rendered by [`ChannelList`](../core-components/channel-list.mdx). It exposes API that the default and custom components rendered by `ChannelList` can take advantage of. The components that can consume the context are customizable via `ChannelListProps`:
+
+- `Avatar` - component used to display channel image
+- `ChannelSearch` - renders channel search input and results
+- `EmptyStateIndicator` - rendered when the channels query returns and empty array
+- `LoadingErrorIndicator` - rendered when the channels query fails
+- `LoadingIndicator`- rendered during the channels query
+- `List` - component rendering `LoadingErrorIndicator`, `LoadingIndicator`, `EmptyStateIndicator`, `Paginator` and the list of channel `Preview` components
+- `Paginator` - takes care of requesting to load more channels into the list (pagination)
+- `Preview` - renders the information of a channel in the channel list
+
+## Basic Usage
+
+Access the API from context with our custom hook:
+
+```jsx
+import { useChannelListContext } from 'stream-chat-react';
+
+export const CustomComponent = () => {
+ const { channels, setChannels } = useChannelListContext();
+ // component logic ...
+ return(
+ {/* rendered elements */}
+ );
+}
+```
+
+## Value
+
+### channels
+
+State representing the array of loaded channels. Channels query is executed by default only within the [`ChannelList` component](../core-components/channel-list.mdx) in the SDK.
+
+| Type |
+|-------------|
+| `Channel[]` |
+
+### setChannels
+
+Sets the list of `Channel` objects to be rendered by `ChannelList` component. One have to be careful, when to call `setChannels` as the first channels query executed by the `ChannelList` overrides the whole [`channels` state](#channels). In that case it is better to subscribe to `client` event `channels.queried` and only then set the channels.
+In the following example, we have a component that sets the active channel based on the id in the URL. It waits until the first channels page is loaded, and then it sets the active channel. If the channel is not present on the first page, it performs additional API request with `getChannel()`:
+
+```tsx
+import { useEffect } from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
+import { ChannelList, ChannelListMessenger, ChannelListMessengerProps, getChannel, useChannelListContext, useChatContext } from 'stream-chat-react';
+
+const DEFAULT_CHANNEL_ID = 'general';
+const DEFAULT_CHANNEL_TYPE = 'messaging';
+
+const List = (props: ChannelListMessengerProps) => {
+ const { channelId } = useParams();
+ const navigate = useNavigate();
+ const { client, channel, setActiveChannel } = useChatContext();
+ const { setChannels } = useChannelListContext();
+
+ useEffect(() => {
+ if (!channelId) return navigate(`/${DEFAULT_CHANNEL_ID}`);
+
+ if (channel?.id === channelId || !client) return;
+
+ let subscription: { unsubscribe: () => void } | undefined;
+ if(!channel?.id || channel?.id !== channelId) {
+ subscription = client.on('channels.queried', (event: Event) => {
+ const loadedChannelData = event.queriedChannels?.channels.find((response) => response.channel.id === channelId);
+
+ if (loadedChannelData) {
+ setActiveChannel(client.channel( DEFAULT_CHANNEL_TYPE, channelId));
+ subscription?.unsubscribe();
+ return;
+ }
+
+ return getChannel({client, id: channelId, type: DEFAULT_CHANNEL_TYPE}).then((newActiveChannel) => {
+ setActiveChannel(newActiveChannel);
+ setChannels((channels) => {
+ return ([newActiveChannel, ...channels.filter((ch) => ch.data?.cid !== newActiveChannel.data?.cid)]);
+ });
+ });
+ });
+ }
+
+ return () => {
+ subscription?.unsubscribe();
+ };
+ }, [channel?.id, channelId, setChannels, client, navigate, setActiveChannel]);
+
+ return ;
+};
+
+
+
+const Sidebar = () => {
+ return (
+ // ...
+
+ // ...
+}
+```
+
+| Type |
+|---------------------------------------|
+| `Dispatch>` |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-state-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-state-context.mdx
new file mode 100644
index 0000000000..c153e1a3b8
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/channel-state-context.mdx
@@ -0,0 +1,337 @@
+---
+id: channel_state_context
+title: ChannelStateContext
+---
+
+The `ChannelStateContext` is a one of the context providers exposed in the [`Channel`](../core-components/channel.mdx) component and is consumable by all of the `Channel` children components.
+The context provides all the state properties and logic for a `channel`, and you can access these by calling the `useChannelStateContext` custom hook.
+
+## Basic Usage
+
+Pull values from context with our custom hook:
+
+```jsx
+const { channel, watchers } = useChannelStateContext();
+```
+
+## Values
+
+### acceptedFiles
+
+A list of accepted file upload types.
+
+| Type |
+| -------- |
+| string[] |
+
+### channel
+
+The currently active `StreamChat` `channel` instance to be loaded into the `Channel` component and referenced by its children.
+
+| Type |
+| ------ |
+| object |
+
+### channelCapabilities
+
+The allowed channel permissions for the currently connected user.
+
+| Type |
+| ------ |
+| object |
+
+### channelConfig
+
+The configurations object for the currently active channel.
+
+| Type |
+| ------ |
+| object |
+
+### dragAndDropWindow
+
+If true, chat users will be able to drag and drop file uploads to the entire channel window.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### debounceURLEnrichmentMs:
+
+Number of milliseconds to debounce firing the URL enrichment queries when typing. The default value is 1500(ms). See the guide [Link Previews in Message Input](../../../guides/customization/link-previews) for more.
+
+| Type | Default |
+| ------ | ------- |
+| number | 1500 |
+
+### enrichURLForPreview
+
+A global flag to toggle the URL enrichment and link previews in `MessageInput`. By default, the feature is disabled. It can be overridden on Thread and MessageList level through `additionalMessageInputProps`
+or directly on `MessageInput` level through `urlEnrichmentConfig` prop.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### error
+
+Error object (if any) in loading the `channel`, otherwise null.
+
+| Type |
+| ------ |
+| object |
+
+### findURLFn
+
+Custom function to identify URLs in a string for later generation of link previews. See the guide [Link Previews in Message Input](../../../guides/customization/link-previews) for more.
+
+| Type |
+| ---------------------------- |
+| `(text: string) => string[]` |
+
+### giphyVersion
+
+The giphy version to use when displaying giphies.
+
+| Type |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `'original'` \| `'fixed_height'` \| `'fixed_height_still'` \| `'fixed_height_downsampled'` \| `'fixed_width'` \| `'fixed_width_still'` \| `'fixed_width_downsampled'` |
+
+### imageAttachmentSizeHandler
+
+A custom function to provide size configuration for image attachments
+
+| Type |
+| ---------------------------------------------------------------- |
+| `(a: Attachment, e: HTMLElement) => ImageAttachmentConfiguration` |
+
+### hasMore
+
+If the channel has more, older, messages to paginate through.
+
+| Type |
+| ------- |
+| boolean |
+
+### hasMoreNewer
+
+If the channel has more, newer, messages to paginate through.
+
+| Type |
+| ------- |
+| boolean |
+
+#### highlightedMessageId
+
+Value is used internally for jump-to-message logic. Once the user "jumped" to the message, the message with the given ID is highlighted by manipulating its styles attribute.
+
+| Type |
+| ------ |
+| string |
+
+### loading
+
+Boolean for the `channel` loading state.
+
+| Type |
+| ------- |
+| boolean |
+
+### loadingMore
+
+Boolean for the `channel` loading more messages.
+
+| Type |
+| ------- |
+| boolean |
+
+### loadingMoreNewer?
+
+Flag signalling whether newer messages are being loaded as the user scrolls down in the message list. Used internally by `VirtualizedMessageList`.
+
+| Type |
+| ------- |
+| boolean |
+
+### maxNumberOfFiles
+
+The maximum number of attachments allowed per `message`, defaults to the Stream Chat API maximum.
+
+| Type | Default |
+| ------ | ------- |
+| number | 10 |
+
+### members
+
+Members of this `channel` (members are permanent, watchers are users who are online right now).
+
+| Type |
+| -------- |
+| object[] |
+
+### messages
+
+Array of [message objects](https://getstream.io/chat/docs/javascript/message_format/?language=javascript).
+
+| Type |
+| -------- |
+| object[] |
+
+### multipleUploads
+
+Whether to allow multiple attachment uploads on a message.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### mutes
+
+An array of muted users for a `channel`.
+
+| Type |
+| -------- |
+| object[] |
+
+### notifications
+
+Temporary notifications added to the `MessageList` on specific user/message actions.
+
+| Type |
+| -------------------------------------------------------- |
+| {id: string, text: string, type: 'success' \| 'error'}[] |
+
+### onLinkPreviewDismissed
+
+Custom function to react to link preview dismissal. See the guide [Link Previews in Message Input](../../../guides/customization/link-previews) for more.
+
+| Type |
+| ------------------------------------ |
+| `(linkPreview: LinkPreview) => void` |
+
+### channelUnreadUiState
+
+The read state maintained for use by components representing channel unread state (for example `UnreadMessagesSeparator`, `UnreadMessagesNotification`).
+
+| Property | Type | Description |
+|-----------------------------|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **last_read** | `Date` | Date when the channel was marked read the last time. |
+| **unread_messages** | `number` | The count of unread messages in a given channel. Unread count refers only to foreign (not own) unread messages. |
+| **first_unread_message_id** | `string` or `undefined` | The ID of the message that was marked unread (`notification.mark_unread` event). The value is available only when a message is marked unread. Therefore, cannot be relied on to place unread messages UI. |
+| **last_read_message_id** | `string` or `undefined` | The ID of the message preceding the first unread message. |
+
+| Type |
+|-----------------------|
+| `ChannelUnreadUiState` |
+
+### pinnedMessages
+
+The messages that are pinned in the `channel`.
+
+| Type |
+| -------- |
+| object[] |
+
+### quotedMessage
+
+An inline message reply to another message.
+
+| Type |
+| ------ |
+| object |
+
+### read
+
+The read state for each `channel` member.
+
+| Type |
+| ------ |
+| object |
+
+### suppressAutoscroll
+
+Flag signalling whether the scroll to the bottom is prevented. Used internally by `MessageList` and `VirtualizedMessageList` components.
+
+| Type |
+| ------- |
+| boolean |
+
+### shouldGenerateVideoThumbnail
+
+You can turn on/off thumbnail generation for video attachments
+
+| Type |
+| --------- |
+| `boolean` |
+
+### thread
+
+The parent message for a `thread`, if there is one, otherwise null.
+
+| Type |
+| ------ |
+| object |
+
+### threadHasMore
+
+Boolean showing if there are more messages available in current active `thread`, set to false when the end of pagination is reached.
+
+| Type |
+| ------- |
+| boolean |
+
+### threadLoadingMore
+
+If the thread is currently loading more messages.
+
+| Type |
+| ------- |
+| boolean |
+
+### threadMessages
+
+Array of messages within a `thread`.
+
+| Type |
+| -------- |
+| object[] |
+
+### threadSuppressAutoscroll
+
+Flag signalling whether the scroll to the bottom is prevented in thread. Used internally by `MessageList` and `VirtualizedMessageList` components.
+
+| Type |
+| ------- |
+| boolean |
+
+### videoAttachmentSizeHandler
+
+A custom function to provide size configuration for video attachments
+
+| Type |
+| ----------------------------------------------------------------- |
+| `(a: Attachment, e: HTMLElement) => VideoAttachmentConfiguration` |
+
+### watcherCount
+
+The number of watchers on the `channel`.
+
+| Type |
+| ------ |
+| number |
+
+### watchers
+
+An array of users who are currently watching the `channel`.
+
+| Type |
+| -------- |
+| object[] |
+
+### watcher_count
+
+The number of watchers on the `channel`.
+
+| Type |
+| ------ |
+| number |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/chat-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/chat-context.mdx
new file mode 100644
index 0000000000..3ac710535a
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/chat-context.mdx
@@ -0,0 +1,145 @@
+---
+id: chat_context
+title: ChatContext
+---
+
+The `ChatContext` is exposed by the [`Chat`](../core-components/chat.mdx) component. Since `Chat` wraps the entire chat application, all other components in the library
+have access to the values stored in this context. You can access the context values by calling the `useChatContext` custom hook.
+
+## Basic Usage
+
+Pull values from context with our custom hook:
+
+```jsx
+const { client, setActiveChannel } = useChatContext();
+```
+
+## Values
+
+### client
+
+The `StreamChat` client instance. Any methods from the `stream-chat-js` API interface can be run off this object.
+
+| Type |
+| ------ |
+| object |
+
+### channel
+
+The currently active channel, which populates the [`Channel`](../core-components/channel.mdx) component.
+
+| Type |
+| ------- |
+| Channel |
+
+### channelsQueryState
+
+Exposes API that:
+
+- indicates, whether and what channels query has been triggered within [`ChannelList` component](../core-components/channel-list.mdx) by its channels pagination controller - `queryInProgress` of type `ChannelQueryState`
+- allows to set the `queryInProgress` state with `setQueryInProgress` state setter
+- keeps track of error response from the channels query - `error`
+- allows to set the `error` state with `setError`
+
+The `queryInProgress` values are:
+
+- `uninitialized` - the initial state before the first channels query is triggered
+- `reload` - the initial channels query (loading the first page) is in progress
+- `load-more` - loading the next page of channels
+- `null` - at least one channels page has been loaded and there is no query in progress at the moment
+
+| Type |
+|----------------------|
+| `ChannelsQueryState` |
+
+### closeMobileNav
+
+The function to close mobile navigation.
+
+| Type |
+| -------- |
+| function |
+
+### customClasses
+
+Object containing custom CSS classnames to override the library's default container CSS. See [CSS and Theming](../../guides/theming/css-and-theming.mdx)
+for implementation assistance.
+
+| Type |
+| ------ |
+| object |
+
+### getAppSettings
+
+The callback function used to get available client-side app settings, includes image and file upload config.
+
+| Type |
+| -------- |
+| function |
+
+### latestMessageDatesByChannel
+
+Object containing the date of the latest message sent by the current user by channels (this is used to detect if slow mode countdown should be started)
+
+| Type |
+| ----------------------- |
+| { [key: string]: Date } |
+
+### mutes
+
+An array of users that have been muted by the connected user.
+
+| Type |
+| ------ |
+| Mute[] |
+
+### navOpen
+
+When the screen width is at a mobile breakpoint, whether the mobile navigation menu is open.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### openMobileNav
+
+The function to open mobile navigation.
+
+| Type |
+| -------- |
+| function |
+
+### setActiveChannel
+
+A function to set the currently active channel. This is used in the `ChannelList` component to navigate between channels.
+You can override the default behavior by pulling it from context and then utilizing the function.
+
+| Type |
+| -------- |
+| function |
+
+### theme
+
+Deprecated and to be removed in a future major release. Use the `customStyles` prop to adjust CSS variables and [customize the theme](../../guides/theming/css-and-theming.mdx#css-variables) of your app.
+
+| Type |
+| ----- |
+| Theme |
+
+### themeVersion
+
+Stream chat theme version 2 has been introduced with the release of stream-chat-react v10.0.0. This flag is used internally by some UI components of the SDK and the integrators shouldn't need to use it. The value is extracted from a CSS variable `--str-chat__theme-version`. You can set it to values `'1'` or `'2'` in your stylesheets and import the corresponding v2 stylesheet from `stream-chat-react/dist`. Find out more about benefits that the theme version 2 brings to the integrators with [the theming guide](../../theming/introduction.mdx).
+
+| Type | Default |
+| -------------- | ------- |
+| `'1'` \| `'2'` | `'1'` |
+
+### useImageFlagEmojisOnWindow
+
+Windows 10 does not support country flag emojis out of the box. It chooses to render these emojis as characters instead.
+Stream Chat can override this behavior by loading a custom web font that will render images instead (PNGs or SVGs depending
+on the platform). Set this prop to true if you want to use these custom emojis for Windows users.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/component-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/component-context.mdx
new file mode 100644
index 0000000000..3968c483a3
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/component-context.mdx
@@ -0,0 +1,409 @@
+---
+id: component_context
+title: ComponentContext
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+The `ComponentContext` is a one of the context providers exposed by the [`Channel`](../core-components/channel.mdx) component and is
+consumable by all the children of `Channel`. This context provides UI component override options for maximum customization.
+All UI overrides that target children of the `Channel` component should be placed as `Channel` component props in order to be injected into the `ComponentContext`.
+The `ComponentContext` also exposes the hook `useComponentContext`.
+
+## Basic Usage
+
+Pull values from context with our custom hook:
+
+```jsx
+const { Attachment, Avatar, Message } = useComponentContext();
+```
+
+## Values
+
+### Attachment
+
+Custom UI component to display attachment in an individual message.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------- |
+| component | |
+
+### AttachmentPreviewList
+
+Custom UI component to display a attachment previews in `MessageInput`.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------------------- |
+| component | |
+
+### AutocompleteSuggestionHeader
+
+Custom UI component to override the default suggestion header component.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------ |
+| component | |
+
+### AutocompleteSuggestionItem
+
+Custom UI component to override the default suggestion Item component.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------- |
+| component | |
+
+### AutocompleteSuggestionList
+
+Custom UI component to override the default List component that displays suggestions.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------- |
+| component | |
+
+### Avatar
+
+Custom UI component to display a user's avatar.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------- |
+| component | |
+
+### BaseImage
+
+Custom UI component to display image resp. a fallback in case of load error, in `` element. The default resp. custom (from `ComponentContext`) `BaseImage` component is rendered by:
+
+- - single image attachment in message list
+- - group of image attachments in message
+ list
+- - image
+ uploads preview in message input (composer)
+
+The `BaseImage` component accepts the same props as `` element.
+
+The [default `BaseImage` component](../../utility-components/base-image) tries to load and display an image and if the load fails, then an SVG image fallback is applied to the `` element as a CSS mask targeting attached `str-chat__base-image--load-failed` class.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------- |
+| component | |
+
+### CooldownTimer
+
+Custom UI component to display the slow mode cooldown timer.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------ |
+| component | |
+
+### CustomMessageActionsList
+
+Custom UI component to render set of buttons to be displayed in the .
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------------- |
+| component | |
+
+### DateSeparator
+
+Custom UI component for date separators.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------- |
+| component | |
+
+### EditMessageInput
+
+Custom UI component to override default edit message input.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------- |
+| component | |
+
+### EmojiIcon
+
+Custom UI component for emoji button in input.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| component | |
+
+### EmptyStateIndicator
+
+Custom UI component to be displayed when the `MessageList` is empty.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------- |
+| component | |
+
+### FileUploadIcon
+
+Custom UI component for file upload icon.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| component | |
+
+### GiphyPreviewMessage
+
+Custom UI component to render a Giphy preview in the `VirtualizedMessageList`.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------------- |
+| component | |
+
+### HeaderComponent
+
+Custom UI component to render at the top of the `MessageList`.
+
+| Type | Default |
+| --------- | ------- |
+| component | none |
+
+### Input
+
+Custom UI component handling how the message input is rendered.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------ |
+| component | |
+
+### LinkPreviewList
+
+Custom component to render link previews in `MessageInput`.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------- |
+| component | |
+
+### LoadingErrorIndicator
+
+Custom UI component to be shown if the channel query fails.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------------- |
+| component | |
+
+### LoadingIndicator
+
+Custom UI component to render while the `MessageList` is loading new messages.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------- |
+| component | |
+
+### Message
+
+Custom UI component to display a message in the standard `MessageList`.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### MessageDeleted
+
+Custom UI component for a deleted message.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------- |
+| component | |
+
+### MessageListNotifications
+
+Custom UI component that displays message and connection status notifications in the `MessageList`.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------------------------------- |
+| component | |
+
+### MessageNotification
+
+Custom UI component to display a notification when scrolled up the list and new messages arrive.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------------- |
+| component | |
+
+### MessageOptions
+
+Custom UI component for message options popup.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------- |
+| component | |
+
+### MessageRepliesCountButton
+
+Custom UI component to display message replies.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------- |
+| component | |
+
+### MessageStatus
+
+Custom UI component to display message delivery status.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### MessageSystem
+
+Custom UI component to display system messages.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------- |
+| component | |
+
+### MessageTimestamp
+
+Custom UI component to display a timestamp on a message. This does not include a timestamp for edited messages.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------- |
+| component | |
+
+See also [`Timestamp`](#timestamp).
+
+### MessageBouncePrompt
+
+Custom UI component for the content of the modal dialog for messages that got bounced by the moderation rules.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------- |
+| component | |
+
+### ModalGallery
+
+Custom UI component for viewing message's image attachments.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| component | |
+
+### PinIndicator
+
+Custom UI component to override default pinned message indicator.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------- |
+| component | |
+
+### QuotedMessage
+
+Custom UI component to override quoted message UI on a sent message.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### QuotedMessagePreview
+
+Custom UI component to override the message input's quoted message preview.
+
+| Type | Default |
+| --------- | -------------------------------------------------------------------------------------------- |
+| component | |
+
+### ReactionSelector
+
+Custom UI component to display the reaction selector.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------------- |
+| component | |
+
+### ReactionsList
+
+Custom UI component to display the list of reactions on a message.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------- |
+| component | |
+
+### SendButton
+
+Custom UI component for send button.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------- |
+| component | |
+
+### ThreadHead
+
+Custom UI component to be displayed at the beginning of a thread. By default, it is the thread parent message. It is composed of [Message](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/Message.tsx) context provider component and [ThreadStart](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Thread/ThreadStart.tsx) component. The latter can be customized by passing custom component to `Channel` props. The `ThreadHead` component defaults to and accepts the same props as [MessageSimple](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx).
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------ |
+| component | |
+
+### ThreadHeader
+
+Custom UI component to display the header of a `Thread`.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| component | |
+
+### ThreadInput
+
+Custom UI component to replace the `MessageInput` of a `Thread`. For the applications using [theme version 1](../../guides/theming/css-and-theming.mdx), the default is `MessageInputSmall`. Applications using [theme version 2](../../theming/introduction.mdx) will use `MessageInputFlat` by default.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| component | / |
+
+### ThreadStart
+
+Custom UI component to display the start of a threaded `MessageList`.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------- |
+| component | |
+
+### Timestamp
+
+Custom UI component to display a date used in timestamps. It's used internally by the default `MessageTimestamp`, and to display a timestamp for edited messages.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------- |
+| component | |
+
+### TriggerProvider
+
+Optional context provider that lets you override the default autocomplete triggers.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------ |
+| component | |
+
+### TypingIndicator
+
+Custom UI component for the typing indicator.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------- |
+| component | |
+
+### UnreadMessagesNotification
+
+Custom UI component that indicates a user is viewing unread messages. It disappears once the user scrolls to `UnreadMessagesSeparator`.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------------- |
+| component | |
+
+### UnreadMessagesSeparator
+
+Custom UI component inserted before the first message marked unread.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------- |
+| component | |
+
+### VirtualMessage
+
+Custom UI component to display a message in the `VirtualizedMessageList`.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-bounce-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-bounce-context.mdx
new file mode 100644
index 0000000000..851a668f65
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-bounce-context.mdx
@@ -0,0 +1,151 @@
+---
+id: message_bounce_context
+title: MessageBounceContext
+---
+
+The `MessageBounceContext` is available inside the modal rendered by the default message component for messages that got bounced by the moderation rules. This context provides callbacks that can be used to deal with the bounced message.
+
+## Basic Usage
+
+In most cases when using the default Message UI component implementation you are not going to deal with the `MessageBounceContext` directly. However if you are customizing the Message UI component, or providing a custom `MessageBouncePrompt`, the callbacks provided by this context come in handy.
+
+Get values from context with our custom hook:
+
+```jsx
+const { message, handleEdit, handleSend, handleDelete } = useMessageBounceContext();
+```
+
+Use these callbacks to implement your custom `MessageBouncePrompt`. Normally this component displays three options: edit the message before sending it again, send the message again without changes (this can be useful if you are using the "Bounce then flag" moderation flow), and delete the message.
+
+```jsx
+import { useMessageBounceContext } from 'stream-chat-react';
+
+function MyCustomMessageBouncePrompt({ onClose }) {
+ const { message, handleEdit, handleSend, handleDelete } = useMessageBounceContext();
+ return (
+ <>
+
Your message is in violation of our community rules.
+
Message id: "{message.id}"
+
+ {/* ... */}
+ >
+ );
+}
+```
+
+Then override the default `MessageBouncePrompt` component with your custom one:
+
+```jsx
+
+
+
+
+
+
+
+
+```
+
+## Usage in a Custom Message UI component
+
+When implementing your own Message component from scratch, you should consider implementing UI for bounced messages, especially if you are using one of the moderation flows with message bouncing ("Bounce", "Bounce then flag", or "Bounce then block").
+
+To do that, first check if the message is bounced:
+
+```jsx
+import { useMessageContext, isMessageBounced } from 'stream-chat-react';
+
+function CustomMessage() {
+ const { message } = useMessageContext();
+ const isBounced = isMessageBounced(message);
+ // ...
+}
+```
+
+Then, display custom UI in case the message is bounced. Don't forget to wrap the UI with the `MessageBounceProvider`, so that it has access to the callbacks used to deal with the bounced message:
+
+```jsx
+import { useMessageContext, isMessageBounced, MessageBounceProvider } from 'stream-chat-react';
+
+function MyCustomMessage() {
+ const { message } = useMessageContext();
+ const isBounced = isMessageBounced(message);
+
+ return (
+
+ {/* ... */}
+
+
+ {isBounced && (
+
+
+
+ )}
+
+ );
+}
+
+function MyCustomMessageBouncePrompt({ onClose }) {
+ const { message, handleEdit, handleSend, handleDelete } = useMessageBounceContext();
+ return (
+ <>
+
+ {/* ... */}
+ >
+ );
+}
+```
+
+It only makes sense to render `MessageBounceProvider` in the context of a bounced message, so you'll see a warning in the browser console if you try to render it for any other type of message.
+
+Implementing a custom Message UI component from scratch is a larger topic, covered by the [Message UI Customization](../../guides/theming/message-ui.mdx) guide.
+
+## Values
+
+### message
+
+The object representing the message that got bounced.
+
+| Type |
+| ------------- |
+| StreamMessage |
+
+### handleEdit
+
+Call this function to switch the bounced message into editing mode.
+
+| Type |
+| ----------------- |
+| ReactEventHandler |
+
+### handleSend
+
+Call this function to try sending the bounced message again without changes.
+
+| Type |
+| ----------------- |
+| ReactEventHandler |
+
+### handleDelete
+
+Call this function to remove the bounced message from the message list.
+
+| Type |
+| ----------------- |
+| ReactEventHandler |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-context.mdx
new file mode 100644
index 0000000000..0d8ac79623
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-context.mdx
@@ -0,0 +1,409 @@
+---
+id: message_context
+title: MessageContext
+---
+
+import MessageActionsBoxWithCustomAction from '../../assets/message-actions-box-custom-actions.png';
+
+The `MessageContext` is established within the [`Message`](../message-components/message.mdx) component. It provides data to the
+[Message UI](../message-components/message-ui.mdx) component and its children. Use the values stored within this context to build
+a custom Message UI component. You can access the context values by calling the `useMessageContext` custom hook.
+
+## Basic Usage
+
+Pull values from context with our custom hook:
+
+```jsx
+const { message, threadList } = useMessageContext();
+```
+
+## Values
+
+### actionsEnabled
+
+If true, actions such as edit, delete, flag, etc. are enabled on the message.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### additionalMessageInputProps
+
+Additional props to be passed to the underlying [`MessageInput`](../message-input-components/message-input.mdx) component that's rendered
+while editing.
+
+| Type |
+| ------ |
+| object |
+
+### autoscrollToBottom
+
+Call this function to keep message list scrolled to the bottom when the message list container scroll height increases (only available in the `VirtualizedMessageList`). An example use case is that upon user's interaction with the application, a new element appears below the last message. In order to keep the newly rendered content visible, the `autoscrollToBottom` function can be called. The container, however, is not scrolled to the bottom, if already scrolled up more than 4px from the bottom.
+
+| Type |
+| ---------- |
+| () => void |
+
+### clearEditingState
+
+When called, this function will exit the editing state on the message.
+
+| Type |
+| ------------------------------------------ |
+| (event?: React.BaseSyntheticEvent) => void |
+
+### customMessageActions
+
+An object containing custom message actions (key) and function handlers (value). The key is used as a display text inside the button. Therefore, it should not be cryptic but rather bear the end user in mind when formulating it.
+
+```jsx
+const customActions = {
+ 'Copy text': (message) => {
+ navigator.clipboard.writeText(message.text || '');
+ },
+};
+
+;
+```
+
+Custom action item "Copy text" in the message actions box:
+
+
+
+| Type |
+| ------ |
+| object |
+
+### editing
+
+If true, the message toggles to an editing state.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### endOfGroup
+
+When true, the message is the last one in a group sent by a specific user (only used in the `VirtualizedMessageList`).
+
+| Type |
+| ------- |
+| boolean |
+
+### firstOfGroup
+
+When true, the message is the first one in a group sent by a specific user (only used in the `VirtualizedMessageList`).
+
+| Type |
+| ------- |
+| boolean |
+
+### formatDate
+
+Overrides the default date formatting logic, has access to the original date object.
+
+| Type |
+| ---------------------- |
+| (date: Date) => string |
+
+### getMessageActions
+
+Function that returns an array of the allowed actions on a message by the currently connected user.
+
+| Type |
+| ------------------------- |
+| () => MessageActionsArray |
+
+### groupedByUser
+
+If true, group messages sent by each user (only used in the `VirtualizedMessageList`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### groupStyles
+
+An array of potential styles to apply to a grouped message (ex: top, bottom, single).
+
+| Type | Options |
+| -------- | ----------------------------------------------- |
+| string[] | '' \| 'middle' \| 'top' \| 'bottom' \| 'single' |
+
+### handleAction
+
+Function that calls an action on a message.
+
+| Type |
+| ----------------------------------------------------------------------------------------------------- |
+| (dataOrName?: string \| FormData, value?: string, event?: React.BaseSyntheticEvent) => Promise |
+
+### handleDelete
+
+Function that removes a message from the current channel.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleEdit
+
+Function that edits a message.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleFetchReactions
+
+Function that loads the reactions for a message.
+
+| Type |
+| ------------------------------------- |
+| () => Promise \ |
+
+This function limits the number of loaded reactions to 1200. To customize this behavior, you can pass [a custom `ReactionsList` component](../message-components/reactions.mdx#handlefetchreactions).
+
+### handleFlag
+
+Function that flags a message.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleMarkUnread
+
+Function that marks the message and all the following messages as unread in a channel.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleMute
+
+Function that mutes the sender of a message.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleOpenThread
+
+Function that opens a [`Thread`](../core-components/thread.mdx) on a message.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handlePin
+
+Function that pins a message in the current channel.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleReaction
+
+Function that adds/removes a reaction on a message.
+
+| Type |
+| ------------------------------------------------------------------------- |
+| (reactionType: string, event: React.BaseSyntheticEvent) => Promise |
+
+### handleRetry
+
+Function that retries sending a message after a failed request (overrides the function stored in `ChannelActionContext`).
+
+| Type |
+| ------------------------------------------ |
+| (message: StreamMessage) => Promise |
+
+### highlighted
+
+Whether to highlight and focus the message on load.
+
+| Type |
+| ------- |
+| boolean |
+
+### initialMessage
+
+When true, signifies the message is the parent message in a thread list.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### isMyMessage
+
+Function that returns whether or not a message belongs to the current user.
+
+| Type |
+| ------------- |
+| () => boolean |
+
+### isReactionEnabled (deprecated)
+
+If true, sending reactions is enabled in the currently active channel.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### lastReceivedId
+
+The latest message ID in the current channel.
+
+| Type |
+| ------ |
+| string |
+
+### message
+
+The `StreamChat` message object, which provides necessary data to the underlying UI components.
+
+| Type |
+| ------ |
+| object |
+
+### messageListRect
+
+DOMRect object linked to the parent `MessageList` component.
+
+| Type |
+| ------- |
+| DOMRect |
+
+### mutes
+
+An array of users that have been muted by the connected user.
+
+| Type | Default |
+| ------ | ----------------------------------------------------------- |
+| Mute[] | [ChannelStateContext['mutes']](./channel-state-context.mdx) |
+
+### onMentionsClickMessage
+
+Function that runs on click of an @mention in a message.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### onMentionsHoverMessage
+
+Function that runs on hover of an @mention in a message.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### onReactionListClick
+
+Function that runs on click of the reactions list component.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### onUserClick
+
+Function that runs on click of a user avatar.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### onUserHover
+
+Function that runs on hover of a user avatar.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### pinPermissions
+
+The user roles allowed to pin messages in various channel types (deprecated in favor of `channelCapabilities`).
+
+| Type | Default |
+| ------ | ------------------------------------------------------------------------- |
+| object | |
+
+### reactionSelectorRef
+
+Ref to be placed on the reaction selector component.
+
+| Type |
+| --------------------------------------- |
+| React.MutableRefObject |
+
+### readBy
+
+An array of users that have read the current message.
+
+| Type |
+| ----- |
+| array |
+
+### renderText
+
+Custom function to render message text content.
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------ |
+| function | |
+
+### setEditingState
+
+Function to toggle the editing state on a message.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### showDetailedReactions
+
+When true, show the reactions list component.
+
+| Type |
+| ------- |
+| boolean |
+
+### sortReactionDetails
+
+Comparator function to sort the list of reacted users. Should have the same signature as an array's `sort` method.
+
+| Type | Default |
+| ---------------------------------------------------------- | ------------------ |
+| (this: ReactionResponse, that: ReactionResponse) => number | alphabetical order |
+
+### sortReactions
+
+Comparator function to sort reactions. Should have the same signature as an array's `sort` method.
+
+| Type | Default |
+| -------------------------------------------------------- | ------------------ |
+| (this: ReactionSummary, that: ReactionSummary) => number | alphabetical order |
+
+### threadList
+
+If true, indicates that the current `MessageList` component is part of a `Thread`.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### unsafeHTML
+
+If true, renders HTML instead of markdown. Posting HTML is only supported server-side.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-input-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-input-context.mdx
new file mode 100644
index 0000000000..2cfc44b4f8
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-input-context.mdx
@@ -0,0 +1,535 @@
+---
+id: message_input_context
+title: MessageInputContext
+---
+
+The `MessageInputContext` is established within the [`MessageInput`](../message-input-components/message-input.mdx) component.
+The value is the combination of the `MessageInputProps`, `MessageInputState` (returned by the `useMessageInputState` hook), and `cooldownTimerState` (returned by the `useCooldownTimer hook`).
+It provides data to the [Input UI](../message-input-components/input-ui.mdx) component and its children. Use the values stored
+within this context to build a custom Input UI component. You can access the context values by calling the `useMessageInputContext`
+custom hook.
+
+## Basic Usage
+
+Pull values from context with our custom hook:
+
+```jsx
+const { autocompleteTriggers, handleSubmit } = useMessageInputContext();
+```
+
+## Values
+
+### additionalTextareaProps
+
+Additional props to be passed to the underlying `AutoCompleteTextarea` component, [available props](https://www.npmjs.com/package/react-textarea-autosize).
+
+| Type |
+| ------ |
+| object |
+
+### attachments
+
+An array of attachments added to the current message.
+
+| Type |
+| ------------ |
+| Attachment[] |
+
+### autocompleteTriggers
+
+A mapping of the current triggers permitted in the currently active channel.
+
+| Type | Default Triggers |
+| ------ | ---------------- |
+| object | `/` - commands |
+| | `@` - mentions |
+| | `:` - emojis |
+
+### cancelURLEnrichment
+
+Function cancels all the scheduled or in-progress URL enrichment queries and resets the state.
+
+| Type |
+| ---------- |
+| () => void |
+
+### clearEditingState
+
+Function to clear the editing state while editing a message.
+
+| Type |
+| ---------- |
+| () => void |
+
+### closeCommandsList
+
+Function to manually close the list of supported slash commands.
+
+| Type |
+| ---------- |
+| () => void |
+
+### closeEmojiPicker
+
+Function to close the `EmojiPicker` component.
+
+| Type |
+| ------------------------------------------- |
+| React.MouseEventHandler |
+
+### closeEmojiPickerOnClick
+
+If true, picking an emoji from the `EmojiPicker` component will close the picker.
+
+| Type |
+| ------- |
+| boolean |
+
+### closeMentionsList
+
+Function to manually close the list of potential users to mention.
+
+| Type |
+| ---------- |
+| () => void |
+
+### cooldownInterval
+
+If slow mode is enabled, the required wait time between messages for each user.
+
+| Type |
+| ------ |
+| number |
+
+### cooldownRemaining
+
+If slow mode is enabled, the amount of time remaining before the connected user can send another message.
+
+| Type |
+| ------ |
+| number |
+
+### disabled
+
+If true, disables the text input.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### disableMentions
+
+If true, the suggestion list will not display and autocomplete @mentions.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### dismissLinkPreview
+
+Function called when a single link preview is dismissed.
+
+| Type |
+| ---------------------------------- |
+| (linkPreview: LinkPreview) => void |
+
+### doFileUploadRequest
+
+Function to override the default file upload request.
+
+| Type |
+| ----------------------------------------------------------------------------- |
+| (file: FileUpload['file'], channel: Channel) => Promise |
+
+### doImageUploadRequest
+
+Function to override the default image upload request.
+
+| Type |
+| ------------------------------------------------------------------------------ |
+| (file: ImageUpload['file'], channel: Channel) => Promise |
+
+### emojiIndex
+
+Custom class constructor to override default `NimbleEmojiIndex` from ['emoji-mart'](https://www.npmjs.com/package/emoji-mart).
+
+| Type | Default |
+| ----------- | -------------------------------------------------------------------- |
+| constructor | [ComponentContext['EmojiIndex']](./component-context.mdx#emojiindex) |
+
+### emojiPickerIsOpen
+
+If true, signifies the `EmojiPicker` component is currently open.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### emojiPickerRef
+
+React mutable ref placed on the `EmojiPicker` container `div`.
+
+| Type |
+| --------------------------------------- |
+| React.MutableRefObject |
+
+### errorHandler
+
+Custom error handler function to be called with a file/image upload fails.
+
+| Type |
+| ------------------------------------------------------------------------------------------------- |
+| (error: Error, type: string, file: (FileUpload \| ImageUpload)['file'] & { id?: string }) => void |
+
+### fileOrder
+
+The order in which file attachments have been added to the current message.
+
+| Type |
+| -------- |
+| string[] |
+
+### fileUploads
+
+A mapping of the file attachments added to the current message.
+
+| Type |
+| ---------------------------- |
+| { [id: string]: FileUpload } |
+
+### findAndEnqueueURLsToEnrich
+
+A function responsible for initiating URL discovery and their subsequent enrichment. It is available only if link preview rendering is enabled. Link previews are disabled by default.
+
+| Type |
+| ------------------------------------------------- |
+| (text: string, mode?: SetLinkPreviewMode) => void |
+
+### focus
+
+If true, focuses the text input on component mount.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### grow
+
+If true, expands the text input vertically for new lines.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### handleChange
+
+Function that runs onChange to the underlying `textarea` component.
+
+| Type |
+| ---------------------------------------------- |
+| React.ChangeEventHandler |
+
+### handleEmojiKeyDown
+
+Opens the `EmojiPicker` component on Enter or Spacebar key down.
+
+| Type |
+| -------------------------------------------- |
+| React.KeyboardEventHandler |
+
+### handleSubmit
+
+Function that runs onSubmit to the underlying `textarea` component.
+
+| Type |
+| ---------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent, customMessageData?: Message) => void |
+
+### hideSendButton
+
+Allows to hide MessageInput's send button. Used by `MessageSimple` to hide the send button in `EditMessageForm`. Received from `MessageInputProps`.
+
+| Type | Default |
+|---------|---------|
+| boolean | false |
+
+### imageOrder
+
+The order in which image attachments have been added to the current message.
+
+| Type |
+| -------- |
+| string[] |
+
+### imageUploads
+
+A mapping of the image attachments added to the current message.
+
+| Type |
+| ----------------------------- |
+| { [id: string]: ImageUpload } |
+
+### insertText
+
+Function to insert text into the value of the underlying `textarea` component.
+
+| Type |
+| ------------------------------ |
+| (textToInsert: string) => void |
+
+### isUploadEnabled
+
+If true, file uploads are enabled in the currently active channel.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### linkPreviews
+
+A Map of `LinkPreview` objects (a union type of `LinkPreviewState` and `OGAttachment`) indexed by string representing link URL. The link URL value is provided by `OGAttachment.og_scrape_url`.
+
+| Type |
+| -------------------------- |
+| Map |
+
+### shouldSubmit
+
+Currently, `Enter` is the default submission key and `Shift`+`Enter` is the default combination for the new line.
+If specified, this function overrides the default behavior specified previously.
+
+| Type |
+| --------------------------------- |
+| (event: KeyboardEvent) => boolean |
+
+### maxFilesLeft
+
+The maximum number of allowed uploads minus the current number of uploads.
+
+| Type |
+| ------ |
+| number |
+
+### maxRows
+
+Max number of rows the underlying `textarea` component is allowed to grow.
+
+| Type | Default |
+| ------ | ------- |
+| number | 10 |
+
+### mentionAllAppUsers
+
+If true, the suggestion list will search all app users for an @mention, not just current channel members/watchers.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### mentioned_users
+
+An array of users mentioned in the current message.
+
+| Type |
+| -------------- |
+| UserResponse[] |
+
+### mentionQueryParams
+
+Object containing filters/sort/options overrides for an @mention user query.
+
+| Type |
+| ------ |
+| object |
+
+### message
+
+If provided, the existing message will be edited on submit.
+
+| Type |
+| ------ |
+| object |
+
+### noFiles
+
+If true, disables file uploads for all attachments except for those with type 'image'.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### numberOfUploads
+
+The number of file uploads on the current message.
+
+| Type |
+| ------ |
+| number |
+
+### onPaste
+
+Function that runs onPaste to the underlying `textarea` component.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.ClipboardEvent) => void |
+
+### onSelectEmoji
+
+Function that runs on select of an emoji in the `EmojiPicker` component.
+
+| Type |
+| -------------------------- |
+| (emoji: EmojiData) => void |
+
+### onSelectUser
+
+Function that runs on select of a user in the suggestion list following an @mention.
+
+| Type |
+| ---------------------------- |
+| (item: UserResponse) => void |
+
+### openCommandsList
+
+Function to manually open the list of supported slash commands.
+
+| Type |
+| ---------- |
+| () => void |
+
+### openEmojiPicker
+
+Function to open the `EmojiPicker` component.
+
+| Type |
+| ----------------------------------------- |
+| React.MouseEventHandler |
+
+### openMentionsList
+
+Function to manually open the list of potential users to mention.
+
+| Type |
+| ---------- |
+| () => void |
+
+### overrideSubmitHandler
+
+Function to override the default submit handler.
+
+| Type |
+| --------------------------------------------- |
+| (message: object, channelCid: string) => void |
+
+### parent
+
+When replying in a thread, the parent message object.
+
+| Type |
+| ------ |
+| object |
+
+### publishTypingEvent
+
+If true, triggers typing events on text input keystroke.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### removeFile
+
+Function to remove a file from the `fileUploads` mapping.
+
+| Type |
+| -------------------- |
+| (id: string) => void |
+
+### removeImage
+
+Function to remove an image from the `imageUploads` mapping.
+
+| Type |
+| -------------------- |
+| (id: string) => void |
+
+### setCooldownRemaining
+
+React state hook function that sets the `cooldownRemaining` value.
+
+| Type |
+| --------------------------------------------- |
+| React.Dispatch> |
+
+### setText
+
+Function that overrides and sets the text value of the underlying `textarea` component.
+
+| Type |
+| ---------------------- |
+| (text: string) => void |
+
+### showCommandsList
+
+If true, show the list of supported slash commands above the text input.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### showMentionsList
+
+If true, show the list of potential users to mention above the text input.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### text
+
+The current input value of the underlying `textarea` component.
+
+| Type |
+| ------ |
+| string |
+
+### textareaRef
+
+React mutable ref placed on the underlying `textarea` component.
+
+| Type |
+| -------------------------------------------- |
+| React.MutableRefObject |
+
+### uploadFile
+
+Function to upload a file to the `fileUploads` mapping.
+
+| Type |
+| -------------------- |
+| (id: string) => void |
+
+### uploadImage
+
+Function to upload an image.
+
+| Type |
+| -------------------- |
+| (id: string) => void |
+
+### uploadNewFiles
+
+Function to upload an array of files to the `fileUploads` and `imageUploads` mappings.
+
+| Type |
+| ----------------------------------- |
+| (files: FileList \| File[]) => void |
+
+### useMentionsTransliteration
+
+If true, will use an optional dependency to support transliteration in the input for mentions. See: https://github.com/sindresorhus/transliterate
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-list-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-list-context.mdx
new file mode 100644
index 0000000000..77b7fcbfb0
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/message-list-context.mdx
@@ -0,0 +1,52 @@
+---
+id: message_list_context
+title: MessageListContext
+---
+
+The context value is provided by `MessageListContextProvider` which wraps the contents rendered by [`MessageList`](../core-components/message-list.mdx). It exposes API that the default and custom components rendered by `MessageList` can take advantage of. The components that can consume the context are:
+
+- `EmptyStateIndicator` - rendered when there are no messages in the channel. The [`component can be customized`](./component-context.mdx#emptystateindicator).
+- `LoadingIndicator` - rendered while loading more messages to the channel. The [`component can be customized`](./component-context.mdx#loadingindicator).
+- `MessageListNotifications` - component rendering application notifications. The [`component can be customized`](./component-context.mdx#messagelistnotifications).
+- `MessageNotification` - component used to display a single notification message in `MessageListNotifications`. The [`component can be customized`](./component-context.mdx#messagenotification).
+- `TypingIndicator` - component indicating that another user is typing a message in a given channel. The [`component can be customized`](./component-context.mdx#typingindicator).
+- `Message` and its children - component to render a message. The [`component can be customized`](./component-context.mdx#message).
+- `DateSeparator` - component rendered to separate messages posted on different dates. The [`component can be customized`](./component-context.mdx#dateseparator).
+- `MessageSystem` - component to display system messages in the message list. The [`component can be customized`](./component-context.mdx#messagesystem).
+- `HeaderComponent` - component to be displayed before the oldest message in the message list. The [`component can be customized`](./component-context.mdx#headercomponent).
+- `UnreadMessagesNotification` - custom UI component that indicates a user is viewing unread messages. It disappears once the user scrolls to `UnreadMessagesSeparator`. The [`component can be customized`](./component-context.mdx#unreadmessagesnotification).
+- `UnreadMessagesSeparator` - component to be displayed before the oldest message in the message list. The [`component can be customized`](./component-context.mdx#unreadmessagesseparator).
+
+## Basic Usage
+
+Pull the value from context with our custom hook:
+
+```jsx
+import { useMessageListContext } from 'stream-chat-react';
+
+export const CustomComponent = () => {
+ const { listElement, scrollToBottom } = useMessageListContext();
+ // component logic ...
+ return(
+ {/* rendered elements */}
+ );
+}
+```
+
+## Value
+
+### listElement
+
+The scroll container within which the messages and typing indicator are rendered. You may want to perform scroll-to-bottom operations based on the `listElement`'s scroll state.
+
+| Type |
+|--------------------------|
+| `HTMLDivElement \| null` |
+
+### scrollToBottom
+
+Function that scrolls the `listElement` to the bottom.
+
+| Type |
+|--------------|
+| `() => void` |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/translation-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/translation-context.mdx
new file mode 100644
index 0000000000..2581f1f6bd
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/translation-context.mdx
@@ -0,0 +1,45 @@
+---
+id: translation_context
+title: TranslationContext
+---
+
+The component library uses the [`i18next`](https://www.npmjs.com/package/i18next) dependency to create a `Streami18n`
+class constructor that handles language translation. The `TranslationContext` stores the resulting values and allows
+children of the `Chat` component to auto translate library text based on the connected user's set languages.
+You can access the context values by calling the `useTranslationContext` custom hook.
+
+## Basic Usage
+
+Pull values from context with our custom hook:
+
+```jsx
+const { t } = useTranslationContext();
+
+
{t('This message will be translated.')}
;
+```
+
+## Values
+
+### t
+
+Function that translates text into the connected user's set language.
+
+| Type |
+| -------- |
+| function |
+
+### tDateTimeParser
+
+Function that parses date times.
+
+| Type | Default |
+| -------- | ------- |
+| function | Day.js |
+
+### userLanguage
+
+Value to set the connected user's language (ex: 'en', 'fr', 'ru', etc), which auto translates text fields in the library.
+
+| Type | Default |
+| ------ | ------- |
+| string | 'en' |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/typing-context.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/typing-context.mdx
new file mode 100644
index 0000000000..5770fbc0d6
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/contexts/typing-context.mdx
@@ -0,0 +1,25 @@
+---
+id: typing_context
+title: TypingContext
+---
+
+The `TypingContext` is established by the `Channel` component and exposes the `useTypingContext` hook. The stored value is an
+object of users currently typing in a single channel, with key as the user ID and value as the user details object.
+
+## Basic Usage
+
+Pull the value from context with our custom hook:
+
+```jsx
+const { typing } = useTypingContext();
+```
+
+## Value
+
+### typing
+
+The users currently typing in a single channel, with key as the user ID and value as the user details object.
+
+| Type |
+| ------ |
+| object |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/channel-list.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/channel-list.mdx
new file mode 100644
index 0000000000..7c58fa1a7c
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/channel-list.mdx
@@ -0,0 +1,544 @@
+---
+id: channel_list
+title: ChannelList
+---
+
+import CodeBlock from '@theme/CodeBlock';
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+The `ChannelList` component queries an array of `channel` objects from the Stream Chat API and displays as a customizable list
+in the UI. It accepts props for [`filters`](#filters), [`sort`](#sort) and [`options`](#options), which allows you to tailor
+your request to the [Query Channels](https://getstream.io/chat/docs/javascript/query_channels/?language=javascript) API. The
+response array from this API is then rendered in a list and loaded into the DOM.
+
+```jsx
+const channels = await client.queryChannels(filters, sort, options);
+```
+
+The `ChannelList` component also comes pre-built with navigation functionality. The click of a list item sets the active
+`channel` object and loads the [`Channel`](./channel.mdx) component.
+
+## Basic Usage
+
+The `ChannelList` does not have any required props, but in order to refine channel query results we recommend providing
+values for [`filters`](#filters), [`sort`](#sort) and [`options`](#options).
+
+:::caution
+By default when channels query does not have any filter it will match all the channels in your application. While this might be convenient during the development, you most likely want to have at least some basic filtering.
+
+**At a minimum, the filter should include `{members: { $in: [userID] }}` .**
+:::
+
+```jsx
+const filters = { members: { $in: [ 'jimmy', 'buffet' ] } }
+const sort = { last_message_at: -1 };
+const options = { limit: 10 }
+
+
+
+
+
+
+
+
+```
+
+## UI Customization
+
+`ChannelList` UI is determined by two of its props, `List` and `Preview`. The `List` prop allows you to customize the container
+in which the array of channels is rendered. The `Preview` prop dictates the design and click functionality of an individual
+channel in the list. If not provided via props, these UI components default to
+[`ChannelListMessenger`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelListMessenger.tsx)
+and [`ChannelPreviewMessenger`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelPreview/ChannelPreviewMessenger.tsx).
+
+To customize the container and list item UI for your `ChannelList`, provide custom component overrides. Your custom components
+will receive the same props as the defaults.
+
+```jsx
+const CustomListContainer = (props) => {
+ // render custom list container here
+};
+
+const CustomListItem = (props) => {
+ // render custom list item here
+};
+
+
+
+
+
+
+
+;
+```
+
+In cases where the customizations provided by `Preview` are not enough, e.g. grouping channels under sections based on some
+dynamic channel data, the `renderChannels` may be a good fit as all loaded channels are passed as an argument to the function.
+
+```jsx
+const renderChannels = (loadedChannels, ChannelPreview) => {
+ const groups = groupBy(loadedChannels, 'some_custom_channel_data');
+ return renderGroups(groups); // inside renderGroups you have have headings, etc...
+}
+
+
+
+
+
+
+
+;
+```
+
+## Event Listeners
+
+In order to handle the requisite, dynamic nature of the `ChannelList`, a variety of
+[event listeners](https://getstream.io/chat/docs/javascript/event_listening/?language=javascript) are added on component mount.
+Many of these event listeners accept custom handler functions, allowing you to override the library's default event response behavior.
+
+Each custom handler accepts the same function arguments. Through a combination of pulling updated data off the event object and
+re-setting the list state, you can customize behavior and UI.
+
+- `setChannels` - state setter for the `channels` value which populates the list in the DOM
+- `event` - event object returned from each corresponding event listener
+
+| [Event Type](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) | Default Behavior | Custom Handler |
+| ----------------------------------------------------------------------------------------- | ------------------------------------------------ | --------------------------------------------- |
+| `channel.deleted` | Removes channel from list | [onChannelDeleted](#onchanneldeleted) |
+| `channel.hidden` | Removes channel from list | [onChannelHidden](#onchannelhidden) |
+| `channel.truncated` | Updates the channel | [onChannelTruncated](#onchanneltruncated) |
+| `channel.updated` | Updates the channel | [onChannelUpdated](#onchannelupdated) |
+| `channel.visible` | Adds channel to list | [onChannelVisible](#onchannelvisible) |
+| `connection.recovered` | Forces a component render | N/A |
+| `message.new` | Moves channel to top of list | [onMessageNewHandler](#onmessagenewhandler) |
+| `notification.added_to_channel` | Moves channel to top of list and starts watching | [onAddedToChannel](#onaddedtochannel) |
+| `notification.message_new` | Moves channel to top of list and starts watching | [onMessageNew](#onmessagenew) |
+| `notification.removed_from_channel` | Removes channel from list | [onRemovedFromChannel](#onremovedfromchannel) |
+| `user.presence.changed` | Updates the channel | N/A |
+
+## Customizing Event Handlers
+
+The event type the `ChannelList` reacts to and its corresponding behavior can be overridden using the appropriate prop. Let's look at an example of customizing the ChannelList component to only display [frozen channels](https://getstream.io/chat/docs/javascript/freezing_channels/).
+
+```tsx
+const filters = {
+ members: { $in: ['dan'] },
+ frozen: true
+}
+
+
+```
+
+The `notification.message_new` event occurs when a message is received on a channel that is not loaded but the current user is a member of.
+The default behavior when this event occurs is to query the channel the message is received on, then add the channel to the top of the list, irrespective of `filters`.
+Thus, if a new message appears in an unfrozen channel of which the current user is a member, it will be added to the list. This may not be the desired behavior since the list is only supposed to show frozen channels.
+
+In this case, you can replace the default functionality by providing a custom `onMessageNew` function as a prop to the `ChannelList` component.
+`onMessageNew` receives two parameters when called, `setChannels`, a setter function for the internal `channels` state, and `event`, the `Event` object received for the `notification.message_new` event.
+These parameters can be used to create a function that achieves the desired custom behavior.
+
+```tsx
+const filters = {
+ members: { $in: ['dan'] },
+ frozen: true,
+};
+
+const customOnMessageNew = async (setChannels, event) => {
+ const eventChannel = event.channel;
+
+ // If the channel isn't frozen, then don't add it to the list.
+ if (!eventChannel?.id || !eventChannel.frozen) return;
+
+ try {
+ const newChannel = client.channel(eventChannel.type, eventChannel.id);
+ await newChannel.watch();
+ setChannels((channels) => [newChannel, ...channels]);
+ } catch (error) {
+ console.log(error);
+ }
+};
+
+;
+```
+
+Similarly, events other than `notification.message_new` can be handled as per application requirements.
+
+## Props
+
+### additionalChannelSearchProps
+
+Additional props to be passed to the underlying [`ChannelSearch`](../utility-components/channel-search.mdx) component.
+
+| Type |
+| ------ |
+| object |
+
+### allowNewMessagesFromUnfilteredChannels
+
+When the client receives `message.new`, `notification.message_new`, and `notification.added_to_channel` events, we automatically push
+that channel to the top of the list. If the channel doesn't currently exist in the list, we grab the channel from `client.activeChannels`
+and push it to the top of the list. You can disable this behavior by setting this prop to false, which will prevent channels not in the
+list from incrementing the list.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### Avatar
+
+Custom UI component to display the user's avatar.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------- |
+| component | |
+
+### channelRenderFilterFn
+
+Optional function to filter channels prior to loading in the DOM. Do not use any complex or async logic that would delay the
+loading of the `ChannelList`. We recommend using a pure function with array methods like filter/sort/reduce.
+
+| Type |
+| ---------------------------------- |
+| (channels: Channel[]) => Channel[] |
+
+### ChannelSearch
+
+Custom UI component to display search results.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------- |
+| component | |
+
+### customActiveChannel
+
+Set a channel (with this ID) to active and force it to move to the top of the list.
+
+| Type |
+| ------ |
+| string |
+
+### customQueryChannels
+
+Custom function that handles the channel pagination.
+
+Takes parameters:
+
+| Parameter | Description |
+|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `currentChannels` | The state of loaded `Channel` objects queried thus far. Has to be set with `setChannels` (see below). |
+| `queryType` | A string indicating, whether the channels state has to be reset to the first page ('reload') or newly queried channels should be appended to the `currentChannels`. |
+| `setChannels` | Function that allows us to set the channels state reflected in `currentChannels`. |
+| `setHasNextPage` | Flag indicating whether there are more items to be loaded from the API. Should be infered from the comparison of the query result length and the query options limit. |
+
+The function has to:
+1. build / provide own query filters, sort and options parameters
+2. query and append channels to the current channels state
+3. update the `hasNext` pagination flag after each query with `setChannels` function
+
+An example below implements a custom query function that uses different filters sequentially once a preceding filter is exhausted:
+
+```ts
+import uniqBy from "lodash.uniqby";
+import throttle from 'lodash.throttle';
+import {useCallback, useRef} from 'react';
+import {ChannelFilters, ChannelOptions, ChannelSort, StreamChat} from 'stream-chat';
+import {
+ CustomQueryChannelParams,
+ useChatContext,
+} from 'stream-chat-react';
+
+const DEFAULT_PAGE_SIZE = 30 as const;
+
+export const useCustomQueryChannels = () => {
+ const { client } = useChatContext();
+ const filters1: ChannelFilters = {
+ member_count: { $gt: 10 },
+ members: { $in: [client.user?.id || ''] },
+ type: 'messaging',
+ };
+ const filters2: ChannelFilters = { members: { $in: [client.user?.id || ''] }, type: 'messaging' };
+ const options: ChannelOptions = { limit: 10, presence: true, state: true };
+ const sort: ChannelSort = { last_message_at: -1, updated_at: -1 };
+
+ const filtersArray = [filters1, filters2];
+ const appliedFilterIndex = useRef(0);
+
+ const customQueryChannels = useCallback(
+ throttle(
+ async ({
+ currentChannels,
+ queryType,
+ setChannels,
+ setHasNextPage,
+ }: CustomQueryChannelParams) => {
+ const offset = queryType === 'reload' ? 0 : currentChannels.length;
+
+ const newOptions = {
+ limit: options.limit ?? DEFAULT_PAGE_SIZE,
+ offset,
+ ...options,
+ };
+
+ const filters = filtersArray[appliedFilterIndex.current];
+ const channelQueryResponse = await client.queryChannels(filters, sort || {}, newOptions);
+
+ const newChannels =
+ queryType === 'reload'
+ ? channelQueryResponse
+ : uniqBy([...currentChannels, ...channelQueryResponse], 'cid');
+
+ setChannels(newChannels);
+
+ const lastPageForCurrentFilter = channelQueryResponse.length < newOptions.limit;
+ const isLastPageForAllFilters =
+ lastPageForCurrentFilter && appliedFilterIndex.current === filtersArray.length - 1;
+
+ setHasNextPage(!isLastPageForAllFilters);
+ if (lastPageForCurrentFilter) {
+ appliedFilterIndex.current += 1;
+ }
+ },
+ 500,
+ { leading: true, trailing: false },
+ ),
+ [client, filtersArray],
+ );
+
+ return customQueryChannels;
+};
+```
+
+It is recommended to control for duplicate requests by throttling the custom function calls.
+
+| Type |
+|---------------------------------------------------------------------------------------------------|
+| |
+
+### EmptyStateIndicator
+
+Custom UI component for rendering an empty list.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------- |
+| component | |
+
+### filters
+
+An object containing channel query filters, check our [query parameters docs](https://getstream.io/chat/docs/javascript/query_channels/?language=javascript#query-parameters)
+for more information.
+
+| Type |
+| ------ |
+| object |
+
+### List
+
+Custom UI component to display the container for the queried channels.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------- |
+| component | |
+
+### LoadingErrorIndicator
+
+Custom UI component to display the loading error indicator.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------- |
+| component | |
+
+### LoadingIndicator
+
+Custom UI component to display the loading state.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------- |
+| component | |
+
+### lockChannelOrder
+
+When true, channels won't dynamically sort by most recent message.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### onAddedToChannel
+
+Function to override the default behavior when a user is added to a channel.
+
+| Type |
+| -------- |
+| function |
+
+### onChannelDeleted
+
+Function to override the default behavior when a channel is deleted.
+
+| Type |
+| -------- |
+| function |
+
+### onChannelHidden
+
+Function to override the default behavior when a channel is hidden.
+
+| Type |
+| -------- |
+| function |
+
+### onChannelTruncated
+
+Function to override the default behavior when a channel is truncated.
+
+| Type |
+| -------- |
+| function |
+
+### onChannelUpdated
+
+Function to override the default behavior when a channel is updated.
+
+| Type |
+| -------- |
+| function |
+
+### onChannelVisible
+
+Function to override the default channel visible behavior.
+
+| Type |
+| -------- |
+| function |
+
+### onMessageNew
+
+Function to override the default behavior when a message is received on a channel not being watched.
+
+| Type |
+| -------- |
+| function |
+
+### onMessageNewHandler
+
+Function to override the default behavior when a message is received on a channel being watched. Handles `message.new` event.
+
+| Type |
+|-------------------------------------------------------------------------------------------------------------------------------------|
+| `(setChannels: React.Dispatch>>>, event: Event) => void` |
+
+### onRemovedFromChannel
+
+Function to override the default behavior when a user gets removed from a channel.
+
+| Type |
+| -------- |
+| function |
+
+### options
+
+An object containing channel query options, check our [query parameters docs](https://getstream.io/chat/docs/javascript/query_channels/?language=javascript#query-parameters)
+for more information.
+
+| Type |
+| ------ |
+| object |
+
+### Paginator
+
+Custom UI component to handle channel pagination logic.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------- |
+| component | |
+
+### Preview
+
+Custom UI component to display the channel preview in the list.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------------------------- |
+| component | |
+
+### recoveryThrottleIntervalMs
+
+Custom interval during which the recovery channel list queries will be prevented. This is to avoid firing unnecessary queries during internet connection fluctuation. Recovery channel query is triggered upon internet connection recovery and leads to complete channel list reload with pagination offset 0. The minimum throttle interval is 2000ms. The default throttle interval is 5000ms.
+
+The channel list recovery mechanism described here (applying `recoveryThrottleIntervalMs`) **is activated only if the `StreamChat` client's channel list recovery mechanism is disabled**. The `StreamChat` recovery mechanism can be disabled when initiating the client instance through the `options` parameter:
+
+```typescript jsx
+import { StreamChat } from 'stream-chat';
+import { ChannelList, Chat } from 'stream-chat-react';
+
+// ... get apiKey, filters, sort, options
+
+const client = new StreamChat(apiKey, {recoverStateOnReconnect: false});
+const App = () => (
+
+ {/** ... */}
+
+ {/** ... */}
+
+);
+
+```
+
+| Type | Default |
+|--------|---------|
+| number | 5000 |
+
+### renderChannels
+
+Function to override the default behavior when rendering channels, so this function is called instead of rendering the Preview directly.
+
+| Type |
+| -------- |
+| function |
+
+### sendChannelsToList
+
+If true, sends the list's currently loaded channels to the `List` component as the `loadedChannels` prop.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### setActiveChannelOnMount
+
+If true, sets the most recent channel received from the query as active on component mount. If set to `false` no channel is set as active on mount.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### showChannelSearch
+
+If true, renders the [`ChannelSearch`](./#channelsearch) component above the [`List`](./#list) component.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### sort
+
+An object containing channel query sort parameters. Check our [query parameters docs](https://getstream.io/chat/docs/javascript/query_channels/?language=javascript#query-parameters)
+for more information.
+
+| Type |
+| ------ |
+| object |
+
+### watchers
+
+An object containing query parameters for fetching channel watchers.
+
+| Type |
+| ------------------------------------- |
+| `{ limit?: number; offset?: number }` |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/channel.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/channel.mdx
new file mode 100644
index 0000000000..b975f86e63
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/channel.mdx
@@ -0,0 +1,762 @@
+---
+id: channel
+title: Channel
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+The `Channel` component is a React Context provider that wraps all the logic, functionality, and UI for an individual chat channel.
+It provides four separate contexts to its children:
+
+- [`ChannelStateContext`](../contexts/channel-state-context.mdx) - stateful data (ex: `messages` or `members`)
+- [`ChannelActionContext`](../contexts/channel-action-context.mdx) - action handlers (ex: `sendMessage` or `openThread`)
+- [`ComponentContext`](../contexts/component-context.mdx) - custom component UI overrides (ex: `Avatar` or `Message`)
+- [`TypingContext`](../contexts/typing-context.mdx) - object of currently typing users (i.e., `typing`)
+
+:::note
+The `Channel` component renders an individual `channel` object. For detailed information regarding `channel` objects and their
+functionality, check out the [JavaScript docs](https://getstream.io/chat/docs/javascript/creating_channels/) on our website.
+:::
+
+## Basic Usage
+
+The `Channel` component does not inject any UI, so its implementation is fairly simple and can be handled in one of two ways, both
+with and without a `ChannelList` component. If you are using a `ChannelList`, do not add a `channel` object as a prop on `Channel`.
+However, in the absence of a `ChannelList`, the `channel` prop is required. By default, the `ChannelList` sets the active `channel`
+object, which is then injected it into the `ChannelStateContext`, so manual prop passing is not required.
+
+**Example 1** - without `ChannelList`
+
+```jsx
+
+
+
+
+
+
+```
+
+**Example 2** - with `ChannelList`
+
+```jsx
+
+
+
+
+
+
+
+```
+
+Any child of the `Channel` component has access to the contexts referenced above. Each context can be accessed with
+one of our custom hooks, which must be imported individually.
+
+```jsx
+const { messages } = useChannelStateContext();
+const { sendMessage } = useChannelActionContext();
+const { Avatar } = useComponentContext();
+const { typing } = useTypingContext();
+```
+
+## Registering custom components
+
+In case you would like to customize parts of your chat application, you can do that by passing custom components to `Channel` component props. All the title-cased props are reserved for the custom components overriding the SDK defaults. The list of all customizable components - the component context - can be found in the [`ComponentContext` documentation](../contexts/component-context.mdx).
+
+**Example of registering custom Avatar component**
+
+```jsx
+import { Channel, ChannelList, Chat, MessageInput, MessageList } from 'stream-chat-react';
+import { CustomTooltip } from '../Tooltip/CustomTooltip';
+
+const Avatar = ({ image, title }) => {
+ return (
+ <>
+ {title}
+
+
+
+ >
+ );
+};
+
+export const App = (
+
+
+
+
+
+
+
+);
+```
+
+## Props
+
+### channel
+
+The currently active `StreamChat` `channel` instance to be loaded into the `Channel` component and referenced by its children.
+
+```jsx
+const channel = client.channel('messaging', {
+ members: ['nate', 'roy'],
+});
+```
+
+:::caution
+Do not provide this prop if you are using the `ChannelList` component, as it handles `channel` setting logic.
+:::
+
+| Type |
+| ------ |
+| object |
+
+### acceptedFiles
+
+A list of accepted file upload types.
+
+| Type |
+| -------- |
+| string[] |
+
+### activeUnreadHandler
+
+Custom handler function that runs when the active channel has unread messages and the app is running on a separate browser tab.
+
+| Type |
+| ----------------------------------------------- |
+| (unread: number, documentTitle: string) => void |
+
+### Attachment
+
+Custom UI component to display a message attachment.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------- |
+| component | |
+
+### AttachmentPreviewList
+
+Custom UI component to display an attachment previews in `MessageInput`.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------------------- |
+| component | |
+
+### AutocompleteSuggestionHeader
+
+Custom UI component to override the default suggestion header component.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------ |
+| component | |
+
+### AutocompleteSuggestionItem
+
+Custom UI component to override the default suggestion Item component.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------- |
+| component | |
+
+### AutocompleteSuggestionList
+
+Custom UI component to override the default List component that displays suggestions.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------- |
+| component | |
+
+### Avatar
+
+Custom UI component to display a user's avatar.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------- |
+| component | |
+
+### channelQueryOptions
+
+Optional configuration parameters used for the initial channel query. Applied only if the value of `channel.initialized` is false. If the channel instance has already been initialized (channel has been queried), then the channel query will be skipped and channelQueryOptions will not be applied.
+
+In the example below, we specify, that the first page of messages when a channel is queried should have 20 messages (the default is 100). Note that the `channel` prop has to be passed along `channelQueryOptions`.
+
+```tsx
+import { ChannelQueryOptions } from 'stream-chat';
+import { Channel, useChatContext } from 'stream-chat-react';
+
+const channelQueryOptions: ChannelQueryOptions = {
+ messages: { limit: 20 },
+};
+
+type ChannelRendererProps = {
+ id: string;
+ type: string;
+};
+
+const ChannelRenderer = ({ id, type }: ChannelRendererProps) => {
+ const { client } = useChatContext();
+ return (
+
+ {/* Channel children */}
+
+ );
+};
+```
+
+| Type |
+| --------------------- |
+| `ChannelQueryOptions` |
+
+### CooldownTimer
+
+Custom UI component to display the slow mode cooldown timer.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------ |
+| component | |
+
+### DateSeparator
+
+Custom UI component for date separators.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------- |
+| component | |
+
+### doDeleteMessageRequest
+
+Custom action handler to override the default `client.deleteMessage(message.id)` function.
+
+| Type |
+| ---------------------------------------------------------------------------------------------- |
+| `(message: StreamMessage) => Promise>` |
+
+The function can execute different logic for message replies compared to messages in the main message list based on the `parent_id` property of `StreamMessage` object:
+
+```tsx
+import { Channel, StreamMessage } from 'stream-chat-react';
+import type { MyStreamChatGenerics } from './types';
+
+const doDeleteMessageRequest = async (message: StreamMessage) => {
+ if (message.parent_id) {
+ // do something before / after deleting a message reply
+ } else {
+ // do something before / after deleting a message
+ }
+}
+
+const App = () => (
+ {/* more components */}
+
+ {/* more components */}
+
+ {/* more components */}
+);
+```
+
+### doMarkReadRequest
+
+Custom action handler to override the default `channel.markRead` request function (advanced usage only). The function takes two arguments:
+
+| Argument | Type | Description |
+| ------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------- |
+| `channel` | `Channel` | The current channel object instance |
+| `setChannelUnreadUiState` | `(state: ChannelUnreadUiState) => void` | Function that allows us to set the unread state for the components reflecting the unread message state. |
+
+| Type |
+| -------- |
+| function |
+
+### doSendMessageRequest
+
+Custom action handler to override the default `channel.sendMessage` request function (advanced usage only).
+
+| Type |
+| -------- |
+| function |
+
+### doUpdateMessageRequest
+
+Custom action handler to override the default `client.updateMessage` request function (advanced usage only).
+
+| Type |
+| -------- |
+| function |
+
+### dragAndDropWindow
+
+If true, chat users will be able to drag and drop file uploads to the entire channel window.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### EditMessageInput
+
+Custom UI component to override default edit message input.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------- |
+| component | |
+
+### emojiSearchIndex
+
+Custom search mechanism instance or object to enable emoji autocomplete.
+
+| Type | Default |
+| ------ | --------- |
+| object | undefined |
+
+### EmojiPicker
+
+Custom UI component to be rendered in the `MessageInput` component, see [Emoji Picker guide](../../guides/customization/emoji-picker.mdx) for more information.
+
+| Type | Default |
+| --------- | --------- |
+| component | undefined |
+
+### EmptyPlaceholder
+
+Custom UI component to be shown if no active `channel` is set, defaults to `null` and skips rendering the `Channel` component.
+
+| Type | Default |
+| --------- | ------- |
+| component | null |
+
+### EmptyStateIndicator
+
+Custom UI component to be displayed when the `MessageList` or `VirtualizedMessageList` is empty.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------- |
+| component | |
+
+### enrichURLForPreview
+
+A global flag to toggle the URL enrichment and link previews in `MessageInput`. The feature is disabled by default. It can be overridden on `Thread` and `MessageList` level through `additionalMessageInputProps`
+or directly on `MessageInput` level through `urlEnrichmentConfig` prop. See the guide [Link Previews in Message Input](../../../guides/customization/link-previews) for more.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### enrichURLForPreviewConfig
+
+Global configuration for link preview generation in all the MessageInput components. See the guide [Link Previews in Message Input](../../../guides/customization/link-previews) for more.
+
+| Type |
+| ------------------------------------------------- |
+| Omit |
+
+### FileUploadIcon
+
+Custom UI component for file upload icon.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| component | |
+
+### GiphyPreviewMessage
+
+Custom UI component to render a Giphy preview in the `VirtualizedMessageList`.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------------- |
+| component | |
+
+### giphyVersion
+
+The Giphy version to render - check the keys of the [Image Object](https://developers.giphy.com/docs/api/schema#image-object) for possible values.
+
+| Type | Default |
+| ------ | -------------- |
+| string | 'fixed_height' |
+
+### HeaderComponent
+
+Custom UI component to render at the top of the `MessageList`.
+
+| Type | Default |
+| --------- | ------- |
+| component | none |
+
+### imageAttachmentSizeHandler
+
+A custom function to provide size configuration for image attachments
+
+| Type |
+| ----------------------------------------------------------------- |
+| `(a: Attachment, e: HTMLElement) => ImageAttachmentConfiguration` |
+
+### initializeOnMount
+
+Allows to prevent triggering the `channel.watch()` (triggers channel query HTTP request) call when mounting the `Channel` component (the default behavior) with uninitialized (`channel.initialized`) `Channel` instance. That means that no channel data from the back-end will be received neither channel WS events will be delivered to the client. Preventing to initialize the channel on mount allows us to postpone the channel creation in the Stream's DB to a later point in time, for example, when a first message is sent:
+
+```typescript jsx
+import { useCallback } from 'react';
+import {
+ getChannel,
+ MessageInput as StreamMessageInput,
+ MessageInputProps,
+ MessageToSend,
+ useChannelActionContext,
+ useChatContext,
+} from 'stream-chat-react';
+import { Message, SendMessageOptions } from 'stream-chat';
+
+import { useChannelInitContext } from '../../context/ChannelInitProvider';
+import type { MyStreamChatGenerics } from '../../types';
+
+export const MessageInput = (props: MessageInputProps) => {
+ const { client } = useChatContext();
+ const { sendMessage } = useChannelActionContext();
+ const { setInitializedChannelOnMount } = useChannelInitContext();
+
+ const submitHandler: MessageInputProps['overrideSubmitHandler'] = useCallback(
+ async (
+ message: MessageToSend,
+ channelCid: string,
+ customMessageData?: Partial>,
+ options?: SendMessageOptions,
+ ) => {
+ const [channelType, channelId] = channelCid.split(':');
+ const channel = client.channel(channelType, channelId);
+ if (!channel.initialized) {
+ await getChannel({ channel, client });
+ setInitializedChannelOnMount(true);
+ }
+
+ await sendMessage(message, customMessageData, options);
+ },
+ [client, sendMessage, setInitializedChannelOnMount],
+ );
+
+ return ;
+};
+```
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### markReadOnMount
+
+Configuration parameter to mark the active channel as read when mounted (opened). By default, the channel is marked read on mount.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### Input
+
+Custom UI component handling how the message input is rendered.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------ |
+| component | |
+
+### LinkPreviewList
+
+Custom component to render link previews in `MessageInput`.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------- |
+| component | |
+
+### LoadingErrorIndicator
+
+Custom UI component to be shown if the channel query fails.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------------- |
+| component | |
+
+### LoadingIndicator
+
+Custom UI component to render while the `MessageList` is loading new messages.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------- |
+| component | |
+
+### maxNumberOfFiles
+
+The maximum number of attachments allowed per message, defaults to the Stream Chat API maximum.
+
+| Type | Default |
+| ------ | ------- |
+| number | 10 |
+
+### Message
+
+Custom UI component to display a message in the standard `MessageList`.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### MessageDeleted
+
+Custom UI component for a deleted message.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------- |
+| component | |
+
+### MessageListNotifications
+
+Custom UI component that displays message and connection status notifications in the `MessageList`.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------------------------------- |
+| component | |
+
+### MessageNotification
+
+Custom UI component to display a notification when scrolled up the list and new messages arrive.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------------- |
+| component | |
+
+### MessageOptions
+
+Custom UI component for message options popup.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------- |
+| component | |
+
+### MessageRepliesCountButton
+
+Custom UI component to display message replies.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------- |
+| component | |
+
+### MessageStatus
+
+Custom UI component to display message delivery status.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### MessageSystem
+
+Custom UI component to display system messages.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------- |
+| component | |
+
+### MessageTimestamp
+
+Custom UI component to display a timestamp on a message. This does not include a timestamp for edited messages.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------- |
+| component | |
+
+See also [`Timestamp`](#timestamp).
+
+### MessageBouncePrompt
+
+Custom UI component for the content of the modal dialog for messages that got bounced by the moderation rules.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------- |
+| component | |
+
+### ModalGallery
+
+Custom UI component for viewing message's image attachments.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| component | |
+
+### multipleUploads
+
+Whether to allow multiple attachment uploads on a message.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### onMentionsClick
+
+Custom action handler function to run on click of an @mention in a message.
+
+| Type |
+| -------- |
+| function |
+
+### onMentionsHover
+
+Custom action handler function to run on hover of an @mention in a message.
+
+| Type |
+| -------- |
+| function |
+
+### optionalMessageInputProps
+
+If `dragAndDropWindow` prop is true, the props to pass to the MessageInput component (overrides props placed directly on MessageInput).
+
+| Type |
+| ------ |
+| object |
+
+### PinIndicator
+
+Custom UI component to override default pinned message indicator.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------- |
+| component | |
+
+### QuotedMessage
+
+Custom UI component to override quoted message UI on a sent message.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### QuotedMessagePreview
+
+Custom UI component to override the message input's quoted message preview.
+
+| Type | Default |
+| --------- | -------------------------------------------------------------------------------------------- |
+| component | |
+
+### ReactionSelector
+
+Custom UI component to display the reaction selector.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------------- |
+| component | |
+
+### ReactionsList
+
+Custom UI component to display the list of reactions on a message.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------- |
+| component | |
+
+### SendButton
+
+Custom UI component for send button.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------- |
+| component | |
+
+### shouldGenerateVideoThumbnail
+
+You can turn on/off thumbnail generation for video attachments
+
+| Type |
+| ------- |
+| boolean |
+
+### skipMessageDataMemoization
+
+If true, skips the message data string comparison used to memoize the current channel messages (helpful for channels with 1000s of messages).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### ThreadHead
+
+Custom UI component to be displayed at the beginning of a thread. By default, it is the thread parent message. It is composed of [Message](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/Message.tsx) context provider component and [ThreadStart](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Thread/ThreadStart.tsx) component. The latter can be customized by passing custom component to `Channel` props. The `ThreadHead` component defaults to and accepts the same props as [MessageSimple](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx).
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------ |
+| component | |
+
+### ThreadHeader
+
+Custom UI component to display the header of a `Thread`.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| component | |
+
+### ThreadInput
+
+Custom UI component to replace the `MessageInput` of a `Thread`. For the applications using [theme version 1](../../guides/theming/css-and-theming.mdx), the default is `MessageInputSmall`. Applications using [theme version 2](../../theming/introduction.mdx) will use `MessageInputFlat` by default.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| component | / |
+
+### ThreadStart
+
+Custom UI component to display the start of a threaded `MessageList`.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------- |
+| component | |
+
+### Timestamp
+
+Custom UI component to display a date used in timestamps. It's used internally by the default `MessageTimestamp`, and to display a timestamp for edited messages.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------- |
+| component | |
+
+### TriggerProvider
+
+Optional context provider that lets you override the default autocomplete triggers.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------ |
+| component | |
+
+### TypingIndicator
+
+Custom UI component for the typing indicator.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------- |
+| component | |
+
+### UnreadMessagesNotification
+
+Custom UI component that indicates a user is viewing unread messages. It disappears once the user scrolls to `UnreadMessagesSeparator`.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------------- |
+| component | |
+
+### UnreadMessagesSeparator
+
+Custom UI component inserted before the first message marked unread.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------- |
+| component | |
+
+### videoAttachmentSizeHandler
+
+A custom function to provide size configuration for video attachments
+
+| Type |
+| ----------------------------------------------------------------- |
+| `(a: Attachment, e: HTMLElement) => VideoAttachmentConfiguration` |
+
+### VirtualMessage
+
+Custom UI component to display a message in the `VirtualizedMessageList`.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/chat.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/chat.mdx
new file mode 100644
index 0000000000..d1758fac6c
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/chat.mdx
@@ -0,0 +1,131 @@
+---
+id: chat
+title: Chat
+---
+
+The `Chat` component is a React Context provider that wraps the entire Stream Chat application. It provides the [`ChatContext`](../contexts/chat-context.mdx)
+to its children, which includes the `StreamChat` client instance. All other components within the library must be nested as children
+of `Chat` to maintain proper functionality.
+
+## Basic Usage
+
+The `Chat` component does not inject any UI, so its implementation is fairly simple. Once an instance of the `StreamChat` client
+has been created, you pass the client object as a prop to add it to the `ChatContext`.
+
+```jsx
+
+
+
+
+
+
+```
+
+Any child of the `Chat` component has access to the `ChatContext`. Each React Context in the component library can be accessed with
+one of our custom hooks, which must be imported individually. The `ChatContext` values are accessed with `useChatContext` hook.
+
+```jsx
+const { client } = useChatContext();
+```
+
+## Props
+
+###
Required
client
+
+The `StreamChat` client instance. Any methods from the `stream-chat-js` API interface can be run off this object.
+
+```jsx
+const channel = client.channel('messaging', {
+ members: ['nate', 'roy'],
+});
+```
+
+| Type |
+| ------ |
+| object |
+
+### customClasses
+
+Object containing custom CSS classnames to override the library's default container CSS. See [CSS and Theming](../../guides/theming/css-and-theming.mdx)
+for implementation assistance.
+
+| Type |
+| ------ |
+| object |
+
+### customStyles
+
+Object containing custom styles to override the default CSS variables. See [CSS and Theming](../../guides/theming/css-and-theming.mdx)
+for implementation assistance.
+
+| Type |
+| ------ |
+| object |
+
+### darkMode
+
+If true, toggles the CSS variables to the default dark mode color palette.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### defaultLanguage
+
+Sets the default fallback language for UI component translation, defaults to 'en' for English.
+
+| Type | Default |
+| ------ | ------- |
+| string | 'en' |
+
+### i18nInstance
+
+The `Streami18n` translation instance. Create an instance of this class when you wish to change the connected user's default
+language or override default text in the library.
+
+```jsx
+const i18nInstance = new Streami18n({
+ language: 'es',
+ translationsForLanguage: {
+ 'Nothing yet...': 'Nada',
+ },
+});
+
+
+ {/* children of Chat component */}
+;
+```
+
+| Type |
+| ------ |
+| object |
+
+### initialNavOpen
+
+When the screen width is at a mobile breakpoint, whether or not the mobile navigation menu is open.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### theme
+
+Deprecated and to be removed in a future major release. Use the `customStyles` prop to adjust CSS variables and [customize the theme](../../guides/theming/css-and-theming.mdx#css-variables) of your app.
+
+| Type |
+| ----- |
+| Theme |
+
+### useImageFlagEmojisOnWindows
+
+Windows 10 does not support country flag emojis out of the box. It chooses to render these emojis as characters instead.
+Stream Chat can override this behavior by loading a custom web font that will render images instead (PNGs or SVGs depending
+on the platform). Set this prop to true if you want to use these custom emojis for Windows users.
+
+:::caution
+If you're moving from older versions to `11.0.0` then make sure to import related stylesheet from `stream-chat-react/css/v2/emoji-replacement.css` as it has been removed from our main stylesheet to reduce final bundle size for integrators who do not wish to use this feature.
+:::
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/message-list.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/message-list.mdx
new file mode 100644
index 0000000000..e132fc2ada
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/message-list.mdx
@@ -0,0 +1,566 @@
+---
+id: message_list
+title: MessageList
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+import MessageActionsBoxWithCustomAction from '../../assets/message-actions-box-custom-actions.png';
+
+The `MessageList` component renders a scrollable list of messages. The UI for each individual message is rendered
+conditionally based on its `message.type` value. The list renders date separators, message reactions, new message notifications, system
+messages, deleted messages, and standard messages containing text and/or attachments.
+
+By default, the `MessageList` loads the most recent 25 messages held in the `channel.state`. More messages are fetched
+from the Stream Chat API and loaded into the DOM on scrolling up the list. The currently loaded messages are held in
+the `ChannelStateContext` and can be referenced with our custom hook.
+
+```tsx
+const { messages } = useChannelStateContext();
+```
+
+The `MessageList` has no required props and by default pulls overridable data from the various contexts established
+in the [`Channel`](./channel.mdx) component. Customization of the messages rendered within the list is handled by
+the [Message UI](../message-components/message-ui.mdx) component.
+
+## Basic Usage
+
+As a context consumer, the `MessageList` component must be rendered as a child of the `Channel` component. It can be
+rendered with or without a provided `messages` prop. Providing your own `messages` value will override the default
+value drawn from the `ChannelStateContext`.
+
+**Example 1** - without `messages` prop
+
+```tsx
+
+
+
+
+
+
+
+```
+
+**Example 2** - with `messages` prop
+
+```tsx
+const customMessages = [
+ // array of messages
+];
+
+
+
+
+
+
+
+;
+```
+
+## Message grouping
+
+The `MessageList` internally creates a mapping of message id to a style group. There are 4 style groups - ` 'middle' | 'top' | 'bottom' | 'single'`. Later these group style tags are incorporated into the class of the `` element that wraps the `Message` component. This allows us to style messages by their position in the message group. An example of such class is `str-chat__li str-chat__li--bottom`.
+
+## Custom message list rendering
+
+You can completely change the way the message list is rendered by providing a custom `renderMessages` function. This function takes all the messages fetched so far (along with some additional data) and returns an array of React elements to render. By overriding the default behavior, you can add custom elements to the message list, change the way messages are grouped, add custom separators between messages, etc.
+
+If you provide a custom `renderMessages` function, it's your responsibility to render each message type correctly. You can use the as a reference. Or, if you just want to tweak a few things here and there, you can call `defaultRenderMessages` from your custom `renderMessages` function and build from there.
+
+In this example, we use the default implementation for rendering a message list, and we add a custom element at the bottom of the list:
+
+```tsx
+const customRenderMessages: MessageRenderer = (options) => {
+ const elements = defaultRenderMessages(options);
+
+ elements.push(
You're all caught up!
);
+
+ return elements;
+};
+
+const CustomMessageList = () => ;
+```
+
+Make sure that the elements you return have `key`, as they will be rendered as an array. It's also a good idea to wrap each element with `
` to keep your markup semantically correct.
+
+:::note
+`MessageList` will re-render every time `renderMessages` function changes. For best performance, make sure that you don't recreate `renderMessages` function on every render: either move it to the global or module scope, or wrap it with `useCallback`.
+:::
+
+Custom message list rendering is only supported in `MessageList` and is currently not supported in `VirtualizedMessageList`.
+
+## Props
+
+### additionalMessageInputProps
+
+Additional props to be passed to the `MessageInput` component, [available props](../message-input-components/message-input.mdx/#props). It is rendered when editing a message.
+
+| Type |
+| ------ |
+| object |
+
+### closeReactionSelectorOnClick
+
+If true, picking a reaction from the `ReactionSelector` component will close the selector.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### customMessageActions
+
+An object containing custom message actions (key) and function handlers (value). For each custom action a dedicated item (button) in [`MessageActionsBox`](../message-components/message_ui#message-actions-box) is rendered. The key is used as a display text inside the button. Therefore, it should not be cryptic but rather bear the end user in mind when formulating it.
+
+```jsx
+const customActions = {
+ 'Copy text': (message) => {
+ navigator.clipboard.writeText(message.text || '');
+ },
+};
+
+;
+```
+
+Custom action item "Copy text" in the message actions box:
+
+
+
+| Type |
+| ------ |
+| object |
+
+### disableDateSeparator
+
+If true, disables the injection of date separator UI components in the `Channel` `MessageList` component.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### disableQuotedMessages
+
+If true, disables the ability for users to quote messages.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### formatDate
+
+Overrides the default date formatting logic, has access to the original date object.
+
+| Type |
+| ---------------------- |
+| (date: Date) => string |
+
+### getDeleteMessageErrorNotification
+
+Function that returns the notification text to be displayed when the delete message request fails. This function receives the
+deleted [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getFetchReactionsErrorNotification
+
+Function that returns the notification text to be displayed when loading message reactions fails. This function receives the
+current [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getFlagMessageErrorNotification
+
+Function that returns the notification text to be displayed when a flag message request fails. This function receives the
+flagged [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getFlagMessageSuccessNotification
+
+Function that returns the notification text to be displayed when a flag message request succeeds. This function receives the
+flagged [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getMarkMessageUnreadErrorNotification
+
+Function that returns the notification text to be displayed when a mark message unread request fails. This function receives the
+marked [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getMarkMessageUnreadSuccessNotification
+
+Function that returns the notification text to be displayed when a mark message unread request succeeds. This function receives the
+marked [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getMuteUserErrorNotification
+
+Function that returns the notification text to be displayed when a mute user request fails. This function receives the
+muted [user object](https://getstream.io/chat/docs/javascript/update_users/?language=javascript) as its argument.
+
+| Type |
+| ------------------------------ |
+| (user: UserResponse) => string |
+
+### getMuteUserSuccessNotification
+
+Function that returns the notification text to be displayed when a mute user request succeeds. This function receives the
+muted [user object](https://getstream.io/chat/docs/javascript/update_users/?language=javascript) as its argument.
+
+| Type |
+| ------------------------------ |
+| (user: UserResponse) => string |
+
+### getPinMessageErrorNotification
+
+Function that returns the notification text to be displayed when a pin message request fails. This function receives the
+pinned [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### groupStyles
+
+Callback function to map each message in the list to a group style (` 'middle' | 'top' | 'bottom' | 'single'`).
+
+| Type |
+| -------------------------------------------------------------------------------------------------------------------------- |
+| (message: StreamMessage, previousMessage: StreamMessage, nextMessage: StreamMessage, noGroupByUser: boolean) => GroupStyle |
+
+### hasMore
+
+Whether the list has more items to load.
+
+| Type | Default |
+| ------- | ------------------------------------------------------------------------------------ |
+| boolean | [ChannelStateContextValue['hasMore']](../contexts/channel-state-context.mdx#hasmore) |
+
+### headerPosition
+
+Position to render the `HeaderComponent` in the list.
+
+| Type |
+| ------ |
+| number |
+
+### hideDeletedMessages
+
+If true, removes the `MessageDeleted` components from the list.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### hideNewMessageSeparator
+
+If true, hides the `DateSeparator` component that renders when new messages are received in a channel that's watched but not active.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### internalInfiniteScrollProps
+
+Additional props for the underlying component.
+
+| Type |
+| ------ |
+| object |
+
+### loadingMore
+
+Whether the list is currently loading more items.
+
+| Type | Default |
+| ------- | -------------------------------------------------------------------------------------------- |
+| boolean | [ChannelStateContextValue['loadingMore']](../contexts/channel-state-context.mdx#loadingmore) |
+
+### loadMore
+
+Function called when more messages are to be loaded, provide your own function to override the handler stored in context.
+
+| Type | Default |
+| -------- | ---------------------------------------------------------------------------------------- |
+| function | [ChannelActionContextValue['loadMore']](../contexts/channel-action-context.mdx#loadmore) |
+
+### Message
+
+Custom UI component to display an individual message.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### messageActions
+
+Array of allowed message actions (ex: 'edit', 'delete', 'reply'). To disable all actions, provide an empty array.
+
+| Type | Default |
+| ----- | -------------------------------------------------------------------- |
+| array | ['edit', 'delete', 'flag', 'mute', 'pin', 'quote', 'react', 'reply'] |
+
+### messageLimit
+
+The limit to use when paginating new messages (the page size).
+
+:::caution
+After mounting, the `MessageList` component checks if the list is completely filled with messages. If there is some space left in the list, `MessageList` will load the next page of messages, but it will do so _only once_. This means that if your `messageLimit` is too low, or if your viewport is very large, the list will not be completely filled. Set the limit with this in mind.
+:::
+
+| Type | Default |
+| ------ | ------- |
+| number | 100 |
+
+### messages
+
+The messages to render in the list. Provide your own array to override the data stored in context.
+
+| Type | Default |
+| ----- | -------------------------------------------------------------------------------------- |
+| array | [ChannelStateContextValue['messages']](../contexts/channel-state-context.mdx#messages) |
+
+### noGroupByUser
+
+If true, turns off message UI grouping by user.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### onlySenderCanEdit
+
+If true, only the sender of the message has editing privileges. If `false` also channel capability `update-any-message` has to be enabled in order a user can edit other users' messages.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### onMentionsClick
+
+Custom action handler function to run on click on a @mention in a message.
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------------------------------ |
+| function | [ChannelActionContextValue['onMentionsClick']](../contexts/channel-action-context.mdx#onmentionsclick) |
+
+### onMentionsHover
+
+Custom action handler function to run on hover over a @mention in a message.
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------------------------------ |
+| function | [ChannelActionContextValue['onMentionsHover']](../contexts/channel-action-context.mdx#onmentionshover) |
+
+### onUserClick
+
+Custom action handler function to run on click of user avatar.
+
+| Type |
+| ----------------------------------------------------- |
+| (event: React.BaseSyntheticEvent, user: User) => void |
+
+### onUserHover
+
+Custom action handler function to run on hover of user avatar.
+
+| Type |
+| ----------------------------------------------------- |
+| (event: React.BaseSyntheticEvent, user: User) => void |
+
+### openThread
+
+Custom action handler to open a [`Thread`](./thread.mdx) component.
+
+| Type | Default |
+| -------- | -------------------------------------------------------------------------------------------- |
+| function | [ChannelActionContextValue['openThread']](../contexts/channel-action-context.mdx#openthread) |
+
+### pinPermissions
+
+The user roles allowed to pin messages in various channel types (deprecated in favor of `channelCapabilities`).
+
+| Type | Default |
+| ------ | ------------------------------------------------------------------------- |
+| object | |
+
+### renderText {#render-text}
+
+Custom function to render message text content.
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------ |
+| function | |
+
+### renderMessages
+
+Custom function to render message text content.
+
+| Type | Default |
+| -------- | -------------------------------------------------------------------------------------- |
+| function | |
+
+#### Parameters
+
+The function receives a single object with the following properties:
+
+| Name | Type | Description |
+| --------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
+| components | [ComponentContextValue](../contexts/component-context.mdx) | UI components, including possible overrides |
+| customClasses | object | Object containing [custom CSS classnames](../../components/core-components/chat.mdx#customclasses) to override the library's default container CSS |
+| lastReceivedMessageId | string | The latest message ID in the current channel |
+| messageGroupStyles | string[] | An array of potential styles to apply to a grouped message (ex: top, bottom, single) |
+| messages | Array<[ChannelStateContextValue['messages']](../contexts/channel-state-context.mdx#messages)> | The messages to render in the list |
+| readData | object | The read state for for messages submitted by the user themselves |
+| sharedMessageProps | object | Object containing props that can be directly passed to the `Message` component |
+
+#### Return value
+
+The function is expected to return an array of valid React nodes: `Array`. For best performance, each node should have a `key`.
+
+### retrySendMessage
+
+Custom action handler to retry sending a message after a failed request.
+
+| Type | Default |
+| -------- | -------------------------------------------------------------------------------------------------------- |
+| function | [ChannelActionContextValue['retrySendMessage']](../contexts/channel-action-context.mdx#retrysendmessage) |
+
+### returnAllReadData
+
+If true, `readBy` data supplied to the `Message` components will include all user read states per sent message. By default,
+only `readBy` data for a user's most recently sent message is returned.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### reviewProcessedMessage
+
+Allows to review changes introduced to messages array on per message basis (for example date separator injection before a message). The array returned from the function is appended to the array of messages that are later rendered into React elements in the `MessageList`.
+
+The function expects a single parameter, which is an object containing the following attributes:
+
+- `changes` - array of messages representing the changes applied around a given processed message
+- `context` - configuration params and information forwarded from `processMessages`
+- `index` - index of the processed message in the original messages array
+- `messages` - array of messages retrieved from the back-end
+- `processedMessages` - newly built array of messages to be later rendered
+
+The `context` has the following parameters:
+
+- `userId` - the connected user ID;
+- `enableDateSeparator` - flag determining whether the date separators will be injected Enable date separator
+- `hideDeletedMessages` - flag determining whether deleted messages would be filtered out during the processing
+- `hideNewMessageSeparator` - disables date separator display for unread incoming messages
+- `lastRead`: Date when the channel has been last read. Sets the threshold after everything is considered unread
+
+The example below demonstrates how the custom logic can decide, whether deleted messages should be rendered on a given date. In this example, the deleted messages neither the date separator would be rendered if all the messages on a given date are deleted.
+
+```js
+const getMsgDate = (msg) =>
+ (msg && msg.created_at && isDate(msg.created_at) && msg.created_at.toDateString()) || '';
+
+const dateSeparatorFilter = (msg) => msg.customType !== 'message.date';
+
+const msgIsDeleted = (msg) => msg.type === 'deleted';
+
+const reviewProcessedMessage = ({ changes, context, index, messages, processedMessages }) => {
+ if (!context.enableDateSeparator) return changes;
+
+ const changesWithoutSeparator = changes.filter(dateSeparatorFilter);
+ const dateSeparatorInjected = changesWithoutSeparator.length !== changes.length;
+ const previousProcessedMessage = processedMessages[processedMessages.length - 1];
+ const processedMessage = messages[index];
+ const processedMessageDate = getMsgDate(processedMessage);
+
+ if (dateSeparatorInjected) {
+ if (!processedMessageDate) return changes;
+ const followingMessages = messages.slice(index + 1);
+ let allFollowingMessagesOnDateDeleted = false;
+
+ for (const followingMsg of followingMessages) {
+ const followingMsgDate = getMsgDate(followingMsg);
+ if (followingMsgDate !== processedMessageDate) break;
+ allFollowingMessagesOnDateDeleted = followingMsg.type === 'deleted';
+ }
+
+ return allFollowingMessagesOnDateDeleted ? [] : changes;
+ } else if (
+ msgIsDeleted(processedMessage) &&
+ getMsgDate(previousProcessedMessage) !== getMsgDate(processedMessage)
+ ) {
+ return [];
+ } else {
+ return changes;
+ }
+};
+```
+
+### scrolledUpThreshold
+
+The pixel threshold to determine whether the user is scrolled up in the list. When scrolled up in the active
+channel, the `MessageNotification` component displays when new messages arrive.
+
+| Type | Default |
+| ------ | ------- |
+| number | 200 |
+
+### showUnreadNotificationAlways
+
+The floating notification informing about unread messages will be shown when the `UnreadMessagesSeparator` is not visible. The default is false, that means the notification
+is shown only when viewing unread messages.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### sortReactionDetails
+
+Comparator function to sort the list of reacted users. Should have the same signature as an array's `sort` method.
+
+| Type | Default |
+| ---------------------------------------------------------- | ------------------ |
+| (this: ReactionResponse, that: ReactionResponse) => number | alphabetical order |
+
+### sortReactions
+
+Comparator function to sort reactions. Should have the same signature as the `sort` method for a string array.
+
+| Type | Default |
+| -------------------------------------------------------- | ------------------ |
+| (this: ReactionSummary, that: ReactionSummary) => number | alphabetical order |
+
+### threadList
+
+If true, indicates that the current `MessageList` component is part of a `Thread`.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### unsafeHTML
+
+If true, renders HTML instead of markdown. Posting HTML is only supported server-side.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/thread.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/thread.mdx
new file mode 100644
index 0000000000..fc7873e963
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/thread.mdx
@@ -0,0 +1,210 @@
+---
+id: thread
+title: Thread
+---
+
+The `Thread` component renders a list of replies tied to a single parent message in a channel's main message list.
+A `Thread` maintains its own state and renders its own `MessageList` and `MessageInput` components. Each piece of
+rendered UI can be overridden with custom components either drawn from the `ComponentContext` or supplied via props.
+
+The `Thread` component consumes the contexts established in [`Channel`](./channel.mdx) and does not have any required props.
+
+## Basic Usage
+
+As a context consumer, the `Thread` component must be rendered as a child of the `Channel` component. To enable
+smooth `Thread` mount and unmount behavior, wrap the main channel components in the [`Window`](../utility-components/window.mdx)
+component. `Window` handles width changes in the main channel to ensure a seamless user experience when opening and
+closing a `Thread`.
+
+```jsx
+
+
+
+
+
+
+
+
+
+
+```
+
+## UI Customization
+
+Since a `Thread` contains most of the pieces of a `Channel` component, just in an encapsulated form, many aspects
+and components can be customized in a similar way. The UI components for both [`Message`](../message-components/message.mdx)
+and [`MessageInput`](../message-input-components/message-input.mdx) can be overridden via props if you desire different
+UI from the styles rendered in the main `Channel`. `ThreadHeader` and `ThreadStart` are two overridable UI
+components unique to `Thread` that can be drawn from the `ComponentContext`.
+
+**Example 1** - The below example shows how to render different UI for messages and the input within a `Thread`,
+versus those rendered in the main `Channel`.
+
+:::note
+A common pattern we use in the library is to first check props to see if a value/component exists, and if not,
+pull from context.
+:::
+
+```jsx
+const MainInput = (props) => {
+ // render main `MessageInput` UI component here
+};
+
+const MainMessage = (props) => {
+ // render main `Message` UI component here
+};
+
+const ThreadInput = (props) => {
+ // render thread `MessageInput` UI component here
+};
+
+const ThreadMessage = (props) => {
+ // render thread `Message` UI component here
+};
+
+
+
+
+
+
+
+
+
+
+;
+```
+
+**Example 2** - The below example shows how to provide custom UI for the `ThreadHeader` and `ThreadStart`
+components. `ThreadHeader` is rendered above the UI for the thread's parent `Message` component and at the
+top of the `Thread`. `ThreadStart` serves as a separator between the parent message and the `MessageList` of replies.
+
+```jsx
+const CustomThreadHeader = (props) => {
+ // render thread header UI component here
+};
+
+const CustomThreadStart = (props) => {
+ // render thread start UI component here
+};
+
+
+
+
+
+
+
+
+
+
+;
+```
+
+**Example 3** - To customize the combo of the thread's parent message and the `ThreadStart` separator, you can create a custom `ThreadHead` component and pass it to the `Channel` props. It then will be stored in the [`ComponentContext['ThreadHead']`](../contexts/component-context.mdx/#threadhead)
+
+```jsx
+const CustomThreadHead = (props) => {
+ // render thread header UI component here
+};
+
+
+
+
+
+
+
+
+
+
+;
+```
+
+## Props
+
+### additionalMessageInputProps
+
+Additional props to be passed to the underlying [`MessageInput`](../message-input-components/message-input.mdx) component.
+
+| Type |
+| ------ |
+| object |
+
+### additionalMessageListProps
+
+Additional props to be passed to the underlying [`MessageList`](./message-list.mdx) component.
+
+| Type |
+| ------ |
+| object |
+
+### additionalParentMessageProps
+
+Additional props to be passed to the underlying [`Message`](../message-components/message.mdx) component, which represents the
+thread's parent message.
+
+| Type |
+| ------ |
+| object |
+
+### additionalVirtualizedMessageListProps
+
+Additional [props for `VirtualizedMessageList`](../virtualized_list/#props) component.
+
+| Type |
+| ------ |
+| object |
+
+### autoFocus
+
+If true, focuses the `MessageInput` component on opening a thread.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### enableDateSeparator
+
+Controls injection of UI component into underlying `MessageList` or `VirtualizedMessageList`.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### fullWidth
+
+If true, displays the thread at 100% width of its parent container, useful for mobile styling.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### Input
+
+Custom thread input UI component used to override the optional `Input` value stored in `ComponentContext` or the default. For the applications using [theme version 1](../../guides/theming/css-and-theming.mdx), the default is `MessageInputSmall`. Applications using [theme version 2](../../theming/introduction.mdx) will use `MessageInputFlat` by default.
+
+| Type | Default |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| component | / |
+
+### Message
+
+Custom thread message UI component used to override the default `Message` value stored in `ComponentContext`.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------ |
+| component | [ComponentContext['Message']](../contexts/component-context.mdx#message) |
+
+### messageActions
+
+Array of allowed message actions (ex: 'edit', 'delete', 'reply'). To disable all actions, provide an empty array.
+
+| Type | Default |
+| ----- | -------------------------------------------------------------------- |
+| array | ['edit', 'delete', 'flag', 'mute', 'pin', 'quote', 'react', 'reply'] |
+
+### virtualized
+
+If true, render the `VirtualizedMessageList` instead of the standard `MessageList` component.
+
+| Type |
+| ------- |
+| boolean |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/virtualized-list.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/virtualized-list.mdx
new file mode 100644
index 0000000000..ba810983fa
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/core-components/virtualized-list.mdx
@@ -0,0 +1,352 @@
+---
+id: virtualized_list
+title: VirtualizedMessageList
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+The `VirtualizedMessageList` component renders a scrollable list of messages. It differs from the standard `MessageList`
+in that it handles UI virtualization by default. Virtualization is a technique used to emulate large lists of elements by
+rendering as few items as possible to maintain performance and decrease the load on the DOM, while preserving the user
+experience. These qualities make the `VirtualizedMessageList` ideal for livestream use cases, where a single channel may
+have thousands of currently active users.
+
+Similar to the `MessageList`, the UI for each individual message is rendered conditionally based on its `message.type` value.
+The list renders date separators, message reactions, new message notifications, system messages, deleted messages, and standard messages
+containing text and/or attachments.
+
+By default, the `VirtualizedMessageList` loads the most recent 25 messages held in the `channel.state`. More messages are fetched
+from the Stream Chat API and loaded into the DOM on scrolling up the list. The currently loaded messages are held in
+the `ChannelStateContext` and can be referenced with our custom hook.
+
+```jsx
+const { messages } = useChannelStateContext();
+```
+
+The `VirtualizedMessageList` has no required props and by default pulls overridable data from the various contexts established
+in the [`Channel`](./channel.mdx) component. Customization of the messages rendered within the list is handled by
+the [Message UI](../message-components/message-ui.mdx) component.
+
+## Basic Usage
+
+As a context consumer, the `VirtualizedMessageList` component must be rendered as a child of the `Channel` component. It can be
+rendered with or without a provided `messages` prop. Providing your own `messages` value will override the default
+value drawn from the `ChannelStateContext`.
+
+**Example 1** - without `messages` prop
+
+```jsx
+
+
+
+
+
+
+
+```
+
+**Example 2** - with `messages` prop
+
+```jsx
+const customMessages = [
+ // array of messages
+];
+
+
+
+
+
+
+
+;
+```
+
+## Scroll Behavior Optimization
+
+By default, the virtualized message list uses the latest message (which gets rendered first) in the list as the default item size.
+This can lead to inaccurate scroll thumb size or scroll jumps if the last item is unusually tall (for example, an attachment).
+To improve this behavior, set the `defaultItemHeight` property to a value close (or equal to) the height of the usual messages.
+
+```jsx
+
+```
+
+## Message grouping
+
+The `VirtualizedMessageList` internally creates a mapping of message id to a style group. There are 4 style groups - ` 'middle' | 'top' | 'bottom' | 'single'`. Later these group style tags are incorporated into the class of the `` element that wraps the `Message` component. This allows us to style messages by their position in the message group. An example of such class is `str-chat__li str-chat__li--bottom`.
+
+## Props
+
+### additionalMessageInputProps
+
+Additional props to be passed to the `MessageInput` component, [available props](../message-input-components/message-input.mdx/#props). It is rendered when editing a message.
+
+| Type |
+| ------ |
+| object |
+
+### additionalVirtuosoProps
+
+Additional props to be passed the underlying [`react-virtuoso` virtualized list dependency](https://virtuoso.dev/virtuoso-api-reference/).
+
+| Type |
+| ------ |
+| object |
+
+### closeReactionSelectorOnClick
+
+If true, picking a reaction from the `ReactionSelector` component will close the selector.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### customMessageRenderer
+
+Custom message render function, overrides the default `messageRenderer` function defined in the component.
+
+| Type |
+| ------------------------------------------------------------------ |
+| ( messages: StreamMessage[], index: number ) => React.ReactElement |
+
+### defaultItemHeight
+
+If set, the default item height is used for the calculation of the total list height. Use if you expect messages with a lot of height variance.
+
+| Type |
+| ------ |
+| number |
+
+### disableDateSeparator
+
+If true, disables the injection of date separator UI components.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### groupStyles
+
+Callback function to set group styles for each message.
+
+| Type |
+| -------------------------------------------------------------------------------------------------------------------------- |
+| (message: StreamMessage, previousMessage: StreamMessage, nextMessage: StreamMessage, noGroupByUser: boolean) => GroupStyle |
+
+### hasMore
+
+Whether the list has more items to load.
+
+| Type | Default |
+| ------- | ------------------------------------------------------------------------------------ |
+| boolean | [ChannelStateContextValue['hasMore']](../contexts/channel-state-context.mdx#hasmore) |
+
+### hideDeletedMessages
+
+If true, removes the `MessageDeleted` components from the list.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### hideNewMessageSeparator
+
+If true, hides the `DateSeparator` component that renders when new messages are received in a channel that's watched but not active.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### loadingMore
+
+Whether the list is currently loading more items.
+
+| Type | Default |
+| ------- | -------------------------------------------------------------------------------------------- |
+| boolean | [ChannelStateContextValue['loadingMore']](../contexts/channel-state-context.mdx#loadingmore) |
+
+### loadMore
+
+Function called when more messages are to be loaded, provide your own function to override the handler stored in context.
+
+| Type | Default |
+| -------- | ---------------------------------------------------------------------------------------- |
+| function | [ChannelActionContextValue['loadMore']](../contexts/channel-action-context.mdx#loadmore) |
+
+### Message
+
+Custom UI component to display an individual message.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### messageLimit
+
+The limit to use when paginating messages (the page size).
+
+:::caution
+After mounting, the `VirtualizedMessageList` component checks if the list is completely filled with messages. If there is some space left in the list, `VirtualizedMessageList` will load the next page of messages, but it will do so _only once_. This means that if your `messageLimit` is too low, or if your viewport is very large, the list will not be completely filled. Set the limit with this in mind.
+:::
+
+| Type | Default |
+| ------ | ------- |
+| number | 100 |
+
+### messages
+
+The messages to render in the list, provide your own array to override the data stored in context.
+
+| Type | Default |
+| ----- | -------------------------------------------------------------------------------------- |
+| array | [ChannelStateContextValue['messages']](../contexts/channel-state-context.mdx#messages) |
+
+### overscan
+
+The amount of extra content the list should render in addition to what's necessary to fill in the viewport.
+
+| Type | Default |
+| ------ | ------- |
+| number | 0 |
+
+### returnAllReadData
+
+Keep track of read receipts for each message sent by the user. When disabled, only the last own message delivery / read status is rendered.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### reviewProcessedMessage
+
+Allows to review changes introduced to messages array on per message basis (for example date separator injection before a message). The array returned from the function is appended to the array of messages that are later rendered into React elements in the `VirtualizedMessageList`.
+
+The function expects a single parameter, which is an object containing the following attributes:
+
+- `changes` - array of messages representing the changes applied around a given processed message
+- `context` - configuration params and information forwarded from `processMessages`
+- `index` - index of the processed message in the original messages array
+- `messages` - array of messages retrieved from the back-end
+- `processedMessages` - newly built array of messages to be later rendered
+
+The `context` has the following parameters:
+
+- `userId` - the connected user ID;
+- `enableDateSeparator` - flag determining whether the date separators will be injected Enable date separator
+- `hideDeletedMessages` - flag determining whether deleted messages would be filtered out during the processing
+- `hideNewMessageSeparator` - disables date separator display for unread incoming messages
+- `lastRead`: Date when the channel has been last read. Sets the threshold after everything is considered unread
+
+The example below demonstrates how the custom logic can decide, whether deleted messages should be rendered on a given date. In this example, the deleted messages neither the date separator would be rendered if all the messages on a given date are deleted.
+
+```js
+const getMsgDate = (msg) =>
+ (msg && msg.created_at && isDate(msg.created_at) && msg.created_at.toDateString()) || '';
+
+const dateSeparatorFilter = (msg) => msg.customType !== 'message.date';
+
+const msgIsDeleted = (msg) => msg.type === 'deleted';
+
+const reviewProcessedMessage = ({ changes, index, messages, processedMessages }) => {
+ const changesWithoutSeparator = changes.filter(dateSeparatorFilter);
+ const dateSeparatorInjected = changesWithoutSeparator.length !== changes.length;
+ const previousProcessedMessage = processedMessages[processedMessages.length - 1];
+ const processedMessage = messages[index];
+ const processedMessageDate = getMsgDate(processedMessage);
+
+ if (dateSeparatorInjected) {
+ if (!processedMessageDate) return changes;
+ const followingMessages = messages.slice(index + 1);
+ let allFollowingMessagesOnDateDeleted = false;
+
+ for (const followingMsg of followingMessages) {
+ const followingMsgDate = getMsgDate(followingMsg);
+ if (followingMsgDate !== processedMessageDate) break;
+ allFollowingMessagesOnDateDeleted = followingMsg.type === 'deleted';
+ }
+
+ return allFollowingMessagesOnDateDeleted ? [] : changes;
+ } else if (
+ msgIsDeleted(processedMessage) &&
+ getMsgDate(previousProcessedMessage) !== getMsgDate(processedMessage)
+ ) {
+ return [];
+ } else {
+ return changes;
+ }
+};
+```
+
+### scrollSeekPlaceHolder
+
+Custom data passed to the list that determines when message placeholders should be shown during fast scrolling.
+
+| Type |
+| ------ |
+| object |
+
+### scrollToLatestMessageOnFocus
+
+If true, the list will scroll to the latest message when the window regains focus.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### shouldGroupByUser
+
+If true, group messages belonging to the same user, otherwise show each message individually.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### separateGiphyPreview
+
+If true, the Giphy preview will render as a separate component above the `MessageInput`, rather than inline with the other messages in the list.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### showUnreadNotificationAlways
+
+The floating notification informing about unread messages will be shown when the `UnreadMessagesSeparator` is not visible. The default is false, that means the notification
+is shown only when viewing unread messages.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### stickToBottomScrollBehavior
+
+The scroll-to behavior when new messages appear. Use `'smooth'` for regular chat channels and `'auto'`
+(which results in instant scroll to bottom) if you expect high throughput.
+
+| Type | Default |
+| ------------------ | -------- |
+| 'smooth' \| 'auto' | 'smooth' |
+
+### sortReactionDetails
+
+Comparator function to sort the list of reacted users. Should have the same signature as an array's `sort` method.
+
+| Type | Default |
+| ---------------------------------------------------------- | ------------------ |
+| (this: ReactionResponse, that: ReactionResponse) => number | alphabetical order |
+
+### sortReactions
+
+Comparator function to sort reactions. Should have the same signature as an array's `sort` method.
+
+| Type | Default |
+| -------------------------------------------------------- | ------------------ |
+| (this: ReactionSummary, that: ReactionSummary) => number | alphabetical order |
+
+### threadList
+
+If true, indicates that the current `VirtualizedMessageList` component is part of a `Thread`.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/attachment.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/attachment.mdx
new file mode 100644
index 0000000000..6da2302374
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/attachment.mdx
@@ -0,0 +1,233 @@
+---
+id: attachment
+title: Attachments
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+import ImageSizingScreenshot1 from '../../assets/ImageSizing1.png';
+import ImageSizingScreenshot2 from '../../assets/ImageSizing2.png';
+import ImageSizingScreenshot3 from '../../assets/ImageSizing3.png';
+import AttachmentSizeWarning from '../../assets/AttachmentSizeWarning.png';
+
+The `Attachment` component takes a list of message attachments and conditionally renders the UI of each individual attachment based
+upon its type. The following table shows the attachment UI components that will be rendered for various attachment types:
+
+| Attachment Type | UI Component | File type(s) (non-exhaustive) |
+| --------------- | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
+| `audio` | [Audio](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Audio.tsx) | MP3, WAV, M4A, FLAC, AAC |
+| `file` | [File](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/FileAttachment.tsx) | DOC, DOCX, PDF, PPT, PPTX, TXT, XLS, XLSX |
+| `gallery` | [Gallery](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/Gallery.tsx) | when a message has more than 1 'image' type attachment |
+| `image` | [Image](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/Image.tsx) | HEIC, GIF, JPEG, JPG, PNG, TIFF, BMP |
+| `video` | [ReactPlayer](https://github.com/cookpete/react-player/blob/master/src/ReactPlayer.js) | MP4, OGG, WEBM, Quicktime(QTFF, QT, or MOV) |
+
+Message attachment objects that do not conform to one of the above types are considered to contain scraped content and should contain at least `og_scrape_url` or `title_link` to be rendered with the component. Otherwise, the attachment is not rendered.
+
+## Basic Usage
+
+By default, the `Attachment` component is included within `MessageSimple`. To render message attachment UI within a custom
+[Message UI](./message-ui.mdx) component, import the `Attachment` component and render it conditionally based upon the presence of
+message attachments.
+
+```jsx
+const CustomMessage = () => {
+ // consume `MessageContext`
+ const { message } = useMessageContext();
+
+ const hasAttachments = message.attachments && message.attachments.length > 0;
+
+ return (
+
+ );
+};
+
+
+
+
+
+
+;
+```
+
+or using wrapped `Attachment` component:
+
+```jsx
+const CustomAudioAttachment = (props) => {
+ // you can add any custom data (such as "customType" in this case)
+ if (props.og?.customType === 'voice-memo') return
my custom voice-memo component
;
+ return ;
+};
+
+const CustomAttachment = (props) => {
+ return ;
+};
+
+
+
+
+
+
+;
+```
+
+### Image and video sizing
+
+The following section details how the width and height of images and videos uploaded from files are computed.
+
+#### Maximum size
+
+You can control the maximum width and height of images and videos with the [`--str-chat__attachment-max-width`](../../theming/component-variables.mdx) CSS variable (available only in [theme-v2](../../theming/introduction.mdx)). The value of this variable must be a value that can be computed to a valid pixel value using the [`getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) method (for example: `300px`, `10rem`, `calc(300px - var(--margin))`, but not `100%`). If you provide an invalid value, the image and video sizing can break, which can lead to scrolling issues inside the message list (for example the message list isn't scrolled to the bottom when you open a channel).
+
+If you set an invalid value to the variable, you'll see a warning on the browser's console:
+
+
+
+#### File size optimization
+
+Based on the CSS settings provided for images and videos (see [Maximum size](#maximum-size) section), the SDK will load an image (or thumbnail image in case of a video file) with a reduced file size while still providing sufficient image quality for the given dimensions. This will result in less network traffic and faster image load for users.
+
+For example if an image has `max-width` and `max-height` set to `300px` and the original image has the following dimensions: `965 × 1280` it's enough to load an image with a reduced file size, file size reduction is done by Stream's CDN.
+
+#### Aspect ratio
+
+The following description is applicable for [theme-v2](../../theming/introduction.mdx).
+
+The SDK will try to display images and videos with their original aspect ratio, however this isn't always guaranteed (in those cases a cropped image will be displayed). Three notable exceptions are:
+
+1. if a message contains multiple lines of texts and/or multiple attachments, the image/video might be stretched to its `max-width`
+
+**Example 1** - message with one line of text - image is displayed with original aspect ratio
+
+
+
+**Example 2** - message with multiple lines of text - image is cropped
+
+
+
+2. in Safari, images/videos with portrait orientation are stretched to `max-width`
+
+**Example 3** - portrait images in Safari - image is cropped
+
+
+
+3. if the image/video can't be rendered with the original aspect ratio given the `max-width` and `max-height` constraints of the host HTML element
+
+:::important
+**File size optimization** and maintaining **aspect ratio** uses features provided by Stream's CDN. If you're using your **own CDN** you'll likely have to provide your own implementation for this. You can do this using the [`imageAttachmentSizeHandler`](../core-components/channel.mdx/#imageattachmentsizehandler) and [`videoAttachmentSizeHandler`](../core-components/channel.mdx/#videoattachmentsizehandler) props.
+:::
+
+:::danger
+**If you're planning to rewrite attachment sizing with your own CSS code** it's important to note that:
+
+The sizing logic for images and videos (the [`imageAttachmentSizeHandler`](../core-components/channel.mdx/#imageattachmentsizehandler) and [`videoAttachmentSizeHandler`](../core-components/channel.mdx/#videoattachmentsizehandler)) requires that host elements of images and videos (ususally `img` and `video` elements) have `max-height`/`height` and `max-width` properties defined and that these values can be computed to a valid pixel value using the [`getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) (for more information refer to the [Maximum size](#maximum-size) section).
+:::
+
+## Props
+
+###
Required
attachments
+
+The message attachments to render, see [Attachment Format](https://getstream.io/chat/docs/javascript/message_format/?language=javascript)
+in the general JavaScript docs.
+
+| Type |
+| ----- |
+| array |
+
+### actionHandler
+
+The handler function to call when an action is performed on an attachment, examples include canceling a /giphy command or shuffling the results.
+
+| Type |
+| ----------------------------------------------------------------------------------------------------- |
+| (dataOrName?: string \| FormData, value?: string, event?: React.BaseSyntheticEvent) => Promise |
+
+### AttachmentActions
+
+Custom UI component for displaying attachment actions.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------ |
+| component | |
+
+### Audio
+
+Custom UI component for displaying an audio type attachment.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------ |
+| component | |
+
+### Card
+
+Custom UI component for displaying a card type attachment.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------- |
+| component | |
+
+### File
+
+Custom UI component for displaying a file type attachment.
+
+| Type | Default |
+| --------- | -------------------------------------------------------------------- |
+| component | |
+
+### Gallery
+
+Custom UI component for displaying a gallery of image type attachments.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------- |
+| component | |
+
+### Image
+
+Custom UI component for displaying an image type attachment.
+
+| Type | Default |
+| --------- | --------------------------------------------------------- |
+| component | |
+
+### Media
+
+Custom UI component for displaying a video type attachment, defaults to use the [`react-player`](https://github.com/cookpete/react-player)
+dependency.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------------------- |
+| component | [`ReactPlayer`](https://github.com/cookpete/react-player/blob/master/src/ReactPlayer.js) |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/attachment/voice-recording.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/attachment/voice-recording.mdx
new file mode 100644
index 0000000000..9cf396b87c
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/attachment/voice-recording.mdx
@@ -0,0 +1,234 @@
+---
+id: voice-recording
+title: Voice Recording Attachment
+---
+
+import GHComponentLink from '../../../_docusaurus-components/GHComponentLink';
+import ImageShowcase from '@site/src/components/ImageShowcase';
+
+import VoiceRecordingRequestPayload from '../../../assets/voice-recording-response-payload.png';
+import VoiceRecordingPlayer from '../../../assets/voice-recording-player.png';
+import VoiceRecordingPlayerInProgress from '../../../assets/voice-recording-player-in-progress.png';
+import VoiceRecordingPlayerStoppedRepro from '../../../assets/voice-recording-player-stopped-repro.png';
+import VoiceRecordingPlayerFileSizeFallback from '../../../assets/voice-recording-player-file-size-fallback.png';
+import VoiceRecordingPlayerFallbackTitle from '../../../assets/voice-recording-fallback-title.png';
+import VoiceRecordingPlayerMissingWaveformData from '../../../assets/voice-recording-empty-waveform-data.png';
+
+import QuotedVoiceRecording from '../../../assets/voice-recording-quoted.png';
+import QuotedVoiceRecordingFileSizeFallback from '../../../assets/voice-recording-quoted-file-size-fallback.png';
+import QuotedVoiceRecordingFallbackTitle from '../../../assets/voice-recording-quoted-fallback-title.png';
+
+Audio attachments recorded directly from the chat UI are called voice recordings. The SDK provides a default implementation called . The default component renders or or .
+
+The `VoiceRecordingPlayer` component is displayed in the message attachment list and is used to reproduce the audio.
+
+VoiceRecordingPlayer component,
+ alt: 'Image of the VoiceRecordingPlayer component',
+ },
+ ]}
+/>
+
+Whereas `QuotedVoiceRecording` is used to display basic information about the voice recording in quoted message reply.
+
+QuotedVoiceRecording component,
+ alt: 'Image of the QuotedVoiceRecording component',
+ },
+ ]}
+/>
+
+## Attachment payload
+
+The response payload for the voice recording attachment comes with the following properties:
+
+Voice recording payload,
+ alt: 'Image of the voice recording payload',
+ },
+ ]}
+/>
+
+These properties serve the following purpose:
+
+| Property | Description |
+| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **asset_url** | the URL where the voice recording is downloaded from |
+| **duration** | the audio duration in seconds |
+| **file_size** | the file size in bytes (displayed as fallback to duration if duration is not available) |
+| **mime_type** | the file type that is later reflected in the icon displayed in the voice recording attachment widget |
+| **title** | the audio title |
+| **type** | the value will always be `"voiceRecording"` |
+| **waveform_data** | the array of fractional number values between 0 and 1. These values represent the amplitudes later reflected in the |
+
+## VoiceRecordingPlayer
+
+### Navigation
+
+By clicking in the space of waveform or by dragging the progress indicator a user can navigate to a specific place in the audio track. The progress indicator is placed at the point of the click or drag end and the preceding amplitude bars are highlighted to manifest the progress.
+
+VoiceRecordingPlayer navigation,
+ alt: 'Image of the VoiceRecordingPlayer stopped in the middle of the reproduction',
+ },
+ ]}
+/>
+
+### Playback speed change
+
+The playback speed can be changed by clicking the . The button is visible only during the audio reproduction. The rate is changed by repeatedly clicking the . Once the highest rate speed is achieved, the next click resets the speed to the initial value.
+
+VoiceRecordingPlayer playing the audio,
+ alt: 'Image of the VoiceRecordingPlayer playing the audio',
+ },
+ ]}
+/>
+
+## UI Fallbacks
+
+### Missing duration
+
+If the duration is not available in the [attachment object payload](./#attachment-payload), `VoiceRecordingPlayer` as well as `QuotedVoiceRecording` component will display the attachment size instead.
+
+VoiceRecordingPlayer displaying file size instead of audio duration,
+ alt: 'Image of the VoiceRecordingPlayer displaying file size instead of audio duration',
+ },
+ {
+ image: QuotedVoiceRecordingFileSizeFallback,
+ caption: QuotedVoiceRecording displaying file size instead of audio duration,
+ alt: 'Image of the QuotedVoiceRecording displaying file size instead of audio duration',
+ },
+ ]}
+/>
+
+### Missing title
+
+If the voice recording does not come with title, a fallback title is provided.
+
+VoiceRecordingPlayer displaying the fallback title,
+ alt: 'Image of the VoiceRecordingPlayer displaying the fallback title',
+ },
+ {
+ image: QuotedVoiceRecordingFallbackTitle,
+ caption: QuotedVoiceRecording displaying the fallback title,
+ alt: 'Image of the QuotedVoiceRecording displaying the fallback title',
+ },
+ ]}
+/>
+
+### Missing `waveform_data`
+
+If the `waveform_data` is an empty array, then no progress bar is rendered.
+
+VoiceRecordingPlayer without progress bar,
+ alt: 'Image of the VoiceRecordingPlayer missing progress bar',
+ },
+ ]}
+/>
+
+## Default components customization
+
+The pattern of customization applied to the default `VoiceRecording` component will be the same:
+
+1. Create a custom voice recording component (e.g. `CustomVoiceRecording`). It will serve as a wrapper component that renders `VoiceRecordingPlayer` resp. `QuotedVoiceRecording`. Pass props to these components.
+
+2. Create a custom attachment component (e.g. `CustomAttachment`), that will be again a wrapper around the SDK's `Attachment` component. Pass the custom voice recording component to the `Attachment` component via prop `VoiceRecording`.
+
+### Provide custom list of playback speeds
+
+You can override the default list of playback rates by overriding the component.
+
+Example:
+
+```typescript jsx
+import {
+ Attachment,
+ AttachmentProps,
+ VoiceRecordingPlayer,
+ VoiceRecordingProps,
+ Channel,
+ QuotedVoiceRecording,
+} from 'stream-chat-react';
+
+import { ChannelInner } from './ChannelInner';
+
+const CustomVoiceRecording = ({ attachment, isQuoted }: VoiceRecordingProps) =>
+ isQuoted ? (
+
+ ) : (
+
+ );
+
+const CustomAttachment = (props: AttachmentProps) => (
+
+);
+
+const App = () => (
+
+
+
+);
+
+export default App;
+```
+
+### Remove title
+
+This could be solved by customizing the styles. You can stop displaying the recording title by tweaking the CSS:
+
+```css
+.str-chat__message-attachment__voice-recording-widget__title {
+ display: none;
+}
+```
+
+### Customize the fallback title
+
+If you do not like our fallback title, you can change it by changing the translation key `"Voice message"`.
+
+### Other customizations
+
+If you would like to perform the following customizations:
+
+- change the progress bar
+- change the file icon SVG
+
+We recommend you to assemble your own components, that serve to display voice recording data and allow for reproduction. Then you can pass those components to the custom attachment component as described above.
+
+The reason is, that `VoiceRecordingPlayer` and `QuotedVoiceRecording` are considerably small components. The inspiration can be taken from the default components implementations.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/message-ui.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/message-ui.mdx
new file mode 100644
index 0000000000..48023cc614
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/message-ui.mdx
@@ -0,0 +1,514 @@
+---
+id: message_ui
+title: Message UI
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+import MessageActionsBoxWithCustomAction from '../../assets/message-actions-box-custom-actions.png';
+
+The Message UI component consumes the [`MessageContext`](../contexts/message-context.mdx) and handles the display and functionality
+for an individual message in a message list. The Message UI component is typically a combination of subcomponents that each consume
+context and are responsible for one aspect of a message (ex: text or reactions).
+
+Each message list component renders with a default Message UI component. If you don't supply a custom component, component will be used by default.
+
+## Basic Usage
+
+**Example 1** - Add Message UI component to `MessageList`.
+
+To use your own Message UI component in the standard `MessageList`, utilize the `Message` prop on either the `Channel`, `MessageList` or `Thread`
+component. Adding the prop to `Channel` will inject your component into the `ComponentContext` and adding to `MessageList` or `Thread` will override
+any value stored in context. So if both props are added, the value delivered to `MessageList` will take precedence.
+
+```jsx
+const CustomMessage = () => {
+ // consume `MessageContext` and render custom component here
+};
+
+
+
+
+
+
+;
+```
+
+**Example 2** - Add Message UI component to `VirtualizedMessageList`.
+
+To use your own Message UI component in the `VirtualizedMessageList`, utilize either the `VirtualMessage` prop on `Channel` or the
+`Message` prop on `VirtualizedMessageList`. Up to the SDK version v10.0.0, `FixedHeightMessage` was the default message component in `Thread`. The component is still available in the SDK, but is not used as a default anymore. Adding the prop to `Channel` will inject your component into the `ComponentContext`
+and adding to `VirtualizedMessageList` will override any value stored in context. So if both props are added, the value
+delivered to `VirtualizedMessageList` will take precedence.
+
+```jsx
+const CustomMessage = () => {
+ // consume `MessageContext` and render custom component here
+};
+
+
+
+
+
+
+;
+```
+
+## UI Customization
+
+`MessageSimple` and `FixedHeightMessage` are both designed to be guides to help build a custom Message UI component. At a high level,
+these pre-built, default components wrap a subset of composable components that each serve specific logic and design-based purposes.
+
+There is a different order in which components are stacked inside the `MessageSimple` component depending on the [`themeVersion`](../contexts/chat-context.mdx/#themeversion).
+
+For example, if we strip `MessageSimple` down to its core pieces, the component resembles the following snippet with the `themeVersion` `'1'`:
+
+```jsx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+The `themeVersion` `'2'` markup is a bit different:
+
+```jsx
+
+
+
+
+
+
+
+
+
+
+
+
+
+ // highlight-next-line
+
+
+ // highlight-start
+
+
+
+
+
+ // highlight-end
+
+```
+
+We recommend building a Message UI component in a similar way. You can mix and match any of the UI subcomponents and arrange
+in a layout that meets your design specifications. All of these UI subcomponents are exported by the library and may be used within
+your custom Message UI component. Each subcomponent consumes the `MessageContext` and requires no/minimal props to run.
+
+For a detailed example, review the [Message UI Customization](../../guides/theming/message-ui.mdx) example.
+
+### Message options
+
+The default message UI component renders 3 option buttons next to the message content in the main message list:
+
+1. button to open message actions drop-down menu - message actions box
+2. button to open thread
+3. button to open reaction selector
+
+In thread button opening thread is omitted.
+
+#### Message actions box
+
+The drop-down menu contains a default list of actions that are enabled for a message. These are determined by the permissions the user has.
+On the other hand, it is also possible to specify [own custom actions](./#custommessageactions). This will lead to adding more items into the drop-down menu.
+
+## Props
+
+:::note
+All Message UI props are optional overrides of the values stored in the [`MessageContext`](../contexts/message-context.mdx). As you
+build your own custom component, we recommend pulling the necessary data from context using the `useMessageContext` custom hook.
+However, if you choose to develop upon our pre-built, default `MessageSimple` component, you may encounter a situation where
+you wish to override a single prop, so all options are detailed below.
+:::
+
+### actionsEnabled
+
+If true, actions such as edit, delete, flag, etc. are enabled on the message (overrides the value stored in `MessageContext`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### additionalMessageInputProps
+
+Additional props to be passed to the underlying [`MessageInput`](../message-input-components/message-input.mdx) component that's rendered
+while editing (overrides the value stored in `MessageContext`).
+
+| Type |
+| ------ |
+| object |
+
+### autoscrollToBottom
+
+Call this function to keep message list scrolled to the bottom when the message list container scroll height increases (only available in the `VirtualizedMessageList`). An example use case: upon user's interaction with the application, a new element appears below the last message. In order to keep the newly rendered content visible, the `autoscrollToBottom` function can be called. The container, however, is not scrolled to the bottom, if already scrolled up more than 4px from the bottom.
+
+You can even use the function to keep the container scrolled to the bottom while images are loading:
+
+```tsx
+const Image = (props: ImageProps) => {
+ ...
+ const { autoscrollToBottom } = useMessageContext();
+ ...
+
+ return (
+
+ );
+};
+```
+
+| Type |
+| ---------- |
+| () => void |
+
+### clearEditingState
+
+When called, this function will exit the editing state on the message (overrides the function stored in `MessageContext`).
+
+| Type |
+| ------------------------------------------ |
+| (event?: React.BaseSyntheticEvent) => void |
+
+### customMessageActions
+
+An object containing custom message actions (key) and function handlers (value) (overrides the value stored in `MessageContext`). The key is used as a display text inside the button. Therefore, it should not be cryptic but rather bear the end user in mind when formulating it.
+
+```jsx
+const customActions = {
+ 'Copy text': (message) => {
+ navigator.clipboard.writeText(message.text || '');
+ },
+};
+
+;
+```
+
+Custom action item "Copy text" in the message actions box:
+
+
+
+| Type |
+| ------ |
+| object |
+
+### editing
+
+If true, the message toggles to an editing state (overrides the value stored in `MessageContext`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### formatDate
+
+Overrides the default date formatting logic, has access to the original date object (overrides the function stored in `MessageContext`).
+
+| Type |
+| ---------------------- |
+| (date: Date) => string |
+
+### getMessageActions
+
+Function that returns an array of the allowed actions on a message by the currently connected user (overrides the function stored in `MessageContext`).
+
+| Type |
+| ------------------------- |
+| () => MessageActionsArray |
+
+### groupByUser
+
+If true, group messages sent by each user (only used in the `VirtualizedMessageList`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### groupStyles
+
+An array of potential styles to apply to a grouped message (ex: top, bottom, single) (overrides the value stored in `MessageContext`).
+
+| Type | Options |
+| -------- | ----------------------------------------------- |
+| string[] | '' \| 'middle' \| 'top' \| 'bottom' \| 'single' |
+
+### handleAction
+
+Function that calls an action on a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
+| (dataOrName?: string \| FormData, value?: string, event?: React.BaseSyntheticEvent) => Promise | [MessageContextValue['handleAction']](../contexts/message-context.mdx#handleaction) |
+
+### handleDelete
+
+Function that removes a message from the current channel (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ----------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleDelete']](../contexts/message-context.mdx#handledelete) |
+
+### handleEdit
+
+Function that edits a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleEdit']](../contexts/message-context.mdx#handleedit) |
+
+### handleFetchReactions
+
+Function that loads the reactions for a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleFetchReactions']](../contexts/message-context.mdx#handlhandlefetchreactions) |
+
+This function limits the number of loaded reactions to 1200. To customize this behavior, you can pass [a custom `ReactionsList` component](./reactions.mdx#handlefetchreactions).
+
+### handleFlag
+
+Function that flags a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleFlag']](../contexts/message-context.mdx#handleflag) |
+
+### handleMarkUnread
+
+Function that marks the message and all the following messages as unread in a channel. (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleMarkUnread']](../contexts/message-context.mdx#handleMarkUnread) |
+
+
+### handleMute
+
+Function that mutes the sender of a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleMute']](../contexts/message-context.mdx#handlemute) |
+
+### handleOpenThread
+
+Function that opens a [`Thread`](../core-components/thread.mdx) on a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleOpenThread']](../contexts/message-context.mdx#handleopenthread) |
+
+### handlePin
+
+Function that pins a message in the current channel (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ----------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handlePin']](../contexts/message-context.mdx#handlepin) |
+
+### handleReaction
+
+Function that adds a reaction on a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | --------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['handleReaction']](../contexts/message-context.mdx#handlereaction) |
+
+### handleRetry
+
+Function that retries sending a message after a failed request (overrides the function stored in `ChannelActionContext`).
+
+| Type | Default |
+| ------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
+| (message: StreamMessage) => Promise | [ChannelActionContextValue['retrySendMessage']](../contexts/channel-action-context.mdx#retrysendmessage) |
+
+### initialMessage
+
+When true, signifies the message is the parent message in a thread list (overrides the value stored in `MessageContext`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### isMyMessage
+
+Function that returns whether a message belongs to the current user (overrides the function stored in `MessageContext`).
+
+| Type |
+| ------------- |
+| () => boolean |
+
+### isReactionEnabled (deprecated)
+
+If true, sending reactions is enabled in the currently active channel (overrides the value stored in `MessageContext`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### lastReceivedId
+
+The latest message ID in the current channel (overrides the value stored in `MessageContext`).
+
+| Type |
+| ------ |
+| string |
+
+### message
+
+The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value stored in `MessageContext`).
+
+| Type |
+| ------ |
+| object |
+
+### messageListRect
+
+DOMRect object linked to the parent `MessageList` component (overrides the value stored in `MessageContext`).
+
+| Type |
+| ------- |
+| DOMRect |
+
+### mutes
+
+An array of users that have been muted by the connected user (overrides the value stored in `MessageContext`).
+
+| Type | Default |
+| ------ | --------------------------------------------------------------------- |
+| Mute[] | [ChannelStateContext['mutes']](../contexts/channel-state-context.mdx) |
+
+### onMentionsClickMessage
+
+Function that runs on click of an @mention in a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['onMentionsClickMessage']](../contexts/channel-action-context.mdx#onmentionsclickmessage) |
+
+### onMentionsHoverMessage
+
+Function that runs on hover of an @mention in a message (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['onMentionsHoverMessage']](../contexts/channel-action-context.mdx#onmentionshovermessage) |
+
+### onReactionListClick
+
+Function that runs on click of the reactions list component (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['onReactionListClick']](../contexts/channel-action-context.mdx#onreactionlistclick) |
+
+### onUserClick
+
+Function that runs on click of a user avatar (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['onUserClick']](../contexts/channel-action-context.mdx#onuserclick) |
+
+### onUserHover
+
+Function that runs on hover of a user avatar (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['onUserHover']](../contexts/channel-action-context.mdx#onuserhover) |
+
+### pinPermissions
+
+The user roles allowed to pin messages in various channel types (deprecated in favor of `channelCapabilities`).
+
+| Type | Default |
+| ------ | -------------------------------------------------------------------------------------------------------------------- |
+| object | [defaultPinPermissions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/utils.tsx) |
+
+### reactionSelectorRef
+
+Ref to be placed on the reaction selector component (overrides the ref stored in `MessageContext`).
+
+| Type |
+| --------------------------------------- |
+| React.MutableRefObject |
+
+### readBy
+
+An array of users that have read the current message (overrides the value stored in `MessageContext`).
+
+| Type |
+| ----- |
+| array |
+
+### renderText
+
+Custom function to render message text content (overrides the function stored in `MessageContext`).
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------ |
+| function | |
+
+### setEditingState
+
+Function to toggle the editing state on a message (overrides the function stored in `MessageContext`).
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### showDetailedReactions
+
+When true, show the reactions list component (overrides the value stored in `MessageContext`).
+
+| Type |
+| ------- |
+| boolean |
+
+### threadList
+
+If true, indicates that the current `MessageList` component is part of a `Thread` (overrides the value stored in `MessageContext`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### unsafeHTML
+
+If true, renders HTML instead of markdown. Posting HTML is only supported server-side (overrides the value stored in `MessageContext`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/message.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/message.mdx
new file mode 100644
index 0000000000..a8d3ad4c3c
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/message.mdx
@@ -0,0 +1,395 @@
+---
+id: message
+title: Message
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+import MessageActionsBoxWithCustomAction from '../../assets/message-actions-box-custom-actions.png';
+
+The `Message` component is a React Context provider that wraps all the logic, functionality, and UI for the individual messages
+displayed in a message list. It provides the [`MessageContext`](../contexts/message-context.mdx) to its children. All the message UI components consume the `MessageContext` and rely on the stored data for their display and interaction.
+
+:::note
+The majority of Stream Chat use cases will not need to use the `Message` component directly. We've documented it here for reference,
+but it's primarily used internally to build up the `MessageContext`. A custom message UI component, added onto `Channel` or
+`MessageList` via the `Message` prop, will consume this context, so `Message` likely doesn't need to be imported into your app.
+:::
+
+## Basic Usage
+
+The `Message` component is used internally as part of the logic of the `MessageList`. The `MessageList` renders a list of
+messages and passes each individual `message` object into a `Message` component. Since the component is used internally by
+default, it only needs to be explicitly imported from the library and used in unique use cases.
+
+## UI Customization
+
+The `Message` component does not inject any UI, so all message customization is handled by the [Message UI](./message-ui.mdx)
+component. The Message UI component is passed as the `Message` prop into either the `Channel` or `MessageList` component.
+
+## Props
+
+###
Required
message
+
+The `StreamChat` message object, which provides necessary data to the underlying UI components.
+
+| Type |
+| ------ |
+| object |
+
+### additionalMessageInputProps
+
+Additional props to be passed to the underlying `MessageInput` component, [available props](../message-input-components/message-input.mdx/#props). It is rendered when editing a message.
+
+| Type |
+| ------ |
+| object |
+
+### autoscrollToBottom
+
+Call this function to keep message list scrolled to the bottom when the message list container scroll height increases (only available in the `VirtualizedMessageList`). An example use case is that upon user's interaction with the application, a new element appears below the last message. In order to keep the newly rendered content visible, the `autoscrollToBottom` function can be called. The container, however, is not scrolled to the bottom, if already scrolled up more than 4px from the bottom. The function is provided by the SDK and is not inteded for customization.
+
+| Type |
+| ---------- |
+| () => void |
+
+### closeReactionSelectorOnClick
+
+If true, picking a reaction from the `ReactionSelector` component will close the selector.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### customMessageActions
+
+An object containing custom message actions (key) and function handlers (value). For each custom action a dedicated item (button) in [`MessageActionsBox`](../message-components/message_ui/#message-actions-box) is rendered. The key is used as a display text inside the button. Therefore, it should not be cryptic but rather bear the end user in mind when formulating it.
+
+```jsx
+const customActions = {
+ 'Copy text': (message) => {
+ navigator.clipboard.writeText(message.text || '');
+ },
+};
+
+;
+```
+
+Custom action item "Copy text" in the message actions box:
+
+
+
+```jsx
+const customActions = {
+ 'Copy text': (message) => {
+ navigator.clipboard.writeText(message.text || '');
+ },
+};
+
+;
+```
+
+Custom action item "Copy text" in the message actions box:
+
+
+
+| Type |
+| ------ |
+| object |
+
+### disableQuotedMessages
+
+If true, disables the ability for users to quote messages.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### endOfGroup
+
+When true, the message is the last one in a group sent by a specific user (only used in the `VirtualizedMessageList`).
+
+| Type |
+| ------- |
+| boolean |
+
+### firstOfGroup
+
+When true, the message is the first one in a group sent by a specific user (only used in the `VirtualizedMessageList`).
+
+| Type |
+| ------- |
+| boolean |
+
+### formatDate
+
+Overrides the default date formatting logic, has access to the original date object.
+
+| Type |
+| ---------------------- |
+| (date: Date) => string |
+
+### getDeleteMessageErrorNotification
+
+Function that returns the notification text to be displayed when a delete message request fails. This function receives the
+deleted [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getFetchReactionsErrorNotification
+
+Function that returns the notification text to be displayed when loading message reactions fails. This function receives the
+current [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getFlagMessageErrorNotification
+
+Function that returns the notification text to be displayed when a flag message request fails. This function receives the
+flagged [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getFlagMessageSuccessNotification
+
+Function that returns the notification text to be displayed when a flag message request succeeds. This function receives the
+flagged [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getMarkMessageUnreadErrorNotification
+
+Function that returns the notification text to be displayed when a mark message unread request fails. This function receives the
+marked [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getMarkMessageUnreadSuccessNotification
+
+Function that returns the notification text to be displayed when a mark message unread request succeeds. This function receives the
+marked [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### getMuteUserErrorNotification
+
+Function that returns the notification text to be displayed when a mute user request fails. This function receives the
+muted [user object](https://getstream.io/chat/docs/javascript/update_users/?language=javascript) as its argument.
+
+| Type |
+| ------------------------------ |
+| (user: UserResponse) => string |
+
+### getMuteUserSuccessNotification
+
+Function that returns the notification text to be displayed when a mute user request succeeds. This function receives the
+muted [user object](https://getstream.io/chat/docs/javascript/update_users/?language=javascript) as its argument.
+
+| Type |
+| ------------------------------ |
+| (user: UserResponse) => string |
+
+### getPinMessageErrorNotification
+
+Function that returns the notification text to be displayed when a pin message request fails. This function receives the
+pinned [message object](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) as its argument.
+
+| Type |
+| ---------------------------------- |
+| (message: StreamMessage) => string |
+
+### groupedByUser
+
+If true, group messages sent by each user (only used in the `VirtualizedMessageList`).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### groupStyles
+
+An array of potential styles to apply to a grouped message (ex: top, bottom, single).
+
+| Type | Options |
+| -------- | ----------------------------------------------- |
+| string[] | '' \| 'middle' \| 'top' \| 'bottom' \| 'single' |
+
+### highlighted
+
+Whether to highlight and focus the message on load. Used internally in the process of [jumping to a message](../contexts/channel-action-context.mdx/#jumptomessage).
+
+| Type |
+| ------- |
+| boolean |
+
+### initialMessage
+
+When true, signifies the message is the parent message in a thread list.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### lastReceivedId
+
+The latest message ID in the current channel.
+
+| Type |
+| ------ |
+| string |
+
+### Message
+
+Custom UI component to display a message.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------- |
+| component | |
+
+### messageActions
+
+Array of allowed message actions (ex: 'edit', 'delete', 'reply'). To disable all actions, provide an empty array.
+
+| Type | Default |
+| ----- | -------------------------------------------------------------------- |
+| array | ['edit', 'delete', 'flag', 'mute', 'pin', 'quote', 'react', 'reply'] |
+
+### messageListRect
+
+DOMRect object linked to the parent wrapper div around the `InfiniteScroll` component.
+
+| Type |
+| ------- |
+| DOMRect |
+
+### onlySenderCanEdit
+
+If true, only the sender of the message has editing privileges. If `false` also channel capability `update-any-message` has to be enabled in order a user can edit other users' messages.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### onMentionsClick
+
+Custom action handler function to run on click of a @mention in a message.
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------------------------------ |
+| function | [ChannelActionContextValue['onMentionsClick']](../contexts/channel-action-context.mdx#onmentionsclick) |
+
+### onMentionsHover
+
+Custom action handler function to run on hover over a @mention in a message.
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------------------------------ |
+| function | [ChannelActionContextValue['onMentionsHover']](../contexts/channel-action-context.mdx#onmentionshover) |
+
+### onUserClick
+
+Custom action handler function to run on click of user avatar.
+
+| Type |
+| ----------------------------------------------------- |
+| (event: React.BaseSyntheticEvent, user: User) => void |
+
+### onUserHover
+
+Custom action handler function to run on hover of user avatar.
+
+| Type |
+| ----------------------------------------------------- |
+| (event: React.BaseSyntheticEvent, user: User) => void |
+
+### openThread
+
+Custom action handler to open a [`Thread`](../core-components/thread.mdx) component.
+
+| Type | Default |
+| -------- | -------------------------------------------------------------------------------------------- |
+| function | [ChannelActionContextValue['openThread']](../contexts/channel-action-context.mdx#openthread) |
+
+### pinPermissions
+
+The user roles allowed to pin messages in various channel types (deprecated in favor of `channelCapabilities`).
+
+| Type | Default |
+| ------ | -------------------------------------------------------------------------------------------------------------------- |
+| object | [defaultPinPermissions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/utils.tsx) |
+
+### readBy
+
+An array of users that have read the current message.
+
+| Type |
+| ----- |
+| array |
+
+### renderText
+
+Custom function to render message text content.
+
+| Type | Default |
+| -------- | ------------------------------------------------------------------------------ |
+| function | |
+
+### retrySendMessage
+
+Custom action handler to retry sending a message after a failed request.
+
+| Type | Default |
+| -------- | -------------------------------------------------------------------------------------------------------- |
+| function | [ChannelActionContextValue['retrySendMessage']](../contexts/channel-action-context.mdx#retrysendmessage) |
+
+### sortReactionDetails
+
+Comparator function to sort the list of reacted users. Should have the same signature as an array's `sort` method.
+
+| Type | Default |
+| ---------------------------------------------------------- | ------------------ |
+| (this: ReactionResponse, that: ReactionResponse) => number | alphabetical order |
+
+### sortReactions
+
+Comparator function to sort reactions. Should have the same signature as the `sort` method for a string array.
+
+| Type | Default |
+| -------------------------------------------------------- | ------------------ |
+| (this: ReactionSummary, that: ReactionSummary) => number | alphabetical order |
+
+### threadList
+
+If true, indicates that the current `MessageList` component is part of a `Thread`.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### unsafeHTML
+
+If true, renders HTML instead of markdown. Posting HTML is only supported server-side.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/reactions.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/reactions.mdx
new file mode 100644
index 0000000000..94711b41e1
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/reactions.mdx
@@ -0,0 +1,266 @@
+---
+id: reactions
+title: Reactions
+---
+
+import ImageShowcase from '@site/src/components/ImageShowcase';
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+import ReactionsListAndReactionSelector from '../../assets/reactions-list-and-reaction-selector.png';
+import ReactionsListModal from '../../assets/reactions-list-modal.png';
+
+The SDK comes with built-in support for adding reactions to messages. The component library provides three default components to enable reaction selection and display:
+
+- [`ReactionSelector`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionSelector.tsx) - allows the connected user to select a reaction on a message
+- [`ReactionsList`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionsList.tsx) (and [`ReactionsListModal`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionsListModal.tsx)) - displays the reactions added to a message
+- [`SimpleReactionsList`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/SimpleReactionsList.tsx) - displays a minimal list of the reactions added to a message
+
+
+
+## Sorting reactions
+
+By default, reactions are sorted alphabetically by type. You can change this behavior by passing the `sortReactions` prop to the `MessageList` (or `VirtualizedMessageList`).
+
+In this example, we sort the reactions in the descending order by the number of users:
+
+```jsx
+function sortByReactionCount(a, b) {
+ return b.reactionCount - a.reactionCount;
+}
+
+
+
+
+
+
+;
+```
+
+Similarly, the `sortReactionDetails` prop can be passed to the `MessageList` (or `VirtualizedMessageList`) to sort the list of reacted users. The default implementation used by the reactions list modal dialog sorts users alphabetically by name.
+
+For better performance, keep the sorting functions memoized with `useCallback`, or declare it in either global or module scope.
+
+## Customization
+
+See [Reactions Customization](../../guides/theming/reactions.mdx) guide on how to change default reactions or how to replace default `ReactionsList` and `ReactionSelector` components.
+
+## ReactionSelector Props
+
+### Avatar
+
+Custom UI component to display a user's avatar.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------- |
+| component | |
+
+### detailedView
+
+If true, shows the user's avatar with the reaction.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### handleReaction
+
+Function that adds/removes a reaction on a message (overrides the function coming from `MessageContext`).
+
+| Type | Default |
+| ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
+| (reactionType: string, event: React.BaseSyntheticEvent) => Promise | [MessageContextValue['handleReaction']](../contexts/message-context.mdx#handlereaction) |
+
+### latest_reactions
+
+An array of the reaction objects to display in the list (overrides `message.latest_reactions` from `MessageContext`).
+
+| Type |
+| ----- |
+| array |
+
+### own_reactions
+
+An array of own reaction objects to display in the list (overrides `message.own_reactions` from `MessageContext`).
+
+| Type |
+| ----- |
+| array |
+
+### reaction_groups
+
+An object that keeps track of the reactions on a message (overrides `message.reaction_groups` from `MessageContext`).
+
+| Type |
+| ---------------------------------------------- |
+| { [key: reactionType]: ReactionGroupResponse } |
+
+### reactionOptions
+
+A list of the currently supported reactions on a message.
+
+| Type | Default |
+| ----- | ------------------------------------------------------------------------------------------------------- |
+| array | |
+
+### reverse
+
+If true, adds a CSS class that reverses the horizontal positioning of the selector.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+## ReactionsList Props
+
+### handleFetchReactions
+
+Function that loads the message reactions (overrides the function coming from `MessageContext`).
+
+| Type | Default |
+| -------------------- | --------------------------------------------------------------------------------------------------- |
+| () => Promise | [MessageContextValue['handleFetchReactions']](../contexts/message-context.mdx#handlefetchreactions) |
+
+The default implementation of `handleFetchReactions`, provided via the [`MessageContext`](../contexts/message-context.mdx#handlefetchreactions), limits the number of loaded reactions to 1200. Use this prop to provide your own loading implementation:
+
+```jsx
+const MyCustomReactionsList = (props) => {
+ const { channel } = useChannelStateContext();
+ const { message } = useMessageContext();
+
+ function fetchReactions() {
+ return channel.getReactions(message.id, { limit: 42 });
+ }
+
+ return ;
+};
+```
+
+### onClick
+
+Custom on click handler for an individual reaction in the list (overrides the function coming from `MessageContext`).
+
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void | [MessageContextValue['onReactionListClick']](../contexts/message-context.mdx#onreactionlistclick) |
+
+### own_reactions
+
+An array of the own reaction objects to distinguish own reactions visually (overrides `message.own_reactions` from `MessageContext`).
+
+| Type |
+| ----- |
+| array |
+
+### reaction_groups
+
+An object that keeps track of the reactions on a message (overrides `message.reaction_groups` from `MessageContext`).
+
+| Type |
+| ---------------------------------------------- |
+| { [key: reactionType]: ReactionGroupResponse } |
+
+### reactionOptions
+
+A list of the currently supported reactions on a message.
+
+| Type | Default |
+| ----- | ------------------------------------------------------------------------------------------------------- |
+| array | |
+
+### reactions
+
+An array of the reaction objects to display in the list (overrides `message.latest_reactions` from `MessageContext`).
+
+| Type |
+| ----- |
+| array |
+
+### reverse
+
+If true, adds a CSS class that reverses the horizontal positioning of the selector.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### sortReactionDetails
+
+Comparator function to sort the list of reacted users. Should have the same signature as an array's `sort` method. This prop overrides the function stored in `MessageContext`.
+
+| Type | Default |
+| ---------------------------------------------------------- | ------------------ |
+| (this: ReactionResponse, that: ReactionResponse) => number | alphabetical order |
+
+### sortReactions
+
+Comparator function to sort reactions. Should have the same signature as an array's `sort` method. This prop overrides the function stored in `MessageContext`.
+
+| Type | Default |
+| -------------------------------------------------------- | ------------------ |
+| (this: ReactionSummary, that: ReactionSummary) => number | alphabetical order |
+
+## SimpleReactionsList Props
+
+### handleFetchReactions
+
+Function that loads the message reactions (overrides the function coming from `MessageContext`).
+
+| Type | Default |
+| -------------------- | --------------------------------------------------------------------------------------------------- |
+| () => Promise | [MessageContextValue['handleFetchReactions']](../contexts/message-context.mdx#handlefetchreactions) |
+
+### handleReaction
+
+Function that adds/removes a reaction on a message (overrides the function coming from `MessageContext`).
+
+| Type | Default |
+| ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
+| (reactionType: string, event: React.BaseSyntheticEvent) => Promise | [MessageContextValue['handleReaction']](../contexts/message-context.mdx#handlereaction) |
+
+### own_reactions
+
+An array of the own reaction objects to distinguish own reactions visually (overrides `message.own_reactions` from `MessageContext`).
+
+| Type |
+| ----- |
+| array |
+
+### reaction_groups
+
+An object that keeps track of the reactions on a message (overrides `message.reaction_groups` from `MessageContext`).
+
+| Type |
+| ---------------------------------------------- |
+| { [key: reactionType]: ReactionGroupResponse } |
+
+### reactionOptions
+
+A list of the currently supported reactions on a message.
+
+| Type | Default |
+| ----- | -------------------------------------------------------------------------------------------------------------- |
+| array | |
+
+### reactions
+
+An array of the reaction objects to display in the list (overrides `message.latest_reactions` from `MessageContext`).
+
+| Type |
+| ----- |
+| array |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/render-text.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/render-text.mdx
new file mode 100644
index 0000000000..bf457b6c9b
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/render-text.mdx
@@ -0,0 +1,139 @@
+---
+id: render-text
+title: renderText function
+---
+
+The `renderText` function is a core piece of functionality, which handles how the text of our message is going to be formatted/look like. The default `renderText` function parses a markdown string and outputs a `ReactElement`. Under the hood, the output is generated by the `ReactMarkdown` component from [react-markdown library](https://github.com/remarkjs/react-markdown). The component transforms the markdown to `ReactElement` by using [`remark` parser](https://github.com/remarkjs/remark/tree/main) and [`remark`](https://github.com/remarkjs/remark/blob/main/doc/plugins.md) and [`rehype`](https://github.com/rehypejs/rehype/blob/main/doc/plugins.md) plugins.
+
+The default `remark` plugins used by SDK are:
+
+1. [`remark-gfm`](https://github.com/remarkjs/remark-gfm) - a third party plugin to add GitHub-like markdown support
+
+The default `rehype` plugins (both specific to this SDK) are:
+
+1. plugin to render user mentions
+2. plugin to render emojis
+
+## Overriding Defaults
+
+### Custom `renderText` Function
+
+If you don't want your chat implementation to support markdown syntax by default you can override the default behaviour by creating a custom `renderText` function which returns a React node and passing it down to the [`MessageList`](../core-components/message-list.mdx) or [`MessageSimple`](../message-components/message-ui.mdx) component via `renderText` property.
+
+For this particular example we'll create a very primitive one which takes the message text passed down to it as a first argument and returns it wrapped in `span` element:
+
+```tsx
+import { MessageList } from 'stream-chat-react';
+
+const customRenderText = (text) => {
+ return {text};
+};
+
+export const WrappedMessageList = () => ;
+```
+
+Here's also an example with [`VirtualizedMessageList`](../core-components/virtualized-list.mdx) which currently does not accept `renderText` directly:
+
+```tsx
+import { VirtualizedMessageList, MessageSimple } from 'stream-chat-react';
+
+const customRenderText = (text) => {
+ return {text};
+};
+
+const CustomMessage = (props) => ;
+
+export const WrappedVirtualizedMessageList = () => (
+
+);
+```
+
+### Custom Element Rendering
+
+If you feel like the default output is sufficient, but you'd like to adjust how certain [ReactMarkdown components](https://github.com/remarkjs/react-markdown#appendix-b-components) look like (like `strong` element generated by typing \*\*strong\*\*) you can do so by passing down options to a third argument of the default `renderText` function:
+
+:::note
+Types `mention` and `emoji` are special case component types generated by our SDK's custom rehype plugins.
+:::
+
+```tsx
+import { renderText } from 'stream-chat-react';
+
+const CustomStrongComponent = ({ children }) => (
+ {children}
+);
+
+const CustomMentionComponent = ({ children, node: { mentionedUser } }) => (
+
+ {children}
+
+);
+
+export const WrappedMessageList = () => (
+
+ renderText(text, mentionedUsers, {
+ customMarkDownRenderers: { strong: CustomStrongComponent, mention: CustomMentionComponent },
+ })
+ }
+ />
+);
+```
+
+### Custom Remark and Rehype Plugins
+
+If you would like to extend the array of plugins used to parse the markdown, you can provide your own lists of remark resp. rehype plugins. The logic that determines what plugins are used and in which order can be specified in custom `getRehypePlugins` and `getRemarkPlugins` functions. These receive the default array of rehype and remark plugins for further customization. Both custom functions ought to be passed to the third `renderText` parameter. An example follows:
+
+:::note
+It is important to understand what constitutes a rehype or remark plugin. A good start is to learn about the library called [`react-remark`](https://github.com/remarkjs/react-remark) which is used under the hood in our `renderText` function.
+:::
+
+```tsx
+import { renderText, RenderTextPluginConfigurator } from 'stream-chat-react';
+import { customRehypePlugin } from './rehypePlugins';
+import { customRemarkPlugin } from './remarkPlugins';
+
+const getRehypePlugins: RenderTextPluginConfigurator = (plugins) => {
+ return [customRehypePlugin, ...plugins];
+};
+const getRemarkPlugins: RenderTextPluginConfigurator = (plugins) => {
+ return [customRemarkPlugin, ...plugins];
+};
+
+const customRenderText = (text, mentionedUsers) =>
+ renderText(text, mentionedUsers, {
+ getRehypePlugins,
+ getRemarkPlugins,
+ });
+
+const WrappedMessageList = () => ;
+```
+
+It is also possible to define your custom set of allowed tag names for the elements rendered from the parsed markdown. To perform the tree transformations, you will need to use libraries like [`unist-builder`](https://github.com/syntax-tree/unist-builder) to build the trees and [`unist-util-visit`](https://github.com/syntax-tree/unist-util-visit-parents) or [`hast-util-find-and-replace`](https://github.com/syntax-tree/hast-util-find-and-replace) to traverse the tree:
+
+```tsx
+import { findAndReplace } from 'hast-util-find-and-replace';
+import { u } from 'unist-builder';
+import {
+ defaultAllowedTagNames,
+ renderText,
+ RenderTextPluginConfigurator,
+} from 'stream-chat-react';
+
+// wraps every letter b in tags
+const customTagName = 'xxx';
+const replace = (match) => u('element', { tagName: customTagName }, [u('text', match)]);
+const customRehypePlugin = () => (tree) => findAndReplace(tree, /b/, replace);
+
+const getRehypePlugins: RenderTextPluginConfigurator = (plugins) => {
+ return [customRehypePlugin, ...plugins];
+};
+
+const customRenderText = (text, mentionedUsers) =>
+ renderText(text, mentionedUsers, {
+ allowedTagNames: [...defaultAllowedTagNames, customTagName],
+ getRehypePlugins,
+ });
+
+const WrappedMessageList = () => ;
+```
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/ui-components.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/ui-components.mdx
new file mode 100644
index 0000000000..944ef7a029
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-components/ui-components.mdx
@@ -0,0 +1,505 @@
+---
+id: ui-components
+title: UI Components
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+As described in the [Message UI](./message-ui.mdx) section, our default component is a combination of various UI subcomponents. We export all the building blocks of `MessageSimple`, so a custom Message UI
+component can be built in a similar way. Check out the [Message UI Customization](../../guides/theming/message-ui.mdx) section for an example.
+
+The following UI components are available for use:
+
+- [`MessageActions`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageActions/MessageActions.tsx) - displays the available actions on a message (ex: edit, flag, pin)
+
+- [`MessageDeleted`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageDeleted.tsx) - renders when
+ `message.type` is `deleted`
+
+- [`MessageOptions`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageOptions.tsx) - on hover,
+ shows the available options on a message (i.e., react, reply, actions)
+
+- [`MessageRepliesCountButton`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageRepliesCountButton.tsx) - displays
+ the number of threaded replies on a message
+
+- [`MessageStatus`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageStatus.tsx) - displays message
+ delivery status and the users who have read the message
+
+- [`MessageText`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageText.tsx) - formats and renders
+ the message text in markdown using [react-markdown](https://www.npmjs.com/package/react-markdown)
+
+- [`MessageTimestamp`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageTimestamp.tsx) - shows the
+ sent time of a message
+
+- [`MML`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MML/MML.tsx) - a wrapper component around the
+ [MML React](https://www.npmjs.com/package/mml-react) library
+
+- [`QuotedMessage`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/QuotedMessage.tsx) - shows a quoted
+ message UI wrapper when the sent message quotes a previous message
+
+- [`Timestamp`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/Timestamp.tsx) - formats and displays a date,
+ used by `MessageTimestamp` and for edited message timestamps.
+
+- [`MessageBouncePrompt`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageBounce/MessageBouncePrompt.tsx) -
+ presents options to deal with a message that got bounced by the moderation rules.
+
+Besides the above there are also components that render reaction list and reaction selector. You can find more about them in [dedicated chapter](./reactions.mdx).
+
+## MessageActions Props
+
+### ActionsIcon
+
+Custom component rendering the icon used in message actions button. This button invokes the message actions menu.
+
+| Type | Default |
+| --------------------- | --------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### customWrapperClass
+
+Custom CSS class to be added to the `div` wrapping the component.
+
+| Type |
+| ------ |
+| string |
+
+### getMessageActions
+
+Function that returns an array of the allowed actions on a message by the currently connected user (overrides the value from `MessageContext`).
+
+| Type |
+| ------------------------- |
+| () => MessageActionsArray |
+
+### handleDelete
+
+Function that removes a message from the current channel (overrides the value from `MessageContext`).
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleFlag
+
+Function that flags a message (overrides the value from `MessageContext`).
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleMarkUnread
+
+Function that marks the message and all the following messages as unread in a channel.
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handleMute
+
+Function that mutes the sender of a message (overrides the value from `MessageContext`).
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### handlePin
+
+Function that pins a message in the current channel (overrides the value from `MessageContext`).
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### inline
+
+If true, renders the wrapper component as a `span`, not a `div`.
+
+| Type | Default |
+| ------ | ------- |
+| string | false |
+
+### message
+
+The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value from `MessageContext`).
+
+| Type |
+| ------ |
+| object |
+
+### messageWrapperRef
+
+React mutable ref placed on the message root `div`. It is forwarded by `MessageOptions` down to `MessageActions` ([see the example](../../guides/theming/message-ui.mdx)).
+
+| Type |
+| -------------------------------- |
+| React.RefObject |
+
+### mine
+
+Function that returns whether the message was sent by the connected user.
+
+| Type |
+| ------------- |
+| () => boolean |
+
+## MessageDeleted Props
+
+###
Required
message
+
+The `StreamChat` message object, which provides necessary data to the underlying UI components.
+
+| Type |
+| ------ |
+| object |
+
+## MessageOptions Props
+
+### ActionsIcon
+
+Custom component rendering the icon used in message actions button. This button invokes the message actions menu.
+
+| Type | Default |
+| --------------------- | --------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### displayReplies
+
+If true, show the `ThreadIcon` and enable navigation into a `Thread` component.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### handleOpenThread
+
+Function that opens a [`Thread`](../core-components/thread.mdx) on a message (overrides the value from `MessageContext`).
+
+| Type |
+| ----------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => Promise \| void |
+
+### messageWrapperRef
+
+React mutable ref that can be placed on the message root `div`. `MessageOptions` component forwards this prop to [`MessageActions`](#messageactions-props) component ([see the example](../../guides/theming/message-ui.mdx)).
+
+| Type |
+| -------------------------------- |
+| React.RefObject |
+
+### ReactionIcon
+
+Custom component rendering the icon used in a message options button invoking reactions selector for a given message.
+
+| Type | Default |
+| --------------------- | ---------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### theme
+
+Theme string to be added to CSS class names.
+
+```jsx
+
+```
+
+| Type | Default |
+| ------ | -------- |
+| string | 'simple' |
+
+### ThreadIcon
+
+Custom component rendering the icon used in a message options button opening thread.
+
+| Type | Default |
+| --------------------- | -------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+## MessageRepliesCountButton Props
+
+### labelPlural
+
+If supplied, adds custom text to the end of a multiple replies message.
+
+```jsx
+const pluralReplyText = `${reply_count} ${labelPlural}`;
+```
+
+| Type |
+| ------ |
+| string |
+
+### labelSingle
+
+If supplied, adds custom text to the end of a single reply message.
+
+```jsx
+const singleReplyText = `1 ${labelSingle}`;
+```
+
+| Type |
+| ------ |
+| string |
+
+### onClick
+
+Function to navigate into an existing thread on a message.
+
+| Type |
+| ----------------------- |
+| React.MouseEventHandler |
+
+### reply_count
+
+The amount of replies (i.e., threaded messages) on a message.
+
+| Type |
+| ------ |
+| number |
+
+## MessageStatus Props
+
+### Avatar
+
+Custom UI component to display a user's avatar (overrides the value from `ComponentContext`).
+
+| Type | Default |
+| --------- | ---------------------------------------------------------- |
+| component | |
+
+### messageType
+
+Message type string to be added to CSS class names.
+
+```jsx
+
+```
+
+| Type | Default |
+| ------ | -------- |
+| string | 'simple' |
+
+### tooltipUserNameMapper
+
+Allows to customize the username(s) that appear on the message status tooltip.
+
+| Type | Default |
+| ------------------------------ | ------------------- | --- | ------- |
+| (user: UserResponse) => string | (user) => user.name | | user.id |
+
+This prop's implementation is not provided out of the box by the SDK. See below for a customization example:
+
+```tsx
+const CustomMessageStatus = (props: MessageStatusProps) => {
+ const allCapsUserName = useCallback(
+ (user) => (user.name || user.id).toUpperCase(),
+ [],
+ );
+ return ;
+};
+
+// Sort in reverse order to avoid auto-selecting unread channel
+const sort: ChannelSort = { last_updated: 1 };
+const WrappedConnectedUser = ({ token, userId }: Omit) => (
+
+
+
+
+
+
+
+
+
+
+);
+```
+
+## MessageText Props
+
+### customInnerClass
+
+If provided, replaces the CSS class name placed on the component's inner `div` container.
+
+| Type |
+| ------ |
+| string |
+
+### customWrapperClass
+
+If provided, adds a CSS class name to the component's outer `div` container.
+
+| Type |
+| ------ |
+| string |
+
+### message
+
+The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value stored in `MessageContext`).
+
+| Type |
+| ------ |
+| object |
+
+### theme
+
+Theme string to be added to CSS class names.
+
+```jsx
+
+```
+
+| Type | Default |
+| ------ | -------- |
+| string | 'simple' |
+
+## MessageTimestamp Props
+
+This component has all of the same props as the underlying [`Timestamp`](#timestamp-props), except that instead of `timestamp` it uses `message.created_at` value from the `MessageContext`.
+
+### calendar
+
+If true, call the `Day.js` calendar function to get the date string to display.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### customClass
+
+If provided, adds a CSS class name to the component's outer `time` container.
+
+```jsx
+
+```
+
+| Type |
+| ------ |
+| string |
+
+### format
+
+If provided, overrides the default timestamp format.
+
+| Type | Default |
+| ------ | ------- |
+| string | 'h:mmA' |
+
+### message
+
+The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value from `MessageContext`).
+
+| Type |
+| ------ |
+| object |
+
+## MML Props
+
+###
Required
source
+
+The MML source string to be rendered by the `mml-react` library.
+
+| Type |
+| ------ |
+| string |
+
+### actionHandler
+
+The submit handler function for MML actions.
+
+| Type |
+| ------------------------------------------ |
+| (data: Record) => unknown |
+
+### align
+
+The side of the message list to render MML components.
+
+| Type | Default |
+| ----------------- | ------- |
+| 'left' \| 'right' | 'right' |
+
+## QuotedMessage Props
+
+:::note
+`QuotedMessage` only consumes context and does not accept any optional props.
+:::
+
+## MessageBouncePrompt props
+
+This component is rendered in a modal dialog for messages that got bounced by the moderation rules.
+
+### MessageBouncePrompt children
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------- |
+| ReactNode | Localized string for "This message did not meet our content guidelines" |
+
+Use this prop to easily override the text displayed in the modal dialog for the bounced messages, without fully implementing a custom `MessageBouncePrompt` component:
+
+```jsx
+import { MessageBouncePrompt } from 'stream-react-chat';
+
+function MyCustomMessageBouncePrompt(props) {
+ return My custom text;
+}
+```
+
+Then override the default `MessageBouncePrompt` component with your custom one:
+
+```jsx
+
+
+
+
+
+
+
+
+```
+
+If you need deeper customization, refer to the [`MessageBounceContext`](../contexts/message-bounce-context.mdx) documentation.
+
+### onClose
+
+The Message UI component will pass this callback to close the modal dialog `MessageBouncePrompt` are rendered in.
+
+| Type |
+| ----------------- |
+| ReactEventHandler |
+
+## Timestamp props
+
+### calendar
+
+If true, call the `Day.js` calendar function to get the date string to display.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### customClass
+
+If provided, adds a CSS class name to the component's outer `time` container.
+
+```jsx
+
+```
+
+| Type |
+| ------ |
+| string |
+
+### format
+
+If provided, overrides the default timestamp format.
+
+| Type | Default |
+| ------ | ------- |
+| string | 'h:mmA' |
+
+### timestamp
+
+Either an ISO string with a date, or a Date object with a date to display.
+
+| Type |
+| -------------- |
+| Date \| string |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/audio-recorder.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/audio-recorder.mdx
new file mode 100644
index 0000000000..11803a087c
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/audio-recorder.mdx
@@ -0,0 +1,127 @@
+---
+id: audio_recorder
+title: Audio Recorder
+---
+
+import RecordingPermissionDeniedNotification from '../../assets/audio-recorder-permission-denied-notification.png';
+import StartRecordingButton from '../../assets/audio-recorder-start-recording-button.png';
+import AudioRecorderRecording from '../../assets/audio-recorder-recording.png';
+import AudioRecorderPaused from '../../assets/audio-recorder-paused.png';
+import AudioRecorderStopped from '../../assets/audio-recorder-stopped.png';
+
+Recording voice messages is possible by enabling audio recording on `MessageInput` component.
+
+```jsx
+
+```
+
+Once enabled, the `MessageInput` UI will render a `StartRecordingAudioButton`.
+
+
+
+The default implementation of `StartRecordingAudioButton` button can be replaced with custom implementation through the `Channel` component context:
+
+```jsx
+
+```
+
+Click on the recording button will replace the message composer UI with `AudioRecorder` component UI.
+
+
+
+The default `AudioRecorder` component can be replaced by a custom implementation through the `Channel` component context:
+
+```jsx
+
+```
+
+## Browser permissions
+
+Updates in `'microphone'` browser permission are observed and handled. If a user clicks the start recording button and the `'microphone'` permission state is `'denied'`, then a notification dialog `RecordingPermissionDeniedNotification` is rendered.
+
+
+
+The dialog can be customized by passing own component to `Channel` component context:
+
+```jsx
+
+```
+
+## Audio recorder states
+
+The `AudioRecorder` UI switches between the following states
+
+**1. Recording state**
+
+The recording can be paused or stopped.
+
+
+
+**2. Paused state**
+
+The recording can be stopped or resumed.
+
+
+
+**3. Stopped state**
+
+The recording can be played back before it is sent.
+
+
+
+At any time, the recorder allows to cancel the recording and return to message composer UI by clicking the button with the bin icon.
+
+## The message sending behavior
+
+The resulting recording is always uploaded on the recording completion. The recording is completed when user stops the recording and confirms the completion with a send button.
+
+The behavior, when a message with the given recording attachment is sent, however, can be controlled through the `asyncMessagesMultiSendEnabled` configuration prop on `MessageInput`.
+
+```jsx
+
+```
+
+And so the message is sent depending on `asyncMessagesMultiSendEnabled` value as follows:
+
+| `asyncMessagesMultiSendEnabled` value | Impact |
+| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `false` (default behavior) | immediately after a successful upload at one step on completion. In that case as a single attachment (voice recording only), no-text message is submitted |
+| `true` | upon clicking the `SendMessage` button if `asyncMessagesMultiSendEnabled` is enabled |
+
+:::note
+Enabling `asyncMessagesMultiSendEnabled` would allow users to record multiple voice messages or accompany the voice recording with text or other types of attachments.
+:::
+
+## Audio recorder controller
+
+The components consuming the `MessageInputContext` can access the recording state through the `recordingController`:
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const Component = () => {
+ const {
+ recordingController: {
+ completeRecording,
+ permissionState,
+ recorder,
+ recording,
+ recordingState,
+ },
+ } = useMessageInputContext();
+};
+```
+
+The controller exposes the following API:
+
+| Property | Description |
+| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `completeRecording` | A function that allows to stop the recording and upload it the back-end and submit the message if `asyncMessagesMultiSendEnabled` is disabled |
+| `permissionState` | One of the values for microphone permission: `'granted'`, `'prompt'`, `'denied'` |
+| `recorder` | Instance of `MediaRecorderController` that exposes the API to control the recording states (`start`, `pause`, `resume`, `stop`, `cancel`) |
+| `recording` | Generated attachment of type `voiceRecording`. This is available once the recording is stopped. |
+| `recordingState` | One of the values `'recording'`, `'paused'`, `'stopped'`. Useful to reflect the changes in `recorder` state in the UI. |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/emoji-picker.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/emoji-picker.mdx
new file mode 100644
index 0000000000..e8c5fbd56f
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/emoji-picker.mdx
@@ -0,0 +1,66 @@
+---
+id: emoji-picker
+title: Emoji Picker
+---
+
+The SDK comes with the `EmojiPicker` component which is built on top of the [`emoji-mart`](https://github.com/missive/emoji-mart) and is disabled by default but can be easily enabled by installing [`emoji-mart` related packages](https://github.com/GetStream/stream-chat-react/blob/master/package.json#L100-L102), importing the component from `stream-chat-react/emojis` and forwarding it to the [`Channel`](../core-components/channel.mdx) component, see the [_Basic Usage_ section](../../guides/customization/emoji-picker.mdx#basic-usage) of the customization guide for more information.
+
+
+
+## Props
+
+### ButtonIconComponent
+
+The icon component to be rendered within open/close button.
+
+| Type | Default |
+| ------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
+| React.ComponentType | [`EmojiPickerIcon`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/icons.tsx#L38-L49) |
+
+### buttonClassName
+
+The `className` to be used in the open/close button instead of the default one.
+
+| Type | Default |
+| ------ | --------------------------------- |
+| string | 'str-chat\_\_emoji-picker-button' |
+
+### pickerContainerClassName
+
+The `className` to be used in the picker container element instead of the default one.
+
+| Type | Default |
+| ------ | ----------------------------------------------------- |
+| string | 'str-chat\_\_message-textarea-emoji-picker-container' |
+
+### wrapperClassName
+
+The `className` to be used in the wrapper element of the whole component instead of the default one.
+
+| Type | Default |
+| ------ | ------------------------------------------- |
+| string | 'str-chat\_\_message-textarea-emoji-picker' |
+
+### closeOnEmojiSelect
+
+The flag which specifies whether the emoji picker component should close after an emoji has been selected.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### pickerProps
+
+Untyped [properties](https://github.com/missive/emoji-mart/tree/v5.5.2#options--props) to be passed down to the [emoji-mart `Picker`](https://github.com/missive/emoji-mart/tree/v5.5.2#-picker) component.
+
+| Type |
+| --------------------------------------------------------------------------- |
+| Partial<{ theme: 'auto' \| 'light' \| 'dark' } & Record\> |
+
+### popperOptions
+
+[React Popper options](https://popper.js.org/docs/v2/constructors/#options) to be passed down to the [react-popper `usePopper`](https://popper.js.org/react-popper/v2/hook/) hook.
+
+| Type |
+| ----------------- |
+| Partial |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/input-ui.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/input-ui.mdx
new file mode 100644
index 0000000000..52e664e9c4
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/input-ui.mdx
@@ -0,0 +1,64 @@
+---
+id: input_ui
+title: Input UI
+---
+
+The Input UI component consumes the [`MessageInputContext`](../contexts/message-input-context.mdx) and handles the display and functionality
+for the message input in a channel. The Input UI component is typically a combination of subcomponents that each consume
+context and are responsible for one aspect of the message input (ex: text input or emoji picker).
+
+## Basic Usage
+
+To use your own custom Input UI component, utilize the `Input` prop on either the `Channel` or `MessageInput` component. Adding the
+prop to `Channel` will inject your component into the `ComponentContext` and adding to `MessageInput` will override
+any value stored in context. So if both props are added, the value delivered to `MessageInput` will take precedence.
+
+```jsx
+const CustomInput = () => {
+ // consume `MessageInputContext` and render custom component here
+};
+
+
+
+
+
+
+;
+```
+
+:::note
+If an `Input` prop is not provided, the `MessageInput` component will render [`MessageInputFlat`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx)
+as its Input UI component by default.
+:::
+
+## UI Customization
+
+`MessageInputFlat` is designed to serve as a guide in helping build a custom Input UI component. At a high level, this
+pre-built, default component wraps a subset of composable components that each serve specific logic and design-based purposes.
+
+For example, if we strip `MessageInputFlat` down to its core pieces, the component return resembles the following snippet:
+
+```jsx
+
+
+
+
+
+
+
+
+
+
+```
+
+We recommend building an Input UI component in a similar way. You can mix and match any of the UI subcomponents and arrange
+in a layout that meets your design specifications. All of these UI subcomponents are exported by the library and may be used within
+your custom Input UI component. Each subcomponent consumes the `MessageInputContext` and requires no/minimal props to run.
+
+For a detailed example, review the [Input UI Customization](../../guides/theming/input-ui.mdx) example.
+
+## Props
+
+:::note
+The Input UI component only consumes context and does not accept any optional props.
+:::
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/message-input.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/message-input.mdx
new file mode 100644
index 0000000000..3dfebe3b75
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/message-input.mdx
@@ -0,0 +1,272 @@
+---
+id: message_input
+title: MessageInput
+---
+
+The `MessageInput` component is a React Context provider that wraps all of the logic, functionality, and UI for the message input
+displayed in a channel. It provides the [`MessageInputContext`](../contexts/message-input-context.mdx) to its children. All of
+the input UI components consume the `MessageInputContext` and rely on the stored data for their display and interaction.
+
+## Basic Usage
+
+As a context consumer, the `MessageInput` component must be rendered as a child of the `Channel` component. `MessageInput` has
+no required props and calls custom hooks to assemble the context values loaded into the `MessageInputContext` and provided
+to its children.
+
+:::note
+If a custom input is not provided via the `Input` prop, [`MessageInputFlat`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx)
+will be used by default.
+:::
+
+```jsx
+
+
+
+
+
+
+
+```
+
+## UI Customization
+
+The `MessageInput` component does not inject any UI, so all input customization is handled by the [Input UI](./input-ui.mdx)
+component. The Input UI component is passed as the `Input` prop into either the `Channel` or `MessageInput` component.
+
+## Props
+
+### additionalTextareaProps
+
+Additional props to be passed to the underlying `AutoCompleteTextarea` component, [available props](https://www.npmjs.com/package/react-textarea-autosize).
+
+| Type |
+| ------ |
+| object |
+
+### clearEditingState
+
+Function to clear the editing state while editing a message.
+
+| Type |
+| ---------- |
+| () => void |
+
+### closeEmojiPickerOnClick
+
+If true, picking an emoji from the `EmojiPicker` component will close the picker.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### disabled
+
+If true, disables the text input.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### disableMentions
+
+If true, the suggestion list will not display and autocomplete @mentions.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### doFileUploadRequest
+
+Function to override the default file upload request.
+
+| Type |
+| ----------------------------------------------------------------------------- |
+| (file: FileUpload['file'], channel: Channel) => Promise |
+
+### doImageUploadRequest
+
+Function to override the default image upload request.
+
+| Type |
+| ------------------------------------------------------------------------------ |
+| (file: ImageUpload['file'], channel: Channel) => Promise |
+
+### errorHandler
+
+Custom error handler function to be called with a file/image upload fails.
+
+| Type |
+| ------------------------------------------------------------------------------------------------- |
+| (error: Error, type: string, file: (FileUpload \| ImageUpload)['file'] & { id?: string }) => void |
+
+### focus
+
+If true, focuses the text input on component mount.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### getDefaultValue
+
+Generates the default value for the underlying textarea element. The function's return value takes precedence over `additionalTextareaProps.defaultValue`.
+
+| Type |
+| ------------------------- |
+| () => string \| string[]) |
+
+### grow
+
+If true, expands the text input vertically for new lines.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### hideSendButton
+
+Allows to hide MessageInput's send button. Used by `MessageSimple` to hide the send button in `EditMessageForm`.
+
+| Type | Default |
+|---------|---------|
+| boolean | false |
+
+### Input
+
+Custom UI component handling how the message input is rendered.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------- |
+| component | [MessageInputFlat](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx) |
+
+### maxRows
+
+Max number of rows the underlying `textarea` component is allowed to grow.
+
+| Type | Default |
+| ------ | ------- |
+| number | 10 |
+
+### mentionAllAppUsers
+
+If true, the suggestion list will search all app users for an @mention, not just current channel members/watchers.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### mentionQueryParams
+
+Object containing filters/sort/options overrides for an @mention user query.
+
+| Type |
+| ------ |
+| object |
+
+### message
+
+If provided, the existing message will be edited on submit.
+
+| Type |
+| ------ |
+| object |
+
+### noFiles
+
+If true, disables file uploads for all attachments except for those with type 'image'.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### overrideSubmitHandler
+
+Function to override the default submit handler.
+
+| Type |
+| --------------------------------------------- |
+| (message: object, channelCid: string) => void |
+
+### parent
+
+When replying in a thread, the parent message object.
+
+| Type |
+| ------ |
+| object |
+
+### publishTypingEvent
+
+If true, triggers typing events on text input keystroke.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | true |
+
+### shouldSubmit
+
+Currently, `Enter` is the default submission key and `Shift`+`Enter` is the default combination for the new line.
+If specified, this function overrides the default behavior specified previously.
+
+| Type |
+| --------------------------------- |
+| (event: KeyboardEvent) => boolean |
+
+:::note
+
+### Migration from versions older than `9.0.0`
+
+Property **keycodeSubmitKeys** has been replaced by **shouldSubmit** and thus is no longer supported.
+If you had custom key codes specified like so:
+
+```ts
+keyCodeSubmitKeys={[[16,13], [57], [48]]} // submission keys are Shift+Enter, 9, and 0
+```
+
+then that would newly translate to:
+
+```ts
+const shouldSubmit = (event) =>
+ (event.key === 'Enter' && event.shiftKey) || event.key === '9' || event.key === '0';
+
+...
+
+shouldSubmit={shouldSubmit}
+```
+
+:::
+
+### urlEnrichmentConfig
+
+Configuration parameters for link previews to customize:
+
+- link discovery,
+- what actions to execute on link preview card dismissal,
+- what is the debounce interval after which the link enrichment queries are run
+
+It also allows us to disable querying and rendering the link previews with `enrichURLForPreview` parameter.
+
+| Type |
+| ------------------- |
+| URLEnrichmentConfig |
+
+```typescript
+export type URLEnrichmentConfig = {
+ /** Number of milliseconds to debounce firing the URL enrichment queries when typing. The default value is 1500(ms). */
+ debounceURLEnrichmentMs?: number;
+ /** Allows for toggling the URL enrichment and link previews in `MessageInput`. By default, the feature is disabled. */
+ enrichURLForPreview?: boolean;
+ /** Custom function to identify URLs in a string for later generation of link previews */
+ findURLFn?: (text: string) => string[];
+ /** Custom function to react to link preview dismissal */
+ onLinkPreviewDismissed?: (linkPreview: LinkPreview) => void;
+};
+```
+
+### useMentionsTransliteration
+
+If true, will use an optional dependency to support transliteration in the input for mentions. See: https://github.com/sindresorhus/transliterate
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/ui-components.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/ui-components.mdx
new file mode 100644
index 0000000000..10129bc661
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/message-input-components/ui-components.mdx
@@ -0,0 +1,162 @@
+---
+id: ui_components
+title: UI Components
+---
+
+As described in the [Input UI](./input-ui.mdx) section, our default [`MessageInputFlat`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx)
+component is a combination of various UI subcomponents. We export all the building blocks of `MessageInputFlat`, so a custom Input UI
+component can be built in a similar way. Check out the [Input UI Customization](../../guides/theming/input-ui.mdx) section for an example.
+
+The following UI components are available for use:
+
+- [`ChatAutoComplete`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChatAutoComplete/ChatAutoComplete.tsx) - wrapper
+ component that provides data and functionality to the underlying `textarea` component imported from [react-textarea-autosize](https://www.npmjs.com/package/react-textarea-autosize)
+
+- [`DefaultTriggerProvider`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/DefaultTriggerProvider.tsx) - provides
+ the default autocomplete triggers (i.e., `/`, `@`, and `:`) to the `MessageInput` children
+
+- [`EmojiPicker`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/EmojiPicker.tsx) - picker
+ component for selecting an emoji
+
+- [`LinkPreviewList`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/LinkPreviewList.tsx) - component rendering scraped link data in a preview cards
+
+- [`QuotedMessagePreview`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/QuotedMessagePreview.tsx) - displays
+ a UI wrapper around the `MessageInput` when an existing message is being quoted
+
+- [`SendButton`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/icons.tsx) - on click, sends a
+ message to the currently active channel
+
+- [`UploadsPreview`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/UploadsPreview.tsx) - displays
+ a list of uploaded files prior to sending the message
+
+## ChatAutoComplete Props
+
+### handleSubmit
+
+Function to override the default submit handler on the underlying `textarea` component.
+
+| Type | Default |
+| ----------------------------------------- | ---------------------------------------------------------------------------------------------- |
+| (event: React.BaseSyntheticEvent) => void | [MessageInputContextValue['handleSubmit']](../contexts/message-input-context.mdx#handlesubmit) |
+
+### onBlur
+
+Function to run on blur of the underlying `textarea` component.
+
+| Type |
+| --------------------------------------------- |
+| React.FocusEventHandler |
+
+### onChange
+
+Function to override the default onChange behavior on the underlying `textarea` component.
+
+| Type | Default |
+| ---------------------------------------------- | -------------------------------------------------------------------------------------- |
+| React.ChangeEventHandler | [MessageInputContextValue['onChange']](../contexts/message-input-context.mdx#onchange) |
+
+### onFocus
+
+Function to run on focus of the underlying `textarea` component.
+
+| Type |
+| --------------------------------------------- |
+| React.FocusEventHandler |
+
+### onPaste
+
+Function to override the default onPaste behavior on the underlying `textarea` component.
+
+| Type | Default |
+| ----------------------------------------------------------- | ------------------------------------------------------------------------------------ |
+| (event: React.ClipboardEvent) => void | [MessageInputContextValue['onPaste']](../contexts/message-input-context.mdx#onpaste) |
+
+### placeholder
+
+Placeholder for the underlying `textarea` component.
+
+| Type | Default |
+| ------ | ------------------- |
+| string | 'Type your message' |
+
+### rows
+
+The initial number of rows for the underlying `textarea` component.
+
+| Type | Default |
+| ------ | ------- |
+| number | 1 |
+
+### value
+
+The text value of the underlying `textarea` component.
+
+| Type | Default |
+| ------ | ------------------------------------------------------------------------------ |
+| string | [MessageInputContextValue['text']](../contexts/message-input-context.mdx#text) |
+
+### wordReplace
+
+Function to override the default emojiReplace behavior on the `wordReplace` prop of the `textarea` component.
+
+| Type |
+| -------------------------------------------------------- |
+| (word: string, emojiIndex?: NimbleEmojiIndex) =\> string |
+
+## DefaultTriggerProvider
+
+:::note
+The `DefaultTriggerProvider` component does not take any props and by default sets the `autocompleteTriggers` in `MessageInputContext` as
+`/` (commands), `@` (mentions), and `:` (emojis).
+
+`DefaultTriggerProvider` wraps the [Input UI](./input-ui.mdx) component and doesn't
+need to be explicitly added to your app unless you wish to change trigger settings. To change trigger settings, provide a custom trigger
+provider component to the `Channel` component via the `TriggerProvider` prop. An example can be found in the
+[Message Input UI](../../guides/theming/input-ui.mdx) customization section.
+:::
+
+## EmojiPicker Props
+
+### small
+
+If true, updates the CSS class name of the `div` container and renders a smaller version of the picker.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+## LinkPreviewList Props
+
+###
Required
linkPreviews
+
+An array of `LinkPreview` objects - a union type of `LinkPreviewState` and `OGAttachment`. The array is derived from `linkPreviews` Map of `MessageInputContextValue`.
+
+| Type |
+| ------------- |
+| LinkPreview[] |
+
+## QuotedMessagePreview Props
+
+###
Required
quotedMessage
+
+The existing message to be quoted by the next sent message.
+
+| Type |
+| ------ |
+| object |
+
+## SendButton Props
+
+###
Required
sendMessage
+
+Function to send a message to the currently active channel.
+
+| Type |
+| ----------------------------------------- |
+| (event: React.BaseSyntheticEvent) => void |
+
+## UploadsPreview
+
+:::note
+`UploadsPreview` only consumes context and does not accept any optional props.
+:::
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/avatar.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/avatar.mdx
new file mode 100644
index 0000000000..4ef2d78747
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/avatar.mdx
@@ -0,0 +1,109 @@
+---
+id: avatar
+title: Avatar
+---
+
+The `Avatar` component displays a user's image, with fallback to the first letter of the optional name prop.
+
+## Basic Usage
+
+A typical use case for the `Avatar` component would be to import and use in your custom components that will completely override a header component, preview component, or similar.
+
+**Example 1** - Here's an example of using the `Avatar` component within a custom preview component:
+
+```tsx
+import { Avatar } from 'stream-chat-react';
+
+const YourCustomChannelPreview = (props) => {
+ return (
+ ;
+
Other channel info needed in the preview
+ )
+};
+
+
+```
+
+**Example 2** - a basic example with rounded shape:
+
+```tsx
+import { Avatar } from './Avatar';
+const image = 'https://pbs.twimg.com/profile_images/897621870069112832/dFGq6aiE_400x400.jpg';
+const name = 'roy';
+
+;
+```
+
+## UI Customization
+
+You can also take advantage of the `Avatar` props on the `ChannelHeader` and `ChannelList` components to override just that aspect of these components specifically, see the example below.
+
+**Example 3** - an example of overriding just the `Avatar` component in the default `ChannelPreviewMessenger` component.
+
+```tsx
+const CustomAvatar = (props) => {
+ return ;
+};
+
+} />;
+```
+
+## Props
+
+### image
+
+The image URL or default is an image of the first initial of the name if there is one.
+
+| Type | Default |
+| -------------- | ------------------------- |
+| string \| null | first initial of the name |
+
+### name
+
+An optional name of the image, used for title tag fallback.
+
+| Type |
+| -------------- |
+| string \| null |
+
+### onClick
+
+The click event handler.
+
+| Type |
+| ----------------------------------------- |
+| (event: React.BaseSyntheticEvent) => void |
+
+### onMouseOver
+
+The mouseOver event handler.
+
+| Type |
+| ----------------------------------------- |
+| (event: React.BaseSyntheticEvent) => void |
+
+### shape
+
+The shape of the avatar image.
+
+| Type | Default |
+| --------------------------------- | ------- |
+| 'circle' \| 'rounded' \| 'square' | circle |
+
+### size
+
+The size in pixels of the avatar image.
+
+| Type | Default |
+| ------ | ------- |
+| number | 32px |
+
+### user
+
+The entire user object for the chat user displayed in the component.
+
+| Type |
+| ------ |
+| Object |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/base-image.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/base-image.mdx
new file mode 100644
index 0000000000..6a3e2ff1d6
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/base-image.mdx
@@ -0,0 +1,93 @@
+---
+id: base-image
+title: BaseImage
+---
+
+import ImageShowcase from '@site/src/components/ImageShowcase';
+import BaseImageInGallery from '../../assets/base-image-fallback-in-attachment-gallery.png'
+import BaseImageInAttachmentPreview from '../../assets/base-image-fallback-in-attachment-preview.png'
+import BaseImageInImageAttachment from '../../assets/base-image-fallback-in-image-attachment.png'
+
+The `BaseImage` component's purpose is to display an image or a fallback if loading the resource has failed. The component is used internally by:
+
+- `Image` component - used to display image attachments in `Message`
+- `Gallery` component - used to display image gallery among `Message` attachments
+- `AttachmentPreviewList` component - used to display attachment previews in `MessageInput`
+
+The default image fallbacks are rendered as follows:
+
+BaseImage in image attachment,
+ alt: 'BaseImage in image attachment',
+ },
+ {
+ image: BaseImageInGallery,
+ caption: BaseImage in image attachment gallery,
+ alt: 'BaseImage in image attachment gallery',
+ },
+ {
+ image: BaseImageInAttachmentPreview,
+ caption: BaseImage in attachment preview,
+ alt: 'BaseImage in attachment preview',
+ },
+ ]}
+/>
+
+## Usage
+
+### Custom image fallback
+
+The default image fallback can be changed by applying a new CSS data image to the fallback mask in the `BaseImage`'s `` element. The data image has to be assigned to a CSS variable `--str-chat__image-fallback-icon` within the scope of `.str-chat` class. An example follows:
+
+```css
+
+.str-chat {
+ --str-chat__image-fallback-icon: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEwIDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBkPSJNOS4xOTk0OSAwLjMwNTY3MUM4LjkzOTQ5IDAuMDQ1NjcwNyA4LjUxOTQ5IDAuMDQ1NjcwNyA4LjI1OTQ5IDAuMzA1NjcxTDQuOTk5NDkgMy41NTlMMS43Mzk0OSAwLjI5OTAwNEMxLjQ3OTQ5IDAuMDM5MDAzOSAxLjA1OTQ5IDAuMDM5MDAzOSAwLjc5OTQ5MiAwLjI5OTAwNEMwLjUzOTQ5MiAwLjU1OTAwNCAwLjUzOTQ5MiAwLjk3OTAwNCAwLjc5OTQ5MiAxLjIzOUw0LjA1OTQ5IDQuNDk5TDAuNzk5NDkyIDcuNzU5QzAuNTM5NDkyIDguMDE5IDAuNTM5NDkyIDguNDM5IDAuNzk5NDkyIDguNjk5QzEuMDU5NDkgOC45NTkgMS40Nzk0OSA4Ljk1OSAxLjczOTQ5IDguNjk5TDQuOTk5NDkgNS40MzlMOC4yNTk0OSA4LjY5OUM4LjUxOTQ5IDguOTU5IDguOTM5NDkgOC45NTkgOS4xOTk0OSA4LjY5OUM5LjQ1OTQ5IDguNDM5IDkuNDU5NDkgOC4wMTkgOS4xOTk0OSA3Ljc1OUw1LjkzOTQ5IDQuNDk5TDkuMTk5NDkgMS4yMzlDOS40NTI4MyAwLjk4NTY3MSA5LjQ1MjgzIDAuNTU5MDA0IDkuMTk5NDkgMC4zMDU2NzFaIiBmaWxsPSIjNzI3NjdFIi8+Cjwvc3ZnPgo=");
+}
+```
+
+We can change the mask dimensions or color by applying the following rules to the image's class `.str-chat__base-image--load-failed`, that signals the image load has failed:
+
+```css
+:root{
+ --custom-icon-fill-color: #223344;
+ --custom-icon-width-and-height: 4rem 4rem;
+}
+
+.str-chat__base-image--load-failed {
+ mask-size: var(--custom-icon-width-and-height);
+ -webkit-mask-size: var(--custom-icon-width-and-height);
+ background-color: var(--custom-icon-fill-color);
+}
+```
+
+### Custom BaseImage
+
+The default `BaseImage` can be overridden by passing a custom component to `Channel` props:
+
+
+```tsx
+import {ComponentProps } from 'react';
+import { Channel } from 'stream-chat-react';
+
+const CustomBaseImage = (props: ComponentProps<'img'>) => {
+ // your implementation...
+}
+
+export const MyUI = () => {
+ return (
+
+ {{/* more components */ }}
+
+ );
+};
+```
+
+## Props
+
+The component accepts the `img` component props.
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-header.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-header.mdx
new file mode 100644
index 0000000000..2c0c10afdd
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-header.mdx
@@ -0,0 +1,68 @@
+---
+id: channel_header
+title: ChannelHeader
+---
+
+The `ChannelHeader` component displays pertinent information regarding the currently active channel, including image and title.
+
+## Basic Usage
+
+Use this component by adding it as a child of the `Channel` component. If you want to 'override' this component, you simply use your custom component instead.
+
+**Example 1**
+
+```jsx
+
+
+
+```
+
+**Example 2** - using a custom heading component.
+
+```jsx
+
+
+
+```
+
+## Props
+
+### Avatar
+
+A custom UI component to display the avatar image.
+
+| Type | Default |
+| --------- | ----------------------------------------------------------------------------------------------------- |
+| component | [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) |
+
+### image
+
+The displayed image URL for the header, defaults to the `channel` image if there is one.
+
+| Type | Default |
+| ------ | ------------------- |
+| string | the `channel` image |
+
+### live
+
+A boolean for showing a little indicator below the title if the `channel` is live right now.
+
+| Type |
+| ------- |
+| boolean |
+
+### MenuIcon
+
+A custom UI component to display menu icon.
+
+| Type | Default |
+| --------- | ------------------------------------------------------------------------------------------------------------- |
+| component | [MenuIcon](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelHeader/icons.tsx) |
+
+### title
+
+A string to set the title manually, defaults to the `channel` name if there is one.
+
+| Type | Default |
+| ------ | ------------------ |
+| string | the `channel` name |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-preview-ui.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-preview-ui.mdx
new file mode 100644
index 0000000000..b71511a397
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-preview-ui.mdx
@@ -0,0 +1,185 @@
+---
+id: channel_preview_ui
+title: Channel Preview
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+The [`ChannelList`](../core-components/channel-list.mdx) prop `Preview` allows you to override the preview component which is rendered for each channel in the list (think of it as the UI of a `ChannelList` item). The component passed as the `Preview` will receive props from the `ChannelList` and the `ChannelPreview` wrapper (which extends these props with additional UI-specific items and renders it). Apart from the UI the `Preview` component is also responsible for channel selection (click handler).
+
+The `Preview` property defaults to [`ChannelPreviewMessenger`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelPreview/ChannelPreviewMessenger.tsx) component if no custom component is provided.
+
+:::note
+For even deeper customization of the channel list and channel previews, use the [`renderChannels`](../core-components/channel-list.mdx#renderchannels) prop of the `ChannelList` component. Note, however, that using a custom channel list renderer requires more work than overriding the preview UI.
+:::
+
+## Basic Usage
+
+To customize the `ChannelList` item UI simply pass your custom `Preview` component to the `ChannelList`. See [The Preview Prop Component](../../guides/customization/channel-list-preview.mdx#the-preview-prop-component) for the extended guide.
+
+```tsx
+const CustomChannelPreviewUI = ({ latestMessage, lastMessage }) => {
+ // "lastMessage" property is for the last
+ // message that has been interacted with (pinned/edited/deleted)
+
+ // to display last message of the channel use "latestMessage" property
+ return {latestMessage};
+};
+
+;
+```
+
+## Props
+
+###
Required
channel
+
+This required prop is the channel to be previewed; comes from either the `channelRenderFilterFn` or `usePaginatedChannels` call from [ChannelList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelList.tsx) and does not need to be set manually.
+
+| Type |
+| --------- |
+| `Channel` |
+
+### active
+
+If the component's channel is the active (selected) channel.
+
+| Type |
+| --------- |
+| `boolean` |
+
+### activeChannel
+
+The currently selected channel object.
+
+| Type |
+| --------- |
+| `Channel` |
+
+### Avatar
+
+The custom UI component to display the avatar for the channel.
+
+| Type | Default |
+| ----------- | ---------------------------------------------------------- |
+| `component` | |
+
+### channelUpdateCount
+
+A number that forces the update of the preview component on channel update.
+
+| Type |
+| -------- |
+| `number` |
+
+### className
+
+Custom class for the channel preview root
+
+| Type |
+| -------- |
+| `string` |
+
+### displayImage
+
+Image of channel to display.
+
+| Type |
+| -------- |
+| `string` |
+
+### displayTitle
+
+Title of channel to display.
+
+| Type |
+| -------- |
+| `string` |
+
+### lastMessage
+
+The last message received in a channel.
+
+| Type |
+| --------------- |
+| `StreamMessage` |
+
+### latestMessage
+
+Latest message preview to display. Will be either a string or a JSX.Element rendering markdown.
+
+| Type |
+| ----------------------- |
+| `string \| JSX.Element` |
+
+### messageDeliveryStatus
+
+Status describing whether own message has been delivered or read by another. If the last message is not an own message, then the status is undefined. The value is calculated from `channel.read` data on mount and updated on every `message.new` resp. `message.read` WS event.
+
+| Type |
+| ----------------------- |
+| `MessageDeliveryStatus` |
+
+Use `MessageDeliveryStatus` enum to determine the current delivery status, for example:
+
+```tsx
+import type { MessageDeliveryStatus } from 'stream-chat-react';
+import { DoubleCheckMarkIcon, SingleCheckMarkIcon } from '../icons';
+
+type MessageDeliveryStatusIndicator = {
+ messageDeliveryStatus: MessageDeliveryStatus;
+};
+
+export const MessageDeliveryStatusIndicator = ({
+ messageDeliveryStatus,
+}: MessageDeliveryStatusIndicator) => {
+ // the last message is not an own message in the channel
+ if (!messageDeliveryStatus) return null;
+
+ return (
+
+ );
+};
+```
+
+### onSelect
+
+Custom handler invoked when the `ChannelPreview` is clicked. The SDK uses `ChannelPreview` to display items of channel search results. There, behind the scenes, the new active channel is set.
+
+| Type |
+| ----------------------------------- |
+| `(event: React.MouseEvent) => void` |
+
+### Preview
+
+The UI component to use for display.
+
+| Type | Default |
+| ----------- | ---------------------------------------------------------------------------------------------------- |
+| `component` | |
+
+### setActiveChannel
+
+The setter function for a selected `channel`.
+
+| Type |
+| -------------------------------------- |
+| `ChatContextValue['setActiveChannel']` |
+
+### unread
+
+The number of unread Messages.
+
+| Type |
+| -------- |
+| `number` |
+
+### watchers
+
+The object containing watcher parameters. See the [Pagination documentation](https://getstream.io/chat/docs/react/channel_pagination/?language=js) for a list of available fields for sort.
+
+| Type |
+| ------------------------------------- |
+| `{ limit?: number; offset?: number }` |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-preview.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-preview.mdx
new file mode 100644
index 0000000000..be38ec6059
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-preview.mdx
@@ -0,0 +1,88 @@
+---
+id: channel_preview
+title: ChannelPreview
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+The `ChannelPreview` component is a _UI wrapper component_ which handles the logic of each of the rendered channels within the `ChannelList`.
+
+## Basic Usage
+
+This component is unchangeable and is used by the [`ChannelList`](../core-components/channel-list.mdx) component by default. You can change how your actual UI looks like through the `Preview` prop - read more about it in the [Channel Preview UI](./channel-preview-ui.mdx).
+
+If you don't like the internal logic of the `ChannelPreview` component you can create and supply your own `renderChannels` function to the `ChannelList` through which you can render completely custom preview components with your own logic and UI.
+
+## Props
+
+###
Required
channel
+
+This required prop is the `channel` to be previewed; comes from either the `channelRenderFilterFn` or `usePaginatedChannels` call from [ChannelList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelList.tsx) and does not need to be set manually.
+
+| Type |
+| --------- |
+| `Channel` |
+
+### activeChannel
+
+The currently selected channel object.
+
+| Type |
+| --------- |
+| `Channel` |
+
+### Avatar
+
+The custom UI component to display the avatar for the channel.
+
+| Type | Default |
+| ----------- | ---------------------------------------------------------- |
+| `component` | |
+
+### channelUpdateCount
+
+A number that forces the update of the preview component on channel update.
+
+| Type |
+| -------- |
+| `number` |
+
+### className
+
+Custom class for the channel preview root
+
+| Type |
+| -------- |
+| `string` |
+
+### onSelect
+
+Custom handler invoked when the `ChannelPreview` is clicked. The SDK uses `ChannelPreview` to display items of channel search results. There, behind the scenes, the new active channel is set.
+
+| Type |
+| ----------------------------------- |
+| `(event: React.MouseEvent) => void` |
+
+### Preview
+
+The UI component to use for display.
+
+| Type | Default |
+| ----------- | ---------------------------------------------------------------------------------------------------- |
+| `component` | |
+
+### setActiveChannel
+
+The setter function for a selected `channel`.
+
+| Type |
+| -------------------------------------- |
+| `ChatContextValue['setActiveChannel']` |
+
+### watchers
+
+The object containing watcher parameters. See the [Pagination documentation](https://getstream.io/chat/docs/react/channel_pagination/?language=js) for a list of available fields for sort.
+
+| Type |
+| ------------------------------------- |
+| `{ limit?: number; offset?: number }` |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-search.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-search.mdx
new file mode 100644
index 0000000000..f94d07744b
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/channel-search.mdx
@@ -0,0 +1,440 @@
+---
+id: channel_search
+title: ChannelSearch
+---
+
+import ImageShowcase from '@site/src/components/ImageShowcase';
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+import ImageInactiveSearchBarNoAppMenu from '../../assets/inactive-searchbar-no-app-menu.png';
+import ImageInactiveSearchBarWithAppMenu from '../../assets/inactive-searchbar-with-app-menu.png';
+import ImageActiveSearchBarNoText from '../../assets/active-searchbar-no-text.png';
+import ImageActiveSearchBarWithText from '../../assets/active-searchbar-with-text.png';
+import ImageSearchResultsInlineThemeV2 from '../../assets/search-results-inline-theme-v2.png';
+import ImageSearchResultsPopupThemeV2 from '../../assets/search-results-popup-theme-v2.png';
+import ImageSearchResultsInlineThemeV1 from '../../assets/search-results-inline-theme-v1.png';
+import ImageSearchResultsPopupThemeV1 from '../../assets/search-results-popup-theme-v1.png';
+import ImageSearchResultsLoadingThemeV2 from '../../assets/search-results-loading-theme-v2.png';
+import ImageSearchResultsLoadingThemeV1 from '../../assets/search-results-loading-theme-v1.png';
+import ImageSearchResultsEmptyThemeV2 from '../../assets/search-results-empty-theme-v2.png';
+import ImageSearchResultsEmptyThemeV1 from '../../assets/search-results-empty-theme-v1.png';
+
+`ChannelSearch` is a UI component that searches for chat users and displays the results in a list. It can be used standalone or in the `ChannelList` via the `showChannelSearch` prop (default is false).
+The input searches for users by default, but you can utilize the `searchForChannels` prop to also search for `channels`. Completely override the querying via the `searchFunction` prop.
+Selection of a search result will set the active channel with the selected user, or if a channel is an option and is selected, set the active channel with the existing channel.
+
+## Basic Usage
+
+** Example 1 ** - used via the `showChannelSearch` prop.
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## ChannelSearch according to theme version
+
+The `ChannelSearch` component renders 2 components:
+
+1. the search input
+2. the search results list
+
+If opted in the use of [theme version 2](../../theming/introduction.mdx), the `ChannelSearch` will render a more complex search input component called [`SearchBar`](./#searchbar-component). Otherwise, the [`SearchInput`](./#searchinput-component) is rendered.
+
+### Search input vs.SearchResults state
+
+The input naturally transitions between 3 states regardless of theme version:
+
+| Input state | Input | Search results |
+| ------------- | -------------------------------- | -------------- |
+| inactive | not focused | not rendered |
+| focused | focused and empty | not rendered |
+| active search | contains non-empty search string | rendered |
+
+It is possible to jump directly from active search state to inactive by pressing the Esc key or by erasing the search input value. The search results container is shown only if the search input contains non-empty string.
+
+Once the search results container is rendered it transitions between the following states:
+
+| Search results state | Search results |
+| ------------------------- | ----------------------------------------------------------------- |
+| loading | the search API call is in progress |
+| empty search (result) | the search API call returned an empty array |
+| non-empty search (result) | the search API call returned an array of channel and user objects |
+
+### SearchInput component
+
+The shows that the component renders a single text input element. User can provide a custom [`SearchInput`](./#searchinput) component implementation though.
+
+### SearchBar component
+
+The `SearchBar` contains multiple elements - buttons and text input. The buttons are conditionally rendered based on user interaction with the `ChannelSearch` components. All the button icons displayed in the `SearchBar` are customizable. User can provide a custom [`SearchBar`](./#searchbar) component implementation.
+
+#### SearchBar states
+
+The `SearchBar` transitions between the same states as the `SearchInput`, but renders more elements.
+
+##### 1. Inactive state:
+
+The `SearchBar` is rendered with [app menu icon](./#menuicon) if a custom [`AppMenu` component](./#appmenu) is provided to the `ChannelSearch`. Otherwise, only search input is visible.
+
+Inactive search bar with an app menu,
+ alt: 'Image of an inactive search bar state with an app menu',
+ },
+ {
+ image: ImageInactiveSearchBarWithAppMenu,
+ caption: Inactive search bar without an app menu,
+ alt: 'Image of an inactive search bar state without an app menu',
+ },
+ ]}
+/>
+
+##### 2. Active state:
+
+Once the input is focused, a return-arrow button occurs with [`ExitSearchIcon`](./#exitsearchicon) to exit the active state. Note the app menu icon is actually replaced by the return arrow button. After typing the search query a clear-input button with [`ClearInputIcon`](./#clearinputicon) appears inside the search input.
+
+Active search bar with empty input,
+ alt: 'Image of an active search bar state with empty input',
+ },
+ {
+ image: ImageActiveSearchBarWithText,
+ caption: Active search bar with search query,
+ alt: 'Image of an active search bar with search query',
+ },
+ ]}
+/>
+
+By clicking the return-arrow button, the user returns to the inactive search state. By clicking the clear-input button the input is cleared but kept focused with return-arrow still displayed (with possibility to exit the search altogether).
+
+The active search UI state can be exited by pressing the `Escape` key as well.
+
+### SearchResults component
+
+The following states are reflected in the `SearchResults`:
+
+1. The search query being in progress (can be customized with [`SearchLoading`](./#searchloading) )
+2. The empty search result (can be customized with [`SearchEmpty`](./#searchempty))
+3. The listing of found channels (if [`searchForChannels`](./#searchforchannels) is set to `true`) and users
+
+The look of the latter can be customized by providing [`SearchResultsHeader`](./#searchresultsheader), [`SearchResultItem`](./#searchresultitem), [`SearchResultsList`](./#searchresultslist)) (renders the list of `SearchResultItem`).
+
+The default styling of the first two states are as follows:
+
+Search results list content when loading (theme v1),
+ alt: 'Image of search results list content when loading',
+ },
+ {
+ image: ImageSearchResultsEmptyThemeV1,
+ caption: Empty search results (theme v1),
+ alt: 'Image of empty search results',
+ },
+ {
+ image: ImageSearchResultsLoadingThemeV2,
+ caption: Search results list content when loading (theme v2),
+ alt: 'Image of search results list content when loading',
+ },
+ {
+ image: ImageSearchResultsEmptyThemeV2,
+ caption: Empty search results (theme v2),
+ alt: 'Image of empty search results',
+ },
+ ]}
+/>
+
+#### Search results in popup
+
+The search results can be rendered in place of the channel list or above the channel list in a floating container. This behavior is toggled by [`popupResults`](./#popupResults) prop.
+
+Search results displayed inline (theme v1),
+ alt: 'Image of search results displayed inline (theme v1)',
+ },
+ {
+ image: ImageSearchResultsPopupThemeV1,
+ caption: Search results displayed floating above the channel list (theme v1),
+ alt: 'Image of search results displayed floating above the channel list (theme v1)',
+ },
+ {
+ image: ImageSearchResultsInlineThemeV2,
+ caption: Search results displayed inline (theme v2),
+ alt: 'Image of search results displayed inline (theme v2)',
+ },
+ {
+ image: ImageSearchResultsPopupThemeV2,
+ caption: Search results displayed floating above the channel list (theme v2),
+ alt: 'Image of search results displayed floating above the channel list (theme v2)',
+ },
+ ]}
+/>
+
+#### Keep the search results open on channel select
+
+The `ChannelSearch` offers possibility to keep the search results open meanwhile the user clicks between the search results. This behavior is controlled by [`clearSearchOnClickOutside`](./#clearsearchonclickoutside) flag. The selected channel is added to the channel list if it was not present there before the search.
+
+## Customizing the search method
+
+By default, the `ChannelSearch` component searches just for users. Use the `searchForChannels` prop to also search for channels.
+
+To override the search method completely, use the `searchFunction` prop. This prop is useful, say, when you want to search only for channels
+that the current logged in user is a member of. See the example below for this.
+
+```jsx
+const customSearchFunction = async (
+ props: ChannelSearchFunctionParams,
+ event: { target: { value: SetStateAction } },
+ client: StreamChat,
+) => {
+ const { setResults, setSearching, setQuery } = props;
+ const value = event.target.value;
+
+ const filters = {
+ name: { $autocomplete: value },
+ members: { $in: client.userID },
+ };
+
+ setSearching(true);
+ setQuery(value);
+ const channels = await client.queryChannels(filters);
+ setResults(channels);
+ setSearching(false);
+};
+```
+
+```jsx
+const { client } = useChatContext();
+
+ {
+ return customSearchFunction(params, event, client);
+ },
+ }}
+ showChannelSearch
+/>;
+```
+
+## Props
+
+### AppMenu
+
+Application menu / drop-down to be displayed when clicked on [`MenuIcon`](./#menuicon). Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is only available with the use of the [theming v2](../../theming/introduction.mdx). No default component is provided by the SDK. The library does not provide any CSS for `AppMenu`. Consult the customization tutorial on how to [add AppMenu to your application](../../guides/customization/channel-search.mdx/#adding-menu). The component is passed a prop `close`, which is a function that can be called to hide the app menu (e.g. on menu item selection).
+
+| Type | Default |
+| --------------------- | ----------- |
+| `React.ComponentType` | `undefined` |
+
+### channelType
+
+The type of `channel` to create on user result selection.
+
+| Type | Default |
+| --------------------------------------------------------------- | ----------- |
+| `livestream` \| `messaging` \| `team` \| `gaming` \| `commerce` | `messaging` |
+
+### ClearInputIcon
+
+Custom icon component used as a content of the button used to clear the search input. Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is rendered with `themeVersion` `'2'` only.
+
+| Type | Default |
+| --------------------- | --------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### clearSearchOnClickOutside
+
+Signals that the search state / results should be cleared on every click outside the search input (e.g. selecting a search result or exiting the search UI), defaults to `true`. If set to `false`, the search results are kept in the UI meanwhile the user changes between the channels.
+
+| Type | Default |
+| --------- | ------- |
+| `boolean` | `true` |
+
+### disabled
+
+Disables execution of the search queries and makes the search text input element disabled. Defaults to `false`.
+
+| Type | Default |
+| --------- | ------- |
+| `boolean` | `false` |
+
+### ExitSearchIcon
+
+Custom icon component used as a content of the button used to exit the search UI. Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is rendered with `themeVersion` `'2'` only.
+
+| Type | Default |
+| --------------------- | -------------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### MenuIcon
+
+Custom icon component used as a content of the button used to invoke the [`AppMenu`](./#appmenu). Prop is consumed only by the [`SearchBar` component](./#searchbar). The `SearchBar` component is rendered with `themeVersion` `'2'` only. The menu icon button is displayed only if `AppMenu` component has been passed to `ChannelSearch` props.
+
+| Type | Default |
+| --------------------- | ------------------------------------------------------------------ |
+| `React.ComponentType` | |
+
+### onSearch
+
+Callback invoked with every search input change handler. SDK user can provide own implementation. The prop is used by the `ChannelList` component to set a flag determining that the search has been initiated. If the search has been initiated and search result are to be displayed instead of the list of loaded channels ([`popupResults` flag](./#popupresults) is set to `false`), then the list of loaded channels is not rendered. This logic is executed despite passing custom implementation of `onSearch` function to `ChanneList` props.
+
+| Type |
+| --------------------------------------------- |
+| `React.ChangeEventHandler` |
+
+### onSearchExit
+
+Callback invoked when the search UI is deactivated. The `ChannelList` component uses it to set a flag that the search has been terminated and search results are not expected to be displayed in place of the list of loaded channels. And so the `ChannelList` renders the list of loaded channels. This logic is executed despite passing custom implementation of `onSearchExit` function to `ChanneList` props.
+
+| Type |
+| ------------ |
+| `() => void` |
+
+### onSelectResult
+
+Custom handler function to run on search result item selection. If not provided then the default selection handler takes care of:
+
+1. loading the active channel
+2. adding the selected channel to the channel list
+3. clearing the search results, if [`clearSearchOnClickOutside` flag](./#clearsearchonclickoutside) is set to true (default)
+
+| Type |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| ( `params: ChannelSearchFunctionParams,` `result: ChannelOrUserResponse` ) => Promise \| void |
+
+### placeholder
+
+Custom placeholder text to be displayed in the search input. Can be passed down from `ChannelList` via its `additionalChannelSearchProps`. If using custom i18n translations, it is preferable to change the placeholder value in your translations files under the key `'Search'`.
+
+| Type | Default |
+| -------- | ---------- |
+| `string` | `'Search'` |
+
+### popupResults
+
+Display search results as an absolutely positioned popup, defaults to false and shows inline.
+
+| Type | Default |
+| --------- | ------- |
+| `boolean` | `false` |
+
+### SearchBar
+
+Custom component to be rendered instead of the default . This component is displayed only if `themeVersion` is `'2'`. With the theme version 1 only the `SearchInput` is rendered. The default `SearchBar` component is a composite of multiple buttons and a search input. You can find more information about its features in an [above section](./#searchbar-component).
+
+| Type | Default |
+| -------------------------------------- | ----------------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### SearchEmpty
+
+Custom UI component to display empty search results.
+
+| Type | Default |
+| --------------------- | ------------------------------------------------------------------------------------ |
+| `React.ComponentType` | |
+
+### searchForChannels
+
+Boolean to search for channels as well as users in the server query, default is `false` and just searches for users.
+
+| Type | Default |
+| --------- | ------- |
+| `boolean` | `false` |
+
+### searchFunction
+
+Custom search function to override default. The first argument should expect an object of type `ChannelSearchFunctionParams`. It carries references to the `Dispatch` functions that allow to control the search state:
+
+- `setQuery` - sets the search input value, the default value is an empty string
+- `setResults` - sets the array of search results, the default value is an empty array
+- `setSearching` - signals that the HTTP search request is in progress
+
+| Type |
+| --------------------------------------------------------------------------------------------------- |
+| (`params: ChannelSearchFunctionParams, event: React.BaseSyntheticEvent` ) => Promise \| void |
+
+See also [Customizing the search method](#customizing-the-search-method).
+
+### searchDebounceIntervalMs
+
+The number of milliseconds to debounce the search query.
+
+| Type | Default |
+| -------- | ------- |
+| `number` | 300 |
+
+### SearchInput
+
+Custom UI component to display the search text input.
+
+| Type | Default |
+| --------------------------------------- | --------------------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### SearchLoading
+
+Custom UI component to display the search loading state. Rendered within the `SearchResults` component.
+
+| Type | Default |
+| --------------------- | -------------------------- |
+| `React.ComponentType` | a div with: 'Searching...' |
+
+### searchQueryParams
+
+Object containing filters/sort/options overrides for user / channel search.
+
+The `filters` attribute (`SearchQueryParams.userFilters.filters`) can be either `UserFilters` object describing the filter query or a function with a single argument of the search / filter (query) string. The function is then expected to derive and return the `UserFilters` from the provided query string.
+
+| Type |
+| --------------------------------------- |
+| `SearchQueryParams` |
+
+### SearchResultsHeader
+
+Custom UI component to display the search results header.
+
+| Type | Default |
+| --------------------- | -------------------------------------------------------------------------------------------- |
+| `React.ComponentType` | |
+
+### SearchResultItem
+
+Custom UI component to display a search result list item.
+
+| Type | Default |
+| ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
+| `React.ComponentType>` | |
+
+### SearchResultsList
+
+Custom UI component to display all the search results.
+
+| Type | Default |
+| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
+| `React.ComponentType>` | |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/date-separator.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/date-separator.mdx
new file mode 100644
index 0000000000..d8eabe0b2a
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/date-separator.mdx
@@ -0,0 +1,96 @@
+---
+id: date_separator
+title: DateSeparator
+---
+
+A simple date separator UI component for between messages. This component is rendered via the `VirtualizedMessageList` and `MessageList` components. See the render method
+[processMessages](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/utils.ts) for more info on the conditions for when the component is injected into the UI.
+
+## Basic Usage
+
+Since this component is added to the message lists within those components by default, you typically won't need to import and use this component individually unless it's in a date separator custom component.
+If you would like to disable the `DateSeparator` from appearing in the UI, utilize the
+`disableDateSeparator` prop on either the `VirtualizedMessageList` or `MessageList` components.
+You can also hide the component when new messages are received via the `hideNewMessageSeparator` prop on the same two list components.
+
+**Example 1** - Here's what it looks like for today's date:
+
+```tsx
+const date = new Date();
+
+;
+```
+
+**Example 2** - A date in the past:
+
+```tsx
+const date = new Date('December 17, 1995 03:24:00');
+
+
+
+
+
+;
+```
+
+## UI Customization
+
+This component may be overridden via the `DateSeparator` prop on `Channel`, which injects the new value into the `ComponentContext`. This value is then pulled for use in the rendering method in the list components.
+
+**Example 1** - An example of a custom date separator:
+
+```tsx
+export const YourCustomDateSeparator = (props: DateSeparatorProps) => {
+ const { date } = props
+
+ function formatDate(d: Date) {
+ return `The message date is: ${d.toDateString()}`;
+ }
+
+ return (
+
+ )
+};
+
+
+ // the Channel children components
+/>
+```
+
+## Props
+
+### date
+
+The date to format, required.
+
+| Type |
+| ---- |
+| Date |
+
+### formatDate
+
+Function to override the default formatting of the date. Has access to the original date object.
+
+| Type |
+| ---------------------- |
+| (date: Date) => string |
+
+### position 'left' | 'center' | 'right';
+
+Set the position of the date in the separator, options are 'left', 'center', 'right'.
+
+| Type | Default |
+| ----------------------------- | ------- |
+| 'left' \| 'center' \| 'right' | 'right' |
+
+## unread
+
+Boolean for if the following messages are not new.
+
+| Type |
+| ------- |
+| boolean |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/indicators.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/indicators.mdx
new file mode 100644
index 0000000000..183e859c43
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/indicators.mdx
@@ -0,0 +1,203 @@
+---
+id: indicators
+title: Indicators
+---
+
+import GHComponentLink from '../../_docusaurus-components/GHComponentLink';
+
+The Stream Chat React component library provides a variety components that show the status of items loading, queries from the API, network issues, and also a typing indicator:
+
+- [`ChatDown`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChatDown/ChatDown.tsx) - established in the `ChannelList`, the default indicator that shows when chat functionality isn't available, triggered when the Chat API is unavailable or your network isn't working.
+
+- [`EmptyStateIndicator`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EmptyStateIndicator/EmptyStateIndicator.tsx) - this component is established in the `MessageList`, `VirtualizedList`, and `ChannelList`
+ components and is rendered when there are no items to display.
+
+- [`LoadingChannels`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingChannels.tsx) - a fancy loading placeholder for the `ChannelList` that looks like a nice outline of a few preview components.
+
+- [`LoadingErrorIndicator`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingErrorIndicator.tsx) - the default UI component that displays an error message when the channel query fails in `Channel`.
+
+- [`LoadingIndicator`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingIndicator.tsx) - a simple loading spinner component. This component is used in various places in the SDK library when waiting for a response from the Stream Chat API. It can also
+ be imported individually into a project for use in custom components.
+
+- [`LoadMoreButton`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/LoadMore/LoadMoreButton.tsx) - a simple button component that handles pagination logic when loading more items after querying the API.
+ Established via the `LoadMorePaginator` component and can be used standalone in a custom component.
+
+- [`LoadMorePaginator`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/LoadMore/LoadMorePaginator.tsx) - a paginator component that renders channels in the `ChannelList`.
+
+- [`TypingIndicator`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/TypingIndicator/TypingIndicator.tsx) - a UI component that lists users currently typing and rendered via the `MessageList` and `VirtualizedList` components
+
+## UI Customization
+
+### ChatDown
+
+You can override this indicator by utilizing the `LoadingErrorIndicator` prop on `ChannelList`.
+
+### EmptyStateIndicator
+
+You can override this indicator in the `ChannelList` via the `EmptyStateIndicator` prop. Use the `EmptyStateIndicator` prop on `Channel` to override in the `MessageList` and `VirtualizedList` components.
+
+### LoadingErrorIndicator
+
+Override this component to display an error message in a way that fits your requirements via the `LoadingErrorIndicator` prop on `Channel`.
+
+### LoadingIndicator
+
+Override this component in the `MessageList` and `VirtualizedList` components by using the `LoadingIndicator` prop on `Channel`. This injects the new value into the `ComponentContext` which is then pulled for use in the lists.
+
+### LoadMorePaginator and LoadMoreButton
+
+Override this component in the `ChannelList` by using the `Paginator` prop on `ChannelList`. This is also the place where you can customize the `LoadMoreButton` by taking advantage of the prop of the same name on your new paginator component.
+
+### TypingIndicator
+
+Override this component via the `TypingIndicator` prop on `Channel`, which injects the new value into the `ComponentContext` which is then pulled for use in the lists.
+
+## ChatDownProps
+
+### image
+
+The image url for this error or a ReactElement.
+
+| Type |
+| ---------------------------- |
+| string \| React.ReactElement |
+
+### text
+
+The error message to show.
+
+| Type |
+| ------ |
+| string |
+
+### type
+
+The type of error.
+
+| Type |
+| ------ |
+| string |
+
+## EmptyStateIndicatorProps
+
+### listType
+
+The type of list that will display this indicator, and this type will conditionally render a message.
+
+| Type |
+| ---------------------------------- |
+| 'channel' \| 'message' \| 'thread' |
+
+## LoadingErrorIndicatorProps
+
+### error
+
+The error object that is displayed.
+
+| Type |
+| ----- |
+| Error |
+
+## LoadingIndicatorProps
+
+### color
+
+Set the color of the loading icon.
+
+| Type | Default |
+| ------ | ------- |
+| string | #006CFF |
+
+### size
+
+The size of the loading icon.
+
+| Type | Default |
+| ------ | ------- |
+| number | 15px |
+
+## LoadMoreButtonProps
+
+### onClick
+
+The onClick handler. Pagination logic should be executed in this handler.
+
+| Type |
+| -------------------------------------------- |
+| React.MouseEventHandler\ |
+
+### refreshing
+
+If true, the `LoadingIndicator` is displayed instead of button.
+
+| Type |
+| ------- |
+| boolean |
+
+## LoadMorePaginatorProps
+
+###
Required
loadNextPage
+
+Callback to load the next page, required.
+
+| Type |
+| ---------- |
+| () => void |
+
+### hasNextPage
+
+Boolean for if there is a next page to load.
+
+| Type |
+| ------- |
+| boolean |
+
+### LoadMoreButton
+
+A UI button component that handles pagination logic.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------------------------- |
+| component | |
+
+### refreshing
+
+A boolean to indicate if there is currently any refreshing taking place.
+
+| Type |
+| ------- |
+| boolean |
+
+### reverse
+
+A boolean that indicates if the `LoadMoreButton` should be displayed at the top of the list of channels instead of the bottom of the list (the default).
+
+| Type |
+| ------- |
+| boolean |
+
+## TypingIndicatorProps
+
+### Avatar
+
+Custom UI component to display user's avatar.
+
+| Type | Default |
+| --------- | ---------------------------------------------------------- |
+| component | |
+
+### avatarSize
+
+The size in pixels of the avatar image.
+
+| Type | Default |
+| ------ | ------- |
+| number | 32px |
+
+### threadList
+
+Boolean that signals whether the typing indicator is in a `Thread`.
+
+| Type |
+| ------- |
+| boolean |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/window.mdx b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/window.mdx
new file mode 100644
index 0000000000..9535735a17
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/components/utility-components/window.mdx
@@ -0,0 +1,41 @@
+---
+id: window
+title: Window
+---
+
+The `Window` component handles width changes in the main channel to ensure a seamless user experience when opening and closing a `Thread` component.
+
+## Basic Usage
+
+The `Window` component must wrap the main channel components to enable smooth mount and unmount behavior. It must be rendered at the same level as the `Thread`.
+This ensures correct width changes in the main channel when opening and closing a `Thread`.
+
+```tsx
+
+
+
+
+
+
+
+
+
+```
+
+## Props
+
+### hideOnThread
+
+The boolean to show or hide the `Window` when a `Thread` is active.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### thread
+
+An optional prop to manually trigger the opening of a thread.
+
+| Type |
+| ------ |
+| object |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-list-infinite-scroll.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-list-infinite-scroll.mdx
new file mode 100644
index 0000000000..26e633424c
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-list-infinite-scroll.mdx
@@ -0,0 +1,68 @@
+---
+id: channel-list-infinite-scroll
+title: Infinite Scroll
+keywords: [channel list, infinite scroll]
+---
+
+import GHComponentLink from '../_docusaurus-components/GHComponentLink';
+
+This example demonstrates how to implement infinite scroll with existing SDK components. By default, the SDK's `ChannelList` component uses `LoadMorePaginator` to load more channels into the list. More channels are loaded every time the `LoadMoreButton` is clicked. The infinite scroll instead loads more channels based on the channel list container's scroll position. The request to load more channels is automatically triggered, once the scroller approaches the bottom scroll threshold of the container.
+
+## How to plug in the infinite scroll
+
+The SDK provides own [`InfiniteScroll`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx) component. This component implements the [`PaginatorProps`](https://github.com/GetStream/stream-chat-react/blob/master/src/types/types.ts) interface. As this interface is implemented by the [`LoadMorePaginator`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/LoadMore/LoadMorePaginator.ts) too, we can just pass the `InfiniteScroll` into the `ChannelList` prop `Paginator`.
+
+```tsx
+import { ChannelList, InfiniteScroll } from 'stream-chat-react';
+
+;
+```
+
+If you would like to adjust the configuration parameters like `threshold`, `reverse` (`PaginatorProps`) or `useCapture`, etc. (`InfiniteScrollProps`), you can create a wrapper component where these props can be set:
+
+```tsx
+import { ChannelList, InfiniteScroll, InfiniteScrollProps } from 'stream-chat-react';
+
+const Paginator = (props: InfiniteScrollProps) => ;
+
+// ...
+
+;
+```
+
+Especially the `threshold` prop may need to be set as the default is 250px. That may be too soon to load more channels.
+
+## What to take into consideration
+
+For the infinite scroll to work, the element containing the `ChannelPreview` list has to be forced to display the scroll bar with the initial channel list load. This is achieved by:
+
+**1. adjusting the initial number of loaded channels**
+
+Set a reasonable number of channels to be initially loaded. If loading 10 channels leads to them being visible without having to scroll, then increase the number to e.g. 15:
+
+```tsx
+import type { ChannelOptions } from 'stream-chat';
+const options: ChannelOptions = { state: true, presence: true, limit: 15 };
+```
+
+**2. adjusting the container height**
+
+You can change the container height so that not all channels are visible at once. You should target the container with class `.str-chat__channel-list-messenger-react__main`
+
+```css
+.str-chat__channel-list-messenger-react__main {
+ max-height: 50%;
+}
+```
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-read-state.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-read-state.mdx
new file mode 100644
index 0000000000..751c791478
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-read-state.mdx
@@ -0,0 +1,258 @@
+---
+id: channel_read_state
+title: Channel Read State
+keywords: [channel, channel read, channel read state, message read state]
+---
+
+This guide intends to provide an overview how channel read state is handled by default in the SDK and how to customize this behavior to our liking.
+
+## The model
+
+The React SDK maintains channel read state for UI components inside `Channel` component in a separate variable `channelUnreadUiState`. This state is dedicated to show unread count on components `UnreadMessagesSeparator` and `UnreadMessagesNotification` (or other custom components that need its behavior). The `channelUnreadUiState` is special in that when a channel is opened and marked read, the `channelUnreadUiState` does not reflect this initial update. This is in order the user can see, how many unread messages there have been left since the previous session.
+
+Channel read state reflecting the current back-end state can be accessed via `channel.state.read` mapping.
+
+### Channel UI unread state
+
+The state is maintained by `Channel` component and shared with its children via `ChannelStateContext` as `channelUnreadUiState`. The state format is as follows:
+
+| Property | Type | Description |
+|-----------------------------|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **last_read** | `Date` | Date when the channel was marked read the last time. |
+| **unread_messages** | `number` | The count of unread messages in a given channel. Unread count refers only to foreign (not own) unread messages. |
+| **first_unread_message_id** | `string` or `undefined` | The ID of the message that was marked unread (`notification.mark_unread` event). The value is available only when a message is marked unread. Therefore, cannot be relied on to place unread messages UI. |
+| **last_read_message_id** | `string` or `undefined` | The ID of the message preceding the first unread message. |
+
+
+### Channel read state for all users
+
+The read state is extracted from the channel query response, specifically from each `ChannelResponse` object's `read` attribute. This is internally transformed from an array of users' read statuses into and object indexed by user id. The read state is updated upon receiving WS events like `message.read`, `notification.mark_unread`, `message.new`. Each value of the `read` state object has then the following structure:
+
+| Property | Type | Description |
+|-----------------------------|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **last_read** | `Date` | Date when the channel was marked read the last time. The value is provided with `ChannelResponse` when querying channels or on `notification.mark_unread` event. |
+| **unread_messages** | `number` | The count of unread messages in a given channel for a given user. Unread count refers only to foreign (not own) unread messages. The value is provided with `ChannelResponse` when querying channels or on `notification.mark_unread` event. |
+| **user** | `user` | Data of a user, whose read state is described in this object. The value is provided with `ChannelResponse` when querying channels or on `notification.mark_unread` event. |
+| **first_unread_message_id** | `string` or `undefined` | The ID of the message that was marked unread (`notification.mark_unread` event). The value is available only when a message is marked unread. Therefore, cannot be relied on to place unread messages UI. |
+| **last_read_message_id** | `string` or `undefined` | The ID of the message preceding the first unread message. The value is provided with `ChannelResponse` when querying channels or on `notification.mark_unread` event. |
+
+:::note
+Be aware that only the last 100 newest messages can be marked unread. If older messages are marked unread, an error notification is shown informing about this limitation.
+:::
+
+### Access the read state
+
+In the SDK, the `read` and `channelUnreadUiState` can be accessed via [`useChannelStateContext` consumer](../../components/contexts/channel_state_context#read):
+
+```tsx
+import { useChannelStateContext, useChatContext } from 'stream-chat-react';
+
+const Component = (props) => {
+ const { client } = useChatContext();
+ const { read, channel, channelUnreadUiState } = useChannelStateContext();
+
+ // channel read state for some user
+ const channelReadStateForAUser = read[props.user.id];
+
+ // channel read state for own user
+ const channelReadStateForMyUser = client.user && read[client.user.id];
+
+ // easier way to access own user's unread count for a given channel
+ const unreadCount = channel.unreadCount();
+
+ //... code
+};
+```
+
+### Mark a channel read
+
+Channel can be marked read using the `markRead()` function provided via `ChannelActionContext`:
+
+```tsx
+import { useChannelActionContext } from 'stream-chat-react';
+
+const MarkReadButton = (props) => {
+ const { markRead } = useChannelActionContext();
+
+ return
+};
+```
+
+The function accepts a single `options` parameter of the following format:
+
+| Field | Type | Optional | Description |
+|------------------------|-----------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `updateChannelUiUnreadState` | `boolean` | yes | Signal, whether the `channelUnreadUiState` should be updated. The local state update is prevented when the Channel component is mounted. This is in order to keep the UI indicating the original unread state, when the user opens a channel. If the value for `updateChannelUiUnreadState` is not provided, the state is updated. |
+
+:::important
+Please, prefer using the `markRead()` function everywhere in the `Channel` context as this function throttles the API calls thus preventing you from hitting the API limit of mark-read calls.
+:::
+
+## Default components involved in handling read state
+
+The default components included in **marking a channel read**:
+
+| Component | Description |
+|-----------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [`Channel`](../../components/core-components/channel) | Can be configured to mark active channel read when mounted. This can be done through its prop `markReadOnMount`. By default enabled. |
+| [`MessageList`](../../components/core-components/message_list), [`VirtualizedMessageList`](../../components/core-components/virtualized_list) | Marks channel read when message list is scrolled to the bottom. |
+| [`UnreadMessagesNotification`](../../components/contexts/component_context#unreadmessagesnotification) | Floating notification rendered in the message list. Contains a button, which when clicked, marks the channel read. |
+
+The default components included in **marking a channel unread**:
+
+| Component | Description |
+|-------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [`MessageActionsBox`](../../components/message-components/message_ui#message-actions-box) | Action `Mark as Unread` is displayed if a user has `read-events` permission and the actions are displayed for a non-thread message posted by another user. Message which id matches that of the current user's read state's `first_unread_message_id` is not shown option `Mark as Unread`. |
+
+The default components reflecting channel unread count:
+
+| Component |
+|------------------------------------------------------------------------------------------------------------------------------------------|
+| [`ChannelPreviewMessenger`](../../components/utility-components/channel_preview_ui) |
+| [`UnreadMessagesSeparator`](../../components/contexts/component_context#unreadmessagesseparator) |
+| [`UnreadMessagesNotification`](../../components/contexts/component_context#unreadmessagesnotification) |
+| [`ScrollToBottomButton`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/ScrollToBottomButton.tsx) |
+
+:::note
+Message threads do not participate in handling read state of a channel. Thread replies are not observed for unread count. Therefore, none of the UI components related to read state are rendered in threads.
+:::
+
+## Default channel read state handling
+
+The channel is marked read in the following scenarios:
+
+1. User enters a channel with unread messages if `Channel` prop `markReadOnMount` is enabled (default behavior).
+2. User scrolls up and back down to the latest message.
+3. User clicks the button on the default `UnreadMessagesNotification` component to mark channel read.
+
+The channel is marked unread in the following scenarios:
+
+1. User with `read-events` permission selects `Mark as unread` option from the `MessageActionsBox`.
+
+The component `UnreadMessagesSeparator` is shown immediately below the last read message. It can be followed by own message or a message posted by another user. It does not show unread count if:
+- `showCount` prop is enabled and among the unread messages are only own messages (own message can be marked unread).
+- `showCount` prop is disabled (default)
+
+## Channel read state handling customization
+
+### Customization through component props
+
+There is a possibility to configure when a channel is marked read by tweaking these default components' props:
+
+| Component | Prop |
+|-------------------------------------------------------|----------------------------------------|
+| [`Channel`](../../components/core-components/channel) | `markReadOnMount` (by default enabled) |
+
+### Customization through custom components
+
+We can override the following components via `Channel`'s component context:
+
+#### Custom `UnreadMessagesSeparator` component
+
+Will be rendered before the first unread message.
+
+```tsx
+import {
+ Channel,
+ UnreadMessagesSeparatorProps,
+} from 'stream-chat-react';
+
+const UnreadMessagesSeparator = (props: UnreadMessagesSeparatorProps) => {
+ //... custom implementation
+}
+const Component = ({children}) => (
+
+ {children}
+
+);
+```
+
+The component can be configured through the following props:
+
+| Prop | Description | Type | Default |
+|---------------------|-------------------------------------------------------------------------------------------------------|-----------|---------|
+| `showCount` | Configuration parameter to determine, whether the unread count is to be shown on the component. | `boolean` | `false` |
+
+```tsx
+import {
+ UnreadMessagesSeparator as StreamUnreadMessagesSeparator,
+ UnreadMessagesSeparatorProps,
+} from 'stream-chat-react';
+
+const UnreadMessagesSeparator = (props: UnreadMessagesSeparatorProps) => {
+ return
+}
+```
+
+#### Custom `UnreadMessagesNotification` component
+
+Will be rendered only when `UnreadMessagesSeparator` is not visible in message list. The default implementation positions the notification as a floating element above the messages in a message list. It shows the number of unread messages since the user has scrolled away from the latest message (bottom of the message list).
+
+```tsx
+import {
+ Channel,
+ UnreadMessagesNotificationProps,
+} from 'stream-chat-react';
+
+const UnreadMessagesNotification = (props: UnreadMessagesNotificationProps) => {
+ //... custom implementation
+}
+const Component = ({children}) => (
+
+ {children}
+
+);
+```
+
+The component can be configured through the following props:
+
+| Prop | Description | Type | Default |
+|---------------------|-------------------------------------------------------------------------------------------------------|-----------|---------|
+| `showCount` | Configuration parameter to determine, whether the unread count is to be shown on the component. | `boolean` | `false` |
+| `queryMessageLimit` | Configuration parameter to determine the message page size, when jumping to the first unread message. | `number` | `100` |
+
+
+```tsx
+import {
+ UnreadMessagesNotification as StreamUnreadMessagesNotification,
+ UnreadMessagesNotificationProps,
+} from 'stream-chat-react';
+
+const UnreadMessagesNotification = (props: UnreadMessagesNotificationProps) => {
+ return
+}
+```
+
+#### Custom `MessageNotification` component
+
+The SDK exports [`ScrollToBottomButton`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/ScrollToBottomButton.tsx) that shows the unread count since the point the user has scrolled away from the newest messages in the list.
+
+We can implement our own message notification component.
+
+```tsx
+import {
+ MessageNotificationProps,
+ Channel,
+} from 'stream-chat-react';
+
+const MessageNotification = (props: MessageNotificationProps) => {
+ //... custom implementation
+};
+
+const Component = ({children}) => (
+
+ {children}
+
+);
+```
+
+## Jumping to the first unread message
+
+### Default SDK component to jump to the first unread message
+
+The SDK provides a component `UnreadMessagesNotification`, that when clicked on the part `Unread messages`, the message list scrolls to the first unread message. If the first unread message is not loaded in the local channel state, the message is retrieved from the API.
+
+
+### API to jump to the first unread message
+
+Use `jumpToFirstUnreadMessage()` function to implement custom UI to jump to the first unread message. The function takes one parameter `queryMessageLimit` that specifies the message page size if the message has to be loaded from the back-end API.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-users-list.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-users-list.mdx
new file mode 100644
index 0000000000..7d03a1cb6e
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/channel-users-list.mdx
@@ -0,0 +1,118 @@
+---
+id: channel-user-lists
+title: Channel Members and Online Status
+keywords: [example, channel members, online status]
+---
+
+In this example, we will demonstrate how to render the current channel members and their online status.
+
+## Render the Channel Members List
+
+Let's start the example by creating a simple members list component. To access the members list of the current channel, we will get the current channel using `useChannelStateContext` hook.
+The example is a bit more convoluted, since we will add online presence updates at the next step.
+
+:::note
+In order for the client to receive updates for user presence, ensure that you are watching the channel with `channel.watch({ presence: true })`. More details can be found in the [↗ LLC documentation](https://getstream.io/chat/docs/javascript/watch_channel/?language=javascript).
+:::
+
+```tsx
+const Users = () => {
+ const { channel } = useChannelStateContext();
+ const [channelUsers, setChannelUsers] = useState>([]);
+
+ useEffect(() => {
+ const updateChannelUsers = () => {
+ setChannelUsers(
+ Object.values(channel.state.members).map((user) => ({
+ name: user.user_id!,
+ online: !!user.user!.online,
+ })),
+ );
+ };
+
+ updateChannelUsers();
+ }, [client, channel]);
+
+ return (
+
+ );
+};
+```
+
+We can place the component as a child of the `Channel` component:
+
+```tsx
+
+
+
+
+
+
+
+
+
+```
+
+## Real-Time Updates
+
+So far, our list looks good, but there's a catch: for performance purposes, the `useChannelStateContext` does not refresh when user presence changes.
+To make the list update accordingly, we need to attach an additional listener to the `user.presence.changed` event of the chat client.
+Let's also add some basic CSS to complete the look of the list. The class is already applied to the JSX, just add a CSS file and be sure to import into your file.
+
+```css
+.users-list {
+ background: #ffffff;
+ padding: 20px;
+ padding-left: 30px;
+ border-radius: calc(16px / 2) 16px 0 0;
+ border: 1px solid #ecebeb;
+}
+```
+
+```tsx
+const Users = () => {
+ const { client } = useChatContext();
+ const { channel } = useChannelStateContext();
+ const [channelUsers, setChannelUsers] = useState>([]);
+ useEffect(() => {
+ const updateChannelUsers = (event?: Event) => {
+ // test if the updated user is a member of this channel
+ if (!event || channel.state.members[event.user!.id] !== undefined) {
+ setChannelUsers(
+ Object.values(channel.state.members).map((user) => ({
+ name: user.user_id!,
+ online: !!user.user!.online,
+ })),
+ );
+ }
+ };
+
+ updateChannelUsers();
+
+ //
+ client.on('user.presence.changed', updateChannelUsers);
+
+ return () => {
+ client.off('user.presence.changed', updateChannelUsers);
+ };
+ }, [client, channel]);
+
+ return (
+
+ );
+};
+```
+
+With the above addition, `channelUsers` will be updated each time user comes online or goes offline.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/client-and-user.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/client-and-user.mdx
new file mode 100644
index 0000000000..89237ad5af
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/client-and-user.mdx
@@ -0,0 +1,47 @@
+---
+id: client-and-user
+title: Client and User
+keywords: [client, user, connection, api]
+---
+
+:::note
+The recommended way of connecting your chat application to the Stream Chat API is through the use of `useCreateChatClient` hook.
+:::
+
+## Client Instance
+
+You can create an instance with the `new` keyword or through the use of static method `getInstance` - the latter will create and store your instance and subsequent `getInstance` calls will return what has been stored.
+
+```tsx
+import { Chat } from 'stream-chat-react';
+import { StreamChat } from 'stream-chat';
+
+const client = new StreamChat(apiKey);
+
+// or
+
+const client = StreamChat.getInstance(apiKey);
+```
+
+## Connecting and Disconnecting a User
+
+To authenticate a user you'll need a token. Typically, you send this token from your backend to your frontend when the user logs in. See the [Tokens & Authentication](https://getstream.io/chat/docs/javascript/tokens_and_authentication) documentation to learn more about creating tokens. For our purposes here, we will assume you have created and retrieved a `token`.
+
+To connect a user, call the `connectUser` method on your client instance with the user object and `token` provided as arguments. Connect the user directly after instantiating the client to establish a websocket connection with the Stream Chat API. Once the connection has been opened, your client instance will begin receiving events from the API.
+
+```tsx
+const connectionPromise = client.connectUser(
+ {
+ id: 'dave-matthews',
+ name: 'Dave Matthews',
+ },
+ token,
+);
+```
+
+To dispose of the active connection (upon component cleanup, for example) you'd call `disconnectUser` method. It's generally recommended to wait for the connection promise to resolve before disconnecting.
+
+```tsx
+await connectionPromise;
+client.disconnectUser();
+```
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/adding-notification.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/adding-notification.mdx
new file mode 100644
index 0000000000..38565545a6
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/adding-notification.mdx
@@ -0,0 +1,80 @@
+---
+id: adding_messagelist_notification
+title: Message List Notifications
+---
+
+import CustomNotification from '../../assets/CustomNotification.png';
+
+In this example, we demonstrate how to use the method `addNotification` pulled from the
+[`ChannelActionContext`](../../components/contexts/channel-action-context.mdx#addNotification) in order to add a custom
+notification message to the `MessageList` at our desired time specification.
+
+## addNotification Method
+
+This method receives two arguments: text and type. The text parameter is the notification text, and the type
+argument is of type string and is either 'success' or 'error'. The type determines the style added.
+These messages are temporary in the list and are removed after five seconds.
+
+This method is used extensively in the library by handler functions to notify of success or failure and are
+usually used in conjunction with JavaScript event listeners or API event listeners.
+
+```jsx
+const addNotification = (text: string, type: 'success' | 'error') => {
+ /// the rest of the method established in `Channel`
+};
+```
+
+## Implementation
+
+In this quick implementation we will listen for the 'message.updated' client event and add our custom notification
+when this happens. Editing or pinning a message will cause this event to occur.
+
+:::note
+Since `addNotification` is drawn from the `ChannelActionContext`, we must create an inner component that is a child
+of `Channel` and call the `useChannelActionContext` custom hook.
+:::
+
+## The Code
+
+```jsx
+const ChannelInner = () => {
+ const { addNotification } = useChannelActionContext();
+ const { channel } = useChannelStateContext();
+
+ useEffect(() => {
+ const clickToAddNotification = () => {
+ addNotification('A message has been edited!', 'success');
+ };
+
+ channel.on('message.updated', clickToAddNotification);
+
+ return () => {
+ channel.off('message.updated', clickToAddNotification);
+ };
+ }, [addNotification, channel]);
+
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+};
+
+const App = () => (
+
+
+
+
+
+
+);
+```
+
+## The Result
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/app-menu.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/app-menu.mdx
new file mode 100644
index 0000000000..e1ff9ce18d
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/app-menu.mdx
@@ -0,0 +1,98 @@
+---
+id: app_menu
+title: App Menu
+---
+
+# Adding an App Menu
+
+As of the version 10.0.0, users can add app menu into the `SearchBar`. In case you would like to display menu button next to the search input, you can do that by adding [`AppMenu` component](../../components/utility-components/channel-search.mdx/#appmenu) to the `ChannelSearch` props. The display of `AppMenu` is then toggled by clicking on the menu button. `AppMenu` can be rendered as a drop-down or even a modal. In our example we will render a drop-down menu.
+
+:::caution
+The SDK does not provide any default `AppMenu` component and so you will have to write your CSS for it to be styled correctly.
+:::
+
+```tsx
+import React, { useCallback } from 'react';
+import type { AppMenuProps } from 'stream-chat-react';
+
+import './AppMenu.scss';
+
+export const AppMenu = ({ close }: AppMenuProps) => {
+ const handleSelect = useCallback(() => {
+ // custom logic...
+ close?.();
+ }, [close]);
+
+ return (
+
+
+
+ Profile
+
+
+ New Group
+
+
+ Sign Out
+
+
+
+ );
+};
+```
+
+```scss
+.str-chat__channel-search-bar-button.str-chat__channel-search-bar-button--menu {
+ position: relative;
+}
+
+.app-menu {
+ &__container {
+ position: absolute;
+ top: 50px;
+ left: 10px;
+ background-color: white;
+ border-radius: 5px;
+ box-shadow: 0 0 8px var(--str-chat__box-shadow-color);
+ }
+
+ &__item-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ &__item {
+ list-style: none;
+ margin: 0;
+ padding: 0.5rem 1rem;
+
+ &:hover {
+ background-color: lightgrey;
+ cursor: pointer;
+ }
+ }
+}
+```
+
+```jsx
+import { AppMenu } from './components/AppMenu';
+
+const App = () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+```
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-header.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-header.mdx
new file mode 100644
index 0000000000..8fa69f4560
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-header.mdx
@@ -0,0 +1,137 @@
+---
+id: channel_header
+title: Channel Header
+---
+
+import CustomChannelHeader from '../../assets/CustomChannelHeader.png';
+
+In this example, we will demonstrate how to use a custom `ChannelHeader` component instead of the default. Unlike most of the other library components where a prop on a parent component will override the default, for this component all you need to do is use
+your custom component in place of the library's header option.
+
+### Implementation
+
+The default header displays the name of the channel, the number of members, and the number of members online. In our example, we will display the name and add the typing indicator below. We need to pull the `channel` information from context. Pulling from this context is possible in our
+custom component because it's a child of `Channel`.
+
+```jsx
+const CustomChannelHeader = (props: ChannelHeaderProps) => {
+ const { title } = props;
+
+ const { channel } = useChannelStateContext();
+ const { name } = channel.data || {};
+
+ return
{title || name}
;
+};
+```
+
+Let's add the typing indicator to our header component and remove the indicator where it appears by default in the `MessageList`. We can accomplish the removal by overriding the default with a null value.
+
+```tsx
+const CustomChannelHeader = (props: ChannelHeaderProps) => {
+ const { title } = props;
+
+ const { channel } = useChannelStateContext();
+ const { name } = channel.data || {};
+
+ return (
+ <>
+
{title || name}
+
+ >
+ )
+}
+
+ null}>
+```
+
+The options are endless for displaying additional items in the header since so much more information is available to us if we were to continue destructuring from the `channel` object. For this demo, though, let's add both library styling and local CSS and call it a day.
+
+```css
+.header-title {
+ padding: 5px 7px;
+}
+
+.header-pound {
+ color: #006cff;
+ font-weight: 800;
+ padding-right: 2px;
+}
+```
+
+```tsx
+const CustomChannelHeader = (props: ChannelHeaderProps) => {
+ const { title } = props;
+
+ const { channel } = useChannelStateContext();
+ const { name } = channel.data || {};
+
+ return (
+
+
+
+ #
+ {title || name}
+
+
+
+
+ );
+};
+```
+
+### The Final Code
+
+Finally and most importantly, let's add in our custom component in the place where the default would have been.
+
+```css
+.header-title {
+ padding: 5px 7px;
+}
+
+.header-pound {
+ color: #006cff;
+ font-weight: 800;
+ padding-right: 2px;
+}
+```
+
+```tsx
+const CustomChannelHeader = (props: ChannelHeaderProps) => {
+ const { title } = props;
+
+ const { channel } = useChannelStateContext();
+ const { name } = channel.data || {};
+
+ return (
+
+
+
+ #
+ {title || name}
+
+
+
+
+ );
+};
+```
+
+```tsx
+const App = () => (
+
+
+ null}>
+
+
+
+
+
+
+
+
+);
+```
+
+## The Result:
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-list-preview.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-list-preview.mdx
new file mode 100644
index 0000000000..445af9445a
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-list-preview.mdx
@@ -0,0 +1,578 @@
+---
+id: channel_list_preview
+title: Channel List UI
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import ImageShowcase from '@site/src/components/ImageShowcase';
+
+
+
+[`ChannelList`](../../components/core-components/channel-list.mdx) is a primary navigation component of a chat, used to display and
+switch between available channels. Due to the dynamic, real-time nature of chat,
+the [`ChannelList`](../../components/core-components/channel-list.mdx) component needs to subscribe to and handle many different
+types of events to keep the list state up to date. This includes handling new
+message events and updates to the existing ones, channel update events, channel
+member presence events, and so on.
+
+That's a lot of work, and if done incorrectly, it's easy to miss an important
+event. That is why we always recommend building on top of the [`ChannelList`](../../components/core-components/channel-list.mdx)
+component provided by the SDK, even if you need to do some major customization.
+Fortunately, the component itself is very flexible, and basically everything
+about it can be customized. It supports
+
+1. [Custom channel preview](#custom-channel-preview)
+2. [Custom channel list wrapper](#custom-channel-list-wrapper)
+3. [Custom channel list renderer](#custom-channel-list-renderer)
+4. [Custom paginator](../channel-list-infinite-scroll.mdx)
+
+This guide takes a deep dive into these customization options.
+
+## Custom Channel Preview
+
+You can think of a channel preview as a single item of the channel list. The
+preview should accurately display the current channel state and handle user
+interactions to switch to the selected channel.
+
+
+
+You can customize the look and behavior of the channel previews by providing a
+custom component in the [`Preview`](../../components/core-components/channel-list.mdx#preview) prop of the `ChannelList` component. When
+rendering previews, `ChannelList` wraps each item with a `ChannelPreview`
+wrapper that handles channel events such as new, updated and deleted messages.
+This way, you don't have to subscribe to these events yourself, and you can just
+grab the latest state from the props instead.
+
+```jsx
+
+// Don't forget to provide filter and sort options as well!
+```
+
+Let's implement a simple custom preview:
+
+
+
+
+```jsx
+const CustomChannelPreview = ({ displayImage, displayTitle, latestMessage }) => (
+
+
+
+
{displayTitle}
+
{latestMessage}
+
+
+);
+```
+
+
+
+
+```css
+.channel-preview {
+ display: flex;
+ gap: 16px;
+ align-items: center;
+ font-size: 0.9em;
+ line-height: 1.2em;
+}
+
+.channel-preview__avatar {
+ width: 64px;
+ height: 64px;
+ border-radius: 50%;
+ object-fit: cover;
+}
+
+.channel-preview__main {
+ flex-grow: 1;
+}
+
+.channel-preview__header {
+ font-weight: bold;
+ margin-bottom: 4px;
+}
+
+.channel-preview__message {
+ max-height: 2.4em;
+ overflow: hidden;
+ color: #858688;
+}
+
+.channel-preview__message p {
+ margin: 0;
+}
+```
+
+
+
+
+(See also the complete reference of [the available preview component props](../../components/utility-components/channel-preview-ui.mdx).)
+
+
+
+The props provided to the preview component are usually sufficient to render the
+preview. However, if you need additional data, you can always get it from the
+channel state. In this next example, we will add the timestamp of the latest
+message in the channel:
+
+
+
+
+```jsx
+const CustomChannelPreview = (props) => {
+ const { channel, displayImage, displayTitle, latestMessage } = props;
+ const { userLanguage } = useTranslationContext();
+ const latestMessageAt = channel.state.last_message_at;
+
+ const timestamp = useMemo(() => {
+ if (!latestMessageAt) {
+ return '';
+ }
+ const formatter = new Intl.DateTimeFormat(userLanguage, {
+ timeStyle: 'short',
+ });
+ return formatter.format(latestMessageAt);
+ }, [latestMessageAt, userLanguage]);
+
+ return (
+
+
+
+
+ {displayTitle}
+
+
+
{latestMessage}
+
+
+ );
+};
+```
+
+
+
+
+```css
+.channel-preview {
+ display: flex;
+ gap: 16px;
+ align-items: center;
+ font-size: 0.9em;
+ line-height: 1.2em;
+}
+
+.channel-preview__avatar {
+ width: 64px;
+ height: 64px;
+ border-radius: 50%;
+ object-fit: cover;
+}
+
+.channel-preview__main {
+ flex-grow: 1;
+}
+
+.channel-preview__header {
+ display: flex;
+ justify-content: space-between;
+ font-weight: bold;
+ margin-bottom: 4px;
+}
+
+.channel-preview__timestamp {
+ font-weight: normal;
+ color: #858688;
+}
+
+.channel-preview__message {
+ max-height: 2.4em;
+ overflow: hidden;
+ color: #858688;
+}
+
+.channel-preview__message p {
+ margin: 0;
+}
+```
+
+
+
+
+
+
+One more thing we should add is the click event handler, which should change the
+currently active channel. That's easy enough to do:
+
+
+
+
+```jsx
+const CustomChannelPreview = (props) => {
+ const {
+ channel,
+ activeChannel,
+ displayImage,
+ displayTitle,
+ latestMessage,
+ setActiveChannel,
+ } = props;
+ const latestMessageAt = channel.state.last_message_at;
+ const isSelected = channel.id === activeChannel?.id;
+ const { userLanguage } = useTranslationContext();
+
+ const timestamp = useMemo(() => {
+ if (!latestMessageAt) {
+ return '';
+ }
+ const formatter = new Intl.DateTimeFormat(userLanguage, {
+ timeStyle: 'short',
+ });
+ return formatter.format(latestMessageAt);
+ }, [latestMessageAt, userLanguage]);
+
+ const handleClick = () => {
+ setActiveChannel?.(channel);
+ };
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.channel-preview {
+ font: inherit;
+ border: 2px solid transparent;
+ border-radius: 8px;
+ background: none;
+ text-align: left;
+ padding: 8px;
+ display: flex;
+ gap: 16px;
+ align-items: center;
+ font-size: 0.9em;
+ line-height: 1.2em;
+ cursor: pointer;
+}
+
+.channel-preview_selected {
+ background: #fff;
+ border-color: #005fff;
+ cursor: auto;
+}
+
+.channel-preview__avatar {
+ width: 64px;
+ height: 64px;
+ border-radius: 50%;
+ object-fit: cover;
+}
+
+.channel-preview__main {
+ flex-grow: 1;
+}
+
+.channel-preview__header {
+ display: flex;
+ justify-content: space-between;
+ font-weight: bold;
+ margin-bottom: 4px;
+}
+
+.channel-preview_selected .channel-preview__header {
+ color: #005fff;
+}
+
+.channel-preview__timestamp {
+ font-weight: normal;
+ color: #858688;
+}
+
+.channel-preview__message {
+ max-height: 2.4em;
+ overflow: hidden;
+ color: #858688;
+}
+
+.channel-preview__message p {
+ margin: 0;
+}
+```
+
+
+
+
+
+
+Note that we've also added an additional class to the preview element if its
+channel is currently active (we check this by comparing the id of the active
+channel to the id of the current channel.)
+
+## Custom Channel List Wrapper
+
+Channel list wrapper is responsible for rendering the actual items of the
+channel list, as well as handling the loading and error states. This is a great
+place to plug in your custom component if you want to have a custom loader, or
+to add some additional content (like header and footer) to the channel list.
+
+You can do this by providing a custom custom component in the [`List`](../../components/core-components/channel-list.mdx#list) prop of the
+`ChannelList` component. It will get a bunch of props from the parent
+`ChannelList`, including a list of loaded channels, a loading flag, and an error
+object (if any).
+
+```jsx
+
+// Don't forget to provide filter and sort options as well!
+```
+
+The simplest implementation of the custom channel list wrapper looks like this:
+
+
+
+
+```jsx
+const CustomChannelList = ({ children, loading, error }) => {
+ if (loading) {
+ return
⏳ Loading...
;
+ }
+
+ if (error) {
+ return (
+
+ 💣 Error loading channels
+
+
+
+ );
+ }
+
+ return (
+
+ {loadedChannels && (
+
{loadedChannels.length} channels:
+ )}
+ {children}
+
+ );
+};
+```
+
+
+
+
+```css
+.channel-list__placeholder {
+ padding: 120px 20px;
+ text-align: center;
+}
+
+.channel-list__button {
+ border: 1px solid #00000014;
+ outline: 0;
+ background: #fafafa;
+ font: inherit;
+ border-radius: 4px;
+ margin: 8px;
+ padding: 8px;
+ cursor: pointer;
+}
+
+.channel-list__button:focus {
+ border-color: #005fff;
+}
+```
+
+
+
+
+import ChannelListLoadingStateImage from '../../assets/channel-list-loading.png';
+import ChannelListErrorStateImage from '../../assets/channel-list-error.png';
+import ChannelListNormalStateImage from '../../assets/channel-list-preview-selected.png';
+
+Loading state,
+ alt: '',
+ },
+ {
+ image: ChannelListErrorStateImage,
+ caption: Error state,
+ alt: '',
+ },
+ {
+ image: ChannelListNormalStateImage,
+ caption: Normal state,
+ alt: '',
+ },
+ ]}
+/>
+
+If you need access to the array of channel objects, you can use the
+`loadedChannels` prop. Keep in mind, however, that it can update frequently,
+resulting in excessive rendering. For this reason, you have to explicitly opt-in
+by setting the [`sendChannelsToList`](../../components/core-components/channel-list.mdx#sendchannelstolist) prop on the `ChannelList`:
+
+
+
+
+```jsx
+;
+// Don't forget to provide filter and sort options as well!
+
+const CustomChannelList = ({
+ loadedChannels,
+ children,
+ loading,
+ error,
+}: React.PropsWithChildren>) => {
+ if (loading) {
+ return
+ );
+};
+```
+
+
+
+
+```css
+.channel-list__placeholder {
+ padding: 120px 20px;
+ text-align: center;
+}
+
+.channel-list__button {
+ border: 1px solid #00000014;
+ outline: 0;
+ background: #fafafa;
+ font: inherit;
+ border-radius: 4px;
+ margin: 8px;
+ padding: 8px;
+ cursor: pointer;
+}
+
+.channel-list__button:focus {
+ border-color: #005fff;
+}
+
+.channel-list__counter {
+ color: #858688;
+ margin: 0 10px 8px;
+}
+```
+
+
+
+
+
+
+## Custom Channel List Renderer
+
+By default, the [`ChannelList`](../../components/core-components/channel-list.mdx) component provided by the SDK renders channel
+previews in the same order as the channels were queried. If you want to hook
+into the list rendering process, e.g. to add subheadings, group channels, etc.,
+you can provide a custom list renderer in the [`renderChannels`](../../components/core-components/channel-list.mdx#renderchannels) prop of the
+`ChannelList` component.
+
+The function passed in this prop takes a list of loaded channels and a channel
+preview component. Note that it is not exactly the component passed in the
+[`Preview`](../../components/core-components/channel-list.mdx#preview) prop, but rather a version of that component wrapped with the
+`ChannelPreview` helper to ensure that all channel event listeners are set up
+properly. The `renderChannels` function is only called if the channel list was
+successfully loaded and is not empty.
+
+This example adds a separator between read and unread channels:
+
+
+
+
+```jsx
+const renderChannels = (channels, getChannelPreview) => {
+ const unreadChannels = [];
+ const readChannels = [];
+
+ for (const channel of channels) {
+ const hasUnread = channel.countUnread();
+ (hasUnread ? unreadChannels : readChannels).push(channel);
+ }
+
+ return [unreadChannels, readChannels]
+ .filter((group) => group.length > 0)
+ .map((group, index) => (
+
+ {group.map((channel) => (
+
{getChannelPreview(channel)}
+ ))}
+
+ ));
+};
+```
+
+
+
+
+```css
+.channel-group + .channel-group {
+ padding-top: 40px;
+ margin-top: 40px;
+ border-top: 2px solid #00000014;
+}
+```
+
+
+
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-search.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-search.mdx
new file mode 100644
index 0000000000..82f2356149
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/channel-search.mdx
@@ -0,0 +1,904 @@
+---
+id: channel_search
+title: Channel Search
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+Channel search is used to find channels based on a query that includes user
+input. Depending on your needs, it can be used to either find existing
+conversations, start new ones, or do both.
+
+There are two ways to use the built-in search functionality:
+
+1. by enabling search in the `ChannelList` component with the
+ [`showChannelSearch`](../../components/core-components/channel-list.mdx#showchannelsearch) prop,
+2. or by using the [`ChannelSearch`](../../components/utility-components/channel-search.mdx) component directly.
+
+Whichever works better for you, the [`ChannelSearch`](../../components/utility-components/channel-search.mdx) component is the one that handles the UI logic.
+
+In the first case, if you're using the search functionality of the
+`ChannelList` component, the `ChannelSearch` is rendered by the `ChannelList`.
+You can still pass props to the underlying `ChannelSearch` through the
+[`additionalChannelSearchProps`](../../components/core-components/channel-list.mdx#showchannelsearch#additionalchannelsearchprops).
+
+For example, you could enable search in the `ChannelList` (with the
+[`showChannelSearch`](../../components/core-components/channel-list.mdx#showchannelsearch) prop), and configure the search results to include both channels
+and users by passing settings in the [`additionalChannelSearchProps`](../../components/core-components/channel-list.mdx#showchannelsearch#additionalchannelsearchprops):
+
+```jsx
+
+```
+
+In the second case, if you're using the [`ChannelSearch`](../../components/utility-components/channel-search.mdx) component directly,
+you can pass settings directly as props of the `ChannelSearch` component:
+
+```jsx
+
+```
+
+## Component Anatomy
+
+The [`ChannelSearch`](../../components/utility-components/channel-search.mdx) component consists of the search bar (including the search
+input), the results header, and the results list (consisting of individual search
+results items).
+
+
+
+Each of these components can be overridden by passing custom components in the
+[`ChannelSearch` props](../../components/utility-components/channel-search.mdx#Props):
+
+```jsx
+
+```
+
+If you're using the search functionality of the `ChannelList` components, you
+can pass the same custom components to the [`additionalChannelSearchProps`](../../components/core-components/channel-list.mdx#showchannelsearch#additionalchannelsearchprops):
+
+```jsx
+
+```
+
+Next, we'll take a closer look at some of these customization options. But first, we encourage you to explore the many out-of-the-box [customization options](../../components/utility-components/channel-search.mdx) that do not require you to provide custom components.
+
+
+
+## Overriding the Search Result Item
+
+You can override the way each search result item is presented by providing a
+custom `SearchResultItem`.
+
+```jsx
+
+```
+
+Or:
+
+```jsx
+
+// Don't forget to provide filter and sort options as well!
+```
+
+This component receives a search result item as a prop, which can be either a
+`UserResponse` or a `Channel` (if the [`searchForChannels`](../../components/utility-components/channel-search.mdx#searchforchannels) option is enabled).
+
+Your custom implementation should be able to:
+
+1. Display both channel and user search result items.
+2. Provide visual feedback for an item focused with the arrow keys. We can do this by
+ looking at the `focusUser` prop which contains the index of the currently
+ selected item.
+3. When clicked, it should invoke the `selectResult` callback.
+
+
+
+
+```jsx
+const CustomSearchResultItem = ({ result, index, focusedUser, selectResult }) => {
+ const isChannel = result.cid;
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.search-result-item {
+ font: inherit;
+ border: 0;
+ background: none;
+ padding: 10px 20px 10px 50px;
+ text-align: left;
+}
+
+.search-result-item:not(:last-child) {
+ border-bottom: 1px solid #dbdde1;
+}
+
+.search-result-item_focused {
+ background: #dbdde1;
+}
+
+.search-result-item__icon {
+ display: inline-block;
+ width: 30px;
+ margin-left: -30px;
+}
+```
+
+
+
+
+
+
+## Implementing Search from Scratch
+
+You don't have to rely on the components provided in the SDK to implement
+search. For ultimate customization, it's not too difficult to implement search
+from scratch. You'll have to manage the state yourself, and use our low-level client
+methods to query for results, but the upside is that you can manipulate the
+results however you like.
+
+See our client documentation to learn how to query for [channels](https://getstream.io/chat/docs/react/query_channels/?language=javascript),
+[users](https://getstream.io/chat/docs/react/query_users/?language=javascript), or [messages](https://getstream.io/chat/docs/react/search/?language=javascript). As a quick reference, here are the queries we will
+be using:
+
+```js
+// Query at most 5 messaging channels where current user is a member,
+// by channel name:
+const channels = await client.queryChannels(
+ {
+ type: 'messaging',
+ name: { $autocomplete: query },
+ members: { $in: [userId] },
+ },
+ { last_message_at: -1, updated_at: -1 },
+ { limit: 5 },
+);
+```
+
+```js
+// Query at most 5 users (except the current one), by user name or id:
+const { users } = await client.queryUsers(
+ {
+ $or: [{ id: { $autocomplete: query } }, { name: { $autocomplete: query } }],
+ id: { $ne: userId },
+ },
+ { id: 1, name: 1 },
+ { limit: 5 },
+);
+```
+
+```js
+// Query at most 5 messages from the messaging channels where current user
+// is a member, by message text:
+const { results } = await client.search({ type: 'messaging', members: { $in: [userId] } }, query, {
+ limit: 5,
+});
+const messages = results.map((item) => item.message);
+```
+
+Next, let's add some simple text input and some buttons to search for channels,
+users, or messages:
+
+
+
+
+```jsx
+const CustomSearch = () => {
+ const [query, setQuery] = useState('');
+
+ return (
+
+ );
+};
+```
+
+Finally, we need to display the search results to the user. You can use components
+like `ChannelPreview` that come with the SDK, or you can create your own. Let's
+create very simple preview components for channels, users, and messages:
+
+
+
+
+```jsx
+const ChannelSearchResultPreview = ({ channel }) => (
+
+ );
+};
+```
+
+
+
+
+```css
+.search-results {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.search-results__item {
+ padding-left: 30px;
+}
+
+.search-results__item:not(:last-child) {
+ margin-bottom: 10px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #dbdde1;
+}
+
+.search-results__icon {
+ display: inline-block;
+ width: 30px;
+ margin-left: -30px;
+}
+```
+
+
+
+
+
+
+
+
+What happens when you click on a search result depends on your desired user
+experience. If you click on a channel, it makes sense to set the channel as
+active. When clicking on a user, you may want to create or open a channel with
+a one-on-one conversation with the user. When clicking on a message, it's
+probably expected that a relevant channel will be set as active and scrolled to the
+message.
+
+
+
+
+```jsx
+import { useChatContext } from 'stream-chat-react';
+
+const ChannelSearchResultPreview = ({ channel }) => {
+ const { setActiveChannel } = useChatContext();
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.search-input {
+ width: 100%;
+ border: 0;
+ border-radius: 10px;
+ background: #00000014;
+ font: inherit;
+ padding: 10px 15px;
+}
+
+.search-input::-webkit-search-cancel-button {
+ appearance: none;
+}
+
+.search-actions {
+ display: flex;
+ flex-direction: column;
+ margin: 10px 0 20px;
+}
+
+.search-button {
+ background: #00000014;
+ border: 0;
+ border-bottom: 1px solid #dbdde1;
+ padding: 10px 15px;
+ cursor: pointer;
+}
+
+.search-button:first-child {
+ border-radius: 10px 10px 0 0;
+}
+
+.search-button:last-child {
+ border-radius: 0 0 10px 10px;
+ border-bottom: 0;
+}
+
+.search-button:hover {
+ background: #dbdde1;
+}
+
+.search-results {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.search-results__item {
+ padding-left: 30px;
+}
+
+.search-results__item:not(:last-child) {
+ margin-bottom: 10px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #dbdde1;
+}
+
+.search-results__icon {
+ display: inline-block;
+ width: 30px;
+ margin-left: -30px;
+}
+```
+
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/emoji-picker.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/emoji-picker.mdx
new file mode 100644
index 0000000000..fe01c7449f
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/emoji-picker.mdx
@@ -0,0 +1,74 @@
+---
+id: emoji_picker
+title: Emoji Picker
+---
+
+In this guide we'll show you how to add `EmojiPicker` component to your chat application as no chat experience is complete without emojis.
+
+## Prerequisities
+
+Our `EmojiPicker` is built on top of `emoji-mart` so let's begin with installing `emoji-mart`-related packages (make sure they meet our [peer-dependency requirements](https://github.com/GetStream/stream-chat-react/blob/v11.0.0/package.json#L97-L99)):
+
+```bash
+yarn add emoji-mart @emoji-mart/data @emoji-mart/react
+```
+
+## Basic Usage
+
+The SDK `EmojiPicker` carries both button and the actual picker components and owns its "open" state.
+
+```tsx
+import { Channel } from 'stream-chat-react';
+import { EmojiPicker } from 'stream-chat-react/emojis';
+
+const WrappedChannel = ({ children }) => {
+ return {children};
+};
+```
+
+
+
+## Building custom EmojiPicker component
+
+If `emoji-mart` is too heavy for your use-case and you'd like to build your own you can certainly do so, here's a very simple `EmojiPicker` example built using native emojis:
+
+```tsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const emojis = ['🍳', '🥐', '🥓', '🧇', '🥞', '🍩'];
+
+export const CustomEmojiPicker = () => {
+ const [open, setOpen] = useState(false);
+
+ const { insertText, textareaRef } = useMessageInputContext('CustomEmojiPicker');
+
+ return (
+
+ {open && (
+
+ {emojis.map((emoji) => (
+
+ ))}
+
+ )}
+
+
+
+ );
+};
+```
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/gallery.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/gallery.mdx
new file mode 100644
index 0000000000..34722be191
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/gallery.mdx
@@ -0,0 +1,114 @@
+---
+id: image_gallery
+title: Image Gallery
+---
+
+import Gallery from '../../assets/Gallery.png';
+
+In this example, we demonstrate how to replace our default image [`Gallery`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/Gallery.tsx)
+component with a custom implementation. The `Gallery` component is a child of `Attachment`, so we'll need
+to create a custom `Attachment` component as well.
+
+## React Image Gallery
+
+In this example, we are going to use the [`react-image-gallery`](https://www.npmjs.com/package/react-image-gallery)
+dependency. Many pre-built React image galleries exists, so this demo just shows one possible way to replace the
+library's default `Gallery` component.
+
+We'll need to import a few additional modules into our app to access the main component, an item type, and the
+distributed CSS:
+
+```tsx
+import ImageGallery, { ReactImageGalleryItem } from 'react-image-gallery';
+import 'react-image-gallery/styles/css/image-gallery.css';
+```
+
+## Custom Gallery
+
+A custom component will always receive the same props as the library's default. In the case of `Gallery`, the custom component
+receives an array of image objects to be loaded. Each image object contains an `image_url` key, which references the CDN-hosted
+URL of the image.
+
+The `ImageGallery` component we've imported requires an `items` prop. The `items` prop accepts a similar array of image objects,
+with the `original` key as the only required type. The `original` key references the image URL, similar to the `image_url`
+key coming into the component via props.
+
+To make the types line up, we manipulate the props array of images slightly, and pass into the `ImageGallery` component.
+
+```tsx
+const CustomGallery: React.FC = (props) => {
+ const { images } = props;
+
+ const updatedImages: ReactImageGalleryItem[] = [];
+
+ Object.values(images).forEach((image) => {
+ if (image.image_url) {
+ updatedImages.push({ original: image.image_url });
+ }
+ });
+
+ return ;
+};
+```
+
+## Custom Attachment
+
+In order to render our `CustomGallery` component, we need to supply it as a prop to the
+[`Attachment`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Attachment.tsx)
+component. The resulting `CustomAttachment` component is then added to `Channel`, so it can be injected into the
+`ComponentContext` and consumed within the [Message UI](../../components/message-components/message-ui.mdx) component.
+
+```tsx
+const CustomAttachment: React.FC = (props) => (
+
+);
+
+{/* children of Channel component */};
+```
+
+## Implementation
+
+Now that each individual piece has been constructed, we can assemble all of the snippets into the final code example.
+
+### The Code
+
+```tsx
+import ImageGallery, { ReactImageGalleryItem } from 'react-image-gallery';
+import 'react-image-gallery/styles/css/image-gallery.css';
+
+const CustomGallery: React.FC = (props) => {
+ const { images } = props;
+
+ const updatedImages: ReactImageGalleryItem[] = [];
+
+ Object.values(images).forEach((image) => {
+ if (image.image_url) {
+ updatedImages.push({ original: image.image_url });
+ }
+ });
+
+ return ;
+};
+
+const CustomAttachment: React.FC = (props) => {
+ return ;
+};
+
+const App = () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+```
+
+### The Result
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/giphy-preview.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/giphy-preview.mdx
new file mode 100644
index 0000000000..2f2cbcc9fe
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/giphy-preview.mdx
@@ -0,0 +1,79 @@
+---
+id: giphy_preview
+title: Giphy Preview
+---
+
+import GiphyPreview from '../../assets/GiphyPreview.png';
+
+This example demonstrates how to build a custom component to override the default `GiphyPreviewMessage` component that is rendered optionally in the
+`VirtualizedMessageList`.
+
+## separateGiphyPreview Prop
+
+When the `separateGiphyPreview` prop on the list is set to true, the Giphy preview is rendered in a separate component above the `MessageInput` rather than inline with the other messages in the list.
+This separate component makes it so the preview doesn't scroll away in the large channel.
+
+```jsx
+
+```
+
+## Implementation
+
+Our custom preview component will render an `Attachment` component with a custom `AttachmentActions` UI component, which handles the onClick functionality.
+This functionality is handled with the `handleAction` method via the `Message` component's `useActionHandler` hook.
+
+```jsx
+const CustomAttachmentActions: React.FC = (props) => {
+ const { actionHandler, actions } = props;
+
+ const handleClick = async (
+ event: React.MouseEvent,
+ value?: string,
+ name?: string,
+ ) => {
+ try {
+ if (actionHandler) await actionHandler(name, value, event);
+ } catch (err) {
+ console.log(err);
+ }
+ };
+
+ return (
+ <>
+ {actions.map((action) => (
+
+ ))}
+ >
+ );
+};
+
+const CustomGiphyPreview: React.FC = (props) => {
+ const { message } = props;
+
+ const handleAction = useActionHandler(message);
+
+ if (!message.attachments) return null;
+
+ return (
+
+ );
+};
+
+
+
+
+
+
+
+;
+```
+
+## The Result
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/link-preview.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/link-preview.mdx
new file mode 100644
index 0000000000..5d3b357f22
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/link-preview.mdx
@@ -0,0 +1,394 @@
+---
+id: link-previews
+title: Link Previews in Message Input
+---
+
+import LinkPreviewMessageInput from '../../assets/link-preview-message-input.png';
+import LinkPreviewEditMessageForm from '../../assets/link-preview-edit-message-form.png';
+
+The purpose of link previews in the `MessageInput` is to provide visual guides of what a user may expect to be rendered later in the `MessageList` by [`Card` component](../../../components/message-components/attachment#card) among message attachments.
+
+## Rendering of link previews
+
+The link previews are rendered using `LinkPreviewList`. The component accepts a single prop `linkPreviews` which is an array of `LinkPreview` objects.
+
+### The default LinkPreviewList component
+
+The default `LinkPreviewList` component lists all the successfully loaded previews.
+
+The default link preview UI is implemented for:
+
+**Message input**
+
+
+
+
+
+**Edit message form**
+
+
+
+### Enabling link previews
+
+Link previews have to be enabled in two places:
+
+- [**channel config property `url-enrichment`**](https://getstream.io/chat/docs/javascript/channel-level_settings/?language=javascript&q=url_enrichment#list-of-settings-that-can-be-overridden) - enabled by default
+- `enrichURLForPreview` prop - disabled by default
+
+Those who have not previously disabled `url-enrichment` in the channel config, can enable link previews in `MessageInput` by setting `enrichURLForPreview` in one of the following places:
+
+**Channel props**
+
+```tsx
+import {
+ Channel,
+ ChannelHeader,
+ VirtualizedMessageList as MessageList,
+ MessageInput,
+ Thread,
+ Window,
+} from 'stream-chat-react';
+
+const App = () => (
+ // highlight-next-line
+
+
+
+
+
+
+
+
+);
+
+export default App;
+```
+
+**MessageList or VirtualizedMessageList (applied to EditMessageForm)**
+
+```tsx
+import { Channel, VirtualizedMessageList as MessageList } from 'stream-chat-react';
+
+const App = () => (
+
+ {/* ... */}
+ // highlight-start
+
+ // highlight-end
+ {/* ... */}
+
+);
+
+export default App;
+```
+
+**Thread (applied to MessageInput)**
+
+```tsx
+import { Channel, Thread } from 'stream-chat-react';
+
+const App = () => (
+
+ {/* ... */}
+ // highlight-start
+
+ // highlight-end
+
+);
+
+export default App;
+```
+
+**MessageInput**
+
+```tsx
+import { Channel, MessageInput } from 'stream-chat-react';
+
+const App = () => (
+
+ {/* ... */}
+ // highlight-next-line
+
+ {/* ... */}
+
+);
+
+export default App;
+```
+
+## Link Preview customization
+
+### Custom rendering of link previews
+
+If the default link previews UI does not meet our expectations, we can provide a custom component. To render our own `LinkPreviewList`, we just need to pass it to `Channel` prop `LinkPreviewList`. The component will be passed `linkPreviews`, an array of `LinkPreview` objects.
+
+```tsx
+import { Channel, LinkPreviewListProps, LinkPreviewState } from 'stream-chat-react';
+
+import { LinkPreviewCardLoaded, LinkPreviewCardLoading } from './LinkPreviewCard';
+
+const CustomLinkPreviewList = ({ linkPreviews }: LinkPreviewListProps) => {
+ const showLinkPreviews = linkPreviews.length > 0;
+
+ if (!showLinkPreviews) return null;
+
+ return (
+
+ );
+};
+
+const App = () => (
+ // highlight-next-line
+
+ {/* ... */}
+
+);
+
+export default App;
+```
+
+### Link preview states
+
+In the above example we can notice, that the `LinkPreview` object comes with property `state`. This property can be used to determine, how the preview for a given link should be rendered. These are the possible states a link preview can acquire:
+
+```typescript
+enum LinkPreviewState {
+ /** Link preview has been dismissed using MessageInputContextValue.dismissLinkPreview **/
+ DISMISSED = 'dismissed',
+ /** Link preview could not be loaded, the enrichment request has failed. **/
+ FAILED = 'failed',
+ /** Link preview has been successfully loaded. **/
+ LOADED = 'loaded',
+ /** The enrichment query is in progress for a given link. **/
+ LOADING = 'loading',
+ /** The link is scheduled for enrichment. **/
+ QUEUED = 'queued',
+}
+```
+
+### Behavior customization
+
+The following aspect of link preview management in `MessageInput` can be customized:
+
+- The debounce interval for the URL discovery and enrichment requests.
+- URL discovery
+- Link preview dismissal
+
+In general, the behavior can be customized in two ways:
+
+1. globally through `Channel` props (`enrichURLForPreviewConfig`)
+2. with more granularity over `MessageList`, `VirtualizedMessageList`, `Thread`, `MessageInput` props (`additionalMessageInputProps.urlEnrichmentConfig`)
+
+#### Custom debounce interval
+
+The default debounce interval is 1.5 seconds. The URL discovery and enrichment will thus not start until the stops typing for at least 1.5 seconds. This interval can be increased or decreased by passing `debounceURLEnrichmentMs` configuration parameter.
+
+Global debounce interval configuration over `Channel`:
+
+```tsx
+import {
+ Channel,
+ MessageInput,
+ Thread,
+ VirtualizedMessageList as MessageList,
+} from 'stream-chat-react';
+
+const debounceURLEnrichmentMs = 1000;
+
+const App = () => (
+
+
+
+
+
+);
+```
+
+Local debounce configuration:
+
+```tsx
+import {
+ Channel,
+ MessageInput,
+ Thread,
+ VirtualizedMessageList as MessageList,
+} from 'stream-chat-react';
+
+const debounceURLEnrichmentMs = 1000;
+const additionalMessageInputProps = {
+ urlEnrichmentConfig: { debounceURLEnrichmentMs },
+};
+
+const App = () => (
+
+
+
+
+
+);
+```
+
+#### Custom text parsing function
+
+If the default link discovery functionality is not sufficient, this can be overridden by providing `findURLFn` custom function. The requirement is that the function returns an array of strings - links - that will be later used to scrape the data.
+
+The parameter set globally over `Channel` props:
+
+```tsx
+import {
+ Channel,
+ MessageInput,
+ Thread,
+ VirtualizedMessageList as MessageList,
+} from 'stream-chat-react';
+
+import { searchForURLs } from '../utils';
+
+const App = () => (
+
+
+
+
+
+);
+```
+
+Local configuration of URL discovery function:
+
+```tsx
+import {
+ Channel,
+ MessageInput,
+ Thread,
+ VirtualizedMessageList as MessageList,
+} from 'stream-chat-react';
+
+import { searchForURLs } from '../utils';
+
+const additionalMessageInputProps = {
+ urlEnrichmentConfig: { findURLFn: searchForURLs },
+};
+
+const App = () => (
+
+
+
+
+
+);
+```
+
+#### Custom actions on link preview dismissal
+
+When a link preview is dismissed, it's state is set to `'dismissed'`. This behavior can be expanded (not changed) by providing `onLinkPreviewDismissed` callback. The callback is invoked at the beginning of the dismissal procedure. It is then followed by state update marking the given URL preview as `'dismissed'`.
+
+The `onLinkPreviewDismissed` callback can be passed to `Channel` prop `enrichURLForPreviewConfig`:
+
+```tsx
+import {
+ Channel,
+ LinkPreview,
+ MessageInput,
+ Thread,
+ VirtualizedMessageList as MessageList,
+} from 'stream-chat-react';
+
+const onLinkPreviewDismissed = (linkPreview: LinkPreview) => {
+ // custom logic to invoke, when a given link preview is dismissed
+};
+
+const App = () => (
+
+
+
+
+
+);
+```
+
+The configuration can be passed individually to `MessageList`, `VirtualizedMessageList`, `Thread`, `MessageInput`:
+
+```tsx
+import {
+ Channel,
+ LinkPreview,
+ MessageInput,
+ Thread,
+ VirtualizedMessageList as MessageList,
+} from 'stream-chat-react';
+
+const onLinkPreviewDismissed = (linkPreview: LinkPreview) => {
+ // custom logic to invoke, when a given link preview is dismissed
+};
+
+const additionalMessageInputProps = {
+ urlEnrichmentConfig: { onLinkPreviewDismissed },
+};
+
+const App = () => (
+
+
+
+
+
+);
+```
+
+### EnrichURLsController API
+
+In case we would aspire at implementing custom `MessageInput` components that would require control over link previews, we can access the API over the `MessageInputContext` value. This is the API that allows us:
+
+- to trigger URL search in message text and enrichment - `findAndEnqueueURLsToEnrich`
+- cancel the URL enrichment (for example when submitting a message) - `cancelURLEnrichment`
+- dismiss the loaded link previews assigning them with state `dismissed` - `dismissLinkPreview`
+
+```tsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const CustomMessageInputUI = () => {
+ const {
+ cancelURLEnrichment,
+ findAndEnqueueURLsToEnrich,
+ dismissLinkPreview,
+ } = useMessageInputContext();
+
+ // ...
+};
+
+const App = () => {
+
+ {/* ... */}
+ ;
+};
+```
+
+:::note
+The `findAndEnqueueURLsToEnrich` function serves as an indicator, whether the link preview feature is actually enabled in the application.
+:::
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/override-submit-handler.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/override-submit-handler.mdx
new file mode 100644
index 0000000000..dcc818953d
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/override-submit-handler.mdx
@@ -0,0 +1,147 @@
+---
+id: override_submit_handler
+title: Input Submit Handler
+---
+
+import SubmitHandler from '../../assets/SubmitHandler.png';
+import MessageCustomPayload from '../../assets/message-payload-custom-fields.png';
+
+In this example, we demonstrate how to provide custom logic and override the [`MessageInput`](../../components/message-input-components/message-input.mdx)
+component's default submit handler function. Our custom handler function will bold any message text.
+
+## overrideSubmitHandler Prop
+
+The `MessageInput` component accepts an `overrideSubmitHandler` prop, which allows you to add custom logic to the
+conclusion of the underlying `textarea` element's [`handleSubmit`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useSubmitHandler.ts)
+function.
+
+:::note
+You do not have to implement your custom submit handler, if the only thing you need is to pass custom message data to the underlying API call. In that case you can use the [`handleSubmit`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useSubmitHandler.ts) function from the [`MessageInputContext`](../../components/contexts/message-input-context.mdx). The `handleSubmit` function allows you to pass custom message data through its second parameter `customMessageData`. This applies to sending a new message as well as updating an existing one. In order for this to work, you will have to implement custom message input components and pass them to [`Channel`](../../components/core-components/channel.mdx) props `EditMessageInput` or `Input` respectively.
+:::
+
+The `overrideSubmitHandler` function receives three arguments, the message to be sent, the `cid` (channel type prepended to channel id)
+for the currently active channel and optionally custom message data. The message object (the first argument) is of the following type:
+
+```tsx
+type MessageToSend = {
+ attachments?: MessageAttachments;
+ error?: ErrorFromResponse;
+ errorStatusCode?: number;
+ id?: string;
+ mentioned_users?: UserResponse[];
+ parent?: StreamMessage;
+ parent_id?: string;
+ status?: string;
+ text?: string;
+};
+```
+
+:::important
+Call the `sendMessage` function from the [`ChannelActionContext`](../../components/contexts/channel-action-context.mdx#sendmessage) within
+your custom function to ensure a message is sent to the active channel.
+:::
+
+## Custom Function
+
+For this example, we will take the input text entered by the user and wrap it in two asterisks to render bold markdown. Once we've
+added the markdown characters, we call the `sendMessage` function with the updated message object.
+
+```tsx
+const overrideSubmitHandler = (message: MessageToSend, cid: string) => {
+ const boldMessage = {
+ ...message,
+ text: `**${message.text}**`,
+ };
+
+ sendMessage(boldMessage);
+};
+```
+
+## Implementation
+
+Now that we have our custom function, we can add the `overrideSubmitHandler` prop to the `MessageInput` component and begin sending
+bold text to our `MessageList`.
+
+:::note
+Since `sendMessage` is drawn from the `ChannelActionContext`, we must create an inner component that is a child of `Channel` and
+call the `useChannelActionContext` custom hook.
+:::
+
+### The Code
+
+```tsx
+const ChannelInner: React.FC = () => {
+ const { sendMessage } = useChannelActionContext();
+
+ const overrideSubmitHandler = (message: MessageToSend, cid: string) => {
+ const boldMessage = {
+ ...message,
+ text: `**${message.text}**`,
+ };
+
+ sendMessage(boldMessage);
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+};
+
+const App = () => (
+
+
+
+
+
+
+);
+```
+
+### The Result
+
+
+
+## Adding custom message data
+
+If you would like to store custom data on your message objects, you can pass additional parameters to the [`sendMessage`](../../components/contexts/channel-action-context.mdx#sendmessage) function you retrieve from `ChannelActionContext`.
+
+Now, the `overrideSubmitHandler` implementation may change as follows:
+
+```tsx
+import React from 'react';
+import {
+ ChannelHeader,
+ MessageList,
+ MessageInput,
+ Window,
+ MessageToSend,
+ useChannelActionContext,
+} from 'stream-chat-react';
+
+const ChannelInner = () => {
+ const { sendMessage } = useChannelActionContext();
+
+ const overrideSubmitHandler = (message: MessageToSend, cid: string) => {
+ sendMessage(message, { important: true });
+ };
+
+ return (
+
+
+
+
+
+ );
+};
+```
+
+In your browser's Developer tools Network tab you can now observe, that the message payload includes the custom field:
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/overview.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/overview.mdx
new file mode 100644
index 0000000000..d5391b33f9
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/overview.mdx
@@ -0,0 +1,29 @@
+---
+id: customization-overview
+slug: /guides/customization/
+title: Overview
+---
+
+When [Theming](../../theming/introduction.mdx) is not enough for how you want our chat SDK to look and behave, customization is the next step. By customizing specific components you can make precise adjustments to the look and feel of our SDK exactly where you need them.
+
+## Showcase of the Default UI Components
+
+### MessageList
+
+
+
+### ChannelList
+
+
+
+### MessageInput
+
+
+
+### ChannelHeader
+
+
+
+### Thread
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/persist-input-text-in-local-storage.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/persist-input-text-in-local-storage.mdx
new file mode 100644
index 0000000000..01cb6bf235
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/persist-input-text-in-local-storage.mdx
@@ -0,0 +1,189 @@
+---
+id: persist_input_text_in_localstorage
+slug: /guides/persist-input-text-in-localstorage/
+title: Storing message drafts
+---
+
+In this recipe, we would like to demonstrate how you can start storing unsent user's messages as drafts. The whole implementation turns around the use of `MessageInput`'s prop `getDefaultValue` and custom change event handler. We will store the messages in localStorage.
+
+## Building the draft storage logic
+
+Below, we have a simple logic to store all the message text drafts in a localStorage object under the key `@chat/drafts`.
+
+```ts
+const STORAGE_KEY = '@chat/drafts';
+
+const getDrafts = () => JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');
+
+const removeDraft = (key: string) => {
+ const drafts = getDrafts();
+
+ if (drafts[key]) {
+ delete drafts[key];
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));
+ }
+};
+
+const updateDraft = (key: string, value: string) => {
+ const drafts = getDrafts();
+
+ if (!value) {
+ delete drafts[key];
+ } else {
+ drafts[key] = value;
+ }
+
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));
+};
+```
+
+On top of this logic we build a hook that exposes the change handler functions for both thread and main `MessageInput` components as well as functions for `MessageInput`'s `getDefaultValue` prop. We also have to override the `MessageInput`'s default submit handler, because we want to remove the draft from storage when a message is sent.
+
+```ts
+import { ChangeEvent, useCallback } from 'react';
+import { MessageToSend, useChannelActionContext, useChannelStateContext } from 'stream-chat-react';
+import type { Message } from 'stream-chat';
+
+const STORAGE_KEY = '@chat/drafts';
+
+const getDrafts = () => JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');
+
+const removeDraft = (key: string) => {
+ const drafts = getDrafts();
+
+ if (drafts[key]) {
+ delete drafts[key];
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));
+ }
+};
+
+const updateDraft = (key: string, value: string) => {
+ const drafts = getDrafts();
+
+ if (!value) {
+ delete drafts[key];
+ } else {
+ drafts[key] = value;
+ }
+
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));
+};
+
+// highlight-start
+const useDraftAPI = () => {
+ const { channel, thread } = useChannelStateContext();
+ const { sendMessage } = useChannelActionContext();
+
+ const handleInputChange = useCallback(
+ (e: ChangeEvent) => {
+ updateDraft(channel.cid, e.target.value);
+ },
+ [channel.cid],
+ );
+
+ const handleThreadInputChange = useCallback(
+ (e: ChangeEvent) => {
+ if (!thread) return;
+ updateDraft(`${channel.cid}:${thread.id}`, e.target.value);
+ },
+ [channel.cid, thread],
+ );
+
+ const getMainInputDraft = useCallback(() => {
+ const drafts = getDrafts();
+ return drafts[channel.cid] || '';
+ }, [channel.cid]);
+
+ const getThreadInputDraft = useCallback(() => {
+ if (!thread) return;
+ const drafts = getDrafts();
+ return drafts[`${channel.cid}:${thread.id}`] || '';
+ }, [channel.cid, thread]);
+
+ const overrideSubmitHandler = useCallback(
+ async (message: MessageToSend, channelCid: string, customMessageData?: Partial) => {
+ await sendMessage(message, customMessageData);
+ const key = message.parent ? `${channelCid}:${message.parent.id}` : channelCid;
+ removeDraft(key);
+ },
+ [sendMessage],
+ );
+
+ return {
+ getMainInputDraft,
+ getThreadInputDraft,
+ handleInputChange,
+ handleThreadInputChange,
+ overrideSubmitHandler,
+ };
+};
+// highlight-end
+```
+
+## Plugging it in
+
+Now it is time to access the API in our React component. The component has to be a descendant of `Channel` component, because `useDraftAPI` accesses the `ChannelStateContext` and `ChannelActionContext` through corresponding consumers. In our example we call this component `ChannelWindow`.
+
+```tsx
+import { ChannelFilters, ChannelOptions, ChannelSort, StreamChat } from 'stream-chat';
+import { useDraftAPI } from './useDraftAPI';
+import type { StreamChatGenerics } from './types';
+
+const ChannelWindow = () => {
+ const {
+ getMainInputDraft,
+ getThreadInputDraft,
+ handleInputChange,
+ handleThreadInputChange,
+ overrideSubmitHandler,
+ } = useDraftAPI();
+
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+};
+
+// In your application you will probably initiate the client in a React effect.
+const chatClient = StreamChat.getInstance('');
+
+// User your own filters, options, sort if needed
+const filters: ChannelFilters = { type: 'messaging', members: { $in: [''] } };
+const options: ChannelOptions = { state: true, presence: true, limit: 10 };
+const sort: ChannelSort = { last_message_at: -1, updated_at: -1 };
+
+const App = () => {
+ return (
+
+
+
+
+
+
+ );
+};
+```
+
+Now once you start typing, you should be able to see the drafts in the `localStorage` under the key `@chat/drafts`. Despite changing channels or threads, the unsent message text should be kept in the textarea.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/pin-indicator.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/pin-indicator.mdx
new file mode 100644
index 0000000000..2edee4d122
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/pin-indicator.mdx
@@ -0,0 +1,106 @@
+---
+id: pin_indicator
+title: Pin Indicator
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+In this example, we will demonstrate how to create a custom pin indicator for pinned messages. [Pinned messages](https://getstream.io/chat/docs/javascript/pinned_messages/?language=javascript) allow users to highlight important messages, make announcements, or temporarily promote content.
+
+## Custom Pin Indicator
+
+### CSS Based Solution
+
+Let's start with the less invasive and fairly simple CSS based solution. All the class names you need to build this feature are in place and toggled appropriately. We'll add `::before` pseudo-class to our message bubble element with a pin (📌) icon to display whenever message has been pinned.
+
+```css
+.str-chat__message--pinned .str-chat__message-bubble::before {
+ content: '📌';
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: absolute;
+ background-color: papayawhip;
+ font-size: 0.6rem;
+ width: 1.4rem;
+ height: 1.4rem;
+ border-radius: 9999px;
+ z-index: 1;
+ top: -10px;
+}
+
+.str-chat__message--other.str-chat__message--pinned .str-chat__message-bubble::before {
+ right: -10px;
+}
+
+.str-chat__message--me.str-chat__message--pinned .str-chat__message-bubble::before {
+ left: -10px;
+}
+```
+
+
+
+### Component Based Solution
+
+While CSS solution is certainly less invasive it's also less malleable when it comes to hooking some JavaScript to it. For that case the component based solution is also an option. In this example we'll build an indicator which displays the name of the user who pinned the message. We'll pass our custom component to the [`Channel`](../../components/core-components/channel.mdx) prop `PinIndicator` which forwards it to [`ComponentContext`](../../components/contexts/component-context.mdx) from which it'll be picked up by the [`MessageSimple`](../../components/message-components/message-ui.mdx) component to render.
+
+
+
+
+```jsx
+import { Channel } from 'stream-chat-react';
+
+const CustomPinIndicator = () => {
+ const { message } = useMessageContext('CustomPinIndicator');
+
+ const pinnedBy = message.pinned_by?.name || message.pinned_by?.id;
+
+ if (!pinnedBy) return null;
+
+ return
📌 Pinned by {pinnedBy}
;
+};
+
+//...
+
+...;
+```
+
+
+
+
+```css
+.pin-indicator {
+ grid-area: pin;
+}
+
+.str-chat__message.str-chat__message--other,
+.str-chat__message.str-chat__quoted-message-preview {
+ grid-template-areas:
+ '. pin'
+ 'avatar message'
+ '. replies'
+ '. translation-notice'
+ '. custom-metadata'
+ '. metadata';
+}
+
+.str-chat__message.str-chat__message--me {
+ grid-template-areas:
+ 'pin'
+ 'message'
+ 'replies'
+ 'translation-notice'
+ 'custom-metadata'
+ 'metadata';
+}
+```
+
+
+
+
+
+
+### Read More
+
+See more on permissions regarding message pinning in [_Permissions v2_](https://getstream.io/chat/docs/react/user_permissions/?language=javascript) section of our JS documentation.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/suggestion-list.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/suggestion-list.mdx
new file mode 100644
index 0000000000..9b9c582dc3
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/suggestion-list.mdx
@@ -0,0 +1,794 @@
+---
+id: suggestion_list
+title: Autocomplete Suggestions
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+One of the advanced features of the message input is autocompletion support. By default, it
+autocompletes mentions, commands and emojis.
+
+Autocomplete suggestions are triggered by typing the special characters:
+
+| Trigger | Action | Example |
+| ------- | ------- | -------- |
+| `@` | mention | @user |
+| `/` | command | /giphy |
+| `:` | emoji | :smiling |
+
+The default message input component provided by the SDK supports this out of the box. When a trigger
+character is typed into the message input, a list of suggested options appears:
+
+
+
+If you want to customize the look and behavior of the suggestions list, you have two options:
+
+1. Use the default message input provided by the SDK, and override the following components to
+ customize the look and feel of the suggestion list:
+
+ - [`AutocompleteSuggestionItem`](../../components/contexts/component-context.mdx#autocompletesuggestionitem)
+ - [`AutocompleteSuggestionList`](../../components/contexts/component-context.mdx#autocompletesuggestionlist)
+
+2. Implement the message input component from scratch, and add autocomplete functionality to it
+ yourself.
+
+Let's explore both options.
+
+## Overriding the Suggestion Item Component
+
+Let's start by creating a custom suggestion item component.
+
+As usual, to override a component used by the SDK, you should pass a custom component as a prop to
+the [`Channel`](../../components/core-components/channel.mdx) component in your application code. In
+this case we are overriding
+[`AutocompleteSuggestionItem`](../../components/contexts/component-context.mdx#autocompletesuggestionitem):
+
+```jsx
+import {
+ Chat,
+ Channel,
+ ChannelHeader,
+ ChannelList,
+ MessageList,
+ Thread,
+ Window,
+ MessageInput,
+} from 'stream-chat-react';
+import { SearchIndex } from 'emoji-mart';
+
+export const App = () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+```
+
+Since we are not overriding the entire suggestion list yet, just an item component, our custom item
+component will get all the necessary data and callbacks in props - the default
+`AutocompleteSuggestionList` will take care of that.
+
+This makes the basic implementation pretty straightforward. Two things to note, though:
+
+1. To show different previews for different item types (e.g. we want to show avatars for users and
+ emoji previews for emojis) we need to put in type guards for each item type.
+2. The default `AutocompleteSuggestionList` requires you to call the `onSelectHandler` callback when
+ an item is focused or hovered. This is to ensure that items in the list are keyboard accessible.
+
+
+
+
+```jsx
+const CustomSuggestionItem = (props) => {
+ const { item } = props;
+ let children = null;
+
+ // Item is an emoji suggestion
+ if ('native' in item && typeof item.native === 'string') {
+ children = (
+ <>
+ {item.native}
+ {item.name}
+ >
+ );
+ }
+
+ // Item is a user to be mentioned
+ if (!('native' in item) && 'id' in item) {
+ children = (
+ <>
+
+ {item.name ?? item.id}
+ >
+ );
+ }
+
+ // Item is a command configured for the current channel
+ if ('name' in item && 'description' in item) {
+ children = (
+ <>
+ /{item.name}
+ {item.description}
+ >
+ );
+ }
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.suggestion-list__item {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font: inherit;
+ border: 0;
+ background: none;
+ padding: 20px 10px;
+}
+
+.suggestion-list__item_selected {
+ background: #00000014;
+}
+```
+
+
+
+
+
+
+
+
+If you are building an internationalized application, you will need to translate command
+descriptions and arguments. Translations for all of the supported languages are provided with the
+SDK. You can access them by using the translation helper function provided in the
+[`TranslationContext`](../theming/translations.mdx). All you need to do is to query the translation
+with the right key: `-command-description` for the description, and
+`-command-args` for the arguments (you can always refer to our
+[translation files](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/es.json) to
+check if the key is correct).
+
+```jsx
+// In CustomSuggestionItem component:
+const { t } = useTranslationContext();
+
+// Item is a command configured for the current channel
+if ('name' in item && 'description' in item) {
+ children = (
+ <>
+ /{item.name}
+ {t(`${item.name}-command-description`, {
+ defaultValue: item.description,
+ })}
+ >
+ );
+}
+```
+
+
+
+The English (US) translation is loaded from the Stream backend as part of the channel config object,
+and is not part of the translation resources, so we explicitly set it as the fallback value.
+
+## Overriding the Suggestion List Component
+
+If you want to further customize the default behavior of the suggestion list, you can override the
+entire list component.
+
+This is an easy way to add a header or footer to the list. You don't have to reimplement the whole
+list component, just create a small wrapper:
+
+
+
+
+```jsx
+import { DefaultSuggestionList } from 'stream-chat-react';
+
+const SuggestionListWithHeader = (props) => {
+ let header = '';
+
+ if (props.currentTrigger === '@') {
+ header = 'Users';
+ }
+
+ if (props.currentTrigger === '/') {
+ header = 'Commands';
+ }
+
+ if (props.currentTrigger === ':') {
+ header = 'Emoji';
+ }
+
+ if (props.value && props.value.length > 1) {
+ header += ` matching "${props.value.slice(1)}"`;
+ }
+
+ return (
+ <>
+
{header}
+
+ >
+ );
+};
+```
+
+
+
+
+```css
+.suggestion-list__header {
+ padding: 10px;
+ font-size: 0.9em;
+}
+```
+
+
+
+
+This wrapper uses two props (provided to your component by the default message input component) to
+construct a header: `currentTrigger` contains the special character that triggered autocomplete, and
+`value` contains the query the user has typed so far.
+
+Then override the
+[`AutocompleteSuggestionList`](../../components/contexts/component-context.mdx#autocompletesuggestionlist)
+list at the [`Channel`](../../components/core-components/channel.mdx) level, and you're done:
+
+```jsx
+import {
+ Chat,
+ Channel,
+ ChannelHeader,
+ ChannelList,
+ MessageList,
+ Thread,
+ Window,
+ MessageInput,
+} from 'stream-chat-react';
+import { SearchIndex } from 'emoji-mart';
+
+export const App = () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+```
+
+
+
+Or you can go deeper and reimplement the entire list component from scratch. Note that in this case
+it's up to you to handle the interactions and accessibility. This example implementation is a good
+starting point, but it doesn't handle any keyboard interactions:
+
+
+
+
+```jsx
+const CustomSuggestionList = (props) => {
+ const [selectedIndex, setSelectedIndex] = useState(0);
+
+ if (selectedIndex >= props.values.length && selectedIndex !== 0) {
+ setSelectedIndex(0);
+ }
+
+ const handleClick = (item) => {
+ props.onSelect(props.getTextToReplace(item));
+ };
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.suggestion-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.suggestion-list__item {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ width: 100%;
+ font: inherit;
+ border: 0;
+ background: none;
+ padding: 20px 10px;
+}
+
+.suggestion-list__item_selected {
+ background: #00000014;
+}
+```
+
+
+
+
+## Implementing Autocompletion for Custom Message Input
+
+Finally, if you are implementing the entire message input component
+[from scratch](../theming/input-ui.mdx), it's up to you to build the autocomplete functionality. The
+good news is that the
+[`autocompleteTriggers`](../../components/contexts/message-input-context.mdx#autocompletetriggers)
+value in the `MessageInputContext` provides a lot of reusable functionality. The bad news is that
+properly implementing autocomplete is still a lot of work.
+
+Let's try to tackle that. We'll start with the simple message input implementation from the
+[Message Input UI cookbook](../theming/input-ui.mdx):
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const CustomMessageInput = () => {
+ const { text, handleChange, handleSubmit } = useMessageInputContext();
+
+ return (
+
+
+
+
+ );
+};
+```
+
+The
+[`autocompleteTriggers`](../../components/contexts/message-input-context.mdx#autocompletetriggers)
+object is a map between special characters that trigger autocompletion suggestions and some useful
+functions:
+
+- `dataProvider` returns (via a callback) the list of suggestions, given the current query (the text
+ after the trigger)
+- `callback` is the action that should be called when a suggestion is selected (e.g. when a user
+ mention is selected, it modifies the message payload to include the mention)
+- `output` function returns the replacement text, given one of the items returned by the
+ `dataProvider`
+
+The keys of the `autocompleteTriggers` are the characters that should trigger autocomplete
+suggestions.
+
+We'll start by using the `dataProvider` to display the list of suggestions once the trigger
+character is entered by the user. We use a (memoized) regular expression to find trigger characters,
+and then we query the `dataProvider` for suggestions.
+
+When the suggestions are ready, the `dataProvider` invokes a callback, where we update the current
+suggestion list. We must be careful not to run into a race condition here, so before the update, we
+check to see if the input has changed since we queried the suggestions.
+
+Finally, we render the suggestion list:
+
+
+
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+function CustomMessageInput() {
+ const {
+ text,
+ autocompleteTriggers,
+ handleChange: onChange,
+ handleSubmit,
+ } = useMessageInputContext();
+
+ const inputRef = useRef < HTMLTextAreaElement > null;
+ const [trigger, setTrigger] = (useState < string) | (null > null);
+ const [suggestions, setSuggestions] = useState([]);
+
+ const triggerQueryRegex = useMemo(() => {
+ if (!autocompleteTriggers) {
+ return null;
+ }
+
+ const triggerCharacters = Object.keys(autocompleteTriggers);
+ // One of the trigger characters, followed by one or more non-space characters
+ return new RegExp(String.raw`([${triggerCharacters}])(\S+)`);
+ }, [autocompleteTriggers]);
+
+ const handleChange = (event) => {
+ onChange(event);
+
+ if (autocompleteTriggers && triggerQueryRegex) {
+ const input = event.currentTarget;
+ const updatedText = input.value;
+ const textBeforeCursor = updatedText.slice(0, input.selectionEnd);
+ const match = textBeforeCursor.match(triggerQueryRegex);
+
+ if (!match) {
+ setTrigger(null);
+ setSuggestions([]);
+ return;
+ }
+
+ const trigger = match[1];
+ const query = match[2];
+
+ // Query the dataProvider for the suggestions
+ autocompleteTriggers[trigger].dataProvider(query, updatedText, (suggestions) => {
+ // Unless the input has changed, update the suggestion list
+ if (input.value === updatedText) {
+ setTrigger(match[0]);
+ setSuggestions(suggestions);
+ }
+ });
+ }
+ };
+
+ return (
+
+ {suggestions.length > 0 && (
+
+ {suggestions.map((item) => (
+
+ ))}
+
+ )}
+
+
+
+
+
+ );
+}
+```
+
+
+
+
+```css
+.message-input {
+ margin: 16px;
+}
+
+.message-input__composer {
+ display: flex;
+ align-items: center;
+ border: 2px solid #00000029;
+ border-radius: 8px;
+}
+
+.message-input__composer:has(.message-input__input:focus) {
+ border-color: #005fff;
+}
+
+.message-input__input {
+ flex-grow: 1;
+ border: 0;
+ outline: 0;
+ background: none;
+ font: inherit;
+ padding: 8px;
+ resize: none;
+}
+
+.message-input__button {
+ border: 1px solid transparent;
+ outline: 0;
+ background: none;
+ font: inherit;
+ border-radius: 4px;
+ margin: 8px;
+ padding: 8px;
+ cursor: pointer;
+}
+
+.message-input__button:hover {
+ background: #fafafa;
+ border-color: #00000014;
+}
+
+.message-input__button:focus,
+.message-input__button:focus-within {
+ border-color: #005fff;
+}
+
+.suggestions {
+ display: flex;
+ gap: 10px;
+ flex-wrap: wrap;
+ margin-bottom: 10px;
+ font-size: 0.9em;
+}
+
+.suggestions__item {
+ font: inherit;
+ display: flex;
+ gap: 5px;
+ padding: 5px 10px;
+ border-radius: 20px;
+ border: 0;
+ background: #e9eaed;
+ cursor: pointer;
+}
+```
+
+
+
+
+
+
+
+
+But we are not done yet. Displaying suggestions is only half of the puzzle. The second half is
+reacting when the user selects one of the suggestions.
+
+When the user selects a suggestion, we should do two things:
+
+1. Call the `callback` for the current trigger. This will, for example, update the message payload
+ with a user mention.
+2. Examine the return value of the `output` for the selected suggestion, and update the message
+ input text accordingly.
+
+The `output` returns an object that looks something like this:
+
+```json
+{
+ "text": "replacement text",
+ "caretPosition": "next"
+}
+```
+
+The `text` property tells us what to replace the current trigger with, and the `caretPosition`
+property tells us where the cursor should end up after the update: either before or after the
+inserted replacement.
+
+Let's add a handler for the click event on the suggestion:
+
+```js
+const handleSuggestionClick = (item) => {
+ if (autocompleteTriggers && trigger) {
+ const { callback, output } = autocompleteTriggers[trigger[0]];
+ callback?.(item);
+ const replacement = output(item);
+
+ if (replacement) {
+ const start = text.indexOf(trigger);
+ const end = start + trigger.length;
+ const caretPosition =
+ replacement.caretPosition === 'start' ? start : start + replacement.text.length;
+
+ const updatedText = text.slice(0, start) + replacement.text + text.slice(end);
+ flushSync(() => setText(updatedText));
+ inputRef.current?.focus();
+ inputRef.current?.setSelectionRange(caretPosition, caretPosition);
+ }
+ }
+};
+```
+
+And there you have it, the complete example that you can use as a starting point for your own
+autocomplete implementation:
+
+
+
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+function CustomMessageInput() {
+ const {
+ text,
+ autocompleteTriggers,
+ handleChange: onChange,
+ handleSubmit,
+ } = useMessageInputContext();
+
+ const inputRef = useRef < HTMLTextAreaElement > null;
+ const [trigger, setTrigger] = (useState < string) | (null > null);
+ const [suggestions, setSuggestions] = useState([]);
+
+ const triggerQueryRegex = useMemo(() => {
+ if (!autocompleteTriggers) {
+ return null;
+ }
+
+ const triggerCharacters = Object.keys(autocompleteTriggers);
+ return new RegExp(String.raw`([${triggerCharacters}])(\S+)`);
+ }, [autocompleteTriggers]);
+
+ const handleChange = (event) => {
+ onChange(event);
+
+ if (autocompleteTriggers && triggerQueryRegex) {
+ const input = event.currentTarget;
+ const updatedText = input.value;
+ const textBeforeCursor = updatedText.slice(0, input.selectionEnd);
+ const match = textBeforeCursor.match(triggerQueryRegex);
+
+ if (!match) {
+ setTrigger(null);
+ setSuggestions([]);
+ return;
+ }
+
+ const trigger = match[1];
+ const query = match[2];
+
+ autocompleteTriggers[trigger].dataProvider(query, updatedText, (suggestions) => {
+ if (input.value === updatedText) {
+ setTrigger(match[0]);
+ setSuggestions(suggestions);
+ }
+ });
+ }
+ };
+
+ const handleSuggestionClick = (item) => {
+ if (autocompleteTriggers && trigger) {
+ const { callback, output } = autocompleteTriggers[trigger[0]];
+ callback?.(item);
+ const replacement = output(item);
+
+ if (replacement) {
+ const start = text.indexOf(trigger);
+ const end = start + trigger.length;
+ const caretPosition =
+ replacement.caretPosition === 'start' ? start : start + replacement.text.length;
+
+ const updatedText = text.slice(0, start) + replacement.text + text.slice(end);
+ flushSync(() => setText(updatedText));
+ inputRef.current?.focus();
+ inputRef.current?.setSelectionRange(caretPosition, caretPosition);
+ }
+ }
+ };
+
+ return (
+
+ {suggestions.length > 0 && (
+
+ {suggestions.map((item) => (
+
+ ))}
+
+ )}
+
+
+
+
+
+ );
+}
+```
+
+
+
+
+```css
+.message-input {
+ margin: 16px;
+}
+
+.message-input__composer {
+ display: flex;
+ align-items: center;
+ border: 2px solid #00000029;
+ border-radius: 8px;
+}
+
+.message-input__composer:has(.message-input__input:focus) {
+ border-color: #005fff;
+}
+
+.message-input__input {
+ flex-grow: 1;
+ border: 0;
+ outline: 0;
+ background: none;
+ font: inherit;
+ padding: 8px;
+ resize: none;
+}
+
+.message-input__button {
+ border: 1px solid transparent;
+ outline: 0;
+ background: none;
+ font: inherit;
+ border-radius: 4px;
+ margin: 8px;
+ padding: 8px;
+ cursor: pointer;
+}
+
+.message-input__button:hover {
+ background: #fafafa;
+ border-color: #00000014;
+}
+
+.message-input__button:focus,
+.message-input__button:focus-within {
+ border-color: #005fff;
+}
+
+.suggestions {
+ display: flex;
+ gap: 10px;
+ flex-wrap: wrap;
+ margin-bottom: 10px;
+ font-size: 0.9em;
+}
+
+.suggestions__item {
+ font: inherit;
+ display: flex;
+ gap: 5px;
+ padding: 5px 10px;
+ border-radius: 20px;
+ border: 0;
+ background: #e9eaed;
+ cursor: pointer;
+}
+```
+
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/system-message.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/system-message.mdx
new file mode 100644
index 0000000000..681dc31e82
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/system-message.mdx
@@ -0,0 +1,117 @@
+---
+id: system_message
+title: System Message
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+A system message is a message generated by a system event, such as banning or muting a user. These are sent from the backend and displayed via the [`VirtualizedMessageList`](../../components/core-components/virtualized-list.mdx) and [`MessageList`](../../components/core-components/message-list.mdx) components automatically. In this guide, we will demonstrate how to create and override the default component.
+
+### Default System Message Component
+
+For reference, the default system message component, [`EventComponent`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EventComponent/EventComponent.tsx) (image below) displays all pertinent information about the event that occurred. The two list components display these messages only if message is of type `system` (`message.type === "system"`).
+
+
+
+### Custom System Message Component
+
+Our custom component will display the message text, date, and the actor (user who triggered the event) with added styling. For this complete override of the default component, we will utilize the [`MessageSystem`](../../components/core-components/channel.mdx#messagesystem) prop on [`Channel`](../../components/core-components/channel.mdx) through which it's being passed to [`ComponentContext`](../../components/contexts/component-context.mdx) which allows you to hook into the component override mechanism used throughout the SDK.
+
+:::note
+To see your custom component in action, try muting a user by using the `/` command. For example, type `/mute` followed by a user mention, `@`. These commands must be enabled in the [Dashboard](https://dashboard.getstream.io/).
+:::
+
+
+
+
+```jsx
+import { Avatar as DefaultAvatar, Channel } from 'stream-chat-react';
+import type { EventComponentProps } from 'stream-chat-react';
+
+const CustomSystemMessage = (props: EventComponentProps) => {
+ const { Avatar = DefaultAvatar, message } = props;
+
+ const { created_at = '', text, user } = message;
+ const date = created_at.toString();
+
+ return (
+
+
+ Event: {text?.trim()} at {date}
+
+
+ Actor:
+
+ {user?.name}
+
+
+ );
+};
+
+//...
+
+...;
+```
+
+
+
+
+
+```css
+.custom-system-message__actor {
+ display: flex;
+ gap: 0.5rem;
+}
+
+.custom-system-message {
+ padding: 1rem;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ border-radius: var(--str-chat__border-radius-md);
+ background: red; /* For browsers that do not support gradients */
+ background: -webkit-linear-gradient(
+ left,
+ orange,
+ yellow,
+ green,
+ cyan,
+ blue,
+ violet
+ ); /* For Safari 5.1 to 6.0 */
+ background: -o-linear-gradient(
+ right,
+ orange,
+ yellow,
+ green,
+ cyan,
+ blue,
+ violet
+ ); /* For Opera 11.1 to 12.0 */
+ background: -moz-linear-gradient(
+ right,
+ orange,
+ yellow,
+ green,
+ cyan,
+ blue,
+ violet
+ ); /* For Firefox 3.6 to 15 */
+ background: linear-gradient(
+ to right,
+ orange,
+ yellow,
+ green,
+ cyan,
+ blue,
+ violet
+ ); /* Standard syntax (must be last) */
+}
+```
+
+
+
+
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/thread-header.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/thread-header.mdx
new file mode 100644
index 0000000000..73bfd23ca5
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/thread-header.mdx
@@ -0,0 +1,104 @@
+---
+id: thread_header
+title: Thread Header
+---
+
+import CustomThreadHeader from '../../assets/CustomThreadHeader.png';
+
+In this example we will demonstrate how to make a custom `ThreadHeader` component utilizing the props that are passed to an open `Thread`.
+
+## Create the Component
+
+The default `ThreadHeader` shows the number of replies alongside a button to close the thread. In our example we will use the `Avatar` component to render pictures of the current participants in the thread. We will also change the look of the button and show the number of replies. All of this data and more can be easily pulled from the `thread` prop, which represents the parent message. The last thing we will utilize is the `closeThread` function, which is also passed to `Thread` as a prop.
+
+```tsx
+export const CustomThreadHeader = ({ closeThread, thread }) => {
+ const replyCount = thread.reply_count;
+ const threadParticipants = thread.thread_participants;
+
+ return (
+
+
+ {threadParticipants.map((participant) => (
+
+
+
+ ))}
+
{replyCount} Replies
+
+
+
+
+
+
+
+ );
+};
+```
+
+```css
+.wrapper {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ padding: var(--sm-p);
+ background: var(--white);
+ box-shadow: 0 7px 9px 0 var(--border), 0 1px 0 0 var(--border);
+}
+
+.participants-wrapper {
+ display: flex;
+ align-items: center;
+}
+
+.participant:first-child {
+ margin: 0;
+}
+
+.participant {
+ margin-left: calc(var(--md-m) * -1);
+ border-radius: var(--border-radius-round);
+ border: 2px solid var(--white);
+ padding-right: 0;
+}
+
+.reply-count {
+ margin-left: var(--sm-m);
+ font-weight: var(--font-weight-semi-bold);
+}
+
+.close-button {
+ width: 24px;
+ height: 24px;
+}
+
+.left {
+ height: 24px;
+ width: 3px;
+ border-radius: var(--border-radius-sm);
+ margin-left: 12px;
+ background-color: var(--primary-color);
+ transform: rotate(45deg);
+ z-index: 1;
+}
+
+.right {
+ height: 24px;
+ width: 3px;
+ border-radius: var(--border-radius-sm);
+ background-color: var(--primary-color);
+ transform: rotate(90deg);
+ z-index: 2;
+}
+```
+
+From here all we need to do is override the default component in `Channel` at the `App.tsx` level:
+
+```tsx
+{/* children of Channel component */}
+```
+
+## The Result
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/typing-indicator.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/typing-indicator.mdx
new file mode 100644
index 0000000000..13c0bb66d8
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/customization/typing-indicator.mdx
@@ -0,0 +1,114 @@
+---
+id: typing_indicator
+title: Typing Indicator
+---
+
+import TypingIndicator from '../../assets/TypingIndicator.png';
+
+In this example, we will demonstrate how to build a custom `TypingIndicator` using the default component as a guide.
+
+## Create the Component
+
+Using the `typing` object provided by the `TypingContext`, we can access the `name` and `role` of users currently typing
+in a channel. The `threadList` prop will allow us to conditionally render the typing indicator in the main message
+list, or at the bottom of a thread.
+
+```tsx
+export const CustomTypingIndicator = (props: TypingIndicatorProps) => {
+ const { threadList } = props;
+
+ const { channelConfig, thread } = useChannelStateContext();
+ const { client } = useChatContext();
+ const { typing = {} } = useTypingContext();
+
+ if (channelConfig?.typing_events === false) {
+ return null;
+ }
+
+ const typingInChannel = !threadList
+ ? Object.values(typing).filter(
+ ({ parent_id, user }) => user?.id !== client.user?.id && !parent_id,
+ )
+ : [];
+
+ const typingInThread = threadList
+ ? Object.values(typing).filter(
+ ({ parent_id, user }) => user?.id !== client.user?.id && parent_id === thread?.id,
+ )
+ : [];
+
+ return (
+
+ );
+};
+```
+
+```css
+.str-chat__typing-indicator__dots {
+ border: none;
+ display: flex;
+ margin-left: 0;
+ width: fit-content;
+}
+
+.str-chat__typing-indicator__dot {
+ background: var(--grey);
+ opacity: 1;
+ height: 4px;
+ width: 4px;
+ border-radius: var(--border-radius-round);
+ display: flex;
+}
+
+.str-chat__typing-indicator__dot:nth-child(3) {
+ opacity: 1;
+}
+
+.str-chat__typing-indicator__dot:nth-child(2) {
+ opacity: 1;
+}
+
+.typing-indicator-name {
+ font-weight: var(--font-weight-bold);
+ color: var(--grey);
+}
+.typing-indicator-role {
+ font-weight: var(--font-weight-regular);
+ color: var(--grey-whisper);
+ margin-left: var(--xxs-m);
+}
+
+.username {
+ display: flex;
+}
+```
+
+From here, all we need to do is override the default component in `Channel`:
+
+```tsx
+{/* children of Channel component */}
+```
+
+## The Result
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/livestream-setup.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/livestream-setup.mdx
new file mode 100644
index 0000000000..d07e5dcaa8
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/livestream-setup.mdx
@@ -0,0 +1,82 @@
+---
+id: livestream-setup
+title: Livestream Best Practices
+keywords: [example, virtualized message list, livestream]
+---
+
+import MarginInspector from '../assets/margin-inspector.png';
+import MessageHeight from '../assets/message-height.png';
+
+Livestream chat UI poses several hard technological challenges since users can spend a few hours watching a certain event. For that period, the chat UI should be able to handle a constant stream of messages, reactions, and media attachments.
+
+The React SDK offers a special component for that purpose - the `VirtualizedMessageList`. The component renders only the messages visible in the viewport and dynamically updates its contents as the user scrolls.
+This decreases browser memory usage and does not degrade the performance of the page even if the user receives thousands of messages in a single session.
+
+In this article, we will go through the best practices and tweaks for configuring the `VirtualizedMessageList` to ensure a smooth user experience during a high message traffic.
+
+## Get Started
+
+The `VirtualizedMessageList` is mostly compatible with the non-virtualized `MessageList`, although not all properties are the same. The simplest configuration and placement are the same:
+
+```tsx
+
+
+
+
+
+
+
+```
+
+With this configuration, the virtualized list will look identical to the non-virtualized version. With the next few steps, we can configure the component for maximum performance.
+
+## Disable the automatic scroll to bottom transition
+
+By default, the `VirtualizedMessageList` will scroll down to display new messages using the `"smooth"` scroll behavior ([MDN link](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTo#examples)). This works well for moderately busy chat rooms but can be unwieldy in chats with more than 2-3 incoming messages per second. A safer, snappier option is `"auto"`. With that setting, the list scrolls to the latest received message instantly.
+
+```tsx
+
+```
+
+## Specify the default item height
+
+The `VirtualizedMessageList` supports items with varying heights and automatically keeps track of the rendered item sizes, while estimating the not-yet-rendered sizes based on latest message during load. To optimize this further and minimize potential recalculations, set the `defaultItemHeight` to the height of your usual one-line message (If in doubt, use the developer tools inspector to determine the sizing).
+
+
+
+The element above is `58px` tall, so let's put that at the `defaultItemHeight` prop value:
+
+```tsx
+
+```
+
+## Avoid vertical CSS margins
+
+If the custom Message component has vertical margins that affect its height, the message list might behave erratically (blinking, rendering white areas, etc).
+
+This could be a potential pitfall if you're using a custom message component. The `VirtualizedMessageList` uses `getBoundingClientRect` ([MDN](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect)) on the outermost message element.
+This method does not measure CSS margins, which are tricky to measure in the first place [due to collapsing](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing).
+If the custom Message component has vertical margins that affect its height, the message list might behave erratically (blinking, rendering white areas, etc).
+
+Use your DOM inspector and look for any orange gaps between the message elements. See the screenshot below for example of headings with margins:
+
+
+
+## Choose the right Giphy size
+
+This practice is not unique to the virtualized message list but might help you build a more compact chat timeline and reduce the overall traffic for your users. By default, the Giphy attachments [use the original Giphy version image](https://developers.giphy.com/docs/api/schema#image-object). You can override that by setting the `giphyVersion` property of the `Channel` Component to a smaller one - use the keys [from the Giphy documentation](https://developers.giphy.com/docs/api/schema#image-object).
+
+```tsx
+
+
+
+
+
+
+
+```
+
+## Design reactions so that they don't change the message size
+
+One final best practice: make sure that adding reactions to the message does not increase the message height if you're using a custom `Message` component. Good examples for such design would be the chat boxes of Twitch and Telegram.
+Avoiding that will make the message list appear more stable and less jumpy during high traffic.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/multiple-channel-lists.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/multiple-channel-lists.mdx
new file mode 100644
index 0000000000..9a7221d7a5
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/multiple-channel-lists.mdx
@@ -0,0 +1,29 @@
+---
+id: multiple_channel_lists
+title: Multiple Lists
+---
+
+This example will focus on the specific use case where there are two `ChannelList` components in the same application.
+
+The event listeners of both lists, let's say A and B, will pick up all `new.message` events for every `channel`, regardless of which list the `message` is sent in.
+If a message is sent in list B, the event listener in list A will also pick up the new `message` and bump the impacted `channel` to the top of the list. This is not the desired result for multiples lists, but there is a correct way to handle the routing of these messages.
+
+## channelRenderFilterFn prop
+
+The reason that a `channel` will automatically be bumped to the top of a list even though it's not actually part of the list is due to the default behavior.
+The `ChannelList` components will retrieve a `channel` from `client.activeChannels` if the `channel` doesn't already exist.
+
+By using the `channelRenderFilterFn` prop we can apply custom filtering logic to the list of `channels` that are rendered. Since we have access to the entire `channel` object, we can filter on type, custom fields, or other.
+
+```tsx
+const customChannelFilterFunction = (channels: Channel[]) => {
+ return channels.filter(/** your custom filter logic */);
+};
+
+;
+```
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/sdk-state-management.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/sdk-state-management.mdx
new file mode 100644
index 0000000000..f8a6cca8dd
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/sdk-state-management.mdx
@@ -0,0 +1,153 @@
+---
+id: sdk-state-management
+title: SDK State Management
+---
+
+Most of the application state which is the main driver behind the UI changes of our chat SDK lives within our low-level client (LLC) - [`StreamChat`](https://github.com/GetStream/stream-chat-js) - more specifically client and channel instances and is **NOT REACTIVE** - our React SDK makes these state stores reactive by listening to the same events client does and copies it with the help of `useState` API after it has been changed. Optimistic updates - if applicable - are handled by and are local only to React SDK.
+
+This is how the SDK state pipeline looks like behind the scenes:
+
+```mermaid
+sequenceDiagram
+ box Stream Chat Client
+ participant Client State
+ participant WebSocket Client
+ end
+
+ box Stream React SDK
+ participant UI Components
+ end
+
+ Client State->>WebSocket Client: attach listeners to keep the state up-to-date
+ UI Components->>WebSocket Client: attach listeners to keep UI up-to-date
+ WebSocket Client->>Client State: receive a WebSocket message and trigger listeners
+ Client State->>Client State: update client state
+ WebSocket Client->>UI Components: receive a WebSocket message and trigger listeners
+ UI Components->>Client State: reach for updated client state
+ UI Components->>UI Components: update UI
+```
+
+## Active Channel & Channel State
+
+The SDK comes with [`ChatContext`](../components/contexts/chat-context.mdx) which holds (among other things) currently active channel instance and forwards LLC instance passed to the [`Chat`](../components/core-components/chat.mdx) component.
+Before you can access the _reactive_ channel state you'll need to set the channel instance as active. The channel becomes active when:
+
+- it's user-selected in the [`ChannelList`](../components/core-components/channel-list.mdx) component (if you're using our ([default setup](../basics/getting-started.mdx#your-first-app-with-stream-chat-react)), you probably already have `ChannelList` in your application)
+- it's passed to the `channel` prop of the [`Channel`](../components/core-components/channel.mdx) component
+
+ ```tsx
+ import { useState, useEffect } from 'react';
+ import { Channel, useChatContext } from 'stream-chat-react';
+
+ export const ChannelWrapper = ({ channelId, channelType = 'messaging', children }) => {
+ const [activeChannel, setActiveChannel] = useState(undefined);
+ const { client } = useChatContext();
+
+ useEffect(() => {
+ if (!channelId) return;
+
+ const channel = client.channel(channelId, channelType);
+
+ setActiveChannel(channel);
+ }, [channelId, channelType]);
+
+ return {children};
+ };
+ ```
+
+- it's set as active by calling the [`setActiveChannel`](../components/contexts/chat-context.mdx#setactivechannel) function coming from the [`ChatContext`](../components/contexts/chat-context.mdx) (this function is used by [`ChannelList`](../components/core-components/channel-list.mdx) behind the scenes)
+
+ ```tsx
+ import { useEffect } from 'react';
+ import { useCreateChatClient, useChatContext, Chat, Channel } from 'stream-chat-react';
+
+ const ActiveChannelSetter = ({ channelId, channelType }) => {
+ const { client, setActiveChannel } = useChatContext();
+
+ useEffect(() => {
+ const channel = client.channel(channelId, channelType);
+ setActiveChannel(channel);
+ }, [channelType, channelId]);
+
+ return null;
+ };
+
+ const App = () => {
+ const client = useCreateChatClient(userData);
+
+ if (!client) return
Loading...
;
+
+ return (
+
+
+ {'...other components...'}
+
+ );
+ };
+ ```
+
+:::note
+You can use either `channel` prop on the [`Channel`](../components/core-components/channel.mdx) component or [`setActiveChannel`](../components/contexts/chat-context.mdx#setactivechannel) function. You cannot use both at the same time.
+:::
+
+Currently active [channel state](https://github.com/GetStream/stream-chat-react/blob/master/src/context/ChannelStateContext.tsx#L36-L56) and channel instance can be accessed through the [`ChannelStateContext`](../components/contexts/channel-state-context.mdx) with the help of the [`useChannelStateContext`](../components/contexts/channel-state-context.mdx#basic-usage) hook - meaning any component which is either direct or indirect child of the [`Channel`](../components/core-components/channel.mdx) component can access such state.
+
+The example bellow shows how to reach `members` and `channel` property coming from the channel state:
+
+```tsx
+import { useEffect } from 'react';
+import { Channel, useChannelStateContext } from 'stream-chat-react';
+
+const MembersCount = () => {
+ const { members, channel } = useChannelStateContext();
+
+ useEffect(() => {
+ console.log(`Currently active channel changed, channelId: ${channel.id}`);
+ }, [channel]);
+
+ return
{Object.keys(members).length}
;
+};
+
+const ChannelWrapper = () => (
+
+
+
+);
+```
+
+## Channel List State
+
+[`ChannelList`](../components/core-components/channel-list.mdx) component is a standalone component which (unsurprisingly) holds and manages list of channels. You can access loaded `channels` from [`ChannelListContext`](../components/contexts/channel-list-context.mdx) with the help of `useChannelListContext` hook. Any component which is either direct or indirect child of the [`ChannelList`](../components/core-components/channel-list.mdx) component can access such state ([Channel Preview](../components/utility-components/channel-preview-ui.mdx) for example).
+
+```tsx
+import { ChannelList, ChannelPreviewMessenger } from 'stream-chat-react';
+import type { ChannelListProps } from 'stream-chat-react';
+
+const CustomPreviewUI = (props) => {
+ const { channels } = useChannelListContext();
+
+ return ;
+};
+
+export const CustomChannelList = (props: ChannelListProps) => {
+ return ;
+};
+```
+
+## Conclusion
+
+This guide covers the biggest and most important state stores, see other React stateful contexts exported by our SDK for more information.
+
+Mentioned in this article:
+
+- [`ChannelStateContext`](../components/contexts/channel-state-context.mdx)
+- [`ChatContext`](../components/contexts/chat-context.mdx)
+- [`ChannelListContext`](../components/contexts/channel-list-context.mdx)
+
+Other data/action providers:
+
+- [`ComponentContext`](../components/contexts/component-context.mdx)
+- [`ChannelActionContext`](../components/contexts/channel-action-context.mdx)
+- [`MessageContext`](../components/contexts/message-context.mdx)
+- [`MessageInputContext`](../components/contexts/message-input-context.mdx)
+- [`MessageListContext`](../components/contexts/message-list-context.mdx)
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/attachment-actions.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/attachment-actions.mdx
new file mode 100644
index 0000000000..9fa839dfd3
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/attachment-actions.mdx
@@ -0,0 +1,257 @@
+---
+id: attachment_actions
+title: Attachment Actions
+---
+
+import AttachmentActions1 from '../../../assets/AttachmentActions1.png';
+import AttachmentActions2 from '../../../assets/AttachmentActions2.png';
+
+In this example, we connect several different parts of the library to create a user experience where we add custom
+attachment actions to uploaded images. Images will render with "Love" and "Loathe" buttons, which on click will post
+reactions on the message. While this example might not represent a common use case, this demo is meant to highlight the
+flexibility of the library and show how custom features can be built on top of the existing code.
+
+## Custom Actions
+
+The first step is to create an array of custom actions that will populate the [`AttachmentActions`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/AttachmentActions.tsx)
+component on send of an image attachment. The `Action` type comes from the `stream-chat` JavaScript client and conforms
+to the following:
+
+```tsx
+export type Action = {
+ name?: string;
+ style?: string;
+ text?: string;
+ type?: string;
+ value?: string;
+};
+```
+
+As you can tell, the `Action` type has no required values. We are going to simulate a voting feature and trigger the
+UI on "Love" and "Loathe" potential actions. Our custom actions array becomes the following:
+
+```tsx
+const attachmentActions: Action[] = [
+ { name: 'vote', value: 'Love' },
+ { name: 'vote', value: 'Loathe' },
+];
+```
+
+## Custom AttachmentActions
+
+Next, we create a custom [`AttachmentActions`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/AttachmentActions.tsx)
+component to render and display our custom actions. If a chat user uploads an image file, we'll trigger custom logic. Otherwise,
+we'll render the default library component.
+
+Our custom component will receive the attachment `type` and the `actions` (if any) via props. We'll manually add the actions later
+in the demo, but for now, know their value will reference our custom array defined above.
+
+If an image attachment is uploaded, we map over the custom actions array and return HTML `button` elements with `action.value`
+as the text. Click events on these buttons will post reactions to the message, using the `handleReaction` function drawn from the
+`useMessageContext` custom hook.
+
+```tsx
+const CustomAttachmentActions: React.FC = (props) => {
+ const { actions, type } = props;
+
+ const { handleReaction } = useMessageContext();
+
+ const handleClick = async (
+ event: React.MouseEvent,
+ value?: string,
+ ) => {
+ try {
+ if (value === 'Love') await handleReaction('love', event);
+ if (value === 'Loathe') await handleReaction('angry', event);
+ } catch (err) {
+ console.log(err);
+ }
+ };
+
+ if (type === 'image') {
+ return (
+ <>
+ {actions.map((action) => (
+
+ ))}
+ >
+ );
+ }
+
+ return ;
+};
+```
+
+## Custom Attachment
+
+In order to render our `CustomAttachmentActions` component, we need to supply it as a prop to the
+[`Attachment`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Attachment.tsx)
+component. The resulting `CustomAttachment` component is then added to `Channel`, so it can be injected into the
+`ComponentContext` and consumed within the [Message UI](../../../components/message-components/message-ui.mdx) component.
+
+```tsx
+const CustomAttachment: React.FC = (props) => (
+
+);
+
+{/* children of Channel component */};
+```
+
+## Input Submit Handler
+
+To add our `attachmentActions` to an uploaded image and trigger the render of the `CustomAttachmentActions` component,
+we provide custom logic to override the `MessageInput` component's default submit handling behavior. For a detailed,
+step-by-step example, see the [Input Submit Handler](../../../customization/override_submit_handler) custom code example.
+
+Simply put, if an `image` type message attachment exists, we update the `attachments` array on the `message` object
+by adding the `attachmentActions`.
+
+```tsx
+const overrideSubmitHandler = (message: MessageToSend, cid: string) => {
+ let updatedMessage = message;
+
+ if (message.attachments) {
+ message.attachments.forEach((attachment) => {
+ if (attachment.type === 'image') {
+ const updatedAttachment = {
+ ...attachment,
+ actions: attachmentActions,
+ };
+
+ updatedMessage = {
+ ...message,
+ attachments: [updatedAttachment],
+ };
+ }
+ });
+ }
+
+ sendMessage(updatedMessage);
+};
+```
+
+## Implementation
+
+Now that each individual piece has been constructed, we can assemble all of the snippets into the final code example.
+
+### The Code
+
+```css
+.action-button {
+ height: 40px;
+ width: 100px;
+ border-radius: 16px;
+ color: #ffffff;
+ background: red;
+ font-weight: 700;
+ font-size: 1.2rem;
+}
+
+.action-button.love {
+ background-color: green;
+}
+```
+
+```tsx
+const attachmentActions: Action[] = [
+ { name: 'vote', value: 'Love' },
+ { name: 'vote', value: 'Loathe' },
+];
+
+const CustomAttachmentActions: React.FC = (props) => {
+ const { actions, type } = props;
+
+ const { handleReaction } = useMessageContext();
+
+ const handleClick = async (
+ event: React.MouseEvent,
+ value?: string,
+ ) => {
+ try {
+ if (value === 'Love') await handleReaction('love', event);
+ if (value === 'Loathe') await handleReaction('angry', event);
+ } catch (err) {
+ console.log(err);
+ }
+ };
+
+ if (type === 'image') {
+ return (
+ <>
+ {actions.map((action) => (
+
+ ))}
+ >
+ );
+ }
+
+ return ;
+};
+
+const CustomAttachment: React.FC = (props) => (
+
+);
+
+const ChannelInner: React.FC = () => {
+ const { sendMessage } = useChannelActionContext();
+
+ const overrideSubmitHandler = (message: MessageToSend, cid: string) => {
+ let updatedMessage = message;
+
+ if (message.attachments) {
+ message.attachments.forEach((attachment) => {
+ if (attachment.type === 'image') {
+ const updatedAttachment = {
+ ...attachment,
+ actions: attachmentActions,
+ };
+
+ updatedMessage = {
+ ...message,
+ attachments: [updatedAttachment],
+ };
+ }
+ });
+ }
+
+ sendMessage(updatedMessage);
+ };
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+const App = () => (
+
+
+
+
+
+
+);
+```
+
+### The Result
+
+**The rendered message before action click:**
+
+
+
+**The rendered message after action click:**
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/geolocation-attachment.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/geolocation-attachment.mdx
new file mode 100644
index 0000000000..b5307b9706
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/geolocation-attachment.mdx
@@ -0,0 +1,386 @@
+---
+id: geolocation_attachment
+title: Geolocation Attachment
+---
+
+import Geolocation1 from '../../../assets/Geolocation1.png';
+import Geolocation2 from '../../../assets/Geolocation2.png';
+import Geolocation3 from '../../../assets/Geolocation3.png';
+import Geolocation4 from '../../../assets/Geolocation4.png';
+
+In this comprehensive example, we demonstrate how to build a location sharing feature. Chat users will
+have the ability to send their location to a channel through a custom `Attachment` component that displays
+coordinates using the [Google Maps API](https://developers.google.com/maps/documentation/javascript/overview).
+
+The feature flow has three distinct steps:
+
+- Select `Share Location` custom message action
+- Confirm you wish to send your location to the current channel
+- Render coordinates on a Google Maps overlay sent as a message attachment
+
+## Custom Message Action
+
+The first step in our location sharing flow is to add a custom message action that on click allows a chat
+user to begin the process of sending their coordinates to the channel. For a more detailed explanation of
+customizing message actions, see our [custom code example](./message-actions.mdx).
+
+In this example, our custom handler function will toggle a state variable that shows/hides a location sharing
+confirmation modal.
+
+```tsx
+const [shareLocation, setShareLocation] = useState(false);
+
+const locationHandler = (message: StreamMessage, event: React.BaseSyntheticEvent) => {
+ setShareLocation(true);
+};
+
+const customMessageActions = { 'Share Location': locationHandler };
+
+;
+```
+
+
+
+## Location Sharing Confirmation
+
+Next, we display a popup that prompts the chat user to confirm whether or not they actually wish to
+send their location to the current channel.
+
+As soon as the modal component mounts, we fetch the connected user's latitude and longitude by calling
+the `getCurrentPosition` method from the [Geolocation Web API](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API).
+The coordinates are then set into local state hooks. If the user confirms they wish to share their location, a
+message attachment of type `map` is created with the `latitude` and `longitude` state variables attached.
+
+```tsx
+type ShareLocationModalProps = {
+ setShareLocation: React.Dispatch>;
+};
+
+const ShareLocationModal: React.FC = (props) => {
+ const { setShareLocation } = props;
+ const { sendMessage } = useChannelActionContext();
+
+ const [latitude, setLatitude] = useState();
+ const [longitude, setLongitude] = useState();
+
+ useEffect(() => {
+ navigator.geolocation.getCurrentPosition((position) => {
+ setLatitude(position.coords.latitude);
+ setLongitude(position.coords.longitude);
+ });
+ }, []);
+
+ const handleYes = async () => {
+ const messageToSend: MessageToSend = {
+ attachments: [{ type: 'map', latitude, longitude }],
+ };
+
+ try {
+ await sendMessage(messageToSend);
+ } catch (err) {
+ console.log(err);
+ }
+
+ setShareLocation(false);
+ };
+
+ const handleNo = () => setShareLocation(false);
+
+ return (
+
+
Do you want to share your location in this conversation?
+
+
+
+
+
+ );
+};
+```
+
+
+
+## Custom Map Attachment
+
+Now that we've created a message attachment of type `map`, we need to build a custom `Attachment` component that
+conditionally renders this new type. If a message attachment is not of type `map`, meaning it's a standard library
+type, we return the default `Attachment` component.
+
+When our custom component receives an attachment of type `map`, we pass the geolocation coordinates into the
+`GoogleMapReact` component. This library is a React-based wrapper around the Google Maps API and displays a map
+and geolocation as a React component. See the [`google-map-react`](https://www.npmjs.com/package/google-map-react)
+readme and documentation for more information.
+
+Since the `GoogleMapReact` component can take some time to render as coordinates are extracted from the Geolocation
+API, we render the component library's standard [`LoadingIndicator`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingIndicator.tsx)
+while we wait for `latitude` and `longitude` to be set.
+
+:::important
+In order to interact with the Google Maps API, you must [set up an account](https://developers.google.com/maps/documentation/javascript/cloud-setup)
+and generate an API key.
+:::
+
+:::note
+Since we've added new fields to our `map` type message attachment, we must extend the basic `Attachment` type
+(renamed to `StreamAttachment` here) to support `latitude` and `longitude`.
+:::
+
+```tsx
+import GoogleMapReact from 'google-map-react';
+
+const googleMapsApiKey = process.env.REACT_APP_GOOGLE_MAPS as string;
+
+type MapCenterProps = {
+ lat: number;
+ lng: number;
+};
+
+const MapCenter: React.FC = () => ;
+
+type ExtendedAttachment = {
+ latitude?: number;
+ longitude?: number;
+};
+
+type MapAttachmentProps = {
+ mapAttachment: StreamAttachment;
+};
+
+const MapAttachment: React.FC> = (props) => {
+ const { mapAttachment } = props;
+
+ const { latitude, longitude } = mapAttachment;
+
+ if (!latitude || !longitude) {
+ return (
+
+ );
+ }
+
+ const center = {
+ lat: latitude,
+ lng: longitude,
+ };
+
+ return (
+
+
+
+ );
+};
+
+const CustomAttachment: React.FC = (props) => {
+ const { attachments } = props;
+
+ if (attachments[0]?.type === 'map') {
+ return ;
+ }
+
+ return ;
+};
+
+const App = () => {
+ const [shareLocation, setShareLocation] = useState(false);
+
+ const locationHandler = (message: StreamMessage, event: React.BaseSyntheticEvent) => {
+ setShareLocation(true);
+ };
+
+ const customMessageActions = { 'Share Location': locationHandler };
+
+ return (
+
+
+
+
+ {shareLocation && }
+
+
+
+
+
+
+
+ );
+};
+```
+
+### The Result
+
+**The `MapAttachment` component loading:**
+
+
+
+**The `MapAttachment` component rendered:**
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/mentions-hover-click.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/mentions-hover-click.mdx
new file mode 100644
index 0000000000..86f1ea6160
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/mentions-hover-click.mdx
@@ -0,0 +1,54 @@
+---
+id: mentions_actions
+title: Mentions Actions
+---
+
+In this example, we will demonstrate how to utilize custom functions that run on hover and click events of a mentioned user in a message. We pass `onMentionsHover` and `onMentionsClick` functions as props to either the [`Channel`](../../../components/core-components/channel.mdx), [`MessageList`](../../../components/core-components/message-list.mdx) or [`VirtualizedMessagelist`](../../../components/core-components/virtualized-list.mdx) components to achieve the desired result.
+
+Both of the event handler functions receive apropriate event object as their first argument and an array of users mentioned within targeted message as their second argument. To target specific user we will need to acess [`event.target.dataset`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset) and look for `userId`.
+
+## Mention Click Action
+
+In this example, we'll show how to properly target clicked user and display their name through `window.alert` dialog. Click handler can be helpful for when you need to navigate to user's profile.
+
+```tsx
+import { Channel } from 'stream-chat-react';
+import type { CustomMentionHandler } from 'stream-chat-react';
+
+const handleMentionsClick: CustomMentionHandler = (event, mentionedUsers) => {
+ const userId = event.target.dataset.userId;
+ if (!userId) return;
+
+ const user = mentionedUsers.find((user) => user.id === userId);
+
+ window.alert(`Mentioned user: ${user.name || user.id}`);
+};
+
+export const WrappedChannel = ({ children }) => {
+ return {children};
+};
+```
+
+## Mention Hover Action
+
+For a simple hover example, we will randomly change the color of the mentioned user text. Through DOM manipulation, we can use the `target` field on the `event` to change the color.
+
+```tsx
+import { Channel } from 'stream-chat-react';
+import type { CustomMentionHandler } from 'stream-chat-react';
+
+const handleMentionsHover: CustomMentionHandler = (event) => {
+ if (!event.target.dataset.userId) return;
+
+ const randomColor = Math.floor(Math.random() * 16777215).toString(16);
+ event.target.style.color = `#${randomColor}`;
+};
+
+export const WrappedChannel = ({ children }) => {
+ return {children};
+};
+```
+
+## Custom Mention Component
+
+If you wish to access certain contexts (like [`MessageContext`](../../../components/contexts/message-context.mdx)) and have more control over what is being rendered and what other events you'd want to attach to specific mention elements then you'd use a custom [`Mention`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/renderText/componentRenderers/Mention.tsx) component, see [_Custom Element Rendering_](../../../components/message-components/render-text.mdx#custom-element-rendering) for more information.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/message-actions.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/message-actions.mdx
new file mode 100644
index 0000000000..cae181d9ab
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/message-actions.mdx
@@ -0,0 +1,80 @@
+---
+id: message_actions
+title: Message Actions
+---
+
+In this example, we will demonstrate how to add a custom message action. By default, the component library supports the following message actions:
+
+- `delete`
+- `edit`
+- `flag`
+- `mute`
+- `pin`
+- `quote`
+- `react`
+- `reply`
+
+## Using customMessageActions
+
+The `MessageList` component accepts a prop called [`customMessageActions`](../../../components/core-components/message-list.mdx#custommessageactions). This prop is an object type, with the key serving as the name (and the title) of the action and the value as the handler function to be run on click.
+
+In the examples below, we'll add a custom option `Yell`, which will call a window alert on click.
+
+:::note
+The custom action handler receives both the `message` object and on click `event` as function arguments.
+:::
+
+```tsx
+import { MessageList } from 'stream-chat-react';
+import type { CustomMessageActions } from 'stream-chat-react';
+
+const customMessageActions: CustomMessageActions = {
+ Yell: (message, event) => {
+ window.alert(`Yell action clicked on message: ${message.id}!`);
+ },
+};
+
+export const WrappedMessageList = () => {
+ return ;
+};
+```
+
+## Using CustomMessageActionList Component
+
+If you need more flexibility - for example; adding translations to your action titles - you can utilise `CustomMessageActionList` component instead.
+
+:::note
+Unless you replicate the internal functionality of the default [`CustomMessageActionList`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageActions/CustomMessageActionsList.tsx) you'll be only able to use one of the customization options mentioned in this guide.
+:::
+
+```tsx
+import { Channel } from 'stream-chat-react';
+
+const CustomMessageActionList = () => {
+ const { message } = useMessageContext('CustomMessageActionList');
+ const { t } = useTranslationContext('CustomMessageActionList');
+
+ return (
+ <>
+
+
+ {/** ...other action buttons... */}
+ >
+ );
+};
+
+export const WrappedChannel = ({ children }) => (
+ {children}
+);
+```
+
+The custom actions will be displayed on top of the defaults in the message actions list.
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/payment-attachment.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/payment-attachment.mdx
new file mode 100644
index 0000000000..8994301dc0
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/actions/payment-attachment.mdx
@@ -0,0 +1,329 @@
+---
+id: payment_attachment
+title: Order and Payment Attachment
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+Custom attachment types are a great way to extend chat functionality. Any
+component can be rendered to represent your custom attachment, so you can
+provide rich user experiences right in the chat.
+
+In this example, we will create a custom attachment type to allow users to
+confirm and pay for their order without leaving the chat.
+
+## Prerequisites
+
+We assume that you have already created an application in the dashboard, and
+have an API key and secret ready. You should also have a messaging channel ready
+(ours is called `messaging:test-channel`), and two users as members of the
+channel. This is easy to set up using the Explorer in your dashboard.
+
+In the code samples below the user with the ID `john-doe` plays the role of a
+sales representative, and `jane-doe` plays the role of a customer.
+
+## Sending a Custom Attachment
+
+First, let's send a message with a custom attachment type. An attachment can
+have any JSON payload. In our case, the payload contains the order number:
+
+```json
+{
+ "type": "order",
+ "orderId": 1337
+}
+```
+
+We can send a message using our Node.js client with a simple script. In
+real use cases, it's either your backend or admin/agent frontend that will send
+a message with a custom attachment.
+
+```js
+// send-order.mjs:
+import { StreamChat } from 'stream-chat';
+
+const serverClient = StreamChat.getInstance(API_KEY, API_SECRET);
+const channel = serverClient.channel('messaging', 'test-channel');
+await channel.sendMessage({
+ text: 'Your order',
+ attachments: [
+ {
+ type: 'order',
+ orderId: 1337,
+ },
+ ],
+ user_id: 'john-doe',
+});
+```
+
+You'll need to provide your own API key and secret, and replace the channel and
+user id if necessary. Then you'll be able to run the script:
+
+```sh
+node send-order.mjs
+```
+
+As a result, you should see the message saying "Your order" in the channel:
+
+
+
+However, you'll notice that the attachment itself is not rendered. This is
+because the SDK doesn't yet know how to display this custom attachment type.
+We'll fix that next.
+
+## Rendering Custom Attachment Types
+
+To support rendering custom attachment types, we'll create a small wrapper
+around the default `Attachment` component. The wrapper will only be responsible
+for rendering our custom attachment type, the rest we'll just pass on to the
+default implementation:
+
+
+
+
+```jsx
+import { Attachment } from 'stream-chat-react';
+
+const CustomAttachment = (props) => {
+ if (props.attachments[0].type === 'order') {
+ return ;
+ }
+
+ return ;
+};
+
+const OrderAttachment = (props) => {
+ return
🛒 Order #{props.orderId}
;
+};
+```
+
+
+
+
+```css
+.order {
+ padding: 8px 16px 16px;
+ border-bottom: 1px solid #00000016;
+}
+```
+
+
+
+
+As usual, to override the default `Attachment` component with our wrapper, we
+pass it as a prop to the `Channel` component:
+
+```jsx
+import { Channel } from 'stream-chat-react';
+
+{/* ... */};
+```
+
+
+
+At this point, you'll want to add your custom logic to your component. You will
+probably want to fetch the order data, and integrate payment system components
+(like [React Stripe.js](https://docs.stripe.com/stripe-js/react)). In our
+example, we'll make some (fake) requests to mimic the order data fetching:
+
+
+
+
+```jsx
+import { useQuery } from '@tanstack/react-query';
+
+const OrderAttachment = (props) => {
+ const { data, isPending: isOrderLoading } = useQuery({
+ queryKey: ['order', props.orderId],
+ queryFn: async () => {
+ const res = await fetch(`/api/order/${props.orderId}`);
+ return await res.json();
+ },
+ });
+
+ return (
+
+ );
+};
+```
+
+```js
+// on your backend, once the order is finished:
+await serverClient.updateMessage(
+ {
+ id: req.body.messageId,
+ attachments: [
+ {
+ type: 'order-completed',
+ orderId: 1337,
+ },
+ ],
+ text: 'Hurray! Your order is completed',
+ },
+ 'john-doe',
+);
+```
+
+
+
+Finally, we'll add another custom attachment type to display completed orders:
+
+```jsx
+const CustomAttachment = (props) => {
+ if (props.attachments[0].type === 'order') {
+ return ;
+ }
+
+ if (props.attachments[0].type === 'order-completed') {
+ return ;
+ }
+
+ return ;
+};
+
+const OrderCompletedAttachment = (props) => {
+ return (
+
+
🛒 Order #{props.orderId}
+
Thank you for your order!
+
+ );
+};
+```
+
+
+
+And there it is! Use this example as a starting point for your own interactive
+user experiences right in the chat.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/connection-status.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/connection-status.mdx
new file mode 100644
index 0000000000..e7293b79b4
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/connection-status.mdx
@@ -0,0 +1,38 @@
+---
+id: connection_status
+title: Connection Status
+---
+
+import ConnectionStatus from '../../assets/ConnectionStatus.png';
+
+This example will show you how to change the message text in the `ConnectionStatus` component. This status appears when there is a connection issue with the Stream Chat API.
+
+This component is established within the `MessageList` via the `DefaultMessageListNotifications` component in the same file. For a complete override of all of these notifications, see this [detailed example](../customization/adding-notification.mdx), but in this smaller guide
+we will replace just the text of one of the components using the Stream [`i18n instance`](./translations.mdx).
+
+## Implementation
+
+The first step is to create an instance of `Streami18n` and pass it into the `Chat` component.
+
+```tsx
+const i18nInstance = new Streami18n();
+
+
+ ...
+;
+```
+
+Next, we can define what text appears during connection issues by overriding the default message via the key value pairing. Check out the full list of [values you can override](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/en.json).
+
+```tsx
+const i18nInstance = new Streami18n({
+ language: 'en',
+ translationsForLanguage: {
+ 'Connection failure, reconnecting now...': 'Alert, connection issue happening',
+ },
+});
+```
+
+## The Result
+
+
diff --git a/docusaurus/docs/React/guides/theming/css-and-theming.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/css-and-theming.mdx
similarity index 100%
rename from docusaurus/docs/React/guides/theming/css-and-theming.mdx
rename to docusaurus/react_versioned_docs/version-11.x.x/guides/theming/css-and-theming.mdx
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/input-ui.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/input-ui.mdx
new file mode 100644
index 0000000000..10bde0eeba
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/input-ui.mdx
@@ -0,0 +1,827 @@
+---
+id: input_ui
+title: Message Input UI
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+Message input is used for composing and editing messages. In this sense, it's a primary component
+that users interact with in a chat, so it's important to get it right.
+
+Message input is a bit more complex than it might seem at first glance. Not just a text box with a
+"send" button, it has a lot of hidden features:
+
+1. Updating the typing status
+2. Uploading and previewing attachments
+3. Displaying link previews
+4. Auto-completing mentions, commands, emoji...
+
+
+
+We will cover this features step by step. For now, let's start with the simplest markup possible:
+
+
+
+
+```jsx
+const CustomMessageInput = () => (
+
+
+
+
+);
+```
+
+
+
+
+```css
+.message-input {
+ display: flex;
+ align-items: center;
+ border: 2px solid #00000029;
+ border-radius: 8px;
+}
+
+.message-input:has(.message-input__input:focus) {
+ border-color: #005fff;
+}
+
+.message-input__input {
+ flex-grow: 1;
+ border: 0;
+ outline: 0;
+ background: none;
+ font: inherit;
+ padding: 8px;
+ resize: none;
+}
+
+.message-input__button {
+ border: 1px solid transparent;
+ outline: 0;
+ background: none;
+ font: inherit;
+ border-radius: 4px;
+ margin: 8px;
+ padding: 8px;
+ cursor: pointer;
+}
+
+.message-input__button:hover {
+ background: #fafafa;
+ border-color: #00000014;
+}
+
+.message-input__button:focus {
+ border-color: #005fff;
+}
+```
+
+
+
+
+
+
+Note that you should not render your custom message input directly, but instead pass it as a prop to
+either [`Channel`](../../components/core-components/channel.mdx) or
+[`MessageInput`](../../components/message-input-components/message-input.mdx) component. That way,
+you can be sure that your input is wrapped with the necessary context providers, most importantly
+the [`MessageInputContext`](../../components/contexts/message-input-context.mdx).
+
+```jsx
+import {
+ Chat,
+ Channel,
+ ChannelHeader,
+ ChannelList,
+ MessageList,
+ Thread,
+ Window,
+ MessageInput,
+} from 'stream-chat-react';
+
+export const App = () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+```
+
+For now, our custom input doesn't do anything. The
+[`MessageInputContext`](../../components/contexts/message-input-context.mdx) handles most of the
+input-related state and actions, so instead of handling the state yourself, just use the provided
+values and callbacks:
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const CustomMessageInput = () => {
+ const { text, handleChange, handleSubmit } = useMessageInputContext();
+
+ return (
+
+
+
+
+ );
+};
+```
+
+The great thing is that the `handleChange` callback not only updates the text value, but also
+detects links (if URL enrichment is enabled), and updates your typing status.
+
+And with the `handleSubmit` callback added to the "send" button, our basic implementation is
+complete - try it out!
+
+## Uploading and Previewing Attachments
+
+To support adding attachments to the message, we should start by adding a file input. And similar to
+the "send" button, once a file is selected, we can use a callback provided in the
+[`MessageInputContext`](../../components/contexts/message-input-context.mdx) to upload it as an
+attachment:
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const AttachmentUploadButton = () => {
+ const { uploadNewFiles } = useMessageInputContext();
+
+ function handleChange(e) {
+ const files = e.currentTarget.files;
+
+ if (files && files.length > 0) {
+ uploadNewFiles(files);
+ e.currentTarget.value = '';
+ }
+ }
+
+ return (
+
+ );
+};
+```
+
+
+
+There are two cases when uploads should not be allowed:
+
+1. Uploads are disabled for the current channel. We should check the
+ [`isUploadEnabled`](../../components/contexts/message-input-context.mdx#isuploadenabled) value
+ from the `MessageInputContext` to make sure.
+2. The maximum number of message attachments has been reached. For this we should check the
+ [`maxFilesLeft`](../../components/contexts/message-input-context.mdx#maxfilesleft) value from the
+ `MessageInputContext`.
+
+Let's add these two checks:
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const AttachmentUploadButton = () => {
+ const { uploadNewFiles, isUploadEnabled, maxFilesLeft } = useMessageInputContext();
+
+ function handleChange(e) {
+ const files = e.currentTarget.files;
+
+ if (files && files.length > 0) {
+ uploadNewFiles(files);
+ }
+ }
+
+ if (!isUploadEnabled || maxFilesLeft === 0) {
+ return null;
+ }
+
+ return (
+
+ );
+};
+```
+
+Now we need a way to preview the added attachments. The SDK provides a ready-made component for
+this:
+[`AttachmentPreviewList`](../../components/contexts/component-context.mdx#attachmentpreviewlist).
+Instead of importing it directly, you can grab it from the
+[`ComponentContext`](../../components/contexts/component-context.mdx), which is used throughout the
+SDK to provide overridable UI components, and only fall back to the default implementation if it
+hasn't been overridden:
+
+
+
+
+```jsx
+import {
+ useMessageInputContext,
+ useComponentContext,
+ AttachmentPreviewList as DefaultAttachmentPreviewList,
+} from 'stream-chat-react';
+
+const CustomMessageInput = () => {
+ const { text, handleChange, handleSubmit } = useMessageInputContext();
+ const { AttachmentPreviewList = DefaultAttachmentPreviewList } = useComponentContext();
+
+ return (
+
+
+
+
+
+
+
+
+ );
+};
+```
+
+
+
+
+```css
+.message-input__composer {
+ display: flex;
+ align-items: center;
+ border: 2px solid #00000029;
+ border-radius: 8px;
+}
+
+.message-input__composer:has(.message-input__input:focus) {
+ border-color: #005fff;
+}
+
+.message-input__input {
+ flex-grow: 1;
+ border: 0;
+ outline: 0;
+ background: none;
+ font: inherit;
+ padding: 8px;
+ resize: none;
+}
+
+.message-input__button {
+ border: 1px solid transparent;
+ outline: 0;
+ background: none;
+ font: inherit;
+ border-radius: 4px;
+ margin: 8px;
+ padding: 8px;
+ cursor: pointer;
+}
+
+.message-input__button:hover {
+ background: #fafafa;
+ border-color: #00000014;
+}
+
+.message-input__button:focus,
+.message-input__button:focus-within {
+ border-color: #005fff;
+}
+
+.visually-hidden {
+ width: 0;
+ height: 0;
+ pointer-events: none;
+}
+```
+
+
+
+
+The nice thing about this approach is that our custom message input is not tied to a particular
+implementation of the attachment preview component, and the preview component can be overridden at
+the `Channel` level.
+
+However, if you need deep customization of the attachment preview list, and the out-of-the-box
+component doesn't meet your needs, it's fairly easy to implement it from scratch.
+
+The two relevant values from the `MessageInputContext` are
+[`fileUploads`](../../components/contexts/message-input-context.mdx#fileuploads) and
+[`imageUploads`](../../components/contexts/message-input-context.mdx#imageuploads), which map upload
+ids to the objects that describe an attachment. Image attachments are usually treated differently
+from generic files, so it is convenient to keep the two attachment types are separate.
+
+Since object keys come in no particular order, you can use
+[`fileOrder`](../../components/contexts/message-input-context.mdx#fileorder) and
+[`imageOrder`](../../components/contexts/message-input-context.mdx#imageorder) arrays, which specify
+the order of attachments by their ids.
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const CustomAttachmentPreviewList = () => {
+ const { fileOrder, imageOrder } = useMessageInputContext();
+
+ if (fileOrder.length === 0 && imageOrder.length === 0) {
+ return null;
+ }
+
+ return (
+
+ {imageOrder.map((id) => (
+
+
+
+ ))}
+ {fileOrder.map((id) => (
+
+
+
+ ))}
+
+ );
+};
+```
+
+Note that an attachment can be in three different states:
+
+1. `'uploading'` means the attachment is still uploading; you may want to display a spinner in this
+ case.
+2. `'failed'` means that something went wrong while uploading the attachment; you may want to show
+ an option to retry the upload.
+3. `'finished'` means the attachment had been successfully uploaded.
+
+For image attachments, the `previewUri` property is available, which is a temporary URL that can be
+used to display an image preview before the image is uploaded. Once the image is uploaded, this
+temporary URL is no longer available, and `url` should be used instead.
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const ImageAttachmentPreview = ({ id }) => {
+ const { imageUploads } = useMessageInputContext();
+ const image = imageUploads[id];
+ const url = image.previewUri ?? image.url ?? 'fallback.webm';
+
+ return (
+
+
+
+ );
+};
+
+const AttachmentActions = ({ attachment }) => {
+ const { removeImage, uploadImage, removeFile, uploadFile } = useMessageInputContext();
+ let [remove, upload] = type === 'image' ? [removeImage, uploadImage] : [removeFile, uploadFile];
+ let children = null;
+
+ if (attachment.state === 'uploading') {
+ children =
;
+};
+```
+
+
+
+
+```css
+.message-input__attachments {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ list-style: none;
+ padding: 0;
+}
+
+.message-input__attachment-preview {
+ position: relative;
+ border-radius: 8px;
+ width: 160px;
+ height: 160px;
+ padding: 8px;
+ border: 1px solid #00000014;
+}
+
+.message-input__attachment-preview_image {
+ background-size: cover;
+ background-position: center;
+ background-clip: border-box;
+ background-repeat: no-repeat;
+}
+
+.message-input__attachment-actions {
+ display: flex;
+ gap: 4px;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ padding: 8px;
+}
+
+.message-input__attachment-action {
+ font: inherit;
+ border-radius: 4px;
+ padding: 4px;
+ background: #fff;
+ border: 1px solid #00000014;
+}
+```
+
+
+
+
+## Displaying Link Previews
+
+If URL enrichment is enabled both in channel settings (enabled by default) and in the
+[`urlEnrichmentConfig`](../../components/message-input-components/message-input.mdx#urlenrichmentconfig)
+of the `MessageInput` component (disabled by default), the SDK will automatically detect links in
+the message text (as long as it's set properly in the
+[`MessageInputContext`](../../components/contexts/message-input-context.mdx)) and create previews
+for them.
+
+To display link previews, you can use a pre-built
+[`LinkPreviewList`](../../components/contexts/component-context.mdx#linkpreviewlist) component
+available in the [`ComponentContext`](../../components/contexts/component-context.mdx). Using the
+`ComponentContext` allows you to hook into the component override mechanism used throughout the SDK.
+
+So the rough idea is:
+
+1. Grab the [`LinkPreviewList`](../../components/contexts/component-context.mdx#linkpreviewlist)
+ from the `ComponentContext` (fall back to the default implementation if the component wasn't
+ overridden).
+2. Grab the [`linkPreviews`](../../components/contexts/message-input-context.mdx#linkpreviews) from
+ the `MessageInputContext` and pass them to the `LinkPreviewList`.
+
+The only thing to note here is that
+[`linkPreviews`](../../components/contexts/message-input-context.mdx#linkpreviews) is a Map with
+URLs as keys and enriched data as values. Before passing it to the `LinkPreviewList`, we should
+convert it to an array:
+
+```jsx
+import {
+ useMessageInputContext,
+ useComponentContext,
+ AttachmentPreviewList as DefaultAttachmentPreviewList,
+ LinkPreviewList as DefaultLinkPreviewList,
+} from 'stream-chat-react';
+
+const CustomMessageInput = () => {
+ const { text, linkPreviews, handleChange, handleSubmit } = useMessageInputContext();
+ const {
+ LinkPreviewList = DefaultLinkPreviewList,
+ AttachmentPreviewList = DefaultAttachmentPreviewList,
+ } = useComponentContext();
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+```
+
+As always, if you need deeper customization, you can implement the link preview component from
+scratch. Since all the necessary data can be found in the
+[`linkPreviews`](../../components/contexts/message-input-context.mdx#linkpreviews) value of the
+`MessageInputContext`, the implementation itself is quite simple.
+
+The link preview itself goes through several lifecycle states:
+
+1. `'queued'` means that the URL enrichment process hasn't started yet. This process is debounced,
+ so to avoid flashing UI we should ignore queued previews.
+2. `'loading'` means that URL enrichment is in progress. Depending on the desired UX, you can either
+ ignore loading previews, or show a spinner or other loading state.
+3. `'loaded'` means that the preview is ready.
+4. `'dismissed'` means the preview has been dismissed by the user.
+
+So the only bit of interactivity we need to add is an option to dismiss a link preview:
+
+
+
+
+```jsx
+import { useMessageInputContext } from 'stream-chat-react';
+
+const CustomLinkPreviewList = () => {
+ const { linkPreviews: linkPreviewMap, dismissLinkPreview } = useMessageInputContext();
+ const linkPreviews = Array.from(linkPreviewMap.values());
+
+ if (linkPreviews.length === 0) {
+ return null;
+ }
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.message-input__link-previews {
+ list-style: none;
+ padding: 0;
+}
+
+.message-input__link-preview {
+ display: flex;
+ align-items: center;
+}
+
+.message-input__link-preview-icon {
+ margin: 0 25px 0 19px;
+}
+
+.message-input__link-preview-og {
+ flex-grow: 1;
+}
+```
+
+
+
+
+
+
+## Handling Slow Mode
+
+If the Slow Mode is configured for the current channel, we should prevent messages from being sent
+before the cooldown period has passed.
+
+The first thing we should do is disable or hide the "send" button while the cooldown period is in
+effect. We can use the
+[`cooldownRemaining`](../../components/contexts/message-input-context.mdx#cooldownremaining) value
+from the `MessageInputContext`: it's guaranteed to have a non-zero numeric value while the user is
+within a cooldown period, and to reset to a falsy value when the cooldown period ends. Note that to
+avoid excessive rendering, the value itself does not "tick down" every second.
+
+To provide visual feedback with a countdown, we can use the
+[`CooldownTimer`](../../components/contexts/component-context.mdx#cooldowntimer) component from the
+[`ComponentContext`](../../components/contexts/component-context.mdx):
+
+```jsx
+import {
+ useMessageInputContext,
+ useComponentContext,
+ AttachmentPreviewList as DefaultAttachmentPreviewList,
+ CooldownTimer as DefaultCooldownTimer,
+} from 'stream-chat-react';
+
+const CustomMessageInput = () => {
+ const {
+ text,
+ cooldownRemaining,
+ setCooldownRemaining,
+ cooldownInterval,
+ handleChange,
+ handleSubmit,
+ } = useMessageInputContext();
+ const {
+ CooldownTimer = DefaultCooldownTimer,
+ AttachmentPreviewList = DefaultAttachmentPreviewList,
+ } = useComponentContext();
+
+ return (
+
+
+
+
+
+
+
+
+ );
+};
+```
+
+The component itself is very simple, it's just a single `
` with a timer that counts down
+seconds. Most customizations can be done with CSS, but if you need to implement the whole component
+from scratch, the only trick is to add a timer that counts down from the
+[`cooldownInterval`](../../components/contexts/component-context.mdx#cooldowninterval):
+
+```jsx
+const CustomCooldownTimer = () => {
+ const { cooldownRemaining, cooldownInterval } = useMessageInputContext();
+ const enabled = !!cooldownRemaining;
+ const [secondsPassed, setSecondsPassed] = useState(0);
+
+ useEffect(() => {
+ const startedAt = Date.now();
+ const interval = setInterval(() => {
+ setSecondsPassed(Math.floor((Date.now() - startedAt) / 1000));
+ }, 500);
+ return () => clearInterval(interval);
+ }, [enabled]);
+
+ return ⏳ {cooldownInterval - secondsPassed};
+};
+```
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/message-ui.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/message-ui.mdx
new file mode 100644
index 0000000000..52e092be89
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/message-ui.mdx
@@ -0,0 +1,1150 @@
+---
+id: message_ui
+title: Message UI
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+Message UI is one of the main building blocks of the chat application. Designing proper message UI is no easy feat and that's why our SDK comes with a pre-built component ([`MessageSimple`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx)) which is packed with functionality and is easy to customize through [our CSS variables](../../theming/component-variables.mdx) or component overrides ([`ComponentContext`](../../components/contexts/component-context.mdx#message)).
+
+In this guide, we'll build a simplified custom message UI component combining pre-built and other completely custom components.
+
+### Message Text and Avatars
+
+Let's begin with the simplest form the message UI can take: rendering the raw message text.
+
+```tsx
+import { useMessageContext, Channel } from 'stream-chat-react';
+
+const CustomMessageUi = () => {
+ const { message } = useMessageContext();
+
+ return
{message.text}
;
+};
+```
+
+:::note
+Message UI and all of its children can access [`MessageContext`](../../components/contexts/message-context.mdx) in which it's wrapped and therefore can call the `useMessageContext` hook accessing all of the message-related information and functions alike.
+:::
+
+To see our changes we'll need to pass this component down to either `Channel` or `MessageList` (`VirtualizedMessageList`) components as a `Message` prop.
+
+```tsx
+...
+```
+
+
+
+You can see that all of the messages are now on one side and we have no idea who's the message coming from, let's adjust that with the help of some CSS, and to render the name of the sender we'll need to access `user` property of the `message` object.
+
+Our message will be on the right and the message of the other senders will be on the left side of the screen.
+
+
+
+
+```tsx
+import { useMessageContext, Channel } from 'stream-chat-react';
+
+const CustomMessageUi = () => {
+ const { isMyMessage, message } = useMessageContext();
+
+ const messageUiClassNames = ['custom-message-ui'];
+
+ if (isMyMessage()) {
+ messageUiClassNames.push('custom-message-ui--mine');
+ } else {
+ messageUiClassNames.push('custom-message-ui--other');
+ }
+
+ return (
+
+ );
+};
+```
+
+
+
+
+
+```css
+.custom-message-ui {
+ --cmui-gap-size: 0.5rem;
+ --cmui-inline-spacing: 2rem;
+ --cmui-block-spacing: 0.5rem;
+
+ display: flex;
+ gap: var(--cmui-gap-size);
+ padding-inline: var(--cmui-inline-spacing);
+ padding-block: var(--cmui-block-spacing);
+}
+
+.custom-message-ui__name {
+ display: flex;
+ gap: var(--cmui-gap-size);
+}
+
+.custom-message-ui--mine .custom-message-ui__name::before {
+ content: '<';
+}
+
+.custom-message-ui--other .custom-message-ui__name::after {
+ content: '>';
+}
+
+.custom-message-ui--mine {
+ flex-direction: row-reverse;
+ text-align: right;
+}
+```
+
+
+
+
+
+
+Now this already looks way better than the initial version but we can do better - let's switch from names to avatars using a pre-built [`Avatar`](../../components/utility-components/avatar.mdx) component to make the UI slightly friendlier.
+
+
+
+
+```tsx
+import { Avatar, useMessageContext, Channel } from 'stream-chat-react';
+
+const CustomMessageUi = () => {
+ const { isMyMessage, message } = useMessageContext();
+
+ const messageUiClassNames = ['custom-message-ui'];
+
+ if (isMyMessage()) {
+ messageUiClassNames.push('custom-message-ui--mine');
+ } else {
+ messageUiClassNames.push('custom-message-ui--other');
+ }
+
+ return (
+
+
+ {message.text}
+
+ );
+};
+```
+
+
+
+
+```css
+.custom-message-ui {
+ --cmui-gap-size: 0.5rem;
+ --cmui-inline-spacing: 2rem;
+ --cmui-block-spacing: 0.5rem;
+
+ display: flex;
+ gap: var(--cmui-gap-size);
+ padding-inline: var(--cmui-inline-spacing);
+ padding-block: var(--cmui-block-spacing);
+}
+
+.custom-message-ui__text {
+ display: flex;
+ flex-direction: column;
+ align-self: center;
+}
+
+.custom-message-ui--mine {
+ flex-direction: row-reverse;
+ text-align: right;
+}
+```
+
+
+
+
+
+
+Our message UI looks pretty good now but what if the text of a message becomes more complex? Let's say someone sends a link to a site or mentions some other user. In the current state, our UI would display this in plaintext and none of it would be interactive.
+
+
+
+Let's enhance this behavior by using pre-built [`MessageText`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageText.tsx) which uses [`renderText`](../../components/message-components/render-text.mdx) internally and that'll transform all of our links, mention, and certain Markdown syntax to interactive and neat-looking elements.
+
+
+
+
+```tsx
+import { Avatar, MessageText, useMessageContext, Channel } from 'stream-chat-react';
+
+const CustomMessageUi = () => {
+ const { isMyMessage, message } = useMessageContext();
+
+ const messageUiClassNames = ['custom-message-ui'];
+
+ if (isMyMessage()) {
+ messageUiClassNames.push('custom-message-ui--mine');
+ } else {
+ messageUiClassNames.push('custom-message-ui--other');
+ }
+
+ return (
+
+
+
+
+ );
+};
+```
+
+
+
+
+```css
+.custom-message-ui {
+ --cmui-gap-size: 0.5rem;
+ --cmui-inline-spacing: 2rem;
+ --cmui-block-spacing: 0.5rem;
+
+ display: flex;
+ gap: var(--cmui-gap-size);
+ padding-inline: var(--cmui-inline-spacing);
+ padding-block: var(--cmui-block-spacing);
+}
+
+.custom-message-ui--mine {
+ flex-direction: row-reverse;
+ text-align: right;
+}
+
+.custom-message-ui .str-chat__message-text p {
+ all: unset;
+}
+
+.custom-message-ui .str-chat__message-text {
+ display: flex;
+ flex-direction: column;
+ align-self: center;
+}
+
+.custom-message-ui .str-chat__message-mention {
+ font-weight: bold;
+ color: palevioletred;
+ cursor: pointer;
+}
+```
+
+
+
+
+
+
+:::note
+While the mentioned user is being highlighted there's no default pointer event attached to the highlighted element, see the [Mentions Actions guide](./actions/mentions-hover-click.mdx) for more information.
+:::
+
+### Metadata
+
+So far we've covered avatars and proper text rendering but the UI still feels a bit empty. Each message has a lot of extra information which can be beneficial to the end users. Let's add the creation date, "edited" flag, and delivery/read status information to our message UI.
+
+
+
+
+```tsx
+import { Avatar, MessageText, useMessageContext, useChatContext, Channel } from 'stream-chat-react';
+
+const statusIconMap = {
+ received: '✅',
+ receivedAndRead: '👁️',
+ sending: '🛫',
+ unknown: '❓',
+};
+
+const CustomMessageUiMetadata = () => {
+ const {
+ message: {
+ created_at: createdAt,
+ message_text_updated_at: messageTextUpdatedAt,
+ status = 'unknown',
+ },
+ readBy = [],
+ } = useMessageContext();
+ const { client } = useChatContext();
+
+ const [firstUser] = readBy;
+
+ const receivedAndRead = readBy.length > 1 || (firstUser && firstUser.id !== client.user?.id);
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.custom-message-ui {
+ --cmui-gap-size-md: 0.5rem;
+ --cmui-gap-size-sm: 0.2rem;
+ --cmui-inline-spacing: 2rem;
+ --cmui-block-spacing: 0.5rem;
+
+ display: flex;
+ flex-direction: column;
+ gap: var(--cmui-gap-size-md);
+ padding-inline: var(--cmui-inline-spacing);
+ padding-block: var(--cmui-block-spacing);
+}
+
+.custom-message-ui__body {
+ gap: var(--cmui-gap-size-md);
+ display: flex;
+}
+
+.custom-message-ui--mine .custom-message-ui__body {
+ flex-direction: row-reverse;
+ text-align: right;
+}
+
+.custom-message-ui__metadata {
+ display: flex;
+ font-size: x-small;
+ align-items: baseline;
+}
+
+.custom-message-ui__metadata > *:nth-child(even)::after,
+.custom-message-ui__metadata > *:nth-child(even)::before {
+ content: '•';
+ padding-inline: var(--cmui-gap-size-sm);
+}
+
+.custom-message-ui__metadata > *:last-child::after {
+ display: none;
+}
+
+.custom-message-ui--mine .custom-message-ui__metadata {
+ align-self: flex-end;
+}
+
+.custom-message-ui .str-chat__message-text p {
+ all: unset;
+}
+
+.custom-message-ui .str-chat__message-text {
+ display: flex;
+ flex-direction: column;
+ align-self: center;
+}
+
+.custom-message-ui .str-chat__message-mention {
+ font-weight: bold;
+ color: palevioletred;
+ cursor: pointer;
+}
+```
+
+
+
+
+
+
+Message grouping is being managed automatically by the SDK and each parent element (which holds our message UI) receives an appropriate class name based on which we can adjust our rules to display metadata elements only when it's appropriate to make our UI look less busy.
+
+{/_ TODO: link to grouping logic (maybe how to adjust it if needed) _/}
+
+```css
+.custom-message-ui__metadata {
+ /* removed-line */
+ display: flex;
+ /* added-line */
+ display: none;
+ font-size: x-small;
+ align-items: baseline;
+}
+
+/* added-block-start */
+.str-chat__li--bottom .custom-message-ui__metadata,
+.str-chat__li--single .custom-message-ui__metadata {
+ display: flex;
+}
+/* added-block-end */
+```
+
+
+
+:::note
+You can utilize [`MessageContext`](../../components/contexts/message-context.mdx) properties [`firstOfGroup`](../../components/contexts/message-context.mdx#firstofgroup), [`endOfGroup`](../../components/contexts/message-context.mdx#endofgroup), and [`groupedByUser`](../../components/contexts/message-context.mdx#groupedbyuser) if you use [`VirtualizedMessageList`](../../components/core-components/virtualized-list.mdx) for conditional metadata rendering. These properties **are not available** in regular [`MessageList`](../../components/core-components/message-list.mdx).
+:::
+
+The SDK also comes with [`MessageStatus`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageStatus.tsx) and [`MessageTimestamp`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageTimestamp.tsx) components which you can use to replace our custom-made ones. These components come with some extra logic but essentially provide an almost identical amount of utility for the end users so we won't be covering the replacement in this guide.
+
+### Message Actions
+
+Up to this point we've covered mostly the presentational part of our message UI and apart from the mentions and links, there's not much the end users can interact with. Obviously - the SDK offers so much more so in this section of the guide we'll explain how to add and enable message actions (deleting, replies, pinning, etc.) and reactions.
+
+At the very beginning of this guide, we've mentioned that [`MessageContext`](../../components/contexts/message-context.mdx) provides information **and** functions related to a specific message. So to implement a subset of message actions we'll need to access `handleDelete`, `handlePin`, `handleFlag`, and `handleThread` functions which we can attach to the action buttons of our `CustomMessageUiActions` component.
+
+
+
+
+```tsx
+const statusIconMap = {
+ received: '✅',
+ receivedAndRead: '👁️',
+ sending: '🛫',
+ unknown: '❓',
+};
+
+const CustomMessageUiActions = () => {
+ const {
+ handleDelete,
+ handleFlag,
+ handleOpenThread,
+ handlePin,
+ message,
+ threadList,
+ } = useMessageContext();
+
+ if (threadList) return null;
+
+ return (
+
+ );
+};
+```
+
+
+
+### Reactions
+
+With message actions in place we've made our message UI slightly more interactive but there's still a place for improvement. In this section of the guide we'll create a simple selector consisting of two reactions (thumbs up and down) and to display them we'll reuse and slightly modify the [`ReactionsList`](../../components/message-components/reactions.mdx#reactionslist-props) component provided by the SDK. Let's begin by defining `customReactionOptions` (see more in the [Reactions Customization](./reactions.mdx) guide) and by passing them down to a `reactionOptions` prop of a [`Channel`](../../components/core-components/channel.mdx) component.
+
+```tsx
+const customReactionOptions = [
+ { name: 'Thumbs up', type: '+1', Component: () => <>👍> },
+ { name: 'Thumbs down', type: '-1', Component: () => <>👎> },
+];
+
+
+ ...
+;
+```
+
+And now that's done we can continue by extending our `CustomMessageUiActions` component using these newly defined options.
+
+```tsx
+const CustomMessageUiActions = () => {
+ const {
+ handleDelete,
+ handleFlag,
+ handleOpenThread,
+ handlePin,
+ // added-line
+ handleReaction,
+ message,
+ threadList,
+ } = useMessageContext();
+
+ // added-line
+ const { reactionOptions } = useComponentContext();
+
+ if (threadList) return null;
+
+ return (
+
+ );
+};
+```
+
+
+
+
+```css
+.custom-message-ui {
+ --cmui-gap-size-md: 0.5rem;
+ --cmui-gap-size-sm: 0.2rem;
+ --cmui-inline-spacing: 2rem;
+ --cmui-block-spacing: 0.5rem;
+ --cmui-bg-color: #efefef;
+ --cmui-border-color: #ddd;
+ --cmui-border-radius: 0.2rem;
+ --str-chat__own-message-reaction-background-color: var(--cmui-bg-color);
+ --str-chat__message-reaction-background-color: white;
+ --str-chat__message-reaction-border-radius: var(--cmui-border-radius);
+
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ gap: var(--cmui-gap-size-md);
+ padding-inline: var(--cmui-inline-spacing);
+ padding-block: var(--cmui-block-spacing);
+}
+
+.custom-message-ui:hover,
+.custom-message-ui:has(.str-chat__message-text:focus) {
+ background: var(--cmui-bg-color);
+}
+
+.custom-message-ui__body {
+ gap: var(--cmui-gap-size-md);
+ display: flex;
+}
+
+.custom-message-ui--mine .custom-message-ui__body {
+ flex-direction: row-reverse;
+ text-align: right;
+}
+
+.custom-message-ui__actions {
+ display: none;
+ position: absolute;
+ gap: var(--cmui-gap-size-md);
+ top: -20px;
+}
+
+.custom-message-ui:hover .custom-message-ui__actions {
+ display: flex;
+}
+
+.custom-message-ui__actions-group {
+ display: flex;
+ background-color: var(--cmui-border-color);
+ border-radius: var(--cmui-border-radius);
+ gap: 1px;
+ padding: 1px;
+}
+
+.custom-message-ui__actions-group button {
+ all: unset;
+ background: white;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ padding: 5px;
+ line-height: 1rem;
+}
+
+.custom-message-ui__actions-group button:first-child {
+ border-bottom-left-radius: calc(var(--cmui-border-radius) - 1px);
+ border-top-left-radius: calc(var(--cmui-border-radius) - 1px);
+}
+
+.custom-message-ui__actions-group button:last-child {
+ border-bottom-right-radius: calc(var(--cmui-border-radius) - 1px);
+ border-top-right-radius: calc(var(--cmui-border-radius) - 1px);
+}
+
+.custom-message-ui__actions-group button:hover {
+ background: var(--cmui-bg-color);
+}
+
+.custom-message-ui__metadata {
+ display: none;
+ font-size: x-small;
+ align-items: baseline;
+}
+
+.str-chat__li--bottom .custom-message-ui__metadata,
+.str-chat__li--single .custom-message-ui__metadata {
+ display: flex;
+}
+
+.custom-message-ui__metadata > *:nth-child(even)::after,
+.custom-message-ui__metadata > *:nth-child(even)::before {
+ content: '•';
+ padding-inline: var(--cmui-gap-size-sm);
+}
+
+.custom-message-ui__metadata > *:last-child::after {
+ display: none;
+}
+
+.custom-message-ui__metadata-reply-count {
+ all: unset;
+}
+
+.custom-message-ui__metadata-reply-count > span {
+ color: blue;
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.custom-message-ui--mine .str-chat__reaction-list {
+ align-self: flex-end;
+}
+
+.custom-message-ui--mine .custom-message-ui__metadata {
+ align-self: flex-end;
+}
+
+.custom-message-ui--mine .custom-message-ui__actions {
+ left: var(--cmui-inline-spacing);
+}
+
+.custom-message-ui--other .custom-message-ui__actions {
+ right: var(--cmui-inline-spacing);
+}
+
+.custom-message-ui .str-chat__message-text p {
+ all: unset;
+}
+
+.custom-message-ui .str-chat__message-text {
+ display: flex;
+ flex-direction: column;
+ align-self: center;
+}
+
+.custom-message-ui .str-chat__message-mention {
+ font-weight: bold;
+ color: palevioletred;
+ cursor: pointer;
+}
+
+.custom-message-ui .str-chat__message-reaction {
+ border: 1px solid var(--cmui-border-color);
+ padding: 5px;
+}
+```
+
+
+
+
+
+
+### Attachments
+
+The topic of attachments is pretty substantial by itself, so we won't be covering it in this guide. Please, refer to the source code of our default [`MessageSimple`](https://github.com/GetStream/stream-chat-react/blob/fdd021880d783af39e46e1327f2eb47c19199f09/src/components/Message/MessageSimple.tsx#L196-L198) for details on implementation and see the [Custom Attachment](../../guides/theming/actions/attachment-actions.mdx#custom-attachment) guide for more customization options.
+
+### Read More
+
+Functionalities relevant to the Message UI that are also not covered in this guide:
+
+- [Edit Message](https://github.com/GetStream/stream-chat-react/blob/fdd021880d783af39e46e1327f2eb47c19199f09/src/components/Message/MessageSimple.tsx#L150-L161) functionality
+- [Message Bounced](https://github.com/GetStream/stream-chat-react/blob/fdd021880d783af39e46e1327f2eb47c19199f09/src/components/Message/MessageSimple.tsx#L162-L168) functionality
+- [Permissions](../../components/contexts/channel-state-context.mdx#channelcapabilities) of the message actions
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/reactions.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/reactions.mdx
new file mode 100644
index 0000000000..cd12a6ee69
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/reactions.mdx
@@ -0,0 +1,132 @@
+---
+id: reactions
+title: Reactions Customization
+---
+
+import ImageShowcase from '@site/src/components/ImageShowcase';
+import ReactionSelectorWithCustomOptions from '../../assets/reaction-selector-w-custom-options.png';
+import ReactionsListWithCustomOptions from '../../assets/reactions-list-w-custom-options.png';
+
+In this example, we'll demonstrate how to override the SDK's default reaction set, which is exported as [`defaultReactionOptions`](https://github.com/GetStream/stream-chat-react/blob/v11.0.0/src/components/Reactions/reactionOptions.tsx) variable. We'll replace the default set with up and down arrows, simulating an up/down voting feature.
+
+Under the hood, our [`ReactionSelector`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionSelector.tsx), [`ReactionsList`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionsList.tsx), [`SimpleReactionsList`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/SimpleReactionsList.tsx) and [`ReactionsListModal`](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionsListModal.tsx) components render individual emoji components defined in the `reactionOptions`. Therefore, the array with your custom reactions needs to conform to `ReactionOptions` type:
+
+```tsx
+type ReactionOptions = Array<{
+ type: string;
+ Component: React.ComponentType;
+ name?: string;
+}>;
+```
+
+Let's construct a simple option list consisting of `'arrow-up'` and `'arrow-down'` native emojis. To override the default set we'll need to pass this option list to the component context through `Channel` component so that our default components can pick it up:
+
+```tsx
+import { Channel } from 'stream-chat-react';
+
+const customReactionOptions = [
+ {
+ type: 'arrow_up',
+ Component: () => <>⬆️>,
+ name: 'Upwards Black Arrow',
+ },
+ {
+ type: 'arrow_down',
+ Component: () => <>⬇️>,
+ name: 'Downwards Black Arrow',
+ },
+];
+
+export const WrappedChannel = ({ children }) => (
+ {children}
+);
+```
+
+:::note
+Please note that types missing from the option list won't be registered and might lead to sub-optimal user experience.
+:::
+
+If you need to, you can pass these options to each of the default components individually (component props are prioritized even when the `reactionOptions` are routed through the `Channel`):
+
+```tsx
+import { Channel, ReactionsList, ReactionSelector } from 'stream-chat-react';
+
+const CustomReactionsList = (props) => (
+
+);
+
+// ReactionSelector component requires forwarded reference
+const CustomReactionSelector = forwardRef((props, ref) => (
+
+));
+
+export const WrappedChannel = ({ children }) => (
+
+ {children}
+
+);
+```
+
+:::note
+While `ReactionSelector` can display a subset of available reactions (to limit what certain users can react with), the `ReactionsList` should have the whole list available if applicable.
+:::
+
+
+
+### Custom Reaction Handler
+
+If you need to adjust the default behavior you can certainly do so by replacing reaction handler while keeping the default component intact:
+
+```tsx
+import { Channel, ReactionSelector } from 'stream-chat-react';
+
+const CustomReactionSelector = React.forwardRef((props, ref) => {
+ const {
+ message: { own_reactions: ownReactions = [], id: messageId },
+ } = useMessageContext('CustomReactionSelector');
+ const { channel } = useChannelStateContext('CustomReactionSelector');
+
+ const handleReaction = useCallback(
+ async (reactionType, event) => {
+ // your custom logic with default behavior (minus optimistic updates)
+
+ console.log({ event });
+
+ const hasReactedWithType =
+ (ownReactions ?? []).some((reaction) => reaction.type === reactionType) ?? false;
+
+ if (hasReactedWithType) {
+ await channel.deleteReaction(messageId, reactionType);
+ return;
+ }
+
+ await channel.sendReaction(messageId, { type: reactionType });
+ },
+ [channel, ownReactions, messageId],
+ );
+
+ return ;
+});
+
+// and then just add it to the component context
+export const WrappedChannel = ({ children }) => (
+ {children}
+);
+```
+
+### Read More
+
+See more on customization options in [_Introducing new reactions_](../../release-guides/upgrade-to-v11.mdx#introducing-new-reactions) section of our _Upgrade to v11_ guide.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/translations.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/translations.mdx
new file mode 100644
index 0000000000..045baffbc9
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/theming/translations.mdx
@@ -0,0 +1,474 @@
+---
+id: translations
+title: Translation and i18n
+---
+
+import Diacritics from '../../assets/Diacritics.png';
+import Localization1 from '../../assets/Localization1.png';
+import Localization2 from '../../assets/Localization2.png';
+import Transliteration from '../../assets/Transliteration.png';
+
+The Stream Chat React component library uses the [`i18next`](https://www.npmjs.com/package/i18next) dependency to create a [`Streami18n`](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/Streami18n.ts)
+class constructor that handles language translation of our UI components. The Stream Chat API also supports automatic translation of
+chat messages, [learn more](https://getstream.io/chat/docs/react/translation/?language=javascript).
+
+## Supported Languages
+
+The library provides built-in translations for the following languages:
+
+1. [English](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/en.json) (en) - default
+2. [Dutch](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/nl.json) (nl)
+3. [French](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/fr.json) (fr)
+4. [German](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/de.json) (de)
+5. [Hindi](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/hi.json) (hi)
+6. [Italian](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/it.json) (it)
+7. [Japanese](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/ja.json) (ja)
+8. [Korean](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/ko.json) (ko)
+9. [Portuguese](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/pt.json) (pt)
+10. [Russian](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/ru.json) (ru)
+11. [Spanish](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/es.json) (es)
+12. [Turkish](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/tr.json) (tr)
+
+If you wish to change the default language in your app without initiating an instance of `Streami18n`, pass the `defaultLanguage` prop
+to the `Chat` component on load of your application. The below code snippet will change the default language from English to
+Italian.
+
+```tsx
+const defaultLanguage = 'it';
+
+
+ ...
+;
+```
+
+The following screenshots show the state of the UI components in the app before and after setting the `defaultLanguage` to Italian.
+
+**Default language not specified:**
+
+
+
+**Default language set to Italian:**
+
+
+
+:::note
+The `defaultLanguage` prop is only applicable as a fallback language. If the connected user's preferred browser language is supported
+for translation, the component library will preferentially render the browser language. Meaning, if `defaultLanguage` was set to
+Italian but the user's preferred browser language was Spanish, the component library would render Spanish.
+:::
+
+## Enable Localization
+
+The library supports two different methods for manually setting the language of the connected user and automatically translates all
+text built into the UI components. The simpler and less customizable way is to set the `language` value in the `connectUser` method on
+mount of the chat application.
+
+```tsx
+client.connectUser({ id: userId, language: 'es' }, userToken);
+```
+
+:::caution
+If [auto translation](https://getstream.io/chat/docs/react/translation/?language=javascript#automatic-translation) of messages is enabled
+in the application, setting the `language` value on `connectUser` will result in the auto translation of all message text. If this behavior
+is undesired, follow the steps below to create a translation instance.
+:::
+
+### Create a Streami18n Instance
+
+Additionally, you can create a class instance of `Streami18n` and pass as a prop into the `Chat` component. The below
+example changes the current user's language to Spanish.
+
+```jsx
+const i18nInstance = new Streami18n({ language: 'es' });
+
+
+ ...
+;
+```
+
+### Override Default Translations
+
+Taking it one step further, the below example shows how to override the default text values built into the components.
+
+```jsx {3-5}
+const i18nInstance = new Streami18n({
+ language: 'es',
+ translationsForLanguage: {
+ 'Nothing yet...': 'Nada!', // default is 'Nada aun...'
+ },
+});
+
+
+ ...
+;
+```
+
+If you wish to completely override one of our language files, provide your custom translations via the `translationsForLanguage` key.
+Your custom language file must include all of the keys of the [default file](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/es.json).
+
+```tsx
+import esUpdated from 'path/to/esUpdated.json';
+
+const i18nInstance = new Streami18n({
+ language: 'es',
+ translationsForLanguage: esUpdated,
+});
+
+
+ ...
+;
+```
+
+If the language for the connected user is not manually set by passing a `Streami18n` object to the `Chat` component, the component library
+detects the user's default browser language. If the component library has translation support for the detected browser language, either through
+the languages provided or by a custom added language (described below), the connected user's language is automatically set to this value. If the browser language
+is not supported for translation, the library defaults to English.
+
+:::note
+All [available translations](https://github.com/GetStream/stream-chat-react/tree/master/src/i18n) are found on GitHub and the
+JSON objects can be imported from the library.
+
+`import { esTranslations } from 'stream-chat-react';`
+:::
+
+### Overriding ARIA labels
+
+ARIA labels that are used for interactive elements are also subject to localization. Translation keys for ARIA labels are prefixed by `aria/`:
+
+```jsx
+import { useTranslationContext } from 'stream-chat-react';
+
+const Component = () => {
+ const { t } = useTranslationContext();
+ return (
+
+ );
+};
+```
+
+To override the default translations, add an `aria`-prefixed key to the `translationsForLanguage` object:
+
+```jsx
+const i18nInstance = new Streami18n({
+ language: 'en',
+ translationsForLanguage: {
+ 'aria/Send': 'Send Message',
+ },
+});
+
+
+ {/* ... */}
+;
+```
+
+## Add a Language
+
+In the following example, we will demonstrate how to add translation support for an additional language not currently supported
+by the component library. We will add translations for Simplified Chinese, which uses language code `zh`, by following these
+steps:
+
+1. Create a JSON file in your project (ex: `zh.json` if creating a translation file for Simplified Chinese)
+2. Copy the content of an existing [translation file](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/en.json)
+3. Change the values to your desired translations
+4. Register the translation file and set the new language
+5. Pass as a prop to the `Chat` component
+
+:::note
+The `setLanguage` method on the class instance of `Streami18n` is asynchronous, so it's response needs to be
+awaited before the language translations can be updated.
+:::
+
+We can initialize the instance dynamically:
+
+```tsx
+import zhTranslation from 'path/to/zh.json';
+
+const i18nInstance = new Streami18n();
+
+const App = () => {
+ const [languageLoaded, setLanguageLoaded] = useState(false);
+
+ useEffect(() => {
+ const loadLanguage = async () => {
+ i18nInstance.registerTranslation('zh', zhTranslations);
+ await i18nInstance.setLanguage('zh');
+ setLanguageLoaded(true);
+ };
+
+ loadLanguage();
+ }, []);
+
+ if (!languageLoaded) return null;
+
+ return (
+
+ ...
+
+ );
+};
+```
+
+Or we can have a pre-configured `Streami18n` instance:
+
+```tsx
+import zhTranslation from 'path/to/zh.json';
+
+const i18nInstance = new Streami18n({
+ language: 'zh',
+ translationsForLanguage: zhTranslations,
+ dayjsLocaleConfigForLanguage: {
+ // see the next section about Datetime translations
+ months: [...],
+ monthsShort: [...],
+ calendar: {
+ sameDay: ...'
+ }
+ }
+});
+
+const App = () => {
+ return (
+
+ ...
+
+ );
+};
+```
+
+### Datetime translations
+
+The SDK components use [`Dayjs`](https://day.js.org/en/) internally by default to format dates and times. It has [locale support](https://day.js.org/docs/en/i18n/i18n) being a lightweight alternative to `Momentjs` with the same modern API. `Dayjs` provides [locale config for plenty of languages](https://github.com/iamkun/dayjs/tree/dev/src/locale).
+
+You can either provide the `Dayjs` locale config while registering language with `Streami18n` (either via constructor or `registerTranslation()`) or you can provide your own `Dayjs` or `Momentjs` instance to `Streami18n` constructor, which will be then used internally (using the language locale) in components.
+
+:::note
+The `dayjsLocaleConfigForLanguage` object is a union of configuration objects for [`Dayjs` calendar plugin](https://day.js.org/docs/en/plugin/calendar) and `Dayjs` locale configuration(examples are available in [`Dayjs` default locale configurations](https://github.com/iamkun/dayjs/tree/dev/src/locale))
+:::
+
+1. Via language registration
+
+```js
+const i18n = new Streami18n({
+ language: 'nl',
+ dayjsLocaleConfigForLanguage: {
+ months: [...],
+ monthsShort: [...],
+ calendar: {
+ sameDay: ...'
+ }
+ }
+});
+```
+
+Similarly, you can add locale config for `Momentjs` while registering translation via `registerTranslation` function.
+
+```js
+const i18n = new Streami18n();
+
+i18n.registerTranslation(
+ 'mr',
+ {
+ 'Nothing yet...': 'काहीही नाही ...',
+ '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} आणि {{ secondUser }} टीपी करत आहेत ',
+ },
+ {
+ months: [...],
+ monthsShort: [...],
+ calendar: {
+ sameDay: ...'
+ }
+ }
+);
+```
+
+2. Provide your own `Momentjs` object
+
+```js
+import 'moment/locale/nl';
+import 'moment/locale/it';
+// or if you want to include all locales
+import 'moment/min/locales';
+
+import Moment from moment
+
+const i18n = new Streami18n({
+ language: 'nl',
+ DateTimeParser: Moment
+})
+```
+
+3. Provide your own Dayjs object
+
+```js
+import Dayjs from 'dayjs';
+
+import 'dayjs/locale/nl';
+import 'dayjs/locale/it';
+// or if you want to include all locales
+import 'dayjs/min/locales';
+
+const i18n = new Streami18n({
+ language: 'nl',
+ DateTimeParser: Dayjs,
+});
+```
+
+If you would like to stick with english language for dates and times in Stream components, you can set `disableDateTimeTranslations` to true.
+
+### Timezone location
+
+To display date and time in different than machine's local timezone, provide the `timezone` parameter to the `Streami18n` constructor. The `timezone` value has to be a [valid timezone identifier string](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). If no `timezone` parameter is provided, then the machine's local timezone is applied.
+
+```ts
+import { Streami18n } from 'stream-chat-react';
+
+const streamI18n = new Streami18n({ timezone: 'Europe/Prague' });
+```
+
+If you are using `moment` as your datetime parser engine and want to start using timezone-located datetime strings, then we recommend to use `moment-timezone` instead of `moment` package. Moment Timezone will automatically load and extend the moment module, then return the modified instance. This will also prevent multiple versions of `moment` being installed in a project.
+
+```ts
+import type momentTimezone from 'moment-timezone';
+import { Streami18n } from 'stream-chat-react';
+
+const i18n = new Streami18n({
+ DateTimeParser: momentTimezone,
+ timezone: 'Europe/Prague',
+});
+```
+
+### Translating Messages
+
+Stream Chat provide the ability to run users' messages through automatic translation.
+While machine translation is never perfect it can enable two users to communicate with
+each other without speaking the same language. For more information, see the full guide
+to [adding automatic translation](https://getstream.io/chat/docs/react/translation/?language=javascript).
+
+## Diacritics and Transliteration
+
+Searching for users when utilizing the '@' mentions command supports diacritics and, optionally, transliteration using [Transliterate](https://github.com/sindresorhus/transliterate). To add transliteration to your search functionality with the external Transliterate
+library, use the `useMentionsTransliteration` prop in the `MessageInput`. This library is dynamically imported if the prop is true. Diacritics support is available by default.
+
+
+
+
+
+## Streami18n API Reference
+
+The `Streami18n` class wraps [`i18next`](https://www.npmjs.com/package/i18next) and provides a set of values and methods.
+
+### Class Constructor Options
+
+| Option | Description | Type | Default |
+| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------- |
+| DateTimeParser | custom date time parser | function | Day.js |
+| dayjsLocaleConfigForLanguage | internal Day.js [config object](https://github.com/iamkun/dayjs/tree/dev/src/locale) and [calendar locale config object](https://day.js.org/docs/en/plugin/calendar) | object | 'enConfig' |
+| debug | enables i18n debug mode | boolean | false |
+| disableDateTimeTranslations | disables translation of date times | boolean | false |
+| language | connected user's language | string | 'en' |
+| logger | logs warnings/errors | function | () => {} |
+| parseMissingKeyHandler | function executed, when a key is not found among the translations | function | (key: string, defaultValue?: string) => string; |
+| translationsForLanguage | overrides existing component text | object | {} |
+| timezone | valid timezone identifier string (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | function | Day.js |
+
+#### parseMissingKeyHandler
+
+The default implementation returns the default value provided to the translator function, for example the component below will display string `'hello'` if the key `'some-key'` is not found among the translations for a given language:
+
+```tsx
+import { useTranslationContext } from 'stream-chat-react';
+
+const Component = () => {
+ const { t } = useTranslationContext('useCommandTrigger');
+
+ return
{t('some-key', { defaultValue: 'hello' })}
;
+};
+```
+
+The custom handler may log missing key warnings to the console in the development environment:
+
+```ts
+import { Streami18n, Streami18nOptions } from 'stream-chat-react';
+
+const parseMissingKeyHandler: Streami18nOptions['parseMissingKeyHandler'] = (
+ key: string,
+ defaultValue?: string,
+) => {
+ console.warn(`Streami18n: Missing translation for key: ${key}`);
+ return defaultValue ?? key;
+};
+
+const i18nInstance = new Streami18n({ parseMissingKeyHandler });
+```
+
+### Class Instance Methods
+
+#### getAvailableLanguages
+
+Returns an array of language code strings corresponding to available languages.
+
+```tsx
+const availableLanguages = streami18n.getAvailableLanguages();
+```
+
+#### geti18Instance
+
+Returns the instance of `i18next` used within the `Streami18n` instance.
+
+```tsx
+const i18nInstance = streami18n.geti18Instance();
+```
+
+#### getTranslations
+
+Returns the current translation dictionaries for all languages.
+
+```tsx
+const translations = streami18n.getTranslations();
+```
+
+#### getTranslators
+
+Asynchronous function that returns the current translator functions.
+
+```tsx
+const { t, tDateTimeParser } = await streami18n.getTranslators();
+```
+
+#### registerTranslation
+
+Allows you to register a custom translation, which overrides an existing translation for the given language.
+The third parameter, which is an optional Day.js locale, is structured the same as [dayjsLocaleConfigForLanguage](https://github.com/iamkun/dayjs/tree/dev/src/locale).
+
+Review the [`enTranslations`](https://github.com/GetStream/stream-chat-react/blob/master/src/i18n/en.json) JSON file exported from `stream-chat-react` for a current list of translation keys.
+
+```tsx
+streami18n.registerTranslation('es', {
+ 'Nothing yet...': 'Nada!',
+});
+```
+
+##### Parameters
+
+| Name | Type | Required |
+| ----------------- | ------ | ------------------ |
+| language | string | :heavy_check_mark: |
+| translation | object | :heavy_check_mark: |
+| customDayjsLocale | object | |
+
+#### setLanguage
+
+Asynchronous function that changes the current language and returns a new translation function.
+If not initialized, `undefined` will be returned. If the language fails to update, the current translation function will be returned.
+
+```tsx
+const t = await streami18n.setLanguage('nl');
+```
+
+##### Parameters
+
+| Name | Type | Required |
+| -------- | ------ | ------------------ |
+| language | string | :heavy_check_mark: |
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/typescript.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/typescript.mdx
new file mode 100644
index 0000000000..10b52a0909
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/typescript.mdx
@@ -0,0 +1,127 @@
+---
+id: typescript_and_generics
+title: TypeScript and Generics
+---
+
+As of version `5.0.0`, `stream-chat-react` has been converted to TypeScript. The `stream-chat` library was converted to TypeScript in version `2.0.0`.
+These upgrades not only improve type safety, but also allow user provided typings to be passed to server requests and custom components through
+the use of [generics](https://www.typescriptlang.org/docs/handbook/2/generics.html).
+
+In many cases, TypeScript uses [inference](https://www.typescriptlang.org/docs/handbook/type-inference.html) from provided props to establish a component or
+value's type. It is therefore important that the proper generics be applied to the `stream-chat` client instance during construction. The
+[documentation on `stream-chat` TypeScript](https://github.com/GetStream/stream-chat-js/blob/master/docs/typescript.md) has detailed examples of how this can be accomplished.
+The Stream Chat client takes a type with seven customizable fields that currently exist in `stream-chat`.
+
+```tsx
+const client = new StreamChat('YOUR_API_KEY');
+```
+
+`StreamChatGenerics` can be defined as a type with the seven generics that correspond to the seven customizable fields as follows:
+
+```tsx
+type StreamChatGenerics = {
+ attachmentType: LocalAttachmentType;
+ channelType: LocalChannelType;
+ commandType: LocalCommandType;
+ eventType: LocalEventType;
+ messageType: LocalMessageType;
+ reactionType: LocalReactionType;
+ userType: LocalUserType;
+};
+```
+
+:::note
+`LocalAttachmentType`, `LocalChannelType` etc. are type definitions for their respective key as per your application types necessities.
+
+```tsx
+type LocalAttachmentType = {
+ file_size?: number;
+};
+type LocalChannelType = Record;
+type LocalCommandType = string;
+type LocalEventType = Record;
+type LocalMessageType = Record;
+type LocalReactionType = Record;
+type LocalUserType = {
+ image?: string;
+};
+```
+
+:::
+
+The seven customizable fields these generics extend are provided via `stream-chat`:
+
+1. [`Attachment`](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts)
+2. [`ChannelResponse`](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts)
+3. [`CommandVariants`](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts)
+4. [`Event`](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts)
+5. [`MessageBase`](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts)
+6. [`Reaction`](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts)
+7. [`User`](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts)
+
+All seven generics contain defaults in the component library that can be extended for custom types for Channel, Messages, etc.
+
+```tsx
+type DefaultAttachmentType = Record;
+type DefaultChannelType = Record & {
+ image?: string;
+};
+type DefaultCommandType = string & {};
+type DefaultEventType = Record;
+type DefaultMessageType = Record & {
+ isAdminMessage?: boolean;
+};
+type DefaultReactionType = Record;
+type DefaultUserType = Record & {
+ image?: string;
+ nickName?: string;
+};
+```
+
+Additional fields on the defaults (eg: `file_size`, and `image`) are added by `stream-chat-react` within the SDK. When adding to the subset of generics,
+the preceding and interceding generics must also be set in order for the TypeScript compiler to correctly understand intent.
+
+The below example shows how to extend `ChannelType`, `MessageType`, and `UserType` during client instantiation:
+
+```tsx
+type StreamChatGenerics = {
+ attachmentType: DefaultAttachmentType;
+ channelType: DefaultChannelType;
+ commandType: DefaultCommandType;
+ eventType: DefaultEventType;
+ messageType: DefaultMessageType;
+ reactionType: DefaultReactionType;
+ userType: DefaultUserType;
+};
+```
+
+```tsx
+const client = new StreamChat('YOUR_API_KEY');
+```
+
+Through this client instantiation, we have added type support for the following values:
+
+- `channel.image`
+- `message.isAdminMessage`
+- `user.image`
+- `user.nickName`
+
+:::note
+`DefaultCommandType` extends `string & {}` to maintain intellisense for the included commands. This allows you to extend a string union.
+:::
+
+The exported custom context hooks also require generics be applied to correctly type custom returns. For example, the
+`useChannelStateContext` hook needs all generics to get a correctly typed return for `channel`.
+
+```tsx
+const { channel } = useChannelStateContext();
+```
+
+:::tip
+To see an example of extending the default `Attachment` type, see the [Geolocation Attachment](./theming/actions/geolocation-attachment.mdx#custom-map-attachment)
+custom code example.
+:::
+
+The current default types can be seen in the [`stream-chat-react` component library](https://github.com/GetStream/stream-chat-js/blob/master/src/types.ts). Any additional custom types
+will extend these defaults. Core to understanding this pattern is how generics can be
+[applied to JSX elements](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html#generic-type-arguments-in-jsx-elements).
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/guides/video-integration/video-integration-stream.mdx b/docusaurus/react_versioned_docs/version-11.x.x/guides/video-integration/video-integration-stream.mdx
new file mode 100644
index 0000000000..d7bf117887
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/guides/video-integration/video-integration-stream.mdx
@@ -0,0 +1,16 @@
+---
+id: video-integration-stream
+title: Video & Audio by Stream
+---
+
+import StreamVideoGraphic from '../../assets/stream-video-graphic.jpg'
+
+Stream now enables you to seamlessly integrate our [Video + Audio experience](https://getstream.io/video/) within your chat applications in days. The users can now enjoy a more enriched experience with the real-time video and audio communication in the familiar chat environment. This integration not only fosters stronger relationships but also empowers businesses to streamline collaboration and customer support, making it a pivotal feature in the next generation of communication applications.
+
+Try our [in-depth integration guide](https://getstream.io/video/docs/react/advanced/chat-with-video/) and have the Video and Audio experience in your app in no time.
+
+
+This guide is a part of our [Video and Audio experience documentation](https://getstream.io/video/docs/react/). The documentation is extensive and covers everything from core concepts (authentication, handling of media devices, permissions and lot more), the use of pre-built UI components to UI cookbook and app tutorials. Providing you with everything necessary to ensure a smooth and confident development journey.
+
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/hooks/channel-list-hooks.mdx b/docusaurus/react_versioned_docs/version-11.x.x/hooks/channel-list-hooks.mdx
new file mode 100644
index 0000000000..dd5e9f8859
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/hooks/channel-list-hooks.mdx
@@ -0,0 +1,65 @@
+---
+id: channel_list_hooks
+title: ChannelList Hooks
+---
+
+The `ChannelList` displays a list of `channels` via a state variable of the same name. The SDK provides a variety of hooks that are used within the component to handle events related to updates for a `channel`.
+The list's state variable is then updated accordingly via the hooks.
+
+Rather than exporting these individual hooks for customization purposes, many of these event listeners accept custom handler functions, which allows you to override the library's default event response behavior.
+
+To view the list of these custom handler functions to override (if there is one), see the `ChannelList` [documentation](../components/core-components/channel-list.mdx/#event-listeners).
+
+## Hooks
+
+### useChannelDeletedListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useChannelDeletedListener.ts) that handles the deletion of a channel from the list.
+
+### useChannelHiddenListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useChannelHiddenListener.ts) that handles the hiding of a channel from the list.
+
+### useChannelTruncatedListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useChannelTruncatedListener.ts) that handles when a channel's history is truncated.
+
+### useChannelUpdatedListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useChannelUpdatedListener.ts) that handles when a channel is updated.
+
+### useChannelVisibleListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useChannelVisibleListener.ts) that handles when a channel is made visible and added to the list.
+
+### useConnectionRecoveredListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useConnectionRecoveredListener.ts) that handles when connection is recovered and forces an update of the list.
+
+### useMessageNewListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useMessageNewListener.ts) that handles when connection is recovered and forces an update of the list.
+
+### useNotificationAddedToChannelListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useNotificationAddedToChannelListener.ts) that handles when a user is added to the list of channel members; moves channel to top of list and starts watching.
+
+### useNotificationMessageNewListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useNotificationMessageNewListener.ts) that handles when a new message is added to a channel; moves channel to top of list and starts watching.
+
+### useNotificationRemovedFromChannelListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.ts) that handles when a user is removed from the list of channel members; removes channel from list.
+
+### usePaginatedChannels
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/usePaginatedChannels.ts) that handles pagination and the querying of the channels for the list.
+
+### useUserPresenceChangedListener
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useUserPresenceChangedListener.ts) that handles when a user's status changes (ex: online, offline, etc.).
+
+### useMobileNavigation
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/hooks/useMobileNavigation.ts) that handles the opening and closing of a mobile navigation via Javascript click event listeners, not Stream events.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/hooks/message-hooks.mdx b/docusaurus/react_versioned_docs/version-11.x.x/hooks/message-hooks.mdx
new file mode 100644
index 0000000000..3e3d8d19c7
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/hooks/message-hooks.mdx
@@ -0,0 +1,281 @@
+---
+id: message_hooks
+title: Message Hooks
+---
+
+The Stream Chat React library provides a variety of useful hooks for use in your custom `Message` component.
+
+## Hooks
+
+### useActionHandler
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useActionHandler.ts) to handler function to handle when an action is sent in a `Channel`.
+
+### useDeleteHandler
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useDeleteHandler.ts) to handle message deletion.
+
+```jsx
+const MyCustomMessageComponent = () => {
+ const { message } = useMessageContext();
+ const handleDelete = useDeleteHandler(message);
+
+ if (message.type === 'deleted') {
+ return
Nothing to see here.
;
+ }
+
+ return (
+
+ {message.text}
+
+
+ );
+};
+```
+
+### useEditHandler
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useEditHandler.ts) to handle message editing. Returns an object with an editing state boolean and handlers for setting and clearing edit mode.
+
+```jsx
+const MyCustomMessageComponent = () => {
+ const { message } = useMessageContext();
+ const { editing, setEdit, clearEdit } = useEditHandler();
+
+ if (editing) {
+ return (
+
+ );
+};
+```
+
+### useOpenThreadHandler
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useOpenThreadHandler.ts) to handle the opening of a `thread` in the current `channel`. Returns an event handler to open a thread.
+
+```jsx
+const MyCustomMessageComponent = () => {
+ const { message } = useMessageContext();
+ const onThreadClick = useOpenThreadHandler(message);
+
+ return (
+
+ {message.text}
+
+
+ );
+};
+```
+
+### usePinHandler
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/usePinHandler.ts) to handle message pinning. It provides the permission status of the connected user and a function to toggle pinned status of of a `message`.
+
+```jsx
+const MyCustomMessageComponent = () => {
+ const { message, pinPermissions } = useMessageContext();
+ const { addNotification } = useChannelActionContext();
+
+ const { canPin, handlePin } = usePinHandler(message, pinPermissions, {
+ notify: addNotification
+ });
+
+ const handleClick = () => {
+ if (canPin) handlePin(message);
+ }
+
+ return (
+
+ );
+};
+```
+
+### useReactionsFetcher
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useReactionsFetcher.ts) to handle loading message reactions. Returns an async function that loads and returns message reactions.
+
+```jsx
+import { useQuery } from 'react-query';
+
+const MyCustomReactionsList = () => {
+ const { message } = useMessageContext();
+ const { addNotification } = useChannelActionContext();
+ const handleFetchReactions = useReactionsFetcher(message, { notify: addNotification });
+ // This example relies on react-query - but you can use you preferred method
+ // of fetching data instead
+ const { data } = useQuery(['message', message.id, 'reactions'], handleFetchReactions);
+
+ if (!data) {
+ return null;
+ }
+
+ return (
+ <>
+ {data.map((reaction) => (
+ reaction.type
+ ))}
+ >
+ );
+};
+```
+
+This function limits the number of loaded reactions to 1200. To customize this behavior, provide [your own loader function](../components/message-components/reactions.mdx#handlefetchreactions) instead.
+
+### useRetryHandler
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useRetryHandler.ts) to handle the retry of sending a message.
+
+```jsx
+const MyCustomMessageComponent = () => {
+ const { message } = useMessageContext();
+ const retrySend = useRetryHandler();
+
+ if (message.status === 'failed') {
+ const onRetry = () => retrySend(message);
+
+ return (
+
+ Failed to send: {message.text}
+
+
+ );
+ }
+
+ return
{message.text}
;
+};
+```
+
+### useUserHandler
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useUserHandler.ts) that exposes the info for a message's user. Returns event handlers for click and hover events for the user.
+
+```jsx
+const MyCustomMessageComponent = () => {
+ const { message } = useMessageContext();
+ const { onUserClick, onUserHover } = useUserHandler(message, {
+ onUserClickHandler: (e, user) => console.log(`Message from ${user}`),
+ onUserHoverHandler: (e, user) => console.log(`Message from ${user}`),
+ });
+
+ return (
+
+ {message.text}
+
+ );
+};
+```
+
+### useUserRole
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/hooks/useUserRole.ts) that exposes the info for a user's role for a certain message. Returns an object with the user's role information.
+
+```jsx
+const MyCustomMessageComponent = () => {
+ const { message } = useMessageContext();
+ const {
+ canDelete,
+ canEdit,
+ canFlag,
+ canMute,
+ canQuote,
+ canReact,
+ canReply,
+ isAdmin,
+ isModerator,
+ isMyMessage,
+ isOwner,
+ } = useUserRole(message);
+
+ if (isMyMessage || isAdmin) {
+ ...
+ }
+};
+```
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/hooks/message-input-hooks.mdx b/docusaurus/react_versioned_docs/version-11.x.x/hooks/message-input-hooks.mdx
new file mode 100644
index 0000000000..79990bac7e
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/hooks/message-input-hooks.mdx
@@ -0,0 +1,46 @@
+---
+id: message_input_hooks
+title: MessageInput Hooks
+---
+
+The `MessageInput` component uses a variety of custom hooks to assemble the [`MessageInputContext`](../components/contexts/message-input-context.mdx).
+These hooks can also be useful when building a custom [Input UI](../components/message-input-components/input-ui.mdx) component.
+
+The main provided hook, [`useMessageInputState`](#usemessageinputstate), uses a group of smaller, helper hooks which are segmented by functionality. Other hooks provided include [`useCooldownTimer`](#usecooldowntimer)
+and the several hooks used by the [`DefaultTriggerProvider`](../components/message-input-components/ui-components.mdx/#defaulttriggerprovider).
+
+## Hooks
+
+### useMessageInputState
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useMessageInputState.ts) that is a reducer hook and compiles all of the state information for the input and returns the current state and a dispatch method.
+This dispatch method is then used within the many smaller hooks that each compile and process a specific section of the state, and these are outlined below.
+
+- [useAttachments](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useAttachments.ts) - sets the state for attachments and returns this data and related functions.
+ Utilizes two hooks within it, [useFileUploads](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useFileUploads.ts) and [useImageUploads](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useImageUploads.ts).
+
+- [useEmojiIndex](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useEmojiIndex.ts) - returns the NimbleEmojiIndex. Added to the state under the `emojiIndex` key.
+
+- [useEmojiPicker](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useEmojiPicker.ts) - sets state logic and returns this data (including info on whether the picker is open or closed) and related handler functions.
+
+- [useMessageInputText](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useMessageInputText.ts) - processes the state for the text in the input and returns handlers for text change and insertion.
+
+- [usePasteHandler](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/usePasteHandler.ts) - returns a handler function that processes items that are pasted into the input.
+
+- [useSubmitHandler](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useSubmitHandler.ts) - processes the items in the input and then will send, clears the state after. Returns the handleSubmit handler function.
+
+### useCooldownTimer
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useCooldownTimer.tsx) where the `CooldownTimer` component is established. Handles the state logic for the timer and returns this data and the related handler.
+
+### useCommandTrigger
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useCommandTrigger.ts) used within the `DefaultTriggerProvider` component. Returns an object of trigger settings related to the `/` command.
+
+### useEmojiTrigger
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useEmojiTrigger.ts) used within the `DefaultTriggerProvider` component. Returns an object of trigger settings related to the `:` command.
+
+### useUserTrigger
+
+A [custom hook](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/hooks/useUserTrigger.ts) used within the `DefaultTriggerProvider` component. Returns an object of trigger settings related to the `@` command.
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/release-guides/upgrade-to-v10.mdx b/docusaurus/react_versioned_docs/version-11.x.x/release-guides/upgrade-to-v10.mdx
new file mode 100644
index 0000000000..d020b32cc1
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/release-guides/upgrade-to-v10.mdx
@@ -0,0 +1,277 @@
+---
+id: upgrade-to-v10
+title: Upgrade to v10 (theming V2)
+keywords: [migration guide, upgrade, v10, breaking changes, v2, theme-v2, theming-v2]
+---
+
+import ImageShowcase from '@site/src/components/ImageShowcase';
+import GHComponentLink from '../_docusaurus-components/GHComponentLink';
+
+import IconSetStandard from '../assets/file-attachment-icon-set-v2-standard.png';
+import IconSetAlt from '../assets/file-attachment-icon-set-v2-alt.png';
+import AudioCard from '../assets/theme-v2-card-audio.png';
+import AudioImage from '../assets/theme-v2-card-image.png';
+import AudioVideo from '../assets/theme-v2-card-video.png';
+import SVGAttachment from '../assets/theme-v2-svg-attachment.png';
+import EmptyChannelList from '../assets/theme-v2-empty-channel-list.png';
+import EmptyMessageList from '../assets/theme-v2-empty-message-list.png';
+import ScrollToBottomButton from '../assets/theme-v2-scroll-to-bottom-button-theme-v1.png';
+
+The release v10 brings some new features as well as some breaking changes to the users. The main focus was to support [the next version of theming V2](../theming/introduction.mdx) brought with `@stream-io/stream-chat-css@3.0.0`. It lead to addition resp. removal of some HTML elements in few components. This may invalidate some of your CSS selectors. Also, some components marked as deprecated for a longer period of time have been removed.
+
+We have tried to introduce as few breaking changes as possible. We have not removed classes but rather added new ones that are exclusively used with the theming V2 stylesheet. Also, where possible, V1 and V2 components have been introduced for backwards compatibility (the V1 components are used unless opted into theme version 2).
+
+Your upgrade strategy may differ based on whether you would like to make use of the new theming V2 or just do the necessary adjustments.
+
+## Changes impacting all the users
+
+### Components removed from the SDK
+
+The following components have been removed from our code base:
+
+1. MessageCommerce
+2. MessageLivestream
+3. MessageTeam
+
+### Markup and component API changes
+
+#### ChannelSearch
+
+We have renamed the prop `DropdownContainer` to `SearchResultsList` to better reflect the purpose of the component. The search results do not have to be shown in a drop-down container.
+
+Also, redundant `setResultsOpen` is not part of the type `ChannelSearchFunctionParams` anymore. This has impact on `onSelectResult` and `searchFunction` props
+
+#### ChannelPreview
+
+The `ChannelPreviewMessenger` component has received adjustments in markup - a new element to display the unread count has been added. You can target it with the class `str-chat__channel-preview-unread-badge` for further styling.
+
+#### MessageList
+
+The message list loading indicator is now wrapped in a div with class `str-chat__list__loading` so that you can target it better in your stylesheets.
+
+You can now customize `LoadingIndicator` component through the `Channel` props.
+
+There is a new prop `head` that allows you to render a custom React Element at top of the list. In the SDK it is used by the `Thread` component to display parent message.
+
+#### VirtualizeMessageList
+
+The default message component in virtualized Thread is now `MessageSimple` and not `FixedHeightMessage`. The `FixedHeightMessage` component has been deprecated and will be removed in the next release v11.
+
+Moreover, we have added a new prop `groupStyles` with the same purpose as in [non-virtualized `MessageList`](../components/core-components/message-list.mdx/#groupstyles).
+
+#### Thread
+
+Thread is actually a message list, but it has its own specifics. It always displays at least one message and that is the original parent message. With the release of the SDK v10, the parent message scroll behavior was unified. Now the parent message is part of the scroll container in both `MessageList` as well as `VirtualizedMessageList`. The part rendering the parent message and its separator from the rest of the replies is contained in a new component . You can provide your own custom implementation through a `Channel` prop `ThreadHead`. You can even override the separator by passing its substitute to the `Channel` prop `ThreadStart`.
+
+On the other hand, the component has experience markup changes. The `div` elements with classes `str-chat__thread-header-title` and `str-chat__thread-header-subtitle` have replaced elements `strong` and `small` in the header details. Thread now accepts two new props `overrideImage` (expects the image URL) and `overrideTitle` (expects custom title). Otherwise, the image and title are be extracted from the active channel object.
+
+The other change (fix) brought with the release is that the thread is scrolled to the bottom when open.
+
+#### EmptyStateIndicator
+
+The default component used to represent empty state in message list or channel list as been enriched with an SVG image:
+
+Empty channel list,
+ alt: 'Image of empty channel list',
+ },
+ {
+ image: EmptyMessageList,
+ caption: Empty message list,
+ alt: 'Image of empty message list',
+ },
+ ]}
+/>
+
+#### MessageNotifications
+
+We have added a new component . It allows you to notify users about new messages by displaying the unread count of messages in the active message list. Besides that it also serves as a scroll-to-bottom button when a user scrolls up. The threshold that determines, whether the button should be displayed can be set via `MessageList` (prop `scrolledUpThreshold`). Default value is 200px. The `VirtualizedMessageList` works with the same threshold, but not configurable. You can start using this component instead of the older version by passing it to `Channel` prop `MessageNotification`.
+
+New component ScrollToBottomButton,
+ alt: 'Image of a new component ScrollToBottomButton',
+ },
+ ]}
+/>
+
+#### Message
+
+Even if you do not upgrade to theme V2, you should be aware that the message text is now grouped with message attachments into one `div` with class `str-chat__message-bubble`.
+
+#### Attachment
+
+Attachments are now rendered in a fixed order from top to bottom:
+
+1. card,
+2. gallery
+3. image
+4. media
+5. audio
+6. file
+
+Another potentially breaking change is that the `Card` is not the default component to be rendered. If the provided `attachment` object is not identified as any of the above listed attachment types, its content is not rendered. The `Card` component is intended for display of scraped content. Remember that the attachment is now considered to carry scraped content only if it has `og_scrape_url` or `title_link` attributes. This is in order to comply with the chat API requirements.
+
+The attachment list is newly rendered within a `div` with class `str-chat__attachment-list`.
+
+Previous to v10 of the SDK, we used render functions to return React Elements. The render functions are now deprecated and components are used instead. This allows you to make use of all the React features while rendering different attachment types.
+
+All the image and video attachments are now expandable to the full-screen mode. This applies to scraped media as well.
+
+**Image attachments**
+
+Besides that, you can expect the SVG images to be rendered on the chessboard background now:
+
+SVG Attachment, alt: 'SVG attachment rendering' },
+ ]}
+/>
+
+The `Image` component now accepts new `dimensions` prop - object containing the image `height` and `width`.
+
+Multiple images uploaded in a message are rendered within a gallery. You can newly provide your custom `ModalGallery` component through a prop to `Channel` component. `ModalGallery` is passed the image array and the index of the image to be displayed.
+
+#### Message reactions
+
+The `Emoji` in the `ReactionSelector` has been wrapped in a `span` element with class `str-chat__message-reaction-emoji`. It allows us to control the height and alignment of the icon. To highlight the already selected emojis you can use newly added class `str-chat__message-reactions-option-selected`.
+
+The `ReactionList` now populates emoji tooltips with aggregated list of usernames who have already reacted with the given reaction.
+
+We have introduced a new prop `own_reactions` to both `ReactionSelector` and `ReactionList` that allows us to determine, whether the user has already reacted with a given reaction.
+
+#### MessageInput
+
+The `MessageInputSmall` component has been now been made redundant and was deprecated. We encourage the use of `MessageInputFlat` UI component only.
+
+## Opting into theme V2
+
+The majority of new features introduced with this release is bound to the use of the new theming V2. The list is as follows:
+
+### Theme
+
+The theme should be set via `Chat` component prop `theme`. Internally it is placed on
+
+1. the container wrapping the channel search and channel list and
+2. the container wrapping the active channel UI
+
+The new theming V2 provides default styles if no theme class is set. These styles are equivalent to those if class `str-chat__theme-light` is passed to the `theme` prop. If you would like to get the dark theme, you should pass `str-chat__theme-dark` instead.
+
+### Changes in the channel list container
+
+#### ChannelSearch
+
+The `ChannelSearch` component has been revamped and upgraded. It now provides richer functionality and wider possibilities of customization for those, who opt into use of theme V2. The component capabilities are described in [ChannelSearch documentation](../components/utility-components/channel-search.mdx) in more depth
+
+#### ChannelPreview
+
+We started to use component `ChannelPreview` to display search results. That is why the new prop `onSelect` has been added to its API. You can customize what happens, when the search result is selected.
+
+### Changes in the channel pane
+
+#### MessageList
+
+We have wrapped it in a new div with class `str-chat__main-panel-inner` for those using theme version 2.
+
+#### Message
+
+The markup of component rendering the message with its attachments, reactions, avatar etc. has been changed specifically for theme V2. The message metadata (author, timestamp), reply button, have been moved from `str-chat__message-inner` one level higher to the message root div.
+
+#### Attachment
+
+The API of the `Attachment` component or components that render a specific content type has not changed, you should be able to upgrade seamlessly. What you have to however expect is changed markup.
+
+**File attachments**
+
+The file attachment component used for theming V2 has changed markup compared to the V2. Also, a new set of file attachment icons has been applied:
+
+Standard (default) icon set,
+ alt: 'Image of standard file attachment icon set',
+ },
+ {
+ image: IconSetAlt,
+ caption: Alternative icon set,
+ alt: 'Image of alternative file attachment icon set',
+ },
+ ]}
+/>
+
+Our `FileAttachment` component for theming V2 uses the standard icon set. You can however use the alternative set in your custom components:
+
+So instead of:
+
+```tsx
+
+```
+
+You can do:
+
+```tsx
+
+```
+
+Besides that, the file attachment widgets newly display a download button (a download link).
+
+**Audio attachments**
+
+Audio attachments are rendered with a new component (with different markup) adapted to the theming V2 styles.
+
+**Scraped attachments (Card)**
+
+Cards now display scraped audio, video or image content:
+
+Audio card,
+ alt: 'Image of audio card with theme V2',
+ },
+ {
+ image: AudioVideo,
+ caption: Video card,
+ alt: 'Image of the video attachment card for the theme V2',
+ },
+ {
+ image: AudioImage,
+ caption: Default card (no audio neither video content),
+ alt: 'Image of the default attachment card for theme V2',
+ },
+ ]}
+/>
+
+#### Tooltip
+
+`Tooltip` is now being rendered with the help of the [`PopperJS`](https://popper.js.org/) to keep the content of the tooltip in the viewport longer when the tooltip origin (could be a button) is scrolled out of the viewport bounds.
+
+#### MessageInputFlat
+
+When opting to theme V2, the integrator gets revamped message input UI component where the markup differs completely from the original.
+
+`QuotedMessagePreviewHeader` has been extracted from the `QuotedMessagePreview` component and moved directly to the `MessageInputFlat` due to positioning reasons. Users will have the ability to replace this component with custom component in the future (see [#1764](https://github.com/GetStream/stream-chat-react/issues/1764)).
+
+`EmojiPicker` is now being rendered with the help of the [`PopperJS`](https://popper.js.org/) to keep the picker in the viewport longer when the picker origin (button) is scrolled out of the viewport bounds.
+
+`SendButton` is now disabled by default if there isn't any content to be submitted, i.e. there are no attachments or no text content.
+
+Default `UploadsPreview` has been renamed to and is no longer imported from the package `react-file-utils` but instead now lives within `stream-chat-react` code-base. Users will have the ability to replace this component with custom component in the future (see [#1299](https://github.com/GetStream/stream-chat-react/issues/1299)).
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/release-guides/upgrade-to-v11.mdx b/docusaurus/react_versioned_docs/version-11.x.x/release-guides/upgrade-to-v11.mdx
new file mode 100644
index 0000000000..46d52fba13
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/release-guides/upgrade-to-v11.mdx
@@ -0,0 +1,551 @@
+---
+id: upgrade-to-v11
+title: Upgrade to v11
+keywords: [migration guide, upgrade, v11, breaking changes, emojis, reactions]
+---
+
+import GHComponentLink from '../_docusaurus-components/GHComponentLink';
+
+## Introducing new reactions
+
+When it came to developer experience regarding customization of the reaction components our team noticed that our integrators generally struggled to make more advanced adjustments to reactions without having to rebuild the whole [component set](../components/message-components/reactions.mdx). The whole process has been quite unintuitive and that's why this update aims at making adjusting your reactions much easier.
+
+### Main reasons for a revamp
+
+- inability to reuse default (Stream supplied reactions) with your custom ones
+- strong reliance on [`emoji-mart`](https://github.com/missive/emoji-mart) and inability to use completely custom reactions out of the box
+- certain `additionalEmojiProps` did not work with Stream-supplied reactions
+
+```tsx
+// not exported directly (hidden, leading to poor DX)
+import { defaultMinimalEmojis } from 'stream-chat-react/dist/components/Channel/emojiData';
+
+export const customReactions = [
+ {
+ // relies on EmojiMart-supplied sprite sheet, "native" option does not work for Stream-supplied reactions
+ // you'd need to look up supported id's in stream-emoji.json under "emojis" key
+ id: 'bulb',
+ },
+ // unsupported
+ {
+ id: 'rick_roll',
+ },
+ // this wouldn't work
+ ...defaultMinimalEmojis,
+];
+```
+
+### New default setup and how it works
+
+SDK by default comes with five pre-defined reaction types (`haha`, `like`, `love`, `sad` and `wow`) which are newly rendered by component which utilises sprite sheet system and renders images for each reaction to make sure it works flawlessly on every system. Default reaction options are defined in and these options are reused for both [`ReactionSelector`](../components/message-components/reactions.mdx#reactionselector-props) and [`ReactionsList`](../components/message-components/reactions.mdx#reactionslist-props) (as well as [`SimpleReactionsList`](../components/message-components/reactions.mdx#simplereactionslist-props)). These options come by default from the ComponentContext but local component property will be prioritised if defined. This is how it works under the hood:
+
+```ts
+contextReactionOptions = defaultReactionOptions;
+// ...
+const reactionOptions = propsReactionOptions ?? contextReactionOptions;
+```
+
+:::note
+Beware that sixth reaction type `angry` has been removed in this update, if you need to re-enable it, follow [this guide](#re-enabling-angry-reaction).
+:::
+
+### Custom reaction types and components
+
+The default component is rendered with the fixed size. You can change the size of the rendered emoji using `--str-chat__stream-emoji-size` CSS variable:
+
+```tsx
+
+
+
+```
+
+It's possible to supply your own reaction types and components to represent such reactions - let's implement reaction of type `rick_roll` to render a Rick Roll GIF and define override for default type `love`:
+
+```tsx
+import { Channel } from 'stream-chat-react';
+
+const RickRollReaction = () => (
+
+);
+
+const customReactionOptions = [
+ {
+ Component: RickRollReaction,
+ type: 'rick_roll',
+ name: 'Rick Roll',
+ },
+ {
+ Component: () => <>❤️>,
+ type: 'love',
+ name: 'Heart',
+ },
+];
+```
+
+And then you can pass these newly created options to [`Channel`](../components/core-components/channel.mdx) component which will be then propagated to `ReactionSelector` and `ReactionsList`:
+
+```tsx
+{/*...*/}
+```
+
+### Emoji Mart integration
+
+If you're used to work with [EmojiMart emojis](https://github.com/missive/emoji-mart#-emoji-component) then integrating with new reaction system shouldn't be a big trouble as you can define how your components look and reach for context if you need to:
+
+```tsx
+// arbitrary EmojiMartContext (does not come with the SDK)
+import { useEmojiMartContext } from '../contexts';
+
+const CustomLikeComponent = () => {
+ const { selectedSkinTones, selectedSet } = useEmojiMartContext();
+
+ // to use EmojiMart web components you'll need to go through initiation steps, see EmojiMart documentation
+ return ;
+};
+
+const reactionOptions = [
+ {
+ type: 'like',
+ component: CustomLikeComponent,
+ name: 'EmojiMart like',
+ },
+];
+
+// pass reaction options to component context (Channel) or to ReactionSelector and ReactionsList
+```
+
+### Use of different reaction components for the same reaction types for `ReactionSelector` and `ReactionsList` components
+
+If you need more fine-grain tuning and want to - for example - enable only a certain subset of clickable reactions but want to display the full set then you'd do something like this:
+
+```tsx
+const JoyReaction = () => <>😂>;
+const CatReaction = () => <>🐈>;
+const ThumbsUpReaction = () => <>👍>;
+const SmileReaction = () => <>🙂>;
+
+// subset of clickable options available to the user
+const selectedReactionOptions = [
+ { type: 'haha', Component: JoyReaction },
+ { type: 'cat', Component: CatReaction },
+];
+
+// set of all available options to be rendered
+const completeReactionOptions = [
+ { type: 'haha', Component: JoyReaction },
+ { type: 'cat', Component: CatReaction },
+ { type: '+1', Component: ThumbsUpReaction },
+ { type: 'smile', Component: SmileReaction },
+];
+```
+
+Or if you just want bigger icons for `ReactionsList` while `ReactionSelector` uses regular:
+
+```tsx
+// arbitrary import (does not come with the SDK)
+import { ReactionComponent } from './CustomReactions';
+
+const selectorReactionOptions = [
+ {
+ type: 'like',
+ component: ReactionComponent.Like,
+ name: 'Like',
+ },
+];
+
+const listReactionOptions = [
+ {
+ type: 'like',
+ // in this example it's just different size of the emoji
+ component: ReactionComponent.LikeMedium,
+ name: 'Like medium',
+ },
+];
+```
+
+You can then apply these new options to `ReactionSelector` and `ReactionsList` directly:
+
+```tsx
+import { ReactionSelector, ReactionsList, Channel } from 'stream-chat-react';
+
+// ReactionSelector component requires forwarded reference
+const CustomReactionSelector = forwardRef((props, ref) => (
+
+));
+
+const CustomReactionsList = (props) => (
+
+);
+```
+
+And then pass them down to component context (`Channel`) component:
+
+```tsx
+
+ {/*...*/}
+
+```
+
+### Use of `SpriteImage` component
+
+:::note
+We suggest using individual images per reaction type as multiple smaller requests is more bandwidth-friendly. Use this component only if you have no other choice.
+:::
+
+If you have a sprite sheet of emojis and there's no other way for you to implement your reactions, you can utilise utility component which comes with the SDK:
+
+```tsx
+import { SpriteImage } from 'stream-chat-react';
+
+const SPRITE_URL = 'https://getstream.imgix.net/images/emoji-sprite.png';
+
+const reactionOptions = [
+ {
+ type: 'joy',
+ component: () => (
+ // renders fallback initially and then image when it successfully loads
+
+ ),
+ name: 'ROFL',
+ },
+];
+
+// pass reaction options to component context (Channel) or to ReactionSelector and ReactionsList
+```
+
+### Transition from previous version of custom reactions
+
+#### Default setup
+
+The transition is super easy:
+
+```tsx
+import { defaultReactionOptions } from 'stream-chat-react';
+
+// old custom options
+const reactionOptions = [{ id: 'bulb' /* ...extra properties... */ }, { id: '+1' }, { id: 'joy' }];
+
+// would newly become
+const newReactionOptions = [
+ { type: 'bulb', Component: () => <>💡>, name: 'Bulb reaction' },
+ { type: '+1', Component: () => <>👍> },
+ { type: 'joy', Component: () => <>🤣>, name: 'ROFL' },
+ // reuse default ones if you want to
+ ...defaultReactionOptions,
+];
+```
+
+All of the extra options previously applied to `EmojiMart` emojis can now be directly applied to your custom components either manually or through your custom context. For more information see [EmojiMart integration](#emoji-mart-integration).
+
+#### Re-enabling `angry` reaction
+
+For better compatibility with other SDKs we decided to consolidate default available types and remove `angry` type which was previously available only in the React SDK. Here's how you'd go about re-enabling it:
+
+```tsx
+import { StreamEmoji, defaultReactionOptions } from 'stream-chat-react';
+
+const reactionOptions = [
+ ...defaultReactionOptions,
+ { type: 'angry', Component: () => , name: 'Angry' },
+];
+
+// pass reaction options to component context (Channel) or to ReactionSelector and ReactionsList
+```
+
+## Dropping support for built-in `EmojiIndex`
+
+By default, our SDK comes bundled with the `emoji-mart`'s [`emojiIndex`](https://github.com/missive/emoji-mart/tree/v3.0.1#headless-search), more specifically - `NimbleEmojiIndex` class which is then instantiated with custom `emojiData` by our SDK. This index serves as a tool for efficiently searching through the emoji list and returning a subset that matches the search criteria (query). Within our SDK, this functionality is utilized by our autocomplete component, triggered by entering `:` to the meessage input. This functionality will continue to be integrated within our SDK. However, due to our decision to discontinue the use of `emoji-mart` within the SDK, this feature will now be available on an opt-in basis. With the updated types and interface this will also allow integrators to supply their own `emojiSearchIndex` instead of relying exclusively on the one supplied by `emoji-mart`.
+
+### Reinstate emoji autocomplete behavior (search for emojis with `:`)
+
+Add `emoji-mart` to your packages and make sure the package versions fit our peer-dependency requirements:
+
+```bash
+yarn add emoji-mart @emoji-mart/data
+```
+
+Import `SearchIndex` and `data` from `emoji-mart`, initiate these data and then and pass `SearchIndex` to our `MessageInput` component:
+
+```tsx
+import { MessageInput } from 'stream-chat-react';
+import { init, SearchIndex } from 'emoji-mart';
+import data from '@emoji-mart/data';
+
+init({ data });
+
+export const WrappedMessageInput = () => {
+ return ;
+};
+```
+
+### Build your custom `emojiSearchIndex`
+
+#### Prerequisities
+
+Your data returned from the `search` method should have _at least_ these three properies which our SDK relies on:
+
+- name - display name for the emoji, ie: `"Smile"`
+- id - unique emoji identificator
+- skins - an array of emojis with different skins (our SDK uses only the first one in this array), ie: `[{ native: "😄" }]`
+
+Optional properties:
+
+- emoticons - an array of strings to match substitutions with, ie: `[":D", ":-D", ":d"]`
+- native - native emoji string (old `emoji-mart` API), ie: `"😄"` - will be prioritized if specified
+
+#### Example
+
+```tsx
+import { type EmojiSearchIndex } from 'stream-chat-react';
+import search from '@jukben/emoji-search';
+
+const emoticonMap: Record = {
+ '😃': [':D', ':-D'],
+ '😑': ['-_-'],
+ '😢': [":'("],
+};
+
+const emojiSearchIndex: EmojiSearchIndex = {
+ search: (query) => {
+ const results = search(query);
+
+ return results.slice(0, 15).map((data) => ({
+ emoticons: emoticonMap[data.name],
+ id: data.name,
+ name: data.keywords.slice(1, data.keywords.length).join(', '),
+ native: data.name,
+ skins: [],
+ }));
+ },
+};
+
+export const WrappedChannel = ({ children }) => (
+ {children}
+);
+```
+
+### Migrate from `v10` to `v11` (`EmojiIndex` becomes `emojiSearchIndex`)
+
+`EmojiIndex` has previously lived in the `EmojiContext` passed to through `Channel` component. But since `EmojiContext` no longer exists in our SDK, the property has been moved to our `ComponentContext` (still passed through `Channel`) and changed its name to `emojiSearchIndex` to properly repesent its funtionality. If your custom `EmojiIndex` worked with our default components in `v10` then it should still work in `v11` without any changes to its `search` method output:
+
+Your old code:
+
+```tsx
+import { Channel, MessageInput } from 'stream-chat-react';
+// arbitrary import
+import { CustomEmojiIndex, customData } from './CustomEmojiIndex';
+
+const App = () => {
+ return (
+
+ {/* other components */}
+
+
+ );
+};
+```
+
+Should newly look like this:
+
+```tsx
+import { Channel, MessageInput } from 'stream-chat-react';
+// arbitrary import
+import { CustomEmojiIndex, customData } from './CustomEmojiIndex';
+// instantiate the search index
+const customEmojiSearchIndex = new CustomEmojiIndex(customData);
+
+const App = () => {
+ return (
+
+ {/* other components */}
+
+
+ );
+};
+```
+
+Or enable it in either of the `MessageInput` components individually:
+
+```tsx
+import { Channel, MessageInput } from 'stream-chat-react';
+// arbitrary import
+import { CustomEmojiIndex, customData } from './CustomEmojiIndex';
+// instantiate the search index
+const customEmojiSearchIndex = new CustomEmojiIndex(customData);
+
+const App = () => {
+ return (
+
+ {/* other components */}
+
+
+
+ );
+};
+```
+
+## Dropping support for built-in `EmojiPicker`
+
+By default - our SDK would ship with `emoji-mart` dependency on top of which our `EmojiPicker` component is built. And since the SDK is using `emoji-mart` for this component - it was also reused for reactions (`ReactionsList` and `ReactionSelector`) and suggestion list (`MessageInput`). This solution proved to be very uncomfortable to work with when it came to replacing either of the mentioned components (or disabling them completely) and the final applications using our SDK would still bundle certain `emoji-mart` parts which weren't needed (or seemingly "disabled") resulting in sub-optimal load times. Maintaining such architecture became a burden so we're switching things a bit.
+
+### Changes to the default component composition (architecture)
+
+SDK's `EmojiPicker` component now comes as two-part "bundle" - a button and an actual picker element. The component now holds its own `open` state which is handled by clicking the button (or anywhere else to close it).
+
+### Switching to opt-in mechanism (BREAKING CHANGE)
+
+We made `emoji-mart` package in our SDK completely optional which means that `EmojiPicker` component is now disabled by default.
+
+#### Reinstate the `EmojiPicker` component
+
+To reinstate the previous behavior you'll have to add `emoji-mart` to your packages and make sure the packages come with versions that fit our peer-dependency requirements:
+
+```bash
+yarn add emoji-mart @emoji-mart/data @emoji-mart/react
+```
+
+Import `EmojiPicker` component from the `stream-chat-react` package:
+
+```tsx
+import { Channel } from 'stream-chat-react';
+import { EmojiPicker } from 'stream-chat-react/emojis';
+
+// and apply it to the Channel (component context)
+
+const WrappedChannel = ({ children }) => {
+ return {children};
+};
+```
+
+#### Build your custom `EmojiPicker` (with example)
+
+If `emoji-mart` is too heavy for your use-case and you'd like to build your own you can certainly do so, here's a very simple `EmojiPicker` example built using `emoji-picker-react` package:
+
+```tsx
+import EmojiPicker from 'emoji-picker-react';
+import { useMessageInputContext } from 'stream-chat-react';
+
+export const CustomEmojiPicker = () => {
+ const [open, setOpen] = useState(false);
+
+ const { insertText, textareaRef } = useMessageInputContext();
+
+ return (
+ <>
+
+
+ {open && (
+ {
+ insertText(emoji.native);
+ textareaRef.current?.focus(); // returns focus back to the message input element
+ }}
+ />
+ )}
+ >
+ );
+};
+
+// and pass it down to the `Channel` component
+```
+
+You can make the component slightly better using [`FloatingUI`](https://floating-ui.com/) by wrapping the actual picker element to make it float perfectly positioned above the button. See the source of the component which comes with the SDK for inspiration.
+
+### Old `emoji-mart` (v3.0.1)
+
+Even though it's not explicitly provided by our SDK anymore, it's still possible for our integrators to use older version of the `emoji-mart` - specifically version `3.0.1` on top of which our old components were built. We don't recommend using old version of the `emoji-mart` but if you really need to, follow the [`3.0.1` documentation](https://github.com/missive/emoji-mart/tree/v3.0.1#picker) in combination with the previous guide to build your own `EmojiPicker` component with the old `emoji-mart` API. Beware though, if you wish to use slightly modified `emoji-mart` CSS previously supplied by our SDK by default in the main `index.css` file, you'll now have to explicitly import it:
+
+```tsx
+import 'stream-chat-react/css/v2/index.css';
+import 'stream-chat-react/css/v2/emoji-mart.css';
+```
+
+## Channel instance as a first argument to `doSendMessageRequest`
+
+The `doSendMessageRequest` will from now on be passed the `Channel` instance instead of its CID to avoid forcing the developers to recreate a reference to the `Channel` instance inside the `doSendMessageRequest` function. The developers should adjust their implementation of `doSendMessageRequest` to call directly `await channel.sendMessage(messageData, options)`:
+
+```ts
+import { ChannelProps } from 'stream-chat-react';
+
+const doSendMessageRequest: ChannelProps['doSendMessageRequest'] = async (
+ channel,
+ messageData,
+ options,
+) => {
+ // optional custom logic
+ await channel.sendMessage(messageData, options);
+ // optional custom logic
+};
+```
+
+## Message text rendering
+
+Optional remark plugins `htmlToTextPlugin`, `keepLineBreaksPlugin` introduced with [stream-chat-react@v10.19.0](https://github.com/GetStream/stream-chat-react/releases/tag/v10.19.0) are now included among the default remark plugins. That means that in the messages that originally contained a sequence of multiple newline characters `\n`, these will be replaced with line break elements ` `. The number of line breaks equals count of newline characters minus 1.
+The dependencies used to parse the markdown with [`renderText` function](../components/message-components/render-text.mdx) have been upgraded as a result of that, the following changes had to be performed in stream-chat-react library:
+
+### `ReactMarkdownProps` dropped from `customMarkDownRenderers`
+
+`RenderTextOptions.customMarkDownRenderers`- a mapping of element name and corresponding React component to be rendered. The components are no longer accepting `ReactMarkdownProps`
+
+### User mention renderer props change
+
+The `RenderTextOptions.customMarkDownRenderers.mention` props have been reduced. From now on, only `children` and `node` are passed to the component. And so now `mention` renderer props look as follows:
+
+```ts
+import { PropsWithChildren } from 'react';
+import type { UserResponse } from 'stream-chat';
+import type { DefaultStreamChatGenerics } from 'stream-chat-react';
+
+type MentionProps<
+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
+> = PropsWithChildren<{
+ node: {
+ mentionedUser: UserResponse;
+ };
+}>;
+```
+
+### Adjust custom rehype or remark plugins
+
+If you have implemented your own rehype or remark plugin using `visit` function from the library `unist-util-visit` beware that the `index` and `parent` arguments of the `Visitor` function cannot be `null` but `undefined` instead. You should be notified by Typescript about this and should adjust the type checks accordingly.
+
+If you would like to prevent applying plugins `htmlToTextPlugin`, `keepLineBreaksPlugin`, you can customize your `renderText()` by overriding the remark plugins. The example below will keep the plugin `remarkGfm` and exclude the rest:
+
+```tsx
+import remarkGfm from 'remark-gfm';
+import { renderText, RenderTextPluginConfigurator } from 'stream-chat-react';
+
+const getRemarkPlugins: RenderTextPluginConfigurator = () => {
+ return [[remarkGfm, { singleTilde: false }]];
+};
+
+const customRenderText = (text, mentionedUsers) =>
+ renderText(text, mentionedUsers, {
+ getRemarkPlugins,
+ });
+
+const CustomMessageList = () => ;
+```
+
+## Flag `useImageFlagEmojisOnWindows`
+
+Since this release you'll need to explicitly import extra stylesheet from `stream-chat-react/css/v2/emoji-replacement.css` as it has been removed from our main stylesheet to reduce final bundle size for integrators who do not wish to use this feature.
+
+```tsx
+import { Chat } from 'stream-chat-react';
+
+import 'stream-chat-react/css/v2/index.css';
+import 'stream-chat-react/css/v2/emoji-replacement.css';
+
+export const WrappedChat = ({ children, client }) => (
+
+ {children}
+
+);
+```
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/resources/resources.mdx b/docusaurus/react_versioned_docs/version-11.x.x/resources/resources.mdx
new file mode 100644
index 0000000000..575497520e
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/resources/resources.mdx
@@ -0,0 +1,48 @@
+---
+id: resources
+title: Resources
+---
+
+Here's a list of external and internal resource links that could be helpful during development while using the Stream Chat React SDK library.
+
+### [Stream Chat React GitHub](https://github.com/GetStream/stream-chat-react)
+
+### [Stream Chat React SDK - Demos](https://getstream.io/chat/demos/messaging/)
+
+- Be sure to check out the source code for each demo application in the above link.
+
+### [Stream Chat React SDK Tutorial](https://getstream.io/chat/react-chat/tutorial/)
+
+### [Stream JS Client](https://getstream.io/chat/docs/javascript/?language=javascript)
+
+### [Stream Chat API tutorial](https://getstream.io/chat/get_started/)
+
+### [Stream Chat JS Basic Guide](https://github.com/GetStream/javascript-beginner-guide)
+
+> ### React Documentation
+
+- [React - Getting Started](https://reactjs.org/docs/getting-started.html)
+
+- [React - Context](https://reactjs.org/docs/context.html)
+
+> ### Internal Articles
+
+- [Stream Chat Glossary](https://getstream.zendesk.com/hc/en-us/articles/1500007212082-Stream-Chat-Glossary)
+
+- [Stream Chat Success Checklist](https://getstream.zendesk.com/hc/en-us/articles/1500007673721-Stream-Chat-Success-Checklist)
+
+- [React - Customizing Message Actions](https://getstream.zendesk.com/hc/en-us/articles/1500008025241--Customizing-Message-Actions-in-React-Chat)
+
+- [Stream Webhooks](https://getstream.zendesk.com/hc/en-us/articles/1500006478421-How-can-I-use-the-Stream-Webhook-to-send-customers-emails-based-on-Chat-events-)
+
+- [Stream Rate limits](https://getstream.zendesk.com/hc/en-us/articles/360056792833-Rate-limits-and-HTTP-429-Errors)
+
+- [Stream API → Client → Server](https://getstream.zendesk.com/hc/en-us/articles/360061669873-How-do-the-Chat-Client-Server-Stream-API-communicate-with-each-other-)
+
+- [Stream Chat Moderation](https://getstream.zendesk.com/hc/en-us/articles/360041455753)
+
+- [Stream User Roles and Permissions](https://getstream.zendesk.com/hc/en-us/articles/360053064274-User-Roles-and-Permission-Policies-Chat)
+
+- [Stream queryChannels filters](https://getstream.zendesk.com/hc/en-us/articles/360057461213-Filters-for-queryChannels-Chat)
+
+- [Stream Unread Messages](https://getstream.zendesk.com/hc/en-us/articles/360042753154-How-do-I-retrieve-unread-messages-Chat)
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/theming/SDKSpecific.jsx b/docusaurus/react_versioned_docs/version-11.x.x/theming/SDKSpecific.jsx
new file mode 100644
index 0000000000..efe4f4ddb6
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/theming/SDKSpecific.jsx
@@ -0,0 +1,10 @@
+import React from 'react';
+import BrowserOnly from '@docusaurus/BrowserOnly';
+
+const SDKSpecific = ({ children, name = 'angular' }) => (
+
+ {() => window.location.pathname.includes(`/sdk/${name}`) ? children : null}
+
+);
+
+export default SDKSpecific;
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/theming/V2Warning.jsx b/docusaurus/react_versioned_docs/version-11.x.x/theming/V2Warning.jsx
new file mode 100644
index 0000000000..7613cefbf3
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/theming/V2Warning.jsx
@@ -0,0 +1,16 @@
+import React from 'react';
+import Link from '@docusaurus/Link';
+
+const V2Warning = ({ introductionPath = '../themingv2', themingAndCSSPath }) => {
+ return (
+ <>
+ This part of the documentation refers to the new version of the theming and customization
+ system which won't work with the old system, please refer to the{' '}
+ theme-v2 documentation to learn more about the new system
+ or CSS and Theming if you need documentation for the old system
+ (also known as v1 or version 1).
+ >
+ );
+};
+
+export default V2Warning;
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/theming/_category_.json b/docusaurus/react_versioned_docs/version-11.x.x/theming/_category_.json
new file mode 100644
index 0000000000..90aab7f6f0
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/theming/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Theming and CSS",
+ "position": 2
+}
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/theming/component-variables.mdx b/docusaurus/react_versioned_docs/version-11.x.x/theming/component-variables.mdx
new file mode 100644
index 0000000000..3ab47ab224
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/theming/component-variables.mdx
@@ -0,0 +1,889 @@
+---
+id: component-variables
+sidebar_position: 3
+title: Component variables
+keywords: [v2, theme-v2, theming-v2, theming, component variables]
+---
+
+import SDKSpecific from './SDKSpecific';
+import V2Warning from './V2Warning';
+
+:::info
+
+
+
+
+
+
+
+
+
+:::
+
+CSS variables are the easiest way to customize the theme. The variables are organized into two layers:
+
+- Global
+- Component
+
+This page contains information about the component variables.
+
+## AttachmentList
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| `--str-chat__attachment-list-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the component |
+| `--str-chat__attachment-list-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__attachment-list-background-color` |
`.str-chat`
`transparent`
| The background color of the component |
+| `--str-chat__attachment-list-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__attachment-list-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__attachment-list-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__attachment-list-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__attachment-list-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__image-attachment-border-radius` |
| The border radius used for the borders of image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-attachment-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-attachment-background-color` |
`.str-chat`
`var(--str-chat__secondary-surface-color)`
| The background color of image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-attachment-border-block-start` |
`.str-chat`
`none`
| Top border of image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-attachment-border-block-end` |
`.str-chat`
`none`
| Bottom border of image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-attachment-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-attachment-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-attachment-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to image/video attachments (images/videos uploaded from files, scraped media, GIFs) |
+| `--str-chat__image-gallery-attachment-border-radius` |
| Border radius applied to the play / pause button of audio widget |
+| `--str-chat__audio-attachment-controls-button-color` |
`.str-chat`
`var(--str-chat__text-color)`
| Text color applied to audio widget's play / pause button |
+| `--str-chat__audio-attachment-controls-button-background-color` |
`.str-chat`
`var( --str-chat__secondary-background-color )`
| Background color applied to audio widget's play / pause button |
+| `--str-chat__audio-attachment-controls-button-pressed-background-color` |
`.str-chat`
`var( --str-chat__surface-color )`
| Background color applied to audio widget's play / pause button when in pressed (active) state |
+| `--str-chat__audio-attachment-controls-button-border-block-start` |
`.str-chat`
`none`
| Top border of audio widget's play / pause button |
+| `--str-chat__audio-attachment-controls-button-border-block-end` |
`.str-chat`
`none`
| Bottom border of audio widget's play / pause button |
+| `--str-chat__audio-attachment-controls-button-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of audio widget's play / pause button |
+| `--str-chat__audio-attachment-controls-button-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of audio widget's play / pause button |
+| `--str-chat__audio-attachment-controls-button-box-shadow` |
`.str-chat`
`var(--str-chat__circle-fab-box-shadow)`
| Box shadow applied to audio widget's play / pause button |
+| `--str-chat__attachment-actions-border-radius` |
`.str-chat`
`0`
| The border radius used for attachment actions |
+| `--str-chat__attachment-actions-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of attachment actions |
+| `--str-chat__attachment-actions-background-color` |
`.str-chat`
`transparent`
| The background color of attachment actions |
+| `--str-chat__attachment-actions-border-block-start` |
`.str-chat`
`none`
| Top border of attachment actions |
+| `--str-chat__attachment-actions-border-block-end` |
`.str-chat`
`none`
| Bottom border of attachment actions |
+| `--str-chat__attachment-actions-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of attachment actions |
+| `--str-chat__attachment-actions-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of attachment actions |
+| `--str-chat__attachment-actions-box-shadow` |
| The border radius used for an attachment action |
+| `--str-chat__attachment-action-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon color of an attachment action |
+| `--str-chat__attachment-action-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of an attachment action |
+| `--str-chat__attachment-action-border-block-start` |
`.str-chat`
`var(--str-chat__surface-color) 1px solid`
| Top border of an attachment action |
+| `--str-chat__attachment-action-border-block-end` |
`.str-chat`
`var(--str-chat__surface-color) 1px solid`
| Bottom border of an attachment action |
+| `--str-chat__attachment-action-border-inline-start` |
`.str-chat`
`var(--str-chat__surface-color) 1px solid`
| Left (right in RTL layout) border of an attachment action |
+| `--str-chat__attachment-action-border-inline-end` |
`.str-chat`
`var(--str-chat__surface-color) 1px solid`
| Right (left in RTL layout) border of an attachment action |
+| `--str-chat__attachment-action-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to an attachment action |
+| `--str-chat__attachment-action-active-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text/icon color of an attachment action while in pressed state |
+
+Defined in: [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss)
+
+### Layout variables
+
+| Name | Value(s) | Description |
+| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--str-chat__attachment-margin` |
`.str-chat`
`var(--str-chat__spacing-0_5)`
`.str-chat__quoted-message-preview`
`0px`
| The margin applied to every attachment in the attachment list |
+| `--str-chat__gif-height` |
`.str-chat`
`calc(var(--str-chat__spacing-px) * 200)`
| The height of GIFs |
+| `--str-chat__attachment-max-width` |
| The maximum allowed width and height of attachments, in case of gallery images this is the maximum size of the whole gallery (not just for a single image inside the gallery). There are some constraints for the acceptable values you can provide for this variable, [Angular documentation](https://getstream.io/chat/docs/sdk/angular/components/AttachmentListComponent/#maximum-size), [React documentation](https://getstream.io/chat/docs/sdk/react/message-components/attachment/#image-and-video-sizing). |
+| `--str-chat__video-height` |
`.str-chat__attachment-list`
`var(--str-chat__attachment-max-width)`
| The maximum height of videos, the default value is the mase as `--str-chat__attachment-max-width`. The rendered video can be smaller based on the aspect ratio |
+| `--str-chat__scraped-image-height` |
| The height of scraped videos, the default value is optimized for 16:9 aspect ratio |
+
+Defined in: [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-layout.scss)
+
+## AttachmentPreviewList
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
+| `--str-chat__attachment-preview-list-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-sm)`
| The border radius used for the borders of the component |
+| `--str-chat__attachment-preview-list-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__attachment-preview-list-background-color` |
`.str-chat`
`transparent`
| The background color of the component |
+| `--str-chat__attachment-preview-list-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__attachment-preview-list-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__attachment-preview-list-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__attachment-preview-list-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__attachment-preview-list-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__attachment-preview-close-icon-background` |
`.str-chat`
`var(--str-chat__secondary-overlay-color)`
| Background color of the preview delete icon |
+| `--str-chat__attachment-preview-close-icon-color` |
`.str-chat`
`var(--str-chat__secondary-overlay-text-color)`
| Foreground color of the preview delete icon |
+| `--str-chat__attachment-preview-retry-icon-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| Color of the upload retry icon |
+| `--str-chat__attachment-preview-download-icon-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| Color of the preview download icon |
+| `--str-chat__attachment-preview-overlay-color` |
`.str-chat`
`var(--str-chat__overlay-color)`
| Overlay color applied to attachment previews during upload and if an error occured during upload |
+| `--str-chat__attachment-preview-image-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-sm)`
| The border radius used for the borders of the image preview |
+| `--str-chat__attachment-preview-image-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the image preview |
+| `--str-chat__attachment-preview-image-background-color` |
`.str-chat`
`transparent`
| The background color of the image preview |
+| `--str-chat__attachment-preview-image-border-block-start` |
`.str-chat`
`none`
| Top border of the image preview |
+| `--str-chat__attachment-preview-image-border-block-end` |
`.str-chat`
`none`
| Bottom border of the image preview |
+| `--str-chat__attachment-preview-image-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the image preview |
+| `--str-chat__attachment-preview-image-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the image preview |
+| `--str-chat__attachment-preview-image-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the image preview |
+| `--str-chat__attachment-preview-file-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-md)`
| The border radius used for the borders of the file preview |
+| `--str-chat__attachment-preview-file-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the file preview |
+| `--str-chat__attachment-preview-file-background-color` |
`.str-chat`
`transparent`
| The background color of the file preview |
+| `--str-chat__attachment-preview-file-border-block-start` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Top border of the file preview |
+| `--str-chat__attachment-preview-file-border-block-end` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Bottom border of the file preview |
+| `--str-chat__attachment-preview-file-border-inline-start` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Left (right in RTL layout) border of the file preview |
+| `--str-chat__attachment-preview-file-border-inline-end` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Right (left in RTL layout) border of the file preview |
+| `--str-chat__attachment-preview-file-box-shadow` |
| The border radius used for the borders of the component |
+| `--str-chat__autocomplete-menu-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__autocomplete-menu-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the component |
+| `--str-chat__autocomplete-menu-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__autocomplete-menu-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__autocomplete-menu-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__autocomplete-menu-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__autocomplete-menu-box-shadow` |
`.str-chat`
`0 0 8px rgba(0, 0, 0, 0.15)`
| Box shadow applied to the component |
+| `--str-chat__autocomplete-active-background-color` |
`.str-chat`
`var(--str-chat__surface-color)`
| The background color of a selected autocomplete item |
+| `--str-chat__suggestion-list-container-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-xs)`
| The border radius used for the borders of the component (ReactSDK) |
+| `--str-chat__suggestion-list-container-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component (ReactSDK) |
+| `--str-chat__suggestion-list-container-background-color` |
`.str-chat`
`var( --str-chat__secondary-background-color )`
| The background color of the component (ReactSDK) |
+| `--str-chat__suggestion-list-container-border-block-start` |
`.str-chat`
`none`
| Top border of the component (ReactSDK) |
+| `--str-chat__suggestion-list-container-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component (ReactSDK) |
+| `--str-chat__suggestion-list-container-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component (ReactSDK) |
+| `--str-chat__suggestion-list-container-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component (ReactSDK) |
+| `--str-chat__suggestion-list-container-box-shadow` |
`.str-chat`
`0 0 8px rgba(0, 0, 0, 0.15)`
| Box shadow applied to the component (ReactSDK) |
+| `--str-chat__suggestion-list-item--selected-background-color` |
`.str-chat`
`var(--str-chat__surface-color)`
| The background color of a selected autocomplete item (ReactSDK) |
+| `--str-chat__slash-command-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-background-color` |
`.str-chat`
`transparent`
| The background color of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-border-block-start` |
`.str-chat`
`none`
| Top border of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-border-block-end` |
`.str-chat`
`none`
| Bottom border of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-box-shadow` |
`.str-chat`
`none`
| Box shadow of the slash command item in the autocomplete list |
+| `--str-chat__slash-command-args-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| Text color of the arguments of a slash command item in the autocomplete list |
+| `--str-chat__mention-list-user-item-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-background-color` |
`.str-chat`
`transparent`
| The background color of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-border-block-start` |
`.str-chat`
`none`
| Top border of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-border-block-end` |
`.str-chat`
`none`
| Bottom border of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-box-shadow` |
`.str-chat`
`none`
| Box shadow of the user mention item in the autocomplete list |
+| `--str-chat__mention-list-user-item-at-sign-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text color of the at sign inside a user mention itome in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the emoji suggestion item in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the emoji suggestion item in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-background-color` |
`.str-chat`
`transparent`
| The background color of the emoji suggestion item in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-border-block-start` |
`.str-chat`
`none`
| Top border of the emoji suggestion item in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-border-block-end` |
`.str-chat`
`none`
| Bottom border of the emoji suggestion item in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the emoji suggestion item in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the emoji suggestion item in the autocomplete list |
+| `--str-chat__mention-list-emoji-item-box-shadow` |
`.str-chat`
`none`
| Box shadow of the emoji suggestion item in the autocomplete list |
+
+Defined in: [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss)
+
+### Layout variables
+
+| Name | Value(s) | Description |
+| ------------------------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
+| `--str-chat__mention-list-emoji-item-font-family` |
`.str-chat`
`var(--str-chat__font-family)`
| The font used in the emoji suggestion item in the autocomplete list |
+
+Defined in: [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-layout.scss)
+
+## Avatar
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
+| `--str-chat__avatar-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-circle)`
| The border radius used for the borders of the component |
+| `--str-chat__avatar-color` |
`.str-chat`
`var(--str-chat__on-primary-color)`
| The text/icon color of the component |
+| `--str-chat__avatar-background-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The background color of the component |
+| `--str-chat__avatar-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__avatar-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__avatar-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__avatar-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__avatar-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__avatar-online-indicator-color` |
`.str-chat`
`var(--str-chat__info-color)`
| The color of the online indicator (only available in Angular SDK) |
+| `--str-chat__avatar-online-indicator-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-circle)`
| The border radius of the online indicator (only available in Angular SDK) |
+
+Defined in: [Avatar](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Avatar/Avatar-theme.scss)
+
+## Channel
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__channel-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the component |
+| `--str-chat__channel-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__channel-background-color` |
`.str-chat`
`var(--str-chat__background-color)`
| The background color of the component |
+| `--str-chat__channel-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__channel-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__channel-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__channel-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__channel-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__channel-empty-indicator-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| The icon color used when no channel is selected |
+| `--str-chat__channel-empty-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text color used when no channel is selected |
+| `--str-chat__channel-loading-state-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| The color of the loading indicator |
+
+Defined in: [Channel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Channel/Channel-theme.scss)
+
+## ChannelHeader
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
+| `--str-chat__channel-header-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the component |
+| `--str-chat__channel-header-color` |
`.str-chat`
`0`
| The text/icon color of the component |
+| `--str-chat__channel-header-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the component |
+| `--str-chat__channel-header-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__channel-header-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__channel-header-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__channel-header-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__channel-header-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__channel-header-info-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon color used to display member information about the channel |
+
+Defined in: [ChannelHeader](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelHeader/ChannelHeader-theme.scss)
+
+## ChannelList
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
+| `--str-chat__channel-list-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the component |
+| `--str-chat__channel-list-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__channel-list-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the component |
+| `--str-chat__channel-list-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__channel-list-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__channel-list-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__channel-list-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__channel-list-border-inline-end` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Right (left in RTL layout) border of the component |
+| `--str-chat__channel-list-load-more-border-radius` |
`.str-chat`
`var(--str-chat__cta-button-border-radius)`
| The border radius used for the borders of the load more button |
+| `--str-chat__channel-list-load-more-color` |
`.str-chat`
`var(--str-chat__cta-button-color)`
| The text/icon color of the load more button |
+| `--str-chat__channel-list-load-more-background-color` |
`.str-chat`
`var(--str-chat__cta-button-background-color)`
| The background color of the load more button |
+| `--str-chat__channel-list-load-more-box-shadow` |
`.str-chat`
`var(--str-chat__cta-button-box-shadow)`
| Box shadow applied to the load more button |
+| `--str-chat__channel-list-load-more-border-block-start` |
| Top border of the component |
+| `--str-chat__channel-search-result-list-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__channel-search-result-list-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__channel-search-result-list-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__channel-search-result-list-popup-box-shadow` |
`.str-chat`
`0 4px 4px var(--str-chat__box-shadow-color)`
| Box shadow applied to the component |
+| `--str-chat__channel-search-results-header-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The font color used in the search results header |
+| `--str-chat__channel-search-results-header-background-color` |
`.str-chat`
`var(--str-chat__background-color)`
| The background color used in the search results header |
+| `--str-chat__channel-search-results-header-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__channel-search-results-header-border-block-end` |
`.str-chat`
`var(--str-chat__surface-color) 1px solid`
| Bottom border of the component |
+| `--str-chat__channel-search-results-header-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__channel-search-results-header-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__channel-search-results-loading-indicator-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The font color used in the search results loading indicator |
+| `--str-chat__channel-search-results-loading-indicator-background-color` |
`.str-chat`
`var(--str-chat__background-color)`
| The background color used in the search results loading indicator |
+| `--str-chat__channel-search-results-loading-indicator-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__channel-search-results-loading-indicator-border-block-end` |
`.str-chat`
`var(--str-chat__surface-color) 1px solid`
| Bottom border of the component |
+| `--str-chat__channel-search-results-loading-indicator-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__channel-search-results-loading-indicator-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__channel-search-results-empty-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The font color used in the empty search results indicator |
+| `--str-chat__channel-search-results-empty-icon-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| The icon color used in the empty search results indicator |
+| `--str-chat__channel-search-results-empty-background-color` |
`.str-chat`
`var(--str-chat__background-color)`
| The background color used in the empty search results indicator |
+| `--str-chat__channel-search-results-empty-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__channel-search-results-empty-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__channel-search-results-empty-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__channel-search-results-empty-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+
+Defined in: [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss)
+
+## CircleFAButton
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__circle-fab-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-circle)`
| The border radius used for the borders of the component |
+| `--str-chat__circle-fab-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text/icon color of the component |
+| `--str-chat__circle-fab-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the component |
+| `--str-chat__circle-fab-pressed-background-color` |
`.str-chat`
`var(--str-chat__surface-color)`
| The background color of the component in pressed state |
+| `--str-chat__circle-fab-box-shadow` |
`.str-chat`
`0 2px 4px rgba(0, 0, 0, 0.25)`
| Box shadow applied to the component |
+| `--str-chat__circle-fab-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__circle-fab-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__circle-fab-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__circle-fab-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+
+Defined in: [CircleFAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CircleFAButton/CircleFAButton-theme.scss)
+
+## CTAButton
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__cta-button-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-xs)`
| The border radius used for the borders of the component |
+| `--str-chat__cta-button-color` |
`.str-chat`
`var(--str-chat__on-primary-color)`
| The text/icon color of the component |
+| `--str-chat__cta-button-background-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The background color of the component |
+| `--str-chat__cta-button-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__cta-button-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__cta-button-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__cta-button-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__cta-button-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__cta-button-pressed-background-color` |
`.str-chat`
`var(--str-chat__active-primary-color)`
| The background color of the component in pressed state |
+| `--str-chat__cta-button-disabled-background-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| The background color of the component in disabled state |
+| `--str-chat__cta-button-disabled-color` |
`.str-chat`
`var(--str-chat__on-disabled-color)`
| The text/icon color of the component in disabled state |
+
+Defined in: [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss)
+
+## EditMessageForm
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__edit-message-modal-button-border-radius` |
`.str-chat`
`none`
| The border radius used for the borders of the component |
+| `--str-chat__edit-message-modal-send-button-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text color used for the send button |
+| `--str-chat__edit-message-modal-cancel-button-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text color used for the cancel button |
+| `--str-chat__edit-message-modal-button-background-color` |
`.str-chat`
`transparent`
| The background color of the component |
+| `--str-chat__edit-message-modal-button-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__edit-message-modal-button-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__edit-message-modal-button-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__edit-message-modal-button-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__edit-message-modal-button-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+
+Defined in: [EditMessageForm](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/EditMessageForm/EditMessageForm-theme.scss)
+
+## ImageCarousel - Only available in Angular SDK
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ------------------------------------------ | ------------------------------------------------------------------------------------------- | ------------------------------ |
+| `--str-chat__image-carousel-stepper-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The color of the stepper icon. |
+
+Defined in: [ImageCarousel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ImageCarousel/ImageCarousel-theme.scss)
+
+## Message
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
+| `--str-chat__message-border-radius` |
`.str-chat`
`none`
| The border radius used for the borders of the component |
+| `--str-chat__message-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__message-error-message-color` |
`.str-chat`
`var(--str-chat__danger-color)`
| The text/icon color used for displaying error messages |
+| `--str-chat__message-secondary-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon color used for displaying items with less emphasis |
+| `--str-chat__message-link-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text color used for displaying links |
+| `--str-chat__message-mention-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text color used for displaying mentions |
+| `--str-chat__message-status-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text/icon color used for displaying message status |
+| `--str-chat__message-replies-count-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text color used for displaying the number of thread replies of a message |
+| `--str-chat__message-background-color` |
`.str-chat`
`transparent`
| The background color of the component |
+| `--str-chat__message-highlighted-background-color` |
`.str-chat`
`var(--str-chat__message-highlight-color)`
| The background color of a jumped-to message |
+| `--str-chat__message-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__message-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__message-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__message-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__message-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__message-active-bacground-color` |
`.str-chat`
`transparent`
| The background of the message component in active state |
+| `--str-chat__message-options-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The icon color used for displaying message options |
+| `--str-chat__message-options-hover-background-color` |
`.str-chat`
`var(--str-chat__tertiary-surface-color)`
| The icon color used for displaying message options if a message option is clicked |
+| `--str-chat__message-options-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-circle)`
| The border radius used for displaying message options |
+| `--str-chat__message-options-active-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The background color used if a message option is hovered |
+| `--str-chat__message-bubble-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-md)`
| The border radius used for the borders of the message bubble |
+| `--str-chat__message-bubble-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon of the message bubble |
+| `--str-chat__message-bubble-background-color` |
`.str-chat`
`var(--str-chat__secondary-surface-color)`
| The background of the message bubble |
+| `--str-chat__own-message-bubble-color` |
`.str-chat`
`var(--str-chat__message-bubble-color)`
| The text/icon of the message bubble, if the message was sent by the user |
+| `--str-chat__own-message-bubble-background-color` |
`.str-chat`
`var(--str-chat__primary-surface-color)`
| The background of the message bubble, if the message was sent by the user |
+| `--str-chat__quoted-message-bubble-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background of the message bubble, if it's a quoted message |
+| `--str-chat__message-bubble-border-block-start` |
`.str-chat`
`none`
| Top border of the message bubble |
+| `--str-chat__message-bubble-border-block-end` |
`.str-chat`
`none`
| Bottom border of the message bubble |
+| `--str-chat__message-bubble-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the message bubble |
+| `--str-chat__message-bubble-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the message bubble |
+| `--str-chat__message-bubble-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the message bubble |
+| `--str-chat__deleted-message-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-md)`
| The border radius used for the borders of a deleted message |
+| `--str-chat__deleted-message-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon of a deleted message |
+| `--str-chat__deleted-message-background-color` |
`.str-chat`
`var(--str-chat__secondary-surface-color)`
| The background of a deleted message |
+| `--str-chat__deleted-message-border-block-start` |
`.str-chat`
`none`
| Top border of a deleted message |
+| `--str-chat__deleted-message-border-block-end` |
`.str-chat`
`none`
| Bottom border of a deleted message |
+| `--str-chat__deleted-message-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of a deleted message |
+| `--str-chat__deleted-message-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of a deleted message |
+| `--str-chat__deleted-message-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to a deleted message |
+| `--str-chat__system-message-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of a system message |
+| `--str-chat__system-message-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon of a system message |
+| `--str-chat__system-message-background-color` |
`.str-chat`
`transparent`
| The background of a system message |
+| `--str-chat__system-message-border-block-start` |
`.str-chat`
`none`
| Top border of a system message |
+| `--str-chat__system-message-border-block-end` |
`.str-chat`
`none`
| Bottom border of a system message |
+| `--str-chat__system-message-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of a system message |
+| `--str-chat__system-message-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of a system message |
+| `--str-chat__system-message-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to a system message |
+| `--str-chat__date-separator-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| Text color in a date separator |
+| `--str-chat__date-separator-line-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| The line color applied to date separator |
+| `--str-chat__date-separator-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of a date separator |
+| `--str-chat__date-separator-background-color` |
`.str-chat`
`transparent`
| The background color of a date separator |
+| `--str-chat__date-separator-border-block-start` |
`.str-chat`
`none`
| Top border of a date separator |
+| `--str-chat__date-separator-border-block-end` |
`.str-chat`
`none`
| Bottom border of a date separator |
+| `--str-chat__date-separator-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of a date separator |
+| `--str-chat__date-separator-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of a date separator |
+| `--str-chat__date-separator-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to a date separator |
+| `--str-chat__translation-notice-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text color of the translation notice that is displayed if a message is translated with auto-translation |
+| `--str-chat__translation-notice-active-background-color` |
`.str-chat`
`var(--str-chat__tertiary-surface-color)`
| The hover color of the translation notice that is displayed if a message is translated with auto-translation |
+
+Defined in: [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss)
+
+### Layout variables
+
+| Name | Value(s) | Description |
+| ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| `--str-chat__message-options-button-size` |
`.str-chat`
`calc(var(--str-chat__spacing-px) * 26)`
| The width/height of the message options buttons |
+| `--str-chat__message-max-width` |
| The border radius of the component |
+| `--str-chat__message-input-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__message-input-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the component |
+| `--str-chat__message-input-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__message-input-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__message-input-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__message-input-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__message-input-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__dropzone-container-color` |
`.str-chat`
`var(--str-chat__on-primary-color)`
| The text/icon color of the dropzone container |
+| `--str-chat__dropzone-container-background-color` |
`.str-chat`
`var(--str-chat__primary-overlay-color)`
| The background color of the dropzone container |
+| `--str-chat__message-textarea-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-md)`
| The border radius used for the borders of the textarea |
+| `--str-chat__message-textarea-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the textarea |
+| `--str-chat__message-textarea-background-color` |
`.str-chat`
`transparent`
| The background color of the textarea |
+| `--str-chat__message-textarea-border-block-start` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Top border of the textarea |
+| `--str-chat__message-textarea-border-block-end` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Bottom border of the textarea |
+| `--str-chat__message-textarea-border-inline-start` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Left (right in RTL layout) border of the textarea |
+| `--str-chat__message-textarea-border-inline-end` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Right (left in RTL layout) border of the textarea |
+| `--str-chat__message-textarea-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the textarea |
+| `--str-chat__message-send-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-circle)`
| The border radius used for the borders of the send button |
+| `--str-chat__message-send-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The text/icon color of the send button |
+| `--str-chat__message-send-background-color` |
`.str-chat`
`transparent`
| The background color of the send button |
+| `--str-chat__message-send-border-block-start` |
`.str-chat`
`0`
| Top border of the send button |
+| `--str-chat__message-send-border-block-end` |
`.str-chat`
`0`
| Bottom border of the send button |
+| `--str-chat__message-send-border-inline-start` |
`.str-chat`
`0`
| Left (right in RTL layout) border of the send button |
+| `--str-chat__message-send-border-inline-end` |
`.str-chat`
`0`
| Right (left in RTL layout) border of the send button |
+| `--str-chat__message-send-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the send button |
+| `--str-chat__message-send-disabled-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| The color of the send button in disabled state |
+| `--str-chat__message-send-disabled-background-color` |
`.str-chat`
`transparent`
| The background color of the send button in disabled state |
+| `--str-chat__message-input-tools-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-circle)`
| The border radius used for the borders of the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-tools-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon color of the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-tools-background-color` |
`.str-chat`
`transparent`
| The background color of the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-tools-border-block-start` |
`.str-chat`
`0`
| Top border of the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-tools-border-block-end` |
`.str-chat`
`0`
| Bottom border of the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-tools-border-inline-start` |
`.str-chat`
`0`
| Left (right in RTL layout) border of the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-tools-border-inline-end` |
`.str-chat`
`0`
| Right (left in RTL layout) border of the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-tools-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the tool buttons of the message input (such as attachment upload button) |
+| `--str-chat__message-input-not-allowed-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| Thex text color of the message that is displayed when the use can't send messages |
+| `--str-chat__cooldown-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-circle)`
| The border radius used for the borders of the cooldown timer |
+| `--str-chat__cooldown-color` |
`.str-chat`
`var(--str-chat__on-disabled-color)`
| The text/icon color of the cooldown timer |
+| `--str-chat__cooldown-background-color` |
`.str-chat`
`var(--str-chat__disabled-color)`
| The background color of the cooldown timer |
+| `--str-chat__cooldown-border-block-start` |
`.str-chat`
`0`
| Top border of the cooldown timer |
+| `--str-chat__cooldown-border-block-end` |
`.str-chat`
`0`
| Bottom border of the cooldown timer |
+| `--str-chat__cooldown-border-inline-start` |
`.str-chat`
`0`
| Left (right in RTL layout) border of the cooldown timer |
+| `--str-chat__cooldown-border-inline-end` |
`.str-chat`
`0`
| Right (left in RTL layout) border of the cooldown timer |
+| `--str-chat__cooldown-box-shadow` |
| Left (right in RTL layout) border of the jump to latest message button |
+| `--str-chat__jump-to-latest-message-border-inline-end` |
`.str-chat`
`var( --str-chat__circle-fab-border-inline-end )`
| Right (left in RTL layout) border of the jump to latest message button |
+| `--str-chat__jump-to-latest-message-unread-count-background-color` |
`.str-chat`
`var( --str-chat__jump-to-latest-message-color )`
| The background color of the unread messages count on the jump to latest message button |
+| `--str-chat__jump-to-latest-message-unread-count-color` |
| The text/icon color of the unread messages count on the jump to latest message button |
+| `--str-chat__thread-head-start-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The color used for displaying thread replies and thread separator at the start of a thread |
+| `--str-chat__thread-head-start-border-block-end-color` |
`.str-chat`
`var(--str-chat__surface-color)`
| The color used for the separator below the first message in a thread |
+
+Defined in: [MessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageList/MessageList-theme.scss)
+
+## VirtualizedMessageList - Only available in React SDK
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ---------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__virtual-list-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the component |
+| `--str-chat__virtual-list-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__virtual-list-background-color` |
`.str-chat`
`var(--str-chat__background-color)`
| The background color of the component |
+| `--str-chat__virtual-list-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__virtual-list-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__virtual-list-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__virtual-list-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__virtual-list-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+
+Defined in: [VirtualizedMessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/VirtualizedMessageList/VirtualizedMessageList-theme.scss)
+
+## MessageReactions
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
+| `--str-chat__message-reactions-border-radius` |
`.str-chat`
`none`
| The border radius used for the borders of the component |
+| `--str-chat__message-reactions-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__message-reactions-background-color` |
`.str-chat`
`transparent`
| The background color of the component |
+| `--str-chat__message-reactions-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__message-reactions-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__message-reactions-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__message-reactions-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__message-reactions-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__message-reaction-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-xs)`
| The border radius used for the borders of a message reaction |
+| `--str-chat__message-reaction-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of a message reaction |
+| `--str-chat__message-reaction-background-color` |
`.str-chat`
`var(--str-chat__tertiary-surface-color)`
| The background color of a message reaction |
+| `--str-chat__message-reaction-border-block-start` |
`.str-chat`
`none`
| Top border of a message reaction |
+| `--str-chat__message-reaction-border-block-end` |
`.str-chat`
`none`
| Bottom border of a message reaction |
+| `--str-chat__message-reaction-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of a message reaction |
+| `--str-chat__message-reaction-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of a message reaction |
+| `--str-chat__message-reaction-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to a message reaction |
+| `--str-chat__own-message-reaction-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of a message reaction, if the user reacted with that reaction |
+| `--str-chat__own-message-reaction-background-color` |
| The border radius used for the borders of the content area of the component of the content area of the component |
+| `--str-chat__modal-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the content area of the component |
+| `--str-chat__modal-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the content area of the component |
+| `--str-chat__modal-overlay-color` |
`.str-chat`
`var(--str-chat__secondary-overlay-color)`
| The overlay color of the component |
+| `--str-chat__modal-overlay-backdrop-filter` |
`.str-chat`
`blur(3px)`
| The backdrop filter applied to the component |
+| `--str-chat__modal-border-block-start` |
`.str-chat`
`none`
| Top border of the content area of the component |
+| `--str-chat__modal-border-block-end` |
`.str-chat`
`none`
| Bottom border of the content area of the component |
+| `--str-chat__modal-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the content area of the component |
+| `--str-chat__modal-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the content area of the component |
+| `--str-chat__modal-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the content area of the component |
+| `--str-chat__modal-close-icon-background` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The background color of the close button |
+| `--str-chat__modal-close-icon-color` |
`.str-chat`
`var(--str-chat__on-disabled-color)`
| The icon color of the close button |
+
+Defined in: [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss)
+
+## MessageNotification - Only available in React SDK
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__message-notification-background-color` |
`.str-chat`
`var(--str-chat__primary-color)`
| The background color of the component |
+| `--str-chat__message-notification-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__message-notification-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__message-notification-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__message-notification-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__message-notification-border-radius` |
`.str-chat`
`50px`
| The border radius used for the borders of the component |
+| `--str-chat__message-notification-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__message-notification-color` |
`.str-chat`
`var(--str-chat__on-primary-color)`
| The text/icon color of the component |
+
+Defined in: [MessageNotification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageNotification/MessageNotification-theme.scss)
+
+## Notification
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__notification-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-sm)`
| The border radius used for the borders of the component |
+| `--str-chat__notification-color` |
`.str-chat`
`var(--str-chat__opaque-surface-text-color)`
| The text/icon color of the component |
+| `--str-chat__notification-background-color` |
| The border radius used for the borders of the component |
+| `--str-chat__thread-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__thread-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the component |
+| `--str-chat__thread-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__thread-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__thread-border-inline-start` |
`.str-chat`
`1px solid var(--str-chat__surface-color)`
| Left (right in RTL layout) border of the component |
+| `--str-chat__thread-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__thread-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__thread-header-border-radius` |
`.str-chat`
`0`
| The border radius used for the borders of the thread header |
+| `--str-chat__thread-header-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the thread header |
+| `--str-chat__thread-header-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the thread header |
+| `--str-chat__thread-header-border-block-start` |
`.str-chat`
`none`
| Top border of the thread header |
+| `--str-chat__thread-header-border-block-end` |
`.str-chat`
`none`
| Bottom border of the thread header |
+| `--str-chat__thread-header-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the thread header |
+| `--str-chat__thread-header-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the thread header |
+| `--str-chat__thread-header-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the thread header |
+| `--str-chat__thread-header-info-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon color used to display less emphasized text in the channel header |
+
+Defined in: [Thread](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Thread/Thread-theme.scss)
+
+## Tooltip
+
+### Theme variables
+
+| Name | Value(s) | Description |
+| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| `--str-chat__tooltip-border-radius` |
`.str-chat`
`var(--str-chat__border-radius-xs)`
| The border radius used for the borders of the component |
+| `--str-chat__tooltip-color` |
`.str-chat`
`var(--str-chat__text-color)`
| The text/icon color of the component |
+| `--str-chat__tooltip-background-color` |
`.str-chat`
`var(--str-chat__secondary-background-color)`
| The background color of the component |
+| `--str-chat__tooltip-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__tooltip-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__tooltip-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__tooltip-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__tooltip-box-shadow` |
| The border radius used for the borders of the component |
+| `--str-chat__typing-indicator-color` |
`.str-chat`
`var(--str-chat__text-low-emphasis-color)`
| The text/icon color of the component |
+| `--str-chat__typing-indicator-background-color` |
`.str-chat`
`var(--str-chat__overlay-color)`
| The background color of the component |
+| `--str-chat__typing-indicator-border-block-start` |
`.str-chat`
`none`
| Top border of the component |
+| `--str-chat__typing-indicator-border-block-end` |
`.str-chat`
`none`
| Bottom border of the component |
+| `--str-chat__typing-indicator-border-inline-start` |
`.str-chat`
`none`
| Left (right in RTL layout) border of the component |
+| `--str-chat__typing-indicator-border-inline-end` |
`.str-chat`
`none`
| Right (left in RTL layout) border of the component |
+| `--str-chat__typing-indicator-box-shadow` |
`.str-chat`
`none`
| Box shadow applied to the component |
+| `--str-chat__typing-indicator-dot-background-color` |
`.str-chat`
`var(--str-chat__text-color)`
| Background color of the animated dots in the typing indicator |
+
+Defined in: [TypingIndicator](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/TypingIndicator/TypingIndicator-theme.scss)
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/theming/global-variables.mdx b/docusaurus/react_versioned_docs/version-11.x.x/theming/global-variables.mdx
new file mode 100644
index 0000000000..883a28a07c
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/theming/global-variables.mdx
@@ -0,0 +1,137 @@
+---
+id: global-variables
+sidebar_position: 2
+title: Global variables
+keywords: [v2, theme-v2, theming-v2, theming, global variables]
+---
+
+import SDKSpecific from './SDKSpecific';
+import V2Warning from './V2Warning';
+
+:::info
+
+
+
+
+
+
+
+
+:::
+
+CSS variables are the easiest way to customize the theme. The variables are organized into two layers:
+
+- Global
+- Component
+
+This page contains information about the global variables.
+
+Global variables can be grouped into the following categories:
+
+- Theme: colors, typography and border radiuses
+- Layout: spacing (padding and margin) and sizing
+
+You can read about each category in detail in the tables below.
+
+## Theme variables
+
+### Colors
+
+| Name | Value(s) | Description | Used in |
+| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--str-chat__primary-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__blue500)`
`.str-chat__theme-dark`
`var(--str-chat__blue400)`
| Used for emphasis, brands can inject their main color using this variable | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss), [Avatar](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Avatar/Avatar-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [CircleFAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CircleFAButton/CircleFAButton-theme.scss), [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss), [EditMessageForm](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/EditMessageForm/EditMessageForm-theme.scss), [LinkPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/LinkPreview/LinkPreview-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageBounceOptions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageBounceOptions/MessageBounceOptions-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageReactions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactions/MessageReactions-theme.scss), [MessageNotification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageNotification/MessageNotification-theme.scss) |
+| `--str-chat__primary-overlay-color` |
`.str-chat,.str-chat__theme-light`
`rgba(0, 95, 255, 0.6)`
`.str-chat__theme-dark`
`rgba(51, 126, 255, 0.6)`
| Used for emphasised overlays - color of --str-chat\_\_primary-color with alpha channel | [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss) |
+| `--str-chat__primary-color-low-emphasis` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__blue300)`
`.str-chat__theme-dark`
`var(--str-chat__blue700)`
| Used for emphasis, brands can inject their main color using this variable, it has less emphasis than primary color | [MessageReactionsSelector](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactionsSelector/MessageReactionsSelector-theme.scss) |
+| `--str-chat__active-primary-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__blue600)`
`.str-chat__theme-dark`
`var(--str-chat__blue600)`
| Used to indicate that a UI element with primary color is in an active state | [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss) |
+| `--str-chat__on-primary-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey50)`
`.str-chat__theme-dark`
`var(--str-chat__grey50)`
| If the primary color is used as a background, text/icons are displayed in this color | [Avatar](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Avatar/Avatar-theme.scss), [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageNotification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageNotification/MessageNotification-theme.scss) |
+| `--str-chat__background-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey50)`
`.str-chat__theme-dark`
`var(--str-chat__grey950)`
| Used as a background color for the main chat UI components | [Channel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Channel/Channel-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [MessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageList/MessageList-theme.scss), [VirtualizedMessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/VirtualizedMessageList/VirtualizedMessageList-theme.scss) |
+| `--str-chat__secondary-background-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey50)`
`.str-chat__theme-dark`
`var(--str-chat__grey900)`
| Used as a background color for the main chat UI components | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss), [ChannelHeader](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelHeader/ChannelHeader-theme.scss), [ChannelList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelList/ChannelList-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [CircleFAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CircleFAButton/CircleFAButton-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageActionsBox](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageActionsBox/MessageActionsBox-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageReactionsSelector](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactionsSelector/MessageReactionsSelector-theme.scss), [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss), [Thread](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Thread/Thread-theme.scss), [Tooltip](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Tooltip/Tooltip-theme.scss) |
+| `--str-chat__primary-surface-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__blue100)`
`.str-chat__theme-dark`
`var(--str-chat__blue900)`
| Used as a background color to give emphasis, but less vibrant than the primary color | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageReactionsSelector](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactionsSelector/MessageReactionsSelector-theme.scss) |
+| `--str-chat__primary-surface-color-low-emphasis` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__blue50)`
`.str-chat__theme-dark`
`var(--str-chat__blue950)`
| Used as a background color to give emphasis, but less vibrant than the primary surface color | [MessageReactions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactions/MessageReactions-theme.scss) |
+| `--str-chat__surface-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey300)`
`.str-chat__theme-dark`
`var(--str-chat__grey700)`
| A neutral color used to give emphasis to different surfaces | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss), [ChannelList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelList/ChannelList-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [CircleFAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CircleFAButton/CircleFAButton-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageList/MessageList-theme.scss), [Thread](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Thread/Thread-theme.scss) |
+| `--str-chat__secondary-surface-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey200)`
`.str-chat__theme-dark`
`var(--str-chat__grey800)`
| A neutral color used to give emphasis to different surfaces | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [BaseImage](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/BaseImage/BaseImage-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageActionsBox](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageActionsBox/MessageActionsBox-theme.scss) |
+| `--str-chat__tertiary-surface-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey100)`
`.str-chat__theme-dark`
`var(--str-chat__grey900)`
| A neutral color used to give emphasis to different surfaces | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageReactions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactions/MessageReactions-theme.scss) |
+| `--str-chat__text-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey950)`
`.str-chat__theme-dark`
`var(--str-chat__grey50)`
| The main color used for texts/icons | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss), [BaseImage](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/BaseImage/BaseImage-theme.scss), [Channel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Channel/Channel-theme.scss), [ChannelList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelList/ChannelList-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [ImageCarousel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ImageCarousel/ImageCarousel-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageActionsBox](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageActionsBox/MessageActionsBox-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageList/MessageList-theme.scss), [VirtualizedMessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/VirtualizedMessageList/VirtualizedMessageList-theme.scss), [MessageReactions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactions/MessageReactions-theme.scss), [MessageReactionsSelector](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactionsSelector/MessageReactionsSelector-theme.scss), [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss), [Thread](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Thread/Thread-theme.scss), [Tooltip](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Tooltip/Tooltip-theme.scss), [TypingIndicator](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/TypingIndicator/TypingIndicator-theme.scss) |
+| `--str-chat__text-low-emphasis-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey500)`
`.str-chat__theme-dark`
`var(--str-chat__grey500)`
| Used for texts/icons that need less emphasis | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss), [Channel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Channel/Channel-theme.scss), [ChannelHeader](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelHeader/ChannelHeader-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [EditMessageForm](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/EditMessageForm/EditMessageForm-theme.scss), [LinkPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/LinkPreview/LinkPreview-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageList/MessageList-theme.scss), [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss), [Thread](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Thread/Thread-theme.scss), [TypingIndicator](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/TypingIndicator/TypingIndicator-theme.scss) |
+| `--str-chat__disabled-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey400)`
`.str-chat__theme-dark`
`var(--str-chat__grey600)`
| Used for displaying disabled UI elements (typically buttons) | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [BaseImage](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/BaseImage/BaseImage-theme.scss), [Channel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Channel/Channel-theme.scss), [ChannelList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelList/ChannelList-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss) |
+| `--str-chat__on-disabled-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey50)`
`.str-chat__theme-dark`
`var(--str-chat__grey50)`
| Used for text/icon colors if disabled color is used as a background color | [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss) |
+| `--str-chat__danger-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__red400)`
`.str-chat__theme-dark`
`var(--str-chat__red600)`
| Used for error messages, and destructive actions | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss) |
+| `--str-chat__message-highlight-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__yellow100)`
`.str-chat__theme-dark`
`var(--str-chat__yellow900)`
| The background color used to highlight a message when jumping to a message. Only available in React SDK. | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss) |
+| `--str-chat__unread-badge-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__red400)`
`.str-chat__theme-dark`
`var(--str-chat__red400)`
| Used for displaying the unread badge | [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss) |
+| `--str-chat__on-unread-badge-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey50)`
`.str-chat__theme-dark`
`var(--str-chat__grey50)`
| Used for text/icon colors if unread badge color is used as a background color | [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss) |
+| `--str-chat__overlay-color` |
`.str-chat,.str-chat__theme-light`
`rgba(252, 252, 252, 0.9)`
`.str-chat__theme-dark`
`rgba(0, 0, 0, 0.7)`
| The background color used for overlays | [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [TypingIndicator](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/TypingIndicator/TypingIndicator-theme.scss) |
+| `--str-chat__secondary-overlay-color` |
`.str-chat,.str-chat__theme-light`
`rgba(0, 0, 0, 0.2)`
`.str-chat__theme-dark`
`rgba(0, 0, 0, 0.4)`
| The background color used for subtle overlays | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss) |
+| `--str-chat__secondary-overlay-text-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey50)`
`.str-chat__theme-dark`
`var(--str-chat__grey50)`
| The text/icon color used on subtle overlays | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss) |
+| `--str-chat__opaque-surface-background-color` |
`.str-chat,.str-chat__theme-light`
`rgba(0, 0, 0, 0.8)`
`.str-chat__theme-dark`
`rgba(250, 250, 250, 0.85)`
| The background color used for opaque surfaces | [Notification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Notification/Notification-theme.scss) |
+| `--str-chat__opaque-surface-text-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__grey50)`
`.str-chat__theme-dark`
`var(--str-chat__grey900)`
| The text color used on opaque surfaces | [Notification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Notification/Notification-theme.scss) |
+| `--str-chat__box-shadow-color` |
`.str-chat,.str-chat__theme-light`
`rgba(0, 0, 0, 0.18)`
`.str-chat__theme-dark`
`rgba(0, 0, 0, 0.8)`
| If a component has a box shadow applied to it, this will be the color used for the shadow | [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [MessageActionsBox](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageActionsBox/MessageActionsBox-theme.scss), [MessageReactionsSelector](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactionsSelector/MessageReactionsSelector-theme.scss), [Notification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Notification/Notification-theme.scss), [Tooltip](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Tooltip/Tooltip-theme.scss) |
+| `--str-chat__info-color` |
`.str-chat,.str-chat__theme-light`
`var(--str-chat__green500)`
`.str-chat__theme-dark`
`var(--str-chat__green500)`
| Used for online indicator and success messages | [Avatar](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Avatar/Avatar-theme.scss) |
+
+### Typography
+
+| Name | Value(s) | Description | Used in |
+| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--str-chat__font-family` |
| The font used in the chat, by default, we use [preinstalled OS fonts](https://systemfontstack.com/) | [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss) |
+| `--str-chat__caption-text` |
`.str-chat`
`0.75 rem/1rem var(--str-chat__font-family)`
| The font used for caption texts | [LinkPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/LinkPreview/LinkPreview-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageList/MessageList-theme.scss), [MessageReactions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactions/MessageReactions-theme.scss), [MessageNotification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageNotification/MessageNotification-theme.scss), [Tooltip](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Tooltip/Tooltip-theme.scss) |
+| `--str-chat__caption-medium-text` |
`.str-chat`
`500 0.75 rem/1rem var(--str-chat__font-family)`
| The font used for caption texts with emphasize | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss) |
+| `--str-chat__caption-strong-text` |
`.str-chat`
`700 0.75 rem/1rem var(--str-chat__font-family)`
| The font used for caption texts with emphasize | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss) |
+| `--str-chat__body-text` |
`.str-chat`
`0.875 rem/1rem var(--str-chat__font-family)`
| The font used for body texts | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [ChannelHeader](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelHeader/ChannelHeader-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [Thread](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Thread/Thread-theme.scss) |
+| `--str-chat__body-medium-text` |
`.str-chat`
`500 0.875 rem/1rem var(--str-chat__font-family)`
| The font used for body texts with emphasize | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [EditMessageForm](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/EditMessageForm/EditMessageForm-theme.scss), [LinkPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/LinkPreview/LinkPreview-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageBounceOptions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageBounceOptions/MessageBounceOptions-theme.scss) |
+| `--str-chat__body2-text` |
`.str-chat`
`0.9375 rem/1rem var(--str-chat__font-family)`
| The font used for body texts | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss) |
+| `--str-chat__body2-medium-text` |
| The font used for body texts with emphasize | [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss) |
+| `--str-chat__subtitle-text` |
`.str-chat`
`1 rem/1.25rem var(--str-chat__font-family)`
| The font used for subtitle texts | [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss), [MessageActionsBox](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageActionsBox/MessageActionsBox-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageList/MessageList-theme.scss), [VirtualizedMessageList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/VirtualizedMessageList/VirtualizedMessageList-theme.scss), [MessageReactions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactions/MessageReactions-theme.scss), [Notification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Notification/Notification-theme.scss) |
+| `--str-chat__subtitle-medium-text` |
`.str-chat`
`500 1 rem/1.25rem var(--str-chat__font-family)`
| The font used for subtitle texts with emphasize | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [ChannelHeader](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelHeader/ChannelHeader-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [Thread](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Thread/Thread-theme.scss) |
+| `--str-chat__subtitle2-text` |
`.str-chat`
`1.25 rem/1.5rem var(--str-chat__font-family)`
| The font used for subtitle texts | [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss) |
+| `--str-chat__subtitle2-medium-text` |
| The font used for subtitle texts with emphasize | [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss) |
+| `--str-chat__headline-text` |
`.str-chat`
`1.5 rem/1.5rem var(--str-chat__font-family)`
| The font used for headline texts | [Channel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Channel/Channel-theme.scss), [ChannelList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelList/ChannelList-theme.scss) |
+| `--str-chat__headline2-text` |
`.str-chat`
`1.8 rem/1.8rem var(--str-chat__font-family)`
| The font used for headline texts | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss) |
+
+### Radius
+
+| Name | Value(s) | Description | Used in |
+| ---------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--str-chat__border-radius-xs` |
`.str-chat`
`8px`
| Border radius used for slightly rounded elements | [Autocomplete](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Autocomplete/Autocomplete-theme.scss), [Channel](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Channel/Channel-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [CTAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CTAButton/CTAButton-theme.scss), [MessageReactions](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactions/MessageReactions-theme.scss), [Tooltip](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Tooltip/Tooltip-theme.scss) |
+| `--str-chat__border-radius-sm` |
`.str-chat`
`14px`
| Border radius used for slightly rounded elements | [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [MessageActionsBox](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageActionsBox/MessageActionsBox-theme.scss), [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss), [Notification](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Notification/Notification-theme.scss) |
+| `--str-chat__border-radius-md` |
`.str-chat`
`18px`
| Border radius used for rounded elements | [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageReactionsSelector](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactionsSelector/MessageReactionsSelector-theme.scss) |
+| `--str-chat__border-radius-lg` |
`.str-chat`
`20px`
| Border radius used for rounded elements | [ChannelSearch](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelSearch/ChannelSearch-theme.scss) |
+| `--str-chat__border-radius-circle` |
`.str-chat`
`999px`
| Border radius used for circular elements | [AttachmentList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentList/AttachmentList-theme.scss), [AttachmentPreviewList](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/AttachmentPreviewList/AttachmentPreviewList-theme.scss), [Avatar](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Avatar/Avatar-theme.scss), [ChannelPreview](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/ChannelPreview/ChannelPreview-theme.scss), [CircleFAButton](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/CircleFAButton/CircleFAButton-theme.scss), [Message](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Message/Message-theme.scss), [MessageInput](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageInput/MessageInput-theme.scss), [MessageReactionsSelector](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/MessageReactionsSelector/MessageReactionsSelector-theme.scss), [Modal](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/Modal/Modal-theme.scss) |
+
+All global theme variables are defined in: [https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/\_global-theme-variables.scss](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/_global-theme-variables.scss)
+
+
+## Layout variables
+
+### Spacing
+
+| Name | Value(s) | Description |
+| ------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- |
+| `--str-chat__spacing-px` |
`.str-chat`
`1px`
| Used for elements where sizing is necessary (such as icons, avatar), you can use this variable to scale those elements |
+| `--str-chat__spacing-0_5` |
`.str-chat`
`0.125rem`
| Used for margins and paddings |
+| `--str-chat__spacing-1` |
`.str-chat`
`0.25rem`
| Used for margins and paddings |
+| `--str-chat__spacing-1_5` |
`.str-chat`
`0.375rem`
| Used for margins and paddings |
+| `--str-chat__spacing-2` |
`.str-chat`
`0.5rem`
| Used for margins and paddings |
+| `--str-chat__spacing-2_5` |
`.str-chat`
`0.625rem`
| Used for margins and paddings |
+| `--str-chat__spacing-3` |
`.str-chat`
`0.75rem`
| Used for margins and paddings |
+| `--str-chat__spacing-3_5` |
`.str-chat`
`0.875rem`
| Used for margins and paddings |
+| `--str-chat__spacing-4` |
`.str-chat`
`1rem`
| Used for margins and paddings |
+| `--str-chat__spacing-5` |
`.str-chat`
`1.25rem`
| Used for margins and paddings |
+| `--str-chat__spacing-6` |
`.str-chat`
`1.5rem`
| Used for margins and paddings |
+| `--str-chat__spacing-7` |
`.str-chat`
`1.75rem`
| Used for margins and paddings |
+| `--str-chat__spacing-8` |
`.str-chat`
`2rem`
| Used for margins and paddings |
+| `--str-chat__spacing-9` |
`.str-chat`
`2.25rem`
| Used for margins and paddings |
+| `--str-chat__spacing-10` |
`.str-chat`
`2.5rem`
| Used for margins and paddings |
+| `--str-chat__spacing-11` |
`.str-chat`
`2.75rem`
| Used for margins and paddings |
+| `--str-chat__spacing-12` |
`.str-chat`
`3rem`
| Used for margins and paddings |
+| `--str-chat__spacing-14` |
`.str-chat`
`3.5rem`
| Used for margins and paddings |
+| `--str-chat__spacing-16` |
`.str-chat`
`4rem`
| Used for margins and paddings |
+
+### Others
+
+| Name | Value(s) | Description |
+| --------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- |
+| `--str-chat__theme-version` |
`:root`
`2`
| The theme version being used, 1 or 2. Used internally by SDKs |
+
+All global layout variables are defined in: [https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/\_global-layout-variables.scss](https://github.com/GetStream/stream-chat-css/tree/v4.6.1/src/v2/styles/_global-layout-variables.scss)
+
+
+If you find that these variables are too high-level and you need more granular control, you also have the option to provide [component layer overrides](./component-variables.mdx).
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/theming/introduction.mdx b/docusaurus/react_versioned_docs/version-11.x.x/theming/introduction.mdx
new file mode 100644
index 0000000000..1891bf049e
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/theming/introduction.mdx
@@ -0,0 +1,599 @@
+---
+id: themingv2
+sidebar_position: 1
+title: Introduction
+keywords: [v2, theme-v2, theming-v2, theming, introduction]
+---
+
+import SDKSpecific from './SDKSpecific';
+import ChatUiScreenshot from '../assets/stream-chat-css-chat-ui-screenshot.png';
+import DarkUiScreenshot from '../assets/stream-chat-css-dark-ui-screenshot.png';
+import CustomDarkUiScreenshot from '../assets/stream-chat-css-custom-dark-theme-screenshot.png';
+import ChatUiThemeCustomizationScreenshot from '../assets/stream-chat-css-chat-ui-theme-customization-screenshot.png';
+import ChatUiLayoutScreenshot from '../assets/stream-chat-css-chat-ui-layout-screenshot.png';
+import CustomAvatarColorScreenshot from '../assets/stream-chat-css-custom-avatar-color-screenshot.png';
+import MessageScreenshot from '../assets/stream-chat-css-message-color-screenshot.png';
+import MessageCustomColorScreenshot from '../assets/stream-chat-css-message-color-customization-screenshot.png';
+import MessageCustomColor2Screenshot from '../assets/stream-chat-css-message-color-customization2-screenshot.png';
+import ChatUiSquareThemeScreenshot from '../assets/stream-chat-css-square-theme-screenshot.png';
+import ChatUiRtlScreenshot from '../assets/stream-chat-css-rtl-layout-screenshot.png';
+
+
+
+The SDK has a new theming and customization system. This page contains information about the new version (refered to as version 2 or v2). The most significant improvements of the new version:
+
+- Refreshed design
+- Better customization through CSS variables
+- Support for RTL layout
+
+The [old theme](../customization/css-and-theming.mdx) (also refered to as version 1 or v1) can still be used with the latest SDK versions, but it's now deprecated, won't be receiving further updates and will be removed in a future major release.
+
+
+
+
+
+New theming system (v2) utilises updated markup and new class names in certain components which are being rendered based on which of the two systems you use. Most of the new components (and/or markup) aren't available in the old version (v1) due to compatibility reasons.
+
+To use the new theme, please upgrade [`stream-chat-react`](https://www.npmjs.com/package/stream-chat-react) to version `10.0.2` and follow the instructions below.
+
+
+
+## Importing the stylesheet
+
+If you're using SCSS:
+
+
+
+```scss
+// stream-chat-angular@5
+@import 'stream-chat-angular/src/assets/styles/scss/index.scss';
+
+// stream-chat-angular@4
+@import 'stream-chat-angular/src/assets/styles/v2/scss/index.scss';
+```
+
+
+
+
+
+```scss
+@import '~stream-chat-react/dist/scss/v2/index.scss';
+```
+
+
+
+If you're using CSS:
+
+
+
+```css
+// stream-chat-angular@5
+@import 'stream-chat-angular/src/assets/styles/css/index.css';
+
+// stream-chat-angular@4
+@import 'stream-chat-angular/src/assets/styles/v2/css/index.css';
+```
+
+
+
+
+
+```css
+@import '~stream-chat-react/dist/css/v2/index.css';
+```
+
+
+
+## Customization
+
+Our theming system has various customization options allowing for both smaller and large-scale UI changes. This document guides you through the different customization options.
+
+### CSS variables
+
+CSS variables are the easiest way to customize the theme. The variables are organized into two layers:
+
+- global
+- component
+
+#### Global variables
+
+You can use global variables to apply changes to the whole chat UI (as opposed to changing the design of individual components).
+
+The [full list of global variables](./global-variables.mdx) can be found in our global variables guide.
+
+Here is the default chat UI:
+
+
+
+Here is how you can customize global variables:
+
+
+
+```scss
+@import '~stream-chat-react/dist/scss/v2/index.scss';
+```
+
+
+
+```scss
+.str-chat {
+ --str-chat__primary-color: #009688;
+ --str-chat__active-primary-color: #004d40;
+ --str-chat__surface-color: #f5f5f5;
+ --str-chat__secondary-surface-color: #fafafa;
+ --str-chat__primary-surface-color: #e0f2f1;
+ --str-chat__primary-surface-color-low-emphasis: #edf7f7;
+ --str-chat__border-radius-circle: 6px;
+}
+```
+
+Here is the result:
+
+
+
+
+
+:::note
+The `str-chat` class is applied to the [channel list](../components/ChannelListComponent.mdx) and [channel](../components/ChannelComponent.mdx) component, all CSS variables are declared on this level, if you don't use those components in your chat application you'll have apply this class manually.
+:::
+
+
+
+
+
+:::note
+The `str-chat` class is applied to the [`ChannelList`](../core-components/channel-list.mdx) and [`Channel`](../core-components/channel.mdx) components, all CSS variables are declared on this level.
+:::
+
+
+
+#### Component variables
+
+You can use component layer variables to change the design of individual components. The [full list of component variables](./component-variables.mdx) can be found in our component variables guide.
+
+In the above example we set the avatar background color by setting the `--str-chat__primary-color` variable which also sets the color of other UI elements. If we want to change the background color only for the avatar component we can use the `--str-chat__avatar-background-color` variable:
+
+```scss
+.str-chat {
+ --str-chat__primary-color: #009688;
+ --str-chat__active-primary-color: #004d40;
+ --str-chat__surface-color: #f5f5f5;
+ --str-chat__secondary-surface-color: #fafafa;
+ --str-chat__primary-surface-color: #e0f2f1;
+ --str-chat__primary-surface-color-low-emphasis: #edf7f7;
+ --str-chat__border-radius-circle: 6px;
+ --str-chat__avatar-background-color: #bf360c; // Only changes the background color of the avatar component
+}
+```
+
+Here is the result:
+
+
+
+Component variables don't inherit. Let's see an example of this.
+
+Here is the message component without custom color:
+
+
+
+Setting custom text color inside message bubble:
+
+```scss
+.str-chat {
+ --str-chat__primary-color: #009688;
+ --str-chat__active-primary-color: #004d40;
+ --str-chat__surface-color: #f5f5f5;
+ --str-chat__secondary-surface-color: #fafafa;
+ --str-chat__primary-surface-color: #e0f2f1;
+ --str-chat__primary-surface-color-low-emphasis: #edf7f7;
+ --str-chat__border-radius-circle: 6px;
+ --str-chat__avatar-background-color: #bf360c;
+ --str-chat__message-bubble-color: #00695c; // Custom text color only for the message bubble
+}
+```
+
+
+
+We can see that setting the text color of the message bubble won't change the color of the link attachments.
+
+To solve this we also have to set the text color for the link attachment component:
+
+```scss
+.str-chat {
+ --str-chat__primary-color: #009688;
+ --str-chat__active-primary-color: #004d40;
+ --str-chat__surface-color: #f5f5f5;
+ --str-chat__secondary-surface-color: #fafafa;
+ --str-chat__primary-surface-color: #e0f2f1;
+ --str-chat__primary-surface-color-low-emphasis: #edf7f7;
+ --str-chat__border-radius-circle: 6px;
+ --str-chat__avatar-background-color: #bf360c;
+ --str-chat__message-bubble-color: #00695c;
+ --str-chat__card-attachment-color: #00695c; // Setting text color of link attachments
+}
+```
+
+
+
+### Custom icons
+
+
+
+#### From CSS
+
+Starting from stream-chat-angular@5 it's possible to customize icons from CSS.
+
+Here is an example using the [Google Material Icon library](https://fonts.google.com/icons) to override the send icon:
+
+```scss
+// Import the icon library you want to use
+@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200');
+
+// Override the send icon
+.str-chat__icon--send::before {
+ font-family: 'Material Symbols Outlined';
+ content: '\e163';
+}
+```
+
+It's also possible to use image files for icons:
+
+```scss
+.str-chat__icon--send {
+ &::before {
+ display: none;
+ }
+ // Link to your image file, or encode the image inline
+ content: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik0xMjAtMTYwdi02NDBsNzYwIDMyMC03NjAgMzIwWm04MC0xMjAgNDc0LTIwMC00NzQtMjAwdjE0MGwyNDAgNjAtMjQwIDYwdjE0MFptMCAwdi00MDAgNDAwWiIvPjwvc3ZnPg==');
+}
+```
+
+The full list of icons used by the SDK can be found [here](https://github.com/GetStream/stream-chat-css/blob/main/src/v2/styles/Icon/Icon-layout.scss).
+
+You can also change the size and color of the icons:
+
+```scss
+.str-chat__icon--attach {
+ --str-chat-icon-color: green; // Only works for font icons
+ --str-chat-icon-height: 60px;
+}
+```
+
+#### From HTML template
+
+If you're using stream-chat-angular@4 or an older version, or CSS customizations are not enough, you can completely replace the built-in icon component with your own using the [`CustomTemplatesService`](../../services/CustomTemplatesService/#icontemplate).
+
+You can find a working example in the [customization sample app](https://github.com/GetStream/stream-chat-angular/blob/master/projects/customizations-example/src/app/icon/icon.component.ts).
+
+If the default rules set by the stream-chat-angular stylesheets not enough to set the size and color of your custom icons, you can rely on the `--str-chat-icon-color`, `--str-chat-icon-height` and `--str-chat-icon-width` variables:
+
+```
+.my-custom-send-icon {
+ svg {
+ height: var(--str-chat-icon-height);
+ width: var(--str-chat-icon-width);
+
+ path {
+ fill: var(--str-chat-icon-color);
+ }
+ }
+}
+```
+
+
+
+
+
+TODO
+
+
+
+### CSS overrides
+
+If you'd like to add customizations that are not supported by CSS variables, you can override parts of the default CSS:
+
+
+
+```scss
+@import '~stream-chat-react/dist/scss/v2/index.scss';
+```
+
+
+
+```scss
+// Provide your overrides after the stream-chat-angular stylesheet imports
+.str-chat__channel-preview-messenger--last-message {
+ font-weight: 500;
+}
+```
+
+Just make sure that you add the customization rules after the stylesheet import.
+
+If you're using SCSS it's also possible to import component stylesheets separately (instead of our bundled stylesheet):
+
+
+
+```scss
+// stream-chat-angular@5
+// Use default theme for channel list and channel preview components
+@import 'stream-chat-angular/src/assets/styles/scss/ChannelList/ChannelList-layout.scss';
+@import 'stream-chat-angular/src/assets/styles/scss/ChannelList/ChannelList-theme.scss';
+@import 'stream-chat-angular/src/assets/styles/scss/ChannelPreview/ChannelPreview-layout.scss';
+@import 'stream-chat-angular/src/assets/styles/scss/ChannelPreview/ChannelPreview-theme.scss';
+
+// stream-chat-angular@4
+// Use default theme for channel list and channel preview components
+@import 'stream-chat-angular/src/assets/styles/v2/scss/ChannelList/ChannelList-layout.scss';
+@import 'stream-chat-angular/src/assets/styles/v2/scss/ChannelList/ChannelList-theme.scss';
+@import 'stream-chat-angular/src/assets/styles/v2/scss/ChannelPreview/ChannelPreview-layout.scss';
+@import 'stream-chat-angular/src/assets/styles/v2/scss/ChannelPreview/ChannelPreview-theme.scss';
+```
+
+
+
+
+
+```scss
+// Use default theme for channel list and channel preview components
+@import '~stream-chat-react/dist/scss/v2/ChannelList/ChannelList-layout.scss';
+@import '~stream-chat-react/dist/scss/v2/ChannelList/ChannelList-theme.scss';
+@import '~stream-chat-react/dist/scss/v2/ChannelPreview/ChannelPreview-layout.scss';
+@import '~stream-chat-react/dist/scss/v2/ChannelPreview/ChannelPreview-theme.scss';
+```
+
+
+
+```scss
+.str-chat__avatar {
+ // Custom CSS for avatar component
+}
+```
+
+### Apply your own look and feel
+
+If you want to create a truly custom look and feel, it can be exhausting to override the default styling. In that case, it's possible only to apply layout rules from the default theme.
+
+Here is how you can import the layout stylesheet:
+
+
+
+```scss
+// stream-chat-angular@5
+@import 'stream-chat-angular/src/assets/styles/scss/index.layout.scss';
+
+// stream-chat-angular@4
+@import 'stream-chat-angular/src/assets/styles/v2/scss/index.layout.scss';
+```
+
+
+
+
+
+```scss
+@import '~stream-chat-react/dist/scss/v2/index.layout.scss';
+```
+
+
+
+or if you're using CSS:
+
+
+
+```css
+// stream-chat-angular@5
+@import 'stream-chat-angular/src/assets/styles/css/index.layout.css';
+
+// stream-chat-angular@4
+@import 'stream-chat-angular/src/assets/styles/v2/css/index.layout.css';
+```
+
+
+
+
+
+```css
+@import '~stream-chat-react/dist/css/v2/index.layout.css';
+```
+
+
+
+
+
+The result will be a minimalistic UI without
+
+- coloring
+- fonts
+- borders
+- shadows
+
+Please note that if you're only using the layout rules, you can only use the layout CSS variables.
+
+## Dark and light themes
+
+The default theme has dark and light variants. Here is how you can switch between the different themes:
+
+
+
+Use the [`ThemeService`](../services/ThemeService.mdx):
+
+```typescript
+import { ThemeService } from 'stream-chat-angular';
+
+constructor(themeService: ThemeService) {
+ themeService.theme$.next('dark'); // or light
+}
+```
+
+
+
+
+
+```tsx
+
+ {/* ... */}
+
+```
+
+or only to a specific component (`Channel` or/and `ChannelList`):
+
+:::note
+Using the `customClasses` approach for either of the components will override default class names. Don't forget to add those to your theme class names (as defined in the snippet) for the styling to work properly.
+:::
+
+```tsx
+
+ {/* ... */}
+
+```
+
+
+
+Here is what the dark theme looks like:
+
+
+
+
+
+:::note
+The `str-chat__theme-dark`/`str-chat__theme-light` class is applied to the [channel list](../components/ChannelListComponent.mdx) and [channel](../components/ChannelComponent.mdx) components, these classes are responsible for switching between the dark and light theme color combinations, if you don't use those components in your chat application you'll have apply the theme classes manually.
+:::
+
+
+
+
+
+:::note
+The `str-chat__theme-dark`/`str-chat__theme-light` class is applied to the [ChannelList](../core-components/channel-list.mdx) and [Channel](../core-components/channel.mdx) components, these classes are responsible for switching between the dark and light theme color combinations.
+:::
+
+
+
+Here is how you can provide different color configurations for the dark and light themes:
+
+
+
+```scss
+@import '~stream-chat-react/dist/scss/v2/index.scss';
+```
+
+
+
+```scss
+.str-chat {
+ --str-chat__border-radius-circle: 6px;
+}
+
+.str-chat__theme-light {
+ --str-chat__primary-color: #009688;
+ --str-chat__active-primary-color: #004d40;
+ --str-chat__surface-color: #f5f5f5;
+ --str-chat__secondary-surface-color: #fafafa;
+ --str-chat__primary-surface-color: #e0f2f1;
+ --str-chat__primary-surface-color-low-emphasis: #edf7f7;
+ --str-chat__avatar-background-color: #bf360c;
+}
+
+.str-chat__theme-dark {
+ --str-chat__primary-color: #26a69a;
+ --str-chat__active-primary-color: #00796b;
+ --str-chat__surface-color: #424242;
+ --str-chat__secondary-surface-color: #212121;
+ --str-chat__primary-surface-color: #00695c;
+ --str-chat__primary-surface-color-low-emphasis: #004d40;
+ --str-chat__avatar-background-color: #ff7043;
+}
+```
+
+Here is the custom dark theme:
+
+
+
+### Creating your own theme
+
+It's possible to extend the existing themes with your own themes.
+
+Here is an example creating 'round' and 'square' themes:
+
+
+
+```scss
+@import '~stream-chat-react/dist/scss/v2/index.scss';
+```
+
+
+
+```scss
+// Make sure to use the proper naming convention: str-chat__theme-
+.str-chat__theme-round {
+ // You can use the predefined theme and component layer variables
+ --str-chat__border-radius-circle: 999px;
+}
+
+.str-chat__theme-square {
+ --str-chat__border-radius-circle: 6px;
+}
+```
+
+
+
+Set the theme using the [`ThemeService`](../services/ThemeService.mdx):
+
+```typescript
+import { ThemeService } from 'stream-chat-angular';
+
+constructor(themeService: ThemeService) {
+ themeService.theme$.next('square');
+}
+```
+
+
+
+
+
+```tsx
+
+ {/* ... */}
+
+```
+
+or only to a specific component (`Channel` or/and `ChannelList`):
+
+:::note
+Using the `customClasses` approach for either of the components will override default class names. Don't forget to add those to your theme class names (as defined in the snippet) for the styling to work properly.
+:::
+
+```tsx
+
+ {/* ... */}
+
+```
+
+
+
+
+
+## RTL support
+
+The layout was built with RTL support in mind. You can use the RTL layout by providing the `dir` attribute in your HTML:
+
+```html
+
+
+
+```
+
+Here is the result:
+
+
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/theming/palette-variables.mdx b/docusaurus/react_versioned_docs/version-11.x.x/theming/palette-variables.mdx
new file mode 100644
index 0000000000..6380029a9d
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/theming/palette-variables.mdx
@@ -0,0 +1,78 @@
+---
+id: palette-variables
+sidebar_position: 4
+title: Palette variables
+keywords: [v2, theme-v2, theming-v2, theming, palette variables]
+---
+
+import SDKSpecific from './SDKSpecific';
+import V2Warning from './V2Warning';
+
+:::info
+
+
+
+
+
+
+
+
+
+:::
+
+A color palette is defined inside the library that used to define default values for the [global theme variables](./global-variables.mdx). If you want to work with the default theme but want to adjust the shades (for example, change `blue500` to a lighter color), you can update the palette variables. However, if you want to change the color scheme of the theme (for example, change the primary color from blue to green), you should take a look at [global theme variables](./global-variables.mdx).
+
+| Name | Value(s) |
+| ----------------------- | ----------------------------------------------------------------------- |
+| `--str-chat__blue950` |
`.str-chat`
`#001333`
|
+| `--str-chat__blue900` |
`.str-chat`
`#00163d`
|
+| `--str-chat__blue800` |
`.str-chat`
`#002666`
|
+| `--str-chat__blue700` |
`.str-chat`
`#003999`
|
+| `--str-chat__blue600` |
`.str-chat`
`#004ccc`
|
+| `--str-chat__blue500` |
`.str-chat`
`#005fff`
|
+| `--str-chat__blue400` |
`.str-chat`
`#337eff`
|
+| `--str-chat__blue300` |
`.str-chat`
`#669fff`
|
+| `--str-chat__blue200` |
`.str-chat`
`#ccdfff`
|
+| `--str-chat__blue100` |
`.str-chat`
`#e0f0ff`
|
+| `--str-chat__blue50` |
`.str-chat`
`#ebf5ff`
|
+| `--str-chat__grey950` |
`.str-chat`
`#080707`
|
+| `--str-chat__grey900` |
`.str-chat`
`#17191c`
|
+| `--str-chat__grey800` |
`.str-chat`
`#1c1e22`
|
+| `--str-chat__grey700` |
`.str-chat`
`#272a30`
|
+| `--str-chat__grey600` |
`.str-chat`
`#4c525c`
|
+| `--str-chat__grey500` |
`.str-chat`
`#72767e`
|
+| `--str-chat__grey400` |
`.str-chat`
`#b4b7bb`
|
+| `--str-chat__grey300` |
`.str-chat`
`#dbdde1`
|
+| `--str-chat__grey200` |
`.str-chat`
`#e9eaed`
|
+| `--str-chat__grey100` |
`.str-chat`
`#f4f4f5`
|
+| `--str-chat__grey50` |
`.str-chat`
`#ffffff`
|
+| `--str-chat__red900` |
`.str-chat`
`#330003`
|
+| `--str-chat__red800` |
`.str-chat`
`#660006`
|
+| `--str-chat__red700` |
`.str-chat`
`#990008`
|
+| `--str-chat__red600` |
`.str-chat`
`#cc000b`
|
+| `--str-chat__red500` |
`.str-chat`
`#ff000e`
|
+| `--str-chat__red400` |
`.str-chat`
`#ff3742`
|
+| `--str-chat__red300` |
`.str-chat`
`#ff666e`
|
+| `--str-chat__red200` |
`.str-chat`
`#ff999f`
|
+| `--str-chat__red100` |
`.str-chat`
`#ffe5e7`
|
+| `--str-chat__green900` |
`.str-chat`
`#062d16`
|
+| `--str-chat__green800` |
`.str-chat`
`#0d592c`
|
+| `--str-chat__green700` |
`.str-chat`
`#138643`
|
+| `--str-chat__green600` |
`.str-chat`
`#19b359`
|
+| `--str-chat__green500` |
`.str-chat`
`#20e070`
|
+| `--str-chat__green400` |
`.str-chat`
`#4ce68c`
|
+| `--str-chat__green300` |
`.str-chat`
`#79eca9`
|
+| `--str-chat__green200` |
`.str-chat`
`#a6f2c6`
|
+| `--str-chat__green100` |
`.str-chat`
`#e9f1ff`
|
+| `--str-chat__yellow900` |
`.str-chat`
`#332500`
|
+| `--str-chat__yellow800` |
`.str-chat`
`#664900`
|
+| `--str-chat__yellow700` |
`.str-chat`
`#996e00`
|
+| `--str-chat__yellow600` |
`.str-chat`
`#cc9200`
|
+| `--str-chat__yellow500` |
`.str-chat`
`#ffb700`
|
+| `--str-chat__yellow400` |
`.str-chat`
`#ffd466`
|
+| `--str-chat__yellow300` |
`.str-chat`
`#ffe299`
|
+| `--str-chat__yellow200` |
`.str-chat`
`#fff1cc`
|
+| `--str-chat__yellow100` |
`.str-chat`
`#fff8e5`
|
+
+
+Palette variables are defined in: [https://github.com/GetStream/stream-chat-css/blob/main/src-v2/styles/\_palette-variables.scss](https://github.com/GetStream/stream-chat-css/blob/main/src-v2/styles/_palette-variables.scss)
diff --git a/docusaurus/react_versioned_docs/version-11.x.x/troubleshooting/troubleshooting.mdx b/docusaurus/react_versioned_docs/version-11.x.x/troubleshooting/troubleshooting.mdx
new file mode 100644
index 0000000000..ec2bf6f806
--- /dev/null
+++ b/docusaurus/react_versioned_docs/version-11.x.x/troubleshooting/troubleshooting.mdx
@@ -0,0 +1,42 @@
+---
+id: troubleshooting
+title: Troubleshooting
+---
+
+For information regarding some common troubleshooting and support issues, please see below.
+
+### Context Providers
+
+The Stream Chat React SDK uses a variety of [Context Providers](../components/contexts/chat-context.mdx) that share values and data to all their children. This is instead of prop drilling through many levels of components.
+If you're creating a custom component, utilizing our contexts via our custom hooks makes this process very straightforward.
+
+A common issue is when one of the exposed hooks from a context provider is being utilized, but not within the related Context. Each value you pull will be undefined.
+A good resource for knowing which of our components are Context Providers is within [Core Components](../components/core-components/chat.mdx).
+
+### User Roles and Permission Policies
+
+If you are seeing access to functionality for user that seems incorrect, or conversely, functionality that could be missing for a user, then this might be related to a user role or permissions.
+
+Channels are organized into groups with a set channel type (ex: livestream, messaging, team, gaming or commerce), and these are set when creating a channel.
+Each channel type comes with a default permission policy pre-configured. These can then be modified as needed to fit different use cases.
+A policy is structured by a user role being allowed or denied access to a resource (ex: user with admin role is allowed to create a channel and ban a user).
+
+Documentation on [User Permissions](https://getstream.io/chat/docs/react/chat_permission_policies/?language=js).
+Documentation on [Channel Permissions](https://getstream.io/chat/docs/react/channel_permission_policies/?language=js).
+Documentation on [User Roles](https://getstream.io/chat/docs/react/channel_user_role/?language=js)
+
+You can change/create permission policies applied to a channel type at any time through the Dashboard. You can also change a user role to admin or moderator using the API, however this must be done server side.
+
+### Watching Channels
+
+The method channel.watch() is intended for client-side use, and creates a channel if it does not already exist. If the channel already exists, it will return a more detailed version of the channel instance (including messages, watchers, and 'read'). In addition, using this method will 'watch' the channel, that is, the currently connected user will be subscribed to event updates (new message, new member, etc...).
+
+This is different than the methods channel.create() (creates a channel but does not subscribe to events) and
+channel.query() (returns certain parameters of the channel but does not subscribe to events).
+
+### Watcher vs Member
+
+A watcher is a user who is subscribed to updates on a channel (new messages, etc). This actually doesn't imply membership, for example a non-member can watch a Livestream channel-type.
+
+A member is a user role associated with a specific channel, typically granted more permissions than a non-member user.
+For example, default permissions on our "messaging" type channel allow a user to read and write to the channel, as well as receive push notifications.
diff --git a/docusaurus/react_versioned_sidebars/version-11.x.x-sidebars.json b/docusaurus/react_versioned_sidebars/version-11.x.x-sidebars.json
new file mode 100644
index 0000000000..dfa7e279c2
--- /dev/null
+++ b/docusaurus/react_versioned_sidebars/version-11.x.x-sidebars.json
@@ -0,0 +1,149 @@
+{
+ "docs": [
+ { "Basics": ["basics/overview", "basics/installation"] },
+ {
+ "UI Components": [
+ "basics/getting_started",
+ {
+ "Theming": [
+ "theming/themingv2",
+ "theming/palette-variables",
+ "theming/component-variables",
+ "theming/global-variables",
+ "guides/theming/css_and_theming"
+ ]
+ },
+ { "Chat": ["components/core-components/chat", "components/contexts/chat_context"] },
+ {
+ "Channel": [
+ "components/core-components/channel",
+ "components/utility-components/channel_header",
+ "components/contexts/channel_action_context",
+ "components/contexts/channel_state_context",
+ "components/contexts/component_context"
+ ]
+ },
+ {
+ "Channel List": [
+ "components/core-components/channel_list",
+ "components/contexts/channel_list_context",
+ "hooks/channel_list_hooks",
+ "components/utility-components/channel_preview_ui",
+ "components/utility-components/channel_search",
+ "guides/channel-list-infinite-scroll",
+ "guides/multiple_channel_lists"
+ ]
+ },
+ {
+ "Message List": [
+ "components/core-components/message_list",
+ "components/core-components/virtualized_list",
+ "components/contexts/message_list_context",
+ "components/core-components/thread"
+ ]
+ },
+ {
+ "Message": [
+ "components/message-components/message",
+ "components/contexts/message_context",
+ "components/contexts/message_bounce_context",
+ "hooks/message_hooks",
+ "components/message-components/message_ui",
+ "components/message-components/render-text",
+ "components/message-components/ui-components",
+ "components/utility-components/avatar",
+ "components/utility-components/base-image",
+ {
+ "Attachment": [
+ "components/message-components/attachment",
+ "components/message-components/attachment/voice-recording"
+ ]
+ },
+ "components/message-components/reactions",
+ "components/utility-components/date_separator"
+ ]
+ },
+ {
+ "Message Input": [
+ "components/message-input-components/message_input",
+ "components/contexts/message_input_context",
+ "hooks/message_input_hooks",
+ "components/message-input-components/input_ui",
+ "components/message-input-components/ui_components",
+ "components/message-input-components/emoji-picker",
+ "components/message-input-components/audio_recorder",
+ "components/contexts/typing_context"
+ ]
+ },
+ "components/utility-components/indicators",
+ "components/utility-components/window",
+ "components/contexts/translation_context"
+ ]
+ },
+ {
+ "UI Cookbook": [
+ "guides/customization/customization-overview",
+ {
+ "Channel List": [
+ "guides/customization/channel_list_preview",
+ "guides/customization/channel_search",
+ "guides/channel-user-lists"
+ ]
+ },
+ {
+ "Message List": [
+ "guides/customization/adding_messagelist_notification",
+ "guides/theming/connection_status"
+ ]
+ },
+ {
+ "Message": [
+ "guides/theming/message_ui",
+ "guides/theming/reactions",
+ "guides/theming/actions/mentions_actions",
+ "guides/theming/actions/message_actions",
+ "guides/customization/pin_indicator",
+ "guides/customization/system_message"
+ ]
+ },
+ {
+ "Message Input": [
+ "guides/theming/input_ui",
+ "guides/customization/link-previews",
+ "guides/customization/override_submit_handler",
+ "guides/customization/persist_input_text_in_localstorage",
+ "guides/customization/suggestion_list",
+ "guides/customization/typing_indicator"
+ ]
+ },
+ {
+ "Attachment": [
+ "guides/theming/actions/attachment_actions",
+ "guides/customization/image_gallery",
+ "guides/theming/actions/geolocation_attachment",
+ "guides/customization/giphy_preview",
+ "guides/theming/actions/payment_attachment"
+ ]
+ },
+ "guides/customization/emoji_picker",
+ "guides/customization/app_menu",
+ "guides/customization/channel_header",
+ "guides/customization/thread_header"
+ ]
+ },
+ {
+ "Guides": [
+ "guides/client-and-user",
+ "guides/livestream-setup",
+ "guides/theming/translations",
+ "guides/typescript_and_generics",
+ "guides/channel_read_state",
+ "guides/video-integration/video-integration-stream",
+ "guides/sdk-state-management"
+ ]
+ },
+ { "Release Guides": ["release-guides/upgrade-to-v10", "release-guides/upgrade-to-v11"] },
+ "troubleshooting/troubleshooting",
+ "resources/resources"
+ ]
+}
\ No newline at end of file
diff --git a/docusaurus/react_versions.json b/docusaurus/react_versions.json
index 2cdc55f1f9..68753b9d4c 100644
--- a/docusaurus/react_versions.json
+++ b/docusaurus/react_versions.json
@@ -1,3 +1,4 @@
[
+ "11.x.x",
"11.x.x-legacy"
]
diff --git a/docusaurus/sidebars-react.json b/docusaurus/sidebars-react.json
index 99d1787f33..30f5ac4ec0 100644
--- a/docusaurus/sidebars-react.json
+++ b/docusaurus/sidebars-react.json
@@ -9,8 +9,7 @@
"theming/themingv2",
"theming/palette-variables",
"theming/component-variables",
- "theming/global-variables",
- "guides/theming/css_and_theming"
+ "theming/global-variables"
]
},
{ "Chat": ["components/core-components/chat", "components/contexts/chat_context"] },
@@ -143,7 +142,7 @@
"guides/sdk-state-management"
]
},
- { "Release Guides": ["release-guides/upgrade-to-v10", "release-guides/upgrade-to-v11"] },
+ { "Release Guides": ["release-guides/upgrade-to-v12", "release-guides/upgrade-to-v11", "release-guides/upgrade-to-v10"] },
"troubleshooting/troubleshooting",
"resources/resources"
]
diff --git a/examples/typescript/src/App.tsx b/examples/typescript/src/App.tsx
index 4bb8e4c9ad..c362ec7b08 100644
--- a/examples/typescript/src/App.tsx
+++ b/examples/typescript/src/App.tsx
@@ -26,6 +26,8 @@ type LocalChannelType = Record;
type LocalCommandType = string;
type LocalEventType = Record;
type LocalMessageType = Record;
+type LocalPollOptionType = Record;
+type LocalPollType = Record;
type LocalReactionType = Record;
type LocalUserType = Record;
@@ -35,10 +37,10 @@ type StreamChatGenerics = {
commandType: LocalCommandType;
eventType: LocalEventType;
messageType: LocalMessageType;
+ pollOptionType: LocalPollOptionType;
+ pollType: LocalPollType;
reactionType: LocalReactionType;
userType: LocalUserType;
- pollType: UR;
- pollOptionType: UR;
};
const chatClient = StreamChat.getInstance(apiKey);
diff --git a/examples/typescript/src/index.scss b/examples/typescript/src/index.scss
index 2489dae8bb..0430ffed46 100644
--- a/examples/typescript/src/index.scss
+++ b/examples/typescript/src/index.scss
@@ -10,131 +10,104 @@ code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
}
-$stream-chat-theme-version: '2';
-@if $stream-chat-theme-version == '2' {
- #root {
- display: flex;
- height: 100%;
+#root {
+ display: flex;
+ height: 100%;
- .str-chat-channel-list {
- position: fixed;
- z-index: 1;
- width: 0;
-
- &--open {
- width: 100%;
- }
- }
+ .str-chat-channel-list {
+ position: fixed;
+ z-index: 1;
+ width: 0;
- .str-chat-channel {
+ &--open {
width: 100%;
}
+ }
- .str-chat__thread {
- width: 100%;
- height: 100%;
- position: fixed;
- z-index: 1;
- }
+ .str-chat__channel {
+ width: 100%;
+ }
- .str-chat__channel-header .str-chat__header-hamburger {
- width: 30px;
- height: 30px;
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- border: none;
- background: transparent;
-
- svg {
- width: 25px;
- height: 25px;
- }
+ .str-chat__thread {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 1;
+ }
- &:hover {
- svg path {
- fill: var(--primary-color);
- }
- }
+ .str-chat__channel-header .str-chat__header-hamburger {
+ width: 30px;
+ height: 30px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+
+ svg {
+ width: 25px;
+ height: 25px;
}
- @media screen and (min-width: 768px) {
- //.str-chat-channel-list.thread-open {
- // &.menu-open {
- // width: 30%;
- // height: 100%;
- // position: fixed;
- // z-index: 1;
- // }
- //
- // &.menu-close {
- // width: 0;
- // }
- //
- // & + .channel .menu-button {
- // display: block;
- // }
- //}
-
- .str-chat-channel-list {
- width: 30%;
- max-width: 420px;
- position: initial;
- z-index: 0;
+ &:hover {
+ svg path {
+ fill: var(--primary-color);
}
+ }
+ }
- .str-chat__thread {
- position: initial;
- z-index: 0;
- }
+ @media screen and (min-width: 768px) {
+ //.str-chat-channel-list.thread-open {
+ // &.menu-open {
+ // width: 30%;
+ // height: 100%;
+ // position: fixed;
+ // z-index: 1;
+ // }
+ //
+ // &.menu-close {
+ // width: 0;
+ // }
+ //
+ // & + .channel .menu-button {
+ // display: block;
+ // }
+ //}
- .str-chat__channel-header .str-chat__header-hamburger {
- display: none;
- }
+ .str-chat-channel-list {
+ width: 30%;
+ max-width: 420px;
+ position: initial;
+ z-index: 0;
}
- @media screen and (min-width: 1024px) {
- //.str-chat-channel-list {
- // max-width: 420px;
- // position: initial;
- // z-index: 0;
- //}
-
- .str-chat__thread {
- width: 45%;
- //position: initial;
- //z-index: 0;
- }
-
- .str-chat__channel-header .str-chat__header-hamburger {
- display: none;
- }
+ .str-chat__thread {
+ position: initial;
+ z-index: 0;
}
- }
-} @else {
- .menu-button {
- display: none;
- }
- .str-chat-channel-list {
- max-height: 100vh;
- overflow-y: auto;
- .str-chat__channel-list-messenger {
- flex: 1;
+ .str-chat__channel-header .str-chat__header-hamburger {
+ display: none;
}
}
- .str-chat__thread {
- min-width: 100%;
- max-width: 100%;
- }
+ @media screen and (min-width: 1024px) {
+ //.str-chat-channel-list {
+ // max-width: 420px;
+ // position: initial;
+ // z-index: 0;
+ //}
- @media only screen and (min-device-width: 768px) {
.str-chat__thread {
- min-width: 35%;
- max-width: 35%;
+ width: 45%;
+ //position: initial;
+ //z-index: 0;
+ }
+
+ .str-chat__channel-header .str-chat__header-hamburger {
+ display: none;
}
}
}
diff --git a/examples/typescript/src/index.tsx b/examples/typescript/src/index.tsx
index a6e481519b..77c8e3be99 100644
--- a/examples/typescript/src/index.tsx
+++ b/examples/typescript/src/index.tsx
@@ -1,7 +1,5 @@
import React from 'react';
import { createRoot } from 'react-dom/client';
-// import '@stream-io/stream-chat-css/dist/css/index.css';
-// import '@stream-io/stream-chat-css/dist/v2/css/index.css';
import 'stream-chat-react/dist/css/v2/index.css';
import './index.scss';
import App from './App';
diff --git a/examples/vite/src/App.tsx b/examples/vite/src/App.tsx
index 3811b65bb4..468c323e11 100644
--- a/examples/vite/src/App.tsx
+++ b/examples/vite/src/App.tsx
@@ -5,7 +5,7 @@ import {
ChannelList,
Chat,
MessageInput,
- MessageList,
+ VirtualizedMessageList as MessageList,
Thread,
Window,
useCreateChatClient,
@@ -32,6 +32,8 @@ type LocalChannelType = Record;
type LocalCommandType = string;
type LocalEventType = Record;
type LocalMessageType = Record;
+type LocalPollOptionType = Record;
+type LocalPollType = Record;
type LocalReactionType = Record;
type LocalUserType = Record;
@@ -41,6 +43,8 @@ type StreamChatGenerics = {
commandType: LocalCommandType;
eventType: LocalEventType;
messageType: LocalMessageType;
+ pollOptionType: LocalPollOptionType;
+ pollType: LocalPollType;
reactionType: LocalReactionType;
userType: LocalUserType;
};
diff --git a/examples/vite/src/index.scss b/examples/vite/src/index.scss
index 4c92f0bf2a..71d3851684 100644
--- a/examples/vite/src/index.scss
+++ b/examples/vite/src/index.scss
@@ -12,124 +12,97 @@ body,
height: 100%;
}
-$stream-chat-theme-version: '2';
-@if $stream-chat-theme-version == '2' {
- #root {
- display: flex;
- height: 100%;
-
- .str-chat-channel-list {
- position: fixed;
- z-index: 1;
- width: 0;
-
- &--open {
- width: 100%;
- }
- }
+#root {
+ display: flex;
+ height: 100%;
- .str-chat-channel {
- width: 100%;
- }
+ .str-chat__channel-list {
+ position: fixed;
+ z-index: 1;
+ width: 0;
- .str-chat__thread {
+ &--open {
width: 100%;
- height: 100%;
- position: fixed;
- z-index: 1;
- }
-
- .str-chat__channel-header .str-chat__header-hamburger {
- width: 30px;
- height: 38px;
- padding: var(--xxs-p);
- margin-right: var(--xs-m);
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- border: none;
- background: transparent;
-
- &:hover {
- svg path {
- fill: var(--primary-color);
- }
- }
}
+ }
- @media screen and (min-width: 768px) {
- //.str-chat-channel-list.thread-open {
- // &.menu-open {
- // width: 30%;
- // height: 100%;
- // position: fixed;
- // z-index: 1;
- // }
- //
- // &.menu-close {
- // width: 0;
- // }
- //
- // & + .channel .menu-button {
- // display: block;
- // }
- //}
+ .str-chat__channel {
+ width: 100%;
+ }
- .str-chat-channel-list {
- width: 30%;
- max-width: 420px;
- position: initial;
- z-index: 0;
- }
+ .str-chat__thread {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ z-index: 1;
+ }
- .str-chat__thread {
- position: initial;
- z-index: 0;
+ .str-chat__channel-header .str-chat__header-hamburger {
+ width: 30px;
+ height: 38px;
+ padding: var(--xxs-p);
+ margin-right: var(--xs-m);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+
+ &:hover {
+ svg path {
+ fill: var(--primary-color);
}
}
+ }
- @media screen and (min-width: 1024px) {
- //.str-chat-channel-list {
- // max-width: 420px;
- // position: initial;
- // z-index: 0;
- //}
-
- .str-chat__thread {
- width: 45%;
- //position: initial;
- //z-index: 0;
- }
-
- .str-chat__channel-header .str-chat__header-hamburger {
- display: none;
- }
+ @media screen and (min-width: 768px) {
+ //.str-chat__channel-list.thread-open {
+ // &.menu-open {
+ // width: 30%;
+ // height: 100%;
+ // position: fixed;
+ // z-index: 1;
+ // }
+ //
+ // &.menu-close {
+ // width: 0;
+ // }
+ //
+ // & + .channel .menu-button {
+ // display: block;
+ // }
+ //}
+
+ .str-chat__channel-list {
+ width: 30%;
+ max-width: 420px;
+ position: initial;
+ z-index: 0;
}
- }
-} @else {
- .menu-button {
- display: none;
- }
- .str-chat-channel-list {
- max-height: 100vh;
- overflow-y: auto;
- .str-chat__channel-list-messenger {
- flex: 1;
+ .str-chat__thread {
+ position: initial;
+ z-index: 0;
}
}
- .str-chat__thread {
- min-width: 100%;
- max-width: 100%;
- }
+ @media screen and (min-width: 1024px) {
+ //.str-chat__channel-list {
+ // max-width: 420px;
+ // position: initial;
+ // z-index: 0;
+ //}
- @media only screen and (min-device-width: 768px) {
.str-chat__thread {
- min-width: 35%;
- max-width: 35%;
+ width: 45%;
+ //position: initial;
+ //z-index: 0;
+ }
+
+ .str-chat__channel-header .str-chat__header-hamburger {
+ display: none;
}
}
}
diff --git a/rollup.config.js b/rollup.config.js
index 82663e47be..e31b6debc5 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -83,8 +83,6 @@ const basePlugins = ({ useBrowserResolve = false }) => [
copy({
targets: [
{ dest: 'dist/assets', src: './node_modules/@stream-io/stream-chat-css/dist/assets/*' },
- { dest: 'dist/css', src: './node_modules/@stream-io/stream-chat-css/dist/css/*.css' },
- { dest: 'dist/scss', src: './node_modules/@stream-io/stream-chat-css/dist/scss/*' },
{ dest: 'dist/css/v2', src: './node_modules/@stream-io/stream-chat-css/dist/v2/css/*.css' },
{ dest: 'dist/scss/v2', src: './node_modules/@stream-io/stream-chat-css/dist/v2/scss/*' },
],
diff --git a/src/components/Attachment/AttachmentContainer.tsx b/src/components/Attachment/AttachmentContainer.tsx
index c895da4686..94e73d179a 100644
--- a/src/components/Attachment/AttachmentContainer.tsx
+++ b/src/components/Attachment/AttachmentContainer.tsx
@@ -12,7 +12,8 @@ import { Card as DefaultCard } from './Card';
import { FileAttachment as DefaultFile } from './FileAttachment';
import { UnsupportedAttachment as DefaultUnsupportedAttachment } from './UnsupportedAttachment';
import {
- AttachmentContainerProps,
+ AttachmentComponentType,
+ GalleryAttachment,
isGalleryAttachmentType,
isSvgAttachment,
RenderAttachmentProps,
@@ -26,7 +27,14 @@ import type {
ImageAttachmentConfiguration,
VideoAttachmentConfiguration,
} from '../../types/types';
+import type { Attachment } from 'stream-chat';
+export type AttachmentContainerProps<
+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
+> = {
+ attachment: Attachment | GalleryAttachment;
+ componentType: AttachmentComponentType;
+};
export const AttachmentWithinContainer = <
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
>({
@@ -53,7 +61,7 @@ export const AttachmentWithinContainer = <
[`str-chat__message-attachment--${attachment?.type}`]: attachment?.type,
[`str-chat__message-attachment--${componentType}--${extra}`]: componentType && extra,
'str-chat__message-attachment--svg-image': isSvgAttachment(attachment),
- 'str-chat__message-attachment-with-actions': extra === 'actions', // added for theme V2 (better readability)
+ 'str-chat__message-attachment-with-actions': extra === 'actions',
},
);
@@ -298,7 +306,7 @@ export const MediaContainer = <
return attachment.actions?.length ? (
-
+
{content}
diff --git a/src/components/Attachment/Audio.tsx b/src/components/Attachment/Audio.tsx
index b8da296f27..baff2d7ef6 100644
--- a/src/components/Attachment/Audio.tsx
+++ b/src/components/Attachment/Audio.tsx
@@ -5,80 +5,23 @@ import type { Attachment } from 'stream-chat';
import { DownloadButton, FileSizeIndicator, PlayButton, ProgressBar } from './components';
import { useAudioController } from './hooks/useAudioController';
-import { useChatContext } from '../../context/ChatContext';
-
import type { DefaultStreamChatGenerics } from '../../types/types';
export type AudioProps<
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
> = {
+ // fixme: rename og to attachment
og: Attachment;
};
-const AudioV1 = ({ og }: AudioProps) => {
- // fixme: pass mimeType if available
- const { asset_url, description, image_url, mime_type, text, title } = og;
- const { audioRef, isPlaying, progress, togglePlay } = useAudioController({ mimeType: mime_type });
-
- return (
-
-
-
-
-
- {!isPlaying ? (
-
- ) : (
-
- )}
-
- {image_url && }
-
-
-
- {title}
-
- {text}
-
-
-
-
-
-
- );
-};
-
-const AudioV2 = ({ og }: AudioProps) => {
- const { asset_url, file_size, mime_type, title } = og;
+const UnMemoizedAudio = <
+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
+>(
+ props: AudioProps,
+) => {
+ const {
+ og: { asset_url, file_size, mime_type, title },
+ } = props;
const { audioRef, isPlaying, progress, seek, togglePlay } = useAudioController({
mimeType: mime_type,
});
@@ -110,16 +53,6 @@ const AudioV2 = ({ og }: AudioProps) => {
);
};
-const UnMemoizedAudio = <
- StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
->(
- props: AudioProps,
-) => {
- const { themeVersion } = useChatContext('Audio');
-
- return themeVersion === '1' ? : ;
-};
-
/**
* Audio attachment with play/pause button and progress bar
*/
diff --git a/src/components/Attachment/Card.tsx b/src/components/Attachment/Card.tsx
index 66bfe58206..93d7e39aaa 100644
--- a/src/components/Attachment/Card.tsx
+++ b/src/components/Attachment/Card.tsx
@@ -7,8 +7,6 @@ import { ImageComponent } from '../Gallery';
import { SafeAnchor } from '../SafeAnchor';
import { PlayButton, ProgressBar } from './components';
import { useAudioController } from './hooks/useAudioController';
-
-import { useChatContext } from '../../context/ChatContext';
import { useChannelStateContext } from '../../context/ChannelStateContext';
import { useTranslationContext } from '../../context/TranslationContext';
@@ -43,82 +41,6 @@ const UnableToRenderCard = ({ type }: { type?: CardProps['type'] }) => {
);
};
-interface CardV1Props {
- asset_url?: Attachment['asset_url'];
- giphy?: Attachment['giphy'];
- /** The url of the full sized image */
- image_url?: string;
- /** The scraped url, used as a fallback if the OG-data doesn't include a link */
- og_scrape_url?: string;
- /** Description returned by the OG scraper */
- text?: string;
- /** The url for thumbnail sized image */
- thumb_url?: string;
- /** Title returned by the OG scraper */
- title?: string;
- /** Link returned by the OG scraper */
- title_link?: string;
- /** The card type used in the className attribute */
- type?: string;
-}
-
-const CardV1 = (props: CardV1Props) => {
- const {
- asset_url,
- giphy,
- image_url,
- og_scrape_url,
- text,
- thumb_url,
- title,
- title_link,
- type,
- } = props;
- const { giphyVersion: giphyVersionName } = useChannelStateContext('Card');
-
- let image = thumb_url || image_url;
- const dimensions: Dimensions = {};
-
- if (type === 'giphy' && typeof giphy !== 'undefined') {
- const giphyVersion = giphy[giphyVersionName as keyof NonNullable];
- image = giphyVersion.url;
- dimensions.height = giphyVersion.height;
- dimensions.width = giphyVersion.width;
- }
-
- if (!title && !title_link && !asset_url && !image) {
- return ;
- }
-
- if (!title_link && !og_scrape_url) {
- return null;
- }
-
- return (
-
- `);
- });
- });
-
- describe('theme V2', () => {
- beforeAll(() => {
- jest.spyOn(window.HTMLMediaElement.prototype, 'pause').mockImplementation(() => {});
- });
-
- afterAll(jest.restoreAllMocks);
-
- const dummyAttachment = {
- asset_url: 'dummyAttachment_asset_url',
- author_name: 'dummyAttachment_author_name',
- image_url: 'dummyAttachment_image_url',
- og_scrape_url: 'dummyAttachment_og_scrape_url',
- text: 'dummyAttachment_text',
- thumb_url: 'dummyAttachment_thumb_url',
- title: 'dummyAttachment_title',
- title_link: 'dummyAttachment_title_link',
- };
-
- const attachmentTypes = ['audio', 'image', 'video'];
-
- const cases = attachmentTypes.reduce((acc, type) => {
- const attachment = { ...dummyAttachment, type };
- acc[type] = [
{
- attachment: { ...attachment, og_scrape_url: undefined, title_link: undefined },
- props: 'og_scrape_url neither title_link is available',
- render: `card without caption`,
+ attachment,
+ props: 'all props are available',
+ render: `audio widget with image loaded from thumb_url and title & text in Card content`,
},
{
attachment: {
@@ -378,206 +140,151 @@ describe('Card', () => {
asset_url: undefined,
image_url: undefined,
thumb_url: undefined,
- title: undefined,
- title_link: undefined,
},
- props: 'neither image and asset urls nor title_link are available',
- render: 'unable-to-display card',
+ props: 'asset and neither og image URL is available',
+ render: 'content part with title and text only and without the header part of the Card',
},
+ );
+ } else if (type === 'video') {
+ acc[type].push(
{
- attachment: { ...attachment, title_link: undefined },
- props: 'title_link is not available',
- render: `${type} with caption using og_scrape_url and with asset in header`,
+ attachment: {
+ ...attachment,
+ image_url: undefined,
+ thumb_url: undefined,
+ },
+ props: 'og image URLs are not available',
+ render: `video widget in header and title & text in Card content`,
},
{
- attachment: { ...attachment, title: undefined },
- props: 'title is not available',
- render: `${type} without title`,
+ attachment: { ...attachment, asset_url: undefined, image_url: undefined },
+ props: 'thumb_url is available, but not asset_url, image_url',
+ render: `image loaded from thumb_url not ${type} widget`,
},
{
- attachment: { ...attachment, title: undefined, title_link: undefined },
- props: 'title_link neither title is available',
- render: `${type} without title and with caption using og_scrape_url and with image in header`,
+ attachment: { ...attachment, asset_url: undefined, thumb_url: undefined },
+ props: 'image_url is available, but not asset_url, thumb_url',
+ render: `image loaded from image_url not ${type} widget`,
},
- ];
- if (type === 'audio') {
- acc[type].push(
- {
- attachment: {
- ...attachment,
- image_url: undefined,
- thumb_url: undefined,
- },
- props: 'og image URLs are not available',
- render: `audio widget with title & text in Card content and without Card header`,
- },
- {
- attachment: { ...attachment, asset_url: undefined, image_url: undefined },
- props: 'thumb_url is available, but not asset_url, image_url',
- render: `image loaded from thumb_url not ${type} widget`,
- },
- {
- attachment: { ...attachment, asset_url: undefined, thumb_url: undefined },
- props: 'image_url is available, but not asset_url, thumb_url',
- render: `image loaded from image_url not ${type} widget`,
- },
- {
- attachment,
- props: 'all props are available',
- render: `audio widget with image loaded from thumb_url and title & text in Card content`,
- },
- {
- attachment: {
- ...attachment,
- asset_url: undefined,
- image_url: undefined,
- thumb_url: undefined,
- },
- props: 'asset and neither og image URL is available',
- render: 'content part with title and text only and without the header part of the Card',
- },
- );
- } else if (type === 'video') {
- acc[type].push(
- {
- attachment: {
- ...attachment,
- image_url: undefined,
- thumb_url: undefined,
- },
- props: 'og image URLs are not available',
- render: `video widget in header and title & text in Card content`,
- },
- {
- attachment: { ...attachment, asset_url: undefined, image_url: undefined },
- props: 'thumb_url is available, but not asset_url, image_url',
- render: `image loaded from thumb_url not ${type} widget`,
- },
- {
- attachment: { ...attachment, asset_url: undefined, thumb_url: undefined },
- props: 'image_url is available, but not asset_url, thumb_url',
- render: `image loaded from image_url not ${type} widget`,
- },
- {
- attachment,
- props: 'all props are available',
- render: `video widget in header and title & text in Card content`,
- },
- {
- attachment: {
- ...attachment,
- asset_url: undefined,
- image_url: undefined,
- thumb_url: undefined,
- },
- props: 'scraped media URL is not available',
- render: `content part with title and text only and without the header part of the Card`,
- },
- );
- } else if (type === 'image') {
- acc[type].push(
- {
- attachment: {
- ...attachment,
- image_url: undefined,
- thumb_url: undefined,
- },
- props: 'og image URLs are not available',
- render: `card with title and text only and without the image in the header part of the Card`,
- },
- {
- attachment: { ...attachment, image_url: undefined },
- props: 'thumb_url is available, but not image_url',
- render: `image loaded from thumb_url`,
+ {
+ attachment,
+ props: 'all props are available',
+ render: `video widget in header and title & text in Card content`,
+ },
+ {
+ attachment: {
+ ...attachment,
+ asset_url: undefined,
+ image_url: undefined,
+ thumb_url: undefined,
},
- {
- attachment: { ...attachment, thumb_url: undefined },
- props: 'image_url is available, but not thumb_url',
- render: `image loaded from image_url`,
+ props: 'scraped media URL is not available',
+ render: `content part with title and text only and without the header part of the Card`,
+ },
+ );
+ } else if (type === 'image') {
+ acc[type].push(
+ {
+ attachment: {
+ ...attachment,
+ image_url: undefined,
+ thumb_url: undefined,
},
- );
- }
- return acc;
- }, {});
-
- it.each`
- num | render | type | props | attachment
- ${1} | ${cases.audio[0].render} | ${cases.audio[0].attachment.type} | ${cases.audio[0].props} | ${cases.audio[0].attachment}
- ${2} | ${cases.video[0].render} | ${cases.video[0].attachment.type} | ${cases.video[0].props} | ${cases.video[0].attachment}
- ${3} | ${cases.image[0].render} | ${cases.image[0].attachment.type} | ${cases.image[0].props} | ${cases.image[0].attachment}
- ${4} | ${cases.audio[1].render} | ${cases.audio[1].attachment.type} | ${cases.audio[1].props} | ${cases.audio[1].attachment}
- ${5} | ${cases.video[1].render} | ${cases.video[1].attachment.type} | ${cases.video[1].props} | ${cases.video[1].attachment}
- ${6} | ${cases.image[1].render} | ${cases.image[1].attachment.type} | ${cases.image[1].props} | ${cases.image[1].attachment}
- ${7} | ${cases.audio[2].render} | ${cases.audio[2].attachment.type} | ${cases.audio[2].props} | ${cases.audio[2].attachment}
- ${8} | ${cases.video[2].render} | ${cases.video[2].attachment.type} | ${cases.video[2].props} | ${cases.video[2].attachment}
- ${9} | ${cases.image[2].render} | ${cases.image[2].attachment.type} | ${cases.image[2].props} | ${cases.image[2].attachment}
- ${10} | ${cases.audio[3].render} | ${cases.audio[3].attachment.type} | ${cases.audio[3].props} | ${cases.audio[3].attachment}
- ${11} | ${cases.video[3].render} | ${cases.video[3].attachment.type} | ${cases.video[3].props} | ${cases.video[3].attachment}
- ${12} | ${cases.image[3].render} | ${cases.image[3].attachment.type} | ${cases.image[3].props} | ${cases.image[3].attachment}
- ${13} | ${cases.audio[4].render} | ${cases.audio[4].attachment.type} | ${cases.audio[4].props} | ${cases.audio[4].attachment}
- ${14} | ${cases.video[4].render} | ${cases.video[4].attachment.type} | ${cases.video[4].props} | ${cases.video[4].attachment}
- ${15} | ${cases.image[4].render} | ${cases.image[4].attachment.type} | ${cases.image[4].props} | ${cases.image[4].attachment}
- ${16} | ${cases.audio[5].render} | ${cases.audio[5].attachment.type} | ${cases.audio[5].props} | ${cases.audio[5].attachment}
- ${17} | ${cases.video[5].render} | ${cases.video[5].attachment.type} | ${cases.video[5].props} | ${cases.video[5].attachment}
- ${18} | ${cases.image[5].render} | ${cases.image[5].attachment.type} | ${cases.image[5].props} | ${cases.image[5].attachment}
- ${19} | ${cases.audio[6].render} | ${cases.audio[6].attachment.type} | ${cases.audio[6].props} | ${cases.audio[6].attachment}
- ${20} | ${cases.video[6].render} | ${cases.video[6].attachment.type} | ${cases.video[6].props} | ${cases.video[6].attachment}
- ${21} | ${cases.image[6].render} | ${cases.image[6].attachment.type} | ${cases.image[6].props} | ${cases.image[6].attachment}
- ${22} | ${cases.audio[7].render} | ${cases.audio[7].attachment.type} | ${cases.audio[7].props} | ${cases.audio[7].attachment}
- ${23} | ${cases.video[7].render} | ${cases.video[7].attachment.type} | ${cases.video[7].props} | ${cases.video[7].attachment}
- ${24} | ${cases.image[7].render} | ${cases.image[7].attachment.type} | ${cases.image[7].props} | ${cases.image[7].attachment}
- ${25} | ${cases.audio[8].render} | ${cases.audio[8].attachment.type} | ${cases.audio[8].props} | ${cases.audio[8].attachment}
- ${26} | ${cases.video[8].render} | ${cases.video[8].attachment.type} | ${cases.video[8].props} | ${cases.video[8].attachment}
- ${27} | ${cases.audio[9].render} | ${cases.audio[9].attachment.type} | ${cases.audio[9].props} | ${cases.audio[9].attachment}
- ${28} | ${cases.video[9].render} | ${cases.video[9].attachment.type} | ${cases.video[9].props} | ${cases.video[9].attachment}
- `(
- '($num) should render $render if attachment type is $type and $props',
- async ({ attachment }) => {
- const { container } = await renderCard({
- cardProps: attachment,
- chatContext: { chatClient, themeVersion: '2' },
- render,
- });
-
- await waitFor(() => {
- expect(container).toMatchSnapshot();
- });
- },
- );
-
- it('should render giphy image if type is giphy', async () => {
+ props: 'og image URLs are not available',
+ render: `card with title and text only and without the image in the header part of the Card`,
+ },
+ {
+ attachment: { ...attachment, image_url: undefined },
+ props: 'thumb_url is available, but not image_url',
+ render: `image loaded from thumb_url`,
+ },
+ {
+ attachment: { ...attachment, thumb_url: undefined },
+ props: 'image_url is available, but not thumb_url',
+ render: `image loaded from image_url`,
+ },
+ );
+ }
+ return acc;
+ }, {});
+
+ it.each`
+ num | render | type | props | attachment
+ ${1} | ${cases.audio[0].render} | ${cases.audio[0].attachment.type} | ${cases.audio[0].props} | ${cases.audio[0].attachment}
+ ${2} | ${cases.video[0].render} | ${cases.video[0].attachment.type} | ${cases.video[0].props} | ${cases.video[0].attachment}
+ ${3} | ${cases.image[0].render} | ${cases.image[0].attachment.type} | ${cases.image[0].props} | ${cases.image[0].attachment}
+ ${4} | ${cases.audio[1].render} | ${cases.audio[1].attachment.type} | ${cases.audio[1].props} | ${cases.audio[1].attachment}
+ ${5} | ${cases.video[1].render} | ${cases.video[1].attachment.type} | ${cases.video[1].props} | ${cases.video[1].attachment}
+ ${6} | ${cases.image[1].render} | ${cases.image[1].attachment.type} | ${cases.image[1].props} | ${cases.image[1].attachment}
+ ${7} | ${cases.audio[2].render} | ${cases.audio[2].attachment.type} | ${cases.audio[2].props} | ${cases.audio[2].attachment}
+ ${8} | ${cases.video[2].render} | ${cases.video[2].attachment.type} | ${cases.video[2].props} | ${cases.video[2].attachment}
+ ${9} | ${cases.image[2].render} | ${cases.image[2].attachment.type} | ${cases.image[2].props} | ${cases.image[2].attachment}
+ ${10} | ${cases.audio[3].render} | ${cases.audio[3].attachment.type} | ${cases.audio[3].props} | ${cases.audio[3].attachment}
+ ${11} | ${cases.video[3].render} | ${cases.video[3].attachment.type} | ${cases.video[3].props} | ${cases.video[3].attachment}
+ ${12} | ${cases.image[3].render} | ${cases.image[3].attachment.type} | ${cases.image[3].props} | ${cases.image[3].attachment}
+ ${13} | ${cases.audio[4].render} | ${cases.audio[4].attachment.type} | ${cases.audio[4].props} | ${cases.audio[4].attachment}
+ ${14} | ${cases.video[4].render} | ${cases.video[4].attachment.type} | ${cases.video[4].props} | ${cases.video[4].attachment}
+ ${15} | ${cases.image[4].render} | ${cases.image[4].attachment.type} | ${cases.image[4].props} | ${cases.image[4].attachment}
+ ${16} | ${cases.audio[5].render} | ${cases.audio[5].attachment.type} | ${cases.audio[5].props} | ${cases.audio[5].attachment}
+ ${17} | ${cases.video[5].render} | ${cases.video[5].attachment.type} | ${cases.video[5].props} | ${cases.video[5].attachment}
+ ${18} | ${cases.image[5].render} | ${cases.image[5].attachment.type} | ${cases.image[5].props} | ${cases.image[5].attachment}
+ ${19} | ${cases.audio[6].render} | ${cases.audio[6].attachment.type} | ${cases.audio[6].props} | ${cases.audio[6].attachment}
+ ${20} | ${cases.video[6].render} | ${cases.video[6].attachment.type} | ${cases.video[6].props} | ${cases.video[6].attachment}
+ ${21} | ${cases.image[6].render} | ${cases.image[6].attachment.type} | ${cases.image[6].props} | ${cases.image[6].attachment}
+ ${22} | ${cases.audio[7].render} | ${cases.audio[7].attachment.type} | ${cases.audio[7].props} | ${cases.audio[7].attachment}
+ ${23} | ${cases.video[7].render} | ${cases.video[7].attachment.type} | ${cases.video[7].props} | ${cases.video[7].attachment}
+ ${24} | ${cases.image[7].render} | ${cases.image[7].attachment.type} | ${cases.image[7].props} | ${cases.image[7].attachment}
+ ${25} | ${cases.audio[8].render} | ${cases.audio[8].attachment.type} | ${cases.audio[8].props} | ${cases.audio[8].attachment}
+ ${26} | ${cases.video[8].render} | ${cases.video[8].attachment.type} | ${cases.video[8].props} | ${cases.video[8].attachment}
+ ${27} | ${cases.audio[9].render} | ${cases.audio[9].attachment.type} | ${cases.audio[9].props} | ${cases.audio[9].attachment}
+ ${28} | ${cases.video[9].render} | ${cases.video[9].attachment.type} | ${cases.video[9].props} | ${cases.video[9].attachment}
+ `(
+ '($num) should render $render if attachment type is $type and $props',
+ async ({ attachment }) => {
const { container } = await renderCard({
- cardProps: { attachment: generateGiphyAttachment() },
- chatContext: { chatClient, themeVersion: '2' },
+ cardProps: attachment,
+ chatContext: { chatClient },
render,
});
await waitFor(() => {
expect(container).toMatchSnapshot();
});
+ },
+ );
+
+ it('should render giphy image if type is giphy', async () => {
+ const { container } = await renderCard({
+ cardProps: { attachment: generateGiphyAttachment() },
+ chatContext: { chatClient },
+ render,
});
- it('should not render giphy image if url is not available', async () => {
- const { queryByTestId } = await renderCard({
- cardProps: { attachment: generateGiphyAttachment({ giphy: undefined }) },
- chatContext: { chatClient, themeVersion: '2' },
- render,
- });
- await waitFor(() => {
- expect(queryByTestId('card-header')).not.toBeInTheDocument();
- });
+ await waitFor(() => {
+ expect(container).toMatchSnapshot();
+ });
+ });
+ it('should not render giphy image if url is not available', async () => {
+ const { queryByTestId } = await renderCard({
+ cardProps: { attachment: generateGiphyAttachment({ giphy: undefined }) },
+ chatContext: { chatClient },
+ render,
});
- it('should display trimmed URL in caption if author_name is not available', async () => {
- const { getByText } = await renderCard({
- cardProps: {
- og_scrape_url:
- 'https://www.theverge.com/2020/6/15/21291288/sony-ps5-software-user-interface-ui-design-dashboard-teaser-video',
- title: 'test',
- },
- chatContext: { chatClient },
- });
- expect(getByText('theverge.com')).toBeInTheDocument();
+ await waitFor(() => {
+ expect(queryByTestId('card-header')).not.toBeInTheDocument();
+ });
+ });
+
+ it('should display trimmed URL in caption if author_name is not available', async () => {
+ const { getByText } = await renderCard({
+ cardProps: {
+ og_scrape_url:
+ 'https://www.theverge.com/2020/6/15/21291288/sony-ps5-software-user-interface-ui-design-dashboard-teaser-video',
+ title: 'test',
+ },
+ chatContext: { chatClient },
});
+ expect(getByText('theverge.com')).toBeInTheDocument();
});
});
diff --git a/src/components/Attachment/__tests__/File.test.js b/src/components/Attachment/__tests__/File.test.js
index 5f5f75394d..31df22475e 100644
--- a/src/components/Attachment/__tests__/File.test.js
+++ b/src/components/Attachment/__tests__/File.test.js
@@ -3,17 +3,13 @@ import '@testing-library/jest-dom';
import renderer from 'react-test-renderer';
import { FileAttachment } from '../FileAttachment';
-
-import { ChatContext } from '../../../context/ChatContext';
import { TranslationContext } from '../../../context';
import { mockTranslationContext } from '../../../mock-builders';
-const getComponent = ({ attachment, chatContext }) => (
-
-
-
-
-
+const getComponent = ({ attachment }) => (
+
+
+
);
const file = {
@@ -26,10 +22,8 @@ const file = {
};
describe('File', () => {
- it.each([['1'], ['2']])('should render File component in V%s', (themeVersion) => {
- const tree = renderer
- .create(getComponent({ attachment: file, chatContext: { themeVersion } }))
- .toJSON();
+ it('should render File component', () => {
+ const tree = renderer.create(getComponent({ attachment: file })).toJSON();
expect(tree).toMatchSnapshot();
});
});
diff --git a/src/components/Attachment/__tests__/__snapshots__/Audio.test.js.snap b/src/components/Attachment/__tests__/__snapshots__/Audio.test.js.snap
deleted file mode 100644
index ec86ca8f31..0000000000
--- a/src/components/Attachment/__tests__/__snapshots__/Audio.test.js.snap
+++ /dev/null
@@ -1,69 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Audio in v1 should render title and render the image with description as alt tag 1`] = `
-
-
-
-
-
-
-
-
-
-
-
-
- deterministic
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/components/Attachment/__tests__/__snapshots__/Card.test.js.snap b/src/components/Attachment/__tests__/__snapshots__/Card.test.js.snap
index 8ab0afbc48..eedea8c26b 100644
--- a/src/components/Attachment/__tests__/__snapshots__/Card.test.js.snap
+++ b/src/components/Attachment/__tests__/__snapshots__/Card.test.js.snap
@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Card theme V2 (1) should render card without caption if attachment type is audio and og_scrape_url neither title_link is available 1`] = `
+exports[`Card (1) should render card without caption if attachment type is audio and og_scrape_url neither title_link is available 1`] = `
`;
-exports[`Card theme V2 (2) should render card without caption if attachment type is video and og_scrape_url neither title_link is available 1`] = `
+exports[`Card (2) should render card without caption if attachment type is video and og_scrape_url neither title_link is available 1`] = `
-
-
+ />
`;
-exports[`Card theme V2 (3) should render card without caption if attachment type is image and og_scrape_url neither title_link is available 1`] = `
+exports[`Card (3) should render card without caption if attachment type is image and og_scrape_url neither title_link is available 1`] = `
`;
-exports[`Card theme V2 (4) should render unable-to-display card if attachment type is audio and neither image and asset urls nor title_link are available 1`] = `
+exports[`Card (4) should render unable-to-display card if attachment type is audio and neither image and asset urls nor title_link are available 1`] = `
`;
-exports[`Card theme V2 (5) should render unable-to-display card if attachment type is video and neither image and asset urls nor title_link are available 1`] = `
+exports[`Card (5) should render unable-to-display card if attachment type is video and neither image and asset urls nor title_link are available 1`] = `
`;
-exports[`Card theme V2 (6) should render unable-to-display card if attachment type is image and neither image and asset urls nor title_link are available 1`] = `
+exports[`Card (6) should render unable-to-display card if attachment type is image and neither image and asset urls nor title_link are available 1`] = `
`;
-exports[`Card theme V2 (7) should render audio with caption using og_scrape_url and with asset in header if attachment type is audio and title_link is not available 1`] = `
+exports[`Card (7) should render audio with caption using og_scrape_url and with asset in header if attachment type is audio and title_link is not available 1`] = `
`;
-exports[`Card theme V2 (8) should render video with caption using og_scrape_url and with asset in header if attachment type is video and title_link is not available 1`] = `
+exports[`Card (8) should render video with caption using og_scrape_url and with asset in header if attachment type is video and title_link is not available 1`] = `
`;
-exports[`Card theme V2 (9) should render image with caption using og_scrape_url and with asset in header if attachment type is image and title_link is not available 1`] = `
+exports[`Card (9) should render image with caption using og_scrape_url and with asset in header if attachment type is image and title_link is not available 1`] = `
`;
-exports[`Card theme V2 (10) should render audio without title if attachment type is audio and title is not available 1`] = `
+exports[`Card (10) should render audio without title if attachment type is audio and title is not available 1`] = `
`;
-exports[`Card theme V2 (11) should render video without title if attachment type is video and title is not available 1`] = `
+exports[`Card (11) should render video without title if attachment type is video and title is not available 1`] = `
`;
-exports[`Card theme V2 (12) should render image without title if attachment type is image and title is not available 1`] = `
+exports[`Card (12) should render image without title if attachment type is image and title is not available 1`] = `
`;
-exports[`Card theme V2 (13) should render audio without title and with caption using og_scrape_url and with image in header if attachment type is audio and title_link neither title is available 1`] = `
+exports[`Card (13) should render audio without title and with caption using og_scrape_url and with image in header if attachment type is audio and title_link neither title is available 1`] = `
`;
-exports[`Card theme V2 (14) should render video without title and with caption using og_scrape_url and with image in header if attachment type is video and title_link neither title is available 1`] = `
+exports[`Card (14) should render video without title and with caption using og_scrape_url and with image in header if attachment type is video and title_link neither title is available 1`] = `
`;
-exports[`Card theme V2 (15) should render image without title and with caption using og_scrape_url and with image in header if attachment type is image and title_link neither title is available 1`] = `
+exports[`Card (15) should render image without title and with caption using og_scrape_url and with image in header if attachment type is image and title_link neither title is available 1`] = `
`;
-exports[`Card theme V2 (16) should render audio widget with title & text in Card content and without Card header if attachment type is audio and og image URLs are not available 1`] = `
+exports[`Card (16) should render audio widget with title & text in Card content and without Card header if attachment type is audio and og image URLs are not available 1`] = `