diff --git a/client/src/features/order-chat/ui/OrderChat.tsx b/client/src/features/order-chat/ui/OrderChat.tsx
index ad07c43..7346365 100644
--- a/client/src/features/order-chat/ui/OrderChat.tsx
+++ b/client/src/features/order-chat/ui/OrderChat.tsx
@@ -9,7 +9,7 @@ import { fetchAdminAvatar } from '@/entities/user/api/user-api'
import { $user } from '@/shared/model/auth'
import { ChatMessageBubble } from '@/shared/ui/ChatMessageBubble'
import { OrderMessageBody } from '@/shared/ui/OrderMessageBody'
-import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor'
+import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor.lazy'
import { UserAvatar } from '@/shared/ui/UserAvatar'
type Message = {
diff --git a/client/src/features/order-detail/ui/OrderDetailContent.tsx b/client/src/features/order-detail/ui/OrderDetailContent.tsx
index 36f5b0c..e935ae1 100644
--- a/client/src/features/order-detail/ui/OrderDetailContent.tsx
+++ b/client/src/features/order-detail/ui/OrderDetailContent.tsx
@@ -21,7 +21,7 @@ import { orderStatusLabelRu } from '@/shared/lib/order-status-labels'
import { $user } from '@/shared/model/auth'
import { ChatMessageBubble } from '@/shared/ui/ChatMessageBubble'
import { OrderMessageBody } from '@/shared/ui/OrderMessageBody'
-import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor'
+import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor.lazy'
import { UserAvatar } from '@/shared/ui/UserAvatar'
import { DeliveryFeeAdjustmentForm } from './DeliveryFeeAdjustmentForm'
diff --git a/client/src/features/product-review/ui/ProductReviewsList.tsx b/client/src/features/product-review/ui/ProductReviewsList.tsx
index 130950f..db7167e 100644
--- a/client/src/features/product-review/ui/ProductReviewsList.tsx
+++ b/client/src/features/product-review/ui/ProductReviewsList.tsx
@@ -10,7 +10,7 @@ import { fetchPublicProductReviews } from '@/entities/review/api/reviews-api'
import type { PublicProductReviewItem } from '@/entities/review/api/reviews-api'
import { reviewsCountRu } from '@/shared/lib/reviews-count-ru'
import { OptimizedImage } from '@/shared/ui/OptimizedImage'
-import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent'
+import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent.lazy'
import { UserAvatar } from '@/shared/ui/UserAvatar'
function ReviewItem({ rv }: { rv: PublicProductReviewItem }) {
diff --git a/client/src/features/product-review/ui/ReviewDialog.tsx b/client/src/features/product-review/ui/ReviewDialog.tsx
index 959ad2c..257699d 100644
--- a/client/src/features/product-review/ui/ReviewDialog.tsx
+++ b/client/src/features/product-review/ui/ReviewDialog.tsx
@@ -10,7 +10,7 @@ import Rating from '@mui/material/Rating'
import Stack from '@mui/material/Stack'
import Typography from '@mui/material/Typography'
import axios from 'axios'
-import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor'
+import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor.lazy'
type Props = {
productTitle: string | null
diff --git a/client/src/pages/admin-reviews/ui/AdminReviewsPage.tsx b/client/src/pages/admin-reviews/ui/AdminReviewsPage.tsx
index e356f0f..9e8fdcf 100644
--- a/client/src/pages/admin-reviews/ui/AdminReviewsPage.tsx
+++ b/client/src/pages/admin-reviews/ui/AdminReviewsPage.tsx
@@ -15,7 +15,7 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { fetchAdminReviews, moderateReview } from '@/entities/review/api/admin-review-api'
import { getErrorMessage } from '@/shared/lib/get-error-message'
import { invalidateQueryKeys } from '@/shared/lib/invalidate-query-keys'
-import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent'
+import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent.lazy'
export function AdminReviewsPage() {
const qc = useQueryClient()
diff --git a/client/src/pages/me/ui/sections/MessagesPage.tsx b/client/src/pages/me/ui/sections/MessagesPage.tsx
index b558264..e28df4c 100644
--- a/client/src/pages/me/ui/sections/MessagesPage.tsx
+++ b/client/src/pages/me/ui/sections/MessagesPage.tsx
@@ -20,8 +20,8 @@ import { usePageTitle } from '@/shared/lib/use-page-title'
import { $user } from '@/shared/model/auth'
import { ChatMessageBubble } from '@/shared/ui/ChatMessageBubble'
import { OrderMessageBody } from '@/shared/ui/OrderMessageBody'
-import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent'
-import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor'
+import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent.lazy'
+import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor.lazy'
import { UserAvatar } from '@/shared/ui/UserAvatar'
export function MessagesPage() {
diff --git a/client/src/shared/ui/OrderMessageBody.tsx b/client/src/shared/ui/OrderMessageBody.tsx
index ac98ba3..2ceb1d1 100644
--- a/client/src/shared/ui/OrderMessageBody.tsx
+++ b/client/src/shared/ui/OrderMessageBody.tsx
@@ -1,5 +1,5 @@
import Box from '@mui/material/Box'
-import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent'
+import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent.lazy'
type Props = {
text: string
diff --git a/client/src/shared/ui/RichTextMessageContent.lazy.tsx b/client/src/shared/ui/RichTextMessageContent.lazy.tsx
new file mode 100644
index 0000000..b955c7d
--- /dev/null
+++ b/client/src/shared/ui/RichTextMessageContent.lazy.tsx
@@ -0,0 +1,26 @@
+import { lazy, Suspense } from 'react'
+import Box from '@mui/material/Box'
+import CircularProgress from '@mui/material/CircularProgress'
+
+const RichTextMessageContentImpl = lazy(() =>
+ import('./RichTextMessageContent').then((m) => ({ default: m.RichTextMessageContent })),
+)
+
+type RichTextMessageContentProps = {
+ value: string
+ tone?: 'default' | 'review' | 'chat'
+}
+
+export function RichTextMessageContent(props: RichTextMessageContentProps) {
+ return (
+
+
+
+ }
+ >
+
+
+ )
+}
diff --git a/client/src/shared/ui/RichTextMessageEditor.lazy.tsx b/client/src/shared/ui/RichTextMessageEditor.lazy.tsx
new file mode 100644
index 0000000..dd54cc6
--- /dev/null
+++ b/client/src/shared/ui/RichTextMessageEditor.lazy.tsx
@@ -0,0 +1,28 @@
+import { lazy, Suspense } from 'react'
+import Box from '@mui/material/Box'
+import CircularProgress from '@mui/material/CircularProgress'
+
+const RichTextMessageEditorImpl = lazy(() =>
+ import('./RichTextMessageEditor').then((m) => ({ default: m.RichTextMessageEditor })),
+)
+
+type RichTextMessageEditorProps = {
+ value: string
+ onChange: (next: string) => void
+ placeholder?: string
+ disabled?: boolean
+}
+
+export function RichTextMessageEditor(props: RichTextMessageEditorProps) {
+ return (
+
+
+
+ }
+ >
+
+
+ )
+}
diff --git a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx
index a288fca..20a4fb3 100644
--- a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx
+++ b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx
@@ -10,7 +10,7 @@ import { useQuery } from '@tanstack/react-query'
import { Link as RouterLink } from 'react-router-dom'
import { fetchLatestApprovedReviews } from '@/entities/review/api/reviews-api'
import { OptimizedImage } from '@/shared/ui/OptimizedImage'
-import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent'
+import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent.lazy'
import { UserAvatar } from '@/shared/ui/UserAvatar'
function formatReviewDate(iso: string): string {