+ {isDragRejected ? (
+
{t('Some of the files will not be accepted')}
+ ) : (
+ <>
+
+
{t('Drag your files here')}
+ >
+ )}
+
+ );
+};
diff --git a/src/components/MessageInput/index.ts b/src/components/MessageInput/index.ts
index 37be037392..f9d2a64cd4 100644
--- a/src/components/MessageInput/index.ts
+++ b/src/components/MessageInput/index.ts
@@ -18,4 +18,8 @@ export * from './MessageInput';
export * from './MessageInputFlat';
export * from './QuotedMessagePreview';
export * from './SendButton';
-export { WithDragAndDropUpload } from './WithDragAndDropUpload';
+export {
+ FileDragAndDropContent,
+ type FileDragAndDropContentProps,
+ WithDragAndDropUpload,
+} from './WithDragAndDropUpload';
diff --git a/src/components/MessageInput/styling/DropzoneContainer.scss b/src/components/MessageInput/styling/DropzoneContainer.scss
new file mode 100644
index 0000000000..d973b437ea
--- /dev/null
+++ b/src/components/MessageInput/styling/DropzoneContainer.scss
@@ -0,0 +1,65 @@
+.str-chat {
+ /* The text/icon color of the dropzone container */
+ --str-chat__dropzone-container-color: var(--text-primary);
+
+ /* The background color of the dropzone container */
+ --str-chat__dropzone-container-background-color: var(--background-core-overlay-light);
+
+ /* The backdrop filter applied to the dropzone container */
+ --str-chat__dropzone-container-backdrop-filter: blur(3.5px);
+}
+
+.str-chat__dropzone-root {
+ position: relative;
+ min-height: 0;
+ min-width: 0;
+ max-width: 100%;
+ max-height: 100%;
+ flex: 1;
+}
+
+// When wrapper has no content (e.g. Thread returns null when closed), take no space — keeps wrapper mounted to avoid remounts.
+.str-chat__dropzone-root:empty {
+ display: none;
+}
+
+.str-chat__dropzone-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: absolute;
+ inset: 0;
+ z-index: 5;
+ background-color: var(--str-chat__dropzone-container-background-color);
+ color: var(--str-chat__dropzone-container-color);
+ backdrop-filter: var(--str-chat__dropzone-container-backdrop-filter);
+ font: var(--str-chat__heading-sm-text);
+
+ .str-chat__dropzone-container__content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--spacing-xs, 8px);
+ }
+
+ svg {
+ height: 32px;
+ width: 32px;
+ }
+
+ p {
+ margin: unset;
+
+ }
+}
+
+// When backdrop-filter is not supported, use a dimmed background only (no blur).
+@supports not (backdrop-filter: blur(1px)) {
+ .str-chat__dropzone-container {
+ backdrop-filter: none;
+ background-color: var(
+ --str-chat__dropzone-container-background-color-fallback,
+ rgba(0, 0, 0, 0.4)
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/components/MessageInput/styling/index.scss b/src/components/MessageInput/styling/index.scss
index 26fe1a357f..fdd206e8f4 100644
--- a/src/components/MessageInput/styling/index.scss
+++ b/src/components/MessageInput/styling/index.scss
@@ -2,6 +2,7 @@
@use 'AttachmentPreviewThumbnail';
@use 'AttachmentSelector';
@use 'CommandChip';
+@use 'DropzoneContainer';
@use 'CommandsMenu';
@use 'LinkPreviewList';
@use 'MessageComposer';
diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx
index 5784a73ba1..296ea30e58 100644
--- a/src/context/ComponentContext.tsx
+++ b/src/context/ComponentContext.tsx
@@ -13,6 +13,7 @@ import type {
EmojiSearchIndex,
EmptyStateIndicatorProps,
EventComponentProps,
+ FileDragAndDropContentProps,
FixedHeightMessageProps,
GalleryProps,
GiphyPreviewMessageProps,
@@ -103,6 +104,8 @@ export type ComponentContextValue = {
CooldownTimer?: React.ComponentType;
/** Custom UI component for date separators, defaults to and accepts same props as: [DateSeparator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/DateSeparator.tsx) */
DateSeparator?: React.ComponentType