diff --git a/client/src/app/layout/MainLayout.tsx b/client/src/app/layout/MainLayout.tsx
index ddc01f2..8d49510 100644
--- a/client/src/app/layout/MainLayout.tsx
+++ b/client/src/app/layout/MainLayout.tsx
@@ -18,7 +18,7 @@ export function MainLayout({ children }: PropsWithChildren) {
-
+
{children}
@@ -29,32 +29,29 @@ export function MainLayout({ children }: PropsWithChildren) {
borderTop: 1,
borderColor: 'divider',
bgcolor: 'background.default',
- py: { xs: 3, md: 4 },
+ py: { xs: 4, md: 6 },
}}
>
-
+
-
+
Магазин
-
+
Каталог
-
- Политика конфиденциальности
-
Изделия ручной работы: вещи с характером и вниманием к деталям.
-
+
Покупателям
-
+
Личный кабинет
@@ -67,10 +64,10 @@ export function MainLayout({ children }: PropsWithChildren) {
-
+
Контакты
-
+
Email:{' '}
@@ -97,15 +94,26 @@ export function MainLayout({ children }: PropsWithChildren) {
+
+
+ Юридическая информация
+
+
+
+ Политика конфиденциальности
+
+
+ Пользовательское соглашение
+
+
+
-
-
- © {year} {STORE_NAME}
-
+
+
+
+ © {year} {STORE_NAME}
+
+
diff --git a/client/src/app/providers/AppProviders.tsx b/client/src/app/providers/AppProviders.tsx
index ad90173..2ce3a99 100644
--- a/client/src/app/providers/AppProviders.tsx
+++ b/client/src/app/providers/AppProviders.tsx
@@ -24,97 +24,135 @@ function AppThemeInner({ children }: PropsWithChildren) {
case 'forest':
return {
...common,
- primary: { main: isDark ? '#4CAF50' : '#2E7D32' },
- secondary: { main: isDark ? '#A1887F' : '#6D4C41' },
- info: { main: isDark ? '#29B6F6' : '#0288D1' },
- success: { main: isDark ? '#66BB6A' : '#2E7D32' },
- warning: { main: isDark ? '#FFB74D' : '#ED6C02' },
- error: { main: isDark ? '#EF5350' : '#D32F2F' },
- divider: isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.10)',
+ primary: { main: isDark ? '#8FBC8F' : '#2E8B57' },
+ secondary: { main: isDark ? '#CD853F' : '#8B4513' },
+ info: { main: isDark ? '#4682B4' : '#1E90FF' },
+ success: { main: isDark ? '#90EE90' : '#32CD32' },
+ warning: { main: isDark ? '#FFD700' : '#FFA500' },
+ error: { main: isDark ? '#F08080' : '#CD5C5C' },
+ divider: isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.08)',
text,
chip,
background: isDark
- ? { default: '#0E1510', paper: '#121B14' }
- : { default: '#F6FAF6', paper: '#FFFFFF' },
+ ? { default: '#0F1720', paper: '#1A242E' }
+ : { default: '#F8F6F3', paper: '#FFFFFF' },
}
case 'ocean':
return {
...common,
- primary: { main: isDark ? '#42A5F5' : '#1565C0' },
- secondary: { main: isDark ? '#4DD0E1' : '#00838F' },
- info: { main: isDark ? '#4FC3F7' : '#0288D1' },
- success: { main: isDark ? '#26C6DA' : '#00838F' },
- warning: { main: isDark ? '#FFCC80' : '#ED6C02' },
- error: { main: isDark ? '#EF5350' : '#D32F2F' },
- divider: isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.10)',
+ primary: { main: isDark ? '#5F9EA0' : '#20B2AA' },
+ secondary: { main: isDark ? '#7B68EE' : '#6A5ACD' },
+ info: { main: isDark ? '#87CEEB' : '#00BFFF' },
+ success: { main: isDark ? '#98FB98' : '#00FA9A' },
+ warning: { main: isDark ? '#FFE4B5' : '#FFDAB9' },
+ error: { main: isDark ? '#FF6347' : '#FF4500' },
+ divider: isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.08)',
text,
chip,
background: isDark
- ? { default: '#0B1220', paper: '#0F172A' }
- : { default: '#F6FAFF', paper: '#FFFFFF' },
+ ? { default: '#0A1A2A', paper: '#0F1D35' }
+ : { default: '#F0F8FF', paper: '#FFFFFF' },
}
case 'berry':
return {
...common,
- primary: { main: isDark ? '#BA68C8' : '#7B1FA2' },
- secondary: { main: isDark ? '#F06292' : '#C2185B' },
- info: { main: isDark ? '#64B5F6' : '#1976D2' },
- success: { main: isDark ? '#81C784' : '#2E7D32' },
- warning: { main: isDark ? '#FFB74D' : '#ED6C02' },
- error: { main: isDark ? '#EF5350' : '#D32F2F' },
- divider: isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.10)',
+ primary: { main: isDark ? '#9370DB' : '#8A2BE2' },
+ secondary: { main: isDark ? '#FF69B4' : '#FF1493' },
+ info: { main: isDark ? '#00CED1' : '#00BFFF' },
+ success: { main: isDark ? '#00FF7F' : '#7CFC00' },
+ warning: { main: isDark ? '#FFD700' : '#FFA500' },
+ error: { main: isDark ? '#FF4500' : '#FF6347' },
+ divider: isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.08)',
text,
chip,
background: isDark
- ? { default: '#140A17', paper: '#1B0F20' }
- : { default: '#FFF7FD', paper: '#FFFFFF' },
+ ? { default: '#1A0A1A', paper: '#250E25' }
+ : { default: '#FFF0F5', paper: '#FFFFFF' },
}
case 'craft':
default:
return {
...common,
- primary: { main: isDark ? '#BCAAA4' : '#6D4C41' },
- secondary: { main: isDark ? '#FFCCBC' : '#8D6E63' },
- info: { main: isDark ? '#90CAF9' : '#1976D2' },
- success: { main: isDark ? '#A5D6A7' : '#2E7D32' },
- warning: { main: isDark ? '#FFB74D' : '#ED6C02' },
- error: { main: isDark ? '#EF9A9A' : '#D32F2F' },
- divider: isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.10)',
+ primary: { main: isDark ? '#A0522D' : '#8B4513' },
+ secondary: { main: isDark ? '#D2B48C' : '#DEB887' },
+ info: { main: isDark ? '#6495ED' : '#4169E1' },
+ success: { main: isDark ? '#9ACD32' : '#6B8E23' },
+ warning: { main: isDark ? '#F4A460' : '#CD853F' },
+ error: { main: isDark ? '#DC143C' : '#B22222' },
+ divider: isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.08)',
text,
chip,
background: isDark
- ? { default: '#12100F', paper: '#191615' }
- : { default: '#FAF8F5', paper: '#FFFFFF' },
+ ? { default: '#1A1410', paper: '#251E17' }
+ : { default: '#FAF9F6', paper: '#FFFFFF' },
}
}
})(),
shape: { borderRadius: 12 },
typography: {
- fontFamily: '"Segoe UI", system-ui, sans-serif',
- h4: { fontWeight: 700 },
- h5: { fontWeight: 600 },
+ fontFamily: '"Outfit", "Segoe UI", system-ui, sans-serif',
+ h4: { fontWeight: 700, letterSpacing: '-0.5px' },
+ h5: { fontWeight: 600, letterSpacing: '-0.25px' },
+ h6: { fontWeight: 600 },
+ subtitle1: { fontWeight: 600 },
+ subtitle2: { fontWeight: 500 },
+ body1: { fontSize: '0.875rem' },
+ body2: { fontSize: '0.75rem' },
+ button: { textTransform: 'none', fontWeight: 600 },
},
components: {
MuiButton: {
styleOverrides: {
- root: { textTransform: 'none', borderRadius: 12, fontWeight: 600 },
+ root: {
+ textTransform: 'none',
+ borderRadius: 12,
+ fontWeight: 600,
+ transition: 'all 0.2s ease-in-out',
+ },
contained: {
boxShadow: '0 4px 14px 0 rgba(0,0,0,0.15)',
'&:hover': {
boxShadow: '0 6px 20px 0 rgba(0,0,0,0.25)',
- transform: 'translateY(-1px)',
+ transform: 'translateY(-2px)',
+ },
+ '&:active': {
+ boxShadow: '0 2px 8px 0 rgba(0,0,0,0.15)',
+ transform: 'translateY(0)',
},
},
outlined: {
- '&:hover': { boxShadow: '0 2px 8px 0 rgba(0,0,0,0.1)' },
+ border: '1px solid',
+ '&:hover': {
+ boxShadow: '0 2px 8px 0 rgba(0,0,0,0.1)',
+ borderWidth: '2px',
+ },
+ '&:active': {
+ boxShadow: 'none',
+ },
+ },
+ text: {
+ '&:hover': {
+ boxShadow: '0 1px 3px 0 rgba(0,0,0,0.1)',
+ backgroundColor: 'action.hover',
+ },
+ '&:active': {
+ backgroundColor: 'action.selected',
+ },
},
},
},
MuiIconButton: {
styleOverrides: {
root: {
- transition: 'all 0.2s ease',
- '&:hover': { transform: 'scale(1.1)' },
+ transition: 'all 0.2s ease-in-out',
+ '&:hover': {
+ backgroundColor: 'action.hover',
+ transform: 'scale(1.1)',
+ },
+ '&:active': {
+ backgroundColor: 'action.selected',
+ transform: 'scale(0.95)',
+ },
},
},
},
diff --git a/client/src/app/routes/index.tsx b/client/src/app/routes/index.tsx
index b40af29..a2b1a20 100644
--- a/client/src/app/routes/index.tsx
+++ b/client/src/app/routes/index.tsx
@@ -1,5 +1,5 @@
import { lazy, Suspense } from 'react'
-import { Navigate, Route, Routes } from 'react-router-dom'
+import { Route, Routes } from 'react-router-dom'
import { MainLayout } from '@/app/layout/MainLayout'
import { AboutPage } from '@/pages/about'
// import { AdminLayoutPage } from '@/pages/admin-layout'
@@ -9,8 +9,10 @@ import { CheckoutPage } from '@/pages/checkout'
import { HomePage } from '@/pages/home'
import { InfoPage } from '@/pages/info'
// import { MeLayoutPage } from '@/pages/me'
+import { NotFoundPage } from '@/pages/not-found'
import { PrivacyPolicyPage } from '@/pages/privacy-policy'
import { ProductPage } from '@/pages/product'
+import { TermsPage } from '@/pages/terms'
import { SkeletonPage } from '@/shared/ui/SkeletonPage'
const AdminLayoutPage = lazy(() => import('@/pages/admin-layout').then((m) => ({ default: m.AdminLayoutPage })))
@@ -36,6 +38,7 @@ export function AppRoutes() {
} />
} />
} />
+ } />
} />
- } />
+ } />
)
diff --git a/client/src/pages/not-found/index.ts b/client/src/pages/not-found/index.ts
new file mode 100644
index 0000000..4773243
--- /dev/null
+++ b/client/src/pages/not-found/index.ts
@@ -0,0 +1 @@
+export { NotFoundPage } from './ui/NotFoundPage'
diff --git a/client/src/pages/not-found/ui/NotFoundPage.tsx b/client/src/pages/not-found/ui/NotFoundPage.tsx
new file mode 100644
index 0000000..f3fd34a
--- /dev/null
+++ b/client/src/pages/not-found/ui/NotFoundPage.tsx
@@ -0,0 +1,46 @@
+import { Box, Typography, Button, Stack, Paper } from '@mui/material'
+import { Link as RouterLink } from 'react-router-dom'
+
+export function NotFoundPage() {
+ return (
+
+
+
+ 404
+
+ Страница не найдена
+
+
+ Извините, но запрашиваемая страница не существует или была удалена.
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/client/src/pages/product/ui/ProductPage.tsx b/client/src/pages/product/ui/ProductPage.tsx
index 0cc428e..01fbc58 100644
--- a/client/src/pages/product/ui/ProductPage.tsx
+++ b/client/src/pages/product/ui/ProductPage.tsx
@@ -194,7 +194,14 @@ export function ProductPage() {
{reviewsQuery.isLoading && Загрузка отзывов…}
{reviewsQuery.isError && Не удалось загрузить отзывы.}
{reviewsQuery.data && reviewsQuery.data.total === 0 && (
- Пока нет опубликованных отзывов на этот товар.
+
+
+ Отзывов пока нет
+
+
+ Будьте первым, кто оставит отзыв на этот товар. Ваше мнение поможет улучшить качество наших изделий.
+
+
)}
{reviewsQuery.data && reviewsQuery.data.items.length > 0 && (
diff --git a/client/src/pages/terms/index.ts b/client/src/pages/terms/index.ts
new file mode 100644
index 0000000..2f6018a
--- /dev/null
+++ b/client/src/pages/terms/index.ts
@@ -0,0 +1 @@
+export { TermsPage } from './ui/TermsPage'
diff --git a/client/src/pages/terms/ui/TermsPage.tsx b/client/src/pages/terms/ui/TermsPage.tsx
new file mode 100644
index 0000000..ed6fe68
--- /dev/null
+++ b/client/src/pages/terms/ui/TermsPage.tsx
@@ -0,0 +1,69 @@
+import { Box, Typography, Button, Stack } from '@mui/material'
+import { Link as RouterLink } from 'react-router-dom'
+
+export function TermsPage() {
+ return (
+
+
+
+ Пользовательское соглашение
+
+
+
+ Последнее обновление: 18 мая 2026 г.
+
+
+
+
+ 1. ОБЩИЕ ПОЛОЖЕНИЯ
+
+
+ Настоящее пользовательское соглашение (далее – «Соглашение») регулирует отношения между пользователями сайта
+ и администрацией сайта в связи с использованием сайта Любимый Креатив.
+
+
+
+ 2. ПРЕДМЕТ СОГЛАШЕНИЯ
+
+
+ Сайт предоставляет пользователям возможность ознакомиться с информацией о товарах, совершать покупки и
+ оставлять отзывы.
+
+
+
+ 3. ПРАВА И ОБЯЗАННОСТИ ПОЛЬЗОВАТЕЛЯ
+
+
+ Пользователь обязуется предоставлять достоверную информацию при регистрации и оформлении заказов, не
+ использовать сайт в незаконных целях, соблюдать правила поведения при оставлении отзывов и комментариев.
+
+
+
+ 4. ОТВЕТСТВЕННОСТЬ
+
+
+ Администрация сайта не несет ответственности за прямые или косвенные убытки, возникшие в результате
+ использования информации, размещенной на сайте.
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx
index 0acc819..5fc196b 100644
--- a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx
+++ b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx
@@ -53,7 +53,15 @@ export function ReviewsBlock() {
)}
{q.isError && Не удалось загрузить отзывы.}
{!q.isLoading && !q.isError && q.data && items.length === 0 && (
- Пока нет опубликованных отзывов о товарах.
+
+
+ Отзывов пока нет
+
+
+ Будьте первым, кто оставит отзыв о наших товарах. Ваше мнение поможет другим покупателям сделать правильный
+ выбор.
+
+
)}
{items.length > 0 && (