152 lines
6.1 KiB
React
152 lines
6.1 KiB
React
import { useReveal, Icons } from './atoms.jsx';
|
||
|
||
const items = [
|
||
{
|
||
icon: Icons.path,
|
||
num: 'I',
|
||
tag: 'Сигнатурная фича',
|
||
title: 'Индивидуальный прогресс по эпохам',
|
||
desc: 'Пока твой герой не увидел финал Классики — Outland закрыт. Пока не закрыт Illidan — Нортренд в тумане. Каждый идёт в своём темпе, без скипов.',
|
||
span: 'span-6',
|
||
},
|
||
{
|
||
icon: Icons.solo,
|
||
num: 'II',
|
||
tag: '',
|
||
title: 'Соло-данжи',
|
||
desc: 'Любое подземелье проходимо в одиночку: мы скейлим боссов и механики под размер отряда — от 1 до 5.',
|
||
span: 'span-3',
|
||
},
|
||
{
|
||
icon: Icons.mask,
|
||
num: 'III',
|
||
tag: '',
|
||
title: 'Режим «Предатель»',
|
||
desc: 'При создании персонаж Альянса может встать на сторону Орды (и наоборот). Отдельные сюжеты, NPC, репутации.',
|
||
span: 'span-3',
|
||
},
|
||
{
|
||
icon: Icons.wolf,
|
||
num: 'IV',
|
||
tag: 'В разработке',
|
||
title: 'Ликантропия',
|
||
desc: 'Воргены как болезнь: заражайся, сопротивляйся, или прими форму. Твой выбор — твой путь.',
|
||
span: 'span-4',
|
||
},
|
||
{
|
||
icon: Icons.mythic,
|
||
num: 'V',
|
||
tag: '',
|
||
title: 'Mythic+ без потолка',
|
||
desc: 'Бесконечное масштабирование уровня ключа. Каждую неделю — новые аффиксы.',
|
||
span: 'span-4',
|
||
},
|
||
{
|
||
icon: Icons.pass,
|
||
num: 'VI',
|
||
tag: 'В разработке',
|
||
title: 'Боевой пропуск · магазин наград',
|
||
desc: 'Ежедневные и еженедельные задания, ежедневные награды за вход, косметика в магазине.',
|
||
span: 'span-4',
|
||
},
|
||
{
|
||
icon: Icons.collection,
|
||
num: 'VII',
|
||
tag: 'В разработке',
|
||
title: 'Коллекции',
|
||
desc: 'Питомцы, ездовые животные, трансмогрификация — всё в одном журнале, с фильтрами и прогрессом.',
|
||
span: 'span-6',
|
||
},
|
||
{
|
||
icon: Icons.kart,
|
||
num: 'VIII',
|
||
tag: 'Side Project',
|
||
title: 'MoonWell Karts',
|
||
desc: 'Отдельная мини-игра в нашей инфраструктуре — аркадные гонки с персонажами сервера. В разработке.',
|
||
span: 'span-6',
|
||
},
|
||
];
|
||
|
||
const onMove = (e) => {
|
||
const r = e.currentTarget.getBoundingClientRect();
|
||
e.currentTarget.style.setProperty('--mx', `${((e.clientX - r.left) / r.width) * 100}%`);
|
||
e.currentTarget.style.setProperty('--my', `${((e.clientY - r.top) / r.height) * 100}%`);
|
||
};
|
||
|
||
function FeatureCard({ icon, num, tag, title, desc, span }) {
|
||
const ref = useReveal();
|
||
return (
|
||
<article
|
||
className={`feature ${span} reveal`}
|
||
ref={ref}
|
||
onMouseMove={onMove}
|
||
style={{ transitionDelay: '0ms' }}
|
||
>
|
||
<div className="feature-num">
|
||
<span>{num}</span>
|
||
{tag && <span className="tag">{tag}</span>}
|
||
</div>
|
||
<div className="feature-icon">{icon}</div>
|
||
<h3 className="feature-title">{title}</h3>
|
||
<p className="feature-desc">{desc}</p>
|
||
</article>
|
||
);
|
||
}
|
||
|
||
function Progression() {
|
||
const ref = useReveal();
|
||
const steps = [
|
||
{ name: 'Classic', lvl: '1–60', status: 'Активно', state: 'live' },
|
||
{ name: 'The Burning Crusade', lvl: '60–70', status: 'Следующая эпоха', state: 'current' },
|
||
{ name: 'Wrath of the Lich King', lvl: '70–80', status: 'Закрыто за туманом', state: 'locked' },
|
||
];
|
||
return (
|
||
<div id="progression" className="progression reveal" ref={ref}>
|
||
<div className="progression-title">
|
||
<h3>Путь через эпохи</h3>
|
||
<span className="meta">Твой герой · Aranthel, Хранитель рощи · 47 ур.</span>
|
||
</div>
|
||
<div className="progression-track">
|
||
{steps.map((s, i) => (
|
||
<div key={i} className={`progression-step ${s.state}`}>
|
||
<div className="name">
|
||
{s.name}
|
||
<small>{s.lvl}</small>
|
||
</div>
|
||
<div className="status">{s.status}</div>
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|
||
|
||
export default function Features() {
|
||
const ref = useReveal();
|
||
return (
|
||
<section id="features" data-screen-label="03 Features">
|
||
<div className="wrap">
|
||
<div className="section-head reveal" ref={ref}>
|
||
<span className="eyebrow">Особенности сервера</span>
|
||
<div style={{ height: 20 }} />
|
||
<h2 className="h-display" style={{ fontSize: 'clamp(36px, 5vw, 60px)' }}>
|
||
То, чего ты не найдёшь у других
|
||
</h2>
|
||
<div className="divider-ornament">✦</div>
|
||
<p className="lead">
|
||
Восемь систем, которые делают MoonWell не клоном, а отдельной игрой поверх знакомого мира.
|
||
</p>
|
||
</div>
|
||
|
||
<div className="features-grid">
|
||
{items.map((f, i) => (
|
||
<FeatureCard key={i} {...f} />
|
||
))}
|
||
</div>
|
||
|
||
<Progression />
|
||
</div>
|
||
</section>
|
||
);
|
||
}
|