@vnejs/docs 0.2.52 → 0.2.54

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  Краткая история изменений движка (плагины, helpers, packages, CLI и прочий runtime) и внешнего API. Версии — релизы пакета `@vnejs/docs`.
4
4
 
5
+ ## 0.2.53
6
+
7
+ - `module.controller.hide.on.controls`, `module.controller.accept`, `module.controller.arrows.*` — PUSH/POP controls только при смене локального `isShow` (как у `ModuleController`), без лишнего POP на HIDE до SHOW.
8
+ - `controls/controls` — флаг блокировки EMIT в `shared.isControlsLocked` (инициализация в `controls.postinject`); при `CONTROLS.EMIT` в консоль пишется список `keys`.
9
+ - `controls/cursor` — DOM-клик с тача эмитит `CURSOR.HIDE` (сам клик с `pointerType === "touch"`, клик после `pointerdown` с тача, либо `sourceCapabilities.firesTouchEvents`).
10
+ - `uis.react` — `vne-cursor-target` ставится только на узлы с `vne-cursor-target-possible` (тот же момент, что непустой `vne-cursor-type`). API: `vne-cursor-target-possible`.
11
+ - `views.screens/checkers` — клетки доски помечаются `vne-cursor-target-possible`.
12
+ - `views.scenario/qte` — дефолтный UI: горизонтальная линия и маркер слева направо вместо круга; rail QTE с `vne-cursor-target-possible`. Авто-fail только в конце `duration`, не при выходе маркера из зоны. Фазы `intro` / `outro` сняты; показ и скрытие только через `Screen` (`TRANSITION`). API сценария `start` / `size` / `duration` без изменений.
13
+ - `module` — `setStateFromGlobalState` → `setClonedState`: `setState(structuredClone(getStateSlice(payload)))`. `getStateSlice`: нет слайса в payload → `getDefaultState()` (пустые модули вырезаются из сейва). API: `setClonedState`, `getStateSlice`.
14
+ - `module.core` — снят `onSetStateClone`; вместо него `setClonedState`. Снят `emitClone`; вместо него `structuredClone`. Снят `emitInteractPushPop`; вместо него `emit(EVENTS.INTERACT.PUSH_POP, …)`. API: снято `ModuleCore.onSetStateClone`, `ModuleCore.emitClone`, `ModuleCore.emitInteractPushPop`.
15
+ - `core/logs` — доп. поля `LogsValue` — `LogsCloneable` (строки, числа, boolean, bigint, null, массивы, plain-object), не `unknown`. API: `LogsCloneable`, `LogsValue`.
16
+ - `core/vendors` — снято событие `CLONE` и модуль `vendors` (lodash `cloneDeep`). API: снято `EVENTS.VENDORS.CLONE`.
17
+
5
18
  ## 0.2.52
6
19
 
7
20
  - `core/logs` — `LogsEmitPayload` = `LogsValue` + опциональный `level` (без обёртки `value`); `module` в payload нет (имя эмиттера из `EmitParams`). API: `LogsValue`, `LogsEmitPayload`, `LogsPushPayload.log`.
package/architecture.md CHANGED
@@ -169,7 +169,7 @@ flowchart TD
169
169
  | Пакет | Назначение |
170
170
  | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
171
171
  | **`@vnejs/module`** | **`Module`**: `VNE`, `on`/`emit`, `inject`, state, shared, media, lifecycle |
172
- | **`@vnejs/module.core`** | **`ModuleCore`** — типизированный доступ к **core-контрактам**; `emitLog`, `emitClone`, … |
172
+ | **`@vnejs/module.core`** | **`ModuleCore`** — типизированный доступ к **core-контрактам** |
173
173
  | **`@vnejs/module.replace`** | **`ModuleReplace`** — последовательная подмена значения поля payload через `REPLACE_KEY` и цепочку handlers |
174
174
  | **`@vnejs/module.replace.exec`** | **`ModuleReplaceExec`** — реестр exec-handlers по имени модуля (`EXEC_REG` / `EXEC_GET`) |
175
175
  | **`@vnejs/module.components`** | **`ModuleView`**, **`ModuleController`** — React-view, zustand, media, controls |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vnejs/docs",
3
- "version": "0.2.52",
3
+ "version": "0.2.54",
4
4
  "description": "VNEJS documentation for engine consumers and coding agents",
5
5
  "files": [
6
6
  "*.md",
@@ -77,7 +77,6 @@ Payloads и результаты хендлеров типизированы ч
77
77
  - [media.md](../core/media.md) — `MEDIA`: EVENTS.LOAD, CONST.PRIORITIES.BACKGROUND, CONST.TYPES.IMAGE, EVENTS.GET
78
78
  - [memory.md](../core/memory.md) — `MEMORY`: EVENTS.CLEARED
79
79
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR, EVENTS.PRELOAD
80
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone, EVENTS.UID
81
80
 
82
81
  ### Остальные
83
82
 
@@ -49,7 +49,7 @@ Payloads и результаты хендлеров типизированы ч
49
49
 
50
50
  ### plugins/core/
51
51
 
52
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
52
+ — нет
53
53
 
54
54
  ### Остальные
55
55
 
@@ -80,7 +80,6 @@ Payloads и результаты хендлеров типизированы ч
80
80
  - [media.md](../core/media.md) — `MEDIA`: EVENTS.LOAD, CONST.TYPES.IMAGE, EVENTS.GET
81
81
  - [memory.md](../core/memory.md) — `MEMORY`: EVENTS.CLEARED
82
82
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR, EVENTS.PRELOAD
83
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
84
83
 
85
84
  ### Остальные
86
85
 
@@ -48,7 +48,7 @@ Payloads и результаты хендлеров типизированы ч
48
48
 
49
49
  ### plugins/core/
50
50
 
51
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
51
+ — нет
52
52
 
53
53
  ### Остальные
54
54
 
@@ -56,7 +56,6 @@ Payloads и результаты хендлеров типизированы ч
56
56
  - [interact.md](../core/interact.md) — `INTERACT`: EVENTS.PUSH_POP
57
57
  - [memory.md](../core/memory.md) — `MEMORY`: EVENTS.CLEARED
58
58
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR, EVENTS.PRELOAD
59
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
60
59
 
61
60
  ### Остальные
62
61
 
@@ -65,7 +65,6 @@ Payloads и результаты хендлеров типизированы ч
65
65
  - [media.md](../core/media.md) — `MEDIA`: EVENTS.LOAD, CONST.PRIORITIES.BACKGROUND, CONST.TYPES.VIDEO, EVENTS.GET
66
66
  - [memory.md](../core/memory.md) — `MEMORY`: EVENTS.CLEARED
67
67
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR, EVENTS.PRELOAD
68
- - [vendors.md](../core/vendors.md) — `VENDORS`: EVENTS.UID, emitClone
69
68
 
70
69
  ### Остальные
71
70
 
@@ -35,10 +35,10 @@ Payloads и результаты хендлеров типизированы ч
35
35
 
36
36
  ## Модули
37
37
 
38
- | Модуль | Зона ответственности |
39
- | ----------------- | ------------------------------------------------------------------------------------------ |
40
- | `controls` | Обрабатывает EMIT, PUSH, POP. |
41
- | `controls.device` | Хранит `currentDevice`; на `DEVICE_SET` эмитит `DEVICE_CHANGED` только при реальной смене. |
38
+ | Модуль | Зона ответственности |
39
+ | ----------------- | --------------------------------------------------------------------------------------------------- |
40
+ | `controls` | Обрабатывает EMIT, PUSH, POP; во время async-обработчика EMIT выставляет `shared.isControlsLocked`. |
41
+ | `controls.device` | Хранит `currentDevice`; на `DEVICE_SET` эмитит `DEVICE_CHANGED` только при реальной смене. |
42
42
 
43
43
  Источники `DEVICE_SET`: keyboard (keydown) → keyboard; `controls.gamepad.device` (button_press / axis_move) → xbox|playstation по `gamepad.id`; cursor (`mousemove`) → keyboard.
44
44
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Пакет: `@vnejs/plugins.controls.cursor` · namespace: `CURSOR`
4
4
 
5
- Кастомный курсор: позиция, сдвиг, скролл под курсором, view и программный клик.
5
+ Кастомный курсор: позиция, сдвиг, скролл под курсором, view и программный клик. DOM-клик с тача эмитит `HIDE`: у события `pointerType === "touch"`, перед кликом был `pointerdown` с тача, либо у клика `sourceCapabilities.firesTouchEvents`.
6
6
 
7
7
  ## События
8
8
 
@@ -54,7 +54,7 @@ Payloads и результаты хендлеров типизированы ч
54
54
  | `cursor.view.set` (`CursorViewSet`) | VIEW_SET + STATE/STARTED для проставления `view`. Имя `view.set`, чтобы не пересечься с `plugins/views/cursor` (`cursor.view`). |
55
55
  | `cursor.move` (`CursorMove`) | MOVE (мышь) → `CONTROLS.DEVICE_SET` (keyboard) + SHOW + SET_X_Y; скрывает системный курсор. |
56
56
  | `cursor.shift` (`CursorShift`) | SHIFT + INIT `SHIFT_SPEED` / `SHIFT_REVERSE_*`. |
57
- | `cursor.click` (`CursorClick`) | CLICK по координатам курсора. |
57
+ | `cursor.click` (`CursorClick`) | CLICK по координатам курсора. DOM-клик с тача эмитит `HIDE`. |
58
58
  | `cursor.scroll` (`CursorScroll`) | SCROLL + INIT `SCROLL_SPEED`. |
59
59
 
60
60
  ## Близкие плагины
@@ -64,7 +64,6 @@ Payloads и результаты хендлеров типизированы ч
64
64
  - [settings.md](../core/settings.md) — `SETTINGS`: EVENTS.INIT
65
65
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR
66
66
  - [system.md](../core/system.md) — `SYSTEM`: EVENTS.STARTED, EVENTS.RESIZE
67
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
68
67
 
69
68
  ### Остальные
70
69
 
@@ -8,14 +8,14 @@
8
8
 
9
9
  Payloads и результаты хендлеров типизированы через module augmentation контракта (`VneEventPayloadMap` / `VneEventResultMap`); типы — в `@vnejs/contracts.core.logs`.
10
10
 
11
- | Ключ | Строка | Смысл |
12
- | ------- | ---------------- | ---------------------------------------------------------------------------------------------------------- |
11
+ | Ключ | Строка | Смысл |
12
+ | ------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
13
13
  | `EMIT` | `vne:logs:emit` | Поставить запись в очередь логов (если логирование включено); затем сформировать `PUSH` с uid и timestamp. Имя модуля-источника — из `EmitParams.module`, не из payload. |
14
- | `PUSH` | `vne:logs:push` | Записать строку в `window.VneLogs` и при необходимости вывести в консоль. |
15
- | `LOAD` | `vne:logs:load` | Скачать накопленные логи как JSON-файл через `SYSTEM.FILE_LOAD`. |
16
- | `CLEAR` | `vne:logs:clear` | Очистить `window.VneLogs`. |
14
+ | `PUSH` | `vne:logs:push` | Записать строку в `window.VneLogs` и при необходимости вывести в консоль. |
15
+ | `LOAD` | `vne:logs:load` | Скачать накопленные логи как JSON-файл через `SYSTEM.FILE_LOAD`. |
16
+ | `CLEAR` | `vne:logs:clear` | Очистить `window.VneLogs`. |
17
17
 
18
- Payload `EMIT` (`LogsEmitPayload`): поля `LogsValue` (`action: string` и прочие) плюс опционально `level`. `module` в payload нет: `Module.emit(this.EVENTS.LOGS.EMIT, { action, … })` передаёт имя модуля через `EmitParams`.
18
+ Payload `EMIT` (`LogsEmitPayload`): поля `LogsValue` (`action: string` и прочие `LogsCloneable`: строки, числа, boolean, bigint, null, массивы и plain-object) плюс опционально `level`. `module` в payload нет: `Module.emit(this.EVENTS.LOGS.EMIT, { action, … })` передаёт имя модуля через `EmitParams`.
19
19
 
20
20
  В модулях на базе `ModuleCore`: `this.emit(this.EVENTS.LOGS.EMIT, { action: …, … })`.
21
21
 
@@ -45,7 +45,6 @@ Payload `EMIT` (`LogsEmitPayload`): поля `LogsValue` (`action: string` и п
45
45
 
46
46
  - [settings.md](./settings.md) — `SETTINGS`: `INIT`; `SETTINGS.LOGS.ENABLED`
47
47
  - [system.md](./system.md) — `SYSTEM`: `FILE_LOAD` (скачивание логов)
48
- - [vendors.md](./vendors.md) — `VENDORS`: `UID`, `CLONE` (`emitClone` для записи лога)
49
48
 
50
49
  ### Остальные
51
50
 
@@ -18,7 +18,7 @@ Payloads и результаты хендлеров типизированы ч
18
18
  | `EXEC_ARG` | `vne:stack:exec_arg` | По токену строки вернуть значение аргумента из верхнего frame. Payload: `{ line? }`. |
19
19
  | `PROHIBIT_REPLACE` | `vne:stack:prohibit_replace` | Цепочка `ModuleReplace`: можно ли идти на `label`. Payload: `{ label?, isProhibited? }`. Старт `isProhibited: false`. Возврат — итоговое `isProhibited`. |
20
20
  | `PROHIBIT_REPLACE_REG` | `vne:stack:prohibit_replace_reg` | Зарегистрировать обработчик `PROHIBIT_REPLACE`. `{ handler, priority? }`. Не блокирующий хендлер: `return isProhibited`; запрет: `return isProhibited \|\| ownCheck`. |
21
- | `PROHIBITED` | `vne:stack:prohibited` | Переход запрещён. Payload: `{ label?, args?, event? }` — `event` это `JUMP` / `CALL` / `EMIT`, чтобы повторить переход. `$ stack jump/call` при запрете не делает `emit SCENARIO.NEXT`. |
21
+ | `PROHIBITED` | `vne:stack:prohibited` | Переход запрещён. Payload: `{ label?, args?, event? }` — `event` это `JUMP` / `CALL` / `EMIT`, чтобы повторить переход. `$ stack jump/call` при запрете не делает `emit SCENARIO.NEXT`. |
22
22
 
23
23
  ## Константы
24
24
 
@@ -35,17 +35,17 @@ Payloads и результаты хендлеров типизированы ч
35
35
 
36
36
  ## Модули
37
37
 
38
- | Модуль | Зона ответственности |
39
- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
40
- | `stack` | State стека; обработка `EMIT` (`PROHIBIT_REPLACE` → переход или `PROHIBITED`); sync на `STATE.SET` / `CLEAR`. |
41
- | `stack.call` | `PROHIBIT_REPLACE`, затем push frame + `EMIT`. |
42
- | `stack.jump` | Jump без сохранения. |
43
- | `stack.pop` | Pop frame. |
44
- | `stack.clear` | Clear state + next. |
45
- | `stack.args` | Резолв аргументов из строки сценария. |
38
+ | Модуль | Зона ответственности |
39
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
40
+ | `stack` | State стека; обработка `EMIT` (`PROHIBIT_REPLACE` → переход или `PROHIBITED`); sync на `STATE.SET` / `CLEAR`. |
41
+ | `stack.call` | `PROHIBIT_REPLACE`, затем push frame + `EMIT`. |
42
+ | `stack.jump` | Jump без сохранения. |
43
+ | `stack.pop` | Pop frame. |
44
+ | `stack.clear` | Clear state + next. |
45
+ | `stack.args` | Резолв аргументов из строки сценария. |
46
46
  | `stack.exec` | Регистрация `$stack` handlers в scenario (jump/call/pop + preload). На `LINE_LOAD` jump/call — `PROHIBIT_REPLACE` до `LABEL_GET`. `onLineExec`: `emit SCENARIO.NEXT` только если jump/call не вернули `false` (запрет); `pop` — как раньше. |
47
- | `stack.replace` | Реестр обработчиков `PROHIBIT_REPLACE_REG`; наследник `@vnejs/module.replace`; `REPLACE_KEY` — `isProhibited`. |
48
- | `stack.logs` | Логирование операций стека, в т.ч. `PROHIBITED`; в `init` регистрирует хендлер `PROHIBIT_REPLACE` (пропускает флаг). |
47
+ | `stack.replace` | Реестр обработчиков `PROHIBIT_REPLACE_REG`; наследник `@vnejs/module.replace`; `REPLACE_KEY` — `isProhibited`. |
48
+ | `stack.logs` | Логирование операций стека, в т.ч. `PROHIBITED`; в `init` регистрирует хендлер `PROHIBIT_REPLACE` (пропускает флаг). |
49
49
 
50
50
  ## Близкие плагины
51
51
 
@@ -56,7 +56,6 @@ Payloads и результаты хендлеров типизированы ч
56
56
  - [memory.md](./memory.md) — `MEMORY`: `CLEAR` (при `EMIT`)
57
57
  - [scenario.md](./scenario.md) — `SCENARIO`: `LABEL_GET`, `LINE_EXEC_REG`, `LINE_LOAD_REG`; `emit SCENARIO.NEXT`
58
58
  - [state.md](./state.md) — `STATE`: `SET`, `CLEAR` (sync стека; `CLEAR` из `stack.clear`)
59
- - [vendors.md](./vendors.md) — `VENDORS`: `CLONE` (`emitClone` для args)
60
59
 
61
60
  ### Остальные
62
61
 
@@ -46,7 +46,6 @@ Payloads и результаты хендлеров типизированы ч
46
46
  - [logs.md](./logs.md) — `LOGS`: `EVENTS.LOGS.EMIT` (`action`, …), `CONST.LOGS.FILTER_FROM_RESULT_OPTIONS`
47
47
  - [scenario.md](./scenario.md) — `SCENARIO`: `LINES_GET`, `LABEL_GET` (миграция по hash строки)
48
48
  - [system.md](./system.md) — `SYSTEM`: `CONST.SYSTEM.VERSION_MAJOR` / `VERSION_MINOR` (проверка версии save)
49
- - [vendors.md](./vendors.md) — `VENDORS`: `HASH`, `CLONE` (`emitClone` state)
50
49
 
51
50
  ### Остальные
52
51
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Пакет: `@vnejs/plugins.core.vendors` · namespace: `VENDORS`
4
4
 
5
- Обёртки над сторонними утилитами: clone, скриншот.
5
+ Обёртки над сторонними утилитами: скриншот.
6
6
 
7
7
  ## События
8
8
 
@@ -10,7 +10,6 @@ Payloads и результаты хендлеров типизированы ч
10
10
 
11
11
  | Ключ | Строка | Смысл |
12
12
  | -------- | -------------------- | ---------------------------------------------------------------------------------------------- |
13
- | `CLONE` | `vne:vendors:clone` | Deep clone через lodash (state, stack, args). |
14
13
  | `SCREEN` | `vne:vendors:screen` | Скриншот DOM через html2canvas → webp data URL. Payload: `{ width?, height?, quality?, id? }`. |
15
14
 
16
15
  ## Константы
@@ -29,7 +28,6 @@ Payloads и результаты хендлеров типизированы ч
29
28
 
30
29
  | Модуль | Зона ответственности |
31
30
  | ---------------- | --------------------------------------------------------------- |
32
- | `vendors` | clone. |
33
31
  | `vendors.screen` | html2canvas screenshot; на init помечает media-элементы ignore. |
34
32
 
35
33
  ## Близкие плагины
@@ -10,7 +10,7 @@
10
10
  | --------------------- | --------------------------------------------------------------------------------------------------------------------------- |
11
11
  | `% choose` | Открыть выбор: собрать `% choose.option`, emit `EMIT`. Если все опции `hided` (или список пуст) — `SKIP` и переход за блок. |
12
12
  | `% choose.option "…"` | Ветка опции; при проходе мимо невыбранной — skip тела по indent. |
13
- | `$ choose repeat` | Вернуться к ближайшему `% choose` **выше** текущей строки в том же label и `emit SCENARIO.NEXT`. |
13
+ | `$ choose repeat` | Вернуться к ближайшему `% choose` **выше** текущей строки в том же label и `emit SCENARIO.NEXT`. |
14
14
 
15
15
  Пример цикла «осмотреть → вернуться в меню»:
16
16
 
@@ -28,19 +28,19 @@
28
28
 
29
29
  Payloads и результаты хендлеров типизированы через module augmentation контракта (`VneEventPayloadMap` / `VneEventResultMap`); типы — в `@vnejs/contracts.scenario.choose`.
30
30
 
31
- | Ключ | Строка | Смысл |
32
- | -------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
33
- | `EMIT` | `vne:choose:emit` | Принять опции и args; если есть видимые — `STATE_UPDATE` и `SHOW`; иначе `SKIP`. |
31
+ | Ключ | Строка | Смысл |
32
+ | -------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
33
+ | `EMIT` | `vne:choose:emit` | Принять опции и args; если есть видимые — `STATE_UPDATE` и `SHOW`; иначе `SKIP`. |
34
34
  | `OPTION` | `vne:choose:option` | Принять выбор по UI-индексу: прогнать `OPTION_BEFORE`, затем `HIDE`, `OPTION_REPLACE`, установить `curLine`, сброс state, `emit SCENARIO.NEXT`. |
35
- | `OPTION_BEFORE` | `vne:choose:option_before` | Side effects до применения выбора (подписки с `priority` на Observer). |
36
- | `OPTION_REPLACE` | `vne:choose:option_replace` | Подменить UI-индекс принятой опции (цепочка handlers перед переходом по ветке). |
37
- | `OPTION_REPLACE_REG` | `vne:choose:option_replace_reg` | Зарегистрировать обработчик `OPTION_REPLACE`. |
35
+ | `OPTION_BEFORE` | `vne:choose:option_before` | Side effects до применения выбора (подписки с `priority` на Observer). |
36
+ | `OPTION_REPLACE` | `vne:choose:option_replace` | Подменить UI-индекс принятой опции (цепочка handlers перед переходом по ветке). |
37
+ | `OPTION_REPLACE_REG` | `vne:choose:option_replace_reg` | Зарегистрировать обработчик `OPTION_REPLACE`. |
38
38
  | `SKIP` | `vne:choose:skip` | Пропустить блок: `curLine` на первую строку после indent-дерева `% choose`, `emit SCENARIO.NEXT`. |
39
- | `SHOW` | `vne:choose:show` | Выбор активен (state готов). Слушает view-плагин. |
40
- | `HIDE` | `vne:choose:hide` | Выбор закрыт. Слушает view-плагин. |
41
- | `EXEC_REG` | `vne:choose:exec_reg` | Зарегистрировать exec-обработчик для подстановки в опции. |
42
- | `EXEC_GET` | `vne:choose:exec_get` | Получить значение через зарегистрированный exec-обработчик. |
43
- | `STATE_UPDATE` | `vne:choose:state_update` | Обновить накопленное состояние модуля `choose`. |
39
+ | `SHOW` | `vne:choose:show` | Выбор активен (state готов). Слушает view-плагин. |
40
+ | `HIDE` | `vne:choose:hide` | Выбор закрыт. Слушает view-плагин. |
41
+ | `EXEC_REG` | `vne:choose:exec_reg` | Зарегистрировать exec-обработчик для подстановки в опции. |
42
+ | `EXEC_GET` | `vne:choose:exec_get` | Получить значение через зарегистрированный exec-обработчик. |
43
+ | `STATE_UPDATE` | `vne:choose:state_update` | Обновить накопленное состояние модуля `choose`. |
44
44
 
45
45
  ## Константы
46
46
 
@@ -99,7 +99,6 @@ Payloads и результаты хендлеров типизированы ч
99
99
  - [logs.md](../core/logs.md) — `LOGS`: `EVENTS.LOGS.EMIT` (`action`, …), `CONST.LOGS.FILTER_FROM_RESULT_OPTIONS`
100
100
  - [scenario.md](../core/scenario.md) — `SCENARIO`: EVENTS.NEXT, EVENTS.LINE_EXEC_REG, EVENTS.LINES_GET
101
101
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR
102
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
103
102
 
104
103
  ### Остальные
105
104
 
@@ -10,7 +10,7 @@
10
10
  | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
11
11
  | `% point-and-click` | Открыть point-and-click: собрать `% point-and-click.option`, emit `EMIT`. Если все опции `hided` (или список пуст) — `SKIP` и переход за блок. |
12
12
  | `% point-and-click.option {icon} {iconHover} x y` | Hotspot; при проходе мимо невыбранного — skip тела по indent. Опционально args `imgWidth` / `imgHeight` (px canvas). |
13
- | `$ point-and-click repeat` | Вернуться к ближайшему `% point-and-click` **выше** текущей строки в том же label и `emit SCENARIO.NEXT`. |
13
+ | `$ point-and-click repeat` | Вернуться к ближайшему `% point-and-click` **выше** текущей строки в том же label и `emit SCENARIO.NEXT`. |
14
14
 
15
15
  Пример цикла осмотра:
16
16
 
@@ -30,16 +30,16 @@
30
30
 
31
31
  Payloads и результаты хендлеров типизированы через module augmentation контракта (`VneEventPayloadMap` / `VneEventResultMap`); типы — в `@vnejs/contracts.scenario.point_and_click`.
32
32
 
33
- | Ключ | Строка | Смысл |
34
- | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------ |
35
- | `EMIT` | `vne:point_and_click:emit` | Принять опции и args; если есть видимые — `STATE_UPDATE` и `SHOW`; иначе `SKIP`. |
33
+ | Ключ | Строка | Смысл |
34
+ | -------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------- |
35
+ | `EMIT` | `vne:point_and_click:emit` | Принять опции и args; если есть видимые — `STATE_UPDATE` и `SHOW`; иначе `SKIP`. |
36
36
  | `OPTION` | `vne:point_and_click:option` | Выбор hotspot: `HIDE`, `curLine` внутрь опции, сброс state через `STATE_UPDATE`, `emit SCENARIO.NEXT`. |
37
37
  | `SKIP` | `vne:point_and_click:skip` | Пропустить блок: `curLine` на первую строку после indent-дерева `% point-and-click`, `emit SCENARIO.NEXT`. |
38
- | `SHOW` | `vne:point_and_click:show` | Выбор активен (state готов). Слушает view-плагин. |
39
- | `HIDE` | `vne:point_and_click:hide` | Выбор закрыт. Слушает view-плагин. |
40
- | `EXEC_REG` | `vne:point_and_click:exec_reg` | Зарегистрировать exec-обработчик для подстановки в опции. |
41
- | `EXEC_GET` | `vne:point_and_click:exec_get` | Получить значение через зарегистрированный exec-обработчик (например `hided:` / `disabled:`). |
42
- | `STATE_UPDATE` | `vne:point_and_click:state_update` | Обновить накопленное состояние модуля `point_and_click`. |
38
+ | `SHOW` | `vne:point_and_click:show` | Выбор активен (state готов). Слушает view-плагин. |
39
+ | `HIDE` | `vne:point_and_click:hide` | Выбор закрыт. Слушает view-плагин. |
40
+ | `EXEC_REG` | `vne:point_and_click:exec_reg` | Зарегистрировать exec-обработчик для подстановки в опции. |
41
+ | `EXEC_GET` | `vne:point_and_click:exec_get` | Получить значение через зарегистрированный exec-обработчик (например `hided:` / `disabled:`). |
42
+ | `STATE_UPDATE` | `vne:point_and_click:state_update` | Обновить накопленное состояние модуля `point_and_click`. |
43
43
 
44
44
  ## Константы
45
45
 
@@ -91,7 +91,6 @@ Payloads и результаты хендлеров типизированы ч
91
91
  - [logs.md](../core/logs.md) — `LOGS`: `EVENTS.LOGS.EMIT` (`action`, …), `CONST.LOGS.FILTER_FROM_RESULT_OPTIONS`
92
92
  - [scenario.md](../core/scenario.md) — `SCENARIO`: EVENTS.NEXT, EVENTS.LINE_EXEC_REG, EVENTS.LINES_GET
93
93
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR
94
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
95
94
 
96
95
  ### Остальные
97
96
 
@@ -48,19 +48,19 @@ Payloads и результаты хендлеров типизированы ч
48
48
 
49
49
  ## Модули
50
50
 
51
- | Модуль | Зона ответственности |
52
- | ---------------------- | ----------------------------------------------------------------------------- |
53
- | `text.emit.end` | Завершение emit и переход к next или финальному state. |
54
- | `text.emit.next` | На `EMIT_NEXT`: `PROCESS_STATE` NEXT, затем `onTextEmitNext` → `emit SCENARIO.NEXT` (`priority` 999999). |
55
- | `text.emit` | Точка входа emit: подготовка и запуск process. |
56
- | `text.exec` | Подмодуль `exec` плагина. |
57
- | `text.prepare.tokens` | Токенизация текста перед отображением. |
58
- | `text.process.state` | В `postinject` — `shared.textProcessSkipSources`; PROCESS_STATE, SET, CLEAR. |
59
- | `text.process.enabled` | Подмодуль `process.enabled` плагина. |
60
- | `text.recalc` | Пересчёт производного состояния текста. |
61
- | `text.replace` | Реестр обработчиков REPLACE_REG. |
62
- | `text.speaker` | SPEAKER_INFO_UPDATE, CLEAR, SET; на `EMIT_BEFORE` (`priority` 100) — speaker. |
63
- | `text` | Обрабатывает STATE_UPDATE, STATE_CHANGED, CLEAR, SET. |
51
+ | Модуль | Зона ответственности |
52
+ | ---------------------- | -------------------------------------------------------------------------------------------------------- |
53
+ | `text.emit.end` | Завершение emit и переход к next или финальному state. |
54
+ | `text.emit.next` | На `EMIT_NEXT`: `PROCESS_STATE` NEXT, затем `onTextEmitNext` → `emit SCENARIO.NEXT` (`priority` 999999). |
55
+ | `text.emit` | Точка входа emit: подготовка и запуск process. |
56
+ | `text.exec` | Подмодуль `exec` плагина. |
57
+ | `text.prepare.tokens` | Токенизация текста перед отображением. |
58
+ | `text.process.state` | В `postinject` — `shared.textProcessSkipSources`; PROCESS_STATE, SET, CLEAR. |
59
+ | `text.process.enabled` | Подмодуль `process.enabled` плагина. |
60
+ | `text.recalc` | Пересчёт производного состояния текста. |
61
+ | `text.replace` | Реестр обработчиков REPLACE_REG. |
62
+ | `text.speaker` | SPEAKER_INFO_UPDATE, CLEAR, SET; на `EMIT_BEFORE` (`priority` 100) — speaker. |
63
+ | `text` | Обрабатывает STATE_UPDATE, STATE_CHANGED, CLEAR, SET. |
64
64
 
65
65
  ## Compatibility
66
66
 
@@ -84,7 +84,6 @@ Payloads и результаты хендлеров типизированы ч
84
84
  - [scenario.md](../core/scenario.md) — `SCENARIO`: EVENTS.NEXT, EVENTS.LINE_EXEC_REG, CONST.OTHER_MODULE, CONST.LINE_KEYWORDS.AUTONEXT
85
85
  - [settings.md](../core/settings.md) — `SETTINGS`: EVENTS.CHANGED, EVENTS.INIT
86
86
  - [state.md](../core/state.md) — `STATE`: EVENTS.SET, EVENTS.CLEAR
87
- - [vendors.md](../core/vendors.md) — `VENDORS`: EVENTS.UID, emitClone
88
87
 
89
88
  ### Остальные
90
89
 
@@ -37,7 +37,6 @@ Payloads и результаты хендлеров типизированы ч
37
37
 
38
38
  - [scenario.md](../core/scenario.md) — `SCENARIO`: EVENTS.NEXT, EVENTS.LINE_EXEC_REG
39
39
  - [state.md](../core/state.md) — `STATE`: EVENTS.CLEAR, EVENTS.SET
40
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
41
40
 
42
41
  ### Остальные
43
42
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Отображает кастомный курсор с загрузкой иконок default/pointer.
6
6
 
7
- Интерактивные элементы игрового UI задают тип курсора атрибутом `vne-cursor-type` на DOM-узле (`"pointer"` или пусто), а не через CSS `cursor`. Компонент курсора читает стек через `elementsFromPoint`, синхронизирует `vne-cursor-target` только у изменившихся узлов и переключает иконку default/pointer. Исключение: у Range input остаётся `cursor: inherit`, чтобы браузерный курсор `<input type="range">` уходил в `none`.
7
+ Интерактивные элементы игрового UI задают тип курсора атрибутом `vne-cursor-type` на DOM-узле (`"pointer"` или пусто), а не через CSS `cursor`. Вместе с непустым типом на том же узле стоит `vne-cursor-target-possible`. Компонент курсора читает стек через `elementsFromPoint`, ставит `vne-cursor-target` только на узлы с `vne-cursor-target-possible` (и только если набор таких узлов изменился) и переключает иконку default/pointer по непустому `vne-cursor-type` во всём стеке. Исключение: у Range input остаётся `cursor: inherit`, чтобы браузерный курсор `<input type="range">` уходил в `none`.
8
8
 
9
9
  ## События
10
10
 
@@ -76,7 +76,6 @@ sequenceDiagram
76
76
 
77
77
  ### plugins/core/
78
78
 
79
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
80
79
  - [state.md](../core/state.md) — restore через `CHOOSE` + bridge
81
80
 
82
81
  ### Остальные
@@ -78,7 +78,6 @@ sequenceDiagram
78
78
 
79
79
  ### plugins/core/
80
80
 
81
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone
82
81
  - [state.md](../core/state.md) — restore через `POINT_AND_CLICK` + bridge
83
82
 
84
83
  ### Остальные
@@ -29,14 +29,12 @@ Payloads и результаты хендлеров типизированы ч
29
29
  | Ключ | Тип | Смысл |
30
30
  | -------------- | -------- | --------------------------------------------------------------------- |
31
31
  | `TRANSITION` | `number` | Длительность анимации показа/скрытия (мс). По умолчанию `500`. |
32
- | `INITIAL` | `number` | Фаза `initial` до старта intro (мс). По умолчанию `100`. |
32
+ | `INITIAL` | `number` | Зарезервирован; не используется view (маркер стартует после `TRANSITION`). По умолчанию `100`. |
33
33
  | `ZINDEX` | `number` | Z-index слоя и индекс блока controls. По умолчанию `1300`. |
34
34
  | `RESULT_DELAY` | `number` | Пауза на экране success/fail перед `RESULT` (мс). По умолчанию `500`. |
35
35
  | `LOC_LABEL` | `string` | Метка локализации текстов статуса (`locs`). По умолчанию `"qte"`. |
36
36
  | `VIEW_PROPS` | `object` | Пропсы Screen, PositionBox. |
37
37
 
38
- Длительность intro: `max(TRANSITION - INITIAL, 0)`.
39
-
40
38
  ## Настройки
41
39
 
42
40
  Нет.
@@ -45,24 +43,22 @@ Payloads и результаты хендлеров типизированы ч
45
43
 
46
44
  | Модуль | Зона ответственности |
47
45
  | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
48
- | `qte_view.controller` | Bridge `QTE.OPENED/CLOSED` → `SHOW/HIDE`; фазы `initial → intro → active → resolved → outro`; таймер fail; пустой `controls` на `ZINDEX`; emit `QTE.RESULT`. |
46
+ | `qte_view.controller` | Bridge `QTE.OPENED/CLOSED` → `SHOW/HIDE`; фазы `initial → active → resolved`; таймер fail; пустой `controls` на `ZINDEX`; emit `QTE.RESULT`. Показ/скрытие — через `Screen` (`TRANSITION`). |
49
47
  | `qte_view.controller.accept` | Наследует `@vnejs/module.controller.accept`: `ACCEPT` / `INTERACT` → `QTE_VIEW.ACTION`; PUSH/POP на SHOW/HIDE. |
50
- | `qte_view.view` | React-render круга / зоны / указателя; `LOC_LABEL` для статусов. |
48
+ | `qte_view.view` | React-render горизонтальной линии, зоны успеха и маркера; `LOC_LABEL` для статусов. |
51
49
 
52
50
  ## Фазы
53
51
 
54
52
  | Фаза | Смысл |
55
53
  | ---------- | -------------------------------------------------------------------------------------------------------------------- |
56
54
  | `idle` | Скрыт / сброшен. |
57
- | `initial` | Показ Screen, старт анимации (длительность `INITIAL`). |
58
- | `intro` | Масштаб круга до полного размера. |
59
- | `active` | Указатель крутится один оборот за `item.duration`; клик/ACCEPT проверяет попадание в зону `[start, start+size]` (%). |
60
- | `resolved` | Показ success/fail (`RESULT_DELAY`). |
61
- | `outro` | Эмит `QTE.RESULT`, затем hide. |
55
+ | `initial` | Показ `Screen`; маркер ещё не идёт (до `TRANSITION`). |
56
+ | `active` | Маркер идёт слева направо за `item.duration`; клик/ACCEPT проверяет попадание в зону `[start, start+size]` (%). |
57
+ | `resolved` | Показ success/fail (`RESULT_DELAY`), затем `QTE.RESULT` и скрытие через `Screen`. |
62
58
 
63
- Авто-fail: таймер на момент конца зоны успеха (`start + size`), если игрок не нажал раньше.
59
+ Авто-fail: таймер на конец прохода маркера (`duration`), если игрок не нажал раньше.
64
60
 
65
- Геометрия view: проценты → градусы (`percentToDegrees`); проверка попадания — по progress от elapsed, не по CSS-позиции указателя.
61
+ Геометрия view: зона и маркер на одной шкале 0–100% ширины линии; проверка попадания — по progress от elapsed, не по CSS-позиции маркера.
66
62
 
67
63
  ## Связь с QTE
68
64
 
@@ -99,7 +95,7 @@ sequenceDiagram
99
95
 
100
96
  ### plugins/core/
101
97
 
102
- - [vendors.md](../core/vendors.md) — `VENDORS`: emitClone (через ModuleController)
98
+ — нет
103
99
 
104
100
  ### Остальные
105
101