feat(editor): побочные сюжетные линии и импорт/экспорт линий

Добавлена полноценная поддержка побочных сюжетных линий в редакторе и на
пульте: визуальное выделение компонент графа, запрет недопустимых связей
между основной и побочными линиями, метки «ПОБОЧНАЯ» и названия линий.

Реализован partial export/import сюжетных линий:
- экспорт выбранных линий в урезанный .ttrpg.zip с manifest в project.json;
- импорт в открытый проект с выбором линий, разрешением конфликтов названий
  сцен (одна модалка на операцию) и отчётом о результате;
- новое окно источника импорта: «Из проекта» (dropdown, без текущего) или
  «Из файла»; на главном экране — только полный импорт из файла.

Исправлены гонки при открытии/закрытии проекта (сериализация open/close в
main, сброс зависших состояний UI), залипание оверлея прогресса экспорта и
старт Electron в dev после готовности Vite.

Добавлены unit-тесты для lineage, export/import и контрактов zipStore.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-07-09 14:47:28 +08:00
parent de9190959c
commit c8ab9dd567
26 changed files with 3507 additions and 266 deletions
+74
View File
@@ -941,3 +941,77 @@
cursor: pointer;
width: 100%;
}
.modalDialogWide {
width: 640px;
}
.storylineChecklist {
display: grid;
gap: 8px;
max-height: 280px;
overflow-y: auto;
padding: 4px 0;
}
.storylineCheck {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px 10px;
border-radius: var(--radius-sm);
border: 1px solid var(--stroke);
background: var(--color-surface);
cursor: pointer;
font-size: 13px;
}
.storylineCheck input {
margin-top: 2px;
}
.storylineCheckDisabled {
opacity: 0.55;
cursor: not-allowed;
}
.conflictList {
display: grid;
gap: 12px;
max-height: 360px;
overflow-y: auto;
}
.conflictRow {
display: grid;
gap: 8px;
padding: 10px 12px;
border-radius: var(--radius-sm);
border: 1px solid var(--stroke);
background: var(--color-surface);
}
.conflictRowTitle {
font-weight: 700;
font-size: 13px;
}
.conflictRowOptions {
display: grid;
gap: 6px;
}
.importFileRow {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
.reportList {
display: grid;
gap: 6px;
font-size: 13px;
margin: 0;
padding-left: 18px;
}