Новые изменения в компоенты
This commit is contained in:
parent
60f0009ae2
commit
38bf5d7dcf
6 changed files with 218 additions and 27 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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}`;
|
||||
};
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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}`;
|
||||
};
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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
155
scripts/create-post.ts
Normal 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();
|
||||
Loading…
Add table
Add a link
Reference in a new issue