Files
2026-04-26 16:09:08 +04:00

152 lines
6.1 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.
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: '160', status: 'Активно', state: 'live' },
{ name: 'The Burning Crusade', lvl: '6070', status: 'Следующая эпоха', state: 'current' },
{ name: 'Wrath of the Lich King', lvl: '7080', 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>
);
}