studio/src/community/KubikonDesktopOnlyStub.jsx
МИН 61fba4e174
Some checks failed
CI / Lint + Format (push) Failing after 32s
CI / Build (push) Failing after 37s
CI / Secret scan (push) Failing after 37s
CI / PR size check (push) Has been skipped
fix: починка билда + studio.rublox.pro инфра
Большой консолидирующий коммит после поднятия studio.rublox.pro (28 мая 2026).
Содержит изменения которые делались в процессе подготовки прод-окружения:

Фиксы импортов после выноса из minecraftia:
- Массовая замена путей ../../components → ../components (40+ файлов в src/community/, src/admin-preview/)
- Замена ../KubikonEditor/ → ../editor/, ../KubikonStudio/ → ../community/, ../AdminPreview/ → ../admin-preview/
- API.js скопирован из минки целиком (было 8 экспортов, стало 312)
- Добавлены PLAYER_URL, MyButton_1, недостающие компоненты
- Заменены require() на статические ES-imports в BabylonScene, PrimitiveManager, GameRuntime (Vite не поддерживает CJS require)

Структура ассетов:
- public/kubikon-templates/ → public/assets/kubikon-templates/
- public/kubikon-learn/ → public/assets/kubikon-learn/
- (код искал в /assets/, файлы лежали без /assets/)

Навигация роутов внутри студии:
- /kubikon-studio/docs → /docs (90+ навигационных вызовов sed-replaced)
- /kubikon-editor/X → /edit/X, /kubikon/play/X → /play/X, /kubikon/gd/X → /gd/X

UI:
- Новый компонент StudioHeader (61px, как в минке) + копия favicon
- WithHeader wrapper в App.jsx для всех страниц кроме fullscreen-редактора/плеера
- SSO ticket-flow в AuthContext (auto-redeem #ticket= при загрузке)
- Тёмная тема карточек игр в ВИКИ (фон #1c2231 вместо #fff, картинка впритык)

Документация:
- docs/ONBOARDING.md — путь нового контрибьютора от нуля до PR
- docs/TUTORIAL_ADD_SCRIPT_API.md — как добавить game.* API
- API_USAGE.md — список эндпоинтов backend
- README в подпапках engine/, engine/terrain/, engine/voxel/, engine/robloxterrain/, engine/types/

.gitignore:
- public/wiki/ исключён (73МБ PNG, будут на CDN отдельной задачей)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 05:01:13 +03:00

139 lines
5.9 KiB
JavaScript
Raw 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 React from 'react';
import { useNavigate } from 'react-router-dom';
import RublocsLogo from '../components/RublocsLogo/RublocsLogo';
import Icon from '../editor/Icon';
/**
* Заглушка «только для компьютера» для редактора Рублокса.
*
* Используется в KubikonStudio / KubikonEditor / KubikonDocs, когда
* пользователь зашёл с телефона или планшета: 3D-редактор требует мышь
* и клавиатуру и не адаптирован под тач.
*
* Плеер опубликованных игр (`/play/:id`) поддерживает тач —
* на него ведёт кнопка «Играть в опубликованные игры».
*/
const KubikonDesktopOnlyStub = ({ feature = 'Редактор Рублокса' }) => {
const navigate = useNavigate();
return (
<div style={{
minHeight: '100vh',
background: 'linear-gradient(160deg, #0a0e1a 0%, #1a1f3a 100%)',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
padding: '20px',
color: '#f1f5fb',
fontFamily: '"Roboto Condensed", system-ui, sans-serif',
}}>
{/* Фиксированный top-bar — кнопка возврата в школу */}
<div style={{
width: '100%',
maxWidth: 460,
marginBottom: 16,
display: 'flex',
justifyContent: 'flex-start',
}}>
<button
onClick={() => navigate('/')}
style={{
background: 'rgba(255, 255, 255, 0.08)',
color: '#f1f5fb',
border: '1px solid rgba(255, 255, 255, 0.18)',
borderRadius: 999,
padding: '8px 14px',
fontSize: 13,
fontWeight: 600,
cursor: 'pointer',
whiteSpace: 'nowrap',
}}>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>
<Icon name="arrow-left" size={14} /> Майнкрафтия
</span>
</button>
</div>
<div style={{
flex: 1,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
width: '100%',
}}>
<div style={{
maxWidth: 460,
width: '100%',
background: 'rgba(20, 24, 45, 0.94)',
border: '1px solid rgba(255, 255, 255, 0.10)',
borderRadius: 20,
padding: 32,
textAlign: 'center',
boxShadow: '0 20px 60px rgba(0, 0, 0, 0.45)',
}}>
<div style={{ display: 'flex', justifyContent: 'center', marginBottom: 18 }}>
<RublocsLogo size={64} />
</div>
<div style={{ display: 'flex', justifyContent: 'center', marginBottom: 14, color: '#5470ff' }}>
<Icon name="monitor" size={60} strokeWidth={1.5} />
</div>
<h1 style={{
fontSize: 24,
fontWeight: 800,
margin: '0 0 12px',
color: '#f1f5fb',
}}>
Только для компьютера
</h1>
<p style={{
fontSize: 16,
lineHeight: 1.5,
color: 'rgba(241, 245, 251, 0.72)',
margin: '0 0 22px',
}}>
{feature} требует мышь и клавиатуру. Открой Рублокс с компьютера или ноутбука, чтобы создавать свои 3D-игры.
</p>
<div style={{
display: 'flex',
flexDirection: 'column',
gap: 10,
marginTop: 18,
}}>
<button
onClick={() => navigate('/')}
style={{
background: 'linear-gradient(135deg, #3357ff 0%, #1e2da5 100%)',
color: '#fff',
border: 'none',
borderRadius: 12,
padding: '14px 18px',
fontSize: 16,
fontWeight: 700,
cursor: 'pointer',
boxShadow: '0 8px 24px rgba(51, 87, 255, 0.35)',
}}>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>
<Icon name="gamepad" size={16} /> Играть в опубликованные игры
</span>
</button>
<button
onClick={() => navigate('/')}
style={{
background: 'transparent',
color: 'rgba(241, 245, 251, 0.72)',
border: '1px solid rgba(255, 255, 255, 0.18)',
borderRadius: 12,
padding: '12px 18px',
fontSize: 15,
fontWeight: 600,
cursor: 'pointer',
}}>
На главную школы
</button>
</div>
</div>
</div>
</div>
);
};
export default KubikonDesktopOnlyStub;