diff --git a/client/src/app/layout/MainLayout.tsx b/client/src/app/layout/MainLayout.tsx index 8d49510..04900e2 100644 --- a/client/src/app/layout/MainLayout.tsx +++ b/client/src/app/layout/MainLayout.tsx @@ -34,7 +34,7 @@ export function MainLayout({ children }: PropsWithChildren) { > - + Магазин @@ -47,7 +47,7 @@ export function MainLayout({ children }: PropsWithChildren) { - + Покупателям @@ -63,7 +63,7 @@ export function MainLayout({ children }: PropsWithChildren) { - + Контакты @@ -94,7 +94,7 @@ export function MainLayout({ children }: PropsWithChildren) { - + Юридическая информация diff --git a/client/src/app/providers/AppProviders.tsx b/client/src/app/providers/AppProviders.tsx index 2ce3a99..c1eb273 100644 --- a/client/src/app/providers/AppProviders.tsx +++ b/client/src/app/providers/AppProviders.tsx @@ -73,18 +73,18 @@ function AppThemeInner({ children }: PropsWithChildren) { default: return { ...common, - 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' }, + primary: { main: isDark ? '#90A4AE' : '#546E7A' }, + secondary: { main: isDark ? '#78909C' : '#78909C' }, + info: { main: isDark ? '#7986CB' : '#3F51B5' }, + success: { main: isDark ? '#66BB6A' : '#43A047' }, + warning: { main: isDark ? '#FFB74D' : '#F57C00' }, + error: { main: isDark ? '#EF5350' : '#D32F2F' }, divider: isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.08)', text, chip, background: isDark - ? { default: '#1A1410', paper: '#251E17' } - : { default: '#FAF9F6', paper: '#FFFFFF' }, + ? { default: '#121212', paper: '#1E1E1E' } + : { default: '#F5F5F5', paper: '#FFFFFF' }, } } })(), diff --git a/client/src/pages/product/ui/ProductPage.tsx b/client/src/pages/product/ui/ProductPage.tsx index 01fbc58..7b95c27 100644 --- a/client/src/pages/product/ui/ProductPage.tsx +++ b/client/src/pages/product/ui/ProductPage.tsx @@ -194,7 +194,7 @@ export function ProductPage() { {reviewsQuery.isLoading && Загрузка отзывов…} {reviewsQuery.isError && Не удалось загрузить отзывы.} {reviewsQuery.data && reviewsQuery.data.total === 0 && ( - + Отзывов пока нет diff --git a/client/src/pages/terms/ui/TermsPage.tsx b/client/src/pages/terms/ui/TermsPage.tsx index ed6fe68..e5340bf 100644 --- a/client/src/pages/terms/ui/TermsPage.tsx +++ b/client/src/pages/terms/ui/TermsPage.tsx @@ -1,68 +1,210 @@ -import { Box, Typography, Button, Stack } from '@mui/material' -import { Link as RouterLink } from 'react-router-dom' +import Box from '@mui/material/Box' +import Paper from '@mui/material/Paper' +import Typography from '@mui/material/Typography' +import { STORE_EMAIL, STORE_PUBLIC_SITE_URL } from '@/shared/config' + +const SITE_URL = STORE_PUBLIC_SITE_URL || (typeof window !== 'undefined' ? window.location.origin : '') + +const OP_NAME = 'Индивидуальный предприниматель Новоселова Наталия Владимировна' +const OP_INN = '402900832341' +const OP_OGRN = '305402922700051' +const OP_ADDR = '248000, Россия, г. Калуга, ул. Никитина, д. 12А' + +const sections = [ + { + title: '1. Общие положения', + items: [ + `1.1. Настоящее Пользовательское соглашение (далее — «Соглашение») определяет порядок и условия использования материалов и сервисов, размещённых в сети Интернет по адресу ${SITE_URL} (далее — «Сайт»), Пользователями данного Сайта.`, + `1.2. Использование Пользователями Сайта означает, что они безоговорочно принимают и обязуются соблюдать все условия настоящего Соглашения.`, + '1.3. В настоящем Соглашении используются следующие термины:', + `— Администратор — ${OP_NAME}, ИНН ${OP_INN}, ОГРН ${OP_OGRN}, адрес: ${OP_ADDR}, которому принадлежат все соответствующие права на Сайт.`, + `— Акцепт — полное и безоговорочное принятие условий настоящего Соглашения, размещённого на Сайте по адресу ${SITE_URL}/terms, осуществляемое путём совершения Пользователем любых действий по использованию Сайта.`, + '— Аутентификационные данные Пользователя — адрес электронной почты Пользователя и пароль (код доступа), которые в совокупности признаются простой электронной подписью Пользователя.', + '— Пользователь — лицо, осуществляющее доступ к Сайту и использующее материалы и сервисы, размещённые на Сайте.', + '— Контент — любое информационно значимое наполнение Сайта, включая фото, текст и иные медиаматериалы.', + '— Личный кабинет — персонализированная часть Сайта, посредством которой обеспечивается обмен информацией между Пользователем и Сайтом.', + '— Персональные данные — любая информация, относящаяся к определённому или определяемому на основании такой информации физическому лицу.', + '— Обработка персональных данных — любое действие (операция) или совокупность действий с персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение, использование, передачу, обезличивание, блокирование, удаление, уничтожение.', + `— Сайт — ресурс в сети Интернет по адресу ${SITE_URL}, представляющий собой совокупность информации и объектов интеллектуальной собственности.`, + ], + }, + { + title: '2. Предмет соглашения', + items: [ + '2.1. В соответствии с настоящим Соглашением Администратор предоставляет любому Пользователю право безвозмездного использования Сайта в пределах его объявленных функциональных возможностей.', + '2.2. Использование Сайта осуществляется в соответствии с принципом «как есть» (as is). Администратор не гарантирует, что Сайт будет работать непрерывно, быстро и без ошибок.', + '2.3. Пользователь считается присоединившимся к Соглашению в соответствии со ст. 438 ГК РФ при совершении любых из следующих действий:', + '— просмотр материалов, размещённых на Сайте;', + '— использование сервисов Сайта;', + '— регистрация в Личном кабинете;', + '— направление сообщений с использованием онлайн-форм на Сайте;', + '— иное использование Сайта.', + '2.4. Используя Сайт, Пользователь подтверждает, что ознакомился с условиями Соглашения в полном объёме и безоговорочно принимает их.', + '2.5. Положения Соглашения не устанавливают между Администратором и Пользователем агентских отношений, отношений товарищества или иных отношений, прямо не предусмотренных Соглашением.', + '2.6. Все возможные споры, вытекающие из Соглашения, подлежат разрешению в соответствии с действующим законодательством РФ.', + ], + }, + { + title: '3. Регистрация', + items: [ + '3.1. Для использования отдельных функций Сайта Пользователю необходимо пройти процедуру регистрации, в результате которой ему будет предоставлен доступ в Личный кабинет.', + '3.2. При регистрации Пользователь обязуется предоставить достоверную и полную информацию и поддерживать её в актуальном состоянии.', + '3.3. В случае предоставления неверной информации Администратор вправе заблокировать Личный кабинет либо удалить учётную запись Пользователя.', + '3.4. Пользователь самостоятельно несёт ответственность за сохранность своих Аутентификационных данных и за все действия, совершённые с их использованием.', + '3.5. Пользователь обязан незамедлительно уведомить Администратора о любом случае несанкционированного доступа к Личному кабинету.', + '3.6. Пользователь не вправе воспроизводить, копировать, продавать и использовать в коммерческих целях Сайт или его Контент без разрешения Администратора.', + '3.7. При регистрации Пользователь даёт согласие на получение информационных и рекламных сообщений от Администратора на указанный адрес электронной почты.', + ], + }, + { + title: '4. Права и обязанности Администратора', + items: [ + '4.1. Администратор вправе осуществлять сбор мнений и отзывов Пользователей для формирования статистических данных и улучшения качества Сайта.', + '4.2. Администратор вправе направлять Пользователю информационные сообщения, связанные с функционированием Сайта, исполнением договоров, восстановлением пароля.', + '4.3. Администратор оставляет за собой право заблокировать Личный кабинет Пользователя в случае нарушения условий Соглашения.', + '4.4. Сайт может быть частично или полностью недоступен по причине проведения технических работ. Администратор вправе приостанавливать работу Сайта по своему усмотрению.', + '4.5. Администратор не несёт ответственности за ошибки, сбои линий связи, неправомерный доступ к информации Пользователя, возникшие не по вине Администратора.', + '4.6. Администратор предпримет разумные усилия для устранения технических сбоев и ошибок, но не гарантирует их полного отсутствия.', + '4.7. Пользователю не предоставляется никаких интеллектуальных прав на Сайт и его составные части, кроме прямо предусмотренных Соглашением.', + ], + }, + { + title: '5. Права и обязанности Пользователя', + items: [ + '5.1. Пользователь обязуется знакомиться с актуальной версией Соглашения при каждом посещении Сайта.', + '5.2. Пользователь обязуется предоставлять достоверную информацию при использовании Сайта.', + '5.3. Пользователь обязуется не совершать действий, нарушающих российское законодательство, нормы морали и нравственности, а также действий, приводящих к нарушению работы Сайта.', + '5.4. Использование материалов Сайта без согласия правообладателей не допускается. При цитировании материалов Сайта ссылка на Сайт обязательна.', + '5.5. Пользователь обязуется не нарушать права и законные интересы третьих лиц, не причинять вред деловой репутации.', + '5.6. Пользователь не вправе нарушать нормальную работу отдельных сервисов и Сайта в целом.', + '5.7. Пользователь обязан самостоятельно отслеживать внесение изменений в настоящее Соглашение.', + '5.8. Пользователь вправе прекратить доступ к Личному кабинету, направив уведомление Администратору.', + ], + }, + { + title: '6. Ограничение ответственности', + items: [ + '6.1. Администратор гарантирует достоверность и полноту только той информации, которую он разместил на Сайте самостоятельно.', + '6.2. Администратор не несёт ответственности за недостоверность информации, размещённой третьими лицами, в том числе Пользователями.', + '6.3. Администратор не гарантирует, что Сайт будет соответствовать требованиям Пользователя, работать непрерывно и без ошибок.', + '6.4. Администратор не несёт ответственности перед Пользователем за любые убытки, включая упущенную выгоду, потерю данных, вред деловой репутации, причинённые в связи с использованием Сайта.', + '6.5. Администратор исходит из того, что все формы на Сайте заполняет непосредственно Пользователь. Ответственность за достоверность предоставленных данных несёт Пользователь.', + '6.6. Администратор не несёт ответственности за утрату или порчу данных в результате невыполнения Пользователем условий Соглашения.', + ], + }, + { + title: '7. Доступ к ресурсам третьих лиц', + items: [ + '7.1. Доступ Пользователя к Сайту может вызывать обращение к интернет-ресурсам третьих лиц (реклама, сбор статистики).', + '7.2. Владельцы таких ресурсов имеют техническую возможность собирать информацию о Пользователях и самостоятельно определяют условия её использования.', + '7.3. При переходе на сторонние ресурсы Пользователи самостоятельно определяют пределы использования своей информации согласно правилам соответствующих ресурсов.', + ], + }, + { + title: '8. Информация, хранящаяся на стороне браузера', + items: [ + '8.1. Администратор использует cookie-файлы для определения уникального идентификатора доступа Пользователя к Сайту.', + '8.2. Цели использования cookie:', + '— поддержка функциональности Сайта, требующей использования cookie;', + '— измерение аудитории Сайта;', + '— определение статистических предпочтений Пользователей;', + '— исследование корреляции статистических данных.', + '8.3. Пользователь может запретить использование cookie в настройках браузера, однако это может привести к частичной или полной потере функциональности Сайта.', + ], + }, + { + title: '9. Согласие на обработку персональных данных', + items: [ + `9.1. Обработка персональных данных Пользователей осуществляется Администратором в соответствии с Политикой конфиденциальности, размещённой по адресу ${SITE_URL}/privacy.`, + '9.2. Передавая свои персональные данные при регистрации или заполнении форм на Сайте, Пользователь даёт согласие на их обработку Администратором.', + '9.3. Администратор обрабатывает следующие персональные данные: Ф. И. О., адрес электронной почты, номер телефона, IP-адрес, тип браузера, данные о действиях на Сайте.', + '9.4. Цели обработки персональных данных: обеспечение функционирования Сайта, оказание информационной поддержки, предоставление персонализированных сервисов, направление информационных сообщений.', + `9.5. Согласие на обработку персональных данных может быть отозвано Пользователем путём направления заявления на адрес электронной почты: ${STORE_EMAIL}.`, + ], + }, + { + title: '10. Изменение условий и расторжение соглашения', + items: [ + '10.1. Соглашение может быть расторгнуто в любое время по инициативе любой из сторон. Администратор уведомляет о расторжении путём размещения информации на Сайте.', + `10.2. Пользователь может расторгнуть Соглашение, направив уведомление на адрес электронной почты: ${STORE_EMAIL}.`, + '10.3. Администратор вправе в одностороннем порядке изменять условия Соглашения. Новая редакция вступает в силу с момента размещения на Сайте.', + '10.4. Продолжение использования Сайта после изменения условий означает согласие Пользователя с новой редакцией. При несогласии Пользователь обязуется прекратить использование Сайта.', + ], + }, + { + title: '11. Информация об Администраторе', + items: [ + `${OP_NAME}`, + `ИНН: ${OP_INN}`, + `ОГРН: ${OP_OGRN}`, + `Адрес: ${OP_ADDR}`, + `Телефон: +7 (900) 000-00-00`, // TODO: заменить на реальный номер телефона + `Email: ${STORE_EMAIL}`, // TODO: заменить на реальный email при настройке STORE_EMAIL + ], + }, +] export function TermsPage() { return ( - - - - Пользовательское соглашение - + + + Пользовательское соглашение + - - Последнее обновление: 18 мая 2026 г. - + + Последнее обновление: 19 мая 2026 г. + - - - 1. ОБЩИЕ ПОЛОЖЕНИЯ - - - Настоящее пользовательское соглашение (далее – «Соглашение») регулирует отношения между пользователями сайта - и администрацией сайта в связи с использованием сайта Любимый Креатив. - + + {sections.map((section) => ( + + + {section.title} + - - 2. ПРЕДМЕТ СОГЛАШЕНИЯ - - - Сайт предоставляет пользователям возможность ознакомиться с информацией о товарах, совершать покупки и - оставлять отзывы. - - - - 3. ПРАВА И ОБЯЗАННОСТИ ПОЛЬЗОВАТЕЛЯ - - - Пользователь обязуется предоставлять достоверную информацию при регистрации и оформлении заказов, не - использовать сайт в незаконных целях, соблюдать правила поведения при оставлении отзывов и комментариев. - - - - 4. ОТВЕТСТВЕННОСТЬ - - - Администрация сайта не несет ответственности за прямые или косвенные убытки, возникшие в результате - использования информации, размещенной на сайте. - - - - - - + + {section.items.map((item, idx) => ( + + {item} + + ))} + + + ))} ) diff --git a/client/src/shared/ui/SchemeSwitcher/SchemeSwitcher.tsx b/client/src/shared/ui/SchemeSwitcher/SchemeSwitcher.tsx index 62e1f0e..c9baf9b 100644 --- a/client/src/shared/ui/SchemeSwitcher/SchemeSwitcher.tsx +++ b/client/src/shared/ui/SchemeSwitcher/SchemeSwitcher.tsx @@ -10,10 +10,10 @@ type Props = { } const SCHEMES: { key: ColorScheme; color: string; label: string; icon: React.ReactNode }[] = [ - { key: 'craft', color: '#6D4C41', label: 'Крафт', icon: }, - { key: 'forest', color: '#2E7D32', label: 'Лес', icon: }, - { key: 'ocean', color: '#1565C0', label: 'Океан', icon: }, - { key: 'berry', color: '#7B1FA2', label: 'Ягоды', icon: }, + { key: 'craft', color: '#546E7A', label: 'Крафт', icon: }, + { key: 'forest', color: '#2E8B57', label: 'Лес', icon: }, + { key: 'ocean', color: '#20B2AA', label: 'Океан', icon: }, + { key: 'berry', color: '#8A2BE2', label: 'Ягоды', icon: }, ] export function SchemeSwitcher({ value, onChange, orientation = 'horizontal' }: Props) { diff --git a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx index 5fc196b..5bf0127 100644 --- a/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx +++ b/client/src/widgets/reviews-block/ui/ReviewsBlock.tsx @@ -53,7 +53,7 @@ export function ReviewsBlock() { )} {q.isError && Не удалось загрузить отзывы.} {!q.isLoading && !q.isError && q.data && items.length === 0 && ( - + Отзывов пока нет @@ -79,8 +79,34 @@ export function ReviewsBlock() { ...(zebra ? { bgcolor: 'action.hover' } : {}), }} > - - + + {r.imageUrl && ( + + + + )} + {initials(r.authorDisplay)} @@ -119,31 +145,6 @@ export function ReviewsBlock() { - {r.imageUrl && ( - - - - )} ) })}