diff --git a/frontend/README.md b/frontend/README.md index b6de9b9..93c5447 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,46 +1,149 @@ -# Astro Starter Kit: Basics +# 🚗 Автоюрист Сургут — Центр защиты прав водителей + +> Профессиональная юридическая помощь для автомобилистов в Сургуте + +![Автоюрист Сургут](/public/images/home/avtourist-surgut.avif) + +**🌐 Сайт:** [avtourist-surgut.ru](https://avtourist-surgut.ru/) + +--- + +## О проекте + +**Автоюрист 086** — современный веб-сайт юридической компании, специализирующейся на защите прав водителей. Сайт предоставляет информацию об услугах, реальных кейсах, отзывах клиентов и полезных материалы в блоге. + +### 📍 Контакты + +- **Адрес:** г. Сургут, пр. Комсомольский, д. 19 +- **Телефон:** [+7 (922) 253-83-75](tel:+79222538375) +- **Email:** [redibedi2019@gmail.com](mailto:redibedi2019@gmail.com) +- **Часы работы:** Пн-Пт: 9:00 - 18:00 + +--- + +## 🚀 Технологии + +| Технология | Назначение | +|------------|------------| +| [Astro 6](https://astro.build/) | Фреймворк для серверного рендеринга | +| [Tailwind CSS 4](https://tailwindcss.com/) | Утилитарный CSS-фреймворк | +| [MDX](https://mdxjs.com/) | Контент с JSX-компонентами | +| [Node.js](https://nodejs.org/) | Серверный адаптер (standalone) | +| [TypeScript](https://www.typescriptlang.org/) | Типизация | + +--- + +## 📁 Структура проекта -```sh -bun create astro@latest -- --template basics ``` - -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! - -## 🚀 Project Structure - -Inside of your Astro project, you'll see the following folders and files: - -```text -/ +frontend/ ├── public/ -│ └── favicon.svg -├── src -│   ├── assets -│   │   └── astro.svg -│   ├── components -│   │   └── Welcome.astro -│   ├── layouts -│   │   └── Layout.astro -│   └── pages -│   └── index.astro -└── package.json +│ ├── images/ # Изображения по разделам +│ │ ├── blog/ # Для блога +│ │ ├── cases/ # Для кейсов +│ │ ├── contacts/ # Для контактов +│ │ ├── home/ # Для главной страницы +│ │ ├── posts/ # Для постов +│ │ ├── reviews/ # Для отзывов +│ │ └── services/ # Для услуг +│ └── favicons/ # Иконки сайта +├── src/ +│ ├── components/ # Компоненты Astro +│ │ ├── auth/ # Аутентификация +│ │ ├── base/ # Базовые элементы +│ │ ├── blog/ # Компоненты блога +│ │ ├── cases/ # Компоненты кейсов +│ │ ├── home/ # Компоненты главной +│ │ ├── layout/ # Layout-компоненты +│ │ ├── reviews/ # Компоненты отзывов +│ │ └── services/ # Компоненты услуг +│ ├── content/ # Контент (блог, страницы) +│ ├── data/ # Данные (кейсы, отзывы) +│ ├── layouts/ # Основные layouts +│ ├── pages/ # Маршруты (SSR) +│ │ ├── auth/ # Страницы авторизации +│ │ ├── blog/ # Страницы блога +│ │ └── *.astro # Основные страницы +│ ├── styles/ # Глобальные стили +│ ├── constants.ts # Константы сайта +│ └── content.config.ts # Конфигурация контента +├── astro.config.mjs # Конфигурация Astro +└── package.json # Зависимости ``` -To learn more about the folder structure of an Astro project, refer to [our guide on project structure](https://docs.astro.build/en/basics/project-structure/). +--- -## 🧞 Commands +## 📄 Страницы сайта -All commands are run from the root of the project, from a terminal: +| Страница | URL | Описание | +|----------|-----|----------| +| Главная | `/` | Hero-секция, услуги, преимущества | +| Услуги | `/services` | Перечень юридических услуг | +| Кейсы | `/cases` | Реальные дела компании | +| Блог | `/blog` | Полезные статьи для водителей | +| Отзывы | `/reviews` | Отзывы клиентов | +| Контакты | `/contacts` | Адрес, карта, форма связи | +| FAQ | `/faq` | Часто задаваемые вопросы | +| Privacy | `/privacy` | Политика конфиденциальности | +| Terms | `/terms` | Пользовательское соглашение | -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `bun install` | Installs dependencies | -| `bun dev` | Starts local dev server at `localhost:4321` | -| `bun build` | Build your production site to `./dist/` | -| `bun preview` | Preview your build locally, before deploying | -| `bun astro ...` | Run CLI commands like `astro add`, `astro check` | -| `bun astro -- --help` | Get help using the Astro CLI | +--- -## 👀 Want to learn more? +## 🛠️ Команды -Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). +Все команды выполняются через **Bun** из директории `frontend/`: + +| Команда | Описание | +|---------|----------| +| `bun install` | Установить зависимости | +| `bun dev` | Запустить dev-сервер (`localhost:4321`) | +| `bun build` | Собрать production-версию в `./dist/` | +| `bun preview` | Превью production-сборки | +| `bun astro ...` | Astro CLI команды | + +--- + +## ⚙️ Конфигурация + +Проект работает в режиме **SSR** (Server-Side Rendering) с использованием адаптера **Node.js** в standalone-режиме. + +```js +// astro.config.mjs +output: 'server', +adapter: node({ mode: 'standalone' }), +``` + +--- + +## 📋 Требования + +- **Node.js:** `>=22.12.0` +- **Пакетный менеджер:** [Bun](https://bun.sh/) + +--- + +## 🐳 Docker + +Проект включает [Dockerfile](./Dockerfile) для контейнеризации и удобного развертывания. + +--- + +## 👨‍💻 Разработка + +1. Установите зависимости: + ```bash + bun install + ``` + +2. Запустите dev-сервер: + ```bash + bun dev + ``` + +3. Откройте [http://localhost:4321](http://localhost:4321) + +--- + +## 📝 Лицензия + +Все права защищены © Автоюрист Сургут diff --git a/frontend/public/images/posts/2026/04/car-dealer-dispute.avif b/frontend/public/images/posts/2026/04/car-dealer-dispute.avif new file mode 100644 index 0000000..0eddb36 Binary files /dev/null and b/frontend/public/images/posts/2026/04/car-dealer-dispute.avif differ diff --git a/frontend/src/content/blog/car-dealer-dispute.mdx b/frontend/src/content/blog/car-dealer-dispute.mdx index 8d5ecfd..afb7148 100644 --- a/frontend/src/content/blog/car-dealer-dispute.mdx +++ b/frontend/src/content/blog/car-dealer-dispute.mdx @@ -1,12 +1,12 @@ --- title: "Спор с автосалоном: как вернуть неисправный автомобиль" description: "Права потребителя при покупке автомобиля с дефектами. Закон «О защите прав потребителей» и судебная практика в Сургуте." -author: "Юрист АВ" +author: "Автоюрист" category: "Автосалоны" categoryColor: "bg-gold" date: 2024-02-20 readTime: "11 мин" -imageUrl: "/images/blog/car-dealer-dispute.avif" +imageUrl: "/images/posts/2026/04/car-dealer-dispute.avif" draft: false --- diff --git a/frontend/src/pages/blog/index.astro b/frontend/src/pages/blog/index.astro index 3203a70..10cafe0 100644 --- a/frontend/src/pages/blog/index.astro +++ b/frontend/src/pages/blog/index.astro @@ -114,7 +114,7 @@ const categories = ['Все', ...new Set(posts.map((post: any) => post.data.cate } .blog-card-wrapper { - transition: opacity 0.3s ease, transform 0.3s ease; + transition: opacity 0.3s ease, transform 0.3s ease, display 0.3s ease; } /* ===== RESPONSIVE ===== */ @@ -164,6 +164,44 @@ const categories = ['Все', ...new Set(posts.map((post: any) => post.data.cate }); }; + const setupFilter = () => { + const buttons = document.querySelectorAll('.category-btn'); + const cards = document.querySelectorAll('.blog-card-wrapper'); + const grid = document.getElementById('blog-grid'); + + buttons.forEach((btn) => { + btn.addEventListener('click', (e) => { + e.preventDefault(); + const category = btn.getAttribute('data-category'); + + // Обновляем активную кнопку + buttons.forEach(b => b.classList.remove('active')); + btn.classList.add('active'); + + // Фильтруем карточки + cards.forEach((card) => { + const cardCategory = card.getAttribute('data-category'); + if (category === 'Все' || cardCategory === category) { + card.style.display = ''; + card.style.opacity = '0'; + card.style.transform = 'translateY(20px)'; + requestAnimationFrame(() => { + card.style.transition = 'opacity 0.4s ease, transform 0.4s ease'; + card.style.opacity = '1'; + card.style.transform = 'translateY(0)'; + }); + } else { + card.style.display = 'none'; + } + }); + }); + }); + }; + setupAnimations(); - document.addEventListener('astro:after-swap', setupAnimations); + setupFilter(); + document.addEventListener('astro:after-swap', () => { + setupAnimations(); + setupFilter(); + });