Open-source веб-студия для создания игр Рублокса, двойная лицензия AGPL-3.0 + Коммерческая. Главное: - Vite 5 + React 18 + Babylon 7.54.3 + Monaco Editor + Colyseus 0.16 - Самодостаточный движок ~28к строк (66 файлов): BlockManager, TerrainVoxelBuilder, ModelManager, DecoManager, PlayerController, ScriptSandboxWorker, MultiplayerSync, 30+ GD-гейммодов - Главный редактор KubikonEditor (~37к строк) + панели, ScriptEditor (Monaco) - Витрина игр (KubikonFeed, KubikonStudio, KubikonDocs, KubikonLearn) - Geometry Dash sub-app (GdMenu, GdShop, GdRules, GdCoverArt) - 10 admin-preview каталогов для дизайнеров (скины, музыка, порталы и т.д.) - Конфигурируемый бэкенд через VITE_API_BASE — работает со staging (dev-api.rublox.pro) без настройки - Standalone-режим (VITE_STANDALONE=true) — открыть пустой редактор без бэка - Полная документация (на русском): README, ARCHITECTURE, CONTRIBUTING, SECURITY, CHANGELOG - ESLint + Prettier + EditorConfig - Legal: LICENSE (AGPL-3.0), LICENSE-COMMERCIAL.md, CLA.md, COPYRIGHT.md - Issue templates: bug_report, feature_request, security_disclosure Перед публикацией: - Все импорты из minecraftia заменены на локальные - Все хардкоды URL (minecraftia-school.ru) и внутренних IP убраны → env - Admin-эндпоинты Kubikon3DService вырезаны (остаются в приватном репо) - AdminKubikonModeration не публикуется (модерация — в team.rublox.pro) - 93 МБ ассетов public/kubikon-assets вынесены в .gitignore (раздаются через release artifact)
107 lines
3.6 KiB
JavaScript
107 lines
3.6 KiB
JavaScript
import React from 'react';
|
||
|
||
/**
|
||
* Бейдж статуса публикации проекта (умная лента — RUBLOX_SMART_FEED_PLAN.md).
|
||
* Показывается рядом с названием игры в редакторе и в «Мои игры».
|
||
*
|
||
* Premoderации больше нет. Статусы:
|
||
* draft — черновик, не опубликована;
|
||
* published — в ленте, видна всем;
|
||
* review — на быстрой автопроверке (скрипты ушли к админу);
|
||
* blocked — заблокирована администрацией.
|
||
*
|
||
* Props:
|
||
* status — 'draft' | 'published' | 'review' | 'blocked'
|
||
* comment — комментарий администрации (для blocked)
|
||
*/
|
||
|
||
// Самописные inline-SVG вместо эмодзи (правило проекта — никаких смайлов в UI).
|
||
const ICONS = {
|
||
// Лист бумаги — черновик
|
||
draft: (
|
||
<path d="M6 2h7l5 5v15H6zM13 2v5h5" />
|
||
),
|
||
// Галочка — опубликовано
|
||
published: (
|
||
<path d="M5 13l4 4L19 7" />
|
||
),
|
||
// Лупа — на проверке
|
||
review: (
|
||
<>
|
||
<circle cx="11" cy="11" r="6" />
|
||
<path d="M20 20l-4.3-4.3" />
|
||
</>
|
||
),
|
||
// Перечёркнутый круг — заблокировано
|
||
blocked: (
|
||
<>
|
||
<circle cx="12" cy="12" r="9" />
|
||
<path d="M6 6l12 12" />
|
||
</>
|
||
),
|
||
};
|
||
|
||
const STATUS_META = {
|
||
draft: {
|
||
label: 'Черновик',
|
||
bg: 'linear-gradient(135deg, #94a3b8 0%, #64748b 100%)',
|
||
glow: 'rgba(100, 116, 139, 0.40)',
|
||
},
|
||
published: {
|
||
label: 'В ленте',
|
||
bg: 'linear-gradient(135deg, #10b981 0%, #0f9d56 100%)',
|
||
glow: 'rgba(16, 185, 129, 0.45)',
|
||
},
|
||
review: {
|
||
label: 'На проверке',
|
||
bg: 'linear-gradient(135deg, #f59e0b 0%, #d97706 100%)',
|
||
glow: 'rgba(245, 158, 11, 0.45)',
|
||
},
|
||
blocked: {
|
||
label: 'Заблокировано',
|
||
bg: 'linear-gradient(135deg, #ff6f7a 0%, #c0303f 100%)',
|
||
glow: 'rgba(239, 68, 68, 0.45)',
|
||
},
|
||
};
|
||
|
||
const PublishStatusBadge = ({ status, comment }) => {
|
||
const meta = STATUS_META[status] || STATUS_META.draft;
|
||
const icon = ICONS[status] || ICONS.draft;
|
||
const tip = comment
|
||
? `${meta.label}\n\nКомментарий администрации:\n${comment}`
|
||
: meta.label;
|
||
return (
|
||
<div
|
||
title={tip}
|
||
style={{
|
||
display: 'inline-flex',
|
||
alignItems: 'center',
|
||
gap: 5,
|
||
padding: '4px 10px',
|
||
background: meta.bg,
|
||
border: '1px solid rgba(255, 255, 255, 0.18)',
|
||
borderRadius: 999,
|
||
color: '#fff',
|
||
fontSize: 11,
|
||
fontWeight: 800,
|
||
letterSpacing: 0.2,
|
||
whiteSpace: 'nowrap',
|
||
fontFamily: '"Roboto Condensed", system-ui, sans-serif',
|
||
cursor: comment ? 'help' : 'default',
|
||
boxShadow: `0 4px 12px ${meta.glow}`,
|
||
backdropFilter: 'blur(8px)',
|
||
WebkitBackdropFilter: 'blur(8px)',
|
||
}}
|
||
>
|
||
<svg width={12} height={12} viewBox="0 0 24 24" fill="none"
|
||
stroke="currentColor" strokeWidth="2.4"
|
||
strokeLinecap="round" strokeLinejoin="round">
|
||
{icon}
|
||
</svg>
|
||
<span>{meta.label}</span>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default PublishStatusBadge;
|