Dev #1

Merged
redrockjs merged 66 commits from dev into main 2025-12-11 08:37:11 +00:00
12 changed files with 191 additions and 75 deletions
Showing only changes of commit 62e0687358 - Show all commits

View File

@@ -0,0 +1 @@
<svg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none' overflow='visible' height='100%' viewBox='0 0 20 16' fill='none' stroke='black' stroke-width='1' stroke-linecap='square' stroke-miterlimit='10'><g transform='translate(-12.000000, 0)'><path d='M28,0L10,18'/><path d='M18,0L0,18'/><path d='M48,0L30,18'/><path d='M38,0L20,18'/></g></svg>

After

Width:  |  Height:  |  Size: 352 B

7
src/core/types/expert.ts Normal file
View File

@@ -0,0 +1,7 @@
import { StaticImageData } from 'next/image';
export type TExpert = {
position: string;
name: string;
photo: string | StaticImageData;
};

View File

@@ -0,0 +1,5 @@
export type TRelatedArticles = {
title: string;
description: string;
link: string;
};

10
src/core/types/sidebar.ts Normal file
View File

@@ -0,0 +1,10 @@
export type TSidebar = {
estimate: string;
relatedTitle?: string;
related?: {
title: string;
link: string;
}[];
warrantiesTitle?: string;
warranties?: string[];
};

View File

@@ -1,9 +1,11 @@
import s from './styles.module.scss'; import s from './styles.module.scss';
import { Button, Input, PhoneInput } from '@shared/ui'; import { Button, Input, PhoneInput } from '@shared/ui';
import Image from 'next/image'; import Image from 'next/image';
import expertPhoto from '@public/images/photo/yancen-yana.png'; import { TExpert } from '@core/types/expert';
function Consultation() { type ConsultationProps = TExpert;
function Consultation({ name, position, photo }: ConsultationProps) {
return ( return (
<section className={s.Consultation}> <section className={s.Consultation}>
<div className={s.Container}> <div className={s.Container}>
@@ -22,9 +24,9 @@ function Consultation() {
</form> </form>
</div> </div>
<div className={s.Sidebar}> <div className={s.Sidebar}>
<Image src={expertPhoto} alt={'Автоэксперт - Янцен Яна'} /> <Image src={photo} alt={`${position} - ${name}`} />
<p className={s.Title}>Янцен Яна</p> <p className={s.Title}>{name}</p>
<p className={s.Description}>Автоэксперт</p> <p className={s.Description}>{position}</p>
</div> </div>
</div> </div>
</section> </section>

View File

@@ -1,7 +1,13 @@
import s from './styles.module.scss'; import s from './styles.module.scss';
import Link from 'next/link';
import { TRelatedArticles } from '@core/types/relatedArticles';
import { CallbackForm } from '@/entities'; import { CallbackForm } from '@/entities';
function RelatedArticles() { type RelatedArticlesProps = {
related: TRelatedArticles[];
};
function RelatedArticles({ related }: RelatedArticlesProps) {
return ( return (
<section className={s.Related}> <section className={s.Related}>
<div className={s.Container}> <div className={s.Container}>
@@ -10,42 +16,16 @@ function RelatedArticles() {
Похожие услуги, которые возможно Вас заинтересуют Похожие услуги, которые возможно Вас заинтересуют
</h3> </h3>
<div className={s.Grid}> <div className={s.Grid}>
<div className={s.Promo}> {related.map(({ title, description, link }, index) => (
<h4 className={s.Title}>Трасологическая экспертиза</h4> <div key={index} className={s.Block}>
<p className={s.Description}> <h4 className={s.Title}>
Эксперты нашей компании быстро и точно восстановят картину <Link href={link}>{title}</Link>
происшествия и дадут профессиональную оценку ситуации. Также во </h4>
время трасологической экспертизы изучаются имеющиеся повреждения <p className={s.Description}>
и следы на месте <Link href={link}>{description}</Link>
</p> </p>
</div> </div>
<div className={s.Promo}> ))}
<h4 className={s.Title}>Товароведческая экспертиза</h4>
<p className={s.Description}>
Судебная экспертиза товаров должна проводиться только
специалистом, получившим узкопрофильную квалификацию. Если Вам
необходима товароведческая экспертиза и для суда, мы готовы
подробно исследовать любой товар. Результат работы
</p>
</div>
<div className={s.Promo}>
<h4 className={s.Title}>Оценочная экспертиза</h4>
<p className={s.Description}>
Судебная оценочная (стоимостная) экспертиза представляет собой
вид экспертизы, главной задачей которой является определение
рыночной стоимости объектов оценки
</p>
</div>
<div className={s.Promo}>
<h4 className={s.Title}>Рецензия (Проверка) экспертизы</h4>
<p className={s.Description}>
Необходимость в составлении рецензии на судебную экспертизу
появляется в ситуациях, когда выводы заключения являются не
обоснованными, а квалификация и опыт эксперта не вызывают
доверия. В ходе рецензирования экспертное заключение
проверяется
</p>
</div>
</div> </div>
<CallbackForm pageName='Автотехническая экспертиза' /> <CallbackForm pageName='Автотехническая экспертиза' />
</div> </div>

View File

@@ -1,12 +1,22 @@
import s from './styles.module.scss'; import s from './styles.module.scss';
import Link from 'next/link';
import { Button } from '@shared/ui'; import { Button } from '@shared/ui';
import { TSidebar } from '@core/types/sidebar';
function Sidebar() { type SidebarProps = TSidebar;
function Sidebar({
estimate = '3',
relatedTitle,
related,
warrantiesTitle,
warranties,
}: SidebarProps) {
return ( return (
<div className={s.Sidebar}> <div className={s.Sidebar}>
<div className={s.Estimation}> <div className={s.Estimation}>
<h4 className={s.Title}>Срок выполнения:</h4> <h4 className={s.Title}>Срок выполнения:</h4>
<p className={s.Estimate}>от 3 дней</p> <p className={s.Estimate}>от {estimate} дней</p>
<p className={s.Text}> <p className={s.Text}>
Наш эксперт свяжется с вами для уточнения обстоятельств дела и Наш эксперт свяжется с вами для уточнения обстоятельств дела и
определения точной стоимости. определения точной стоимости.
@@ -15,31 +25,30 @@ function Sidebar() {
<Button variant={'white'}>Записаться</Button> <Button variant={'white'}>Записаться</Button>
<p className={s.Phone}>+7 (900) 241-34-34</p> <p className={s.Phone}>+7 (900) 241-34-34</p>
</div> </div>
<div className={s.Related}> {related && (
<h4 className={s.Title}>Сопутствующие экспертизы</h4> <div className={s.Related}>
<ul className={s.List}> <h4 className={s.Title}>{relatedTitle}</h4>
<li className={s.ListItem}>Трасологическая</li> <ul className={s.List}>
<li className={s.ListItem}>Оценочная</li> {related?.map(({ title, link }, index) => (
<li className={s.ListItem}>Товароведческая</li> <li key={index} className={s.ListItem}>
<li className={s.ListItem}>Рецензирование (проверка)</li> <Link href={link}>{title}</Link>
</ul> </li>
</div> ))}
<div className={s.Warranties}> </ul>
<h4 className={s.Title}>Наши гарантии</h4> </div>
<ul className={s.List}> )}
<li className={s.ListItem}> {warranties && (
Эксперты компании являются членами Саморегулируемой организации <div className={s.Warranties}>
судебных экспертов <h4 className={s.Title}>{warrantiesTitle}</h4>
</li> <ul className={s.List}>
<li className={s.ListItem}> {warranties.map((warranty, index) => (
Деятельность компании застрахована на 60 000 000 рублей <li key={index} className={s.ListItem}>
</li> {warranty}
<li className={s.ListItem}> </li>
Экспертизы выполняются в соответствии с Федеральными ))}
Законодательными Актами </ul>
</li> </div>
</ul> )}
</div>
</div> </div>
); );
} }

View File

@@ -0,0 +1,8 @@
import { TExpert } from '@core/types/expert';
import expertPhoto from '@public/images/photo/yancen-yana.png';
export const expertData: TExpert = {
name: 'Янцен Яна',
position: 'Автоэксперт',
photo: expertPhoto,
};

View File

@@ -0,0 +1,29 @@
import { TRelatedArticles } from '@core/types/relatedArticles';
import { ROUTES } from '@core/constants/route';
export const relatedArticlesData: TRelatedArticles[] = [
{
title: 'Трасологическая экспертиза',
description:
'Эксперты нашей компании быстро и точно восстановят картину происшествия и дадут профессиональную оценку ситуации. Также во время трасологической экспертизы изучаются имеющиеся повреждения и следы на месте…',
link: ROUTES.EXPERTIZA_TRASOLOGIA,
},
{
title: 'Оценочная экспертиза',
description:
'Судебная оценочная (стоимостная) экспертиза представляет собой вид экспертизы, главной задачей которой является определение рыночной стоимости объектов оценки…',
link: ROUTES.EXPERTIZA_OCENKI,
},
{
title: 'Товароведческая экспертиза',
description:
'Судебная экспертиза товаров должна проводиться только специалистом, получившим узкопрофильную квалификацию. Если Вам необходима товароведческая экспертиза и для суда, мы готовы подробно исследовать любой товар. Результат работы…',
link: ROUTES.EXPERTIZA_TOVAR,
},
{
title: 'Рецензия (Проверка) экспертизы',
description:
'Необходимость в составлении рецензии на судебную экспертизу появляется в ситуациях, когда выводы заключения являются не обоснованными, а квалификация и опыт эксперта не вызывают доверия. В ходе рецензирования экспертное заключение проверяется…',
link: ROUTES.EXPERTIZA_RECENZII,
},
];

View File

@@ -0,0 +1,33 @@
import { TSidebar } from '@core/types/sidebar';
import { ROUTES } from '@core/constants/route';
const sidebarData: TSidebar = {
estimate: '3',
relatedTitle: 'Сопутствующие экспертизы',
related: [
{
title: 'Трасологическая',
link: ROUTES.EXPERTIZA_TRASOLOGIA,
},
{
title: 'Оценочная',
link: ROUTES.EXPERTIZA_OCENKI,
},
{
title: 'Товароведческая',
link: ROUTES.EXPERTIZA_TOVAR,
},
{
title: 'Рецензирование (проверка)',
link: ROUTES.EXPERTIZA_RECENZII,
},
],
warrantiesTitle: 'Наши гарантии',
warranties: [
'Эксперты компании являются членами Саморегулируемой организации судебных экспертов',
'Деятельность компании застрахована на 60 000 000 рублей',
'Экспертизы выполняются в соответствии с Федеральными Законодательными Актами',
],
};
export { sidebarData };

View File

@@ -46,3 +46,24 @@
margin-bottom: 16px; margin-bottom: 16px;
} }
} }
.Partners {
.Divider {
width: 100%;
display: flex;
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
.Separator {
display: flex;
width: 100%;
margin: 0 auto;
min-height: 15px;
mask-size: 20px 100%;
mask-repeat: repeat-x;
background-color: $color-green;
mask-image: url(/svg/rotated-lines.svg);
}
}
}

View File

@@ -1,7 +1,9 @@
import s from './styles.module.scss'; import s from './styles.module.scss';
import { CallbackForm, Connect, OrderSchema } from '@/entities'; import { CallbackForm, Connect, OrderSchema } from '@/entities';
import { Consultation, RelatedArticles, Sidebar } from '@/feature/article'; import { Consultation, RelatedArticles, Sidebar } from '@/feature/article';
import { Button } from '@shared/ui'; import { sidebarData } from './model/sidebar';
import { relatedArticlesData } from './model/relatedArticles';
import { expertData } from './model/expert';
function AutoTech() { function AutoTech() {
return ( return (
@@ -52,7 +54,9 @@ function AutoTech() {
изменен. изменен.
</li> </li>
</ul> </ul>
<CallbackForm pageName='Автотехническая экспертиза' /> <CallbackForm pageName='Автотехническая экспертиза' />
<h3 className={s.Header}>Документы, необходимые для экспертизы:</h3> <h3 className={s.Header}>Документы, необходимые для экспертизы:</h3>
<p className={s.Text}> <p className={s.Text}>
Для начала работ по автомобильной экспертизе эксперту понадобятся Для начала работ по автомобильной экспертизе эксперту понадобятся
@@ -85,15 +89,22 @@ function AutoTech() {
<Connect /> <Connect />
</div> </div>
<aside> <aside>
<Sidebar /> <Sidebar {...sidebarData} />
</aside> </aside>
</div> </div>
</section> </section>
<Consultation /> <Consultation {...expertData} />
<RelatedArticles /> <RelatedArticles related={relatedArticlesData} />
<section className={s.Partners}>
<section className={s.Partners}></section> <div className={s.Divider}>
<span className={s.Separator} />
</div>
Slider
<div className={s.Divider}>
<span className={s.Separator} />
</div>
</section>
</> </>
); );
} }