Новые правки компоентов
This commit is contained in:
parent
9122756a58
commit
1838fd302d
14 changed files with 88 additions and 79 deletions
11
AGENTS.md
11
AGENTS.md
|
|
@ -33,22 +33,17 @@
|
||||||
7. **Язык общения**
|
7. **Язык общения**
|
||||||
- Всё общение с пользователем происходит на русском языке
|
- Всё общение с пользователем происходит на русском языке
|
||||||
|
|
||||||
8. **Проверка изменений**
|
8 **Проверка типов данных**
|
||||||
- После внесения изменений в код не требуется запускать сервер разработки для проверки
|
|
||||||
- Пользователь самостоятельно запускает сервер и проверяет изменения
|
|
||||||
|
|
||||||
9. **Проверка типов данных**
|
|
||||||
- Проверять проект на ошибки типизации через команду `bun run tsc --noEmit -p frontend/tsconfig.json`
|
- Проверять проект на ошибки типизации через команду `bun run tsc --noEmit -p frontend/tsconfig.json`
|
||||||
|
- Не производить сборку проекта без моего разрешения
|
||||||
- В проекте не должно быть типов any
|
- В проекте не должно быть типов any
|
||||||
- Все интерфейсы компонентов прописывать в файле globalInterfaces.ts
|
- Все интерфейсы компонентов прописывать в файле globalInterfaces.ts
|
||||||
- При работе с PocketBase использовать актуальные сигнатуры методов из файла `D:\Verstka\production\astro_minivan\frontend\node_modules\pocketbase\dist\pocketbase.es.d.ts`
|
- При работе с PocketBase использовать актуальные сигнатуры методов из файла `D:\Verstka\production\astro_minivan\frontend\node_modules\pocketbase\dist\pocketbase.es.d.ts`
|
||||||
|
|
||||||
10. **Плагин @astrojs/sitemap**
|
9 **Плагин @astrojs/sitemap**
|
||||||
- Обязательно к установке в проект пакета @astrojs/sitemap
|
- Обязательно к установке в проект пакета @astrojs/sitemap
|
||||||
- Обязательно к созданию в проекте файла .nvmrc
|
- Обязательно к созданию в проекте файла .nvmrc
|
||||||
|
|
||||||
11. **Замена хоста при развертывании проекта**
|
|
||||||
- Обязательно нужно изменить http://localhost:3000/ в шаблонах писем на реальный
|
|
||||||
|
|
||||||
## Технические правила (Astro)
|
## Технические правила (Astro)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ const delay = typeof dataDelay === 'number' ? dataDelay : parseInt(String(dataDe
|
||||||
data-delay={delay}
|
data-delay={delay}
|
||||||
>
|
>
|
||||||
<div class="lock-icon-container">
|
<div class="lock-icon-container">
|
||||||
<svg class="w-8 h-8 md:w-10 md:h-10 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -64,8 +64,8 @@ const delay = typeof dataDelay === 'number' ? dataDelay : parseInt(String(dataDe
|
||||||
}
|
}
|
||||||
|
|
||||||
.lock-icon-container {
|
.lock-icon-container {
|
||||||
width: 4rem;
|
width: 3rem;
|
||||||
height: 4rem;
|
height: 3rem;
|
||||||
background: linear-gradient(135deg, rgba(37, 99, 235, 0.2) 0%, rgba(30, 64, 175, 0.3) 100%);
|
background: linear-gradient(135deg, rgba(37, 99, 235, 0.2) 0%, rgba(30, 64, 175, 0.3) 100%);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -78,8 +78,20 @@ const delay = typeof dataDelay === 'number' ? dataDelay : parseInt(String(dataDe
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
.lock-icon-container {
|
.lock-icon-container {
|
||||||
width: 5rem;
|
width: 4rem;
|
||||||
height: 5rem;
|
height: 4rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lock-icon-container svg {
|
||||||
|
width: 1.5rem;
|
||||||
|
height: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.lock-icon-container svg {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -207,5 +207,4 @@ const iconPaths: Record<string, string> = {
|
||||||
};
|
};
|
||||||
|
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
document.addEventListener('astro:page-load', setupAnimations);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,6 @@ const { categories, activeCategory = 'Все', currentPage = 1 } = Astro.props;
|
||||||
<script>
|
<script>
|
||||||
// Клиентская логика фильтрации
|
// Клиентская логика фильтрации
|
||||||
document.addEventListener('DOMContentLoaded', initFilter);
|
document.addEventListener('DOMContentLoaded', initFilter);
|
||||||
document.addEventListener('astro:page-load', initFilter);
|
|
||||||
|
|
||||||
function initFilter() {
|
function initFilter() {
|
||||||
const links = document.querySelectorAll('.category-btn');
|
const links = document.querySelectorAll('.category-btn');
|
||||||
|
|
|
||||||
|
|
@ -281,9 +281,4 @@ const colors = ['bg-gradient-1', 'bg-gradient-2', 'bg-gradient-3', 'bg-gradient-
|
||||||
|
|
||||||
setupSlider();
|
setupSlider();
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
|
|
||||||
document.addEventListener('astro:page-load', () => {
|
|
||||||
setupSlider();
|
|
||||||
setupAnimations();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -105,8 +105,8 @@ export default function ReviewFormContainer() {
|
||||||
<Show when={isAuthenticated()} fallback={
|
<Show when={isAuthenticated()} fallback={
|
||||||
<div class="mx-auto w-full max-w-[700px]">
|
<div class="mx-auto w-full max-w-[700px]">
|
||||||
<div class="bg-gradient-to-br from-slate-50 to-slate-100 rounded-2xl border border-slate-200 p-6 md:p-12 text-center">
|
<div class="bg-gradient-to-br from-slate-50 to-slate-100 rounded-2xl border border-slate-200 p-6 md:p-12 text-center">
|
||||||
<div class="w-16 md:w-20 mx-auto mb-4 md:mb-6 rounded-full flex items-center justify-center bg-gradient-to-br from-blue-500/20 to-blue-900/30">
|
<div class="w-10 h-10 md:w-16 md:h-16 mx-auto mb-4 md:mb-6 rounded-full flex items-center justify-center" style="background: linear-gradient(135deg, rgba(37, 99, 235, 0.2) 0%, rgba(30, 64, 175, 0.3) 100%);">
|
||||||
<svg class="w-8 md:w-10 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="w-5 md:w-8 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
import "@styles/global.css";
|
import "@styles/global.css";
|
||||||
import { SITE_TITLE_SUFFIX } from "@constants";
|
import { SITE_TITLE_SUFFIX } from "@constants";
|
||||||
import { ClientRouter } from 'astro:transitions';
|
|
||||||
|
|
||||||
import Header from "@components/layout/header/Header.astro";
|
import Header from "@components/layout/header/Header.astro";
|
||||||
import Footer from "@components/layout/footer/Footer.astro";
|
import Footer from "@components/layout/footer/Footer.astro";
|
||||||
|
|
@ -35,7 +34,6 @@ const { title, description, canonicalLink, breadcrumbs } = Astro.props;
|
||||||
<link rel="sitemap" href="/sitemap-index.xml" />
|
<link rel="sitemap" href="/sitemap-index.xml" />
|
||||||
<!-- Yandex верификация -->
|
<!-- Yandex верификация -->
|
||||||
<meta name="yandex-verification" content="be3edfd138348e43" />
|
<meta name="yandex-verification" content="be3edfd138348e43" />
|
||||||
<ClientRouter />
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<Toast />
|
<Toast />
|
||||||
|
|
@ -66,26 +64,6 @@ const { title, description, canonicalLink, breadcrumbs } = Astro.props;
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Сохраняем позицию скролла перед переходом
|
|
||||||
document.addEventListener('astro:before-preparation', (e) => {
|
|
||||||
sessionStorage.setItem('scrollPosition', String(window.scrollY));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Восстанавливаем позицию скролла после перехода с плавной анимацией
|
|
||||||
document.addEventListener('astro:after-swap', () => {
|
|
||||||
const savedPosition = sessionStorage.getItem('scrollPosition');
|
|
||||||
if (savedPosition) {
|
|
||||||
const targetScroll = parseInt(savedPosition);
|
|
||||||
setTimeout(() => {
|
|
||||||
window.scrollTo({
|
|
||||||
top: targetScroll,
|
|
||||||
behavior: 'auto'
|
|
||||||
});
|
|
||||||
}, 50);
|
|
||||||
sessionStorage.removeItem('scrollPosition');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Клиентский скрипт для открытия модального окна
|
// Клиентский скрипт для открытия модального окна
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
const btn = document.getElementById("consultation-btn");
|
const btn = document.getElementById("consultation-btn");
|
||||||
|
|
@ -98,17 +76,4 @@ const { title, description, canonicalLink, breadcrumbs } = Astro.props;
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Для Astro View Transitions
|
|
||||||
document.addEventListener("astro:page-load", () => {
|
|
||||||
const btn = document.getElementById("consultation-btn");
|
|
||||||
|
|
||||||
btn?.addEventListener("click", () => {
|
|
||||||
window.dispatchEvent(
|
|
||||||
new CustomEvent("open-modal", {
|
|
||||||
detail: "consultation-modal",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -167,5 +167,37 @@ const formatDate = (date: string) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
document.addEventListener('astro:page-load', setupAnimations);
|
setupFilter();
|
||||||
|
|
||||||
|
function setupFilter() {
|
||||||
|
const buttons = document.querySelectorAll('.category-btn');
|
||||||
|
const cards = document.querySelectorAll('.blog-card-wrapper');
|
||||||
|
|
||||||
|
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');
|
||||||
|
const el = card as HTMLElement;
|
||||||
|
if (category === 'Все' || cardCategory === category) {
|
||||||
|
el.style.display = '';
|
||||||
|
el.style.opacity = '0';
|
||||||
|
el.style.transform = 'translateY(20px)';
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
el.style.transition = 'opacity 0.4s ease, transform 0.4s ease';
|
||||||
|
el.style.opacity = '1';
|
||||||
|
el.style.transform = 'translateY(0)';
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
el.style.display = 'none';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -168,5 +168,4 @@ const formatDate = (date: string) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
document.addEventListener('astro:page-load', setupAnimations);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -183,8 +183,4 @@ const formatDate = (date: string) => {
|
||||||
|
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
setupFilter();
|
setupFilter();
|
||||||
document.addEventListener('astro:page-load', () => {
|
|
||||||
setupAnimations();
|
|
||||||
setupFilter();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -148,6 +148,38 @@ const formatDate = (date: string) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const setupFilter = () => {
|
||||||
|
const buttons = document.querySelectorAll('.category-btn');
|
||||||
|
const cards = document.querySelectorAll('.blog-card-wrapper');
|
||||||
|
|
||||||
|
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');
|
||||||
|
const el = card as HTMLElement;
|
||||||
|
if (category === 'Все' || cardCategory === category) {
|
||||||
|
el.style.display = '';
|
||||||
|
el.style.opacity = '0';
|
||||||
|
el.style.transform = 'translateY(20px)';
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
el.style.transition = 'opacity 0.4s ease, transform 0.4s ease';
|
||||||
|
el.style.opacity = '1';
|
||||||
|
el.style.transform = 'translateY(0)';
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
el.style.display = 'none';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
document.addEventListener('astro:page-load', setupAnimations);
|
setupFilter();
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -344,10 +344,4 @@ const isAuthorized = false; // Измените на true, чтобы увиде
|
||||||
// Инициализация
|
// Инициализация
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
setupForm();
|
setupForm();
|
||||||
|
|
||||||
// Для поддержки Astro transitions
|
|
||||||
document.addEventListener('astro:page-load', () => {
|
|
||||||
setupAnimations();
|
|
||||||
setupForm();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -181,8 +181,4 @@ const categories = getCategories();
|
||||||
};
|
};
|
||||||
|
|
||||||
setupFilter();
|
setupFilter();
|
||||||
|
|
||||||
document.addEventListener('astro:page-load', () => {
|
|
||||||
setupFilter();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -195,9 +195,4 @@ import ReviewsList from '@components/reviews/ReviewsList.astro';
|
||||||
|
|
||||||
// Запуск
|
// Запуск
|
||||||
setupAnimations();
|
setupAnimations();
|
||||||
|
|
||||||
// Для поддержки View Transitions в Astro
|
|
||||||
document.addEventListener('astro:page-load', () => {
|
|
||||||
setupAnimations();
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue