@the-inclusionist/engine 9.0.0 → 11.0.0

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 (532) hide show
  1. package/README.md +120 -78
  2. package/app/css/style.css +761 -377
  3. package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
  4. package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
  5. package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
  6. package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
  7. package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
  8. package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
  9. package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
  10. package/app/public/vendor/fonts-licences/NOTICE.txt +166 -0
  11. package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
  12. package/app/public/vendor/fonts.css +36 -84
  13. package/dist-pkg/boot/create-game.d.ts +499 -219
  14. package/dist-pkg/boot/create-game.js +3944 -562
  15. package/dist-pkg/core/a11y-sr.d.ts +25 -3
  16. package/dist-pkg/core/a11y-sr.js +38 -19
  17. package/dist-pkg/core/accessible-label.d.ts +17 -0
  18. package/dist-pkg/core/accessible-label.js +37 -0
  19. package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
  20. package/dist-pkg/core/accommodation-subjects.js +32 -0
  21. package/dist-pkg/core/accommodations.d.ts +125 -0
  22. package/dist-pkg/core/accommodations.js +195 -0
  23. package/dist-pkg/core/actions.d.ts +108 -55
  24. package/dist-pkg/core/actions.js +122 -71
  25. package/dist-pkg/core/calm-mode.d.ts +31 -0
  26. package/dist-pkg/core/calm-mode.js +47 -0
  27. package/dist-pkg/core/camera-cycle.d.ts +15 -0
  28. package/dist-pkg/core/camera-cycle.js +7 -0
  29. package/dist-pkg/core/caption-duration.d.ts +15 -0
  30. package/dist-pkg/core/caption-duration.js +19 -0
  31. package/dist-pkg/core/cartridge-problems.d.ts +34 -0
  32. package/dist-pkg/core/cartridge-problems.js +53 -0
  33. package/dist-pkg/core/constants.d.ts +0 -54
  34. package/dist-pkg/core/constants.js +9 -76
  35. package/dist-pkg/core/contract.d.ts +142 -164
  36. package/dist-pkg/core/contract.js +222 -208
  37. package/dist-pkg/core/dom-query.d.ts +4 -4
  38. package/dist-pkg/core/dom-query.js +12 -20
  39. package/dist-pkg/core/entity.d.ts +62 -77
  40. package/dist-pkg/core/entity.js +18 -32
  41. package/dist-pkg/core/escape-html.d.ts +9 -10
  42. package/dist-pkg/core/escape-html.js +16 -20
  43. package/dist-pkg/core/flash-threshold.d.ts +17 -0
  44. package/dist-pkg/core/flash-threshold.js +113 -0
  45. package/dist-pkg/core/game-speed.d.ts +11 -0
  46. package/dist-pkg/core/game-speed.js +16 -0
  47. package/dist-pkg/core/genres.d.ts +20 -0
  48. package/dist-pkg/core/genres.js +44 -0
  49. package/dist-pkg/core/i18n.d.ts +71 -60
  50. package/dist-pkg/core/i18n.js +186 -200
  51. package/dist-pkg/core/loop.d.ts +17 -6
  52. package/dist-pkg/core/loop.js +26 -26
  53. package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
  54. package/dist-pkg/core/pause-icon-catalogue.js +54 -0
  55. package/dist-pkg/core/ring.d.ts +17 -0
  56. package/dist-pkg/core/ring.js +29 -0
  57. package/dist-pkg/core/rng.d.ts +7 -12
  58. package/dist-pkg/core/rng.js +23 -53
  59. package/dist-pkg/core/route.d.ts +26 -26
  60. package/dist-pkg/core/route.js +126 -121
  61. package/dist-pkg/core/scenes.d.ts +37 -40
  62. package/dist-pkg/core/scenes.js +41 -43
  63. package/dist-pkg/core/screens.d.ts +4 -4
  64. package/dist-pkg/core/screens.js +11 -16
  65. package/dist-pkg/core/session-clock.d.ts +23 -0
  66. package/dist-pkg/core/session-clock.js +37 -0
  67. package/dist-pkg/core/setting-defaults.d.ts +61 -0
  68. package/dist-pkg/core/setting-defaults.js +66 -0
  69. package/dist-pkg/core/speech-rate.d.ts +29 -0
  70. package/dist-pkg/core/speech-rate.js +47 -0
  71. package/dist-pkg/core/state.d.ts +118 -118
  72. package/dist-pkg/core/state.js +322 -297
  73. package/dist-pkg/core/visual-cycles.d.ts +30 -0
  74. package/dist-pkg/core/visual-cycles.js +52 -0
  75. package/dist-pkg/core/visual-state.d.ts +13 -0
  76. package/dist-pkg/core/visual-state.js +6 -0
  77. package/dist-pkg/educational/activities-registry.d.ts +1 -1
  78. package/dist-pkg/educational/activities-registry.js +9 -8
  79. package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
  80. package/dist-pkg/educational/adaptive-engine.js +17 -17
  81. package/dist-pkg/educational/segment-bar.d.ts +12 -12
  82. package/dist-pkg/educational/segment-bar.js +9 -9
  83. package/dist-pkg/i18n/en.js +324 -223
  84. package/dist-pkg/i18n/es.js +323 -223
  85. package/dist-pkg/i18n/pt.js +348 -226
  86. package/dist-pkg/input/default-bindings.d.ts +37 -38
  87. package/dist-pkg/input/default-bindings.js +127 -144
  88. package/dist-pkg/input/devices.d.ts +7 -7
  89. package/dist-pkg/input/devices.js +17 -16
  90. package/dist-pkg/input/edges.d.ts +23 -32
  91. package/dist-pkg/input/edges.js +23 -28
  92. package/dist-pkg/input/empathy-filter.d.ts +22 -0
  93. package/dist-pkg/input/empathy-filter.js +34 -0
  94. package/dist-pkg/input/face-map.d.ts +96 -0
  95. package/dist-pkg/input/face-map.js +255 -0
  96. package/dist-pkg/input/face-signals.d.ts +40 -0
  97. package/dist-pkg/input/face-signals.js +48 -0
  98. package/dist-pkg/input/gamepad.d.ts +195 -145
  99. package/dist-pkg/input/gamepad.js +383 -556
  100. package/dist-pkg/input/gaze-cycle.d.ts +64 -0
  101. package/dist-pkg/input/gaze-cycle.js +133 -0
  102. package/dist-pkg/input/gaze-relative.d.ts +68 -0
  103. package/dist-pkg/input/gaze-relative.js +142 -0
  104. package/dist-pkg/input/hand-map.d.ts +28 -0
  105. package/dist-pkg/input/hand-map.js +142 -0
  106. package/dist-pkg/input/input-cooldown.d.ts +17 -0
  107. package/dist-pkg/input/input-cooldown.js +39 -0
  108. package/dist-pkg/input/key-default.d.ts +30 -0
  109. package/dist-pkg/input/key-default.js +60 -0
  110. package/dist-pkg/input/keyboard-runtime.d.ts +15 -21
  111. package/dist-pkg/input/keyboard-runtime.js +23 -27
  112. package/dist-pkg/input/keyboard.d.ts +68 -63
  113. package/dist-pkg/input/keyboard.js +83 -105
  114. package/dist-pkg/input/keydown.d.ts +123 -137
  115. package/dist-pkg/input/keydown.js +284 -289
  116. package/dist-pkg/input/latch-edge.d.ts +33 -21
  117. package/dist-pkg/input/latch-edge.js +34 -35
  118. package/dist-pkg/input/latch-scope.d.ts +51 -50
  119. package/dist-pkg/input/latch-scope.js +61 -82
  120. package/dist-pkg/input/latch-store.d.ts +26 -30
  121. package/dist-pkg/input/latch-store.js +42 -50
  122. package/dist-pkg/input/latch-sync.d.ts +29 -29
  123. package/dist-pkg/input/latch-sync.js +25 -25
  124. package/dist-pkg/input/latch.d.ts +14 -17
  125. package/dist-pkg/input/latch.js +29 -37
  126. package/dist-pkg/input/pad-defaults.d.ts +13 -16
  127. package/dist-pkg/input/pad-defaults.js +21 -28
  128. package/dist-pkg/input/pad-reading.d.ts +76 -0
  129. package/dist-pkg/input/pad-reading.js +169 -0
  130. package/dist-pkg/input/pad-wizard.d.ts +99 -0
  131. package/dist-pkg/input/pad-wizard.js +256 -0
  132. package/dist-pkg/input/pointer-space.d.ts +19 -20
  133. package/dist-pkg/input/pointer-space.js +27 -32
  134. package/dist-pkg/input/pointer.d.ts +39 -40
  135. package/dist-pkg/input/pointer.js +42 -45
  136. package/dist-pkg/input/state.d.ts +101 -89
  137. package/dist-pkg/input/state.js +54 -134
  138. package/dist-pkg/input/switch-scan.d.ts +59 -0
  139. package/dist-pkg/input/switch-scan.js +67 -0
  140. package/dist-pkg/input/synthetic-source.d.ts +42 -0
  141. package/dist-pkg/input/synthetic-source.js +57 -0
  142. package/dist-pkg/input/touch-bindings.d.ts +127 -116
  143. package/dist-pkg/input/touch-bindings.js +158 -173
  144. package/dist-pkg/input/touch.d.ts +147 -72
  145. package/dist-pkg/input/touch.js +362 -126
  146. package/dist-pkg/input/transport-in-use.d.ts +107 -0
  147. package/dist-pkg/input/transport-in-use.js +130 -0
  148. package/dist-pkg/input/transports.d.ts +90 -117
  149. package/dist-pkg/input/transports.js +104 -106
  150. package/dist-pkg/input/virtual-controller.d.ts +82 -0
  151. package/dist-pkg/input/virtual-controller.js +69 -0
  152. package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
  153. package/dist-pkg/input/vocabulary-migration.js +80 -79
  154. package/dist-pkg/input/voice-map.d.ts +59 -0
  155. package/dist-pkg/input/voice-map.js +123 -0
  156. package/dist-pkg/platform/audio-ambient.d.ts +13 -2
  157. package/dist-pkg/platform/audio-ambient.js +14 -14
  158. package/dist-pkg/platform/audio-earcons.d.ts +20 -19
  159. package/dist-pkg/platform/audio-earcons.js +51 -42
  160. package/dist-pkg/platform/audio-jingles.js +9 -10
  161. package/dist-pkg/platform/audio-mixer.d.ts +14 -2
  162. package/dist-pkg/platform/audio-mixer.js +31 -39
  163. package/dist-pkg/platform/audio-sonar.d.ts +49 -152
  164. package/dist-pkg/platform/audio-sonar.js +124 -302
  165. package/dist-pkg/platform/audio.d.ts +62 -19
  166. package/dist-pkg/platform/audio.js +193 -168
  167. package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
  168. package/dist-pkg/platform/choose-by-voice.js +157 -0
  169. package/dist-pkg/platform/flash-sampler.d.ts +19 -0
  170. package/dist-pkg/platform/flash-sampler.js +79 -0
  171. package/dist-pkg/platform/font-library.d.ts +77 -0
  172. package/dist-pkg/platform/font-library.js +98 -0
  173. package/dist-pkg/platform/font-library.json +721 -0
  174. package/dist-pkg/platform/heavy-catalogue.d.ts +77 -0
  175. package/dist-pkg/platform/heavy-catalogue.js +256 -0
  176. package/dist-pkg/platform/heavy-mirror.d.ts +20 -0
  177. package/dist-pkg/platform/heavy-mirror.js +73 -0
  178. package/dist-pkg/platform/heavy.d.ts +136 -0
  179. package/dist-pkg/platform/heavy.js +324 -0
  180. package/dist-pkg/platform/interruptible-speech.d.ts +23 -16
  181. package/dist-pkg/platform/interruptible-speech.js +77 -54
  182. package/dist-pkg/platform/kokoro-port.d.ts +27 -0
  183. package/dist-pkg/platform/kokoro-port.js +50 -0
  184. package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
  185. package/dist-pkg/platform/kokoro-runtime.js +52 -0
  186. package/dist-pkg/platform/kokoro.d.ts +70 -0
  187. package/dist-pkg/platform/kokoro.js +133 -0
  188. package/dist-pkg/platform/listener-scope.d.ts +12 -0
  189. package/dist-pkg/platform/listener-scope.js +90 -0
  190. package/dist-pkg/platform/locale-host.d.ts +14 -0
  191. package/dist-pkg/platform/locale-host.js +45 -0
  192. package/dist-pkg/platform/microphone.d.ts +51 -0
  193. package/dist-pkg/platform/microphone.js +118 -0
  194. package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
  195. package/dist-pkg/platform/onnx-runtime.js +42 -0
  196. package/dist-pkg/platform/reading-in-worker.d.ts +64 -0
  197. package/dist-pkg/platform/reading-in-worker.js +125 -0
  198. package/dist-pkg/platform/reading-model.d.ts +94 -0
  199. package/dist-pkg/platform/reading-model.js +272 -0
  200. package/dist-pkg/platform/reading-runtime.d.ts +24 -0
  201. package/dist-pkg/platform/reading-runtime.js +164 -0
  202. package/dist-pkg/platform/reading-worker.d.ts +41 -0
  203. package/dist-pkg/platform/reading-worker.js +58 -0
  204. package/dist-pkg/platform/reading.d.ts +80 -0
  205. package/dist-pkg/platform/reading.js +136 -0
  206. package/dist-pkg/platform/speech-recognition.d.ts +60 -0
  207. package/dist-pkg/platform/speech-recognition.js +104 -0
  208. package/dist-pkg/platform/speech.d.ts +23 -1
  209. package/dist-pkg/platform/speech.js +29 -18
  210. package/dist-pkg/platform/storage-keys.d.ts +96 -0
  211. package/dist-pkg/platform/storage-keys.js +106 -0
  212. package/dist-pkg/platform/storage.d.ts +46 -111
  213. package/dist-pkg/platform/storage.js +104 -169
  214. package/dist-pkg/platform/tts.d.ts +85 -39
  215. package/dist-pkg/platform/tts.js +447 -127
  216. package/dist-pkg/platform/vision-loop.d.ts +23 -0
  217. package/dist-pkg/platform/vision-loop.js +56 -0
  218. package/dist-pkg/platform/vision.d.ts +132 -0
  219. package/dist-pkg/platform/vision.js +117 -0
  220. package/dist-pkg/platform/voice-listener.d.ts +40 -0
  221. package/dist-pkg/platform/voice-listener.js +88 -0
  222. package/dist-pkg/platform/voice-plan.d.ts +15 -98
  223. package/dist-pkg/platform/voice-plan.js +56 -143
  224. package/dist-pkg/platform/vosk-runtime.d.ts +96 -0
  225. package/dist-pkg/platform/vosk-runtime.js +151 -0
  226. package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
  227. package/dist-pkg/platform/vosk-vocabulary.js +178 -0
  228. package/dist-pkg/render/canvas.d.ts +13 -7
  229. package/dist-pkg/render/canvas.js +13 -13
  230. package/dist-pkg/render/crt.d.ts +48 -12
  231. package/dist-pkg/render/crt.js +78 -80
  232. package/dist-pkg/render/cvd-matrices.d.ts +22 -18
  233. package/dist-pkg/render/cvd-matrices.js +37 -38
  234. package/dist-pkg/render/hc-role-data.d.ts +7 -7
  235. package/dist-pkg/render/hc-role-data.js +14 -14
  236. package/dist-pkg/render/high-contrast.d.ts +67 -56
  237. package/dist-pkg/render/high-contrast.js +226 -217
  238. package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
  239. package/dist-pkg/render/low-vision-drawing.js +46 -0
  240. package/dist-pkg/render/lq-filter.d.ts +32 -20
  241. package/dist-pkg/render/lq-filter.js +59 -65
  242. package/dist-pkg/render/port.d.ts +86 -88
  243. package/dist-pkg/render/port.js +17 -23
  244. package/dist-pkg/render/screen-pipeline.d.ts +42 -42
  245. package/dist-pkg/render/screen-pipeline.js +80 -87
  246. package/dist-pkg/render/sprite-fx.d.ts +2 -1
  247. package/dist-pkg/render/sprite-fx.js +16 -14
  248. package/dist-pkg/render/viewports.d.ts +20 -15
  249. package/dist-pkg/render/viewports.js +83 -114
  250. package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
  251. package/dist-pkg/render/viz-axes-labels.js +88 -0
  252. package/dist-pkg/render/viz-axes.d.ts +89 -86
  253. package/dist-pkg/render/viz-axes.js +128 -116
  254. package/dist-pkg/render/viz-modes.d.ts +28 -29
  255. package/dist-pkg/render/viz-modes.js +40 -45
  256. package/dist-pkg/render/viz-refusal.d.ts +32 -0
  257. package/dist-pkg/render/viz-refusal.js +57 -0
  258. package/dist-pkg/render/viz-setters.d.ts +104 -66
  259. package/dist-pkg/render/viz-setters.js +182 -191
  260. package/dist-pkg/ui/aac-sets.d.ts +45 -0
  261. package/dist-pkg/ui/aac-sets.js +41 -0
  262. package/dist-pkg/ui/audio-choices.d.ts +68 -0
  263. package/dist-pkg/ui/audio-choices.js +98 -0
  264. package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
  265. package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
  266. package/dist-pkg/ui/camera-control.d.ts +53 -0
  267. package/dist-pkg/ui/camera-control.js +48 -0
  268. package/dist-pkg/ui/changed-mark.d.ts +9 -8
  269. package/dist-pkg/ui/changed-mark.js +22 -53
  270. package/dist-pkg/ui/control-choices.d.ts +37 -0
  271. package/dist-pkg/ui/control-choices.js +84 -0
  272. package/dist-pkg/ui/debug-panel.d.ts +59 -43
  273. package/dist-pkg/ui/debug-panel.js +68 -69
  274. package/dist-pkg/ui/declared-words.d.ts +21 -0
  275. package/dist-pkg/ui/declared-words.js +66 -0
  276. package/dist-pkg/ui/dom.d.ts +10 -14
  277. package/dist-pkg/ui/dom.js +10 -47
  278. package/dist-pkg/ui/drawing-problems.d.ts +25 -0
  279. package/dist-pkg/ui/drawing-problems.js +94 -0
  280. package/dist-pkg/ui/eye-control.d.ts +36 -0
  281. package/dist-pkg/ui/eye-control.js +178 -0
  282. package/dist-pkg/ui/face-control.d.ts +25 -0
  283. package/dist-pkg/ui/face-control.js +183 -0
  284. package/dist-pkg/ui/focus-trap.d.ts +39 -49
  285. package/dist-pkg/ui/focus-trap.js +56 -65
  286. package/dist-pkg/ui/fonts.d.ts +157 -68
  287. package/dist-pkg/ui/fonts.js +305 -115
  288. package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
  289. package/dist-pkg/ui/footer-scroll-driver.js +201 -0
  290. package/dist-pkg/ui/footer-scroll.d.ts +38 -0
  291. package/dist-pkg/ui/footer-scroll.js +55 -0
  292. package/dist-pkg/ui/game-options.d.ts +47 -0
  293. package/dist-pkg/ui/game-options.js +158 -0
  294. package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
  295. package/dist-pkg/ui/gaze-overlay.js +165 -0
  296. package/dist-pkg/ui/hand-control.d.ts +25 -0
  297. package/dist-pkg/ui/hand-control.js +143 -0
  298. package/dist-pkg/ui/help-panel.d.ts +87 -0
  299. package/dist-pkg/ui/help-panel.js +242 -0
  300. package/dist-pkg/ui/hud-bands.d.ts +62 -0
  301. package/dist-pkg/ui/hud-bands.js +146 -0
  302. package/dist-pkg/ui/hud-row.d.ts +34 -0
  303. package/dist-pkg/ui/hud-row.js +80 -0
  304. package/dist-pkg/ui/hud.d.ts +73 -73
  305. package/dist-pkg/ui/hud.js +94 -98
  306. package/dist-pkg/ui/item-announcement.d.ts +13 -12
  307. package/dist-pkg/ui/item-announcement.js +25 -26
  308. package/dist-pkg/ui/layout.d.ts +103 -28
  309. package/dist-pkg/ui/layout.js +117 -99
  310. package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
  311. package/dist-pkg/ui/libras-avatar-clip.js +86 -0
  312. package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
  313. package/dist-pkg/ui/libras-avatar-load.js +134 -0
  314. package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
  315. package/dist-pkg/ui/libras-avatar-plan.js +211 -0
  316. package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
  317. package/dist-pkg/ui/libras-avatar-player.js +226 -0
  318. package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
  319. package/dist-pkg/ui/libras-avatar-stage.js +208 -0
  320. package/dist-pkg/ui/libras-glosses.d.ts +28 -0
  321. package/dist-pkg/ui/libras-glosses.js +161 -0
  322. package/dist-pkg/ui/locale-flags.d.ts +16 -0
  323. package/dist-pkg/ui/locale-flags.js +30 -0
  324. package/dist-pkg/ui/loop-crash.d.ts +17 -17
  325. package/dist-pkg/ui/loop-crash.js +33 -62
  326. package/dist-pkg/ui/menu-intent.d.ts +61 -0
  327. package/dist-pkg/ui/menu-intent.js +88 -0
  328. package/dist-pkg/ui/menu-items.d.ts +20 -0
  329. package/dist-pkg/ui/menu-items.js +51 -0
  330. package/dist-pkg/ui/menu-nav.d.ts +98 -92
  331. package/dist-pkg/ui/menu-nav.js +398 -286
  332. package/dist-pkg/ui/mobility-choices.d.ts +26 -0
  333. package/dist-pkg/ui/mobility-choices.js +41 -0
  334. package/dist-pkg/ui/motion-choices.d.ts +31 -0
  335. package/dist-pkg/ui/motion-choices.js +68 -0
  336. package/dist-pkg/ui/motion-scene.d.ts +24 -19
  337. package/dist-pkg/ui/motion-scene.js +29 -61
  338. package/dist-pkg/ui/mount-panel.d.ts +81 -0
  339. package/dist-pkg/ui/mount-panel.js +61 -0
  340. package/dist-pkg/ui/panel-shell.d.ts +65 -31
  341. package/dist-pkg/ui/panel-shell.js +92 -66
  342. package/dist-pkg/ui/panel-widgets.d.ts +150 -0
  343. package/dist-pkg/ui/panel-widgets.js +294 -0
  344. package/dist-pkg/ui/pause-buttons.d.ts +35 -0
  345. package/dist-pkg/ui/pause-buttons.js +66 -0
  346. package/dist-pkg/ui/pause-icons.d.ts +261 -347
  347. package/dist-pkg/ui/pause-icons.js +671 -601
  348. package/dist-pkg/ui/pause-markup.d.ts +86 -0
  349. package/dist-pkg/ui/pause-markup.js +125 -0
  350. package/dist-pkg/ui/reach-notice.d.ts +22 -23
  351. package/dist-pkg/ui/reach-notice.js +55 -58
  352. package/dist-pkg/ui/scan-overlay.d.ts +23 -0
  353. package/dist-pkg/ui/scan-overlay.js +50 -0
  354. package/dist-pkg/ui/screen-text.d.ts +25 -0
  355. package/dist-pkg/ui/screen-text.js +152 -0
  356. package/dist-pkg/ui/session-clock.d.ts +32 -0
  357. package/dist-pkg/ui/session-clock.js +67 -0
  358. package/dist-pkg/ui/settings-aac.d.ts +70 -0
  359. package/dist-pkg/ui/settings-aac.js +208 -0
  360. package/dist-pkg/ui/settings-audio.d.ts +97 -114
  361. package/dist-pkg/ui/settings-audio.js +493 -425
  362. package/dist-pkg/ui/settings-controls.d.ts +53 -96
  363. package/dist-pkg/ui/settings-controls.js +143 -215
  364. package/dist-pkg/ui/settings-empathy.d.ts +39 -30
  365. package/dist-pkg/ui/settings-empathy.js +53 -60
  366. package/dist-pkg/ui/settings-mobility.d.ts +192 -0
  367. package/dist-pkg/ui/settings-mobility.js +332 -0
  368. package/dist-pkg/ui/settings-motion.d.ts +91 -70
  369. package/dist-pkg/ui/settings-motion.js +287 -198
  370. package/dist-pkg/ui/settings-panel.d.ts +58 -45
  371. package/dist-pkg/ui/settings-panel.js +189 -94
  372. package/dist-pkg/ui/settings-typo.d.ts +29 -78
  373. package/dist-pkg/ui/settings-typo.js +158 -129
  374. package/dist-pkg/ui/settings-visual.d.ts +29 -87
  375. package/dist-pkg/ui/settings-visual.js +240 -193
  376. package/dist-pkg/ui/shell.d.ts +112 -135
  377. package/dist-pkg/ui/shell.js +148 -217
  378. package/dist-pkg/ui/simulation-list.d.ts +27 -0
  379. package/dist-pkg/ui/simulation-list.js +76 -0
  380. package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
  381. package/dist-pkg/ui/simulation-over-the-world.js +131 -0
  382. package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
  383. package/dist-pkg/ui/simulation-refusal.js +8 -56
  384. package/dist-pkg/ui/switchable-control.d.ts +11 -0
  385. package/dist-pkg/ui/switchable-control.js +19 -0
  386. package/dist-pkg/ui/title.d.ts +3 -12
  387. package/dist-pkg/ui/title.js +49 -18
  388. package/dist-pkg/ui/top-band.d.ts +26 -0
  389. package/dist-pkg/ui/top-band.js +96 -0
  390. package/dist-pkg/ui/typo-choices.d.ts +71 -0
  391. package/dist-pkg/ui/typo-choices.js +85 -0
  392. package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
  393. package/dist-pkg/ui/visual-axes-panel.js +12 -94
  394. package/dist-pkg/ui/visual-choices.d.ts +77 -0
  395. package/dist-pkg/ui/visual-choices.js +107 -0
  396. package/dist-pkg/ui/vlibras.d.ts +77 -10
  397. package/dist-pkg/ui/vlibras.js +130 -81
  398. package/dist-pkg/ui/voice-control.d.ts +68 -0
  399. package/dist-pkg/ui/voice-control.js +276 -0
  400. package/dist-pkg/ui/voice-settings.d.ts +95 -0
  401. package/dist-pkg/ui/voice-settings.js +352 -0
  402. package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
  403. package/dist-pkg/ui/where-the-child-is.js +70 -0
  404. package/docs/CREDITS.md +300 -44
  405. package/docs/LICENSES.md +189 -145
  406. package/package.json +51 -27
  407. package/scripts/check-cartridge.mjs +78 -0
  408. package/scripts/game-build.d.mts +25 -0
  409. package/scripts/game-build.mjs +144 -0
  410. package/scripts/heavy-into-the-delivery.mjs +388 -0
  411. package/scripts/libras-avatar.json +680 -0
  412. package/scripts/libras-avatar.mjs +246 -0
  413. package/scripts/libras-glosses/gloss.py +95 -0
  414. package/scripts/libras-glosses/pyproject.toml +32 -0
  415. package/scripts/libras-glosses/uv.lock +781 -0
  416. package/scripts/libras-glosses.mjs +351 -0
  417. package/scripts/licences/Apache-2.0.txt +176 -0
  418. package/scripts/licences/GPL-3.0.txt +674 -0
  419. package/scripts/licences/MIT.txt +17 -0
  420. package/scripts/licences/OFL-1.1.txt +86 -0
  421. package/scripts/licences/UFL-1.0.txt +96 -0
  422. package/scripts/licences/fonts.mjs +389 -0
  423. package/scripts/licences/third-party.mjs +301 -0
  424. package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
  425. package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
  426. package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
  427. package/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
  428. package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
  429. package/app/public/vendor/fonts/inter-400.woff2 +0 -0
  430. package/app/public/vendor/fonts/inter-700.woff2 +0 -0
  431. package/app/public/vendor/fonts/lato-400.woff2 +0 -0
  432. package/app/public/vendor/fonts/lato-700.woff2 +0 -0
  433. package/app/public/vendor/fonts/literata-400.woff2 +0 -0
  434. package/app/public/vendor/fonts/literata-700.woff2 +0 -0
  435. package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
  436. package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
  437. package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
  438. package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
  439. package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
  440. package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
  441. package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
  442. package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
  443. package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
  444. package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
  445. package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
  446. package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
  447. package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
  448. package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
  449. package/dist-pkg/core/anel.d.ts +0 -17
  450. package/dist-pkg/core/anel.js +0 -31
  451. package/dist-pkg/core/collision.d.ts +0 -21
  452. package/dist-pkg/core/collision.js +0 -62
  453. package/dist-pkg/core/layers.d.ts +0 -63
  454. package/dist-pkg/core/layers.js +0 -95
  455. package/dist-pkg/core/letter-grid.d.ts +0 -55
  456. package/dist-pkg/core/letter-grid.js +0 -116
  457. package/dist-pkg/core/password.d.ts +0 -34
  458. package/dist-pkg/core/password.js +0 -205
  459. package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
  460. package/dist-pkg/core/rotulo-acessivel.js +0 -41
  461. package/dist-pkg/core/run-state.d.ts +0 -115
  462. package/dist-pkg/core/run-state.js +0 -40
  463. package/dist-pkg/core/tiles.d.ts +0 -12
  464. package/dist-pkg/core/tiles.js +0 -61
  465. package/dist-pkg/core/world.d.ts +0 -4
  466. package/dist-pkg/core/world.js +0 -58
  467. package/dist-pkg/input/origem-sintetica.d.ts +0 -44
  468. package/dist-pkg/input/origem-sintetica.js +0 -60
  469. package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
  470. package/dist-pkg/input/transporte-em-uso.js +0 -130
  471. package/dist-pkg/platform/audio-nav.d.ts +0 -51
  472. package/dist-pkg/platform/audio-nav.js +0 -99
  473. package/dist-pkg/platform/guide-intensity.d.ts +0 -40
  474. package/dist-pkg/platform/guide-intensity.js +0 -73
  475. package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
  476. package/dist-pkg/platform/pesados-catalogo.js +0 -177
  477. package/dist-pkg/platform/pesados.d.ts +0 -31
  478. package/dist-pkg/platform/pesados.js +0 -75
  479. package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
  480. package/dist-pkg/platform/vozes-prontas.js +0 -61
  481. package/dist-pkg/render/camera.d.ts +0 -58
  482. package/dist-pkg/render/camera.js +0 -105
  483. package/dist-pkg/render/cenario-data.d.ts +0 -127
  484. package/dist-pkg/render/cenario-data.js +0 -145
  485. package/dist-pkg/render/city-tex.d.ts +0 -63
  486. package/dist-pkg/render/city-tex.js +0 -228
  487. package/dist-pkg/render/city-tiles.d.ts +0 -11
  488. package/dist-pkg/render/city-tiles.js +0 -140
  489. package/dist-pkg/render/draw.d.ts +0 -149
  490. package/dist-pkg/render/draw.js +0 -231
  491. package/dist-pkg/render/fx.d.ts +0 -63
  492. package/dist-pkg/render/fx.js +0 -123
  493. package/dist-pkg/render/minimap.d.ts +0 -11
  494. package/dist-pkg/render/minimap.js +0 -94
  495. package/dist-pkg/render/parallax.d.ts +0 -85
  496. package/dist-pkg/render/parallax.js +0 -158
  497. package/dist-pkg/render/player-anim.d.ts +0 -71
  498. package/dist-pkg/render/player-anim.js +0 -152
  499. package/dist-pkg/render/recycling-tex.d.ts +0 -48
  500. package/dist-pkg/render/recycling-tex.js +0 -164
  501. package/dist-pkg/render/scene-city.d.ts +0 -77
  502. package/dist-pkg/render/scene-city.js +0 -181
  503. package/dist-pkg/render/scene-parallax.d.ts +0 -72
  504. package/dist-pkg/render/scene-parallax.js +0 -426
  505. package/dist-pkg/render/scene-sky.d.ts +0 -126
  506. package/dist-pkg/render/scene-sky.js +0 -295
  507. package/dist-pkg/render/set-cenario.d.ts +0 -54
  508. package/dist-pkg/render/set-cenario.js +0 -103
  509. package/dist-pkg/render/textures.d.ts +0 -75
  510. package/dist-pkg/render/textures.js +0 -240
  511. package/dist-pkg/render/title-scene.d.ts +0 -46
  512. package/dist-pkg/render/title-scene.js +0 -75
  513. package/dist-pkg/render/weather.d.ts +0 -96
  514. package/dist-pkg/render/weather.js +0 -171
  515. package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
  516. package/dist-pkg/render/wheelchair-sprites.js +0 -69
  517. package/dist-pkg/render/world-tex.d.ts +0 -18
  518. package/dist-pkg/render/world-tex.js +0 -87
  519. package/dist-pkg/ui/activities-menu.d.ts +0 -258
  520. package/dist-pkg/ui/activities-menu.js +0 -648
  521. package/dist-pkg/ui/caa-sets.d.ts +0 -39
  522. package/dist-pkg/ui/caa-sets.js +0 -65
  523. package/dist-pkg/ui/latch-refusal.d.ts +0 -32
  524. package/dist-pkg/ui/latch-refusal.js +0 -60
  525. package/dist-pkg/ui/map-hub.d.ts +0 -56
  526. package/dist-pkg/ui/map-hub.js +0 -138
  527. package/dist-pkg/ui/settings-caa.d.ts +0 -45
  528. package/dist-pkg/ui/settings-caa.js +0 -137
  529. package/dist-pkg/ui/settings-motor.d.ts +0 -175
  530. package/dist-pkg/ui/settings-motor.js +0 -342
  531. package/dist-pkg/ui/webcam.d.ts +0 -7
  532. package/dist-pkg/ui/webcam.js +0 -93
@@ -1,96 +1,108 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  import type { ControlledPlayer } from '../core/entity.js';
3
3
  import type { Action } from '../core/actions.js';
4
- import { type Transporte, type EstadoDaEntrada } from './transporte-em-uso.js';
5
- export declare const keys: Set<string>;
6
- /**
7
- * A ORIGEM DE CADA TECLA SEGURADA — código → aparelho que a produziu (ADR-0109).
8
- *
9
- * ⚠️ ESTE MAPA EXISTE PORQUE `keys` APAGA A ORIGEM À PORTA, e foi essa erasão que deixou o §C da issue #114
10
- * por construir durante dois meses: o toque escreve códigos aqui dentro (`press()` faz
11
- * `heldKeys.add(codeFor(act))`) e a webcam despacha `KeyboardEvent` sintético, então quando o `held()`
12
- * responde já não há como saber QUEM carregou. O único transporte que sobrevivia identificável era o
13
- * gamepad, e só porque passa por `padCur` em vez do conjunto.
14
- *
15
- * ⚠️ CAMPO NOVO AO LADO DO VELHO, sincronizado num ponto só (`marcarTecla`/`soltarTecla`), com os leitores a
16
- * migrar um a um — é a forma que este repositório já usou no `p.visual` ao lado do `p.viz` (#104), e a razão
17
- * é a mesma: uma troca de uma vez não tem estado verde onde parar, e isto é a espinha da entrada.
18
- *
19
- * 📌 Um código SEM entrada aqui não é um erro de dados — é uma tecla que entrou por um escritor que ainda não
20
- * migrou. `origemDe` devolve `undefined` e quem pergunta decide; ver a nota lá.
21
- */
22
- export declare const origemDaTecla: Map<string, Transporte>;
23
- /**
24
- * Uma tecla FOI SEGURADA, e sabe-se por quem. É o único sítio que escreve nos dois.
25
- *
26
- * ⚠️ OS DOIS JUNTOS OU NENHUM: enquanto forem duas estruturas, elas podem divergir, e uma divergência aqui é
27
- * silenciosa — o jogo continua a andar e só a alternância fica errada. Por isso não há `keys.add` público
28
- * neste módulo: quem escreve, escreve por aqui.
29
- */
30
- export declare function marcarTecla(code: string, origem: Transporte): void;
31
- /**
32
- * A tecla foi segurada e NÃO SE SABE por quem. A porta estreita, e ela é estreita de propósito.
33
- *
34
- * ⚠️ POR QUE UMA FUNÇÃO COM OUTRO NOME E NÃO UM SEGUNDO PARÂMETRO OPCIONAL. `marcarTecla(code)` com a origem
35
- * omitida é o que se escreve quando não se pensou; `marcarTeclaSemOrigem(code)` é o que se escreve quando se
36
- * pensou e a resposta é «não sei». O tipo não distingue as duas, mas o nome distingue — e é o nome que
37
- * aparece na revisão. Um parâmetro esquecido não se lê; uma função assim chamada lê-se de longe.
38
- *
39
- * ⚠️ E O `delete` É A METADE QUE IMPORTA, não o `add`. Sem ele, uma tecla premida de novo por uma fonte
40
- * desconhecida HERDAVA a origem da vez anterior: a criança joga por olhar, larga a tecla, um script de fora
41
- * despacha o mesmo código, e a alternância continua a responder «olhos» a uma aresta que já não é dela. Um
42
- * mapa que guarda a resposta certa de ontem é pior do que um que não guarda nada.
43
- *
44
- * 📌 Hoje há UM chamador — o `input/keydown`, para o evento sintético que ninguém assinou. Depois desta
45
- * migração nada nesta engine produz um; quem produz é código de consumidor, e é para ele que esta porta fica
46
- * aberta. Fechá-la faria a tecla dele simplesmente não funcionar, o que é uma quebra pior do que não saber.
47
- */
48
- export declare function marcarTeclaSemOrigem(code: string): void;
49
- /** A outra metade. Solta nos dois, pela mesma razão. */
50
- export declare function soltarTecla(code: string): void;
51
- /** Solta TUDO — o `blur` da janela. Os dois, ou o mapa fica a descrever teclas que já ninguém segura. */
52
- export declare function soltarTodas(): void;
53
- /**
54
- * Quem produziu esta tecla? `undefined` quando não se sabe.
55
- *
56
- * ⚠️ `undefined` E NÃO UM PADRÃO. Um padrão `'teclado'` faria a erasão voltar por outra porta: uma tecla do
57
- * toque que entrasse por um escritor não migrado seria lida como teclado, a alternância desligava-se, e nada
58
- * o diria. Não saber é uma resposta; fingir que se sabe não é.
59
- */
60
- export declare function origemDe(code: string): Transporte | undefined;
61
- /**
62
- * O ESTADO DA ENTRADA DESTE JOGADOR. Nunca `undefined`: quem nunca produziu uma aresta está no PADRÃO.
63
- *
64
- * ⚠️ `PADRAO` E NÃO `undefined`, pela mesma razão que o `origemDe` faz o contrário: ali «não sei» é uma
65
- * resposta honesta sobre uma tecla que já existe; aqui a pergunta é sobre um JOGADOR, e um jogador que
66
- * ainda não tocou em nada está mesmo no teclado sem assistida — que é o que `PADRAO` diz.
67
- */
68
- export declare function entradaDe(jogador: number): EstadoDaEntrada;
69
- /**
70
- * UMA ARESTA DESTE JOGADOR CHEGOU, com a sua origem.
71
- *
72
- * 📌 O `aposAresta` devolve o MESMO objecto quando nada muda, então guardar de volta não aloca por quadro.
73
- * ⚠️ E uma aresta de um transporte assistido NÃO o habilita — essa regra vive no `aposAresta` e a razão
74
- * está lá: um falso positivo da webcam trancaria a alternância de toda a gente sem ninguém ter pedido.
75
- */
76
- export declare function arestaDoJogador(jogador: number, origem: Transporte): void;
77
- /** Habilitar a assistida é um ACTO EXPLÍCITO (ADR-0109 regra 4), e por isso tem porta própria. */
78
- export declare function habilitarAssistidaDe(jogador: number): void;
79
- export declare function desabilitarAssistidaDe(jogador: number): void;
4
+ import { type TransportName, type InputState } from './transport-in-use.js';
5
+ /** The actions one pad holds this frame. Mutated IN PLACE by `input/gamepad`'s `pollPads`. */
6
+ type PadState = Record<string, boolean>;
7
+ type HeldPlayer = Pick<ControlledPlayer, 'ctrl' | 'pad'>;
8
+ /** ONE ROOT'S INPUT STATE — what `createInputState()` returns and what `Engine.input` is. */
9
+ export interface LiveInput {
10
+ /** Physical keys held NOW (KeyboardEvent.code). */
11
+ readonly keys: Set<string>;
12
+ /**
13
+ * THE SOURCE OF EACH HELD KEY — code → the device that produced it (ADR-0109).
14
+ *
15
+ * ⚠️ THIS MAP EXISTS BECAUSE `keys` ERASES THE SOURCE AT THE DOOR (issue #114): it is a set of CODES, and several
16
+ * transports hold keys in it — the keyboard, and the virtual controller for a position the eyes, the face, the hands
17
+ * or the voice pressed — so by the time `held()` answers there is no telling WHO pressed. The pad keeps its own
18
+ * identity only because it goes through `padCur` instead of the set.
19
+ *
20
+ * ⚠️ THE TWO ARE WRITTEN IN ONE PLACE (`markKey`/`releaseKey` and their siblings), because they are two structures and
21
+ * may drift apart.
22
+ *
23
+ * 📌 A code with NO entry here is not a data error — it is a key nobody signed, and every real key from the keyboard
24
+ * is one: an event the child produced carries no stamp. `sourceOf` returns `undefined` and whoever asks decides.
25
+ */
26
+ readonly keySource: Map<string, TransportName>;
27
+ /**
28
+ * A key WAS PRESSED, and who pressed it is known. The only place that writes both.
29
+ *
30
+ * ⚠️ BOTH TOGETHER OR NEITHER: while they are two structures they can drift apart, and a drift here is silent — the
31
+ * game keeps moving and only the latch goes wrong. Whoever writes, writes through here.
32
+ */
33
+ markKey(code: string, origin: TransportName): void;
34
+ /**
35
+ * The key was pressed and WHO pressed it is NOT KNOWN. The narrow door, and it is narrow on purpose.
36
+ *
37
+ * ⚠️ A FUNCTION WITH ANOTHER NAME AND NOT AN OPTIONAL SECOND PARAMETER: `markKey(code)` with the source left out is what
38
+ * gets written without thinking; `markKeyWithoutSource(code)` is what gets written after thinking, when the answer is
39
+ * "I don't know". The name is what shows in review.
40
+ *
41
+ * ⚠️ AND THE `delete` IS THE HALF THAT MATTERS: without it, a key pressed again by an unknown source INHERITED the
42
+ * source of the time before, and the latch kept answering "eyes" to an edge that is no longer theirs.
43
+ */
44
+ markKeyWithoutSource(code: string): void;
45
+ /**
46
+ * The key was pressed and the CALLER MAY NOT KNOW by whom — it picks the right one of the two doors above. The union
47
+ * is demanded EXPLICITLY: whoever knows who pressed keeps calling `markKey`; this one is for whoever receives the
48
+ * answer from someone else (the root's virtual controller, `input/keydown`) and cannot pretend to have it.
49
+ */
50
+ markKeyFrom(code: string, source: TransportName | undefined): void;
51
+ /** The other half. Lets go in both, for the same reason. */
52
+ releaseKey(code: string): void;
53
+ /**
54
+ * Lets go of EVERYTHING — both structures, or the map is left describing keys nobody holds any more. The window's
55
+ * `blur` does NOT use this: see `letGoOfTheKeyboard`.
56
+ */
57
+ releaseAllKeys(): void;
58
+ /**
59
+ * Hands `release` every key THE KEYBOARD holds — the ones the window's `blur` owes a keyup. ⚠️ ONLY THE KEYBOARD'S: a
60
+ * key with no source or the keyboard's own stamp. A camera or voice press does not depend on the window's focus, and
61
+ * letting go of it would take a held position from whoever cannot press it again quickly. It hands out codes and does
62
+ * not release them itself: the release has to travel the road a real keyup travels, which belongs to the root.
63
+ */
64
+ letGoOfTheKeyboard(release: (code: string) => void): void;
65
+ /**
66
+ * Who produced this key? `undefined` when it is not known. ⚠️ NOT A DEFAULT: a `'teclado'` default would read an
67
+ * unsigned key from an unknown producer as the keyboard, and the latch would turn off for whoever plays by gaze.
68
+ */
69
+ sourceOf(code: string): TransportName | undefined;
70
+ /**
71
+ * THIS PLAYER'S TRANSPORT STATE (ADR-0109 · ADR-0113). Never `undefined`: whoever never produced an edge is at the
72
+ * DEFAULT — a player who has not touched anything yet really is on the keyboard with nothing assisted.
73
+ */
74
+ inputOf(player: number): InputState;
75
+ /**
76
+ * AN EDGE FROM THIS PLAYER ARRIVED, with its source. ⚠️ An edge from an assisted transport does NOT enable it — that
77
+ * rule lives in `afterEdge` with its reason: a webcam false positive would lock latching on for everyone.
78
+ */
79
+ playerEdge(player: number, origin: TransportName): void;
80
+ /** Enabling the assisted transports is an EXPLICIT ACT (ADR-0109 rule 4), and so it has its own door. */
81
+ enableAssistedFor(player: number): void;
82
+ disableAssistedFor(player: number): void;
83
+ /**
84
+ * ⚠️ FORGETTING IS A SEPARATE DOOR, AND LETTING GO OF KEYS DOES NOT CALL IT. The child did not change devices by
85
+ * changing tabs; it exists for the end of a MATCH, where the question is asked again.
86
+ */
87
+ forgetInputs(): void;
88
+ /** Gamepad: the actions each pad (by index) holds this frame. The pad↔player assignment lives in `p.pad`. */
89
+ readonly padCur: Record<number, PadState>;
90
+ /** The previous frame's actions per pad — the edge is measured against it. */
91
+ readonly padPrevAct: Record<number, PadState>;
92
+ /** The previous frame's START per pad. */
93
+ readonly padPrevStart: Record<number, boolean>;
94
+ /**
95
+ * Is the player holding the action? keyboard (some code in the pl.ctrl scheme) OR the assigned pad (pl.pad).
96
+ * ⚠️ `?? []` and not a raw `pl.ctrl[act]`: since issue #118 a position the keyboard DOES NOT REACH is a declared
97
+ * `null`. Holding it is `false`, and the pad is asked right after: whoever has a pad reaches what their keyboard does not.
98
+ */
99
+ held(pl: HeldPlayer, act: Action): boolean;
100
+ }
80
101
  /**
81
- * ⚠️ ESQUECER É UMA PORTA SEPARADA, E O `soltarTodas` NÃO A CHAMA — de propósito.
102
+ * BUILDS ONE ROOT'S INPUT STATE. Nothing is shared between two calls: that is the point (ADR-0232 D4, ADR-0142).
82
103
  *
83
- * O `blur` da janela solta as teclas porque elas deixaram mesmo de estar premidas. Mas a criança não trocou
84
- * de aparelho por mudar de separador: zerar o transporte em uso ali devolveria toda a gente ao teclado, e
85
- * quem joga por olhar perderia a alternância no meio da partida sem nada o dizer. Existe para o fim de uma
86
- * PARTIDA, onde a pergunta se põe de novo.
104
+ * ⚠️ THE CONTAINERS ARE CONSTANTS AND ARE MUTATED IN PLACE, as they were: the root, `input/keydown` and `input/gamepad`
105
+ * receive them once, and reassigning one would leave every reader holding the old object.
87
106
  */
88
- export declare function esquecerEntradas(): void;
89
- type PadState = Record<string, boolean>;
90
- export declare const padCur: Record<number, PadState>;
91
- export declare const padPrevAct: Record<number, PadState>;
92
- export declare const padPrevStart: Record<number, boolean>;
93
- export declare const PAD_DEAD = 0.5;
94
- type HeldPlayer = Pick<ControlledPlayer, 'ctrl' | 'pad'>;
95
- export declare const held: (pl: HeldPlayer, act: Action) => boolean;
107
+ export declare function createInputState(): LiveInput;
96
108
  export {};
@@ -1,139 +1,59 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // input/state.ts — ESTADO de input em runtime + query genérica, compartilhado pelos handlers (que ficam no
3
- // game.js e mutam estes objetos IN-PLACE): teclas seguradas (keys), estado de gamepad por controle
4
- // (padCur/padPrevAct/padPrevStart) e a zona morta do analógico (PAD_DEAD). held(pl,act) = o jogador está
5
- // segurando a ação, por teclado (pl.ctrl) OU pelo gamepad associado (pl.pad). Módulo-folha, ZERO deps. (Fase 2.22)
6
- // ⚠️ O cabeçalho deste módulo dizia «ZERO deps», e ele já tinha DUAS de tipo (`ControlledPlayer`, `Action`) —
7
- // a frase queria dizer «nada em tempo de execução», que continua verdade: os três imports são `type` e
8
- // desaparecem no build. A terceira entra pela mesma razão que as outras duas: o vocabulário mora com quem
9
- // tem as REGRAS sobre ele (`input/transporte-em-uso`), e repeti-lo aqui seria a segunda cópia de uma união.
10
- import { PADRAO, aposAresta, habilitarAssistida, desabilitarAssistida, } from './transporte-em-uso.js';
11
- export const keys = new Set();
2
+ // The two above are type-only and vanish in the build. This one is not, and enters for the reason the vocabulary lives
3
+ // where it does: with whoever has the RULES about it (`input/transport-in-use`, a leaf) — repeating it here would be a
4
+ // second copy of a union.
5
+ import { DEFAULT_INPUT_STATE, afterEdge, enableAssisted, disableAssisted, } from './transport-in-use.js';
12
6
  /**
13
- * A ORIGEM DE CADA TECLA SEGURADA — código → aparelho que a produziu (ADR-0109).
7
+ * BUILDS ONE ROOT'S INPUT STATE. Nothing is shared between two calls: that is the point (ADR-0232 D4, ADR-0142).
14
8
  *
15
- * ⚠️ ESTE MAPA EXISTE PORQUE `keys` APAGA A ORIGEM À PORTA, e foi essa erasão que deixou o §C da issue #114
16
- * por construir durante dois meses: o toque escreve códigos aqui dentro (`press()` faz
17
- * `heldKeys.add(codeFor(act))`) e a webcam despacha `KeyboardEvent` sintético, então quando o `held()`
18
- * responde já não há como saber QUEM carregou. O único transporte que sobrevivia identificável era o
19
- * gamepad, e só porque passa por `padCur` em vez do conjunto.
20
- *
21
- * ⚠️ CAMPO NOVO AO LADO DO VELHO, sincronizado num ponto só (`marcarTecla`/`soltarTecla`), com os leitores a
22
- * migrar um a um — é a forma que este repositório já usou no `p.visual` ao lado do `p.viz` (#104), e a razão
23
- * é a mesma: uma troca de uma vez não tem estado verde onde parar, e isto é a espinha da entrada.
24
- *
25
- * 📌 Um código SEM entrada aqui não é um erro de dados — é uma tecla que entrou por um escritor que ainda não
26
- * migrou. `origemDe` devolve `undefined` e quem pergunta decide; ver a nota lá.
27
- */
28
- export const origemDaTecla = new Map();
29
- /**
30
- * Uma tecla FOI SEGURADA, e sabe-se por quem. É o único sítio que escreve nos dois.
31
- *
32
- * ⚠️ OS DOIS JUNTOS OU NENHUM: enquanto forem duas estruturas, elas podem divergir, e uma divergência aqui é
33
- * silenciosa — o jogo continua a andar e só a alternância fica errada. Por isso não há `keys.add` público
34
- * neste módulo: quem escreve, escreve por aqui.
35
- */
36
- export function marcarTecla(code, origem) {
37
- keys.add(code);
38
- origemDaTecla.set(code, origem);
39
- }
40
- /**
41
- * A tecla foi segurada e NÃO SE SABE por quem. A porta estreita, e ela é estreita de propósito.
42
- *
43
- * ⚠️ POR QUE UMA FUNÇÃO COM OUTRO NOME E NÃO UM SEGUNDO PARÂMETRO OPCIONAL. `marcarTecla(code)` com a origem
44
- * omitida é o que se escreve quando não se pensou; `marcarTeclaSemOrigem(code)` é o que se escreve quando se
45
- * pensou e a resposta é «não sei». O tipo não distingue as duas, mas o nome distingue — e é o nome que
46
- * aparece na revisão. Um parâmetro esquecido não se lê; uma função assim chamada lê-se de longe.
47
- *
48
- * ⚠️ E O `delete` É A METADE QUE IMPORTA, não o `add`. Sem ele, uma tecla premida de novo por uma fonte
49
- * desconhecida HERDAVA a origem da vez anterior: a criança joga por olhar, larga a tecla, um script de fora
50
- * despacha o mesmo código, e a alternância continua a responder «olhos» a uma aresta que já não é dela. Um
51
- * mapa que guarda a resposta certa de ontem é pior do que um que não guarda nada.
52
- *
53
- * 📌 Hoje há UM chamador — o `input/keydown`, para o evento sintético que ninguém assinou. Depois desta
54
- * migração nada nesta engine produz um; quem produz é código de consumidor, e é para ele que esta porta fica
55
- * aberta. Fechá-la faria a tecla dele simplesmente não funcionar, o que é uma quebra pior do que não saber.
56
- */
57
- export function marcarTeclaSemOrigem(code) {
58
- keys.add(code);
59
- origemDaTecla.delete(code);
60
- }
61
- /** A outra metade. Solta nos dois, pela mesma razão. */
62
- export function soltarTecla(code) {
63
- keys.delete(code);
64
- origemDaTecla.delete(code);
65
- }
66
- /** Solta TUDO — o `blur` da janela. Os dois, ou o mapa fica a descrever teclas que já ninguém segura. */
67
- export function soltarTodas() {
68
- keys.clear();
69
- origemDaTecla.clear();
70
- }
71
- /**
72
- * Quem produziu esta tecla? `undefined` quando não se sabe.
73
- *
74
- * ⚠️ `undefined` E NÃO UM PADRÃO. Um padrão `'teclado'` faria a erasão voltar por outra porta: uma tecla do
75
- * toque que entrasse por um escritor não migrado seria lida como teclado, a alternância desligava-se, e nada
76
- * o diria. Não saber é uma resposta; fingir que se sabe não é.
77
- */
78
- export function origemDe(code) {
79
- return origemDaTecla.get(code);
80
- }
81
- // ===================== O TRANSPORTE EM USO, POR JOGADOR (ADR-0109 · ADR-0113) =====================
82
- //
83
- // ⚠️ AQUI E NÃO NO `PlayerBase`, e a escolha é medida. O autómato responde «que aparelho está a produzir as
84
- // arestas deste jogador» — isso é estado de ENTRADA, e a entrada já guarda estado por jogador neste módulo
85
- // exactamente com esta forma: o `padCur` logo abaixo é um `Record<number, …>`. Pô-lo no `PlayerBase` faria
86
- // dele parte do CONTRATO, e trezentos cartuchos passariam a declarar um campo sobre o qual não decidem nada.
87
- //
88
- // 📌 O que o jogador CARREGA é a alternância resolvida (`toggleMove`), que é o que a física lê. Este mapa é
89
- // o que está a montante dela: com ele e com o `input/latch-store`, a resposta do ADR-0113 fica completa.
90
- const entradaPorJogador = {};
91
- /**
92
- * O ESTADO DA ENTRADA DESTE JOGADOR. Nunca `undefined`: quem nunca produziu uma aresta está no PADRÃO.
93
- *
94
- * ⚠️ `PADRAO` E NÃO `undefined`, pela mesma razão que o `origemDe` faz o contrário: ali «não sei» é uma
95
- * resposta honesta sobre uma tecla que já existe; aqui a pergunta é sobre um JOGADOR, e um jogador que
96
- * ainda não tocou em nada está mesmo no teclado sem assistida — que é o que `PADRAO` diz.
97
- */
98
- export function entradaDe(jogador) {
99
- return entradaPorJogador[jogador] ?? PADRAO;
100
- }
101
- /**
102
- * UMA ARESTA DESTE JOGADOR CHEGOU, com a sua origem.
103
- *
104
- * 📌 O `aposAresta` devolve o MESMO objecto quando nada muda, então guardar de volta não aloca por quadro.
105
- * ⚠️ E uma aresta de um transporte assistido NÃO o habilita — essa regra vive no `aposAresta` e a razão
106
- * está lá: um falso positivo da webcam trancaria a alternância de toda a gente sem ninguém ter pedido.
107
- */
108
- export function arestaDoJogador(jogador, origem) {
109
- entradaPorJogador[jogador] = aposAresta(entradaDe(jogador), origem);
110
- }
111
- /** Habilitar a assistida é um ACTO EXPLÍCITO (ADR-0109 regra 4), e por isso tem porta própria. */
112
- export function habilitarAssistidaDe(jogador) {
113
- entradaPorJogador[jogador] = habilitarAssistida(entradaDe(jogador));
114
- }
115
- export function desabilitarAssistidaDe(jogador) {
116
- entradaPorJogador[jogador] = desabilitarAssistida(entradaDe(jogador));
117
- }
118
- /**
119
- * ⚠️ ESQUECER É UMA PORTA SEPARADA, E O `soltarTodas` NÃO A CHAMA — de propósito.
120
- *
121
- * O `blur` da janela solta as teclas porque elas deixaram mesmo de estar premidas. Mas a criança não trocou
122
- * de aparelho por mudar de separador: zerar o transporte em uso ali devolveria toda a gente ao teclado, e
123
- * quem joga por olhar perderia a alternância no meio da partida sem nada o dizer. Existe para o fim de uma
124
- * PARTIDA, onde a pergunta se põe de novo.
9
+ * ⚠️ THE CONTAINERS ARE CONSTANTS AND ARE MUTATED IN PLACE, as they were: the root, `input/keydown` and `input/gamepad`
10
+ * receive them once, and reassigning one would leave every reader holding the old object.
125
11
  */
126
- export function esquecerEntradas() {
127
- for (const k of Object.keys(entradaPorJogador))
128
- delete entradaPorJogador[Number(k)];
12
+ export function createInputState() {
13
+ const keys = new Set();
14
+ const keySource = new Map();
15
+ // ⚠️ HERE AND NOT ON `PlayerBase`: the automaton answers "which device is producing this player's edges" — INPUT
16
+ // state, kept per player in exactly the shape `padCur` has. On `PlayerBase` every cartridge would have to declare a
17
+ // field it decides nothing about.
18
+ const inputByPlayer = {};
19
+ const padCur = {};
20
+ const padPrevAct = {};
21
+ const padPrevStart = {};
22
+ function markKey(code, origin) {
23
+ keys.add(code);
24
+ keySource.set(code, origin);
25
+ }
26
+ function markKeyWithoutSource(code) {
27
+ keys.add(code);
28
+ keySource.delete(code);
29
+ }
30
+ function inputOf(player) {
31
+ return inputByPlayer[player] ?? DEFAULT_INPUT_STATE;
32
+ }
33
+ return {
34
+ keys, keySource, padCur, padPrevAct, padPrevStart,
35
+ markKey, markKeyWithoutSource,
36
+ markKeyFrom(code, source) { if (source)
37
+ markKey(code, source);
38
+ else
39
+ markKeyWithoutSource(code); },
40
+ releaseKey(code) { keys.delete(code); keySource.delete(code); },
41
+ releaseAllKeys() { keys.clear(); keySource.clear(); },
42
+ letGoOfTheKeyboard(release) {
43
+ for (const code of [...keys]) {
44
+ const source = keySource.get(code);
45
+ if (!source || source === 'teclado')
46
+ release(code);
47
+ }
48
+ },
49
+ sourceOf: (code) => keySource.get(code),
50
+ inputOf,
51
+ // 📌 `afterEdge` returns the SAME object when nothing changes, so storing it back allocates nothing per frame.
52
+ playerEdge(player, origin) { inputByPlayer[player] = afterEdge(inputOf(player), origin); },
53
+ enableAssistedFor(player) { inputByPlayer[player] = enableAssisted(inputOf(player)); },
54
+ disableAssistedFor(player) { inputByPlayer[player] = disableAssisted(inputOf(player)); },
55
+ forgetInputs() { for (const k of Object.keys(inputByPlayer))
56
+ delete inputByPlayer[Number(k)]; },
57
+ held: (pl, act) => (pl.ctrl[act] ?? []).some((k) => keys.has(k)) || (pl.pad >= 0 && !!padCur[pl.pad]?.[act]),
58
+ };
129
59
  }
130
- export const padCur = {};
131
- export const padPrevAct = {};
132
- export const padPrevStart = {};
133
- export const PAD_DEAD = 0.5; // zona morta = primeira METADE do curso do analógico (ergonomia — José 2026-07-02)
134
- // Jogador está segurando a ação? teclado (algum code do esquema pl.ctrl) OU o gamepad associado (pl.pad).
135
- // ⚠️ `?? []` e não `pl.ctrl[act]` cru: desde a issue #118 uma posição que o teclado NÃO ALCANÇA é um `null`
136
- // declarado — num teclado partido por quatro não há lugar físico para ombros e gatilhos. Segurar uma ação
137
- // que o teclado não alcança é `false`, e o gamepad continua a ser perguntado logo a seguir: quem tem pad
138
- // alcança o que o teclado dele não alcança, que é o ponto de haver dois transportes.
139
- export const held = (pl, act) => (pl.ctrl[act] ?? []).some((k) => keys.has(k)) || (pl.pad >= 0 && !!padCur[pl.pad]?.[act]);
@@ -0,0 +1,59 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import type { Action } from '../core/actions.js';
3
+ /** The safe item: taking it commands nothing. Same word the gaze cycle uses, and the same job. */
4
+ export declare const SCAN_CANCEL = "cancel";
5
+ /** What a scan offers: the items it was given — positions in play, a menu's steps in a menu — and «cancel» in front. */
6
+ export type ScanItem<T extends string = Action> = T | typeof SCAN_CANCEL;
7
+ export interface SwitchScanOptions {
8
+ /** How long each item is offered. 1 s is the gaze cycle's step, which the Dev ran for a day (ADR-0213). */
9
+ readonly stepMs?: number;
10
+ /** How long the taken action stays pressed, so a game and a menu see a normal press and release. */
11
+ readonly pulseMs?: number;
12
+ }
13
+ export declare const SWITCH_SCAN_DEFAULTS: {
14
+ readonly stepMs: 1000;
15
+ readonly pulseMs: 400;
16
+ };
17
+ /**
18
+ * THE ENGINE'S OWN DOORS, and whether each has something behind it (ADR-0218 §3). A door with nothing behind it is not offered:
19
+ * a cycle never stops on a position that does nothing (ADR-0155).
20
+ */
21
+ export interface ScanDoors {
22
+ /** The card SELECT opens is mounted. */
23
+ readonly menus: boolean;
24
+ /** The quick pause START opens has its bar — the menu the scan steps there, and «back» is how it is left. */
25
+ readonly quickPause: boolean;
26
+ }
27
+ /**
28
+ * What the scan offers IN PLAY after «cancel»: the game's named positions, then the doors in the order ADR-0218 §3 names them —
29
+ * the menus (SELECT), then the quick pause (START). Taking a door presses it on the virtual controller, which hands it to the
30
+ * engine as its keys are.
31
+ */
32
+ export declare function playScanList(game: readonly Action[], doors: ScanDoors): readonly Action[];
33
+ export interface ScanFrame {
34
+ /** Her switch went down on this frame. Whatever sends it — a key, a touch, a gesture, a word. */
35
+ readonly press?: boolean;
36
+ }
37
+ export interface ScanOutput<T extends string = Action> {
38
+ /** The item being pressed, for `pulseMs` after it was taken. */
39
+ readonly pressed: T | null;
40
+ /** The item taken on THIS frame — what a caller turns into a press. */
41
+ readonly commanded: T | null;
42
+ /** What is being offered right now, and where it sits in the list. Never `null`: something is always showing. */
43
+ readonly showing: {
44
+ readonly item: ScanItem<T>;
45
+ readonly index: number;
46
+ };
47
+ }
48
+ export interface SwitchScan<T extends string = Action> {
49
+ (nowMs: number, frame?: ScanFrame): ScanOutput<T>;
50
+ }
51
+ /**
52
+ * The scanner. `actions` is what is offered now — in play this game's declared positions and the engine's own doors, in a menu
53
+ * that menu's steps — and `cancel` is put in front of them.
54
+ *
55
+ * ⚠️ An empty list is not an error: a game that declared nothing leaves a scan of one item, `cancel`, and a press takes nothing.
56
+ * The alternative — offering the whole controller to a game that reads none of it — is the dead button ADR-0106 §5 refuses, and
57
+ * here it would cost a child a full pass of fourteen items to reach the one thing that works.
58
+ */
59
+ export declare function createSwitchScan<T extends string = Action>(actions: readonly T[], options?: SwitchScanOptions): SwitchScan<T>;
@@ -0,0 +1,67 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // input/switch-scan — PLAYING WITH ONE BUTTON: the machine offers, the child takes (ADR-0218, issue #201).
3
+ //
4
+ // The Dev, 2026-09-21: «vamos ciclar entre controle padrão > teclas de aderência > jogar com um botão só». This module is the
5
+ // third position, and it answers a different question from the second one. Sticky keys are about HOW LONG a press lasts — the
6
+ // child taps instead of holding, and still has to reach every position. This is about HOW MANY inputs exist in the world: with
7
+ // one switch, fourteen positions cannot be reached at all, so the controller stops being fourteen places and becomes one place
8
+ // plus TIME. It is scanning, the technique switch access has used since long before this engine.
9
+ //
10
+ // 🎯 THE FIRST ITEM IS «CANCEL», AND IT IS ALSO THE PROTECTION. A press that lands by accident has to be able to mean nothing;
11
+ // and because the scan RESTARTS on cancel after every press, a hand that bounces twice takes cancel the second time. That is why
12
+ // there is no dead time here: the restart already is one, and it costs the child nothing to explain.
13
+ //
14
+ // ⚠️ This module knows nothing about keys, switches or pixels. It is given a list and a clock, and it says what is showing and
15
+ // what a press just took — the same division that let `input/gaze-cycle` be tested without a camera.
16
+ //
17
+ // MUTATIONS CHECKED: `tests/switch-scan.node.test.js`.
18
+ /** The safe item: taking it commands nothing. Same word the gaze cycle uses, and the same job. */
19
+ export const SCAN_CANCEL = 'cancel';
20
+ export const SWITCH_SCAN_DEFAULTS = { stepMs: 1000, pulseMs: 400 };
21
+ /**
22
+ * What the scan offers IN PLAY after «cancel»: the game's named positions, then the doors in the order ADR-0218 §3 names them —
23
+ * the menus (SELECT), then the quick pause (START). Taking a door presses it on the virtual controller, which hands it to the
24
+ * engine as its keys are.
25
+ */
26
+ export function playScanList(game, doors) {
27
+ const list = [...game];
28
+ if (doors.menus)
29
+ list.push('select');
30
+ if (doors.quickPause)
31
+ list.push('start');
32
+ return list;
33
+ }
34
+ /**
35
+ * The scanner. `actions` is what is offered now — in play this game's declared positions and the engine's own doors, in a menu
36
+ * that menu's steps — and `cancel` is put in front of them.
37
+ *
38
+ * ⚠️ An empty list is not an error: a game that declared nothing leaves a scan of one item, `cancel`, and a press takes nothing.
39
+ * The alternative — offering the whole controller to a game that reads none of it — is the dead button ADR-0106 §5 refuses, and
40
+ * here it would cost a child a full pass of fourteen items to reach the one thing that works.
41
+ */
42
+ export function createSwitchScan(actions, options = {}) {
43
+ const o = { ...SWITCH_SCAN_DEFAULTS, ...options };
44
+ const items = [SCAN_CANCEL, ...actions];
45
+ let startedAt = null;
46
+ let pressed = null, pressedAt = 0;
47
+ return (now, frame = {}) => {
48
+ startedAt ??= now;
49
+ const stepMs = Math.max(1, o.stepMs);
50
+ const index = items.length < 2 ? 0 : Math.floor((now - startedAt) / stepMs) % items.length;
51
+ let commanded = null;
52
+ if (frame.press) {
53
+ const item = items[index];
54
+ if (item !== SCAN_CANCEL) {
55
+ commanded = item;
56
+ pressed = item;
57
+ pressedAt = now;
58
+ }
59
+ // 📌 EVERY PRESS RESTARTS THE PASS, taken or not: the next thing offered is «cancel», never the neighbour of what she just
60
+ // took. Without it a second bounce of the same hand would take the item beside the one she chose.
61
+ startedAt = now;
62
+ }
63
+ if (pressed && now - pressedAt >= o.pulseMs)
64
+ pressed = null;
65
+ return { pressed, commanded, showing: { item: items[index], index } };
66
+ };
67
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import type { TransportName } from './transport-in-use.js';
3
+ /**
4
+ * The property hung on the event.
5
+ *
6
+ * 📌 Prefixed and ugly on purpose: it is an expando on an object that is not ours, and a short name could collide with
7
+ * another library's without anything saying so.
8
+ */
9
+ export declare const SOURCE_KEY = "__vpOrigem";
10
+ /**
11
+ * The minimum this module reads from a key event — STRUCTURAL, so a real `KeyboardEvent` and a test double both serve.
12
+ *
13
+ * ⚠️ `isTrusted` is OPTIONAL, and its absence is not `false` by accident: a double that does not declare it is saying "I
14
+ * asserted nothing about this", and the right answer to that is `undefined`, not the keyboard. The same rule as
15
+ * `input/state`'s `sourceOf`, one layer up.
16
+ */
17
+ export interface KeyEventLike {
18
+ readonly isTrusted?: boolean;
19
+ }
20
+ /**
21
+ * DECLARES that this event came from that device. Returns the event itself, so the dispatch fits on one line.
22
+ *
23
+ * ⚠️ Stamp it BEFORE dispatching. After `dispatchEvent` the listeners have already run, and the stamp would reach an
24
+ * event nobody reads any more.
25
+ */
26
+ export declare function stampSource<T extends object>(ev: T, source: TransportName): T;
27
+ /**
28
+ * WHO PRODUCED THIS EVENT? `undefined` when it is not known.
29
+ *
30
+ * The whole rule, in three lines and in this order:
31
+ *
32
+ * 1. **A valid stamp wins.** An explicit declaration always beats an inference — inverting it would make a REAL event
33
+ * someone remapped (a pedal, a sip-and-puff switch that emits real keys) read as the keyboard, erasing exactly the
34
+ * information whoever stamped it took the trouble to put there.
35
+ * 2. **No stamp but trusted → `'teclado'`.** That is what `isTrusted` means: the browser saw the person press. It is the
36
+ * one inference this module makes, and it makes it on the property that cannot be forged.
37
+ * 3. **No stamp and not trusted → `undefined`.** A synthetic event nobody signed. Nothing in this engine produces one;
38
+ * code from outside does, and code from outside did not declare. ⚠️ Returning the keyboard here would be the erasure
39
+ * coming back another way, the defect the whole of ADR-0109 exists to close — and worse than the original, because
40
+ * it would have the shape of an answer.
41
+ */
42
+ export declare function sourceOfEvent(ev: KeyEventLike): TransportName | undefined;