import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import cl from './KubikonStudio.module.css'; import RublocsLogo from '../components/RublocsLogo/RublocsLogo'; import useDeviceType from '../hooks/useDeviceType'; import KubikonDesktopOnlyStub from './KubikonDesktopOnlyStub'; import Icon from '../editor/Icon'; /** * KubikonHeroKit — кит из 10 вариантов hero-блока для главной Studio. * URL: /hero-kit * * В оригинальном Roblox Studio на главной — крупное изображение игры. * Здесь 10 вариантов такого hero-блока: каждый — реальный чистый * скриншот игры Рублокса (снят dev-tools/wiki-shots/shoot-hero.js, * 1920×800, без HUD) + своя композиция текста/кнопки/оверлея. * * Пользователь смотрит кит, выбирает номер — выбранный вариант * переносится на главную Studio (секция HERO в KubikonStudio.jsx). * * Картинки: public/wiki/hero/hero-.png */ // ── 10 вариантов hero-блока ───────────────────────────────────────── // img — файл кадра из public/wiki/hero/ // title — крупный заголовок // desc — подзаголовок // btn — текст кнопки // align — 'left' | 'center' — расположение текстового блока // overlay — тип затемнения под текстом для читаемости: // 'left-dark' (градиент слева), 'bottom-dark' (снизу), // 'full-soft' (лёгкое сплошное), 'panel' (карточка-плашка) // theme — 'light' (белый текст) — все кадры тёмные/яркие const VARIANTS = [ { id: 1, img: 'hero-1.png', align: 'left', overlay: 'left-dark', title: 'Создай целый мир', desc: 'Холмы, леса, реки — построй свой 3D-мир и пригласи друзей. Всё начинается с пустого холста.', btn: '+ Новая игра', }, { id: 2, img: 'hero-79.png', align: 'left', overlay: 'left-dark', title: 'Твоя игра — твои правила', desc: 'Паркур, корабли, порталы, радуги. Собери игру мечты и опубликуй её в ленте Рублокса.', btn: 'Начать создавать', }, { id: 3, img: 'hero-82.png', align: 'center', overlay: 'full-soft', title: 'Построй. Запусти. Поделись.', desc: 'От первого кубика до целой игры с порталами и механиками — в одном редакторе.', btn: '+ Новая игра', }, { id: 4, img: 'hero-87.png', align: 'left', overlay: 'bottom-dark', title: 'Приключения ждут', desc: 'Лава, обрывы, ловушки — придумай уровень, который не пройти с первого раза.', btn: 'Создать игру', }, { id: 5, img: 'hero-226.png', align: 'left', overlay: 'left-dark', title: 'Создавай большие игры', desc: 'Замки, подземелья, целые королевства. Редактор Рублокса справится с любой задумкой.', btn: '+ Новая игра', }, { id: 6, img: 'hero-86.png', align: 'panel', overlay: 'panel', title: 'Сделай свою игру', desc: 'Выбери шаблон или начни с нуля. Опубликуй — и в неё будут играть тысячи.', btn: '+ Новая игра', }, { id: 7, img: 'hero-62.png', align: 'center', overlay: 'full-soft', title: 'Парящие острова и не только', desc: 'Размести блоки в воздухе, собери паркур, добавь скрипты — всё возможно.', btn: 'Начать', }, { id: 8, img: 'hero-80.png', align: 'left', overlay: 'left-dark', title: 'Выше облаков', desc: 'Построй небесный мир и проложи маршрут среди облаков. Твоя фантазия — без границ.', btn: '+ Новая игра', }, { id: 9, img: 'hero-84.png', align: 'left', overlay: 'bottom-dark', title: 'Тайны подземелий', desc: 'Тёмные коридоры, секретные комнаты, ловушки. Создай игру, в которой страшно и интересно.', btn: 'Создать игру', }, { id: 10, img: 'hero-45.png', align: 'panel', overlay: 'panel', title: 'Арена для твоих игр', desc: 'Гонки, битвы, испытания на время. Собери арену и зови друзей соревноваться.', btn: '+ Новая игра', }, ]; // Один hero-вариант — рендерит готовый блок ровно так, как он // будет выглядеть на главной Studio. const HeroPreview = ({ v }) => { const overlayCls = `hkOverlay hkOverlay--${v.overlay}`; return (
{v.title}
NEW

{v.title}

{v.desc}

{v.btn}
); }; const KubikonHeroKit = () => { const navigate = useNavigate(); const { isDesktop } = useDeviceType(); const [chosen, setChosen] = useState(null); if (!isDesktop) { return ; } return (
{/* === Левая боковая панель === */} {/* === Основной контент === */}

Кит hero-блоков

10 вариантов главного баннера Studio — выбери тот, что нравится

Каждый блок ниже — реальный кадр игры Рублокса. Это варианты того, как будет выглядеть главный баннер на странице Studio (вместо нынешнего с кубиками). Посмотри и скажи мне номер — вставлю выбранный на главную.
{/* 10 вариантов */} {VARIANTS.map((v) => (
Вариант {v.id}
))} {/* Подсказка о выборе */}
{chosen ? ( <>
Отмечен вариант {chosen}. Напиши мне в чат «ставь вариант {chosen}» — и я вставлю его на главную страницу Studio.
) : ( <>
Отметь понравившийся вариант кнопкой «Мне нравится этот» или просто напиши мне его номер в чат.
)}
); }; // ══════════════════════════════════════════════════════════════════ // Инлайн-стили // ══════════════════════════════════════════════════════════════════ const INLINE_STYLES = ` .hkIntro { background: #eef2ff; border: 1px solid #c7d2fe; border-radius: 14px; padding: 14px 18px; margin-bottom: 22px; font-size: 14px; line-height: 1.6; color: #3730a3; } /* === Карточка варианта === */ .hkCard { background: #fff; border: 1px solid #e5e7eb; border-radius: 20px; padding: 14px; margin-bottom: 20px; box-shadow: 0 4px 16px rgba(15, 23, 42, 0.05); transition: border-color 180ms ease, box-shadow 180ms ease; } .hkCard--chosen { border-color: #16a34a; box-shadow: 0 8px 28px rgba(22, 163, 74, 0.18); } .hkCardHead { display: flex; align-items: center; justify-content: space-between; padding: 4px 6px 12px; } .hkNum { font-size: 14px; font-weight: 900; color: #0f172a; letter-spacing: -0.2px; } .hkPick { display: inline-flex; align-items: center; gap: 6px; background: #f1f5f9; border: 1px solid #e2e8f0; color: #475569; font-size: 12.5px; font-weight: 800; padding: 7px 14px; border-radius: 50px; cursor: pointer; font-family: inherit; transition: all 160ms ease; } .hkPick:hover { background: #e2e8f0; } .hkPick--on, .hkPick--on:hover { background: #16a34a; border-color: #16a34a; color: #fff; } /* === Hero-блок (то, что встанет на главную) === */ .hkHero { position: relative; width: 100%; aspect-ratio: 1920 / 640; border-radius: 16px; overflow: hidden; background: #1e293b; } .hkHeroImg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; } /* оверлеи для читаемости текста */ .hkOverlay { position: absolute; inset: 0; pointer-events: none; } .hkOverlay--left-dark { background: linear-gradient(100deg, rgba(8, 11, 22, 0.86) 0%, rgba(8, 11, 22, 0.62) 38%, rgba(8, 11, 22, 0.06) 66%, transparent 100%); } .hkOverlay--bottom-dark { background: linear-gradient(to top, rgba(8, 11, 22, 0.90) 0%, rgba(8, 11, 22, 0.45) 36%, transparent 70%); } .hkOverlay--full-soft { background: radial-gradient(ellipse at center, rgba(8, 11, 22, 0.30) 0%, rgba(8, 11, 22, 0.66) 100%); } .hkOverlay--panel { background: linear-gradient(90deg, rgba(8, 11, 22, 0.20) 0%, transparent 55%); } /* контейнер текста */ .hkHeroInner { position: absolute; inset: 0; display: flex; align-items: center; padding: 0 56px; z-index: 2; } .hkHeroInner--left { justify-content: flex-start; } .hkHeroInner--center { justify-content: center; text-align: center; } .hkHeroInner--panel { justify-content: flex-start; } .hkHeroBox { max-width: 560px; } .hkHeroInner--center .hkHeroBox { max-width: 680px; } /* вариант 'panel' — текст в полупрозрачной карточке */ .hkHeroInner--panel .hkHeroBox { max-width: 480px; background: rgba(12, 16, 28, 0.74); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 18px; padding: 28px 30px; } .hkBadge { display: inline-flex; align-items: center; background: rgba(255, 255, 255, 0.18); border: 1px solid rgba(255, 255, 255, 0.34); color: #fff; padding: 4px 13px; border-radius: 999px; font-size: 10.5px; font-weight: 800; letter-spacing: 1.5px; text-transform: uppercase; margin-bottom: 14px; } .hkHeroInner--center .hkBadge { margin-left: auto; margin-right: auto; } .hkTitle { margin: 0 0 12px; font-size: 38px; line-height: 1.08; font-weight: 900; color: #fff; letter-spacing: -1px; text-shadow: 0 2px 18px rgba(0, 0, 0, 0.55); } .hkDesc { margin: 0 0 22px; font-size: 15.5px; line-height: 1.55; color: rgba(255, 255, 255, 0.92); text-shadow: 0 1px 10px rgba(0, 0, 0, 0.5); } .hkBtn { display: inline-block; padding: 13px 26px; background: #fff; color: #3357ff; border-radius: 12px; font-size: 14.5px; font-weight: 900; box-shadow: 0 12px 28px rgba(0, 0, 0, 0.3); letter-spacing: 0.2px; } /* === Подвал === */ .hkFooter { display: flex; align-items: center; gap: 14px; background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 16px; padding: 18px 22px; margin-top: 8px; font-size: 14px; color: #14532d; line-height: 1.55; } .hkFooterIco { flex-shrink: 0; width: 44px; height: 44px; border-radius: 12px; background: #16a34a; color: #fff; display: flex; align-items: center; justify-content: center; } .hkFooterIco--idle { background: #94a3b8; } /* Адаптив — на узких экранах текст крупного hero уменьшаем */ @media (max-width: 1100px) { .hkHeroInner { padding: 0 32px; } .hkTitle { font-size: 30px; } .hkDesc { font-size: 14px; } } `; export default KubikonHeroKit;