Files
ogrechkoandClaude Sonnet 5 30e1aea20b Fix SEO/UX audit gaps: canonical tags, org schema, nav, header claims
Add canonical URLs and a sitewide Organization JSON-LD (linked via @id
to page-specific LocalBusiness/Service/Article schemas), move FAQ and
Reviews into the top nav, attach the 24/7 support claim to a tooltip
on the header badge instead of leaving it unexplained, drop the
unverifiable incidents_resolved stat from the hero terminal animation,
and clean up the empty-reviews state instead of showing a thin
placeholder.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013otXCiTZsxdZ4SJKZ9wUky
2026-08-25 23:43:17 +03:00

78 lines
3.3 KiB
React
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use client';
import { useEffect, useState } from 'react';
import Link from 'next/link';
import { ArrowRight } from 'lucide-react';
const LINES = ['$ status --infra', 'uptime: 99.98%', 'team_size: 20+', 'avg_response_time: 15m'];
function cx(...args) {
return args.filter(Boolean).join(' ');
}
export default function Hero() {
const [shown, setShown] = useState(0);
useEffect(() => {
if (shown >= LINES.length) return undefined;
const timer = setTimeout(() => setShown((s) => s + 1), 450);
return () => clearTimeout(timer);
}, [shown]);
return (
<section id="home" className="max-w-6xl mx-auto px-5 sm:px-8 pt-16 pb-20 grid md:grid-cols-2 gap-12 items-center">
<div>
<p className="text-xs uppercase tracking-widest text-emerald-500 mb-4 font-mono">
&gt; top-sysops.ru --about
</p>
<h1
className="text-[clamp(1.5rem,7.5vw,3rem)] md:text-3xl lg:text-4xl leading-tight font-bold mb-6 font-display text-slate-900 dark:text-slate-100 break-words"
style={{ hyphens: 'auto' }}
lang="ru"
>
IT-аутсорсинг и техподдержка<br />
инфраструктуры, за которую<br />
можно не переживать
</h1>
<p className="text-base sm:text-lg mb-8 max-w-md text-slate-600 dark:text-slate-400">
Администрирование серверов, кибербезопасность, сетевая инфраструктура и автоматизация бизнес-процессов
с помощью ИИ — с гарантией отклика от 15 минут.
</p>
<div className="flex flex-wrap gap-3">
<Link
href="/uslugi"
className="inline-flex items-center gap-2 px-5 py-3 rounded-md bg-emerald-500 text-white font-medium text-sm hover:bg-emerald-600 transition-colors"
>
Наши услуги <ArrowRight className="h-4 w-4" />
</Link>
<Link
href="/kontakty"
className="inline-flex items-center gap-2 px-5 py-3 rounded-md font-medium text-sm border transition-colors border-slate-300 hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-900"
>
Оставить заявку
</Link>
</div>
</div>
<div className="rounded-lg border p-5 shadow-sm font-mono bg-white border-slate-200 dark:bg-slate-900 dark:border-slate-800">
<div className="flex items-center gap-1.5 mb-4">
<span className="h-2.5 w-2.5 rounded-full bg-rose-400" />
<span className="h-2.5 w-2.5 rounded-full bg-amber-400" />
<span className="h-2.5 w-2.5 rounded-full bg-emerald-400" />
</div>
<div className="space-y-2 text-sm">
{LINES.slice(0, shown).map((line, i) => (
<div key={line} className={cx(i === 0 ? 'text-emerald-500' : 'text-slate-700 dark:text-slate-300')}>
{line}
</div>
))}
<span className="inline-flex items-center gap-1 text-slate-700 dark:text-slate-300">
{shown >= LINES.length && <span className="text-emerald-500">$</span>}
<span className="inline-block w-2 h-4 bg-emerald-500 animate-pulse align-middle" />
</span>
</div>
</div>
</section>
);
}