Files
gov/components/Hero.tsx

166 lines
7.4 KiB
TypeScript
Executable File
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.
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;