@vnejs/docs 0.2.64 → 0.2.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +35 -35
  2. package/architecture/backends.md +18 -0
  3. package/architecture/build.md +37 -0
  4. package/architecture/bundles.md +20 -0
  5. package/architecture/cli.md +25 -0
  6. package/architecture/compatibility.md +22 -0
  7. package/architecture/configs.md +19 -0
  8. package/architecture/contracts.md +30 -0
  9. package/architecture/dependencies.md +55 -0
  10. package/architecture/editor.md +7 -0
  11. package/architecture/games.md +38 -0
  12. package/architecture/helpers.md +14 -0
  13. package/architecture/model.md +43 -0
  14. package/architecture/modules.md +87 -0
  15. package/architecture/packages.md +43 -0
  16. package/architecture/plugins.md +36 -0
  17. package/architecture/uis.md +23 -0
  18. package/changelog/0.2.18.md +7 -0
  19. package/changelog/0.2.19.md +14 -0
  20. package/changelog/0.2.20.md +10 -0
  21. package/changelog/0.2.21.md +5 -0
  22. package/changelog/0.2.22.md +11 -0
  23. package/changelog/0.2.23.md +4 -0
  24. package/changelog/0.2.25.md +6 -0
  25. package/changelog/0.2.26.md +12 -0
  26. package/changelog/0.2.29.md +10 -0
  27. package/changelog/0.2.31.md +5 -0
  28. package/changelog/0.2.32.md +3 -0
  29. package/changelog/0.2.33.md +5 -0
  30. package/changelog/0.2.34.md +8 -0
  31. package/changelog/0.2.35.md +33 -0
  32. package/changelog/0.2.36.md +10 -0
  33. package/changelog/0.2.38.md +19 -0
  34. package/changelog/0.2.39.md +16 -0
  35. package/changelog/0.2.40.md +9 -0
  36. package/changelog/0.2.42.md +3 -0
  37. package/changelog/0.2.43.md +10 -0
  38. package/changelog/0.2.46.md +3 -0
  39. package/changelog/0.2.47.md +25 -0
  40. package/changelog/0.2.49.md +3 -0
  41. package/changelog/0.2.50.md +6 -0
  42. package/changelog/0.2.51.md +6 -0
  43. package/changelog/0.2.52.md +5 -0
  44. package/changelog/0.2.53.md +12 -0
  45. package/changelog/0.2.55.md +19 -0
  46. package/changelog/0.2.56.md +11 -0
  47. package/changelog/0.2.57.md +7 -0
  48. package/changelog/0.2.58.md +8 -0
  49. package/changelog/0.2.59.md +6 -0
  50. package/changelog/0.2.60.md +5 -0
  51. package/changelog/0.2.61.md +11 -0
  52. package/changelog/0.2.62.md +8 -0
  53. package/changelog/0.2.63.md +4 -0
  54. package/changelog/0.2.64.md +4 -0
  55. package/changelog/0.2.65.md +3 -0
  56. package/changelog/0.2.66.md +5 -0
  57. package/changelog/README.md +43 -0
  58. package/manifest.json +66 -5
  59. package/package.json +6 -4
  60. package/plugins/ai/ai.md +29 -29
  61. package/plugins/ai/checkers.md +26 -26
  62. package/plugins/audio/ambient.md +20 -20
  63. package/plugins/audio/audio.md +40 -40
  64. package/plugins/audio/music.md +20 -20
  65. package/plugins/audio/sound.md +20 -20
  66. package/plugins/audio/voice.md +23 -23
  67. package/plugins/canvas/bg.md +44 -44
  68. package/plugins/canvas/bg.speak.md +34 -34
  69. package/plugins/canvas/fill.md +33 -33
  70. package/plugins/canvas/layer.md +35 -35
  71. package/plugins/canvas/sprite.md +46 -46
  72. package/plugins/canvas/sprite.speak.md +33 -33
  73. package/plugins/canvas/text.md +37 -37
  74. package/plugins/canvas/video.md +37 -37
  75. package/plugins/canvas.layers/bl.md +33 -33
  76. package/plugins/canvas.layers/fl.md +33 -33
  77. package/plugins/canvas.layers/ml.md +33 -33
  78. package/plugins/canvas.layers/ul.md +32 -32
  79. package/plugins/canvas.props/animation.md +25 -25
  80. package/plugins/canvas.props/clip.md +22 -22
  81. package/plugins/canvas.props/filters.md +20 -20
  82. package/plugins/canvas.props/mask.md +23 -23
  83. package/plugins/canvas.props/scale.md +20 -20
  84. package/plugins/common/grid.md +23 -23
  85. package/plugins/common/turn.md +18 -18
  86. package/plugins/controls/controls.md +31 -31
  87. package/plugins/controls/cursor.md +54 -54
  88. package/plugins/controls/gamepad.md +56 -56
  89. package/plugins/controls/keyboard.md +17 -17
  90. package/plugins/core/components.md +28 -28
  91. package/plugins/core/interact.md +26 -26
  92. package/plugins/core/logs.md +28 -28
  93. package/plugins/core/media.md +38 -38
  94. package/plugins/core/memory.md +28 -28
  95. package/plugins/core/platforms.md +19 -19
  96. package/plugins/core/scenario.md +48 -48
  97. package/plugins/core/settings.md +24 -24
  98. package/plugins/core/stack.md +39 -39
  99. package/plugins/core/state.md +30 -30
  100. package/plugins/core/storage.md +56 -56
  101. package/plugins/core/system.md +37 -37
  102. package/plugins/core/vendors.md +19 -19
  103. package/plugins/entities/entities.md +16 -16
  104. package/plugins/entities/wallet.md +27 -27
  105. package/plugins/font/montserrat.md +16 -16
  106. package/plugins/game/checkers.md +38 -38
  107. package/plugins/platform/android.md +17 -17
  108. package/plugins/platform/electron.md +21 -21
  109. package/plugins/platform/metric.md +23 -23
  110. package/plugins/rpg/damage.md +22 -22
  111. package/plugins/rpg/hit.md +24 -24
  112. package/plugins/rpg/skills.md +26 -26
  113. package/plugins/save/auto.md +26 -26
  114. package/plugins/save/continue.md +23 -23
  115. package/plugins/save/quick.md +24 -24
  116. package/plugins/save/save.md +37 -37
  117. package/plugins/scales/health.md +17 -17
  118. package/plugins/scales/mana.md +17 -17
  119. package/plugins/scales/scales.md +31 -31
  120. package/plugins/scenario/autoread.md +36 -36
  121. package/plugins/scenario/choose.md +74 -65
  122. package/plugins/scenario/fastforward.md +46 -46
  123. package/plugins/scenario/history.md +41 -41
  124. package/plugins/scenario/pause.md +27 -27
  125. package/plugins/scenario/point_and_click.md +51 -51
  126. package/plugins/scenario/qte.md +54 -54
  127. package/plugins/scenario/random.md +17 -17
  128. package/plugins/settings/filter.md +19 -19
  129. package/plugins/settings/potato.md +22 -22
  130. package/plugins/settings/ratio.md +19 -19
  131. package/plugins/settings/textsize.md +19 -19
  132. package/plugins/settings/volume.md +21 -21
  133. package/plugins/text/inject.md +22 -22
  134. package/plugins/text/locs.md +36 -36
  135. package/plugins/text/meet.md +19 -19
  136. package/plugins/text/smooth.md +33 -33
  137. package/plugins/text/text.md +76 -69
  138. package/plugins/text/wall.md +20 -20
  139. package/plugins/time/date.md +22 -22
  140. package/plugins/time/time.md +23 -23
  141. package/plugins/vars/counters.md +28 -28
  142. package/plugins/vars/flags.md +24 -24
  143. package/plugins/vars/vars.md +29 -29
  144. package/plugins/views/achievement.md +44 -44
  145. package/plugins/views/comment.md +31 -31
  146. package/plugins/views/controls.hints.md +34 -34
  147. package/plugins/views/cursor.md +19 -19
  148. package/plugins/views/fps.md +33 -33
  149. package/plugins/views/gamepad.debug.md +32 -32
  150. package/plugins/views/settings.md +39 -39
  151. package/plugins/views/video.md +37 -37
  152. package/plugins/views.scenario/choose.md +41 -41
  153. package/plugins/views.scenario/interface.controls.md +31 -31
  154. package/plugins/views.scenario/interface.fastforward.md +29 -29
  155. package/plugins/views.scenario/interface.md +74 -74
  156. package/plugins/views.scenario/point_and_click.md +39 -39
  157. package/plugins/views.scenario/qte.md +51 -51
  158. package/plugins/views.screens/checkers.md +35 -35
  159. package/plugins/views.screens/confirm.md +35 -35
  160. package/plugins/views.screens/credits.md +31 -31
  161. package/plugins/views.screens/disclaimer.md +42 -42
  162. package/plugins/views.screens/eula.md +37 -37
  163. package/plugins/views.screens/gallery.full.md +41 -41
  164. package/plugins/views.screens/gallery.md +75 -75
  165. package/plugins/views.screens/gamemenu.md +41 -41
  166. package/plugins/views.screens/history.md +39 -39
  167. package/plugins/views.screens/intro.md +32 -32
  168. package/plugins/views.screens/loading.md +30 -30
  169. package/plugins/views.screens/mainmenu.md +49 -49
  170. package/plugins/views.screens/mainmenu.socials.md +25 -25
  171. package/plugins/views.screens/save.md +66 -66
  172. package/plugins/views.screens/settings.defaults.md +37 -37
  173. package/plugins/views.screens/settings.md +40 -40
  174. package/scenario.catalog/README.md +13 -13
  175. package/scenario.catalog/index.md +35 -35
  176. package/scenario.catalog/stubs/achievement.md +4 -4
  177. package/scenario.catalog/stubs/audio.ambient.md +4 -4
  178. package/scenario.catalog/stubs/audio.music.md +4 -4
  179. package/scenario.catalog/stubs/audio.sound.md +4 -4
  180. package/scenario.catalog/stubs/audio.voice.md +4 -4
  181. package/scenario.catalog/stubs/bl.animation.md +5 -5
  182. package/scenario.catalog/stubs/bl.bg.md +5 -5
  183. package/scenario.catalog/stubs/bl.clip.md +5 -5
  184. package/scenario.catalog/stubs/bl.fill.md +5 -5
  185. package/scenario.catalog/stubs/bl.filter.md +5 -5
  186. package/scenario.catalog/stubs/bl.mask.md +5 -5
  187. package/scenario.catalog/stubs/bl.scale.md +5 -5
  188. package/scenario.catalog/stubs/bl.sprite.md +5 -5
  189. package/scenario.catalog/stubs/bl.text.md +5 -5
  190. package/scenario.catalog/stubs/bl.video.md +5 -5
  191. package/scenario.catalog/stubs/choose.block.md +7 -7
  192. package/scenario.catalog/stubs/choose.md +4 -4
  193. package/scenario.catalog/stubs/choose.option.md +7 -7
  194. package/scenario.catalog/stubs/comment.md +5 -5
  195. package/scenario.catalog/stubs/counter.md +5 -5
  196. package/scenario.catalog/stubs/credits.md +4 -4
  197. package/scenario.catalog/stubs/date.md +4 -4
  198. package/scenario.catalog/stubs/disclaimer.md +5 -5
  199. package/scenario.catalog/stubs/fl.animation.md +5 -5
  200. package/scenario.catalog/stubs/fl.bg.md +5 -5
  201. package/scenario.catalog/stubs/fl.clip.md +5 -5
  202. package/scenario.catalog/stubs/fl.fill.md +5 -5
  203. package/scenario.catalog/stubs/fl.filter.md +5 -5
  204. package/scenario.catalog/stubs/fl.mask.md +5 -5
  205. package/scenario.catalog/stubs/fl.scale.md +5 -5
  206. package/scenario.catalog/stubs/fl.sprite.md +5 -5
  207. package/scenario.catalog/stubs/fl.text.md +5 -5
  208. package/scenario.catalog/stubs/fl.video.md +5 -5
  209. package/scenario.catalog/stubs/flag.md +13 -13
  210. package/scenario.catalog/stubs/interface.md +4 -4
  211. package/scenario.catalog/stubs/intro.md +4 -4
  212. package/scenario.catalog/stubs/mainmenu.md +4 -4
  213. package/scenario.catalog/stubs/ml.animation.md +5 -5
  214. package/scenario.catalog/stubs/ml.bg.md +5 -5
  215. package/scenario.catalog/stubs/ml.clip.md +5 -5
  216. package/scenario.catalog/stubs/ml.fill.md +5 -5
  217. package/scenario.catalog/stubs/ml.filter.md +5 -5
  218. package/scenario.catalog/stubs/ml.mask.md +5 -5
  219. package/scenario.catalog/stubs/ml.scale.md +5 -5
  220. package/scenario.catalog/stubs/ml.sprite.md +5 -5
  221. package/scenario.catalog/stubs/ml.text.md +5 -5
  222. package/scenario.catalog/stubs/ml.video.md +5 -5
  223. package/scenario.catalog/stubs/other.md +6 -6
  224. package/scenario.catalog/stubs/pause.md +5 -5
  225. package/scenario.catalog/stubs/point-and-click.block.md +4 -4
  226. package/scenario.catalog/stubs/point-and-click.md +4 -4
  227. package/scenario.catalog/stubs/point-and-click.option.md +4 -4
  228. package/scenario.catalog/stubs/qte.md +4 -4
  229. package/scenario.catalog/stubs/random.md +4 -4
  230. package/scenario.catalog/stubs/random.option.md +4 -4
  231. package/scenario.catalog/stubs/save.auto.md +4 -4
  232. package/scenario.catalog/stubs/save.md +5 -5
  233. package/scenario.catalog/stubs/scenario.md +4 -4
  234. package/scenario.catalog/stubs/settings.defaults.md +4 -4
  235. package/scenario.catalog/stubs/stack.md +4 -4
  236. package/scenario.catalog/stubs/text.meet.md +4 -4
  237. package/scenario.catalog/stubs/text.wall.md +4 -4
  238. package/scenario.catalog/stubs/time.md +4 -4
  239. package/scenario.catalog/stubs/ul.animation.md +5 -5
  240. package/scenario.catalog/stubs/ul.bg.md +5 -5
  241. package/scenario.catalog/stubs/ul.clip.md +5 -5
  242. package/scenario.catalog/stubs/ul.fill.md +5 -5
  243. package/scenario.catalog/stubs/ul.filter.md +5 -5
  244. package/scenario.catalog/stubs/ul.mask.md +5 -5
  245. package/scenario.catalog/stubs/ul.scale.md +5 -5
  246. package/scenario.catalog/stubs/ul.sprite.md +5 -5
  247. package/scenario.catalog/stubs/ul.text.md +5 -5
  248. package/scenario.catalog/stubs/video.md +4 -4
  249. package/scenario.catalog/stubs/wallet.md +4 -4
  250. package/scenario.guide/README.md +38 -38
  251. package/scenario.guide/audio.md +11 -11
  252. package/scenario.guide/canvas.md +23 -23
  253. package/scenario.guide/choose.md +28 -28
  254. package/scenario.guide/dialogue.md +23 -23
  255. package/scenario.guide/flow.md +21 -21
  256. package/scenario.guide/point-and-click.md +12 -12
  257. package/scenario.guide/qte-random.md +20 -20
  258. package/scenario.guide/vars.md +19 -19
  259. package/scenario.guide/views.md +20 -20
  260. package/CHANGELOG.md +0 -383
  261. package/architecture.md +0 -566
package/CHANGELOG.md DELETED
@@ -1,383 +0,0 @@
1
- # Changelog
2
-
3
- Краткая история изменений движка (плагины, helpers, packages, CLI и прочий runtime) и внешнего API. Версии — релизы пакета `@vnejs/docs`.
4
-
5
- ## 0.2.64
6
-
7
- - `views.screens/credits` — конец прокрутки и клик по экрану шлют `CREDITS.HIDE`. Раньше view передавал `onClose`: `ScrollContent` ждёт `onFinish`, `Screen` — `onClick`, поэтому после титров `SCENARIO.NEXT` не уходил и сценарий не продолжался.
8
- - `text/text` — `STATE.CLEAR` сбрасывает текст и шлёт `TEXT.CHANGED`, без `TEXT.EMIT`. Раньше clear шёл через `TEXT.EMIT` → `TEXT.EMIT_BEFORE` → `INTERFACE.SHOW` и открывал пустой интерфейс. `STATE.SET` по-прежнему шлёт `TEXT.EMIT` с `isKeepProcessState`.
9
-
10
- ## 0.2.63
11
-
12
- - `uis/react/hooks/use-store-state` — `notifyIsForce(true)` зовётся из `useLayoutEffect`, в том же коммите, где React записал `isForce`. `useEffect` откладывался отдельной задачей и иногда не выполнялся: `interface.controller` оставался в `uninitedModules`, движок не доходил до `start`.
13
- - `module.components` — несколько ожиданий `isForce` на одном view отпускаются вместе. Раньше второй `onUpdateStoreComponent` затирал resolver первого, и первое ожидание не завершалось.
14
-
15
- ## 0.2.62
16
-
17
- - `module.components` — при `isForce` `onUpdateStoreComponent` ждёт `ViewStoreApi.notifyIsForce(true)` и затем пишет `isForce: false`. Фиксированный `waitTimeout(100)` снят. API: `ViewStoreApi.notifyIsForce`, `ViewIsForceNotify`.
18
- - `uis/react/hooks/use-store-state` — подписка через `useSyncExternalStore`. После коммита стейта с `isForce` зовёт `store.notifyIsForce(true)`. Это единственный сигнал, который отпускает ожидание в `onUpdateStoreComponent`.
19
- - `uis/react/hooks/use-is-force-hook` — таймаут сброса `isRealForce` снимается, если `isForce` снова стал `true`.
20
- - `views/fps`, `views/gamepad.debug`, `views/achievement` — в `View` уходит `isForce` из стора. Задержку кадра делает сам `View`.
21
- - `views.scenario/interface` — `isForce` доходит до `SmoothText` в `InterfaceViewDialog`, `InterfaceViewLine` и `InterfaceViewWall`. Иначе форс-кадр оставляет посимвольный переход.
22
- - `uis/react/composites/smooth-text` — смена `tokens` рисуется без `opacity`-перехода. Дальнейший рост `tokensVisibleForce` анимируется и когда за кадр появляется несколько символов. `tokensVisibleForce` применяется до отрисовки.
23
-
24
- ## 0.2.61
25
-
26
- - `views.scenario/interface` — подписки `INTERFACE.SHOW` и `INTERFACE.HIDE` в модуле `interface.actions.show`. На `GATE` они обрывают остальных подписчиков, если интерфейс уже показан или уже скрыт, либо show/hide уже выполняется. Показ скрытого слоя шлёт `EVENTS.INTERFACE.VISIBLE`. API: `InterfaceShow.onShowGate`, `InterfaceShow.onHideGate`, `InterfaceShow.isInShowOrHideProcess`, `InterfaceShow.setShow`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW.GATE`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.HIDE.GATE`.
27
- - `views/controls.hints` — show/hide группы по `showEvents` / `hideEvents` сохраняют `isForce` исходного события: `isForce: true` обновляет view через `UPDATE_FORCE`, иначе через `UPDATE_FAST`. API: `ControlsHintsController.onGroupShow`, `ControlsHintsController.onGroupHide`, `ControlsHintsController.updateGroupStateAndView`.
28
- - `backends/auth`, `backends/content` — локальный запуск: `npm run dev` (`npm start` то же самое), auth `127.0.0.1:8787`, content `127.0.0.1:8788`. Секрет из `.env`; пустой `AUTH_SECRET` → `500`, не ошибка WebCrypto.
29
- - `backends/auth` — `GET /` показывает статус входа и кнопку на `/steam/start`. Origin самого воркера для этой страницы допускается вместе с `ALLOWED_ORIGINS`.
30
- - `backends/auth` — `isOwnedByUser` (ранее `isPurchasedByUser`): `ownsApp` в JWT без требования `permanent` в ответе CheckAppOwnership; по-прежнему отсекаются `sitelicense` и чужой `ownersteamid`.
31
- - `backends/auth` — env `APP_DEMO_ID` (по умолчанию `5081630`); CheckAppOwnership для демо, в JWT и на тестовой странице `GET /` — `ownsDemoApp` отдельно от `ownsApp`.
32
- - `backends/auth` — тестовая страница и `/session`: имя (`GetPlayerSummaries`), локальное время окончания JWT (`expiresAt`, формат `DD.MM hh:mm:ss`), кнопка «Обновить сессию» (`GET /session`).
33
- - `backends/shared` — `TOKEN_TTL_SECONDS`: JWT живёт 3 суток.
34
- - `backends/auth`, `backends/content` — HTTP на Fastify; локально `npm run dev` (`node --env-file=.env` + `tsx`, порты 8787/8788). Опционально `npm run dev:worker` (Wrangler + Fastify через `inject`).
35
-
36
- ## 0.2.60
37
-
38
- - `backends/auth`, `backends/content` — воркеры токена Steam и выдачи `dist/label`. Контент отдаётся только с JWT, в котором `ownsApp` true.
39
- - `views.screens/history` — закрытие крестиком сверху справа, клик шлёт `EVENTS.HISTORY_VIEW.HIDE`. Текстовая кнопка внизу снята. Список реплик высотой 1800 по вертикали по центру экрана. API: `PARAMS.HISTORY_VIEW.VIEW_PROPS.close` теперь `{ position, svg }`.
40
- - `module.controller.arrows.vertical`, `module.controller.arrows.horizontal`, `module.controller.arrows.grid` — на `HIDE.CLEANUP` позиция пункта в стейте становится `undefined` через `UPDATE_STATE`, затем `UPDATE_FAST` перерисовывает view. API: `currentArrowVerticalItem`, `currentArrowHorizontalItem`, `gridRow`, `gridColumn`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.HIDE.CLEANUP`.
41
-
42
- ## 0.2.59
43
-
44
- - `views.scenario/interface.controls`, `views.scenario/interface.fastforward` — hide не сбрасывает локальный стейт (`SHOULD_CLEAR_STATE_ON_CLEANUP` = `false`). Иначе `$ interface show` после выбора публиковал `isVisible: false`, и кнопки с индикатором прокрутки оставались прозрачными. API: `InterfaceControlsController.SHOULD_CLEAR_STATE_ON_CLEANUP`, `InterfaceFastforwardController.SHOULD_CLEAR_STATE_ON_CLEANUP`.
45
- - `module.controller.hide.on.controls`, `module.controller.accept`, `module.controller.interact`, `module.controller.arrows.vertical`, `module.controller.arrows.horizontal`, `module.controller.arrows.grid`, `module.controller.tabs`, `module.controller.audio` — свой `state.isShow` снят. Повторный `SHOW` / `HIDE` обрывает `ModuleController` на `GATE`; расширения больше не пропускают `POP` по локальному флагу. API: снято `state.isShow` у `ModuleControllerHideOnControlsState`, `ModuleControllerAcceptState`, `ModuleControllerInteractState`, `ModuleControllerArrowsVerticalState`, `ModuleControllerArrowsHorizontalState`, `ModuleControllerArrowsGridState`, `ModuleControllerTabsState`, `ModuleControllerAudioState`.
46
- - `module.components` — `ModuleController.setShow` пишет `{ isShow }` через `EVENT_UPDATE_STATE`, затем вызывает `updateView(isForce, false)`.
47
- - `module.controller.backgrounds`, `module.controller.bg`, `module.controller.preload` — подписка на `EVENT_UPDATE_STATE` (`updateState`). Свой `isShow` на `SHOW` / `HIDE` снят. `backgrounds` на `HIDE.AFTER` всегда снимает таймер ротации. API: `ModuleControllerPreload.EVENT_UPDATE_STATE`.
48
-
49
- ## 0.2.58
50
-
51
- - `text/text` — `STATE.SET` и `STATE.CLEAR` эмитят `TEXT.EMIT` с `isKeepProcessState`, чтобы восстановление не затирало `text.process.state`. `TEXT.EMIT_END` с этим флагом не шлёт `TEXT.PROCESS_STATE` и `TEXT.EMIT_NEXT`. Сценарный `TEXT.EMIT` флаг не ставит. API: `TextEmitPayload.isKeepProcessState`, `TextEmitEndPayload.isKeepProcessState`.
52
- - `scenario/choose` — у каждого открытия выбора свой `id` (`crypto.randomUUID()` на `EMIT`, `""` после закрытия). `STATE.SET` при другом открытом выборе пишет срез и шлёт `HIDE`, затем `SHOW` с `{ isForce: true }`. Смена `isShow` шлёт один `EVENTS.CHOOSE.HIDE` или `EVENTS.CHOOSE.SHOW` с `{ isForce: true }`. API: `ChoosePluginModelState.id`.
53
- - `module.controller.interact` — `BUTTONS.ANY` → `EVENTS.INTERACT.EMIT`; после показа `EVENTS.INTERACT.PUSH` с `onInteract`, перед скрытием `EVENTS.INTERACT.POP`; controls PUSH/POP на `SHOW.CONTROLS` / `HIDE.CONTROLS`. API: `ModuleControllerInteract.onInteract`, `ModuleControllerInteract.EVENT_SHOW`, `ModuleControllerInteract.EVENT_HIDE`, `ModuleControllerInteract.CONTROLS_ZINDEX`, `ModuleControllerInteract.CONTROLS_CHECK_NEXT`.
54
- - `views/video` — `BUTTONS.ANY` и `INTERACT.PUSH` / `POP` в `video.controller.interact` на `@vnejs/module.controller.interact`; `onInteract` возвращает промис `EVENTS.VIDEO.HIDE`. `video.controller` на `SHOW.BEFORE` эмитит `EVENTS.INTERFACE.TEXT_HIDE`, на `HIDE.AFTER` — `EVENTS.VIDEO.SET_SRC` и `EVENTS.SCENARIO.NEXT`.
55
- - `views.screens/intro` — `BUTTONS.ANY` и `INTERACT.PUSH` / `POP` в `intro.controller.interact` на `@vnejs/module.controller.interact`; `onInteract` → `EVENTS.INTRO.INTERACT`.
56
- - `views.screens/credits` — `credits.controller.accept` заменён на `credits.controller.interact` на `@vnejs/module.controller.interact`; `onInteract` → `EVENTS.CREDITS.HIDE`. Снято `EVENTS.CREDITS.ACCEPT`.
57
-
58
- ## 0.2.57
59
-
60
- - `module.controller.arrows.horizontal` — кнопки зовут переопределяемые `onArrowLeft` / `onArrowRight` (по умолчанию `decCurrentItem` / `incCurrentItem`). Хук может вернуть `Promise`. `getMaxCurrentItem` больше не abstract, по умолчанию `0`. `EVENT_UPDATE_STATE` сливает partial в стейт модуля. API: `ModuleControllerArrowsHorizontal.onArrowLeft`, `ModuleControllerArrowsHorizontal.onArrowRight`, `ModuleControllerArrowsHorizontal.getMaxCurrentItem`.
61
- - `module.controller.arrows.vertical` — кнопки зовут переопределяемые `onArrowUp` / `onArrowBottom` (по умолчанию `decCurrentItem` / `incCurrentItem`). Хук может вернуть `Promise`. `getMaxCurrentItem` больше не abstract, по умолчанию `0`. API: `ModuleControllerArrowsVertical.onArrowUp`, `ModuleControllerArrowsVertical.onArrowBottom`, `ModuleControllerArrowsVertical.getMaxCurrentItem`.
62
- - `module.controller.arrows.grid` — кнопки зовут переопределяемые `onArrowUp` / `onArrowRight` / `onArrowBottom` / `onArrowLeft`. Хук может вернуть `Promise`. API: `ModuleControllerArrowsGrid.onArrowUp`, `ModuleControllerArrowsGrid.onArrowRight`, `ModuleControllerArrowsGrid.onArrowBottom`, `ModuleControllerArrowsGrid.onArrowLeft`.
63
- - `views.screens/gallery.full` — горизонтальные стрелки в `gallery.full.controller.arrows`; `onArrowLeft` / `onArrowRight` эмитят `EVENTS.GALLERY_FULL_VIEW.PREV` / `EVENTS.GALLERY_FULL_VIEW.NEXT`. `gallery.full.variation` наследует `@vnejs/module.controller.pages`: `PREV` / `NEXT` / `PAGE_SET`, `applyPage` → `LOAD`. Индекс вариации в стейте — `pageIndex` / `pagesCount` (вместо `variationIndex` / `variantsCount`). `LOAD` payload `{ pageIndex }`; для открытой вариации эмитит `LOAD_SRC`; src грузит `gallery.full.load.src`. Контекст айтема (`itemFullName`, `itemMediaType`, `itemLayerChildType`, `variants`) пишет контроллер в `EVENTS.GALLERY_FULL_VIEW.UPDATE_STATE`. `GALLERY.CHOOSE` → `SHOW` в `gallery.full.bridge`. Сняты `EVENTS.GALLERY_FULL_VIEW.VARIATION_PREV`, `EVENTS.GALLERY_FULL_VIEW.VARIATION_NEXT`, `EVENTS.GALLERY_FULL_VIEW.VARIATION_LOAD`. API: `EVENTS.GALLERY_FULL_VIEW.LOAD`, `EVENTS.GALLERY_FULL_VIEW.LOAD_SRC`, `EVENTS.GALLERY_FULL_VIEW.PREV`, `EVENTS.GALLERY_FULL_VIEW.NEXT`, `EVENTS.GALLERY_FULL_VIEW.PAGE_SET`, `GalleryFullLoadPayload`, `GalleryFullLoadSrcPayload`, `GalleryFullLoadSrcResult`, `GalleryFullImageSrcItem`, `GalleryFullPageSetPayload`.
64
- - `views/settings` — горизонтальные стрелки в `settings.fields.controller.arrows.horizontal`; `onArrowLeft` / `onArrowRight` эмитят `EVENTS.SETTINGS_VIEW.ARROW_LEFT` / `EVENTS.SETTINGS_VIEW.ARROW_RIGHT`, хендлеры остаются на `settings.fields.controller`. API: `EVENTS.SETTINGS_VIEW.ARROW_LEFT`, `EVENTS.SETTINGS_VIEW.ARROW_RIGHT`.
65
-
66
- ## 0.2.56
67
-
68
- - `module.components` — `ModuleController` всегда подписывается на `EVENT_SHOW` / `EVENT_HIDE` с `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW.BEFORE` / `SHOW.AFTER` / `HIDE.BEFORE` / `HIDE.AFTER` и на `EVENTS.SETTINGS.CHANGED` (`state.isShow && updateViewFast()`). Потомки переопределяют методы вместо `this.on`. API: `ModuleController.onShowBefore`, `ModuleController.onShowAfter`, `ModuleController.onHideBefore`, `ModuleController.onHideAfter`, `ModuleController.onSettingChange`.
69
- - `views.screens/settings`, `views.screens/settings.defaults` — на `HIDE.BEFORE` эмит `EVENTS.SETTINGS_VIEW.HIDE` не ждут: `onHideBefore` через `void this.emit`, чтобы прятание полей шло параллельно с остальными хендлерами фазы.
70
- - `views.screens/history` — `HISTORY_VIEW.CLICK` в `history.controller.click`; проверка uid через `EVENTS.HISTORY.KEYS`, не `state.historyKeys`.
71
- - `views.screens/eula` — `eula.controller` переопределяет `onSettingChange` (язык + сброс стрелки); отдельная подписка на `SETTINGS.CHANGED` снята.
72
- - `views/video` — `VIDEO.SET_SRC` в `video.controller.src` (`UPDATE_STATE` + `UPDATE_FAST`).
73
- - `views/fps` — снято `EVENTS.FPS.CHANGE`; `fps` пишет `UPDATE_STATE` `{ text }` и `UPDATE_FAST`. API: сняты `EVENTS.FPS.CHANGE`, `FpsChangePayload`.
74
- - `views/gamepad.debug` — снято `EVENTS.GAMEPAD_DEBUG.CHANGE`; `gamepad.debug` пишет `UPDATE_STATE` `{ text }` и `UPDATE_FAST`. API: сняты `EVENTS.GAMEPAD_DEBUG.CHANGE`, `GamepadDebugChangePayload`.
75
- - `views/cursor` — `CURSOR.MOVED` / `VIEW_SET` / `MEMORY.CLEARED` в `cursor.controller.sync`.
76
- - `controls/cursor` — `EVENTS.CURSOR.UPDATE_STATE` принимает partial стейта курсора. API: `CursorUpdatePayload`.
77
-
78
- ## 0.2.55
79
-
80
- - `observer` — `SubscriberOptions.breakFollowing`: truthy-результат обработчика не запускает следующие группы приоритетов. API: `SubscriberOptions.breakFollowing`.
81
- - `core/components`, `module.components` — фаза `SETUP` переименована в `GATE`. На `GATE` контроллер возвращает `state.isShow` (`SHOW`) или `!state.isShow` (`HIDE`) и с `breakFollowing` обрывает остальные фазы, если цикл не начался. Лог `SHOW` / `HIDE` пишется на `BEFORE`. Сняты `showCycle` и `hideCycle`. API: `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW.GATE`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.HIDE.GATE`. Сняты `ModuleController.showCycle`, `ModuleController.hideCycle`.
82
- - `module.components` — `ModuleController` больше не сохраняет и не вызывает `onClose` из payload `SHOW`. API: сняты `ModuleController.onClose`, `ViewActionPayload.onClose`.
83
- - `views/comment`, `views.screens/confirm` — таймер автоскрытия и колбэки accept/decline снимаются на `HIDE.MAIN`. Если контроллер оборвал `HIDE` на `GATE`, очистка не выполняется. В `COMMENT.SHOW` и `CONFIRM.SHOW` не передаётся `onClose`.
84
- - `module.components` — `ModuleController.EVENT_SHOW` и `ModuleController.EVENT_HIDE` обязательны, жизненный цикл SHOW/HIDE подписывается всегда. API: `ModuleController.EVENT_SHOW`, `ModuleController.EVENT_HIDE`.
85
- - `views/achievement`, `views/controls.hints`, `canvas.layers/bl`, `canvas.layers/fl`, `canvas.layers/ml`, `canvas.layers/ul` — добавлены `SHOW` / `HIDE`. API: `EVENTS.ACHIEVEMENT.SHOW`, `EVENTS.ACHIEVEMENT.HIDE`, `EVENTS.CONTROLS_HINTS.SHOW`, `EVENTS.CONTROLS_HINTS.HIDE`, `EVENTS.LAYER_BL.SHOW`, `EVENTS.LAYER_BL.HIDE`, `EVENTS.LAYER_FL.SHOW`, `EVENTS.LAYER_FL.HIDE`, `EVENTS.LAYER_ML.SHOW`, `EVENTS.LAYER_ML.HIDE`, `EVENTS.LAYER_UL.SHOW`, `EVENTS.LAYER_UL.HIDE`.
86
- - `module.controller.accept`, `module.controller.arrows.vertical`, `module.controller.arrows.horizontal`, `module.controller.arrows.grid`, `module.controller.hide.on.controls`, `module.controller.backgrounds`, `module.controller.bg`, `module.controller.preload`, `module.controller.audio`, `module.controller.tabs` — `isShow` пишется в стейт на показе и снимается на скрытии. Повторный `SHOW` и `HIDE` без показа обрывает контроллер на `GATE`. API: `state.isShow`.
87
- - `core/components` — фазы показа и скрытия view: `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW` (`GATE`, `BEFORE`, `MAIN`, `CONTROLS`, `AFTER`, `CLEANUP`) и `CONST.COMPONENTS.LIFECYCLE_PRIORITY.HIDE` (`GATE`, `BEFORE`, `CONTROLS`, `MAIN`, `AFTER`, `CLEANUP`). Сдвиг внутри фазы — `± 1`. API: `CONST.COMPONENTS.LIFECYCLE_PRIORITY`.
88
- - `module.components` — обязательное `ModuleController.EVENT_UPDATE_FORCE` подписывается на `updateViewForce`. `ModuleController.CONTROLS_EXTENSIONS` (по умолчанию `{}`) в `init` сливается в `CONTROLS`. API: `ModuleController.EVENT_UPDATE_FORCE`, `ModuleController.CONTROLS_EXTENSIONS`.
89
- - view-контракты — добавлен `UPDATE_FORCE` (`*:update_force`), payload как у `UPDATE_FAST`: `EVENTS.GALLERY.UPDATE_FORCE`, `EVENTS.SAVE_VIEW.UPDATE_FORCE`, `EVENTS.SETTINGS_SCREEN_VIEW.UPDATE_FORCE`, `EVENTS.SETTINGS_DEFAULT_VIEW.UPDATE_FORCE`, `EVENTS.SETTINGS_VIEW.UPDATE_FORCE`, `EVENTS.CHOOSE_VIEW.UPDATE_FORCE`, `EVENTS.EULA.UPDATE_FORCE`, `EVENTS.CONFIRM.UPDATE_FORCE`, `EVENTS.HISTORY_VIEW.UPDATE_FORCE`, `EVENTS.GAMEMENU.UPDATE_FORCE`, `EVENTS.CHECKERS_VIEW.UPDATE_FORCE`, `EVENTS.INTRO.UPDATE_FORCE`, `EVENTS.LOADING.UPDATE_FORCE`, `EVENTS.VIDEO.UPDATE_FORCE`, `EVENTS.COMMENT.UPDATE_FORCE`, `EVENTS.ACHIEVEMENT.UPDATE_FORCE`, `EVENTS.FPS.UPDATE_FORCE`, `EVENTS.CONTROLS_HINTS.UPDATE_FORCE`, `EVENTS.GAMEPAD_DEBUG.UPDATE_FORCE`, `EVENTS.CREDITS.UPDATE_FORCE`, `EVENTS.DISCLAIMER.UPDATE_FORCE`, `EVENTS.GALLERY_FULL_VIEW.UPDATE_FORCE`, `EVENTS.MAINMENU_SOCIALS_VIEW.UPDATE_FORCE`, `EVENTS.INTERFACE.UPDATE_FORCE`, `EVENTS.INTERFACE_CONTROLS_VIEW.UPDATE_FORCE`, `EVENTS.INTERFACE_FASTFORWARD_VIEW.UPDATE_FORCE`, `EVENTS.POINT_AND_CLICK_VIEW.UPDATE_FORCE`, `EVENTS.QTE_VIEW.UPDATE_FORCE`, `EVENTS.LAYER_BL.UPDATE_FORCE`, `EVENTS.LAYER_FL.UPDATE_FORCE`, `EVENTS.LAYER_ML.UPDATE_FORCE`, `EVENTS.LAYER_UL.UPDATE_FORCE`, `EVENTS.CURSOR.UPDATE_FORCE`. У главного меню событие уже было: `EVENTS.MAINMENU.UPDATE_FORCE`.
90
- - `module.components` — сняты хуки `ModuleController.beforeShow`, `ModuleController.afterShow`, `ModuleController.beforeHide`, `ModuleController.afterHide`. Контроллер подписывается на свои `EVENT_SHOW` / `EVENT_HIDE` по фазам. На `HIDE.CLEANUP` — `setDefaultState`, если `ModuleController.SHOULD_CLEAR_STATE_ON_CLEANUP` (по умолчанию `true`; `false` у `cursor.controller` и `interface.controller`). Обязательные `EVENT_UPDATE_STATE` и `EVENT_UPDATE_FAST`: `UPDATE_STATE` сливает partial в стейт, `UPDATE_FAST` вызывает `updateViewFast`. `EVENTS.COMPONENTS.EXTERNAL_UPDATE` в базе: `state.isShow && updateViewFast()`. API: `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW.CLEANUP`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.HIDE.CLEANUP`, `ModuleController.SHOULD_CLEAR_STATE_ON_CLEANUP`.
91
- - `module.components` — с базового `ModuleController` снята навигация по `currentItem` (`incCurrentItem`, `decCurrentItem`, `setCurrentItem`, `unsetCurrentItem`, сброс на `SHOW.GATE` и `HIDE.CLEANUP + 1`). Индекс пункта — `currentArrowVerticalItem` / `currentArrowHorizontalItem` в `@vnejs/module.controller.arrows.vertical` и `@vnejs/module.controller.arrows.horizontal`. API: сняты `ModuleController.currentItem`, `ModuleController.maxCurrentItem`, `ModuleController.incCurrentItem`, `ModuleController.decCurrentItem`, `ModuleController.setCurrentItem`, `ModuleController.unsetCurrentItem`, `ModuleControllerState.currentItem`.
92
- - view-контракты — `STATE_UPDATE` переименован в `UPDATE_STATE` (`*:state_update` → `*:update_state`): `EVENTS.GALLERY.UPDATE_STATE`, `EVENTS.MAINMENU.UPDATE_STATE`, `EVENTS.INTRO.UPDATE_STATE`, `EVENTS.LOADING.UPDATE_STATE`, `EVENTS.SAVE_VIEW.UPDATE_STATE`, `EVENTS.SETTINGS_SCREEN_VIEW.UPDATE_STATE`, `EVENTS.SETTINGS_DEFAULT_VIEW.UPDATE_STATE`, `EVENTS.SETTINGS_VIEW.UPDATE_STATE`, `EVENTS.CHOOSE_VIEW.UPDATE_STATE`, `EVENTS.EULA.UPDATE_STATE`, `EVENTS.CONFIRM.UPDATE_STATE`, `EVENTS.HISTORY_VIEW.UPDATE_STATE`, `EVENTS.GAMEMENU.UPDATE_STATE`, `EVENTS.CHECKERS_VIEW.UPDATE_STATE`. Добавлены `UPDATE_STATE` и `UPDATE_FAST`: `EVENTS.VIDEO.UPDATE_STATE`, `EVENTS.VIDEO.UPDATE_FAST`, `EVENTS.COMMENT.UPDATE_STATE`, `EVENTS.COMMENT.UPDATE_FAST`, `EVENTS.ACHIEVEMENT.UPDATE_STATE`, `EVENTS.ACHIEVEMENT.UPDATE_FAST`, `EVENTS.FPS.UPDATE_STATE`, `EVENTS.FPS.UPDATE_FAST`, `EVENTS.CONTROLS_HINTS.UPDATE_STATE`, `EVENTS.CONTROLS_HINTS.UPDATE_FAST`, `EVENTS.GAMEPAD_DEBUG.UPDATE_STATE`, `EVENTS.GAMEPAD_DEBUG.UPDATE_FAST`, `EVENTS.CREDITS.UPDATE_STATE`, `EVENTS.CREDITS.UPDATE_FAST`, `EVENTS.DISCLAIMER.UPDATE_STATE`, `EVENTS.DISCLAIMER.UPDATE_FAST`, `EVENTS.GALLERY_FULL_VIEW.UPDATE_STATE`, `EVENTS.GALLERY_FULL_VIEW.UPDATE_FAST`, `EVENTS.MAINMENU_SOCIALS_VIEW.UPDATE_STATE`, `EVENTS.MAINMENU_SOCIALS_VIEW.UPDATE_FAST`, `EVENTS.INTERFACE.UPDATE_STATE`, `EVENTS.INTERFACE.UPDATE_FAST`, `EVENTS.INTERFACE_CONTROLS_VIEW.UPDATE_STATE`, `EVENTS.INTERFACE_CONTROLS_VIEW.UPDATE_FAST`, `EVENTS.INTERFACE_FASTFORWARD_VIEW.UPDATE_STATE`, `EVENTS.INTERFACE_FASTFORWARD_VIEW.UPDATE_FAST`, `EVENTS.POINT_AND_CLICK_VIEW.UPDATE_STATE`, `EVENTS.POINT_AND_CLICK_VIEW.UPDATE_FAST`, `EVENTS.QTE_VIEW.UPDATE_STATE`, `EVENTS.QTE_VIEW.UPDATE_FAST`, `EVENTS.LAYER_BL.UPDATE_STATE`, `EVENTS.LAYER_BL.UPDATE_FAST`, `EVENTS.LAYER_FL.UPDATE_STATE`, `EVENTS.LAYER_FL.UPDATE_FAST`, `EVENTS.LAYER_ML.UPDATE_STATE`, `EVENTS.LAYER_ML.UPDATE_FAST`, `EVENTS.LAYER_UL.UPDATE_STATE`, `EVENTS.LAYER_UL.UPDATE_FAST`, `EVENTS.CURSOR.UPDATE_STATE`, `EVENTS.CURSOR.UPDATE_FAST`.
93
- - `module.controller.bg` — загрузка фона на `SHOW` с `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW.BEFORE`; флаг `isShow` на `MAIN`. Снято `EVENT_SHOW_BEFORE`.
94
- - `module.controller.accept`, `module.controller.arrows.vertical`, `module.controller.arrows.horizontal`, `module.controller.arrows.grid`, `module.controller.tabs`, `module.controller.hide.on.controls` — PUSH/POP на фазе `CONTROLS`.
95
- - `module.controller.audio`, `module.controller.backgrounds` — SHOW/HIDE на `AFTER`. `module.controller.preload` — SHOW на `BEFORE`.
96
- - `views.screens/gallery`, `views.screens/mainmenu`, `views.screens/intro`, `views.screens/loading`, `views.screens/save`, `views.screens/settings`, `views.screens/settings.defaults`, `views.scenario/choose`, `views.scenario/qte`, `views.scenario/point_and_click` — снято событие `SHOW_BEFORE`. Подготовка экрана — подписка на `SHOW` с `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW.BEFORE`. API: сняты `EVENTS.GALLERY.SHOW_BEFORE`, `EVENTS.MAINMENU.SHOW_BEFORE`, `EVENTS.INTRO.SHOW_BEFORE`, `EVENTS.LOADING.SHOW_BEFORE`, `EVENTS.SAVE_VIEW.SHOW_BEFORE`, `EVENTS.SETTINGS_SCREEN_VIEW.SHOW_BEFORE`, `EVENTS.SETTINGS_DEFAULT_VIEW.SHOW_BEFORE`, `EVENTS.CHOOSE_VIEW.SHOW_BEFORE`, `EVENTS.QTE_VIEW.SHOW_BEFORE`, `EVENTS.POINT_AND_CLICK_VIEW.SHOW_BEFORE`.
97
-
98
- ## 0.2.53
99
-
100
- - `module.controller.hide.on.controls`, `module.controller.accept`, `module.controller.arrows.*` — PUSH/POP controls только при смене локального `isShow` (как у `ModuleController`), без лишнего POP на HIDE до SHOW.
101
- - `controls/controls` — флаг блокировки EMIT в `shared.isControlsLocked` (инициализация в `controls.postinject`); при `CONTROLS.EMIT` в консоль пишется список `keys`.
102
- - `controls/cursor` — DOM-клик с тача эмитит `CURSOR.HIDE` (сам клик с `pointerType === "touch"`, клик после `pointerdown` с тача, либо `sourceCapabilities.firesTouchEvents`).
103
- - `uis.react` — `vne-cursor-target` ставится только на узлы с `vne-cursor-target-possible` (тот же момент, что непустой `vne-cursor-type`). API: `vne-cursor-target-possible`.
104
- - `views.screens/checkers` — клетки доски помечаются `vne-cursor-target-possible`.
105
- - `views.scenario/qte` — дефолтный UI: горизонтальная линия и маркер слева направо вместо круга; rail QTE с `vne-cursor-target-possible`. Авто-fail только в конце `duration`, не при выходе маркера из зоны. Фазы `intro` / `outro` сняты; показ и скрытие только через `Screen` (`TRANSITION`). API сценария `start` / `size` / `duration` без изменений.
106
- - `module` — `setStateFromGlobalState` → `setClonedState`: `setState(structuredClone(getStateSlice(payload)))`. `getStateSlice`: нет слайса в payload → `getDefaultState()` (пустые модули вырезаются из сейва). API: `setClonedState`, `getStateSlice`.
107
- - `module.core` — снят `onSetStateClone`; вместо него `setClonedState`. Снят `emitClone`; вместо него `structuredClone`. Снят `emitInteractPushPop`; вместо него `emit(EVENTS.INTERACT.PUSH_POP, …)`. API: снято `ModuleCore.onSetStateClone`, `ModuleCore.emitClone`, `ModuleCore.emitInteractPushPop`.
108
- - `core/logs` — доп. поля `LogsValue` — `LogsCloneable` (строки, числа, boolean, bigint, null, массивы, plain-object), не `unknown`. API: `LogsCloneable`, `LogsValue`.
109
- - `core/vendors` — снято событие `CLONE` и модуль `vendors` (lodash `cloneDeep`). API: снято `EVENTS.VENDORS.CLONE`.
110
-
111
- ## 0.2.52
112
-
113
- - `core/logs` — `LogsEmitPayload` = `LogsValue` + опциональный `level` (без обёртки `value`); `module` в payload нет (имя эмиттера из `EmitParams`). API: `LogsValue`, `LogsEmitPayload`, `LogsPushPayload.log`.
114
- - `module.core` — снят `emitLog`; логи через `emit(EVENTS.LOGS.EMIT, { action, … })`. API: снято `ModuleCore.emitLog`.
115
- - Плагины с логами — `action` только из `CONST.*.LOGS_ACTIONS` (legacy `type` снят у stack/components/save/random); расширены/добавлены `LOGS_ACTIONS` у scenario, components, system, skills, storage, intro, loading, meet, ratio, random, disclaimer.
116
-
117
- ## 0.2.51
118
-
119
- - `observer` / `module` — `Observer.emit(event, payload, params)` вместо rest-args; `Module.emit(event, payload?)` сам собирает `params = { module: this.name }`. API: `EmitParams`, `EmitPayload`.
120
- - `core/scenario` — `NEXT` payload `void`; имя вызывающего модуля в `EmitParams` (через `Module.emit`). API: `ScenarioNextPayload` → `void`.
121
- - `module.core` — снят `emitNext`; вместо него `emit(EVENTS.SCENARIO.NEXT)`. API: снято `ModuleCore.emitNext`.
122
- - `text/text` — на `EMIT_NEXT` сценарий двигает `text.emit.next` через `onTextEmitNext` → `EVENTS.SCENARIO.NEXT`.
123
-
124
- ## 0.2.50
125
-
126
- - `observer` — `SubscriberOptions.priority` (default `0`); группы хендлеров собираются в `subscribe`, `emit` обходит их по возрастанию priority (внутри группы — параллельно); ответы со всех групп. API: `SubscriberOptions.priority`, `SubscriberGroup`.
127
- - `module.handlers` — пакет `@vnejs/module.handlers` / `ModuleHandlers` снят; вместо `*_REG` — `on(event, handler, { priority })`.
128
- - `text/text` — сняты `EMIT_BEFORE_REG` / `EMIT_NEXT_REG` и модуль `text.emit.before`; подписки на `EMIT_BEFORE` / `EMIT_NEXT` с `priority`. API: сняты `EVENTS.TEXT.EMIT_BEFORE_REG`, `EVENTS.TEXT.EMIT_NEXT_REG`.
129
- - `scenario/choose` — сняты `OPTION_BEFORE_REG` и модуль `choose.option.before`; подписка на `OPTION_BEFORE` с `priority`. API: снято `EVENTS.CHOOSE.OPTION_BEFORE_REG`.
130
-
131
- ## 0.2.49
132
-
133
- - `cli/monorepo` — при падении `run-changed` / `publish` в ошибке видны пакет, путь и exit code (и `!!!` в stderr у `publish`), а не только `N package script(s) failed`.
134
-
135
- ## 0.2.47
136
-
137
- - `views.screens/save` — `SLOT_CREATE` result: `SaveViewSlotCreateResult` (в contracts); `views.screens/confirm` — `onAccept` / `onDecline`: `() => unknown`.
138
- - `views/*`, `views.scenario/*`, `views.screens/*` plugins — локальные `*PluginState` перенесены из `utils` в `types.ts` плагина.
139
- - `canvas/*` contracts (`bg`, `bg.speak`, `fill`, `layer`, `sprite`, `sprite.speak`, `text`, `video`) — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload/result-типы в contracts (промоут из plugins / `module.layer`). API: payload/result types на событиях `LAYER_BG`, `LAYER_BG_SPEAK`, `LAYER_FILL`, `LAYER`, `LAYER_SPRITE`, `LAYER_SPRITE_SPEAK`, `LAYER_TEXT`, `LAYER_VIDEO`; `LayerChildRmPayload.duration`, `SpriteSrcGetPayload.mediaType`, `SpritePreloadPayload.priority` (`number | string`).
140
- - `canvas.layers/*` (`bl`, `fl`, `ml`, `ul`) — `VneEventPayloadMap` + `VneEventResultMap` на `UPDATE`. API: payload/result types на событиях `LAYER_BL`, `LAYER_FL`, `LAYER_ML`, `LAYER_UL`.
141
- - `canvas.props/*` (`animation`, `clip`, `filter`, `mask`, `scale`) — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload-типы в contracts. API: payload/result types на событиях `LAYER_ANIMATION`, `LAYER_CLIP`, `LAYER_FILTER`, `LAYER_MASK`, `LAYER_SCALE`.
142
- - `views/*`, `views.scenario/*`, `views.screens/*` contracts — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload/result-типы в contracts (промоут из plugins; локальные `*PluginState` — в `types.ts` плагина). API: payload/result types на событиях views / views.scenario / views.screens. Cursor без `SUBSCRIBE_EVENTS` — без maps.
143
- - `audio/audio`, `controls/controls`, `controls/cursor`, `controls/gamepad`, `save/save`, `save/auto`, `save/continue`, `save/quick`, `scales/scales`, `common/grid`, `common/turn`, `platform/electron`, `platform/metric`, `entities/wallet` — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload/result-типы в contracts (промоут из plugins где нужно). API: payload/result types на событиях `AUDIO`, `CONTROLS`, `CURSOR`, `GAMEPAD`, `SAVE`, `SAVE_AUTO`, `SAVE_CONTINUE`, `SAVE_QUICK`, `SCALES`, `GRID`, `TURNS`, `ELECTRON`, `METRIC`, `WALLET`.
144
- - `ai/ai`, `ai/checkers`, `game/checkers`, `rpg/damage`, `rpg/hit`, `rpg/skills` — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload/result-типы в contracts (`payloads.ts`). API: payload/result types на событиях `AI`, `CHECKERS_AI`, `CHECKERS`, `DAMAGE`, `HIT`, `SKILLS` (в т.ч. `SkillsCheckPayload`, `CheckersStateUpdatePayload`).
145
- - `scenario/choose`, `scenario/point_and_click` — `ChooseOptionLine` / `PointAndClickOptionLine` = `ScenarioLineObj` (`@vnejs/contracts.core.scenario`); сняты casts на `SCENARIO.LINES_GET`.
146
- - `vars/flags` — `GET` / `EXEC_GET` result: `boolean | undefined` (вместо `boolean`); handler `GET` нормализует `VARS.GET`.
147
- - `vars/counters` — `EXEC_CHECK` result: `boolean | undefined`; `GET` нормализует `VARS.GET` → `number | undefined`.
148
- - `vars/vars`, `vars/flags`, `vars/counters`, `time/time`, `time/date`, `settings/potato` — `VneEventPayloadMap` + `VneEventResultMap` на `SUBSCRIBE_EVENTS`; payload/result-типы в contracts (flags/counters промоут из plugins). API: payload/result types на событиях `VARS`, `VARS_FLAGS`, `VARS_COUNTERS`, `TIME`, `DATE`, `POTATO`.
149
- - `text/*` contracts (`text`, `locs`, `inject`, `wall`, `smooth`, `meet`) — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload/result-типы в contracts (промоут из plugins). API: payload/result types на событиях `TEXT`, `LOCS`, `TEXT_INJECT`, `TEXT_WALL`, `TEXT_SMOOTH`, `TEXT_MEET`.
150
- - `module.handlers` — `EmitHandler` return: `void | Promise<unknown>` (вместо `Promise<void>`), чтобы хендлеры могли `return this.emit(...)`. API: `EmitHandler`.
151
- - `scenario/*` contracts (кроме `random`) — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload/result-типы в contracts. API: payload/result types на событиях `CHOOSE`, `POINT_AND_CLICK`, `QTE`, `PAUSE`, `AUTOREAD`, `HISTORY`, `FASTFORWARD`.
152
- - plugin `utils` — removed contract type re-exports (`export type { … } from "@vnejs/contracts…"`); import payload/handler types from the matching `@vnejs/contracts.*` package (aliases like `LogQueueItem` / `ExecDelayPayload` / `FileLoadPayload` / `MigrateHandler` → contract names `LogsEmitPayload` / `ScenarioExecDelayPayload` / `SystemFileLoadPayload` / `StateMigrateHandler`).
153
- - `shared` / `observer` / `module` — typed `emit` / `on` via `VneEventPayloadMap` (contracts augment event string → payload); API: `VneEventPayloadMap`, `EmitArgs`, `HandlerArgs`.
154
- - `shared` / `observer` / `module` — typed `emit*` return via `VneEventResultMap` (contracts augment event string → handler result); API: `VneEventResultMap`, `EmitResult`, `EmitResults`.
155
- - `shared` — `EmitArgs`: payload arg optional when payload type is empty-object-compatible (`{} extends Payload`); `HandlerArgs` остаётся `unknown[]` (handlers не сужаются через map).
156
- - `core/*` contracts (кроме `platforms`) — `VneEventPayloadMap` + `VneEventResultMap` на все `SUBSCRIBE_EVENTS`; payload/result-типы в contracts (промоут из plugins). API: payload/result types на событиях `SYSTEM`, `MEMORY`, `STACK`, `SCENARIO`, `VENDORS`, `STORAGE`, `COMPONENTS`, `MEDIA`, `INTERACT`, `LOGS`, `SETTINGS`, `STATE`.
157
- - `core/state` — migrate/load state: `ModuleGlobalState` (вместо отдельного `StateMigrateState`).
158
- - `core/system` — `ModuleGlobalState["system.version"]` (`ModuleGlobalStateSystemVersion`: `major`, `minor`).
159
- - `module` — `getStateSlice` всегда возвращает `TState` (`payload[name] as TState`); API: `getStateSlice(payload): TState`.
160
-
161
- ## 0.2.46
162
-
163
- - `uis.react` Cursor — `vne-cursor-target` ставится/снимается только у элементов, у которых набор под курсором реально изменился.
164
-
165
- ## 0.2.43
166
-
167
- - `core/stack` — `STACK.EMIT` (`$ stack jump` / `call`) ждёт завершения `MEMORY.CLEAR` перед возвратом, чтобы первая строка нового лейбла не гонялась с `CLEARED`.
168
- - `canvas/bg` — `$ <layer>.bg change … <duration>`: `transition` → `waitRerender` → смена `src` (как `sprite.move`); bg-`Image` с `isSwitchDisabled` (overlays не slideshow).
169
- - `uis.react` Image — `transition` как у Cursor (`background-image` + `opacity`); switcher не крутит кадры без `duration` и при `isAllSrcRendered`; `isAllSrcRendered` пишет слои в `--vne-image-src`, не в inline `backgroundImage`.
170
- - `module.layer` — `updateChildren` ждёт `updateStateAndViewFast` до `waitTimeout`.
171
- - `save/quick` — слот быстрого сохранения (`SAVE_QUICK`): `MAKE` / `LOAD` / `PRELOAD`; `CONST.SAVE_QUICK.SAVE_GROUP` (`"quick"`); `shared.hasQuickSave`.
172
- - `views.screens/gamemenu` — пункты через `GameMenuItemFactory[]`; `EVENTS.GAMEMENU.ITEMS`; `isDisabled` / `isHided` (вместо `disabled` / `hided`). API: `GameMenuItemFactory`, `EVENTS.GAMEMENU.ITEMS`, `GameMenuItem.isDisabled` / `isHided`.
173
- - `views.screens/settings.defaults` — hover у кнопки Accept: `PARAMS.SETTINGS_DEFAULT_VIEW.VIEW_PROPS.accept.isHoverable` (`true`).
174
- - `views.screens/settings` — на `TAB_SET` сначала `UPDATE_FAST` (chrome), потом `SETTINGS_VIEW.TAB_SET` (контент).
175
-
176
- ## 0.2.42
177
-
178
- - `cli/tools` resize image — флаг `-d` / `--desktop` (webp quality 90); `--web` → 80; без флагов → 100. API: `--desktop`.
179
-
180
- ## 0.2.40
181
-
182
- - `canvas/layer` — качество `90p` (`CONST.LAYER.QUALITIES.nnHD`, 160×90); `360p` (`nHD`) уже было. API: `QUALITIES.nnHD`, `SCREEN_SIZES["90p"]`.
183
- - `games/coraline` — в селекторе качества экрана (WEB): `90p` / `360p` / `720p` / `1080p` / `1440p` / `2160p` (6 шт., `optionsWidthModifier: 3`).
184
- - `cli/tools` resize image/video — `90p` / `1440p` при target `all` (и `90` / `1440`); `360p` при `all` / `mobile` / `360`; плюс прежние 720/1080/2160.
185
- - `uis.react` Cursor — дефолтный `size` 180 (было 120); дефолтный `transition` 300 (было 500).
186
- - `scenario/point_and_click` — `% point-and-click.option {icon} {iconHover} x y` (hover-иконка обязательна); опционально args `imgWidth` / `imgHeight` (px canvas). API: `PointAndClickOption.iconHover`, `imgWidth`, `imgHeight`.
187
- - `views.scenario/point_and_click` — загрузка `iconHoverSrc`; hover swap на hotspot; размер через `imgWidth` / `imgHeight`; `PARAMS.POINT_AND_CLICK_VIEW.TRANSITION` (300) → `Image.transition` для анимации hover.
188
- - `uis.react` Image — prop `srcHover` (CSS swap на `[vne-cursor-target]`, как у Icon).
189
-
190
- ## 0.2.39
191
-
192
- - `game/checkers` — пресеты `FLIPPED` (белые сверху / чёрные снизу, все дамки) и `RANDOM` (12+12 на случайных тёмных клетках; на каждый `SHOW` новый расклад). API: `PARAMS.CHECKERS.PRESETS.FLIPPED` / `RANDOM`, `createFlippedPreset`, `createRandomPreset`.
193
- - `games/checkers` — `% choose` «Партия»: 6 вариантов (COMMON / FLIPPED / RANDOM × первые ходят белые / чёрные) → `$ checkers show` с args.
194
- - `game/checkers` — `$ checkers show` берёт `initialOwner` / `initialPreset` из indent-args (`initialOwner: black`, `initialPreset: COMMON`), не из позиционных токенов.
195
- - `game/checkers` — `PARAMS.CHECKERS.PRESETS` (`COMMON` = стандартный старт); `SHOW.initialPreset` → cells из пресета (нет / неизвестный → `COMMON`). API: `PARAMS.CHECKERS.PRESETS`, `CheckersShowPayload.initialPreset`, `createCommonPreset`.
196
- - `game/checkers` — `EVENTS.CHECKERS.SHOW` payload `CheckersShowPayload` `{ initialOwner?, initialPreset? }`; без / невалидный `initialOwner` → белые. API: `CheckersShowPayload`.
197
- - `game/checkers` — `EVENTS.CHECKERS.SET` / `UNSET` (`vne:checkers:set` / `unset`): `{ cells, owner }` → `GRID.SET` + `TURNS.SET` (id / rows / columns из `GRID_ID` / `TURN_ID` / `PARAMS`); `UNSET` → `GRID.UNSET` + `TURNS.UNSET`. Модуль `checkers.set`. Call-sites: `SHOW` / `MOVE_PLAY` → `SET`, `HIDE` → `UNSET`.
198
- - `common/grid` — плагин квадратной сетки `@vnejs/plugins.common.grid` (`PLUGIN_NAME` `GRID`). API: `EVENTS.GRID.SET` / `GET` / `UNSET` / `CHANGED` / `PUT` / `MOVE` / `REMOVE` (`vne:grid:*`); элемент — объект с `id`; state — map `id → { rows, columns, cells }` (плотная `(item \| null)[][]`). `STATE.SET` / `CLEAR` диффят через `SET` / `UNSET`.
199
- - `game/checkers` — доска через `GRID.*` вместо `BOARD_CHANGE` / `BOARD_CHANGED` / `BOARD_GET`; модуль `checkers.board` удалён. API: `CONST.CHECKERS.GRID_ID` (`"checkers"`); `SHOW` → `GRID.SET` + `TURNS.SET`; `HIDE` → `GRID.UNSET` + `TURNS.UNSET`; `MOVE_PLAY` читает `GRID.GET`, пишет `GRID.SET`.
200
- - `views.screens/checkers` / `ai/checkers` — `board` с `GRID.CHANGED` / `UNSET` (`cells`, фильтр `GRID_ID`).
201
- - `bundles/checkers` — импорт `@vnejs/plugins.common.grid`.
202
- - `common/turn` — плагин хода `@vnejs/plugins.common.turn` (`PLUGIN_NAME` `TURNS`). API: `EVENTS.TURNS.SET` / `GET` / `UNSET` / `CHANGED` (`vne:turns:*`); payload `{ id, owner }` (`UNSET` — `{ id }`); state — map `id → owner` (параллельные партии). `STATE.SET` / `CLEAR` диффят map через `SET` / `UNSET`.
203
- - `game/checkers` — `turn` / `winner` убраны из state и `BOARD_CHANGE` / `BOARD_CHANGED` / `BOARD_GET`; ход через `TURNS.*`; победа через `FINISH` `{ winner }` (`CheckersFinishPayload`). API: `CONST.CHECKERS.TURN_ID` (`"checkers"`); `CONST.CHECKERS.COLORS` / `COLOR_VALUES` (бывшие `AI_COLORS` / `AI_COLOR_VALUES`); тип `CheckersColor` (бывший `CheckersAiColor`).
204
- - `views.screens/checkers` / `ai/checkers` — `turn` с `TURNS.CHANGED` / `UNSET`; `winner` с `CHECKERS.FINISH` / сброс на `SHOW`; `BOARD_CHANGED` / `STATE_UPDATE` только `board`. View: `checkers_view.status` (status text).
205
- - `bundles/checkers` — импорт `@vnejs/plugins.common.turn`.
206
-
207
- ## 0.2.38
208
-
209
- - `ai/checkers` — ключи алгоритмов с префиксом домена: `CONST.CHECKERS_AI.AI_TYPES` → `checkers:sacrifice` / `checkers:random` / `checkers:strong` (вместо `sacrifice` / `random` / `strong`). `$ checkers.ai set <color> checkers:strong`.
210
- - `ai/checkers` — дефолтные алгоритмы `checkers:sacrifice` / `checkers:random` / `checkers:strong` регистрируются в `PARAMS.AI.ALGORITHMS` при загрузке контракта (side-effect, как `SCALE_MANA` → `PARAMS.SCALES.TYPES`). Больше не задаются в `games/checkers` scripts. API: экспорт `CheckersAiArgs`, `sacrifice` / `random` / `strong`.
211
- - `ai/checkers` — AI-оркестрация шашек вынесена из `game/checkers` в `@vnejs/plugins.ai.checkers` (`PLUGIN_NAME` `CHECKERS_AI`). API: `EVENTS.CHECKERS_AI.INTERACT` / `SET` / `UNSET` (`vne:checkers_ai:*`); `CONST.CHECKERS_AI.SOURCE` (`"checkers.ai.interact"`); `CONST.CHECKERS_AI.EXEC_ACTIONS` / `AI_TYPES`; `PARAMS.CHECKERS_AI.AI_DELAY`; `shared.checkersAi`; модули `checkers.ai` / `checkers.ai.start` / `checkers.ai.interact` / `checkers.ai.move.played`. Вместо `EVENTS.CHECKERS.AI_INTERACT` / `AI_SET` / `AI_UNSET`, `PARAMS.CHECKERS.AI_DELAY`, `CONST.CHECKERS.AI_EXEC_ACTIONS` / `AI_TYPES`, модулей `checkers.ai.show` / `checkers.move.played`. `$ checkers.ai` без изменения синтаксиса. Бандл: `@vnejs/plugins.ai.checkers`.
212
- - `game/checkers` — только правила / доска / ходы / `$ checkers`; цвета `AI_COLORS` / `AI_COLOR_VALUES` и `shared.checkersInteractDisableSources` остаются здесь.
213
- - `game/checkers` — `BOARD_CHANGE` / `BOARD_CHANGED` / `BOARD_GET` без `ai`; конфиг сторон только в `shared.checkersAi` (`AI_SET` / `AI_UNSET`).
214
- - `views.screens/checkers` — ACCEPT больше не эмитит `CHECKERS.FINISH` (только выбор клетки).
215
- - `game/checkers` — `PARAMS.CHECKERS.FINISH_DELAY` вместо `TRANSITION` для паузы на `FINISH`.
216
- - `views.screens/checkers` — `EVENTS.CHECKERS_VIEW.PLAYER_SELECT` / `CheckersPlayerSelectPayload`; модуль `checkers_view.player.select` (бывший `patchSelection`).
217
- - `game/checkers` — `MOVE_PLAY` сам эмитит `MOVE_PLAYED` `{ move, … }` или при победе `FINISH`; call-sites больше не шлют `MOVE_PLAYED` вручную. API: `CheckersMovePlayPayload` = `CheckersMovePlayedPayload` + `move`.
218
- - `views.screens/checkers` — `statusText` только во view (из `turn`/`winner` на `BOARD_CHANGED`); game модель без `statusText`.
219
- - `game/checkers` / `views.screens/checkers` — `selected` / `legalMoves` только во view (`CHECKERS_VIEW.STATE_UPDATE`); `BOARD_CHANGE` / `BOARD_CHANGED` без них.
220
- - `game/checkers` — правила / AI / `$ checkers` выделены из `views.screens/checkers` в `@vnejs/plugins.game.checkers` (`PLUGIN_NAME` `CHECKERS`). API: `EVENTS.CHECKERS.BOARD_CHANGED` / `BOARD_GET`; `PARAMS.CHECKERS.TRANSITION` (settle на `FINISH`); init доски на `SHOW` (`checkers.show`) → `START`. `PLAYER_INTERACT` убран из game.
221
- - `views.screens/checkers` — только UI: `PLUGIN_NAME` `CHECKERS_VIEW`; события `vne:checkers_view:*`; `EVENTS.CHECKERS_VIEW.PLAYER_INTERACT` / `CLICK` / grid; bridge SHOW/HIDE; зеркало `BOARD_CHANGED` → grid. `player.interact` ходит в game через `MOVES_GET` / `MOVE_PLAY` / `BOARD_CHANGE`.
222
- - `bundles/checkers` — импорт `@vnejs/plugins.game.checkers` + `@vnejs/plugins.views.screens.checkers`.
223
- - `ai/ai` — диспетчер: `emitOne(EVENTS.AI.EMIT, { type, args })` → `PARAMS.AI.ALGORITHMS[type](args, module)`. Дефолт `PARAMS.AI.ALGORITHMS` — `{}`. API: `EVENTS.AI.EMIT`, `PARAMS.AI.ALGORITHMS`, `CONST.AI.PLAYER_TYPE` (`"player"`), типы `AiAlgorithm` / `AiAlgorithmContext` / `AiEmitPayload` (`type` вместо `id`).
224
- - `views.screens/checkers` — (до сплита) `EVENTS.CHECKERS.MOVES_GET` / `MOVE_PLAY` / `MOVE_PLAYED` / `BOARD_CHANGE` / `PLAYER_INTERACT` / `AI_SET` / `AI_UNSET` / `AI_INTERACT` / `START`; `CONST.CHECKERS.AI_COLOR_VALUES` / `AI_EXEC_ACTIONS` / `EXEC_ACTIONS` (`show` / `hide`); модули `checkers.board`, `checkers.moves`, `checkers.move.play`, `checkers.move.played`, `checkers.player.interact`, `checkers.ai`, `checkers.ai.interact`, `checkers.ai.show`, `checkers.click`, `checkers.finish`, `checkers.controller.accept`. Алгоритмы в `games/checkers`. `$ checkers.ai set|unset` вместо `$ checkers ai`; `$ checkers show` без `emitNext` (сценарий ждёт `FINISH`); `$ checkers hide` → `HIDE` + `emitNext`. `FINISH` без `HIDE`. Удалён локальный `utils/ai` / `pickMove`. API: `EVENTS.CHECKERS.PLAYER_INTERACT`, `CheckersPlayerInteractPayload`; `EVENTS.CHECKERS.CLICK` вместо `CELL_CLICK` (`vne:checkers:click`) → `GRID_CLEAR` + `PLAYER_INTERACT`; `EVENTS.CHECKERS.AI_SET` / `CheckersAiSetPayload`; `EVENTS.CHECKERS.AI_UNSET` / `CheckersAiUnsetPayload` (`color`); `$ checkers.ai unset <color>` → сторона в `CONST.AI.PLAYER_TYPE`; `CONST.CHECKERS.AI_EXEC_ACTIONS` (`set` / `unset`); `CONST.AI.PLAYER_TYPE` вместо `CONST.CHECKERS.AI_TYPES.PLAYER`; `EVENTS.CHECKERS.START` (`afterShow`) → `AI_INTERACT` (`checkers.ai.show`); `EVENTS.CHECKERS.AI_INTERACT` вместо `AI_TURN`; `EVENTS.CHECKERS.MOVE_PLAYED` / `CheckersMovePlayedPayload` (`controllerType`); после хода `MOVE_PLAY` / `AI.EMIT` → `MOVE_PLAYED` → `AI_INTERACT` (`checkers.move.played`); `shared.checkersInteractDisableSources` (`SourcesSet`) вместо `checkersAiBusy` (source = `this.name` у `checkers.ai.interact`); вызов `AI.EMIT` с `{ type, args }`.
225
- - `bundles/checkers` — подключает `@vnejs/plugins.ai`.
226
-
227
- ## 0.2.36
228
-
229
- - `views.screens/checkers` — экран русских шашек: `$ checkers show`, сетка на `@vnejs/module.controller.arrows.grid`. API: `EVENTS.CHECKERS.*` (`SHOW` / `HIDE` / `ACCEPT` / `CELL_CLICK` / `FINISH` / `AI_TURN` / grid), `PARAMS.CHECKERS.ROWS` / `COLUMNS`, `CONST.CHECKERS.EXEC_ACTIONS`.
230
- - `views.screens/checkers` — AI сторон: `$ checkers ai <white|black> <player|sacrifice|random|strong>`; конфиг в `shared.checkersAi` (дефолт оба `player`), на SHOW копируется в state `ai`; AI vs AI стартует после готовности доски. `playMove` всегда ищет ход через `getAllMoves` (пустой `legalMoves: []` больше не блокирует AI). Пауза перед ходом AI: `PARAMS.CHECKERS.AI_DELAY` (1000мс). API: `CONST.CHECKERS.AI_COLORS`, `CONST.CHECKERS.AI_TYPES`, `EVENTS.CHECKERS.AI_TURN`, `PARAMS.CHECKERS.AI_DELAY`, `shared.checkersAi`, `shared.checkersAiBusy`.
231
- - `views.screens/checkers` — клетки доски: `vne-cursor-type="pointer"` вместо CSS `cursor`.
232
- - `views.screens/checkers` — доска CSS grid 8×8; размер клеток через `getVneLength(PARAMS.CHECKERS.CELL_SIZE)`, без flex-wrap (раньше клетки были в px и ряд ломался на ~6).
233
- - `views.screens/checkers` — анимации `PARAMS.CHECKERS.TRANSITION` (300мс): ход фигуры (`transform`), выбор (opacity 70%), взятие — уезд на кладбище (белые слева, чёрные справа; `PARAMS.CHECKERS.GRAVEYARD_GAP`), смена цвета клетки. Позиции — `calc(n * cellLen)`, overlay вне grid-children.
234
- - `bundles/checkers` — бандл: core + `canvas.layer` + controls/keyboard/gamepad/cursor + `text` + choose + `views.cursor` + gamepad↔cursor + `views.screens/checkers`.
235
- - `games/checkers` — тестовая игра: два `% choose` с `title` (белые/чёрные) и опциями «Игрок» / «… ИИ» → `$ checkers show`; курсор из Coraline (`icons/original-4k/cursor/default`); скрипты `resize:*` / `build:media:cp` / vercel-target как у Coraline.
236
- - `views.scenario/choose` — опциональный заголовок из `args.title` (`title: "…"` у `% choose`); API: `PARAMS.CHOOSE_VIEW.VIEW_PROPS.title` / `wrap`.
237
-
238
- ## 0.2.35
239
-
240
- - `scenario/qte` — обработка `RESULT` в модуле `qte.result` (`CLOSED` + `applyResult` / `emitNext`); `qte` только `EMIT` → `OPENED` и `shared.qteScenarioSkip`.
241
- - `scenario/qte` — флаг embedded-режима: `shared.qteScenarioSkip` вместо поля модуля; в `postinject` — `false`. `qte.logs` читает тот же shared. API: `shared.qteScenarioSkip`.
242
- - `scenario/qte` — логи в модуле `qte.logs`, не `emitLog` из `qte`. `EMIT` / `RESULT` пишут `skipScenario` (для `RESULT` — с `shared.qteScenarioSkip`). `MISSING` — из `qte.scenario` через `CONST.QTE.LOGS_ACTIONS.MISSING`. API: `CONST.QTE.LOGS_ACTIONS` (`EMIT` / `emit`, `RESULT` / `result`, `MISSING` / `missing`).
243
- - `helpers/get-block-skip-shift` — `getBlockSkipShift(lines, curLine)` сдвигает курсор за indent-поддерево (`indent > parent`). Call-sites: `scenario/choose` / `point_and_click` (`*.skip`), `scenario/qte` (fail), `vars` (не заходить внутрь). Не путать с `getOptionExecShift` (`>=`, пропуск одной option-ветки).
244
- - `helpers/get-block-options` — `getBlockOptions(lines, curLine, optionPrefix)` собирает `% ….option` на `parentIndent + 2` внутри блока → `{ index, optionLine }[]`. Call-sites: `scenario/choose` / `point_and_click` / `random` (scenario).
245
- - `module.controller.arrows.grid` — `cachedItemsCount` не считает слоты с `isStub`; после `GRID_UPDATE_ITEMS` невалидные `gridRow` / `gridColumn` (в т.ч. stub после смены `gridIndex`) сдвигаются на ближайшую валидную ячейку. API: `getGridItemsCount`, `snapSelectionToGrid`, `findNearestValidCell`.
246
- - `views/settings` — константа ключа вкладки дефолтных настроек. API: `CONST.SETTINGS_VIEW.DEFAULT_TAB` (`"DEFAULT"`).
247
- - `views.screens/settings` — показ полей на `SHOW_BEFORE` в `settings.screen.controller.fields` (`STATE_UPDATE` tabs/tab → `SETTINGS_VIEW.SHOW`); main только эмитит `SHOW_BEFORE` и `HIDE` → `SETTINGS_VIEW.HIDE`.
248
- - `views.screens/settings.defaults` — показ полей на `SHOW_BEFORE` в `settings.default.controller.fields` с `CONST.SETTINGS_VIEW.DEFAULT_TAB`.
249
- - `module.controller.bg` — база статичного фона `@vnejs/module.controller.bg`: `SHOW_BEFORE` → `STATE_UPDATE` `{ bgSrc }`; опционально `EVENT_PRELOAD` / `start` / `STATE.CLEAR`; `MEMORY.CLEARED` — флаги preload и/или refresh при `isShow`. Abstract: `EVENT_SHOW` / `HIDE` / `SHOW_BEFORE` / `STATE_UPDATE` / `UPDATE_FAST`, `BGNAME`, `QUALITY_SETTING`. API: `IS_START_PRELOAD_ENABLED`, `IS_STATE_CLEAR_PRELOAD_ENABLED`, `IS_MEMORY_CLEARED_PRELOAD_ENABLED`, `IS_MEMORY_CLEARED_UPDATE_ENABLED`, `loadBg`.
250
- - `views.screens/gallery` — фон вынесен в `gallery.controller.bg`; main `beforeShow` эмитит `SHOW_BEFORE`, затем `TAB_SET`. API: `EVENTS.GALLERY.SHOW_BEFORE`.
251
- - `views.screens/save` — фон в `save.controller.bg` (`PRELOAD` / `start` / `MEMORY.CLEARED`); main `beforeShow` → `SHOW_BEFORE` + `TAB_SET`. API: `EVENTS.SAVE_VIEW.SHOW_BEFORE`.
252
- - `views.screens/settings` — фон в `settings.screen.controller.bg`; API: `EVENTS.SETTINGS_SCREEN_VIEW.SHOW_BEFORE`, `EVENTS.SETTINGS_SCREEN_VIEW.UPDATE_FAST`.
253
- - `views.screens/settings.defaults` — фон в `settings.default.controller.bg`; API: `EVENTS.SETTINGS_DEFAULT_VIEW.SHOW_BEFORE`, `EVENTS.SETTINGS_DEFAULT_VIEW.STATE_UPDATE`, `EVENTS.SETTINGS_DEFAULT_VIEW.UPDATE_FAST`.
254
- - `views.screens/intro` — фон в `intro.controller.bg` (`start` preload); API: `EVENTS.INTRO.SHOW_BEFORE`, `EVENTS.INTRO.STATE_UPDATE`, `EVENTS.INTRO.UPDATE_FAST`.
255
- - `views.screens/loading` — фон в `loading.controller.bg` (`start` / `MEMORY.CLEARED`); API: `EVENTS.LOADING.SHOW_BEFORE`, `EVENTS.LOADING.STATE_UPDATE`, `EVENTS.LOADING.UPDATE_FAST`.
256
- - `views.screens/mainmenu` — начальный фон в `mainmenu.controller.bg` (`start` / `STATE.CLEAR`); ротация по-прежнему `mainmenu.backgrounds`. API: `EVENTS.MAINMENU.SHOW_BEFORE`.
257
- - `module.controller.tabs` — abstract `EVENT_STATE_UPDATE`; entrypoint `onTabSetEvent` (guard пустого / того же tab) → `applyTab` (`STATE_UPDATE` `{ tab }`) → abstract `onTabSet` (как `onAccept`). API: `EVENT_STATE_UPDATE`, `applyTab`, `onTabSetEvent`, `onTabSet`.
258
- - `module.controller.pages` — база пагинации `@vnejs/module.controller.pages`: `PAGE_SET` / `PAGE_NEXT` / `PAGE_PREV` → `setPage` → abstract `applyPage` + `UPDATE_FAST`. Стейт `pageIndex` / `pagesCount`. Abstract: `EVENT_PAGE_SET` / `PAGE_NEXT` / `PAGE_PREV` / `STATE_UPDATE` / `UPDATE_FAST`, `applyPage`. API: `setPage`, `onPageSet`, `onPageNext`, `onPagePrev`, `applyPage`.
259
- - `views.screens/gallery` — `gallery.controller.pages.items` на `PAGE_ITEMS_GET` (`vne:gallery:page_items_get`) собирает UI-слот (`CHECK` + media); вместо `ITEM_CREATE` / `vne:gallery:item_create`. Call-sites: grid `getGridItems`, preload. API: `EVENTS.GALLERY.PAGE_ITEMS_GET`.
260
- - `views.screens/gallery` — `gallery.controller.preload`: PRELOAD / `MEMORY.CLEARED` предзагружают контент вкладок через `PAGE_ITEMS_GET`; фон — `gallery.controller.bg`.
261
- - `views.screens/save` / `views.screens/gallery` — `isDisableGridChangeVertical = true` в `*.controller.grid`: вертикальные стрелки не эмитят `GRID_NEXT`/`PREV` (не листают страницы); горизонталь по-прежнему может.
262
- - `views.screens/save` — `save.controller.actions`: `CREATE` → `SAVE.CREATE`, `DELETE` → `SAVE.DELETE`; `group` из payload или `getSaveGroup` (autosave / `pageIndex`); затем `GRID_UPDATE_ITEMS` + `UPDATE_FAST`. Main — SHOW/HIDE/PRELOAD.
263
- - `views.screens/save` — `save.controller.pages` наследует `@vnejs/module.controller.pages`; `EVENT_PAGE_NEXT`/`PREV` = `GRID_NEXT`/`PREV`; `applyPage` → `STATE_UPDATE` `{ gridIndex, gridsCount }` + `GRID_UPDATE_ITEMS`; стейт `pageIndex` / `pagesCount`; `PAGE_SET` `{ pageIndex }`; `init` пишет `pagesCount`. Main — SHOW/HIDE/PRELOAD. API: `EVENTS.SAVE_VIEW.PAGE_SET` payload `{ pageIndex }`.
264
- - `views.screens/save` — `TAB_SET` обрабатывает `save.controller.tabs` (`pageIndex: 0`, `GRID_CLEAR`, `STATE_UPDATE` `{ gridIndex, gridsCount }`, `GRID_UPDATE_ITEMS`, опционально `UPDATE_FAST`). `beforeShow` эмитит `TAB_SET` с `isForce` / `isUpdateView: false`.
265
- - `views.screens/gallery` — `gallery.controller.pages` наследует `@vnejs/module.controller.pages`; `EVENT_PAGE_NEXT`/`PREV` = `GRID_NEXT`/`PREV`; `applyPage` → `STATE_UPDATE` `{ gridIndex, gridsCount }` + `GRID_UPDATE_ITEMS` + `MEMORY.CLEAR`; стейт `pageIndex` / `pagesCount` (вместо `currentPage` / `pages`); `PAGE_SET` `{ pageIndex }`; tabs пишет `pagesCount` при `TAB_SET`. Main — SHOW/HIDE/PRELOAD. API: `EVENTS.GALLERY.PAGE_SET` payload `{ pageIndex }`.
266
- - `views.screens/gallery` — `gallery.controller.grid` на `@vnejs/module.controller.arrows.grid`; стейт `gridRow` / `gridColumn` / `gridItems` (вместо `current*`); `TAB_SET` в tabs: `GRID_CLEAR` + `STATE_UPDATE` `{ gridIndex, gridsCount }` + `GRID_UPDATE_ITEMS` + опционально `UPDATE_FAST`. `MEMORY.CLEAR` / `UPDATE_FAST` только при `isUpdateView` (не в `beforeShow`), чтобы SHOW не попадал под `viewForceAnimationSources`. API: `EVENTS.GALLERY.UPDATE_FAST`, `EVENTS.GALLERY.GRID_NEXT`, `EVENTS.GALLERY.GRID_PREV`, `EVENTS.GALLERY.GRID_CLEAR`, `EVENTS.GALLERY.GRID_UPDATE_ITEMS`, `EVENTS.GALLERY.PAGE_ITEMS_GET`.
267
- - `views.screens/settings` — `TAB_SET` в `settings.screen.controller.tabs` (`applyTab` + `SETTINGS_VIEW.TAB_SET` + `UPDATE_FAST`); main на `STATE_UPDATE` только `updateState`. API: `EVENTS.SETTINGS_SCREEN_VIEW.STATE_UPDATE`.
268
- - `module.controller.arrows.grid` — база сеточной навигации `@vnejs/module.controller.arrows.grid`: четыре стрелки, PUSH/POP на SHOW/HIDE, `STATE_UPDATE` `{ gridRow, gridColumn }` + `UPDATE_FAST`, на краю — `GRID_NEXT` / `GRID_PREV`, сброс позиции — `GRID_CLEAR` (`gridRow` / `gridColumn` → `null` + `STATE_UPDATE`). Abstract: `EVENT_SHOW` / `HIDE` / `STATE_UPDATE` / `UPDATE_FAST` / `GRID_NEXT` / `GRID_PREV` / `GRID_CLEAR`, `CONTROLS_ZINDEX`, `getMaxRows` / `getMaxColumns`. `STATE_UPDATE` зеркалит стейт (`updateState`) и кэш. `GRID_UPDATE_ITEMS` без payload → `getGridItems` из стейта → `STATE_UPDATE` `{ gridItems }`. Флаги `isDisableGridChangeHorizontal` / `isDisableGridChangeVertical` (по умолчанию `false`).
269
- - `views.screens/save` — `save.controller.grid` наследует `@vnejs/module.controller.arrows.grid`. Внутри сетки — `STATE_UPDATE` с `{ gridRow, gridColumn }` и `UPDATE_FAST`; на краю — `GRID_NEXT` / `GRID_PREV` (`save.controller.pages` мапит на пагинацию); смена tab — `EVENTS.SAVE_VIEW.GRID_CLEAR`. Meta сетки — `STATE_UPDATE` (`gridIndex` / `gridsCount` / `tab`); `GRID_UPDATE_ITEMS` без payload. Загрузка слотов — `getGridItems` через `emitOne(EVENTS.SAVE_VIEW.SLOT_CREATE)`. Модуль `save.view.slot` на `SLOT_CREATE` (`{ key, group, index }`) → `SAVE.GET` + дата/время. API: `EVENTS.SAVE_VIEW.UPDATE_FAST`, `EVENTS.SAVE_VIEW.GRID_NEXT`, `EVENTS.SAVE_VIEW.GRID_PREV`, `EVENTS.SAVE_VIEW.GRID_CLEAR`, `EVENTS.SAVE_VIEW.GRID_UPDATE_ITEMS`, `EVENTS.SAVE_VIEW.SLOT_CREATE`.
270
- - `module.controller.tabs` / `views.screens/settings` / `views.screens/gallery` — стейт вкладки: `tab` вместо `currentTab`.
271
-
272
- ## 0.2.34
273
-
274
- - `scenario/pause` — логи в модуле `pause.logs`, не `emitLog` из шага. `$ pause` обрабатывает модуль `pause.scenario`: `LINE_EXEC_REG`, затем `EVENTS.PAUSE.EMIT` и `emitNext`. Блокировки — модуль `pause.emit`: в `postinject` создаёт `shared.pauseDisableSources`; `EVENTS.PAUSE.EMIT` (`vne:pause:emit`) эмитит `START`, если набор пуст. `START` больше не смотрит блокировки и не вызывает `emitNext`. `STATE.CLEAR` больше не вызывает `END`. API: `EVENTS.PAUSE.EMIT`, `CONST.PAUSE.LOGS_ACTIONS` (`EMIT` / `emit`, `START` / `start`, `END` / `end`).
275
- - `scenario/autoread` — постановка и сброс таймера через события, не методы модуля. `TIMEOUT_CREATE` ставит таймер на `SETTINGS.AUTOREAD.DELAY` и по нему эмитит `AUTOREAD.EMIT`. `TIMEOUT_CLEAR` снимает таймер. PUSH / POP / `STATE.SET` / `STATE.CLEAR` идут через эти события. Шаг авточтения — модуль `autoread.emit` на `EVENTS.AUTOREAD.EMIT` (`vne:autoread:emit`). Таймер — модуль `autoread.timeout` (`TIMEOUT_CREATE` / `TIMEOUT_CLEAR`; `STATE.CLEAR` → `TIMEOUT_CLEAR`, `STATE.SET` → `TIMEOUT_CLEAR` затем `TIMEOUT_CREATE`). Блокировки — модуль `autoread.sources`: `postinject` создаёт `shared.autoreadDisableSources`, `PUSH` / `POP` меняют набор, `STATE.SET` его очищает. Вместо `EVENTS.AUTOREAD.TRY` (`vne:autoread:try`). Логи — модуль `autoread.logs`, не `emitLog` из шага. `CONST.AUTOREAD.LOGS_ACTIONS`: `EMIT` (`emit`), `PUSH` (`push`), `POP` (`pop`), `TIMEOUT_CREATE` (`timeout_create`), `TIMEOUT_CLEAR` (`timeout_clear`). `PUSH` / `POP` пишут `source`. API: `EVENTS.AUTOREAD.EMIT`, `EVENTS.AUTOREAD.TIMEOUT_CREATE`, `EVENTS.AUTOREAD.TIMEOUT_CLEAR`, `CONST.AUTOREAD.LOGS_ACTIONS`.
276
- - `scenario/history` — журнал снапшотов вынесен из экрана (`@vnejs/plugins.scenario.history`). Шаг назад — `EVENTS.HISTORY.BACK`; запись — `EVENTS.HISTORY.ADD` / `GET` / `SET` / `LOAD` / `KEYS` / `KEYS_UPDATE`. Снапшот в память — `EVENTS.HISTORY.SET` (`{ uid, value }`), не прямой `MEMORY.SET`. Прогрев ключей — `EVENTS.HISTORY.KEYS_UPDATE`. Флаг загрузки — `shared.isHistoryLoadInProcess`, не поле модуля. Логи — `CONST.HISTORY.LOGS_ACTIONS` (`ADD`, `LOAD_START`, `LOAD_DELETED`, `LOAD_END`). `PARAMS.HISTORY.MAX_LENGTH`. Мост к `MEMORY` — модуль `history.memory` (`MEMORY.REG` / `GET` / `SET` / `KEYS`, ключ `module: this.name`). Загрузка снапшота — модуль `history.load` (`EVENTS.HISTORY.LOAD`, флаг `shared.isHistoryLoadInProcess`). Шаг назад — модуль `history.back` (`EVENTS.HISTORY.BACK`, последняя запись из `globalState.history`). Плагин и связки записи — в `bundles/vn.skeleton`. Вместо `HISTORY.ADD` с экрана `views.screens/history`.
277
- - `views.screens/history` — экран журнала: namespace `HISTORY_VIEW` (`@vnejs/plugins.views.screens.history`), в `bundles/vn.base`. API: `EVENTS.HISTORY_VIEW.SHOW`, `EVENTS.HISTORY_VIEW.HIDE`, `EVENTS.HISTORY_VIEW.CLICK`, `EVENTS.HISTORY_VIEW.UPDATE`, `EVENTS.HISTORY_VIEW.STATE_UPDATE`, `EVENTS.HISTORY_VIEW.UPDATE_FAST`, `EVENTS.HISTORY_VIEW.ACCEPT`, `PARAMS.HISTORY_VIEW.ZINDEX`, `PARAMS.HISTORY_VIEW.TRANSITION`, `PARAMS.HISTORY_VIEW.LOC_LABEL`, `PARAMS.HISTORY_VIEW.VIEW_PROPS`. Вместо `EVENTS.HISTORY.SHOW` и остальных view-событий `HISTORY`.
278
- - `compatibility/text/scenario.history` — `@vnejs/compatibility.text-with-scenario.history` вместо `@vnejs/compatibility.text-with-views.screens.history`. На `TEXT.EMIT_NEXT` эмитит `EVENTS.HISTORY.ADD`.
279
- - `compatibility/scenario.choose/scenario.history` — `@vnejs/compatibility.scenario.choose-with-scenario.history` вместо `@vnejs/compatibility.scenario.choose-with-views.screens.history`. На `CHOOSE.OPTION_BEFORE_REG` эмитит `EVENTS.HISTORY.ADD` с `{ locKey: "choice" }`.
280
-
281
- ## 0.2.33
282
-
283
- - `views.scenario/point_and_click` — `SETTINGS.CHANGED` обновляет view только при `state.isShow` (`point_and_click_view.controller`).
284
- - `core/memory` — `MEMORY.CLEAR` до `isReady` модуля `memory.clear` игнорируется (нет чистки и нет `CLEARED`).
285
- - `text/locs` — `SETTINGS.CHANGED` не вызывает `setTextLang`, пока `locs` не `isReady`. Применение языка — `LOCS.SET` (`init` и `SETTINGS.CHANGED` после `isReady`), не метод модуля. В `postinject` `shared.textLang = PARAMS.LOCS.DEFAULT_LANG`; ожидание кадра до языка снято. Чтение и запись уже загруженного словаря — события модуля `locs.memory`, не прямой `MEMORY` из загрузчика. `LOCS.MEMORY_SET` принимает `{ label, group, lang?, value }`, ключ считает модуль. API: `LOCS.SET`, `LOCS.MEMORY_GET`, `LOCS.MEMORY_SET`, `shared.textLang`.
286
-
287
- ## 0.2.32
288
-
289
- - `canvas/layer` — снят модуль `layer.viewport` (он задавал viewport meta размером canvas, `width=1920,height=1080`). Viewport и запрет скролла документа — в `entry/index.html` игры: `width=device-width, initial-scale=1`, `overflow: hidden` на `html`/`body`. Так в `games/coraline` и `games/vn.skeleton`. Разрешение canvas по-прежнему в `--vne-canvas-width` / `--vne-canvas-height`.
290
-
291
- ## 0.2.31
292
-
293
- - `core/logs` — `SETTINGS.INIT` `ENABLED` в `setup`; до `isReady` `EMIT` только буферизуется; в `init` flush очереди по `ENABLED` (иначе clear). API: буфер `LOGS.EMIT` до ready.
294
- - все плагины с регистрацией настроек — `SETTINGS.INIT` в `setup` (не в `init`): eula, save.auto, autoread, fastforward (+visits), voice.lang, locs, text.process.enabled, text.smooth.cycle, volume/ratio/filter/textsize/potato, cursor scroll/shift, layer.quality, layer.animation, fps, gamepad.debug, settings.defaults, settings.screen.controller, electron (`CONFIG_APPLIED`). Применение значений / REG / DOM остаётся в `init` где было.
295
- - sync `shared.*` без I/O — в `postinject`: `audioNoSmoothSources`, `layerBgSpeakSources`, `layerSpriteSpeakSources`, `textProcessSkipSources`, `isTextSmoothInProcess`, `isTextWallSetStateInProcess`, `isInteractInProcess`, `mediaNoTimeoutSources`, `autosaveDisableSources`, `pauseDisableSources`, `autoreadDisableSources`, `voiceDisableSources`, `viewForceAnimationSources`, `interfaceTextShowAllTokensOnChange`, `shouldAutostartScenario`. API: создание полей в `Module.postinject()` вместо `init`/`setup`.
296
-
297
- ## 0.2.29
298
-
299
- - `core/memory` — `GET` / `SET` / `KEYS` больше не ждут `waitForModuleReg`. Все `MEMORY.REG` в `setup`: `scenario.label` / `line` / `lines`, `media.memory` (вместе с `#media`), `locs`, `history`. Незарегистрированный namespace: `GET` → `null`, `SET` no-op, `KEYS` → `[]`. Реестр — только `shared.memory` (создаётся в `Memory.postinject`). `GET` / `SET` / `KEYS` в `memory.store`, `CLEAR` в `memory.clear`. API: `shared.memory`.
300
- - `modules_extensions/base` — в конце `inject` вызывается `postinject`, если метод есть. API: `Module.postinject()`.
301
- - `packages/core`, `modules_extensions/base` — фаза `start` после всех `init` вместо `EVENTS.SYSTEM.STARTED` (`vne:system:started`). Перешли: `scenario.autostart`, `vendors.screen`, `cursor`, `cursor.view.set`, `layer.viewport`, `ratio`, `fps`, `gamepad.debug`, `electron`, `android`, `controls.hints.controller`, `interface.fastforward.controller`, mainmenu/save/intro/loading controllers, `mainmenu.socials.controller`, `gallery.controller`, `compatibility` text.smooth и canvas.layer/save. API: `Module.start()`, `window.unstartedModules`.
302
- - `core/storage`, `core/settings`, `core/media`, `core/components` — провайдеры готовятся в `setup`: localforage / `shared.settings` / semaphore / `#components`. `STORAGE.INIT` и `SETTINGS.SET`/`INIT` ждут `ensureReady`. Снят `waitIsReady` / гарды `isReady` у `memory`, `media`, `mainmenu`, `logs`, `eula`, `scenario.label`, `settings.screen.controller`, `interface.fastforward.controller`. `logs` / `eula` регистрируют `SETTINGS.INIT` в `setup`. Остались `ModuleView` (`RENDER`) и `electron` (`STORAGE.CHANGED`).
303
- - `packages/core`, `modules_extensions/base` — у всех модулей фаза `setup` до `init`: `inject → subscribe → setup → init → start`. Все `setup` завершаются раньше любого `init`. API: `Module.setup()`, `window.unsetupModules`.
304
- - `core/stack` — перед `EMIT` / `CALL` / `JUMP` и preload jump/call на `LINE_LOAD` цепочка `PROHIBIT_REPLACE` (`isProhibited`); при запрете — `PROHIBITED` (`label`, `args`, `event` — `JUMP` / `CALL` / `EMIT` для повтора), без `LABEL_GET` и без `emitNext` на `$ stack jump/call`. `EMIT` / `JUMP` / `CALL` возвращают `false` при запрете, `true` после успешного `EMIT`. Хендлеры через `PROHIBIT_REPLACE_REG` (`return isProhibited || ownCheck`). Модуль `stack.replace`. API: `EVENTS.STACK.PROHIBIT_REPLACE`, `EVENTS.STACK.PROHIBIT_REPLACE_REG`, `EVENTS.STACK.PROHIBITED`, `CONST.STACK.LOGS_ACTIONS.PROHIBITED`, `StackProhibitReplacePayload`, `StackProhibitedPayload`.
305
- - `vars/counters` — CHANGE / COMPARE в `vars.counters.handlers`; EXEC_INFO / EXEC_CHECK / EXEC_GET в `vars.counters.exec`; регистрация `LINE_EXEC` в `vars.counters.scenario` (бывший `vars.counters.exec`). События и payload без изменений.
306
- - `cli/monorepo` — `run-changed` гоняет скрипты слоями графа зависимостей: внутри слоя параллельно (`--concurrency`), следующий слой ждёт предыдущий. `publish:changed:*` больше не собирает зависимый пакет, пока зависимость чистит `dist`. API: слои в dry-run / confirm; `--concurrency`, `--parallel-ms`, `--first-serial` без изменений.
307
-
308
- ## 0.2.26
309
-
310
- - `compatibility/views.scenario.interface/text` — TEXT → INTERFACE: `CHANGED` / `SPEAKER_CHANGED` / `EMIT_BEFORE` → `TEXT_CHANGED` / `SPEAKER_CHANGED` / `SHOW`; init `shared.interfaceTextShowAllTokensOnChange`. API: `@vnejs/compatibility.views.scenario.interface-with-text`.
311
- - `compatibility/views.scenario.interface/text.smooth` — `TEXT_SMOOTH.CHANGED` → `INTERFACE.TEXT_CHANGED` (`tokens` из `globalState.text`, `tokensVisible`, `uid`).
312
- - `views.scenario/interface` — прямые подписки на `TEXT.CHANGED` / `TEXT.SPEAKER_CHANGED` и `TEXT.EMIT_BEFORE_REG` сняты; связка через compatibility выше. Снято `EVENTS.INTERFACE.VISIBLE_TOKENS_CHANGED` / `InterfaceVisibleTokensChangedPayload` — вместо него `EVENTS.INTERFACE.TEXT_CHANGED`. `$ interface` show/hide/view в модуле `interface.scenario` через `CONST.INTERFACE.EXEC_ACTIONS`. SHOW / HIDE / VISIBLE / TEXT_HIDE / VIEW в `interface.actions` через `globalState.interface`. API: `CONST.INTERFACE.EXEC_ACTIONS`.
313
- - `views.screens/history` — `STATE.SET` → `HIDE` с `{ isForce: true }` в `history.hide.state` на `@vnejs/module.controller.hide.on.state` (`IS_STATE_CLEAR_ENABLED = false`).
314
- - `views.screens/settings` — `STATE.SET` / `STATE.CLEAR` → `HIDE` с `{ isForce: true }` в `settings.screen.hide.state` на `@vnejs/module.controller.hide.on.state`.
315
- - `views.screens/save` — `STATE.SET` / `STATE.CLEAR` → `HIDE` с `{ isForce: true }` в `save.hide.state`. `ACCEPT` / `INTERACT` в `save.controller.accept` на `@vnejs/module.controller.accept` → `SAVE_VIEW.ACCEPT` → `CREATE` / `LOAD`. API: `EVENTS.SAVE_VIEW.ACCEPT`, `EVENTS.SAVE_VIEW.STATE_UPDATE`.
316
- - `views.screens/gallery` — `ACCEPT` / `INTERACT` в `gallery.controller.accept` на `@vnejs/module.controller.accept` → `GALLERY.ACCEPT` → `CHOOSE` для открытого слота. API: `EVENTS.GALLERY.ACCEPT`, `EVENTS.GALLERY.STATE_UPDATE`.
317
- - `views.scenario/qte` — `ACCEPT` / `INTERACT` в `qte_view.controller.accept` на `@vnejs/module.controller.accept` → `QTE_VIEW.ACTION`.
318
- - `views.scenario/interface` — `ACCEPT` / `INTERACT` в `interface.controller.accept` на `@vnejs/module.controller.accept` → `INTERFACE.INTERACT`: видимый слой → `INTERACT.EMIT`, скрытый → `INTERFACE.VISIBLE`.
319
- - `views.screens/credits` — `ACCEPT` / `INTERACT` в `credits.controller.accept` → `CREDITS.ACCEPT` → `HIDE`. API: `EVENTS.CREDITS.ACCEPT`.
320
-
321
- ## 0.2.25
322
-
323
- - `module.components` — `updateEvent` → `EVENT_UPDATE_VIEW`; у `ModuleView`: `locLabel` → `LOC_LABEL`, `animationTime` → `TRANSITION`, `updateHandler` по умолчанию `onUpdateStoreComponent`; у `ModuleController`: `bgName` → `BGNAME`, `controls` / `controlsIndex` / `controlsCheckNext` → `CONTROLS` / `CONTROLS_INDEX` / `CONTROLS_CHECK_NEXT` (плюс `CONTROLS_UNVISIBLE` у interface). То же поле `CONTROLS` у accept / hide.on.controls / arrows / tabs.
324
- - `module.controller.audio` — `SHOW_EVENT` / `HIDE_EVENT` / `LOAD_EVENT` → `EVENT_SHOW` / `EVENT_HIDE` / `EVENT_LOAD`.
325
- - Имена модулей приведены к slug `PLUGIN_NAME`: `gamemenu.*`, `point_and_click.*` (не дефис), `metric`, `locs`, `scale_health` / `scale_mana`, `settings.screen.*`, `settings.default.*`, `choose.option.before`, `text.emit.before`, `cursor.view.set`, `layer.video.src.get`. Сценарные команды (`% point-and-click`, `$ settings.defaults`) не менялись; `$ settings.defaults` регистрируется через `execName`.
326
- - Классы модулей = CamelCase от `name` (сегменты `.` `_` `-`): `GamemenuControllerAccept`, `CursorViewSet`, `Metric`, `Locs`, `SettingsScreenView`; compatibility — `CompatibilityTextWithAudioVoice`. Не `GameMenu*` / `YaMetrika` / `TextLocs`. Если имя совпадает с глобальным конструктором — суффикс `Module`: `DateModule`, `TextModule`, `CommentModule`, `HistoryModule`, `StorageModule` (не `Date` / `Text` / `Comment` / `History` / `Storage`).
327
-
328
- ## 0.2.23
329
-
330
- - `cli/desktop`, `cli/tools` — Fastify `~5.12.3` (security 5.12.2+). API не меняется.
331
- - `cli/monorepo` — `run-changed` может гонять скрипты параллельно через `p-limit`; после окна concurrency падает до 1, первая команда опционально строго serial. `publish:changed:*` и `bump` phase 3: `--concurrency 8`, `--parallel-ms 270000`, `--first-serial` (окно npm-ключа ~5 мин). API: `--concurrency`, `--parallel-ms`, `--first-serial`.
332
-
333
- ## 0.2.22
334
-
335
- - `scenario/fastforward` — цикл автоклика в модуле `fastforward.emit`; провал `CHECK` эмитит `STOP`. `isFastforwardOn` сбрасывается через `setValue(false)` в `init`, не на `SYSTEM.STARTED`. Визиты в `shared.fastforwardStorage`; диск в `fastforward.storage`. API: `shared.fastforwardStorage`, `EVENTS.FASTFORWARD.VISIT_ADD`, модули `fastforward.emit`, `fastforward.scenario`, `fastforward.storage`.
336
- - `core/vendors` — события `UID`, `HASH`, `DATE`, `DEBOUNCE` сняты; остались `CLONE`, `SCREEN`. Вместо них: `crypto.randomUUID()`, `hashSha256`, `formatTimestamp`, `debounce`.
337
- - `helpers/hash-sha256` — SHA-256 объекта: `hashSha256(value, maxLength?)`; ключи канонизируются. `maxLength` пока не передают.
338
- - `helpers/format-timestamp` — `formatTimestamp({ ts, format })`; токены `YYYY`, `MM`, `DD`, `HH`, `mm`, `ss`.
339
- - `helpers/debounce` — `debounce({ fn, wait, maxWait, leading, trailing })`.
340
- - `core/logs`, `text/text`, `canvas/bg`, `canvas/video`, `views.screens/history` — uid через `crypto.randomUUID()`, не `VENDORS.UID`.
341
- - `core/scenario`, `core/state`, `scenario/fastforward` — хеш строки / visits через `hashSha256`, не `VENDORS.HASH`.
342
- - `views.screens/save` — дата и время слота через `formatTimestamp`, не `VENDORS.DATE`.
343
- - `platform/electron` — сохранение state через `debounce`, не `VENDORS.DEBOUNCE`.
344
-
345
- ## 0.2.21
346
-
347
- - `core/media` — ошибка/timeout fetch не занимает слот semaphore и не кладёт битый blob в память; `GET` не ждёт вечно и возвращает `null` для отсутствующего или битого asset.
348
- - `core/scenario` — `LABEL_GET` / `LINE_GET` завершаются, если предзагрузка одной строки упала.
349
- - `cli/desktop` — закрытие последнего окна завершает Electron и на macOS (Steam не держит игру запущенной); Fastify закрывается на quit, если процесс не выходит — `app.exit(0)`. API: `runServer` возвращает `{ port, close }`, `runElectron` принимает `onBeforeQuit`.
350
-
351
- ## 0.2.20
352
-
353
- - `views.screens/confirm` — горизонтальные стрелки в модуле `confirm.controller.arrows` на `@vnejs/module.controller.arrows.horizontal`; индекс в стейте `currentArrowHorizontalItem`. `ACCEPT` / `INTERACT` читают его, не `currentItem`. `STATE.CLEAR` → `HIDE` с `{ isForce: true }` в `confirm.hide.state` на `@vnejs/module.controller.hide.on.state` (`IS_STATE_SET_ENABLED = false`). API: `EVENTS.CONFIRM.UPDATE_FAST`.
354
- - `views.screens/disclaimer` — `ACCEPT` / `INTERACT` в `disclaimer.controller.accept` на `@vnejs/module.controller.accept` → `DISCLAIMER.ACCEPT` → `HIDE`, `emitNext`.
355
- - `views.screens/credits` — `ACCEPT` / `INTERACT` → `HIDE` в `credits.controller.accept` на `@vnejs/module.controller.accept`. `BACK` / `MENU` / `GAMEMENU` → `HIDE` в `credits.hide.controls` на `@vnejs/module.controller.hide.on.controls`. `STATE.SET` / `STATE.CLEAR` → `HIDE` с `{ isForce: true }` в `credits.hide.state` на `@vnejs/module.controller.hide.on.state`.
356
- - `views/settings` — вертикальные стрелки в модуле `settings.fields.controller.arrows` на `@vnejs/module.controller.arrows.vertical`; индекс в стейте `currentArrowVerticalItem`. `TAB_SET` сбрасывает индекс. API: `EVENTS.SETTINGS_VIEW.STATE_UPDATE`, `EVENTS.SETTINGS_VIEW.UPDATE_FAST`.
357
- - `views.screens/eula` — вертикальные стрелки по тексту в `eula.controller.arrows` на `@vnejs/module.controller.arrows.vertical`; пустые строки через `isArrowItemAvailable`; индекс `currentArrowVerticalItem`. `STATE.SET` / `STATE.CLEAR` → `HIDE` в `eula.hide.state` на `@vnejs/module.controller.hide.on.state`. API: `EVENTS.EULA.STATE_UPDATE`, `EVENTS.EULA.UPDATE_FAST`.
358
- - `views.screens/gallery` — `STATE.SET` / `STATE.CLEAR` → `HIDE` с `{ isForce: true }` в `gallery.hide.state` на `@vnejs/module.controller.hide.on.state`.
359
- - `views/video` — `STATE.CLEAR` → `HIDE` с `{ isForce: true }` в `video.hide.state` на `@vnejs/module.controller.hide.on.state` (`IS_STATE_SET_ENABLED = false`).
360
- - `canvas/sprite` — пустая строка и другие falsy в `getSrc` → transparent (`EMPTY_IMG`), без `MEDIA.GET` / `MEDIA.LOAD`; `indexSrc` берётся с первого непустого overlay.
361
-
362
- ## 0.2.19
363
-
364
- - `views.screens/gamemenu` — вертикальные стрелки в модуле `gameMenu.controller.arrows` на `@vnejs/module.controller.arrows.vertical`; индекс в стейте `currentArrowVerticalItem`. `ACCEPT` / `INTERACT` и хендлер `ACCEPT` → `CLICK` в `gameMenu.controller.accept` на `@vnejs/module.controller.accept`. `BACK` / `MENU` / `GAMEMENU` → `HIDE` в `gameMenu.hide.controls` на `@vnejs/module.controller.hide.on.controls`. `STATE.SET` / `STATE.CLEAR` эмитят `HIDE` с `{ isForce: true }` из модуля `gameMenu.hide.state` на `@vnejs/module.controller.hide.on.state`. API: `EVENTS.GAMEMENU.STATE_UPDATE`, `EVENTS.GAMEMENU.UPDATE_FAST`.
365
- - `views.screens/history` — вертикальные стрелки в модуле `history.controller.arrows` на `@vnejs/module.controller.arrows.vertical`; индекс в стейте `currentArrowVerticalItem`. `ACCEPT` / `INTERACT` и хендлер `ACCEPT` → `CLICK` в `history.controller.accept` на `@vnejs/module.controller.accept`. `BACK` / `MENU` / `GAMEMENU` → `HIDE` в `history.hide.controls` на `@vnejs/module.controller.hide.on.controls`. API: `EVENTS.HISTORY.STATE_UPDATE`, `EVENTS.HISTORY.UPDATE_FAST`.
366
- - `views.screens/settings` — `BACK` / `MENU` / `GAMEMENU` → `HIDE` в `settings.hide.controls` на `@vnejs/module.controller.hide.on.controls`.
367
- - `views.screens/gallery` — `BACK` / `MENU` / `GAMEMENU` → `HIDE` в `gallery.hide.controls` на `@vnejs/module.controller.hide.on.controls`.
368
- - `views.screens/gallery.full` — `BACK` / `MENU` / `GAMEMENU` → `HIDE` в `gallery.full.hide.controls` на `@vnejs/module.controller.hide.on.controls`.
369
- - `views.screens/save` — `BACK` / `MENU` / `GAMEMENU` → `HIDE` в `save.hide.controls` на `@vnejs/module.controller.hide.on.controls`.
370
- - `views.scenario/choose` — вертикальные стрелки в модуле `choose_view.controller.arrows` на `@vnejs/module.controller.arrows.vertical`; скип `hided` через `isArrowItemAvailable` (индекс исходный). `ACCEPT` / `INTERACT` → `CHOOSE.OPTION` в `choose_view.controller.accept` на `@vnejs/module.controller.accept`. API: `EVENTS.CHOOSE_VIEW.STATE_UPDATE`, `EVENTS.CHOOSE_VIEW.UPDATE_FAST`, `EVENTS.CHOOSE_VIEW.ACCEPT`.
371
- - `views.screens/confirm` — `ACCEPT` / `INTERACT` в `confirm.controller.accept` на `@vnejs/module.controller.accept`: при `currentItem` — `ACCEPT` (0) или `DECLINE` (иначе), без выделения — `ACCEPT`. API: `EVENTS.CONFIRM.SUBMIT`, `EVENTS.CONFIRM.STATE_UPDATE`.
372
- - `views.screens/eula` — `ACCEPT` (`IS_INTERACT_ENABLED = false`) в `eula.controller.accept` на `@vnejs/module.controller.accept` → `EULA.ACCEPT` → `ACCEPTED_VERSION`, `HIDE`.
373
- - `views.screens/settings.defaults` — `ACCEPT` (`IS_INTERACT_ENABLED = false`) в `settings.defaults.controller.accept` на `@vnejs/module.controller.accept` → `CONFIRM` → `INITED`, `HIDE`, `emitNext`.
374
- - `views/comment` — `STATE.SET` / `STATE.CLEAR` эмитят `HIDE` с `{ isForce: true }` из модуля `comment.hide` на `@vnejs/module.controller.hide.on.state`.
375
- - `views.screens/mainmenu.socials` — прямые подписки на `STATE.SET` / `STATE.CLEAR` сняты; hide идёт через `MAINMENU.HIDE` от `mainmenu.hide`.
376
-
377
- ## 0.2.18
378
-
379
- - `views.screens/mainmenu` — вертикальные стрелки в модуле `mainmenu.controller.arrows` на `@vnejs/module.controller.arrows.vertical`; индекс в стейте `currentArrowVerticalItem` (ACCEPT читает его, не `currentItem` базы). Кнопки `ACCEPT` / `INTERACT` и хендлер `ACCEPT` → `CLICK` в `mainmenu.controller.accept` на `@vnejs/module.controller.accept` (зеркало `STATE_UPDATE`). `mainmenu.controller` пушит пустой `controls` на `ZINDEX`, чтобы стопорить слои ниже. `STATE.SET` / `STATE.CLEAR` эмитят `HIDE` с `{ isForce: true }` из модуля `mainmenu.hide` на `@vnejs/module.controller.hide.on.state`. Accept / arrows / backgrounds больше не слушают `STATE.SET` / `STATE.CLEAR` напрямую — только `HIDE`.
380
- - `views/settings` — горизонтальная навигация TextControls: стрелки циклят `options` (`selector_texts` сразу `SETTINGS.SET`), `INTERACT` для `actions` без `settingKey`.
381
- - `views.screens/settings` — overlay-BGM на SHOW стартует с громкостью `SETTINGS.MUSIC.VOLUME`.
382
- - `views.screens/gallery` — overlay-BGM на SHOW стартует с громкостью `SETTINGS.MUSIC.VOLUME`.
383
- - `views.screens/save` — overlay-BGM на SHOW стартует с громкостью `SETTINGS.MUSIC.VOLUME`.