diff --git a/frontend/src/components/base/PageHero.astro b/frontend/src/components/base/PageHero.astro new file mode 100644 index 0000000..1191cff --- /dev/null +++ b/frontend/src/components/base/PageHero.astro @@ -0,0 +1,435 @@ +--- +import Button from '@components/base/Button.astro'; + +interface PageHeroProps { + badgeText: string; + titleWhite: string; + titleGold: string; + description: string; + btnText?: string; + btnHref?: string; + bgImage?: string; + minHeight?: string; + layout?: 'default' | 'with-image'; + sideImage?: string; + sideImageAlt?: string; + experienceBadge?: { + number: string; + text: string; + }; +} + +const { + badgeText, + titleWhite, + titleGold, + description, + btnText, + btnHref = "#contact", + bgImage = "", + minHeight = "80vh", + layout = "default", + sideImage = "", + sideImageAlt = "", + experienceBadge +} = Astro.props as PageHeroProps; + +const showImage = layout === 'with-image' && sideImage; +--- + +
+
+ +
+
+
+ + {badgeText} +
+ +

+ {titleWhite} +
+ {titleGold} +

+ +

{description}

+ + {btnText && ( +
+ +
+ )} +
+ + {showImage && ( +
+
+ {sideImageAlt + {experienceBadge && ( +
+ {experienceBadge.number} + {experienceBadge.text} +
+ )} +
+
+ )} +
+
+ + + + diff --git a/frontend/src/components/blog/BlogHero.astro b/frontend/src/components/blog/BlogHero.astro deleted file mode 100644 index bd9613f..0000000 --- a/frontend/src/components/blog/BlogHero.astro +++ /dev/null @@ -1,178 +0,0 @@ ---- -const badgeText = "БЛОГ И СТАТЬИ"; -const titleWhite = "Полезные статьи"; -const titleGold = "для автовладельцев"; -const description = "Разбираем сложные юридические вопросы простым языком. Советы юриста по автоспорам, ДТП, ОСАГО и защите прав водителей."; ---- - -
-
- -
-
- - {badgeText} -
- -

- {titleWhite} -
- {titleGold} -

- -

{description}

-
-
- - - - diff --git a/frontend/src/components/cases/CasesList.astro b/frontend/src/components/cases/CasesList.astro new file mode 100644 index 0000000..0bfb43d --- /dev/null +++ b/frontend/src/components/cases/CasesList.astro @@ -0,0 +1,859 @@ +--- +import Button from '@components/base/Button.astro'; + +interface Case { + id: number; + title: string; + category: string; + categoryIcon: string; + description: string; + situation: string; + result: string; + resultLabel: string; + duration: string; + sum?: string; + href: string; +} + +const { + sectionSubtitle = "НАША ПРАКТИКА", + sectionTitle = "Последние выигранные дела", + sectionDescription = "Каждое дело — это уникальная история с индивидуальным подходом. Вот лишь некоторые примеры нашей работы.", + filterLabel = "Выберите категорию:", + cases = [ + { + id: 1, + title: "Возврат прав после лишения по ст. 12.8 КоАП", + category: "Водительские права", + categoryIcon: "🚗", + description: "Клиент был лишён прав на 18 месяцев за якобы управление в состоянии опьянения. Мы нашли процессуальные нарушения при составлении протокола.", + situation: "Инспекторы ДПС допустили нарушения при освидетельствовании: не были приглашены понятые, протокол составлен без присутствия двух понятых.", + result: "Суд первой инстанции отменил постановление. Права возвращены в полном объёме.", + resultLabel: "Лишение отменено", + duration: "3 месяца", + href: "/cases/driving-license-return-12-8" + }, + { + id: 2, + title: "Взыскание 450 000 ₽ со страховой по ОСАГО", + category: "Страховые споры", + categoryIcon: "📋", + description: "Страховая компания выплатила лишь 120 000 ₽ при реальном ущербе в 570 000 ₽ после серьёзного ДТП.", + situation: "После аварии автомобиль клиента получил значительные повреждения. Оценка страховой оказалась занижена почти в 5 раз.", + result: "Суд удовлетворил иск полностью. Взыскано 450 000 ₽ недоплаты + неустойка и штраф.", + resultLabel: "Взыскано 450 000 ₽", + duration: "5 месяцев", + sum: "450 000 ₽", + href: "/cases/osago-claim-450k" + }, + { + id: 3, + title: "Оспаривание вины в ДТП с пострадавшим", + category: "ДТП и разбор", + categoryIcon: "🚨", + description: "Клиента обвиняли в нарушении ПДД, повлёкшем ДТП с пострадавшим. Грозил штраф и лишение прав.", + situation: "На перекрёстке произошло столкновение. Инспектор ГИБДД изначально признал виновным нашего клиента.", + result: "Благодаря видеозаписи с камеры и показаниям свидетелей удалось доказать невиновность.", + resultLabel: "Виновность не доказана", + duration: "4 месяца", + href: "/cases/dti-innocence-proof" + }, + { + id: 4, + title: "Защита интересов в арбитражном суде", + category: "Судебное представительство", + categoryIcon: "🏛️", + description: "Представляли интересы юридического лица в споре со страховой компанией по договору КАСКО на автопарк.", + situation: "Страховая отказала в выплате по нескольким страховым случаям, ссылаясь на нарушения условий договора.", + result: "Суд признал отказ необоснованным. Взыскано 1 200 000 ₽ по всем эпизодам.", + resultLabel: "Взыскано 1 200 000 ₽", + duration: "7 месяцев", + sum: "1 200 000 ₽", + href: "/cases/casaco-fleet-claim" + }, + { + id: 5, + title: "Возврат прав после лишения за выезд на встречку", + category: "Водительские права", + categoryIcon: "🚗", + description: "Клиент лишён прав на 6 месяцев за выезд на полосу встречного движения. Камера зафиксировала нарушение.", + situation: "Нарушение было зафиксировано автоматической камерой. Клиент утверждал, что за рулём был другой человек.", + result: "Суд учёл предоставленные доказательства. Лишение отменено, дело прекращено.", + resultLabel: "Дело прекращено", + duration: "2 месяца", + href: "/cases/license-return-camera" + }, + { + id: 6, + title: "Взыскание ущерба с виновника ДТП по КАСКО", + category: "Страховые споры", + categoryIcon: "🛡️", + description: "Страховая по КАСКО выплатила не полную сумму. Разницу решили взыскать напрямую с виновника аварии.", + situation: "Виновник ДТП отказался добровольно возмещать разницу между выплатой КАСКО и реальным ущербом.", + result: "Суд вынес решение в пользу клиента. Взыскано 280 000 ₽ + судебные расходы.", + resultLabel: "Взыскано 280 000 ₽", + duration: "4 месяца", + sum: "280 000 ₽", + href: "/cases/casco-damage-claim" + } + ] as Case[] +} = Astro.props; + +// Получаем уникальные категории +const categories = ["Все", ...Array.from(new Set(cases.map((c: Case) => c.category)))]; +--- + +
+
+ +
+ {sectionSubtitle} +

{sectionTitle}

+

{sectionDescription}

+
+ + +
+ {filterLabel} +
+ {categories.map((category, index) => ( + + ))} +
+
+ + +
+ {cases.map((caseItem: Case, index: number) => ( +
+
+ +
+
+ {caseItem.categoryIcon} + {caseItem.category} +
+

{caseItem.title}

+
+ + +

{caseItem.description}

+ + +
+
+ + + + + + Ситуация +
+

{caseItem.situation}

+
+ + +
+
+
+ + + + Результат +
+ {caseItem.resultLabel} +
+

{caseItem.result}

+
+ + +
+
+ + + + + Срок: {caseItem.duration} +
+ {caseItem.sum && ( +
+ + + + Сумма: {caseItem.sum} +
+ )} +
+ + + + Подробнее о деле + + + + + +
+
+ ))} +
+ + +
+
+ + + +
+

Нужна помощь с похожей ситуацией?

+

Расскажите о вашей проблеме — мы найдём решение. Первая консультация бесплатно.

+ +
+
+
+ + + + diff --git a/frontend/src/components/services/HeroServices.astro b/frontend/src/components/services/HeroServices.astro deleted file mode 100644 index f68ea50..0000000 --- a/frontend/src/components/services/HeroServices.astro +++ /dev/null @@ -1,241 +0,0 @@ ---- -import Button from '@components/base/Button.astro'; - -const badgeText = "АВТОЮРИСТ СУРГУТ & ЮГРА"; -const titleWhite = "Наши юридические"; -const titleGold = "услуги"; -const description = "Мы обеспечиваем экспертную защиту прав водителей в Сургуте и Ханты-Мансийском автономном округе. Профессиональный подход к сложным дорожным спорам с акцентом на результат."; -const btnPrimary = "Получить помощь"; - -const bgImageUrl = "/images/services/office.png"; ---- - -
-
- -
-
-
- - {badgeText} -
- -

- {titleWhite} -
- {titleGold} -

- -

{description}

- -
- -
-
-
-
- - - - diff --git a/frontend/src/data/casesData.ts b/frontend/src/data/casesData.ts new file mode 100644 index 0000000..bcf3a87 --- /dev/null +++ b/frontend/src/data/casesData.ts @@ -0,0 +1,182 @@ +export interface Case { + id: number; + title: string; + category: CaseCategory; + description: string; + result: string; + clientStory: string; + amount: string; + duration: string; + image: string; + tags: string[]; + featured?: boolean; +} + +export type CaseCategory = + | 'insurance' + | 'rights' + | 'accident' + | 'court' + | 'consultation'; + +export const categories = [ + { + id: 'all', + label: 'Все кейсы', + icon: '📋' + }, + { + id: 'insurance', + label: 'Споры со страховыми', + icon: '🛡️' + }, + { + id: 'rights', + label: 'Возврат прав', + icon: '🚗' + }, + { + id: 'accident', + label: 'ДТП и возмещение', + icon: '💥' + }, + { + id: 'court', + label: 'Судебные дела', + icon: '⚖️' + }, +] as const; + +export const casesData: Case[] = [ + { + id: 1, + title: 'Взыскание 450 000 ₽ со страховой компании', + category: 'insurance', + description: 'Клиент обратился после ДТП — страховая выплатила только 50 000 ₽ вместо положенных 500 000 ₽', + result: 'Выплачено 500 000 ₽ + неустойка 50 000 ₽', + clientStory: 'Попал в ДТП по вине другого водителя. Страховая насчитала смешную сумму. Ребята из Автоюриста 086 сделали независимую экспертизу и выиграли суд.', + amount: '500 000 ₽', + duration: '3 месяца', + image: '/images/cases/case-insurance-1.jpg', + tags: ['ОСАГО', 'Независимая экспертиза', 'Суд'], + featured: true, + }, + { + id: 2, + title: 'Возврат водительских прав после лишения', + category: 'rights', + description: 'Клиент был лишён прав на 1,5 года за отказ от медосвидетельствования. Нашли procedural violations.', + result: 'Права возвращены через 4 месяца', + clientStory: 'Остановили ночью, сказали пройти освидетельствование. Я попросил показать документы врача — отказали. Лишили прав. Юристы нашли нарушения в процедуре.', + amount: 'Сохранены права', + duration: '4 месяца', + image: '/images/cases/case-rights-1.jpg', + tags: ['Лишение прав', 'Медосвидетельствование', 'Апелляция'], + featured: true, + }, + { + id: 3, + title: 'Оспаривание вины в ДТП на перекрёстке', + category: 'accident', + description: 'Сложное ДТП на регулируемом перекрёстке. ГИБДД признала виновным нашего клиента.', + result: 'Виность пересмотрена, выплата 320 000 ₽', + clientStory: 'Ехал на зелёный, а мне врезались сбоку. Инспектор составил протокол против меня. Адвокаты собрали видеозаписи и доказали мою невиновность.', + amount: '320 000 ₽', + duration: '5 месяцев', + image: '/images/cases/case-accident-1.jpg', + tags: ['ДТП', 'Видеозапись', 'Перекрёсток'], + }, + { + id: 4, + title: 'Защита от необоснованного штрафа с камеры', + category: 'court', + description: 'Клиент получил штраф 5000 ₽ с камеры фотовидеофиксации за нарушение, которого не совершал.', + result: 'Штраф отменён полностью', + clientStory: 'Пришел штраф за проезд на красный. Но я там не был! Оказалось, камера ошиблась. Юристы помогли оспорить.', + amount: 'Экономия 5 000 ₽', + duration: '1 месяц', + image: '/images/cases/case-court-1.jpg', + tags: ['Штрафы', 'Камеры', 'Обжалование'], + }, + { + id: 5, + title: 'Возмещение ущерба от града по КАСКО', + category: 'insurance', + description: 'После сильного града автомобиль получил серьёзные повреждения. Страховая отказала в выплате.', + result: 'Выплачено 680 000 ₽ по КАСКО', + clientStory: 'Градом побило стёкла и крышу. Страховая сказала, что это не страховой случай. Обратился сюда — выплатили всё до копейки.', + amount: '680 000 ₽', + duration: '2 месяца', + image: '/images/cases/case-insurance-2.jpg', + tags: ['КАСКО', 'Град', 'Отказ страховой'], + }, + { + id: 6, + title: 'Возврат прав после лишения за алкоголь', + category: 'rights', + description: 'Клиента лишили прав на 2 года за управление в состоянии опьянения. Нашли ошибки в протоколе.', + result: 'Дело прекращено, права возвращены', + clientStory: 'Остановили, заподозрили опьянение. Составили протокол с ошибками. Благодаря юристам удалось доказать невиновность.', + amount: 'Сохранены права', + duration: '6 месяцев', + image: '/images/cases/case-rights-2.jpg', + tags: ['Лишение прав', 'Алкоголь', 'Протокол'], + featured: true, + }, + { + id: 7, + title: 'Спор о виновности при столкновении на парковке', + category: 'accident', + description: 'На подземной парковке произошло столкновение. Владелец соседнего авто обвинил нашего клиента.', + result: 'Доказана невиновность клиента', + clientStory: 'Парковался, задел чужую машину. Но оказалось, что тот автомобиль стоял в неположенном месте. Юристы разобрались.', + amount: '0 ₽ (виность не доказана)', + duration: '2 месяца', + image: '/images/cases/case-accident-2.jpg', + tags: ['Парковка', 'Столкновение', 'Защита'], + }, + { + id: 8, + title: 'Консультация по покупке автомобиля с пробегом', + category: 'consultation', + description: 'Клиент хотел купить б/у авто, но боялся нарваться на проблемы с документами или скрытыми дефектами.', + result: 'Безопасная покупка автомобиля', + clientStory: 'Хотел купить машину с рук. Юристы проверили все документы, историю, залоги. Всё оказалось чисто — купил без проблем.', + amount: 'Предотвращены риски', + duration: '1 неделя', + image: '/images/cases/case-consultation-1.jpg', + tags: ['Покупка авто', 'Проверка документов', 'Консультация'], + }, + { + id: 9, + title: 'Судебный иск к автосалону за скрытые дефекты', + category: 'court', + description: 'Клиент купил автомобиль в салоне, но обнаружил скрытые дефекты, о которых не предупредили.', + result: 'Возврат 1 200 000 ₽ за автомобиль', + clientStory: 'Купил машину в салоне. Через месяц посыпались проблемы. Оказалось, defects были скрыты. Выиграли суд и вернули деньги.', + amount: '1 200 000 ₽', + duration: '7 месяцев', + image: '/images/cases/case-court-2.jpg', + tags: ['Автосалон', 'Скрытые дефекты', 'Возврат денег'], + featured: true, + }, + { + id: 10, + title: 'Компенсация морального вреда после ДТП', + category: 'accident', + description: 'После серьёзного ДТП клиент получил травмы и моральный вред. Нужно было взыскать компенсацию.', + result: 'Компенсация 250 000 ₽ морального вреда', + clientStory: 'Попал в аварию, получил травмы. Страховая покрыла только лечение. Юристы помогли получить компенсацию за моральный вред.', + amount: '250 000 ₽', + duration: '4 месяца', + image: '/images/cases/case-accident-3.jpg', + tags: ['Моральный вред', 'Травмы', 'Компенсация'], + }, +]; + +export const statsData = { + totalCases: '500+', + successRate: '98%', + totalRecovered: '50+ млн ₽', + averageDuration: '3-4 месяца', +} as const; diff --git a/frontend/src/pages/blog/index.astro b/frontend/src/pages/blog/index.astro index 360f09a..9c5befa 100644 --- a/frontend/src/pages/blog/index.astro +++ b/frontend/src/pages/blog/index.astro @@ -1,7 +1,7 @@ --- import Layout from '@layouts/Layout.astro'; import { SITE_URL } from '@constants'; -import BlogHero from '@components/blog/BlogHero.astro'; +import PageHero from '@components/base/PageHero.astro'; import BlogCategories from '@components/blog/BlogCategories.astro'; import BlogCard from '@components/blog/BlogCard.astro'; import BlogPagination from '@components/blog/BlogPagination.astro'; @@ -26,7 +26,20 @@ const paginatedPosts = blogPosts.slice(startIndex, endIndex); { label: "Блог" } ]} > - + @@ -167,3 +180,35 @@ const paginatedPosts = blogPosts.slice(startIndex, endIndex); } } + + diff --git a/frontend/src/pages/blog/page/[page].astro b/frontend/src/pages/blog/page/[page].astro index 75bc8dd..904585c 100644 --- a/frontend/src/pages/blog/page/[page].astro +++ b/frontend/src/pages/blog/page/[page].astro @@ -1,7 +1,7 @@ --- import Layout from '@layouts/Layout.astro'; import { SITE_URL } from '@constants'; -import BlogHero from '@components/blog/BlogHero.astro'; +import PageHero from '@components/base/PageHero.astro'; import BlogCategories from '@components/blog/BlogCategories.astro'; import BlogCard from '@components/blog/BlogCard.astro'; import BlogPagination from '@components/blog/BlogPagination.astro'; @@ -27,7 +27,20 @@ const paginatedPosts = blogPosts.slice(startIndex, endIndex); { label: `Страница ${currentPage}` } ]} > - + @@ -168,3 +181,35 @@ const paginatedPosts = blogPosts.slice(startIndex, endIndex); } } + + diff --git a/frontend/src/pages/cases.astro b/frontend/src/pages/cases.astro index e07ead7..ce1a81c 100644 --- a/frontend/src/pages/cases.astro +++ b/frontend/src/pages/cases.astro @@ -1,16 +1,33 @@ --- import Layout from '@layouts/Layout.astro'; import { SITE_URL } from '@constants'; +import PageHero from "@components/base/PageHero.astro"; +import CasesList from "@components/cases/CasesList.astro"; --- -

Кейсы

+ +
diff --git a/frontend/src/pages/contacts.astro b/frontend/src/pages/contacts.astro index 77ff968..ab3e004 100644 --- a/frontend/src/pages/contacts.astro +++ b/frontend/src/pages/contacts.astro @@ -1,6 +1,7 @@ --- import Layout from '@layouts/Layout.astro'; import { SITE_URL, COMPANY } from '@constants'; +import PageHero from '@components/base/PageHero.astro'; // Логика авторизации (пока статичная переменная) const isAuthorized = false; // Измените на true, чтобы увидеть форму @@ -15,23 +16,20 @@ const isAuthorized = false; // Измените на true, чтобы увиде { label: 'Контакты' } ]} > - -
-
-
-
- - БЕСПЛАТНАЯ КОНСУЛЬТАЦИЯ -
-

- Свяжитесь с нами -

-

- Мы всегда на связи и готовы помочь вам в решении автоспоров. Оставьте заявку или позвоните — первая консультация бесплатно. -

-
-
-
+
@@ -194,82 +192,6 @@ const isAuthorized = false; // Измените на true, чтобы увиде