fix: game audio persistence and editor perf

- Keep game/campaign audio assets referenced (no prune)
- Flush pending project save on quit/switch/export to avoid losing campaignAudios
- Control: prevent game music restarts on scene changes; allow always-on controls; handle autoplay-after-scene-audio
- Editor: reduce ReactFlow churn with stable scene card map; lazy/async image decode
- Add contract/unit tests and update test script

Made-with: Cursor
This commit is contained in:
Ivan Fontosh
2026-04-22 19:06:16 +08:00
parent f823a7c05f
commit 1d051f8bf9
19 changed files with 1164 additions and 115 deletions
+6
View File
@@ -9,6 +9,8 @@ type RotatedImageProps = {
rotationDeg: 0 | 90 | 180 | 270;
mode: Mode;
alt?: string;
loading?: React.ImgHTMLAttributes<HTMLImageElement>['loading'];
decoding?: React.ImgHTMLAttributes<HTMLImageElement>['decoding'];
/** Высота/ширина полностью контролируются родителем. */
style?: React.CSSProperties;
/** Прямоугольник видимого контента (contain/cover) внутри контейнера. */
@@ -40,6 +42,8 @@ export function RotatedImage({
rotationDeg,
mode,
alt = '',
loading,
decoding,
style,
onContentRectChange,
}: RotatedImageProps) {
@@ -91,6 +95,8 @@ export function RotatedImage({
<img
alt={alt}
src={url}
loading={loading}
decoding={decoding}
className={styles.img}
style={{
width: w ?? '100%',