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

This commit is contained in:
Web-serfer 2026-04-28 01:58:37 +05:00
parent 60f0009ae2
commit 38bf5d7dcf
6 changed files with 218 additions and 27 deletions

View file

@ -22,11 +22,11 @@ interface Props {
const { posts, currentSlug } = Astro.props;
const formatDate = (date: string) => {
return new Date(date).toLocaleDateString('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric'
});
const d = new Date(date);
const day = d.getDate().toString().padStart(2, '0');
const month = (d.getMonth() + 1).toString().padStart(2, '0');
const year = new Date().getFullYear().toString().slice(-2);
return `${day}/${month}/${year}`;
};
const filteredPosts = currentSlug
@ -50,8 +50,22 @@ const filteredPosts = currentSlug
<h3 class="card-title">{post.title}</h3>
<p class="card-description">{post.description}</p>
<div class="card-meta">
<span class="meta-item">{formatDate(post.date)}</span>
<span class="meta-item">{post.readTime} мин.</span>
<span class="meta-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="meta-icon">
<rect width="18" height="18" x="3" y="4" rx="2" ry="2"></rect>
<line x1="16" x2="16" y1="2" y2="6"></line>
<line x1="8" x2="8" y1="2" y2="6"></line>
<line x1="3" x2="21" y1="10" y2="10"></line>
</svg>
{formatDate(post.date)}
</span>
<span class="meta-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="meta-icon">
<circle cx="12" cy="12" r="10"></circle>
<polyline points="12 6 12 12 16 14"></polyline>
</svg>
{post.readmeTime || post.readTime} мин.
</span>
</div>
</div>
</a>
@ -136,12 +150,23 @@ const filteredPosts = currentSlug
position: absolute;
top: 1rem;
left: 1rem;
padding: 0.25rem 0.75rem;
padding: 0.35rem 0.85rem;
border-radius: 0.5rem;
font-size: 0.75rem;
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #fff;
}
.category-badge.bg-red { background: linear-gradient(135deg, #ef4444, #dc2626); }
.category-badge.bg-blue { background: linear-gradient(135deg, #3b82f6, #2563eb); }
.category-badge.bg-green { background: linear-gradient(135deg, #22c55e, #16a34a); }
.category-badge.bg-yellow { background: linear-gradient(135deg, #eab308, #ca8a04); color: #1e293b; }
.category-badge.bg-purple { background: linear-gradient(135deg, #a855f7, #9333ea); }
.category-badge.bg-orange { background: linear-gradient(135deg, #f97316, #ea580c); }
.category-badge.bg-gold { background: linear-gradient(135deg, #d4af37, #b8962e); }
.blog-card-wrapper .card-content {
padding: 1.25rem;
}
@ -165,11 +190,24 @@ const filteredPosts = currentSlug
.blog-card-wrapper .card-meta {
display: flex;
justify-content: space-between;
gap: 1rem;
font-size: 0.75rem;
color: #94a3b8;
}
.blog-card-wrapper .card-meta .meta-item {
display: flex;
align-items: center;
gap: 0.35rem;
}
.blog-card-wrapper .card-meta .meta-icon {
width: 14px;
height: 14px;
opacity: 0.7;
}
@media (max-width: 1024px) {
.related-grid {
grid-template-columns: repeat(2, 1fr);

View file

@ -82,14 +82,12 @@ const heroImage = getPostImageUrl(post);
<div class="post-content" set:html={contentHtml} />
</article>
<!-- Комментарии и похожие статьи - ВНЕ article -->
{/*
<!-- Комментарии и похожие статьи -->
<div class="comments-wrapper">
<Comments postSlug={post.slug} client:load />
</div>
<RelatedPosts posts={filteredRelated} currentSlug={slug} />
*/}
<!-- Оглавление -->
<div slot="sidebar">

View file

@ -15,11 +15,11 @@ const { posts, total, totalPages } = await getPosts({ page: currentPage, perPage
const categories = await getAllCategories();
const formatDate = (date: string) => {
return new Date(date).toLocaleDateString('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric'
});
const d = new Date(date);
const day = d.getDate().toString().padStart(2, '0');
const month = (d.getMonth() + 1).toString().padStart(2, '0');
const year = new Date().getFullYear().toString().slice(-2);
return `${day}/${month}/${year}`;
};
---

View file

@ -18,11 +18,11 @@ const { posts, total, totalPages } = await getPosts({ page: currentPage, perPage
const categories = await getAllCategories();
const formatDate = (date: string) => {
return new Date(date).toLocaleDateString('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric'
});
const d = new Date(date);
const day = d.getDate().toString().padStart(2, '0');
const month = (d.getMonth() + 1).toString().padStart(2, '0');
const year = new Date().getFullYear().toString().slice(-2);
return `${day}/${month}/${year}`;
};
---

View file

@ -19,11 +19,11 @@ const breadcrumbsItems = [
];
const formatDate = (date: string) => {
return new Date(date).toLocaleDateString('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric'
});
const d = new Date(date);
const day = d.getDate().toString().padStart(2, '0');
const month = (d.getMonth() + 1).toString().padStart(2, '0');
const year = new Date().getFullYear().toString().slice(-2);
return `${day}/${month}/${year}`;
};
---

155
scripts/create-post.ts Normal file
View file

@ -0,0 +1,155 @@
import PocketBase from 'pocketbase';
const PB_URL = process.env.POCKETBASE_URL || 'http://127.0.0.1:8090';
const ADMIN_EMAIL = process.env.PB_ADMIN_EMAIL;
const ADMIN_PASSWORD = process.env.PB_ADMIN_PASSWORD;
const NEW_POST = {
title: 'Независимая экспертиза после ДТП в Сургуте ХМАО-Югры',
description: 'Профессиональная независимая экспертиза автомобиля после ДТП в Сургуте. Оценка ущерба для страховой и суда. Быстрые сроки и гарантия качества.',
author: 'Автоюрист',
category: 'ДТП',
categoryColor: 'bg-red',
date: '2026-04-28',
readTime: '8 мин',
readmeTime: '8',
image: '',
slug: 'nezavisimaya-ekspertiza-posle-dtp',
draft: false,
content: `<h2>Введение</h2>
<p style="text-align: justify;">После дорожно-транспортного происшествия потерпевший имеет право на возмещение ущерба. Однако страховые компании нередко занижают сумму выплаты, ссылаясь на износ деталей, некорректные данные калькуляторов или намеренное завышение СТО-расценок. В такой ситуации независимая экспертиза единственный способ объективно оценить ущерб и отстоять свои интересы.</p>
<h2>Что такое независимая экспертиза?</h2>
<p style="text-align: justify;">Независимая техническая экспертиза это исследование транспортного средства, проводимое квалифицированным специалистом-оценщиком для определения стоимости восстановительного ремонта. В отличие от оценки страховой компании, эксперт не заинтересован в занижении суммы и опирается исключительно на объективные данные.</p>
<blockquote>
<p><strong>Важно:</strong> Согласно ФЗ 135 «Об оценочной деятельности», заказчиком экспертизы может быть любая из сторон: страхователь, страховщик или суд.</p>
</blockquote>
<h2>Когда необходима независимая экспертиза?</h2>
<p style="text-align: justify;">Существует ряд ситуаций, когда обращение к независимому эксперту не просто рекомендовано, а необходимо:</p>
<ul>
<li style="text-align: justify;">
<p><strong>Страховая занизила выплату.</strong> Если сумма, предложенная страховой компанией, существенно отличается от реальной стоимости ремонта (разница более 10-15%), это повод заказать альтернативную оценку.</p>
</li>
<li style="text-align: justify;">
<p><strong>Отказ в выплате.</strong> Страховые компании могут отказать в возмещении, ссылаясь на форс-мажор, нарушение условий договора или другие причины. Независимая экспертиза поможет доказать обратное.</p>
</li>
<li style="text-align: justify;">
<p><strong>Скрытые повреждения.</strong> После ДТП могут быть повреждены элементы, которые не <EFBFBD><EFBFBD>идны при внешнем осмотре: подвеска, элементы кузова, электропроводка. Эксперт выявит все дефекты.</p>
</li>
<li style="text-align: justify;">
<p><strong>Спор со страховой в суде.</strong> Если дело дошло до суда, независимая экспертиза станет главным доказательством вашей позиции.</p>
</li>
</ul>
<h2>Как выбрать эксперта в Сургуте?</h2>
<p style="text-align: justify;">От качества экспертизы зависит результат всего спора. При выборе специалиста обратите внимание на следующие критерии:</p>
<ol>
<li>
<p><strong>Квалификация и образование.</strong> Эксперт должен иметь высшее образование в области автотехнической экспертизы и действующий квалификационный аттестат.</p>
</li>
<li>
<p><strong>Стаж работы.</strong> Опыт работы менее 3 лет повод задуматься. Лучше выбирать специалистов с солидной практикой.</p>
</li>
<li>
<p><strong>Членство в СРО.</strong> Оценщик должен состоять в саморегулируемой организации оценщиков.</p>
</li>
<li>
<p><strong>Отзывы и репутация.</strong> Изучите отзывы клиентов, запросите примеры выполненных экспертиз.</p>
</li>
</ol>
<blockquote>
<p><strong>💡 Совет автоюриста:</strong> Не связывайтесь с экспертами, которые обещают «нужную» сумму или работают только с определенными юридическими фирмами. Это признак недобросовестности.</p>
</blockquote>
<h2>Процедура проведения экспертизы</h2>
<p style="text-align: justify;">Процесс независимой экспертизы включает несколько этапов:</p>
<ol>
<li>
<p><strong>Заключение договора.</strong> С экспертом или оценочной организацией заключается договор на проведение экспертизы.</p>
</li>
<li>
<p><strong>Предоставление документов.</strong> Вам потребуются: документы на автомобиль (ПТС, СТС), справка о ДТП, заключение страховой компании (если есть), акты осмотра.</p>
</li>
<li>
<p><strong>Осмотр транспортного средства.</strong> Эксперт проводит осмотр автомобиля, фиксирует все повреждения с фотографиями и измерениями.</p>
</li>
<li>
<p><strong>Составление заключения.</strong> По результатам осмотра составляется экспертное заключение с расчетом стоимости восстановительного ремонта.</p>
</li>
</ol>
<h2>Стоимость экспертизы в Сургуте</h2>
<p style="text-align: justify;">Стоимость экспертизы зависит от сложности дела и региона. В среднем по ХМАО-Югре цена варьируется от 8 000 до 30 000 рублей. Важно помнить: эти расходы можно взыскать со страховой компании в случае успешного исхода дела.</p>
<blockquote>
<p><strong>💡 Важно знать:</strong> Если страховая компания неправомерно отказала в выплате или занизила сумму, расходы на экспертизу относятся к судебным расходам и подлежат возмещению ответчиком.</p>
</blockquote>
<h2>Как использовать результаты?</h2>
<p style="text-align: justify;">Получив экспертное заключение, вы можете действовать несколькими способами:</p>
<ul>
<li>
<p><strong>Досудебное урегулирование.</strong> Направить претензию в страховую компанию с приложением экспертного заключения. Страховщик обязан рассмотреть претензию в течение 10 дней.</p>
</li>
<li>
<p><strong>Обращение в суд.</strong> Если страховая отказывается пересматривать сумму подавайте исковое заявление. Экспертиза станет основным доказательством.</p>
</li>
<li>
<p><strong>Страховая выплата.</strong> По решению суда страховая компания обязана будет выплатить разницу между заниженной суммой и реальным ущербом, а также штраф, неустойку и компенсацию морального вреда.</p>
</li>
</ul>
<h2>Заключение</h2>
<p style="text-align: justify;">Независимая экспертиза это мощный инструмент защиты прав автовладельцев. Не позволяйте страховым компаниям экономить на вашем имуществе. Закажите объективную оценку ущерба и получите справедливую компенсацию.</p>
<p style="text-align: justify;">Если страховая компания затягивает с выплатой или отказывает в возмещении обращайтесь к автоюристу. Специалист поможет правильно организовать экспертизу и отстоять ваши интересы в споре со страховщиком.</p>`,
};
const UPDATE_EXISTING = true;
const EXISTING_POST_ID = 'sn1u55h21wdphti';
async function createPost() {
if (!ADMIN_EMAIL || !ADMIN_PASSWORD) {
console.error('❌ Укажите PB_ADMIN_EMAIL и PB_ADMIN_PASSWORD в .env');
process.exit(1);
}
const pb = new PocketBase(PB_URL);
try {
await pb.admins.authWithPassword(ADMIN_EMAIL, ADMIN_PASSWORD);
console.log('✅ Подключено к PocketBase');
} catch (e) {
console.error('❌ Ошибка авторизации admin');
process.exit(1);
}
try {
let post;
if (UPDATE_EXISTING && EXISTING_POST_ID) {
post = await pb.collection('posts').update(EXISTING_POST_ID, NEW_POST);
console.log('✅ Пост обновлён');
} else {
post = await pb.collection('posts').create(NEW_POST);
console.log('✅ Пост создан');
}
console.log(' ID:', post.id);
console.log(' title:', post.title);
console.log(' slug:', post.slug);
} catch (e: any) {
if (e.data?.message?.includes('already exists')) {
console.log(' Пост уже существует');
} else {
console.error('❌ Ошибка:', e.data || e.message);
}
}
}
createPost();