diff --git a/.opencode/skills/avtourist/SKILL.md b/.opencode/skills/avtourist/SKILL.md new file mode 100644 index 0000000..517e627 --- /dev/null +++ b/.opencode/skills/avtourist/SKILL.md @@ -0,0 +1,99 @@ +# avtourist + +Проект: avtourist-surgut.ru — автоюрист в Сургуте. + +Стек: Astro (SSR) + PocketBase + Tailwind CSS. + +## Коллекции PocketBase + +- `posts` — статьи блога +- `reviews` — отзывы +- `comments` — комментарии +- `cases` — кейсы +- `consultations` — консультации +- `users` — пользователи +- `post_votes` — голоса за посты + +## Структура проекта + +``` +frontend/ +├── src/ +│ ├── pages/ +│ │ ├── index.astro # Главная +│ │ ├── services/ # Услуги +│ │ ├── cases/ # Кейсы +│ │ ├── blog/ # Блог +│ │ ├── api/ # API эндпоинты +│ │ └── auth/ # Авторизация +│ ├── layouts/ # Layouts +│ ├── lib/ # PocketBase клиент +│ └── globalInterfaces.ts # Типы +``` + +## Категории блога + +- ДТП +- Лишение прав +- Страховые споры +- Штрафы ГИБДД +- Возмещение ущерба +- Судебные дела + +## Категории услуг + +- Возврат прав +- Оспаривание штрафов +- Страховые споры (ОСАГО, КАСКО) +- ДТП и здоровье +- Представительство в суде +- Обжалование постановлений + +## Категории кейсов + +- insurance — страховые +- rights — лишение прав +- accident — ДТП +- court — судебные +- consultation — консультации + +## Компоненты + +Использовать готовые компоненты из проекта: +- ServiceCard — карточка услуги +- CaseCard — карточка кейса +- ReviewCard — карточка отзыва +- ArticleCard — карточка статьи + +## Типы + +Все типы определены в `frontend/src/globalInterfaces.ts`: +- Post +- Review +- Case +- DocumentItem +- CompanyInfo + +## API-эндпоинты + +- `/api/posts` — список постов +- `/api/posts/[slug]` — один пост +- `/api/reviews` — отзывы +- `/api/comments` — комментарии +- `/api/votes` — голоса +- `/api/consultation` — форма консультации +- `/api/auth/*` — авторизация + +## Переменные окружения + +``` +PB_POCKETBASE_URL=http://127.0.0.1:8090 +``` + +## Правила + +1. Все запросы к PB — на сервере (frontmatter) +2. Использовать типы из globalInterfaces.ts +3. Не использовать any +4. Компоненты — только .astro с Tailwind +5. API-эндпоинты — в src/pages/api/ \ No newline at end of file diff --git a/.opencode/skills/common b/.opencode/skills/common new file mode 120000 index 0000000..daee0ca --- /dev/null +++ b/.opencode/skills/common @@ -0,0 +1 @@ +C:/Users/Serg/.config/opencode/skills \ No newline at end of file diff --git a/frontend/src/components/home/Steps.astro b/frontend/src/components/home/Steps.astro index c318047..63ce9f3 100644 --- a/frontend/src/components/home/Steps.astro +++ b/frontend/src/components/home/Steps.astro @@ -53,9 +53,9 @@ const {

{sectionTitle}

-

- Мы создали прозрачную систему взаимодействия, чтобы вы всегда знали, на каком этапе находится ваше дело -

+

+ 4 шага до результата. Оплата только за победу в суде. +

diff --git a/frontend/src/components/services/AboutTabs.astro b/frontend/src/components/services/AboutTabs.astro index ef17ad8..f289fd5 100644 --- a/frontend/src/components/services/AboutTabs.astro +++ b/frontend/src/components/services/AboutTabs.astro @@ -48,9 +48,9 @@ const finalSectionDesc = sectionDesc || defaultProps.sectionDesc; const defaultTabsData = { problem: { - title: "Остановка инспектором — критически важный момент", - description: "Большинство водителей теряют свои права именно на этапе остановки и общения с инспектором до начала оформления протокола. В этот момент важно знать свои права и фиксировать любые нарушения.", - description2: "Инспекторы часто допускают нарушения: не разъясняют права, проводят освидетельствование без понятых, не предоставляют информацию о порядке обжалования. Чем раньше подключится юрист — тем больше шансов на успех.", + title: "Потеря прав в 70% случаев происходит при остановке", + description: "**Потеря прав происходит на этапе остановки.** 70% дел проиграны из-за ошибок в первые минуты после остановки. Без юриста водитель не знает своих прав и не фиксирует нарушения инспектора.", + description2: "**Инспектор обязан соблюдать процедуру.** При нарушении — основание для прекращения дела. Инспектор должен: разъяснить права, проводить освидетельствование при понятых или на камеру, выдать копию протокола.", items: [ "Нарушение процедуры остановки и освидетельствования", "Отсутствие понятых или видеофиксации", @@ -62,9 +62,9 @@ const defaultTabsData = { barWidth: 70 }, approach: { - title: "Оперативная защита с первой минуты", - description: "Мы обеспечиваем юридическое сопровождение с момента остановки инспектором. Контролируем каждый шаг: законность требований, порядок освидетельствования, правильность заполнения документов.", - description2: "Наша задача — не допустить нарушений ещё на этапе оформления. Если протокол составлен с ошибками — это основание для прекращения дела.", + title: "Защита с момента остановки", + description: "**Юридическое сопровождение начинается сразу после остановки.** Контролируем каждый шаг: законность требований, порядок освидетельствования, правильность заполнения документов.", + description2: "**Задача юриста — не допустить нарушений при оформлении.** Если протокол составлен с ошибками — это основание для прекращения дела.", items: [ { icon: "📞", title: "Консультация по телефону", desc: "Правильное поведение при остановке" }, { icon: "🚗", title: "Выезд на место", desc: "Защита при оформлении" }, @@ -83,11 +83,11 @@ const defaultTabsData = { }, guarantees: { title: "Работаем на результат", - description: "Мы берёмся только за дела с реальными перспективами. Если защита на раннем этапе не помогла — мы вернём оплату за услугу.", - description2: "Если протокол составлен без нарушений — мы честно скажем об этом на первой консультации и предложим стратегию защиты на следующих этапах.", + description: "**Берёмся только за дел�� с реальными перспективами.** Если защита на раннем этапе не помогла — возвращаем оплату за услугу.", + description2: "Если протокол составлен без нарушений — честно скажем об этом на первой консультации и предложим стратегию защиты на следующих этапах.", items: [ { title: "Бесплатная оценка", desc: "Честный анализ перспектив дела на консультации" }, - { title: "Возврат денег", desc: "Если защита не сработала — вернём оплату" }, + { title: "Возврат денег", desc: "Если защита не сработала — возвращаем оплату" }, { title: "Договор", desc: "Официальный договор с прописанными условиями" }, { title: "Оперативность", desc: "Выезд на место в течение 30 минут" } ] @@ -109,15 +109,15 @@ const finalTabsData = tabsDataProp || defaultTabsData;
))} +
+ Что делать: Позвоните нам сразу после остановки. Юрист выезжает на место за 30 минут и контролирует правильность оформления. +
@@ -160,8 +163,8 @@ const finalTabsData = tabsDataProp || defaultTabsData;

{finalTabsData.approach.title}

-

-

+

{finalTabsData.approach.description}

+

{finalTabsData.approach.description2}

{finalTabsData.approach.items.map(item => (
@@ -435,6 +438,22 @@ const finalTabsData = tabsDataProp || defaultTabsData; flex-shrink: 0; } + .takeaway-box { + margin-top: 1.5rem; + padding: 1rem 1.25rem; + background: linear-gradient(135deg, #0a2540, #1e3050); + border-radius: 10px; + color: #fff; + font-size: 0.95rem; + line-height: 1.6; + } + + .takeaway-box strong { + color: #eac26e; + display: block; + margin-bottom: 0.25rem; + } + .tab-visual { max-width: 100%; } diff --git a/frontend/src/components/services/WorkSteps.astro b/frontend/src/components/services/WorkSteps.astro index 370da93..f49b337 100644 --- a/frontend/src/components/services/WorkSteps.astro +++ b/frontend/src/components/services/WorkSteps.astro @@ -24,8 +24,8 @@ const defaultSteps: Step[] = [ const finalSteps = stepsProp || defaultSteps; const finalSectionLabel = sectionLabel || "Этапы работы"; -const finalSectionTitle = sectionTitle || "Как мы защищаем ваши права"; -const finalSectionDesc = sectionDesc || "Оперативная помощь с момента остановки до прекращения дела"; +const finalSectionTitle = sectionTitle || "5 шагов до возврата прав"; +const finalSectionDesc = sectionDesc || "Защита начинается сразу после остановки"; ---
diff --git a/frontend/src/layouts/CaseLayout.astro b/frontend/src/layouts/CaseLayout.astro index 038eb09..6e38fa2 100644 --- a/frontend/src/layouts/CaseLayout.astro +++ b/frontend/src/layouts/CaseLayout.astro @@ -254,6 +254,44 @@ const breadcrumbs = [ margin: 0 0 1rem 0; } + .case-takeaway { + background: linear-gradient(135deg, #0a2540, #1e3050); + border-radius: 12px; + padding: 1.5rem 2rem; + margin-top: 1.5rem; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1.5rem; + } + + .case-takeaway p { + color: rgba(255, 255, 255, 0.85); + font-size: 1rem; + margin: 0; + flex: 1; + } + + .case-takeaway strong { + color: #eac26e; + } + + .case-takeaway__btn { + background: linear-gradient(135deg, #eac26e, #ce9f40); + color: #0a2540; + padding: 0.75rem 1.5rem; + border-radius: 8px; + font-weight: 700; + font-size: 0.9rem; + text-decoration: none; + white-space: nowrap; + transition: all 0.3s ease; + } + + .case-takeaway__btn:hover { + box-shadow: 0 8px 20px rgba(234, 194, 110, 0.4); + } + .case-sidebar { position: sticky; top: 100px; diff --git a/frontend/src/pages/cases/casco-damage-claim.astro b/frontend/src/pages/cases/casco-damage-claim.astro index cde6dda..17f5a2e 100644 --- a/frontend/src/pages/cases/casco-damage-claim.astro +++ b/frontend/src/pages/cases/casco-damage-claim.astro @@ -17,18 +17,9 @@ import CaseLayout from '@layouts/CaseLayout.astro'; >

- Наш клиент стал участником серьёзного ДТП, в котором виновником - был признан другой водитель. Автомобиль клиента получил значительные - повреждения. -

-

- Страховая компания по КАСКО выплатила 320 000 ₽, - однако реальная стоимость ущерба составила 600 000 ₽. -

-

- Виновник ДТП отказался добровольно возмещать разницу, ссылаясь - на то, что у него есть ОСАГО и все претензии нужно предъявлять - страховым компаниям. + Страховая по КАСКО выплатила 320 000 ₽, а реальный ущерб составил 600 000 ₽. + Клиент стал участником серьёзного ДТП, автомобиль получил значительные повреждения. + Виновник отказался добровольно возмещать разницу.

@@ -92,4 +83,8 @@ import CaseLayout from '@layouts/CaseLayout.astro'; представительство в суде.

+
+

Похожий случай? Закажите бесплатную консультацию — оценим перспективы вашего дела.

+ Получить консультацию +
\ No newline at end of file diff --git a/frontend/src/pages/cases/driving-license-return-12-8.astro b/frontend/src/pages/cases/driving-license-return-12-8.astro index 311e6a3..f3cdc5b 100644 --- a/frontend/src/pages/cases/driving-license-return-12-8.astro +++ b/frontend/src/pages/cases/driving-license-return-12-8.astro @@ -65,7 +65,7 @@ import AdBanner from "@components/base/AdBanner.astro";

🔍 - Что было сделано + Наша стратегия защиты

@@ -116,7 +116,7 @@ import AdBanner from "@components/base/AdBanner.astro";

⚖️ - Судебное решение + Результат

@@ -138,6 +138,10 @@ import AdBanner from "@components/base/AdBanner.astro";
+
+

Похожий случай? Закажите бесплатную консультацию — оценим перспективы вашего дела.

+ Получить консультацию +
@@ -64,7 +59,7 @@ import AdBanner from "@components/base/AdBanner.astro";

🔍 - Что было сделано + Наша стратегия защиты

@@ -115,7 +110,7 @@ import AdBanner from "@components/base/AdBanner.astro";

⚖️ - Судебное решение + Результат

@@ -127,7 +122,7 @@ import AdBanner from "@components/base/AdBanner.astro";

Суд, изучив представленные доказательства и видеозаписи, - пришёл к выводу о недоказанности вины нашего клиента. + пришёл к выводу о недоказанности вины клиента.

Дело прекращено за отсутствием состава правонарушения. @@ -136,6 +131,10 @@ import AdBanner from "@components/base/AdBanner.astro";

+
+

Похожий случай? Закажите бесплатную консультацию — оценим перспективы вашего дела.

+ Получить консультацию +