@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
@@ -0,0 +1,57 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // input/synthetic-source.ts — WHO DISPATCHED THIS KEY, when it was not a finger on a keyboard (ADR-0109).
3
+ //
4
+ // ========================= THE HARD PART OF THE EDGE, AND IT WAS NAMED =========================
5
+ // The gate `tests/the-keys-source-survives-the-door` has named it since the funnel began: a synthetic `KeyboardEvent`
6
+ // enters through `keydown` and would be stamped as the keyboard — the erasure coming back through the front door. Today
7
+ // the engine's only synthetic key is the menu key the pad and the virtual controller hand to the menus.
8
+ //
9
+ // `isTrusted` tells PRESSED from DISPATCHED — the one property a script cannot forge — but not WHICH assisted transport
10
+ // dispatched it. That has to arrive DECLARED, and that is what this module is.
11
+ //
12
+ // ⚠️ WHY THE STAMP TRAVELS ON THE EVENT, and not in an injected "what is the synthetic source now?". The injected answer
13
+ // is GLOBAL state, and input is not global: a child playing by gaze with an adult pressing a key beside them produces both
14
+ // edges at the same instant, and global state would stamp both as gaze. The event cannot be confused with itself — the
15
+ // origin travels with the edge it belongs to, the same reason the key source is a map by CODE and not a single field.
16
+ //
17
+ // 📌 And it is additive by construction: an unstamped event still works. That is what let the writers migrate one at a
18
+ // time without a single red commit in between.
19
+ import { isTransportName } from './transport-in-use.js';
20
+ /**
21
+ * The property hung on the event.
22
+ *
23
+ * 📌 Prefixed and ugly on purpose: it is an expando on an object that is not ours, and a short name could collide with
24
+ * another library's without anything saying so.
25
+ */
26
+ export const SOURCE_KEY = '__vpOrigem';
27
+ /**
28
+ * DECLARES that this event came from that device. Returns the event itself, so the dispatch fits on one line.
29
+ *
30
+ * ⚠️ Stamp it BEFORE dispatching. After `dispatchEvent` the listeners have already run, and the stamp would reach an
31
+ * event nobody reads any more.
32
+ */
33
+ export function stampSource(ev, source) {
34
+ ev[SOURCE_KEY] = source;
35
+ return ev;
36
+ }
37
+ /**
38
+ * WHO PRODUCED THIS EVENT? `undefined` when it is not known.
39
+ *
40
+ * The whole rule, in three lines and in this order:
41
+ *
42
+ * 1. **A valid stamp wins.** An explicit declaration always beats an inference — inverting it would make a REAL event
43
+ * someone remapped (a pedal, a sip-and-puff switch that emits real keys) read as the keyboard, erasing exactly the
44
+ * information whoever stamped it took the trouble to put there.
45
+ * 2. **No stamp but trusted → `'teclado'`.** That is what `isTrusted` means: the browser saw the person press. It is the
46
+ * one inference this module makes, and it makes it on the property that cannot be forged.
47
+ * 3. **No stamp and not trusted → `undefined`.** A synthetic event nobody signed. Nothing in this engine produces one;
48
+ * code from outside does, and code from outside did not declare. ⚠️ Returning the keyboard here would be the erasure
49
+ * coming back another way, the defect the whole of ADR-0109 exists to close — and worse than the original, because
50
+ * it would have the shape of an answer.
51
+ */
52
+ export function sourceOfEvent(ev) {
53
+ const declared = ev[SOURCE_KEY];
54
+ if (isTransportName(declared))
55
+ return declared;
56
+ return ev.isTrusted ? 'teclado' : undefined;
57
+ }
@@ -1,158 +1,147 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import type { Transporte } from './transporte-em-uso.js';
2
+ import type { TransportName } from './transport-in-use.js';
3
3
  import { type RectLike } from './pointer-space.js';
4
4
  import type { PlayerView } from '../core/entity.js';
5
5
  import type { DomQuery } from '../core/dom-query.js';
6
6
  import type { KeyScheme } from '../core/entity.js';
7
- export type { DomQuery } from '../core/dom-query.js';
8
- /** ação -> lista de códigos físicos. Cópia ESTRUTURAL do `KeyScheme` de `input/keyboard-runtime.ts` — a casa
9
- * prefere a cópia a puxar um alias de tipo através de camadas (mesmo precedente de `input/keydown.ts`). */
10
- export type { KeyScheme } from '../core/entity.js';
11
- /** As seis bordas de entrada que o toque levanta no jogador (consumidas e zeradas pela física). */
7
+ import { type Action } from '../core/actions.js';
8
+ /** The six input edges touch raises on the player (consumed and cleared by the game's physics). */
12
9
  export type EdgeFlag = 'jumpEdge' | 'runEdge' | 'leftEdge' | 'rightEdge' | 'swapEdge' | 'specialEdge';
13
- /** Uma borda a levantar: qual jogador (POSIÇÃO no array) e qual flag. */
10
+ /** An edge to raise: which player (POSITION in the array) and which flag. */
14
11
  export interface EdgeRaise {
15
12
  playerIndex: number;
16
13
  edge: EdgeFlag;
17
14
  }
18
- /** O que este módulo lê (e escreve) de um jogador — e SÓ isso. DERIVADA de core/entity.
19
- * `easy`: quem está no modo Fácil não levanta `runEdge`, e portanto não gruda na parede — a mesma regra do
20
- * teclado e do controle, que é justamente a que divergiu em três cópias uma vez. Ver o cabeçalho. */
21
- export type TouchBindPlayer = PlayerView<'ctrl' | 'easy' | 'jumpEdge' | 'runEdge' | 'leftEdge' | 'rightEdge' | 'swapEdge' | 'specialEdge'>;
22
- /** TUDO o que a decisão precisa saber do mundo, num objeto só, montado ANTES de qualquer efeito. */
15
+ /** What this module reads (and writes) of a player — and ONLY that. DERIVED from core/entity.
16
+ * `easy`: whoever is in Easy mode raises no `runEdge`, and so does not cling to the wall — the same rule as the
17
+ * keyboard and the pad, which is exactly the one that once drifted across three copies. See the header. */
18
+ export type TouchBindPlayer = PlayerView<'ctrl'> & Partial<PlayerView<'easy' | 'jumpEdge' | 'runEdge' | 'leftEdge' | 'rightEdge' | 'swapEdge' | 'specialEdge'>>;
19
+ /** EVERYTHING the decision needs to know about the world, in one object, built BEFORE any effect. */
23
20
  export interface TouchBindSnapshot {
24
- /** `kbRuntime.controlsState().controls` — o esquema do Jogador 1 (remapeável). É dele, e só dele, que sai a
25
- * tecla que o botão da tela injeta: o toque é sempre o J1, mesmo em multi-tela. */
21
+ /** Player 1's scheme (remappable). The key a screen button holds comes from it, and only it: touch is always P1,
22
+ * even with several screens. */
26
23
  controls: KeyScheme;
27
- /** o array vivo de jogadores: as bordas são levantadas em TODOS que tenham o código no próprio esquema. */
24
+ /** the live array of players: edges are raised on ALL who have the code in their own scheme. */
28
25
  players: readonly TouchBindPlayer[];
29
- /** `keys` de `input/state.ts`: as teclas seguradas AGORA (teclado, toque e webcam, misturados). */
26
+ /** `input/state.ts`'s `keys`: the keys held NOW (every transport's, mixed). */
30
27
  heldKeys: ReadonlySet<string>;
31
28
  }
32
- /** Reexportado: a definicao passou a viver em `input/pointer-space`, com a conta que a usa (issue #105). */
33
- export type { RectLike } from './pointer-space.js';
34
- /** As quatro direções físicas do direcional, ligadas ou não. */
29
+ /** The d-pad's four physical directions, on or off. */
35
30
  export interface DirSet {
36
31
  left: boolean;
37
32
  right: boolean;
38
33
  up: boolean;
39
34
  down: boolean;
40
35
  }
41
- /** Um evento de ponteiro, reduzido ao que este módulo lê (`PointerEvent` real é atribuível a isto). */
36
+ /** A pointer event, reduced to what this module reads (a real `PointerEvent` is assignable to this). */
42
37
  export interface PointerLike {
43
38
  pointerId: number;
44
39
  clientX: number;
45
40
  clientY: number;
46
41
  preventDefault(): void;
47
42
  }
48
- /** A resposta única: o que este toque SIGNIFICA. */
43
+ /**
44
+ * The single answer: what this touch MEANS.
45
+ *
46
+ * 🔴 THE CURRENCY OF THIS DECISION IS THE POSITION, NOT THE KEY (ADR-0223). Touch PRESSES the virtual controller, the
47
+ * single door, and the key is an effect of the press written in one place — a screen button that pretended to be the
48
+ * keyboard never reached a cartridge that listens to `onCommand`, because the root's window listener leaves `toque`
49
+ * out.
50
+ *
51
+ * ⚠️ AND A POSITION WITH NO MAPPED KEY IS NOT A `noop`. The map is the GAME's, not the keyboard's (ADR-0111), so a
52
+ * position the cartridge declared reaches it even if the child has no key for it.
53
+ */
49
54
  export type TouchDecision =
50
- /** ação sem tecla mapeada, slot vazio, ou SOLTAR de `pause` — nada acontece. */
55
+ /** an empty slot, an action that does not exist, or RELEASING `pause` — nothing happens. */
51
56
  {
52
57
  kind: 'noop';
53
58
  }
54
- /** `pause` é o único caso especial: não vira tecla, chama `togglePause()` direto (e só no APERTAR). */
59
+ /** `pause` is the only special case: it is not a position, it calls `togglePause()` directly (and only on PRESS). */
55
60
  | {
56
61
  kind: 'pause';
57
62
  }
58
- /** apertar. `addKey=false` = a tecla JÁ estava segurada (outro dedo, ou o teclado): não re-injeta nem
59
- * levanta borda de novo — é isso que faz disto uma BORDA e não um estado. `hideTips` é independente. */
63
+ /** press. `addKey=false` = the key was ALREADY held (another finger, or the keyboard): no edge is raised again — that
64
+ * is what makes this an EDGE and not a state. `hideTips` is independent. */
60
65
  | {
61
66
  kind: 'press';
62
- code: string;
67
+ action: Action;
63
68
  addKey: boolean;
64
69
  edges: EdgeRaise[];
65
70
  hideTips: boolean;
66
71
  }
67
- /** soltar: some com o código do conjunto. NÃO abaixa borda nenhuma (quem zera as bordas é a física). */
72
+ /** release. It lowers NO edge (the game's physics clears the edges). */
68
73
  | {
69
74
  kind: 'release';
70
- code: string;
75
+ action: Action;
71
76
  };
72
- /**
73
- * Ação → borda, na MESMA ordem das outras duas cópias do projeto.
74
- * ⚠️ TERCEIRA CÓPIA DE UMA TABELA QUE JÁ EXISTE DUAS VEZES — `input/keydown.ts` (`EDGE_BY_ACTION`) e
75
- * `input/gamepad.ts` (seis `if` dentro de `pollPads`). Ver o bloco de aviso no cabeçalho: as três não
76
- * concordam sobre o modo Fácil, e a divergência está PRESERVADA de propósito.
77
- */
77
+ /** Action → edge: the ONE table keyboard, pad and touch share (`input/edges`), re-exported under touch's old name. */
78
78
  export { EDGE_BY_ACTION as TOUCH_EDGE_BY_ACTION } from './edges.js';
79
- /** `?touch=1` na URL força os controles de toque a aparecerem no desktop (atalho de teste do José). */
80
- export declare const TOUCH_FORCE_RE: RegExp;
81
- /** Predicado do `?touch=1`, isolado para o teste não repetir o regex. */
79
+ /** The `?touch=1` predicate, isolated so the test does not repeat the regex. */
82
80
  export declare function wantsForcedTouch(search: string): boolean;
83
81
  /**
84
- * Que TECLA este botão de tela finge apertar? A 1ª do esquema do Jogador 1 para aquela ação — 1ª, e não
85
- * todas, porque só uma precisa entrar em `keys` para o jogo inteiro reagir. Remapear o teclado remapeia o
86
- * toque junto, de graça: é a mesma tabela.
87
- * `null` = a ação não existe no esquema (ou o slot do mapa de toque está vazio) → o toque não faz nada.
82
+ * Which KEY does this screen button's position hold? The 1st in Player 1's scheme for that action — the 1st and not all,
83
+ * because only one has to enter `keys` for the whole game to react. Remapping the keyboard remaps touch along with it,
84
+ * for free: it is the same table.
85
+ * `null` = the action is not in the scheme (or the touch map's slot is empty) → no key, and so no edge.
88
86
  */
89
87
  export declare function codeForAction(act: string | undefined | null, controls: KeyScheme): string | null;
90
88
  /**
91
- * As bordas que este toque levanta, e em quem.
89
+ * The edges this touch raises, and on whom.
92
90
  *
93
- * ⚠️ SEM A GUARDA DO MODO FÁCIL — VERBATIM DO main.js, DEFEITO PRESERVADO.
94
- * `input/keydown.ts:edgesFor` pula `run` quando `p.easy` ("Fácil: sem correr"); `input/gamepad.ts:pollPads`
95
- * também (`if (edge('run') && !p.easy)`). Este caminho NÃO pula. Como `runEdge` é o gatilho de grudar/soltar
96
- * da parede (`game/physics.ts:177` e `:179`), e não a velocidade de corrida, o efeito prático é que no modo
97
- * Fácil a escalada existe pelo botão da tela e não existe pelo teclado nem pelo controle.
98
- * NÃO acrescente a guarda aqui sem consertar as três cópias de uma vez — ver o cabeçalho.
91
+ * WITH THE EASY-MODE GUARD (`edgeAllowed`, from `input/edges`), the same as the keyboard and the pad: `runEdge` is the
92
+ * trigger that clings to and lets go of a wall, not running speed, so without the guard a child in Easy mode could
93
+ * climb by the screen button and not by keyboard or pad.
99
94
  *
100
- * ÚNICO DESVIO DE LITERALIDADE, declarado: `p.ctrl[a] || []`. O original alcançava `p.ctrl.jump`/`.run`/
101
- * `.left`/`.right` DIRETO (e estouraria num esquema sem a ação), enquanto guardava `swap` e `especial` com
102
- * `&&` — assimetria sem intenção. Trocar um TypeError por um no-op não remove rede de conserto nenhuma; é o
103
- * mesmo precedente que `input/keydown.ts:edgesFor` já abriu, e está anotado lá pelo mesmo motivo.
95
+ * `p.ctrl[a] || []` and not a raw `p.ctrl[a]`: a scheme without the action turns a TypeError into a no-op — the same
96
+ * choice `input/keydown`'s `edgesFor` makes, for the same reason.
104
97
  */
105
98
  export declare function touchEdgesFor(act: string, code: string, players: readonly TouchBindPlayer[]): EdgeRaise[];
106
99
  /**
107
- * A DECISÃO. Gesto (ação mapeada + apertar/soltar) + mundo → o que isso significa.
108
- * `pause` primeiro, porque é o único que não passa pelo teclado sintético. Depois a tecla; sem tecla, nada.
100
+ * THE DECISION. A gesture (mapped action + press/release) + the world → what it means.
101
+ * `pause` first, because it is the only one that is not a position. Then the position and its key; without a key, the
102
+ * press still happens, with no edge.
109
103
  */
110
104
  export declare function decideTouch(act: string | undefined | null, on: boolean, s: TouchBindSnapshot): TouchDecision;
111
- /** Zona morta da CRUZ: ~18% do LADO a partir do centro, em cada eixo. Ver a nota de `crossDirsAt` sobre o
112
- * `width` valer também para o eixo vertical — é verbatim, e é uma assimetria de verdade. */
105
+ /** The CROSS's dead zone: ~18% of the SIDE from the centre, on each axis. See the note on `crossDirsAt` about `width`
106
+ * also counting for the vertical axis — it is a real asymmetry. */
113
107
  export declare const CROSS_DEAD_FRACTION = 0.18;
114
108
  /**
115
- * Cruz (D-pad): onde o dedo está → quais direções ligam. Miolo neutro para não disparar por encostar no meio.
116
- * As quatro comparações são INDEPENDENTES: fora do miolo, uma diagonal liga DUAS direções (é o que dá o
117
- * comportamento de D-pad físico de 8 setores). O centro exato não liga nenhuma.
109
+ * Cross (D-pad): where the finger is → which directions turn on. A neutral core so brushing the middle does not fire.
110
+ * The four comparisons are INDEPENDENT: outside the core, a diagonal turns on TWO directions (which gives a physical
111
+ * 8-sector D-pad's behaviour). The exact centre turns on none.
118
112
  *
119
- * VERBATIM, incluindo a assimetria: a zona morta dos DOIS eixos sai de `rect.width` — a altura nunca entra na
120
- * conta. Numa cruz quadrada (é o que o CSS `--dpad-span` produz) dá no mesmo; numa cruz achatada, o miolo
121
- * vertical ficaria proporcionalmente maior ou menor que o horizontal. Anotado, não consertado.
113
+ * Including the asymmetry: both axes' dead zone comes from `rect.width` — the height never enters. On a square cross
114
+ * (what the CSS `--dpad-span` produces) it is the same; on a flattened one, the vertical core would be proportionally
115
+ * larger or smaller than the horizontal. Noted, not fixed.
122
116
  */
123
117
  export declare function crossDirsAt(px: number, py: number, rect: RectLike): DirSet;
124
118
  /**
125
- * Analógico virtual: mesma regra da cruz, mas a zona morta vem em PX de `input/touch.ts` (derivada dos mm
126
- * configuráveis — A12e motora), não de uma fração do elemento.
119
+ * Virtual stick: the cross's rule, but the dead zone comes in PX from `input/touch.ts` (derived from the configurable
120
+ * mm), not as a fraction of the element.
127
121
  */
128
122
  export declare function stickDirsAt(px: number, py: number, rect: RectLike, deadPx: number): DirSet;
129
123
  /**
130
- * Para onde a manopla do analógico anda (px, relativo ao centro da base): segue o dedo até o limite do curso
131
- * `travelPx` e ali PARA, mantendo o ângulo (recorte radial, não por eixo — por isso `hypot`, e não `clamp`).
132
- * O `|| 1` do original evita divisão por zero quando o dedo cai no centro exato.
124
+ * Where the stick's knob goes (px, relative to the base's centre): it follows the finger up to the `travelPx` limit
125
+ * and STOPS there, keeping the angle (a radial clip, not per axis — hence `hypot` and not `clamp`).
126
+ * The `|| 1` avoids a division by zero when the finger lands on the exact centre.
133
127
  */
134
128
  export declare function stickKnobOffset(px: number, py: number, rect: RectLike, travelPx: number): {
135
129
  x: number;
136
130
  y: number;
137
131
  };
138
- /** Só o que `attach()` precisa da janela. `(e: never)` é o mesmo truque de `input/keydown.ts`: o handler é
139
- * convertido no ponto de registro, e o alvo real (window) satisfaz isto de sobra. */
140
132
  /**
141
- * A porta de ESCUTA de eventos, e ela é genérica sobre o mapa de eventos porque é isso que o `window` é.
133
+ * The event-LISTENING door, generic over the event map because that is what `window` is.
142
134
  *
143
- * ⚠️ ELA DIZIA `fn: (e: never) => void`, E ESTAVA ERRADA — de um jeito que já tinha cobrado duas vezes. Um
144
- * parâmetro `never` parece dizer "o ouvinte não olha o evento", mas por contravariância ele exige que o
145
- * ALVO aceite qualquer coisa, e o `window` real declara `ev: any`, que não é atribuível a `never`. O
146
- * resultado era o pior dos dois lados: um `as (e: never) => void` em CADA registro dentro da engine, e um
147
- * adaptador de uma linha em CADA consumidor. O `boot/create-game` escrevia esse adaptador (Achado 12) e o
148
- * `consumer-quiz/main-quiz` registrou por escrito que "a engine pede uma forma de `window` que o `window`
149
- * não tem".
135
+ * ⚠️ NOT `fn: (e: never) => void`: a `never` parameter looks like "the listener does not look at the event", but by
136
+ * contravariance it demands that the TARGET accept anything, and the real `window` declares `ev: any`, which is not
137
+ * assignable to `never`. That cost a cast at every registration inside the engine and a one-line adapter in every
138
+ * consumer.
150
139
  *
151
- * Genérica sobre `WindowEventMap`, o `window` a satisfaz DIRETO e cada ouvinte recebe o evento certo:
152
- * `'keydown'` casa com `KeyboardEvent`, `'pointerdown'` com `PointerEvent`. Sem cast e sem adaptador.
140
+ * Generic over `WindowEventMap`, `window` satisfies it DIRECTLY and each listener gets the right event: `'keydown'`
141
+ * matches `KeyboardEvent`, `'pointerdown'` matches `PointerEvent`. No cast and no adapter.
153
142
  *
154
- * `WindowEventMap` é global de `lib.dom`, ligado no `tsconfig` — não há import a fazer, e portanto não há
155
- * aresta nova de dependência.
143
+ * `WindowEventMap` is a `lib.dom` global, enabled in `tsconfig` — there is no import to make, and so no new dependency
144
+ * edge.
156
145
  */
157
146
  export interface EventTargetLike {
158
147
  addEventListener<K extends keyof WindowEventMap>(type: K, fn: (e: WindowEventMap[K]) => void, opts?: boolean | {
@@ -160,70 +149,92 @@ export interface EventTargetLike {
160
149
  passive?: boolean;
161
150
  }): void;
162
151
  }
163
- /** Quanto tempo o START segura a ação, quando ela é momentânea (não é `pause`). */
152
+ /** How long START holds the action when it is momentary (not `pause`). */
164
153
  export declare const START_TAP_MS = 140;
165
154
  export interface TouchBindingsCtx {
166
- /** `ui/dom.ts` `$` — injetado; o módulo nunca alcança `document`. */
155
+ /** `ui/dom.ts` `$` — injected; the module never reaches `document`. */
167
156
  $: DomQuery;
168
- /** `window`, só para os dois ouvintes globais de "houve um dedo/ponteiro". */
157
+ /** `window`, only for the two global "there was a finger/pointer" listeners. */
169
158
  win: EventTargetLike;
170
- /** `location.search` — lido por getter para o teste poder mentir sem mexer na URL. */
159
+ /** `location.search` — read by getter so the test can lie without touching the URL. */
171
160
  getSearch: () => string;
172
- /** `kbRuntime.controlsState().controls` (memorizado do lado de lá) — o esquema do J1, lido a cada toque. */
161
+ /** Player 1's scheme (memoised on the other side), read on every touch. */
173
162
  getControls: () => KeyScheme;
174
- /** o array vivo de jogadores. Getter: o main.js o repovoa a cada `restartGame`. */
163
+ /** the live array of players. A getter: the host may repopulate it on a restart. */
175
164
  getPlayers: () => readonly TouchBindPlayer[];
176
- marcarTecla: (code: string, origem: Transporte) => void;
177
165
  /**
178
- * ESTA ARESTA É DESTE JOGADOR, E VEIO DO TOQUE (ADR-0113 cláusula 4, issue #127) —
179
- * `input/state.arestaDoJogador`.
166
+ * THE SINGLE DOOR TO THE CARTRIDGE (ADR-0223): press a POSITION. Answers whether the press reached the GAME — `false`
167
+ * means a menu took it.
168
+ *
169
+ * 🔴 One decision, taken once: what the controller does for touch is what it does for the eyes and the voice, as
170
+ * ADR-0111 decided — with a menu open the position becomes the menu's key, in play it holds the child's key AND
171
+ * delivers the command to the cartridge. A second copy of that decision here is how the two doors once came to
172
+ * disagree.
180
173
  *
181
- * 🔴 OBRIGATÓRIO, e é aqui que a troca de aparelho fica VISÍVEL: o toque é o transporte que a criança usa
182
- * ao lado do teclado, e sem esta linha o autómato responde `teclado` mesmo com o dedo no ecrã — logo a
183
- * alternância lida seria a do teclado, no aparelho errado. 📌 O `onTouchControlsShown` do cartucho
184
- * (`main.ts:1695`) é o remendo que existe hoje exactamente para compensar esta falta.
174
+ * 📌 NO SEAT, and the absence is the statement: this engine's multiplayer is on SEPARATE screens (pillar 7), so a
175
+ * device with a pad has ONE finger and ONE seat. A signature accepting a seat would offer a capability this transport
176
+ * does not have, and nobody could exercise it to prove it.
185
177
  */
186
- arestaDoJogador: (jogador: number, origem: Transporte) => void;
187
- soltarTecla: (code: string) => void;
178
+ press: (action: Action, source: TransportName) => boolean;
179
+ /** Release the POSITION. The controller lets go of the key it held and delivers the release — only for a press the game heard. */
180
+ release: (action: Action, source: TransportName) => void;
188
181
  /**
189
- * O conjunto para LER — a decisão pura pergunta que teclas já estão seguradas.
182
+ * THIS EDGE IS THIS PLAYER'S, AND IT CAME FROM TOUCH (ADR-0113 clause 4, issue #127) — `input/state.playerEdge`.
190
183
  *
191
- * ⚠️ `ReadonlySet` e não `Set`, e a diferença é a razão de este par existir: LER o conjunto nunca foi o
192
- * problema; ESCREVER nele é que apagava a origem. O tipo passa a dizer isso, e uma escrita crua que
193
- * voltasse aqui deixa de compilar em vez de passar despercebida.
184
+ * 🔴 REQUIRED, and it is where the device switch becomes VISIBLE: touch is the transport the child uses beside the
185
+ * keyboard, and without this line the automaton answers `teclado` even with the finger on the screen — so the latch
186
+ * read would be the keyboard's, on the wrong device. 📌 In the root the press has already recorded this edge and resolved
187
+ * touch's latch at the virtual controller's `pressedBy` (ADR-0109 rule 3); a host without that door passes the latched edge
188
+ * of `input/latch-edge` here.
189
+ */
190
+ playerEdge: (player: number, source: TransportName) => void;
191
+ /**
192
+ * The set for READING — the pure decision asks which keys are already held.
193
+ *
194
+ * ⚠️ `ReadonlySet` and not `Set`: READING the set was never the problem; WRITING into it is what erased the source.
195
+ * The type says so, and a raw write coming back here stops compiling instead of slipping by.
194
196
  */
195
197
  readonly heldKeys: ReadonlySet<string>;
196
- /** `game/attract.ts`: zera a ociosidade e encerra a demo; `true` = o toque foi só para acordar.
197
- * LAZY obrigatoriamente — `attractCtl` é `const` declarado ABAIXO do ponto de init no main.js. */
198
+ /** The demo: resets idleness and ends the demo; `true` = the touch was only to wake it up. A function, called when a
199
+ * touch happens, because the demo may be built after this module. */
198
200
  attractOnInput: () => boolean;
199
- /** `input/touch.ts`: o toque REVELA os botões (o `hideTouchControls` é do keydown, não daqui). */
201
+ /** `input/touch.ts`: touch REVEALS the buttons (`hideTouchControls` belongs to whoever sees the keyboard take over). */
200
202
  showTouchControls: () => void;
201
- /** main.js: hoje um stub vazio (as dicas de início saíram em 2026-07-04); o call-site é mantido verbatim. */
203
+ /** Hides the host's start tips on a jump; the root has none and passes a no-op. */
202
204
  hideTips: () => void;
203
205
  togglePause: () => void;
204
- /** `input/touch.ts:getTouchMap()` — slot → ação, remapeável. Lido A CADA evento, verbatim: remapear no
205
- * painel passa a valer no toque seguinte, sem re-amarrar ouvinte nenhum. */
206
+ /** The SELECT pill opens the pause menus (ADR-0155). Absent, the pill does nothing — only the root that draws it wires it. */
207
+ openMenus?: () => void;
208
+ /** `input/touch.ts:getTouchMap()` — slot → action, remappable. Read ON EVERY event: a remap in the panel counts on the
209
+ * next touch, without rewiring any listener. */
206
210
  getTouchMap: () => Record<string, string>;
207
- /** A ação do slot `start`. VER O RELATO DA EXTRAÇÃO: no main.js a linha original é `touchMap.start`, e
208
- * `touchMap` NÃO EXISTE naquele escopo — o botão START da tela está quebrado hoje. Este campo é o ponto
209
- * exato onde esse defeito vive, isolado para poder ser consertado (ou não) numa linha só, com decisão. */
211
+ /** The action of the `start` slot — the root reads it from the live touch map. */
210
212
  getStartAction: () => string | undefined;
211
- /** `input/touch.ts`: curso e zona morta do analógico, em px, recalculados a cada `applyPadPhysical()`. */
213
+ /** `input/touch.ts`: the stick's travel and dead zone, in px, recomputed on every `applyPadPhysical()`. */
212
214
  getStickTravelPx: () => number;
213
215
  getStickDeadPx: () => number;
214
- /** `setTimeout` — injetável só para o teste do START não esperar 140 ms de relógio. */
216
+ /** `setTimeout` — injectable only so the START test does not wait 140 ms of clock. */
215
217
  defer?: (fn: () => void, ms: number) => void;
216
218
  }
217
219
  export interface TouchBindingsApi {
218
- /** A decisão pura, já com o mundo de agora. Exposta para o teste comparar sem aplicar. */
220
+ /** The pure decision, with the world of now. Exposed so the test can compare without applying. */
219
221
  decide: (act: string | undefined, on: boolean) => TouchDecision;
220
- /** O despacho inteiro: decide e carimba no mundo. É o `doTouch` do main.js. */
222
+ /** The whole dispatch: decides and stamps it on the world. */
221
223
  doTouch: (act: string | undefined, on: boolean) => void;
222
- /** O que o botão START faz num clique (pausar, ou apertar-e-soltar depois de `START_TAP_MS`). */
224
+ /** What the START button does on a click (pause, or press-and-release after `START_TAP_MS`). */
223
225
  pressStart: () => void;
224
- /** `window.__incl.showTouch` — revela os botões à força, para teste em desktop. */
226
+ /** Reveals the buttons by force, for testing on a desktop. */
225
227
  revealForTests: () => void;
226
- /** Amarra tudo: os dois ouvintes globais, os `.touch-btn`, o START, o analógico e a cruz. */
228
+ /** Wires everything: the two global listeners, the `.touch-btn`s, START, the stick and the cross. */
227
229
  attach: () => void;
230
+ /**
231
+ * Wires ONLY what is inside `#touch-controls` — buttons, START, stick, cross —, without the window listeners. It is
232
+ * what gets called after the pad is REDRAWN (another cartridge's `mount()`, ADR-0142).
233
+ *
234
+ * ⚠️ IT EXISTS BECAUSE `attach()` TWICE PILES LISTENERS ON THE WINDOW: a hub mounting ten cartridges would end up with
235
+ * twenty `pointerdown` listeners. The pad's nodes are new on every drawing, and their listeners die with the old
236
+ * nodes; the window's do not.
237
+ */
238
+ rewire: () => void;
228
239
  }
229
240
  export declare function initTouchBindings(ctx: TouchBindingsCtx): TouchBindingsApi;