Files
topsysops-app/public-site/app/page.jsx
T
ogrechkoandClaude Sonnet 5 1e4f97030a Consolidate Organization schema, add ItemList/Offer markup, expand FAQ
- Merge the duplicate Organization/LocalBusiness JSON-LD blocks (home's
  LocalBusiness + o-kompanii's Organization) into one shared
  getOrganizationSchema() call rendered on every page. Deliberately NOT
  wired through the root layout: fetches there get frozen into the
  static shell at build time (backend unreachable during image build)
  and never revalidate, silently serving stale data to crawlers - each
  page calls it directly instead, where revalidation is proven to work.
- Add optional ItemList schema on /uslugi and Offer/OfferCatalog schema
  on /aktsii; entity pages (/uslugi/[slug] Service, /blog/[slug]
  Article) reference the organization via @id instead of duplicating it.
- Add 8 more real FAQ entries (pricing model, contract terms,
  onboarding time, hybrid IT staff setup, supported stacks, backups,
  152-FZ compliance, escalation) and give every FAQ its own slug and
  dedicated /faq/[slug] page with its own title/H1/FAQPage schema,
  modeled on the one-topic-per-page pattern (h/t remontka.pro).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013otXCiTZsxdZ4SJKZ9wUky
2026-08-26 00:57:07 +03:00

71 lines
2.8 KiB
React
Raw 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.
import Link from 'next/link';
import { ArrowRight } from 'lucide-react';
import Header from '../components/Header.jsx';
import Footer from '../components/Footer.jsx';
import Hero from '../components/sections/Hero.jsx';
import AccountPromo from '../components/sections/AccountPromo.jsx';
import Promotions from '../components/sections/Promotions.jsx';
import Services from '../components/sections/Services.jsx';
import Cases from '../components/sections/Cases.jsx';
import Reviews from '../components/sections/Reviews.jsx';
import Contact from '../components/sections/Contact.jsx';
import Reveal from '../components/Reveal.jsx';
import SectionHeading from '../components/SectionHeading.jsx';
import { serverApi } from '../lib/serverApi.js';
import { getOrganizationSchema } from '../lib/schema.js';
export const metadata = {
alternates: { canonical: '/' },
};
export default async function HomePage() {
const [services, promotions, reviews, cases, contact, orgSchema] = await Promise.all([
serverApi.getServices(),
serverApi.getPromotions(),
serverApi.getReviews(),
serverApi.getCases(),
serverApi.getContact(),
getOrganizationSchema(),
]);
return (
<div>
{/* eslint-disable-next-line react/no-danger */}
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(orgSchema) }} />
<Header />
<Hero />
<AccountPromo />
<Services
categories={services}
compact
limit={6}
moreHref="/uslugi"
eyebrow="services --overview"
title="Ключевые услуги"
desc="IT-аутсорсинг, кибербезопасность, администрирование серверов и баз данных, сетевая инфраструктура, облака и автоматизация с ИИ."
/>
<Promotions promotions={promotions} limit={3} moreHref="/aktsii" />
<section className="max-w-6xl mx-auto px-5 sm:px-8 py-20">
<SectionHeading
eyebrow="about --company"
title="О компании"
desc="TopSysOps — IT-аутсорсинг и техподдержка с 2023 года. Команда 20+ специалистов, штаб-квартира в Санкт-Петербурге, работаем с клиентами по всей России."
/>
<Reveal>
<Link href="/o-kompanii" className="inline-flex items-center gap-2 text-sm text-emerald-500 font-medium hover:underline">
Узнать больше о компании <ArrowRight className="h-3.5 w-3.5" />
</Link>
</Reveal>
</section>
<Cases cases={cases} limit={3} moreHref="/keysy" />
<Reviews reviews={reviews} limit={2} moreHref="/otzyvy" showForm={false} />
<Contact contact={contact} compact />
<Footer />
</div>
);
}