studio/src/editor/TerrainGenPanel.module.css
МИН 31adbf151b Initial public release: Студия Рублокса v1.0
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)
2026-05-27 23:41:10 +03:00

255 lines
5.1 KiB
CSS
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.

/* TerrainGenPanel.module.css
* Стилистика повторяет TerrainPanel (тёмная тема, accent #3357FF).
*/
.panel {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
overflow: hidden; /* сам не скроллится; скроллит .scrollArea */
background: var(--bg-dark);
color: var(--text);
font-size: 12px;
}
/* Шапка + превью — фиксированная зона сверху, не скроллится. */
.stickyTop {
flex: 0 0 auto;
background: var(--bg-dark);
border-bottom: 1px solid var(--border);
}
/* Все секции — скроллятся вертикально. */
.scrollArea {
flex: 1 1 auto;
overflow-y: auto;
overflow-x: hidden;
min-height: 0;
}
/* === Заголовок === */
.header {
padding: 12px 14px 10px;
border-bottom: 1px solid var(--border);
background: linear-gradient(180deg, var(--bg-dark) 0%, var(--bg-darkest) 100%);
}
.headerTitle {
font-size: 14px;
font-weight: 700;
color: var(--text);
margin-bottom: 2px;
}
.headerHint {
font-size: 11px;
color: var(--text-dim);
}
/* === Canvas-превью === */
.previewWrap {
padding: 10px 14px;
border-bottom: 1px solid var(--border);
}
.preview {
width: 100%;
aspect-ratio: 1 / 1;
max-width: 256px;
margin: 0 auto;
display: block;
background: #1a1a1f;
border: 1px solid var(--border);
border-radius: 4px;
image-rendering: pixelated;
}
.previewStats {
margin-top: 6px;
font-size: 10.5px;
color: var(--text-dim);
text-align: center;
}
/* === Секции (раскрываемые) === */
.section {
border-bottom: 1px solid var(--border);
}
.sectionHeader {
width: 100%;
text-align: left;
padding: 10px 14px;
background: transparent;
border: none;
color: var(--text);
font-size: 12px;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
}
.sectionHeader:hover {
background: var(--bg-darkest);
}
.sectionArrow {
color: var(--text-dim);
font-size: 10px;
width: 10px;
text-align: center;
}
.sectionBody {
padding: 4px 14px 12px;
}
/* === Слайдеры === */
.sliderRow {
margin-bottom: 10px;
}
.sliderHead {
display: flex;
justify-content: space-between;
margin-bottom: 4px;
}
.sliderLabel {
font-size: 11px;
color: var(--text-dim);
}
.sliderValue {
font-size: 11px;
color: var(--accent);
font-family: monospace;
font-weight: 600;
}
.slider {
width: 100%;
height: 4px;
-webkit-appearance: none;
appearance: none;
background: var(--bg-darkest);
border-radius: 2px;
outline: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 12px;
height: 12px;
background: var(--accent);
border-radius: 50%;
cursor: pointer;
border: none;
}
.slider::-moz-range-thumb {
width: 12px;
height: 12px;
background: var(--accent);
border-radius: 50%;
cursor: pointer;
border: none;
}
/* === Seed input === */
.seedRow {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 10px;
}
.seedRow .sliderLabel {
min-width: 38px;
}
.seedInput {
flex: 1;
background: var(--bg-darkest);
border: 1px solid var(--border);
border-radius: 3px;
padding: 4px 6px;
color: var(--text);
font-family: monospace;
font-size: 11px;
}
.diceBtn {
background: transparent;
border: 1px solid var(--border);
border-radius: 3px;
padding: 2px 6px;
cursor: pointer;
color: var(--text);
}
.diceBtn:hover {
background: var(--bg-darkest);
}
/* === Чек-боксы === */
.checkRow {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
padding: 4px 0;
user-select: none;
}
.checkRow input {
accent-color: var(--accent);
cursor: pointer;
}
.checkRow span {
font-size: 11.5px;
}
/* === Пресеты === */
.presetsGrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 5px;
}
.presetBtn {
background: var(--bg-darkest);
border: 1px solid var(--border);
border-radius: 4px;
color: var(--text);
padding: 8px 4px;
font-size: 11px;
cursor: pointer;
transition: background 0.12s, border-color 0.12s;
}
.presetBtn:hover {
background: rgba(51, 87, 255, 0.10);
border-color: var(--accent);
color: var(--accent);
}
/* === Кнопки действий === */
.actions {
padding: 12px 14px;
display: flex;
flex-direction: column;
gap: 6px;
border-top: 1px solid var(--border);
background: var(--bg-darkest);
}
.applyBtn {
background: var(--accent);
color: white;
border: none;
border-radius: 4px;
padding: 10px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: opacity 0.12s;
}
.applyBtn:hover {
opacity: 0.9;
}
.closeBtn {
background: transparent;
border: 1px solid var(--border);
border-radius: 4px;
padding: 8px;
color: var(--text-dim);
font-size: 12px;
cursor: pointer;
}
.closeBtn:hover {
color: var(--text);
background: var(--bg-dark);
}