neurosite: наполнить контентом (20 статей, 28 страниц)

This commit is contained in:
neo committed 2026-09-06 18:24:38 +05:00
1 parent 06a42bcac8
commit f58610aa0e
48 files changed
+2383

No files matched your search

+156
View File
@@ -0,0 +1,156 @@
---
export interface Props {
title: string;
description?: string;
schema?: string;
image?: string;
date?: string;
slug?: string;
ogType?: string;
}
const {
title, description = '', schema = '',
image = '', date = '', slug = '',
ogType = 'article',
} = Astro.props;
const baseUrl = 'https://нейросети.рус';
const pageUrl = slug ? `${baseUrl}/${slug}/` : baseUrl;
const ogImage = image || `${baseUrl}/og-image.svg`;
const articleSchema = slug ? JSON.stringify({
"@context": "https://schema.org",
"@type": "Article",
"headline": title,
"description": description || title,
"datePublished": date || new Date().toISOString().split('T')[0],
"image": image || undefined,
"url": `${baseUrl}/${slug}/`,
"author": { "@type": "Person", "name": "Никита Тарасов" },
"publisher": { "@type": "Organization", "name": "нейросети.рус" }
}) : '';
const orgSchema = JSON.stringify({
"@context": "https://schema.org",
"@type": "Organization",
"name": "нейросети.рус",
"url": baseUrl,
"description": "Витрина реальных результатов локальных open-source нейросетей: текст, графика, аудио, видео",
"sameAs": [
"https://tarasov.top",
],
});
---
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{title}</title>
<meta name="description" content={description}>
<link rel="canonical" href={pageUrl}>
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<!-- Pagefind search (файлы генерируются при pagefind --site dist после сборки) -->
<link href="/pagefind/pagefind-ui.css" rel="stylesheet" is:inline>
<script src="/pagefind/pagefind-ui.js" is:inline></script>
<!-- OpenGraph -->
<meta property="og:type" content={ogType}>
<meta property="og:title" content={title}>
<meta property="og:description" content={description}>
<meta property="og:url" content={pageUrl}>
<meta property="og:image" content={ogImage}>
<meta property="og:site_name" content="нейросети.рус">
<meta property="og:locale" content="ru_RU">
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content={title}>
<meta name="twitter:description" content={description}>
<!-- Schema.org JSON-LD -->
{articleSchema && <script type="application/ld+json" set:html={articleSchema}></script>}
<script type="application/ld+json" set:html={orgSchema}></script>
<style is:global>
:root{
--bg:#0d0f1a;
--text:#e6e8f0;
--muted:#9aa0b5;
--accent:#6d5efc;
--accent2:#38d9a9;
--card:#161a2a;
--card2:#1e2235;
--border:#2a2f45;
--radius:12px;
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;background:var(--bg);color:var(--text);line-height:1.7}
.container{max-width:960px;margin:0 auto;padding:20px}
header{padding:20px 0;border-bottom:1px solid var(--border)}
nav{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
nav a{color:var(--muted);text-decoration:none;font-weight:600;font-size:14px;transition:color .2s}
nav a:hover{color:var(--accent2)}
nav .brand{font-size:18px;font-weight:800;color:var(--text);letter-spacing:-.5px}
nav .brand span{color:var(--accent)}
nav .search-spacer{margin-left:auto}
article{margin:32px 0;padding:32px;background:var(--card);border-radius:var(--radius);border:1px solid var(--border)}
article h1{font-size:32px;margin-bottom:16px;line-height:1.2;letter-spacing:-.5px}
article h2{font-size:22px;margin:28px 0 12px;color:var(--text)}
article h3{font-size:18px;margin:20px 0 8px;color:var(--accent2)}
article p{margin:10px 0;color:#cdd2e0}
article ul,article ol{margin:10px 0;padding-left:24px}
article li{margin:6px 0;color:#cdd2e0}
article strong{color:var(--text)}
article a{color:var(--accent2);text-decoration:none;border-bottom:1px solid transparent;transition:border-color .2s}
article a:hover{border-bottom-color:var(--accent2)}
code{background:var(--card2);padding:2px 6px;border-radius:4px;font-size:.9em;color:#e0b0ff}
pre{background:var(--card2);padding:16px;border-radius:8px;overflow-x:auto;margin:16px 0;border:1px solid var(--border)}
pre code{background:none;padding:0;color:#c9d4ff}
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px;margin:24px 0}
.card{background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:18px;transition:transform .15s,border-color .15s}
.card:hover{transform:translateY(-2px);border-color:var(--accent)}
.card h3{margin-bottom:8px;font-size:16px}
.card p{font-size:14px;color:var(--muted)}
.badge{display:inline-block;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;padding:3px 8px;border-radius:20px;background:var(--accent);color:#fff;margin-right:6px}
.badge.t{background:#6d5efc}.badge.i{background:#f72585}.badge.a{background:#38d9a9}.badge.v{background:#ff9f1c}
.related{margin-top:32px;padding:20px;background:var(--card2);border-radius:var(--radius);border:1px solid var(--border)}
.related a{display:block;padding:6px 0;color:var(--accent2)}
footer{text-align:center;padding:40px 0;color:var(--muted);font-size:13px;border-top:1px solid var(--border);margin-top:40px}
.search-bar{position:relative}
.search-bar input{padding:7px 12px;border:1px solid var(--border);border-radius:8px;background:var(--card2);color:var(--text);width:220px;font-size:14px}
.search-bar input:focus{outline:none;border-color:var(--accent)}
.pagefind-ui__results{position:absolute;background:var(--card);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.4);z-index:100;margin-top:6px;max-height:360px;overflow-y:auto;width:300px}
.pagefind-ui__result{padding:10px 12px;border-bottom:1px solid var(--border)}
.pagefind-ui__result:last-child{border:none}
.pagefind-ui__result a{color:var(--accent2);font-weight:600;text-decoration:none}
.pagefind-ui__result p{font-size:12px;color:var(--muted);margin:2px 0}
.pagefind-ui__drawer{display:none !important}
</style>
</head>
<body>
<div class="container">
<header>
<nav>
<a href="/" class="brand">🤖 нейросети<span>.рус</span></a>
<a href="/examples/">Примеры</a>
<a href="/models/">Модели</a>
<a href="/compare/">Сравнения</a>
<a href="/news/">Новости</a>
<a href="/guide/">Гайды</a>
<a href="/ace-studio/">Ace Studio</a>
<span class="search-spacer"></span>
<div class="search-bar" id="search"></div>
</nav>
</header>
<slot />
<footer>
<p>© 2026 нейросети.рус — витрина реальных результатов локальных open-source моделей</p>
</footer>
</div>
<script is:inline>
new PagefindUI({ element: "#search", showSubResults: false, showImages: false });
</script>
</body>
</html>