Rocketmind

Сквозные блоки

Блоки, которые появляются на нескольких страницах: лендинг, авторизация, main app. Их стиль должен быть абсолютно единым — один компонент, ноль дублирования.

Header — Фиксированная шапка

Фиксированная шапка для всех страниц. На главной скрыта, появляется при скролле за 50% viewport. На внутренних — видна сразу. Логотип слева, RocketmindMenu справа (desktop),MobileNav бургер (mobile).

Поведение
КонтекстПоведение
ГлавнаяСкрыта. Появляется (translate-y + opacity) при скролле за 50vh. fixed top-0, z-50, h-16
ВнутренниеВсегда видна. Тот же стиль: fixed top-0, bg-background, border-b
Desktop (≥768px)text_logo слева + RocketmindMenu (с dropdown) справа
Mobile (<768px)text_logo + MobileNav бургер (ml-auto). Меню скрыто
Токены
СвойствоЗначение
Позицияfixed top-0 left-0 right-0, z-50
Высотаh-16 (64px)
Фонbg-background, border-b border-border
Контейнерmax-w-[1512px] mx-auto, px-5 md:px-8 xl:px-14
Логотипtext_logo_dark_background_en.svg, w-[120px] md:w-[144px]
НавигацияRocketmindMenu: 18px (!text-[18px]), ml-auto justify-end gap-5 lg:gap-7
Анимацияtransition-all duration-300, translate-y + opacity
Скрыто-translate-y-full opacity-0 pointer-events-none
Компоненты навигации

RocketmindMenu — общий компонент для fixed-шапки и hero. Разделяет пункты на dropdown (Radix NavigationMenu) и plain-ссылки (отдельный <nav>). Viewport привязан к правому краю последнего dropdown-триггера (AI-продукты).

PropТипОписание
classNamestringКлассы обёртки (layout, gap, justify)
itemClassNamestringКлассы триггеров (размер шрифта)
showDropdownsbooleanfalse → все пункты как plain-ссылки

MobileNav — полноэкранное меню (clip-path circle). Белый фон, accordion-секции, stagger-анимация. Portal → document.body, z-[55]. Бургер: 2 бара w-[40px], трансформируется в X, z-[60].

// apps/site/src/components/sections/

Header.tsx → RocketmindMenu + MobileNav

RocketmindMenu.tsx → Radix NavigationMenu + plain links

MobileNav.tsx → clip-path circle + accordions

Dropdown
СвойствоЗначение
Viewport[&>div]:right-0 [&>div]:left-auto — привязан к правому краю (до AI-продукты)
Ширина>4 items → w-[680px] grid-cols-3, ≤4 → w-[420px] grid-cols-2
Hoverhover:opacity-[0.88], data-[state=open]:opacity-[0.88]
КликonClick → router.push(item.href) — навигация на разводящую страницу
Навигационные данные (site-nav.ts)
ГруппаТипhrefПодпункты
Консалтинг и стратегииDropdown (8)/consultingЭкосистемная стратегия, Цифровая платформа, Умная аналитика, Готовность команды, Стратегические сессии, Дизайн-спринты, Резидент Сколково, Готовность бизнеса
Онлайн-школаDropdown (2)/academyБизнес-дизайн для команд, Бизнес-дизайн. Быстрый старт
AI-продуктыDropdown (2)/ai-productsТестирование гипотез, Моделирование бизнеса
О RocketmindLink/about
МедиаLink/media

MobileNav — Мобильное меню

Полноэкранное меню с круговой анимацией (clip-path circle). Белый фон, чёрный текст, accordion-секции. Нажмите бургер, чтобы увидеть.

Нажмите бургер →
Параметры MobileNav
ПараметрЗначение
Бургер2 бара, w-[40px] h-[10px], h-[2px] каждый. Трансформируется в X
Открытиеclip-path: circle() из центра бургера → 2000px, 0.75s
Закрытиеcircle(2000px) → circle(0), 0.65s
Фонbg-white (#FFF), fixed inset-0, z-[55]
Пунктыfont-mono 22px font-light, uppercase, text-black
Accordionheight: 0 → auto, opacity: 0 → 1, stagger 0.07s
EscapeЗакрывает по Escape
z-indexПанель z-[55], бургер z-[60]
Hero Header (доп. вариант)

Навигация внутри hero-секции главной. Не отдельная шапка — часть hero-контента. Desktop: RocketmindMenu прижат вправо (20px шрифт, gap-x-7), рядом статистика и бургер. Mobile: только MobileNav, меню скрыто. Появляется с motion fadeUp.

ПараметрHero HeaderFixed Header
ПозицияInline, часть herofixed top-0
ФонПрозрачныйbg-background
Шрифт20px18px
ЛоготипБольшой wordmark herotext_logo 144px
ВидимостьДо скроллаПосле скролла 50vh
Анимацияmotion fadeUptranslate-y

Единый футер для всех страниц. Логотип с дескриптором, 4-колоночная навигация (2 на мобайле), юридические ссылки, копирайт. Данные из site-nav.ts.

Токены футера
СвойствоЗначение
Фонbg-background, border-t border-border
Контейнерmax-w-[1512px] mx-auto, px-5 md:px-8 xl:px-14, py-12 md:py-16
Логотипwith_descriptor_dark_background_en.svg, h-14
Сеткаgrid-cols-2 gap-8 md:grid-cols-4 md:gap-12
Заголовокfont-mono text-[11px] uppercase tracking-[0.1em] text-muted-foreground/50
Ссылкаtext-[14px] leading-[1.5] text-muted-foreground hover:text-foreground
Копирайтtext-[13px] text-muted-foreground/50. Desktop: в 1-й колонке. Mobile: под сеткой
ДанныеCONSULTING_SERVICES, ACADEMY_COURSES, AI_PRODUCTS, LEGAL_LINKS из site-nav.ts
Структура

// apps/site/src/components/sections/Footer.tsx

import { Footer } from "@/components/sections/Footer";

 

<Footer />

InfiniteLogoMarquee

Бесконечная бегущая строка логотипов партнёров / клиентов. CSS-анимация (не JS), fade по краям через mask-image. Компонент из @rocketmind/ui.

Билайн
ВТБ
Т-Банк
Росатом
Минцифры
РУСАЛ
Газпромбанк
МТС
ВКонтакте
X5 Group
Билайн
ВТБ
Т-Банк
Росатом
Минцифры
РУСАЛ
Газпромбанк
МТС
ВКонтакте
X5 Group
Props
PropТипПо умолчаниюОписание
logosLogoMarqueeItem[]Массив { alt, src, width?, height? }
speedSecondsnumber25Длительность цикла
gapnumber67Расстояние между логотипами (px)
maxLogoHeightnumber39Макс. высота логотипа (px)
fadeWidthnumber44Ширина fade-маски по краям (px)
reversebooleanfalseНаправление: true → слева направо

import { InfiniteLogoMarquee } from "@rocketmind/ui";

<InfiniteLogoMarquee logos={logos} reverse />

Сквозная плашка cookie. Фиксируется снизу слева, появляется один раз при первом визите (выбор хранится в cookie rm_cookie_consent). Поверхность — popover (flat, без тени), радиус rounded-lg, кнопки из DS-Button. Компонент из @rocketmind/ui.

Токены
СвойствоЗначение
Позицияfixed bottom-4 left-4, z-50
Ширинаw-[calc(100vw-2rem)] max-w-[400px]
Поверхностьbg-popover, border border-border, rounded-lg, p-4 (flat — без тени)
Иконкаlucide Cookie, size-5, text-primary
Текстtext-[14px] leading-[1.45] text-muted-foreground; ссылка text-primary
КнопкиButton size=sm — «Принять все» (default) + «Только необходимые» (ghost)
ЗакрытиеX сверху справа = «только необходимые»
Анимацияtransition opacity+translate-y, duration-300, входной translate-y-3 → 0
Хранениеcookie rm_cookie_consent = all | necessary, max-age 180 дней, SameSite=Lax
Props
PropТипПо умолчаниюОписание
textReactNodeПереопределить текст согласия
policyHrefstring/legal/privacy-policyСсылка на политику
policyLabelstringполитикой конфиденциальностиПодпись ссылки в дефолтном тексте
acceptLabelstringПринять всеПодпись основной кнопки
rejectLabelstringТолько необходимыеПодпись вторичной кнопки
cookieNamestringrm_cookie_consentИмя cookie с выбором
ttlDaysnumber180Срок жизни выбора (дней)
onAccept() => voidКолбэк при «Принять все»
onReject() => voidКолбэк при «Только необходимые»
forceVisiblebooleanfalseПоказать всегда (превью в DS), не пишет cookie

import { CookieConsent } from "@rocketmind/ui";

// в корневом layout, один раз на всё приложение

<CookieConsent />