Files
gov/components/Hero.tsx

166 lines
7.4 KiB
TypeScript
Raw Permalink Normal View History

2026-02-04 00:04:31 +05:00
import React from 'react';
import { motion } from 'framer-motion';
import { SectionProps } from '../types';
const Hero: React.FC<SectionProps> = ({ id, onOpenModal }) => {
// Grid config for the background animation
const GRID_ROWS = 10;
const GRID_COLS = 20;
const dots = Array.from({ length: GRID_ROWS * GRID_COLS });
const smoothEase: [number, number, number, number] = [0.645, 0.045, 0.355, 1.000];
const handleOpenSpecs = () => {
if (onOpenModal) {
onOpenModal({
title: 'Спецификация Системы v2.5.0-RC',
type: 'table',
theme: 'dark',
content: {
headers: ['Параметр', 'Значение', 'Описание'],
rows: [
['Архитектура', 'Transformer++ (MoE)', 'Гибридная архитектура Mixture of Experts для оптимизации инференса'],
['Параметры', '70B (Int8 Quantization)', 'Базовая модель, дообученная на закрытых датасетах РБ'],
['Контекстное окно', '128k токенов', 'Позволяет анализировать объемные юридические документы целиком'],
['Датасет', '50 лет архивов', 'Оцифрованные стенограммы заседаний, НПА, указы'],
['Развертывание', 'On-Premise (Air-gapped)', 'Полная изоляция от глобальной сети интернет'],
['Инференс', '20ms / token', 'Высокая скорость генерации на кластере H100']
]
}
});
}
};
const handleLaunch = () => {
if (onOpenModal) {
onOpenModal({
title: 'Запрос на развертывание',
type: 'form',
theme: 'dark',
content: {
text: 'Для запуска системы в вашем контуре требуется предварительное согласование архитектуры.'
}
});
}
};
return (
<section id={id} className="h-[100dvh] w-full flex flex-col items-center justify-between relative overflow-hidden bg-theme-main text-center px-4 snap-start shrink-0 border-b border-theme py-20 md:py-24">
{/* Wipe Effect for Hero (Reveals on load) */}
<motion.div
className="absolute inset-0 z-50 bg-[#ff4b4b] pointer-events-none"
initial={{ y: "0%" }}
animate={{ y: "-100%" }}
transition={{ duration: 0.8, ease: smoothEase, delay: 0.2 }}
/>
<motion.div
className="absolute inset-0 z-40 bg-[#20e3b2] pointer-events-none"
initial={{ y: "0%" }}
animate={{ y: "-100%" }}
transition={{ duration: 0.8, ease: smoothEase, delay: 0.3 }}
/>
{/* Animated Grid Background */}
<div className="absolute inset-0 flex items-center justify-center pointer-events-none opacity-20 overflow-hidden">
<div
className="grid gap-1"
style={{ gridTemplateColumns: `repeat(${GRID_COLS}, 1fr)` }}
>
{dots.map((_, i) => (
<motion.div
key={i}
initial={{ scale: 0, opacity: 0 }}
animate={{
scale: [0, 1, 0.5, 1],
opacity: [0, 0.8, 0.2, 0.5],
backgroundColor: Math.random() > 0.8 ? '#ff4b4b' : (Math.random() > 0.5 ? '#20e3b2' : '#333')
}}
transition={{
duration: 3,
repeat: Infinity,
repeatType: "reverse",
delay: Math.random() * 2,
ease: "easeInOut"
}}
className="w-4 h-4 md:w-8 md:h-8 rounded-sm"
/>
))}
</div>
</div>
<div className="flex-1 flex flex-col justify-center items-center z-10 max-w-5xl mx-auto relative w-full mt-8 md:mt-0">
<motion.div
initial={{ opacity: 0, scaleX: 0 }}
animate={{ opacity: 1, scaleX: 1 }}
transition={{ duration: 0.8, ease: "circOut", delay: 1 }}
className="flex justify-center mb-4 md:mb-8"
>
<div className="px-4 py-2 border border-[#20e3b2] bg-[#20e3b2]/10 text-[#20e3b2] font-mono text-[10px] md:text-xs font-bold tracking-widest uppercase">
Статус Системы: Онлайн
</div>
</motion.div>
<div className="relative overflow-hidden">
<motion.h1
initial={{ y: "100%" }}
animate={{ y: 0 }}
transition={{ duration: 1.2, ease: smoothEase, delay: 0.8 }}
className="text-[12vw] md:text-7xl lg:text-8xl xl:text-[8rem] font-black tracking-tighter text-theme-main leading-[0.85]"
>
СУВЕРЕННАЯ
</motion.h1>
</div>
<div className="relative overflow-hidden mb-6 md:mb-10">
<motion.h1
initial={{ y: "100%" }}
animate={{ y: 0 }}
transition={{ duration: 1.2, delay: 0.9, ease: smoothEase }}
className="text-[12vw] md:text-7xl lg:text-8xl xl:text-[8rem] font-black tracking-tighter text-[#ff4b4b] leading-[0.85]"
>
LLM СИСТЕМА
</motion.h1>
</div>
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 1.2, duration: 1 }}
className="flex flex-col items-center w-full"
>
<p className="text-sm md:text-base text-theme-muted max-w-3xl mx-auto mb-8 font-mono px-4 leading-relaxed">
<span className="text-theme-main">Башкортостан</span> создаст первый в России прецедент федерального масштаба: внедрения генеративного искусственного интеллекта в контур власти без рисков для национальной безопасности.
</p>
<div className="flex flex-col sm:flex-row gap-4 w-full sm:w-auto px-6 sm:px-0">
<button
onClick={handleLaunch}
className="w-full sm:w-auto px-6 py-4 bg-[#ff4b4b] text-white font-bold rounded-sm hover:bg-transparent hover:text-[#ff4b4b] border border-transparent hover:border-[#ff4b4b] transition-all duration-200 uppercase tracking-wider text-xs font-mono"
>
ЗАПУСТИТЬ
</button>
<button
onClick={handleOpenSpecs}
className="w-full sm:w-auto px-6 py-4 border border-theme text-theme-main font-bold rounded-sm hover:bg-theme-card transition-colors duration-200 uppercase tracking-wider text-xs font-mono"
>
СПЕЦИФИКАЦИИ
</button>
</div>
</motion.div>
</div>
<motion.div
className="w-full flex justify-between px-6 md:px-10 font-mono text-[10px] md:text-xs text-theme-muted z-10 pb-4 md:pb-0"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 2 }}
>
<span>ЛИСТАЙТЕ ВНИЗ</span>
<span className="hidden md:inline">ВЕРСИЯ 2.5.0-RC</span>
</motion.div>
</section>
);
};
export default Hero;