Новые изменения компоентов

This commit is contained in:
Web-serfer 2026-04-23 20:05:21 +05:00
parent d25a119e11
commit 92778a126b
9 changed files with 119 additions and 401 deletions

View file

@ -1,114 +1,14 @@
---
import Pagination from '@components/base/Pagination.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;
}
import { casesData } from '@data/cases';
import type { Case } from '@data/cases';
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: "Благодаря грамотно построенной позиции и экспертизам виновность клиента не была доказана.",
resultLabel: "Виновность не доказана",
duration: "3 месяца",
href: "/cases/dtp-innocence-proof"
},
{
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: "Суд взыскал с виновника компенсацию за медицинские расходы и моральный вред.",
resultLabel: "Взыскано 350 000 ₽",
duration: "5 месяцев",
sum: "350 000 ₽",
href: "/cases/health-damage-claim"
},
{
id: 7,
title: "Взыскание ущерба с виновника ДТП по КАСКО",
category: "Страховые споры",
categoryIcon: "🛡️",
description: "Страховая по КАСКО выплатила не полную сумму. Разницу решили взыскать напрямую с виновника аварии.",
situation: "Виновник ДТП отказался добровольно возмещать разницу между выплатой КАСКО и реальным ущербом.",
result: "Суд вынес решение в пользу клиента. Взыскано 280 000 ₽ + судебные расходы.",
resultLabel: "Взыскано 280 000 ₽",
duration: "4 месяца",
sum: "280 000 ₽",
href: "/cases/casco-damage-claim"
}
] as Case[],
cases = casesData,
currentPage = 1,
casesPerPage = 4,
baseUrl = "/cases"
@ -403,6 +303,9 @@ const categoriesList = [
.case-card {
display: flex;
text-decoration: none;
color: inherit;
cursor: pointer;
}
.case-card.is-visible {
@ -438,6 +341,13 @@ const categoriesList = [
opacity: 1;
}
.case-card:focus .case-card__inner {
box-shadow: var(--shadow-xl);
border-color: rgba(234, 194, 110, 0.3);
outline: 2px solid var(--color-accent);
outline-offset: 2px;
}
/* Header */
.case-card__header {
margin-bottom: 1.5rem;

View file

@ -1,20 +1,10 @@
---
interface Case {
id: number;
title: string;
category: string;
categoryIcon: string;
description: string;
resultLabel: string;
duration: string;
sum?: string;
href: string;
}
import { casesData } from '@data/cases';
import type { Case } from '@data/cases';
interface RelatedCasesProps {
title: string;
subtitle: string;
cases: Case[];
currentCaseId: number;
limit?: number;
}
@ -22,7 +12,6 @@ interface RelatedCasesProps {
const {
title = "Другие кейсы",
subtitle = "Похожие дела",
cases = [],
currentCaseId = 0,
limit = 3
} = Astro.props as RelatedCasesProps;
@ -36,7 +25,7 @@ function shuffleArray<T>(array: T[]): T[] {
return shuffled;
}
const otherCases = cases.filter(c => c.id !== currentCaseId);
const otherCases = casesData.filter(c => c.id !== currentCaseId);
const shuffledCases = shuffleArray(otherCases);
const relatedCases = shuffledCases.slice(0, limit);
---

103
frontend/src/data/cases.ts Normal file
View file

@ -0,0 +1,103 @@
export interface Case {
id: number;
title: string;
category: string;
categoryIcon: string;
description: string;
situation: string;
result: string;
resultLabel: string;
duration: string;
sum?: string;
href: string;
}
export const casesData: Case[] = [
{
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: "Благодаря грамотно построенной позиции и экспертизам виновность клиента не была доказана.",
resultLabel: "Виновность не доказана",
duration: "3 месяца",
href: "/cases/dtp-innocence-proof"
},
{
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: "Суд взыскал с виновника компенсацию за медицинские расходы и моральный вред.",
resultLabel: "Взыскано 350 000 ₽",
duration: "5 месяцев",
sum: "350 000 ₽",
href: "/cases/health-damage-claim"
},
{
id: 7,
title: "Взыскание ущерба с виновника ДТП по КАСКО",
category: "Страховые споры",
categoryIcon: "🛡️",
description: "Страховая по КАСКО выплатила не полную сумму. Разницу решили взыскать напрямую с виновника аварии.",
situation: "Виновник ДТП отказался добровольно возмещать разницу между выплатой КАСКО и реальным ущербом.",
result: "Суд вынес решение в пользу клиента. Взыскано 280 000 ₽ + судебные расходы.",
resultLabel: "Взыскано 280 000 ₽",
duration: "4 месяца",
sum: "280 000 ₽",
href: "/cases/casco-damage-claim"
}
];

View file

@ -4,59 +4,6 @@ import { SITE_URL } from '@constants';
import PageHero from "@components/base/PageHero.astro";
import RelatedCases from "@components/cases/RelatedCases.astro";
import AdBanner from "@components/base/AdBanner.astro";
const allCases = [
{
id: 1,
title: "Возврат прав после лишения по ст. 12.8 КоАП",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент был лишён прав на 18 месяцев за якобы управление в состоянии опьянения. Мы нашли процессуальные нарушения при составлении протокола.",
resultLabel: "Лишение отменено",
duration: "3 месяца",
href: "/cases/driving-license-return-12-8"
},
{
id: 2,
title: "Взыскание 450 000 ₽ со страховой по ОСАГО",
category: "Страховые споры",
categoryIcon: "📋",
description: "Страховая компания выплатила лишь 120 000 ₽ при реальном ущербе в 570 000 ₽ после серьёзного ДТП.",
resultLabel: "Взыскано 450 000 ₽",
duration: "5 месяцев",
href: "/cases/osago-claim-450k"
},
{
id: 3,
title: "Оспаривание вины в ДТП с пострадавшим",
category: "ДТП и разбор",
categoryIcon: "🚨",
description: "Клиента обвиняли в нарушении ПДД, повлёкшем ДТП с пострадавшим. Грозил штраф и лишение прав.",
resultLabel: "Виновность не доказана",
duration: "4 месяца",
href: "/cases/dti-innocence-proof"
},
{
id: 4,
title: "Доказывание невиновности в ДТП",
category: "Споры ГИБДД",
categoryIcon: "🚨",
description: "Клиента признали виновным в ДТП на основании рапорта инспектора. Мы доказали несостоятельность обвинения.",
resultLabel: "Виновность не доказана",
duration: "3 месяца",
href: "/cases/dtp-innocence-proof"
},
{
id: 5,
title: "Возврат прав после лишения за выезд на встречку",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент лишён прав на 6 месяцев за выезд на полосу встречного движения. Камера зафиксировала нарушение.",
resultLabel: "Дело прекращено",
duration: "2 месяца",
href: "/cases/license-return-camera"
}
];
---
<Layout
@ -256,7 +203,6 @@ const allCases = [
<RelatedCases
title="Другие кейсы"
subtitle="ПОХОЖИЕ ДЕЛА"
cases={allCases}
currentCaseId={1}
/>
</Layout>

View file

@ -4,59 +4,6 @@ import { SITE_URL } from '@constants';
import PageHero from "@components/base/PageHero.astro";
import RelatedCases from "@components/cases/RelatedCases.astro";
import AdBanner from "@components/base/AdBanner.astro";
const allCases = [
{
id: 1,
title: "Возврат прав после лишения по ст. 12.8 КоАП",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент был лишён прав на 18 месяцев за якобы управление в состоянии опьянения. Мы нашли процессуальные нарушения при составлении протокола.",
resultLabel: "Лишение отменено",
duration: "3 месяца",
href: "/cases/driving-license-return-12-8"
},
{
id: 2,
title: "Взыскание 450 000 ₽ со страховой по ОСАГО",
category: "Страховые споры",
categoryIcon: "📋",
description: "Страховая компания выплатила лишь 120 000 ₽ при реальном ущербе в 570 000 ₽ после серьёзного ДТП.",
resultLabel: "Взыскано 450 000 ₽",
duration: "5 месяцев",
href: "/cases/osago-claim-450k"
},
{
id: 3,
title: "Оспаривание вины в ДТП с пострадавшим",
category: "ДТП и разбор",
categoryIcon: "🚨",
description: "Клиента обвиняли в нарушении ПДД, повлёкшем ДТП с пострадавшим. Грозил штраф и лишение прав.",
resultLabel: "Виновность не доказана",
duration: "4 месяца",
href: "/cases/dti-innocence-proof"
},
{
id: 4,
title: "Доказывание невиновности в ДТП",
category: "Споры ГИБДД",
categoryIcon: "🚨",
description: "Клиента признали виновным в ДТП на основании рапорта инспектора. Мы доказали несостоятельность обвинения.",
resultLabel: "Виновность не доказана",
duration: "3 месяца",
href: "/cases/dtp-innocence-proof"
},
{
id: 5,
title: "Возврат прав после лишения за выезд на встречку",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент лишён прав на 6 месяцев за выезд на полосу встречного движения. Камера зафиксировала нарушение.",
resultLabel: "Дело прекращено",
duration: "2 месяца",
href: "/cases/license-return-camera"
}
];
---
<Layout
@ -254,7 +201,6 @@ const allCases = [
<RelatedCases
title="Другие кейсы"
subtitle="ПОХОЖИЕ ДЕЛА"
cases={allCases}
currentCaseId={3}
/>
</Layout>

View file

@ -4,49 +4,6 @@ import { SITE_URL } from '@constants';
import PageHero from "@components/base/PageHero.astro";
import RelatedCases from "@components/cases/RelatedCases.astro";
import AdBanner from "@components/base/AdBanner.astro";
const allCases = [
{
id: 1,
title: "Возврат прав после лишения по ст. 12.8 КоАП",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент был лишён прав на 18 месяцев за якобы управление в состоянии опьянения. Мы нашли процессуальные нарушения при составлении протокола.",
resultLabel: "Лишение отменено",
duration: "3 месяца",
href: "/cases/driving-license-return-12-8"
},
{
id: 2,
title: "Взыскание 450 000 ₽ со страховой по ОСАГО",
category: "Страховые споры",
categoryIcon: "📋",
description: "Страховая компания выплатила лишь 120 000 ₽ при реальном ущербе в 570 000 ₽ после серьёзного ДТП.",
resultLabel: "Взыскано 450 000 ₽",
duration: "5 месяцев",
href: "/cases/osago-claim-450k"
},
{
id: 3,
title: "Оспаривание вины в ДТП с пострадавшим",
category: "ДТП и разбор",
categoryIcon: "🚨",
description: "Клиента обвиняли в нарушении ПДД, повлёкшем ДТП с пострадавшим. Грозил штраф и лишение прав.",
resultLabel: "Виновность не доказана",
duration: "4 месяца",
href: "/cases/dti-innocence-proof"
},
{
id: 5,
title: "Возврат прав после лишения за выезд на встречку",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент лишён прав на 6 месяцев за выезд на полосу встречного движения. Камера зафиксировала нарушение.",
resultLabel: "Дело прекращено",
duration: "2 месяца",
href: "/cases/license-return-camera"
}
];
---
<Layout
@ -243,7 +200,6 @@ const allCases = [
<RelatedCases
title="Другие кейсы"
subtitle="ПОХОЖИЕ ДЕЛА"
cases={allCases}
currentCaseId={4}
/>
</Layout>

View file

@ -4,49 +4,6 @@ import { SITE_URL } from '@constants';
import PageHero from "@components/base/PageHero.astro";
import RelatedCases from "@components/cases/RelatedCases.astro";
import AdBanner from "@components/base/AdBanner.astro";
const allCases = [
{
id: 1,
title: "Возврат прав после лишения по ст. 12.8 КоАП",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент был лишён прав на 18 месяцев за якобы управление в состоянии опьянения. Мы нашли процессуальные нарушения при составлении протокола.",
resultLabel: "Лишение отменено",
duration: "3 месяца",
href: "/cases/driving-license-return-12-8"
},
{
id: 2,
title: "Взыскание 450 000 ₽ со страховой по ОСАГО",
category: "Страховые споры",
categoryIcon: "📋",
description: "Страховая компания выплатила лишь 120 000 ₽ при реальном ущербе в 570 000 ₽ после серьёзного ДТП.",
resultLabel: "Взыскано 450 000 ₽",
duration: "5 месяцев",
href: "/cases/osago-claim-450k"
},
{
id: 3,
title: "Оспаривание вины в ДТП с пострадавшим",
category: "ДТП и разбор",
categoryIcon: "🚨",
description: "Клиента обвиняли в нарушении ПДД, повлёкшем ДТП с пострадавшим. Грозил штраф и лишение прав.",
resultLabel: "Виновность не доказана",
duration: "4 месяца",
href: "/cases/dti-innocence-proof"
},
{
id: 5,
title: "Возврат прав после лишения за выезд на встречку",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент лишён прав на 6 месяцев за выезд на полосу встречного движения. Камера зафиксировала нарушение.",
resultLabel: "Дело прекращено",
duration: "2 месяца",
href: "/cases/license-return-camera"
}
];
---
<Layout
@ -240,7 +197,6 @@ const allCases = [
<RelatedCases
title="Другие кейсы"
subtitle="ПОХОЖИЕ ДЕЛА"
cases={allCases}
currentCaseId={6}
/>
</Layout>

View file

@ -4,39 +4,6 @@ import { SITE_URL } from '@constants';
import PageHero from "@components/base/PageHero.astro";
import RelatedCases from "@components/cases/RelatedCases.astro";
import AdBanner from "@components/base/AdBanner.astro";
const allCases = [
{
id: 1,
title: "Возврат прав после лишения по ст. 12.8 КоАП",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент был лишён прав на 18 месяцев за якобы управление в состоянии опьянения. Мы нашли процессуальные нарушения при составлении протокола.",
resultLabel: "Лишение отменено",
duration: "3 месяца",
href: "/cases/driving-license-return-12-8"
},
{
id: 4,
title: "Доказывание невиновности в ДТП",
category: "Споры ГИБДД",
categoryIcon: "🚨",
description: "Клиента признали виновным в ДТП на основании рапорта инспектора. Мы доказали несостоятельность обвинения.",
resultLabel: "Виновность не доказана",
duration: "3 месяца",
href: "/cases/dtp-innocence-proof"
},
{
id: 5,
title: "Возврат прав после лишения за выезд на встречку",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент лишён прав на 6 месяцев за выезд на полосу встречного движения. Камера зафиксировала нарушение.",
resultLabel: "Дело прекращено",
duration: "2 месяца",
href: "/cases/license-return-camera"
}
];
---
<Layout
@ -234,7 +201,6 @@ const allCases = [
<RelatedCases
title="Другие кейсы"
subtitle="ПОХОЖИЕ ДЕЛА"
cases={allCases}
currentCaseId={5}
/>
</Layout>

View file

@ -4,59 +4,6 @@ import { SITE_URL } from '@constants';
import PageHero from "@components/base/PageHero.astro";
import RelatedCases from "@components/cases/RelatedCases.astro";
import AdBanner from "@components/base/AdBanner.astro";
const allCases = [
{
id: 1,
title: "Возврат прав после лишения по ст. 12.8 КоАП",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент был лишён прав на 18 месяцев за якобы управление в состоянии опьянения. Мы нашли процессуальные нарушения при составлении протокола.",
resultLabel: "Лишение отменено",
duration: "3 месяца",
href: "/cases/driving-license-return-12-8"
},
{
id: 2,
title: "Взыскание 450 000 ₽ со страховой по ОСАГО",
category: "Страховые споры",
categoryIcon: "📋",
description: "Страховая компания выплатила лишь 120 000 ₽ при реальном ущербе в 570 000 ₽ после серьёзного ДТП.",
resultLabel: "Взыскано 450 000 ₽",
duration: "5 месяцев",
href: "/cases/osago-claim-450k"
},
{
id: 3,
title: "Оспаривание вины в ДТП с пострадавшим",
category: "ДТП и разбор",
categoryIcon: "🚨",
description: "Клиента обвиняли в нарушении ПДД, повлёкшем ДТП с пострадавшим. Грозил штраф и лишение прав.",
resultLabel: "Виновность не доказана",
duration: "4 месяца",
href: "/cases/dti-innocence-proof"
},
{
id: 4,
title: "Доказывание невиновности в ДТП",
category: "Споры ГИБДД",
categoryIcon: "🚨",
description: "Клиента признали виновным в ДТП на основании рапорта инспектора. Мы доказали несостоятельность обвинения.",
resultLabel: "Виновность не доказана",
duration: "3 месяца",
href: "/cases/dtp-innocence-proof"
},
{
id: 5,
title: "Возврат прав после лишения за выезд на встречку",
category: "Водительские права",
categoryIcon: "🚗",
description: "Клиент лишён прав на 6 месяцев за выезд на полосу встречного движения. Камера зафиксировала нарушение.",
resultLabel: "Дело прекращено",
duration: "2 месяца",
href: "/cases/license-return-camera"
}
];
---
<Layout
@ -253,7 +200,6 @@ const allCases = [
<RelatedCases
title="Другие кейсы"
subtitle="ПОХОЖИЕ ДЕЛА"
cases={allCases}
currentCaseId={2}
/>
</Layout>