import React from 'react'; import type { ReactElement } from 'react'; import Head from 'next/head'; import { useRouter } from 'next/router'; import { mdiArrowDown, mdiArrowRight, mdiCityVariantOutline, mdiCompassOutline, mdiMapMarker, mdiRoadVariant, mdiShieldAccount, mdiViewDashboardOutline, } from '@mdi/js'; import BaseButton from '../components/BaseButton'; import BaseIcon from '../components/BaseIcon'; import LayoutGuest from '../layouts/Guest'; import { getPageTitle } from '../config'; type CityMarker = { id: string; name: string; district: string; contractor: string; description: string; specialization: string; top: string; left: string; popupTop: string; popupLeft: string; }; type RoleCard = { id: string; title: string; caption: string; description: string; accent: string; }; type JourneyContext = { roleId: string; roleTitle: string; city: string; contractor: string; }; const journeyStorageKey = 'roadTalentJourney'; const palette = { navy: '#243B74', midnight: '#1A2A52', burgundy: '#56061D', berry: '#7A2338', paper: '#F5F2EC', }; const cityMarkers: CityMarker[] = [ { id: 'moscow', name: 'Москва', district: 'Центральный кластер', contractor: 'АО «ДорИнфраструктура»', description: 'Координирует набор инженерных команд, стажировки и быстрый вывод специалистов на федеральные дорожные объекты.', specialization: 'Цифровое управление проектами и кадровый резерв', top: '35%', left: '18%', popupTop: '18%', popupLeft: '23%', }, { id: 'saint-petersburg', name: 'Санкт-Петербург', district: 'Северо-Западный кластер', contractor: 'ООО «Балтийские магистрали»', description: 'Развивает дорожное проектирование и практикум для молодых специалистов под задачи северо-западных регионов.', specialization: 'Проектирование, BIM и подготовка мастеров участка', top: '26%', left: '16%', popupTop: '8%', popupLeft: '21%', }, { id: 'kazan', name: 'Казань', district: 'Приволжский кластер', contractor: 'ГК «Трасса Развития»', description: 'Собирает межвузовские команды для пилотных дорожных полигонов, подготовки механиков и специалистов по безопасности движения.', specialization: 'Учебные полигоны и отраслевые акселераторы', top: '43%', left: '29%', popupTop: '24%', popupLeft: '34%', }, { id: 'yekaterinburg', name: 'Екатеринбург', district: 'Уральский кластер', contractor: 'АО «УралДорКадры»', description: 'Формирует региональный кадровый центр по линейному строительству, эксплуатации техники и управлению подрядом.', specialization: 'Линейное строительство и эксплуатация дорожной техники', top: '45%', left: '42%', popupTop: '26%', popupLeft: '47%', }, { id: 'novosibirsk', name: 'Новосибирск', district: 'Сибирский кластер', contractor: 'ООО «СибАвтоДор»', description: 'Запускает маршруты переобучения, отраслевую аналитику и совместные программы для СПО и подрядчиков.', specialization: 'Переобучение и аналитика по потребности в кадрах', top: '50%', left: '58%', popupTop: '31%', popupLeft: '62%', }, { id: 'vladivostok', name: 'Владивосток', district: 'Дальневосточный кластер', contractor: 'ГК «Восточный путь»', description: 'Курирует кадровые потоки для портовых подходов, мостовых объектов и дорожных узлов Дальнего Востока.', specialization: 'Мостостроение, портовая логистика и восточные коридоры', top: '54%', left: '87%', popupTop: '35%', popupLeft: '69%', }, ]; const roleCards: RoleCard[] = [ { id: 'school', title: 'Школа', caption: 'Ранняя профориентация', description: 'Маршрут для учеников, наставников и школьных команд, которым нужен вход в отрасль через экскурсии и треки развития.', accent: '#243B74', }, { id: 'college', title: 'СПО и ВО', caption: 'Подготовка специалистов', description: 'Для колледжей и вузов, которые синхронизируют образовательные программы с реальными дорожными проектами.', accent: '#1A2A52', }, { id: 'contractor', title: 'Подрядные организации', caption: 'Быстрый кадровый контур', description: 'Для компаний, которым важно увидеть локальный кадровый резерв, потребности по ролям и точки входа в экосистему.', accent: '#56061D', }, { id: 'government', title: 'Государственные институты', caption: 'Управление системой', description: 'Для операторов отрасли, которые управляют координацией партнёров, показателями и региональными соглашениями.', accent: '#7A2338', }, ]; function getRoleTitle(roleId: string) { return roleCards.find((role) => role.id === roleId)?.title || ''; } function RoleIllustration({ roleId }: { roleId: string }) { const stroke = palette.paper; if (roleId === 'school') { return ( ); } if (roleId === 'college') { return ( ); } if (roleId === 'contractor') { return ( ); } return ( ); } export default function RoadTalentLanding() { const router = useRouter(); const [showIntro, setShowIntro] = React.useState(true); const [selectedCity, setSelectedCity] = React.useState(cityMarkers[0]); const [selectedRole, setSelectedRole] = React.useState(''); const [roleStageVisible, setRoleStageVisible] = React.useState(false); const [validationMessage, setValidationMessage] = React.useState(''); React.useEffect(() => { const introTimer = window.setTimeout(() => { setShowIntro(false); }, 2600); return () => window.clearTimeout(introTimer); }, []); const openRoleStage = () => { if (!selectedCity) { setValidationMessage('Сначала выберите город на карте.'); return; } setValidationMessage(''); setRoleStageVisible(true); window.setTimeout(() => { document.getElementById('roles-stage')?.scrollIntoView({ behavior: 'smooth', block: 'start' }); }, 120); }; const continueToLogin = () => { if (!selectedCity) { setValidationMessage('Сначала выберите город и подрядчика.'); return; } if (!selectedRole) { setValidationMessage('Выберите роль, чтобы продолжить ко входу.'); return; } const roleTitle = getRoleTitle(selectedRole); const journeyContext: JourneyContext = { roleId: selectedRole, roleTitle, city: selectedCity.name, contractor: selectedCity.contractor, }; localStorage.setItem(journeyStorageKey, JSON.stringify(journeyContext)); router.push({ pathname: '/login', query: { role: selectedRole, city: selectedCity.name, contractor: selectedCity.contractor, }, }); }; return ( <> {getPageTitle('Кадровый суверенитет дорожной отрасли')}
{showIntro && (

кадровый суверенитет дорожной отрасли

Соединяем города, подрядчиков и роли в одном маршруте входа

Интерактивный MVP-портал для выбора города, просмотра подрядчика и быстрого перехода к авторизации по нужной роли.

)}

MVP-портал

Кадровый суверенитет

дорожной отрасли России

Анимация входа → выбор города → роль → логин

Выберите город на карте России и войдите в отраслевую экосистему с нужной ролью.

Первый MVP-срез уже проводит пользователя по ключевому сценарию: показывает городские точки, раскрывает карточку подрядчика, предлагает роль и передаёт контекст в авторизацию без лишних шагов.

{[ { value: '6', label: 'городов в демо-карте' }, { value: '4', label: 'роли входа' }, { value: '1', label: 'сквозной маршрут MVP' }, ].map((item) => (
{item.value}
{item.label}
))}

Маршрут пользователя

Первый экран, который продаёт логику сервиса

public MVP
{[ '1. Анимированный вход знакомит пользователя с сервисом.', '2. Карта России позволяет кликнуть по городам и увидеть подрядчика.', '3. Выбор роли переносится в экран логина и дальше сохраняется для рабочего кабинета.', ].map((item) => (

{item}

))}

что дальше в админке

После входа администратор уже может пользоваться существующими справочниками Cities, Contractors и Role cards для наполнения отраслевых данных.

Шаг 1

Интерактивная карта России по городам

Нажмите на город, чтобы открыть подрядчика
Россия · дорожные кластеры
{selectedCity && (

Подрядчик

{selectedCity.contractor}

{selectedCity.description}

)} {cityMarkers.map((city) => { const isActive = selectedCity?.id === city.id; return ( ); })}
{cityMarkers.map((city) => ( ))}

Шаг 2

Выберите роль входа

Четыре карточки роли отражают ключевых участников экосистемы: от школы до подрядных организаций и государственных институтов.

{selectedCity ? `Город: ${selectedCity.name}` : 'Сначала выберите город'}
{roleCards.map((role) => { const isActive = selectedRole === role.id; return ( ); })}

Шаг 3

Переход к логину и паролю

Выбранные город, подрядчик и роль будут показаны на экране логина и сохранятся для первого экрана внутри кабинета.

Город

{selectedCity?.name || 'Не выбран'}

Подрядчик

{selectedCity?.contractor || 'Ожидание выбора'}

Роль

{getRoleTitle(selectedRole) || 'Не выбрана'}

{selectedRole ? `Готово: выбран маршрут «${selectedCity?.name || ''} → ${getRoleTitle(selectedRole)}».` : 'Выберите одну из ролей, чтобы открыть следующий шаг.'}

© 2026 Кадровый суверенитет дорожной отрасли — первый публичный маршрут входа для партнёров и образовательных учреждений.

); } RoadTalentLanding.getLayout = function getLayout(page: ReactElement) { return {page}; };