feat(playlists): библиотека плейлистов приложения

CRUD в редакторе, read-only окно на пульте, отдельный аудиоканал, экспорт/импорт и маппинг из Foundry.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-09-03 10:37:21 +08:00
parent cfb6e62331
commit 278eb78637
46 changed files with 2438 additions and 41 deletions
@@ -12,6 +12,7 @@ const SECONDARY_WINDOW_MAINS = [
'npcs/npcsEditorMain.tsx',
'npcs/npcsMain.tsx',
'materials/main.tsx',
'playlists/main.tsx',
'sceneEditor/main.tsx',
'sceneDescription/main.tsx',
'control/main.tsx',
@@ -125,6 +126,20 @@ void test('EditorApp: split Run button and launch-with-players modal', () => {
assert.ok(editor.includes('top.runWithPlayers'));
});
void test('EditorApp: Playlists header and modal', () => {
const src = fs.readFileSync(path.join(rendererRoot, 'editor/EditorApp.tsx'), 'utf8');
assert.ok(src.includes('data-testid="playlists-header-btn"'));
assert.ok(src.includes('PlaylistsManagerModal'));
assert.ok(src.includes('setPlaylistsManagerOpen(true)'));
assert.ok(src.includes('setPlaylistsManagerOpen(false)'));
});
void test('ControlApp: Playlists tool opens window', () => {
const src = fs.readFileSync(path.join(rendererRoot, 'control/ControlApp.tsx'), 'utf8');
assert.ok(src.includes('data-testid="control-playlists-tool"'));
assert.ok(src.includes('windows.openPlaylists'));
});
void test('PlayerTokenView: name plate shows full text without ellipsis', () => {
const css = fs.readFileSync(
path.join(rendererRoot, 'shared/playerToken/PlayerTokenView.module.css'),