fix(tokens): импорт неигровых токенов из zip и плавные пути на macOS

Полный импорт/открытие проекта подхватывает app-tokens. Движение по путям пишется в DOM без ре-рендера кадра, у пульта и презентации выключен background throttling.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-09-07 16:16:30 +08:00
parent 586166cacd
commit fdccc0deb5
16 changed files with 285 additions and 111 deletions
@@ -11,6 +11,8 @@ import {
asProjectId,
asSceneId,
asSceneNpcTokenId,
asSceneTokenId,
asTokenId,
} from '../types/ids';
import { PROJECT_SCHEMA_VERSION } from '../types';
@@ -21,8 +23,10 @@ import {
findSceneTitleConflicts,
listExportedNpcsFromBundle,
listImportableStorylines,
collectTokenIdsFromProject,
mergeStorylinesIntoProject,
newExportBundleProjectId,
remapProjectSceneTokenIds,
selectNpcsByIds,
} from './storylineExportImport';
@@ -550,3 +554,48 @@ void test('mergeStorylinesIntoProject: reuse existing scene by resolution', () =
assert.equal(merged.sceneGraphNodes.length, 1);
assert.equal(merged.sceneGraphNodes[0]!.sceneId, targetSceneId);
});
void test('collectTokenIdsFromProject: собирает id неигровых токенов со сцен', () => {
const s1 = scene('s1', 'Start');
s1.tokens = [
{
id: asSceneTokenId('st1'),
tokenId: asTokenId('tok_a'),
nx: 0.2,
ny: 0.3,
sizeN: 0.08,
rotationDeg: 0,
},
{
id: asSceneTokenId('st2'),
tokenId: asTokenId('tok_b'),
nx: 0.5,
ny: 0.5,
sizeN: 0.08,
rotationDeg: 0,
},
];
const project = minimalProject({
scenes: { [asSceneId('s1')]: s1 },
sceneGraphNodes: [node('main', 's1', { isStartScene: true })],
});
const ids = collectTokenIdsFromProject(project).map(String).sort();
assert.deepEqual(ids, ['tok_a', 'tok_b']);
});
void test('remapProjectSceneTokenIds: переписывает tokenId на сценах', () => {
const s1 = scene('s1', 'Start');
s1.tokens = [
{
id: asSceneTokenId('st1'),
tokenId: asTokenId('old'),
nx: 0.2,
ny: 0.3,
sizeN: 0.08,
rotationDeg: 0,
},
];
const project = minimalProject({ scenes: { [asSceneId('s1')]: s1 } });
const remapped = remapProjectSceneTokenIds(project, new Map([['old', 'new']]));
assert.equal(String(remapped.scenes[asSceneId('s1')]!.tokens[0]!.tokenId), 'new');
});