@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,205 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // core/password — O CODEC DE CÓDIGOS CURTOS copiados à mão. Módulo-FOLHA: zero dependências, zero I/O, zero DOM.
3
- //
4
- // ========================= PARA QUE ESTE CODEC EXISTE — E PARA QUE ELE NÃO EXISTE MAIS =========================
5
- // Ele nasceu para outra coisa, e a honestidade do arquivo depende de dizer isso.
6
- //
7
- // A primeira versão era uma SENHA DE PROGRESSÃO: a criança anotava quatro letras no caderno e recuperava o
8
- // nível de alfabetização numa máquina de escola restaurada de madrugada. O ADR-0034 registrou o desenho
9
- // inteiro; o ADR-0037 o enterrou, e a razão veio do Dev, não de um defeito: **não existe salvar jogo, e não
10
- // deve existir**. Os jogos têm cinco fases e terminam em quinze minutos. Uma senha para recuperar progresso
11
- // de uma partida que acaba antes do recreio é máquina sem carga.
12
- //
13
- // O QUE SOBROU, e é o motivo de o arquivo continuar aqui: a única senha que o desenho tem é a que o PROFESSOR
14
- // cria para a turma entrar na mesma sala. Enquanto não houver servidor, essa sala é o computador do professor
15
- // na rede local. E um código de sala é o mesmo problema de engenharia que uma senha de progressão — poucos
16
- // bits, copiados do quadro por uma criança de sete anos, onde um erro de cópia ACEITO é pior que um recusado.
17
- // Por isso o codec permaneceu inteiro e o registro do lado do jogo (`game/progress`) foi apagado: o que morreu
18
- // foi o significado dos campos, não a aritmética.
19
- //
20
- // ⚠️ NENHUM CHAMADOR HOJE. Este módulo está sem consumidor desde que `game/progress` saiu, e isso está dito
21
- // aqui em vez de descoberto por alguém daqui a três meses. Ele fica porque a tela de sala vai precisar dele e
22
- // porque apagá-lo custaria reescrever a verificação exaustiva que já está testada — não porque esteja em uso.
23
- //
24
- // ========================= O QUE ESTE MÓDULO SABE, E O QUE ELE NUNCA SABERÁ =========================
25
- // A regra do ADR-0033 vale aqui inteira: "a entidade da engine pode declarar o que a ENGINE possui; não pode
26
- // declarar o que o JOGO possui". Uma senha com os campos `nivel`, `pontos` e `fases` seria exatamente a
27
- // violação que o ADR proíbe — seriam os campos DESTE jogo, congelados na engine, e o segundo consumidor
28
- // (`quiz.html`) teria de fingir ter um "nivel" para caber.
29
- //
30
- // Então este módulo não conhece campo nenhum: ele recebe um ESQUEMA — uma lista de `{nome, bits}` que o jogo
31
- // declara — e sabe empacotar inteiros pequenos em símbolos legíveis, com sobra de detecção de erro. O que a
32
- // engine possui é a CODIFICAÇÃO; o que o jogo possui é o significado de cada campo.
33
- //
34
- // ========================= AS TRÊS DECISÕES QUE FAZEM O CÓDIGO SERVIR A UMA CRIANÇA =========================
35
- //
36
- // 1. O ALFABETO É DE 32 SÍMBOLOS, SEM I, L, O E U (o de Crockford). Os três primeiros saem por ambiguidade
37
- // visual — I/1, L/1, O/0 são o erro clássico de quem copia de um caderno a lápis; o U sai porque sem ele
38
- // o alfabeto não forma palavrão por acidente, e uma senha que sorteia uma ofensa na tela de uma sala de
39
- // aula é um problema real, não hipotético. O que sobra são 32 símbolos = 5 bits exatos por caractere.
40
- // A leniência de Crockford entra na LEITURA: quem digitar I, L ou O recebe 1, 1 e 0. Escrever nunca os
41
- // produz; ler perdoa quem os escreveu. E o ADR-0027 diz que a entrada não é teclado, é GRADE DE LETRAS —
42
- // 32 símbolos cabem numa grade 8x4 legível a 320x180, que é o que a grade precisa desenhar.
43
- //
44
- // 2. A VERIFICAÇÃO É EXATA PARA OS DOIS ERROS QUE A CRIANÇA COMETE, e não "provável". Um dígito de soma
45
- // simples de 5 bits deixaria 1 código errado em 32 passar — e um código errado que PASSA é pior que um
46
- // rejeitado: ele leva a criança para OUTRA SALA, com a atividade de outra turma, e ninguém na sala entende
47
- // por quê. Aqui a soma é PONDERADA PELA POSIÇÃO, módulo 1021, em 2 símbolos:
48
- // · trocar UM símbolo por outro, em qualquer posição → SEMPRE detectado (a diferença que ele causa na
49
- // soma é (i+1)·d, e |(i+1)·d| < 1021, logo nunca cai em zero por acaso do módulo);
50
- // · TROCAR DOIS símbolos DO CORPO de lugar → SEMPRE detectado ((i−j)·(vj−vi), idem).
51
- // Não é probabilidade: é aritmética, e é por isso que `criarCodec` limita o corpo a 32 símbolos — acima
52
- // disso o produto passaria de 1021 e a garantia cairia em silêncio. O que fica de fora da garantia é a
53
- // troca de um símbolo do corpo com um dos dois da soma; para essa, e para uma senha forjada ao acaso, a
54
- // chance de colar é ~1/1021.
55
- // ⚠️ O QUE DÁ A GARANTIA É O TAMANHO DO MÓDULO, NÃO A PRIMALIDADE — e eu conferi em vez de supor: trocar
56
- // 1021 por 1024 (potência de dois) NÃO faz nenhum dos 26 casos deste módulo falhar. É informação sobre o
57
- // alcance do teste, e fica registrada aqui em vez de virar uma crença. 1021 continua sendo a escolha por
58
- // ser o maior primo abaixo do teto de dois símbolos: para as duas classes provadas os dois módulos
59
- // empatam, mas um módulo com fator 2^k é cego a erros MÚLTIPLOS cuja diferença total seja múltipla dele,
60
- // e um primo não tem esse buraco de graça.
61
- //
62
- // 3. `decodificar` DEVOLVE `null`, e não uma exceção nem um objeto "meio válido". Senha errada é o caso
63
- // NORMAL desta função — é o que acontece quando a criança erra uma letra —, e caso normal não se sinaliza
64
- // com exceção. Quem chama sabe o comprimento esperado (`codec.comprimento`) e pode distinguir "faltam
65
- // letras" de "senha errada" sem que este módulo invente vocabulário de interface para isso.
66
- /** Crockford base32: sem I, L, O e U. Índice = valor de 5 bits. */
67
- export const ALFABETO = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
68
- /** O módulo da soma ponderada. Ver a decisão 2 no topo: é o TAMANHO dele que dá a garantia, e o limite de 32. */
69
- const MODULO = 1021;
70
- /** Símbolos do corpo, no máximo. Acima disso a garantia da soma cairia sem nenhum sintoma visível. */
71
- const MAX_SIMBOLOS = 32;
72
- const VALOR_DE = new Map();
73
- for (let i = 0; i < ALFABETO.length; i++)
74
- VALOR_DE.set(ALFABETO[i], i);
75
- // A leniência de Crockford, só na LEITURA. Escrever jamais produz estes três.
76
- VALOR_DE.set('I', 1);
77
- VALOR_DE.set('L', 1);
78
- VALOR_DE.set('O', 0);
79
- /**
80
- * A soma ponderada pela posição, módulo `MODULO`, como DOIS símbolos.
81
- *
82
- * O peso `i+1` (e não `i`) é o que faz o primeiro símbolo contar: com peso 0, trocar o primeiro caractere
83
- * por qualquer outro passaria despercebido — e o primeiro caractere é justamente o que mais se digita errado.
84
- */
85
- function soma(simbolos) {
86
- let c = 0;
87
- for (let i = 0; i < simbolos.length; i++)
88
- c = (c + (i + 1) * simbolos[i]) % MODULO;
89
- return [(c >> 5) & 31, c & 31];
90
- }
91
- /**
92
- * Cria um codec para o esquema `campos`.
93
- *
94
- * ⚠️ LANÇA em esquema malformado, e isso é decisão: um esquema errado é erro de PROGRAMA, e um erro de
95
- * programa que só aparece como senha estranha três meses depois custa mais caro que um boot que não sobe.
96
- * É a mesma escolha de `boot/create-game` para a declaração malformada.
97
- */
98
- // ⚠️ AS MENSAGENS DE ERRO ABAIXO ESTÃO EM INGLÊS, e os comentários deste arquivo não. Não é descuido: o gate
99
- // `tests/engine-i18n.node.test.js` reprovou este módulo quando elas nasceram em português, e a gaveta que ele
100
- // oferece — "mensagens de programador", onde já moram `core/contract`, `boot/create-game` e `render/sprites` —
101
- // só me aceitaria subindo o teto global de 76 para 82 no mesmo commit que cria a dívida. Afrouxar o gate para
102
- // caber nele é o defeito que o gate existe para impedir. Comentário não vai para tela nenhuma e segue em
103
- // pt-BR, como no resto do repositório; STRING vai, mesmo que só até o console de quem programa.
104
- export function criarCodec(campos) {
105
- if (campos.length === 0) {
106
- throw new Error('core/password: empty schema — a password with zero fields carries only its own checksum. Declare at least one field, or skip the codec.');
107
- }
108
- const vistos = new Set();
109
- let bitsTotal = 0;
110
- for (const c of campos) {
111
- if (!c.nome)
112
- throw new Error('core/password: field without a name — the name is the key it gets in the object `decodificar` returns.');
113
- if (vistos.has(c.nome))
114
- throw new Error(`core/password: field "${c.nome}" declared twice — the second one would shadow the first when reading.`);
115
- vistos.add(c.nome);
116
- if (!Number.isInteger(c.bits) || c.bits < 1 || c.bits > 30) {
117
- throw new Error(`core/password: field "${c.nome}" asks for ${c.bits} bits — use an integer from 1 to 30 (a 0-bit field stores nothing; above 30 the bitwise arithmetic in JS stops being exact).`);
118
- }
119
- bitsTotal += c.bits;
120
- }
121
- const simbolosCorpo = Math.ceil(bitsTotal / 5);
122
- if (simbolosCorpo > MAX_SIMBOLOS) {
123
- throw new Error(`core/password: ${bitsTotal} bits would take ${simbolosCorpo} symbols, and above ${MAX_SIMBOLOS} the weighted checksum stops detecting EVERY transposition (see decision 2 at the top). Store less, or split it into two passwords.`);
124
- }
125
- const listaCampos = campos.map((c) => Object.freeze({ nome: c.nome, bits: c.bits }));
126
- return {
127
- comprimento: simbolosCorpo + 2,
128
- campos: Object.freeze(listaCampos),
129
- codificar(valores) {
130
- // Bit a bit, do mais significativo ao menos, na ordem declarada. Escrito assim — e não com `<<` sobre
131
- // um acumulador — porque um esquema de 40 bits estouraria os 32 bits dos operadores do JS, e o sintoma
132
- // seria uma senha que decodifica errado só nos campos do fim.
133
- const bits = [];
134
- for (const c of listaCampos) {
135
- const v = valores[c.nome];
136
- const teto = 2 ** c.bits - 1;
137
- if (typeof v !== 'number' || !Number.isInteger(v) || v < 0 || v > teto) {
138
- throw new Error(`core/password: field "${c.nome}" got ${String(v)} — expected an integer from 0 to ${teto}. Fix the value BEFORE encoding (clamping here silently would write a password that restores different progress).`);
139
- }
140
- for (let b = c.bits - 1; b >= 0; b--)
141
- bits.push((v >> b) & 1);
142
- }
143
- while (bits.length % 5 !== 0)
144
- bits.push(0); // enchimento: zeros à direita, conferidos na leitura
145
- const simbolos = [];
146
- for (let i = 0; i < bits.length; i += 5) {
147
- simbolos.push((bits[i] << 4) | (bits[i + 1] << 3) | (bits[i + 2] << 2) | (bits[i + 3] << 1) | bits[i + 4]);
148
- }
149
- const [s1, s2] = soma(simbolos);
150
- return [...simbolos, s1, s2].map((v) => ALFABETO[v]).join('');
151
- },
152
- decodificar(senha) {
153
- if (typeof senha !== 'string')
154
- return null;
155
- const cru = [];
156
- for (const ch of senha.toUpperCase()) {
157
- if (ch === ' ' || ch === '-' || ch === '·')
158
- continue; // separadores de leitura (ver `formatar`)
159
- const v = VALOR_DE.get(ch);
160
- if (v === undefined)
161
- return null; // símbolo fora do alfabeto: não vale adivinhar o que ela quis dizer
162
- cru.push(v);
163
- }
164
- if (cru.length !== simbolosCorpo + 2)
165
- return null;
166
- const simbolos = cru.slice(0, simbolosCorpo);
167
- const [s1, s2] = soma(simbolos);
168
- if (s1 !== cru[simbolosCorpo] || s2 !== cru[simbolosCorpo + 1])
169
- return null;
170
- const bits = [];
171
- for (const v of simbolos)
172
- for (let b = 4; b >= 0; b--)
173
- bits.push((v >> b) & 1);
174
- // O enchimento tem de ser zero: `codificar` só produz zeros ali. Uma senha com lixo no fim não saiu
175
- // daqui, e aceitá-la seria aceitar uma senha que este módulo é incapaz de gerar.
176
- for (let i = bitsTotal; i < bits.length; i++)
177
- if (bits[i] !== 0)
178
- return null;
179
- const fora = {};
180
- let p = 0;
181
- for (const c of listaCampos) {
182
- let v = 0;
183
- for (let b = 0; b < c.bits; b++)
184
- v = v * 2 + bits[p++];
185
- fora[c.nome] = v;
186
- }
187
- return fora;
188
- },
189
- };
190
- }
191
- /**
192
- * Insere um separador a cada `grupo` caracteres — `'A1B2C3D4'` vira `'A1B2-C3D4'`.
193
- *
194
- * É acessibilidade, não enfeite: uma sequência sem grupos é lida caractere a caractere pelo leitor de tela e
195
- * copiada perdendo o lugar por quem lê da tela para o caderno. `decodificar` ignora o separador, então a
196
- * senha agrupada e a senha corrida são a MESMA senha — quem digitar sem o traço não é punido por isso.
197
- */
198
- export function formatar(senha, grupo = 4, sep = '-') {
199
- if (grupo < 1)
200
- return senha;
201
- const partes = [];
202
- for (let i = 0; i < senha.length; i += grupo)
203
- partes.push(senha.slice(i, i + grupo));
204
- return partes.join(sep);
205
- }
@@ -1,17 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- /** A fatia mínima de `Element` que este módulo lê. Estrutural para o teste de node não precisar de DOM real. */
3
- export interface ElementoComRotulo {
4
- getAttribute(nome: string): string | null;
5
- textContent: string | null;
6
- }
7
- /**
8
- * O nome do controle: `aria-label` quando existe, o texto visível quando não.
9
- *
10
- * A ORDEM É A DECISÃO, e ela não é arbitrária: `aria-label` é o que a plataforma de acessibilidade JÁ vai
11
- * anunciar. Narrar outra coisa não acrescenta informação — cria uma segunda versão do mesmo item, e quem
12
- * escuta as duas não tem como saber qual é a verdadeira.
13
- *
14
- * O texto visível entra quando não há rótulo declarado, que é o caso da maioria dos botões: ali as duas
15
- * fontes já coincidem por construção.
16
- */
17
- export declare function rotuloAcessivel(el: ElementoComRotulo | null | undefined): string;
@@ -1,41 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // core/rotulo-acessivel — COMO SE CHAMA UM CONTROLE, e uma resposta só para quem vê e para quem escuta.
3
- //
4
- // ========================= O DEFEITO QUE ISTO FECHA =========================
5
- // MEDIDO no jogo construído, pousando o cursor no botão de número de jogadores do menu inicial:
6
- //
7
- // o jogo narrou: "◀ Number of players: 1 ▶, 1 of 4"
8
- // o leitor de tela diz: "Number of players: 1. Click on the left for fewer, on the right for more."
9
- //
10
- // Duas frases diferentes para o MESMO item, no mesmo instante. Uma criança que usa leitor de tela E a
11
- // narração do jogo ouve o item duas vezes, de dois jeitos — e a versão do jogo lê os glifos `◀` e `▶`, que é
12
- // exatamente o ruído que o item 4 do ADR-0044 tirou da legenda da pausa.
13
- //
14
- // A REGRA JÁ EXISTIA, escrita uma vez: `legendaDoIcone` (ui/pause-icons) lê o `aria-label` do ícone justamente
15
- // para que "passar o mouse ou focar diga a MESMA verdade que um leitor de tela anunciaria". Ela valia para os
16
- // dez ícones e não para o resto dos menus. Aqui ela vira uma função, e as três chamadas passam a ser a mesma.
17
- //
18
- // ========================= POR QUE UM MÓDULO-FOLHA =========================
19
- // Três consumidores em camadas diferentes (`ui/activities-menu`, `ui/menu-nav`, `ui/pause-icons`), e
20
- // `ui/menu-nav` já importa `ui/pause-icons` — pôr a regra num deles fecharia ciclo ou obrigaria alguém a
21
- // importar de quem não devia. Mesma lição de `core/anel`, e ela é recente: ciclo em ESM não estoura na hora,
22
- // estoura no boot em TDZ, uma vez, em produção.
23
- //
24
- // Zero dependências, zero I/O, nenhum `document` global: recebe o elemento e devolve texto.
25
- /** Espaço em branco de markup vira UM espaço; pontas somem. */
26
- const enxuto = (s) => (s || '').replace(/\s+/g, ' ').trim();
27
- /**
28
- * O nome do controle: `aria-label` quando existe, o texto visível quando não.
29
- *
30
- * A ORDEM É A DECISÃO, e ela não é arbitrária: `aria-label` é o que a plataforma de acessibilidade JÁ vai
31
- * anunciar. Narrar outra coisa não acrescenta informação — cria uma segunda versão do mesmo item, e quem
32
- * escuta as duas não tem como saber qual é a verdadeira.
33
- *
34
- * O texto visível entra quando não há rótulo declarado, que é o caso da maioria dos botões: ali as duas
35
- * fontes já coincidem por construção.
36
- */
37
- export function rotuloAcessivel(el) {
38
- if (!el)
39
- return '';
40
- return enxuto(el.getAttribute('aria-label')) || enxuto(el.textContent);
41
- }
@@ -1,115 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import type { GateTile } from './state.js';
3
- import type { Player } from './entity.js';
4
- /**
5
- * OS EXTRAS DO NÍVEL — o que o mapa monta a cada rodada e ninguém persiste.
6
- *
7
- * `P` é o tipo do power-up, e ele vem de quem cria a instância. Ver a nota do genérico no cabeçalho.
8
- */
9
- export interface ExtrasDoNivel<P> {
10
- /** Os power-ups espalhados pelo nível. `readonly`: quem lê não reordena. */
11
- powerups: readonly P[];
12
- /** Os tiles do portão, como chaves `"tx,ty"` — `core/collision` só pergunta `.has()`. */
13
- gateTiles: ReadonlySet<string>;
14
- /** A lista de tiles do portão, ou `null` quando o nível não tem portão. */
15
- gate: readonly GateTile[] | null;
16
- /** Portão aberto? FECHADO significa que os tiles acima são sólidos. */
17
- gateOpen: boolean;
18
- }
19
- /**
20
- * O estado de RODADA. Hoje são os extras do nível mais o `wcSolid`; os outros campos chegam nos próximos
21
- * passos da Fase B.
22
- *
23
- * O `wcSolid` fica FORA do `ExtrasDoNivel` porque ele não nasce com os outros quatro: a geometria de
24
- * cadeirante é recalculada por conta própria quando o modo liga ou desliga, e tem setter só dela. Juntá-los
25
- * num objeto só faria a assinatura mentir sobre quando cada um muda.
26
- */
27
- export interface RunState<P> extends ExtrasDoNivel<P> {
28
- /** Sólidos que só existem no modo cadeirante — rampas e plataformas, como chaves `"x,y"`. */
29
- wcSolid: ReadonlySet<string>;
30
- /**
31
- * OS JOGADORES (1..4). Sem setter, e isso é declaração, não esquecimento: o array NUNCA é reatribuído —
32
- * ele é mutado no lugar (`push`, `splice`, `length`, `players[i]`), e quem faz isso é `game/session`, que
33
- * é o dono da entrada e da saída de jogador. Um setter aqui daria a impressão de que trocar a lista
34
- * inteira é uma operação prevista, e ela não é: as referências que os módulos guardam sobreviveriam à
35
- * troca apontando para a lista velha.
36
- *
37
- * `Player[]` é a visão da ENGINE. Cada jogo acrescenta campos (o `GamePlayer` daqui tem `quiz`), e os
38
- * consumidores que precisam deles estreitam por conta própria — a dívida de conversões que isso gera é
39
- * anterior a este arquivo e não muda com a mudança de endereço.
40
- */
41
- players: Player[];
42
- /**
43
- * QUANTOS jogadores/telas (1..4). Não persistido — a partida seguinte começa com um de novo, que é o
44
- * comportamento que uma sala de aula quer.
45
- */
46
- numPlayers: number;
47
- /** A rodada acabou (vitória). Trava a entrada e deixa o cenário simulando por trás do aviso. */
48
- ended: boolean;
49
- /** Semente da decoração do cenário. Sorteada a cada fase DE PROPÓSITO — é o que faz duas partidas da
50
- * mesma fase não terem a mesma grama. */
51
- decorSeed: number;
52
- /** Fração das superfícies com grama: 1 = todas, 0.6 = 60% (a base das estações que virão). */
53
- grassDensity: number;
54
- /** QUAL jogador os painéis de acessibilidade visual estão editando. Não é preferência — é qual aba está
55
- * aberta —, e por isso não se persiste: guardá-la faria a criança reabrir o jogo já editando o jogador 2. */
56
- selVizPlayer: number;
57
- /**
58
- * QUEM abriu o menu de pausa, e portanto o ESCOPO de tudo o que se faz dentro dele.
59
- *
60
- * Importa mais do que parece: em telas separadas, este índice é o que faz o menu do jogador 2 editar as
61
- * configurações DELE. Errar aqui não dá erro — dá a criança certa mexendo nos ajustes da criança errada,
62
- * em silêncio.
63
- */
64
- pauseActor: number;
65
- /**
66
- * Grava os quatro extras JUNTOS, que é como eles nascem.
67
- *
68
- * Um setter só, e não quatro, porque eles são um resultado só: `game/level-geometry.computeExtras()`
69
- * devolve os quatro de uma vez, e gravá-los separadamente abriria uma janela em que o portão de um nível
70
- * convive com os tiles de outro.
71
- */
72
- setLevelExtras(x: ExtrasDoNivel<P>): void;
73
- /** Abre ou fecha o portão. É o único dos cinco que muda DURANTE a rodada. */
74
- setGateOpen(v: boolean): void;
75
- /** Troca os sólidos de cadeirante (recalculados quando a geometria do nível muda). */
76
- setWcSolid(s: ReadonlySet<string>): void;
77
- setEnded(v: boolean): void;
78
- setDecorSeed(s: number): void;
79
- /**
80
- * ⚠️ O CLAMP MORA AQUI, e é a razão de este setter existir.
81
- *
82
- * `grassDensity` é uma FRAÇÃO, e antes de `core/state` a proteção vivia no `window.__incl` — ou seja, só
83
- * quem entrasse por ali era protegido. Qualquer outro caminho podia escrever 5 ou -1 e o cenário nascia
84
- * errado sem nada reclamar. Um valor com faixa válida que depende de quem escreve é um valor sem faixa.
85
- */
86
- setGrassDensity(v: number): void;
87
- setSelVizPlayer(i: number): void;
88
- setPauseActor(i: number): void;
89
- /** Troca o número de jogadores e AVISA (ver `OpcoesDaRodada.aoTrocarJogadores`). */
90
- setNumPlayers(n: number): void;
91
- }
92
- /**
93
- * O que a rodada precisa saber do mundo lá fora. Hoje é uma coisa só, e ela existe por um motivo concreto.
94
- *
95
- * `core/state.setNumPlayersValue` emitia `numPlayers` no barramento. Mover o campo para cá e simplesmente
96
- * PARAR de emitir removeria em silêncio uma capacidade que a Fase C acabou de formalizar — e removê-la sem
97
- * ninguém notar (o barramento ainda não tem assinante) é exatamente o tipo de perda que este repositório
98
- * escreve ADR para não repetir.
99
- *
100
- * Então o aviso entra por INJEÇÃO, como o cabeçalho deste arquivo prometeu, e é OPCIONAL: uma rodada sem
101
- * barramento funciona igual. Avisos são para painéis, e um painel ausente não é erro.
102
- */
103
- export interface OpcoesDaRodada {
104
- /** Chamado depois de `setNumPlayers`. Na raiz de composição é `(n) => emit('numPlayers', n)`. */
105
- aoTrocarJogadores?: (n: number) => void;
106
- }
107
- /**
108
- * Cria uma rodada. Sem I/O, sem estado de módulo, sem `emit` — quem quiser avisar alguém avisa por fora.
109
- *
110
- * ⚠️ OS EVENTOS FICARAM DE FORA DE PROPÓSITO. `core/state` emitia `gateOpen` e `wcSolid`, e o barramento
111
- * tinha ZERO assinantes (medido: 25 nomes de evento, 26 `emit()`, nenhum `on()`). Emitir para ninguém é
112
- * cerimônia, e mantê-la aqui obrigaria a fábrica a depender do barramento — justo o que a Fase C vai
113
- * refazer. Quando existir o primeiro assinante, ele entra por injeção, com o barramento já tipado.
114
- */
115
- export declare function createRunState<P>(opcoes?: OpcoesDaRodada): RunState<P>;
@@ -1,40 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- /**
3
- * Cria uma rodada. Sem I/O, sem estado de módulo, sem `emit` — quem quiser avisar alguém avisa por fora.
4
- *
5
- * ⚠️ OS EVENTOS FICARAM DE FORA DE PROPÓSITO. `core/state` emitia `gateOpen` e `wcSolid`, e o barramento
6
- * tinha ZERO assinantes (medido: 25 nomes de evento, 26 `emit()`, nenhum `on()`). Emitir para ninguém é
7
- * cerimônia, e mantê-la aqui obrigaria a fábrica a depender do barramento — justo o que a Fase C vai
8
- * refazer. Quando existir o primeiro assinante, ele entra por injeção, com o barramento já tipado.
9
- */
10
- export function createRunState(opcoes = {}) {
11
- const r = {
12
- powerups: [],
13
- gateTiles: new Set(),
14
- gate: null,
15
- gateOpen: true,
16
- wcSolid: new Set(),
17
- players: [],
18
- numPlayers: 1,
19
- setLevelExtras(x) {
20
- r.powerups = x.powerups;
21
- r.gateTiles = x.gateTiles;
22
- r.gate = x.gate;
23
- r.gateOpen = x.gateOpen;
24
- },
25
- setGateOpen(v) { r.gateOpen = v; },
26
- setWcSolid(s) { r.wcSolid = s; },
27
- ended: false,
28
- decorSeed: 0,
29
- grassDensity: 1,
30
- selVizPlayer: 0,
31
- pauseActor: 0,
32
- setEnded(v) { r.ended = !!v; },
33
- setDecorSeed(s) { r.decorSeed = s >>> 0; },
34
- setGrassDensity(v) { r.grassDensity = Math.max(0, Math.min(1, +v || 0)); },
35
- setSelVizPlayer(i) { r.selVizPlayer = i; },
36
- setPauseActor(i) { r.pauseActor = i; },
37
- setNumPlayers(n) { r.numPlayers = n; opcoes.aoTrocarJogadores?.(n); },
38
- };
39
- return r;
40
- }
@@ -1,12 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- export declare const TYPE_GLYPH: Record<number, string>;
3
- export declare const TILE_NAME: Record<number, string>;
4
- export declare const GLYPH_TYPE: Record<string, number>;
5
- export declare function parseLevel(text: string): number[][];
6
- export declare function gridToGlyphs(grid: number[][]): string;
7
- export declare function selfTest(): {
8
- ok: boolean;
9
- unique: boolean;
10
- invertible: boolean;
11
- missing: number[];
12
- };
@@ -1,61 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // core/tiles.ts — Legend de tiles + parser do mapa em texto-glifo (1 glifo significativo por tile). Módulo-folha,
3
- // ZERO deps. O jogo NÃO lê Tiled/Aseprite em runtime — só este texto-glifo, legível/diffável como ascii art.
4
- // tipo (0–14) → glifo. Terreno = símbolos; power-ups = LETRAS maiúsculas mnemônicas.
5
- export const TYPE_GLYPH = {
6
- 1: '.', // ar (iluminado)
7
- 0: ':', // ar escuro / região secreta
8
- 2: '#', // pedra / chão sólido
9
- 6: '=', // parede dura (sem quicar)
10
- 3: '~', // água
11
- 4: 'H', // escada
12
- 5: '^', // trampolim
13
- 9: 'x', // lava / perigo
14
- 10: '|', // portão
15
- 11: '*', // chave
16
- 7: 'S', // power-up super-pulo
17
- 8: 'F', // power-up voo
18
- 12: 'T', // power-up super-corrida (turbo)
19
- 13: 'U', // power-up ultra-pulo
20
- 14: 'C', // power-up ventosa (cling)
21
- };
22
- // tipo → nome legível (UI e editor de mapa). Uma verdade só.
23
- export const TILE_NAME = {
24
- 0: 'ar escuro/secreto', 1: 'ar', 2: 'pedra', 3: 'água', 4: 'escada', 5: 'trampolim', 6: 'parede',
25
- 7: 'super-pulo', 8: 'voo', 9: 'lava/perigo', 10: 'portão', 11: 'chave', 12: 'super-corrida',
26
- 13: 'ultra-pulo', 14: 'ventosa',
27
- };
28
- // glifo → tipo (inverso). Construído do TYPE_GLYPH para não divergir.
29
- export const GLYPH_TYPE = Object.fromEntries(Object.entries(TYPE_GLYPH).map(([t, g]) => [g, +t]));
30
- const AIR = 1; // glifo desconhecido / vazio à direita → ar iluminado
31
- // Texto-glifo → grid numérico. Preserva o comprimento de cada linha (mapa é irregular; o buildWorld preenche
32
- // o vazio à direita com ar). Linhas iniciadas por "#!" são meta (nome/autor) e são ignoradas — "#" sozinho é
33
- // parede, então o marcador de meta é "#!" no INÍCIO da linha.
34
- export function parseLevel(text) {
35
- const rows = [];
36
- for (const line of text.split(/\r?\n/)) {
37
- if (line.startsWith('#!'))
38
- continue; // meta
39
- if (line.length === 0)
40
- continue; // linha vazia (ex.: \n final) — nossos mapas não têm linha vazia
41
- const row = [];
42
- for (const ch of line)
43
- row.push(ch in GLYPH_TYPE ? GLYPH_TYPE[ch] : AIR);
44
- rows.push(row);
45
- }
46
- return rows;
47
- }
48
- // Grid numérico → texto-glifo (para gerar o .map.txt e para o teste de ida-e-volta). Sem newline final.
49
- export function gridToGlyphs(grid) {
50
- return grid.map((row) => row.map((t) => TYPE_GLYPH[t] ?? '.').join('')).join('\n');
51
- }
52
- // Sanidade: o legend é uma bijeção sobre 0..14? (glifos únicos e todos os tipos mapeados). Prova que a
53
- // conversão é sem perda para QUALQUER grid. Retorna {ok, unique, invertible, missing}.
54
- export function selfTest() {
55
- const types = Array.from({ length: 15 }, (_, i) => i);
56
- const glyphs = types.map((t) => TYPE_GLYPH[t]);
57
- const missing = types.filter((t) => !(t in TYPE_GLYPH));
58
- const unique = new Set(glyphs).size === glyphs.length;
59
- const invertible = types.every((t) => GLYPH_TYPE[TYPE_GLYPH[t]] === t);
60
- return { ok: missing.length === 0 && unique && invertible, unique, invertible, missing };
61
- }
@@ -1,4 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- declare function buildWorld(rawGrid: number[][]): number[][];
3
- export declare function buildWorldFromText(text: string): number[][];
4
- export { buildWorld };
@@ -1,58 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // core/world.ts — Mundo/nível — constrói o grid a partir do TEXTO-GLIFO (assets/levels/clarity.map.txt). Depende
3
- // só de tiles.ts. O WORLD instanciado + tileAt/wcSolid/gate/rampas ficam no game.js até core/state.js existir.
4
- import { parseLevel } from './tiles.js';
5
- const STRUCTURAL_SOLID = new Set([2, 5, 6, 10]);
6
- const CONVERTIBLE_SOLID = new Set([2, 6]);
7
- const NEEDS_2H = new Set([1, 3, 4, 7, 8, 10, 11]);
8
- function expandNarrowPassages(world) {
9
- const H = world.length;
10
- if (!H)
11
- return;
12
- const W = world[0].length;
13
- const orig = world.map((r) => [...r]);
14
- const isAir = (t) => NEEDS_2H.has(t);
15
- const walk = Array.from({ length: H }, () => new Array(W).fill(false));
16
- for (let ty = 0; ty < H - 1; ty++)
17
- for (let tx = 0; tx < W; tx++)
18
- if (isAir(orig[ty][tx]) && STRUCTURAL_SOLID.has(orig[ty + 1][tx]))
19
- walk[ty][tx] = true;
20
- let changed = true, guard = 0;
21
- while (changed && guard++ < W + 4) {
22
- changed = false;
23
- for (let ty = 0; ty < H; ty++)
24
- for (let tx = 0; tx < W; tx++) {
25
- if (walk[ty][tx] || !isAir(orig[ty][tx]))
26
- continue;
27
- if ((tx > 0 && walk[ty][tx - 1]) || (tx < W - 1 && walk[ty][tx + 1])) {
28
- walk[ty][tx] = true;
29
- changed = true;
30
- }
31
- }
32
- }
33
- for (let ty = 1; ty < H; ty++)
34
- for (let tx = 0; tx < W; tx++)
35
- if (walk[ty][tx] && CONVERTIBLE_SOLID.has(orig[ty - 1][tx]))
36
- world[ty - 1][tx] = (orig[ty][tx] === 3) ? 3 : 1;
37
- }
38
- function buildWorld(rawGrid) {
39
- const W = Math.max(...rawGrid.map((r) => r.length)), H = rawGrid.length;
40
- const world = [];
41
- for (let cy = 0; cy < H; cy++) {
42
- const src = rawGrid[cy], row = new Array(W);
43
- for (let cx = 0; cx < W; cx++)
44
- row[cx] = src[cx] ?? 0;
45
- world.push(row);
46
- } // vazio à direita → ar escuro (0)
47
- expandNarrowPassages(world);
48
- if (world[42]?.[53] !== undefined)
49
- world[42][53] = 1; // playability fix
50
- // E18: itens injetados (fiel à v3 ITEM_PLACEMENTS): 12=super-corrida, 13=ultra-pulo, 14=ventosa
51
- for (const [x, y, to] of [[13, 8, 12], [55, 37, 13], [13, 26, 14]])
52
- if (world[y]?.[x] !== undefined)
53
- world[y][x] = to;
54
- return world;
55
- }
56
- // Constrói o mundo a partir do texto-glifo (parseLevel -> buildWorld: expand + injeção de itens).
57
- export function buildWorldFromText(text) { return buildWorld(parseLevel(text)); }
58
- export { buildWorld };
@@ -1,44 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import type { Transporte } from './transporte-em-uso.js';
3
- /**
4
- * A propriedade pendurada no evento.
5
- *
6
- * 📌 Prefixada e feia de propósito: é um expando num objecto que não é nosso, e um nome curto («origem»)
7
- * podia colidir com o de outra biblioteca sem que nada o dissesse.
8
- */
9
- export declare const CHAVE_DE_ORIGEM = "__vpOrigem";
10
- /**
11
- * O mínimo que este módulo lê de um evento de tecla — ESTRUTURAL, para um `KeyboardEvent` real e um duplo de
12
- * teste servirem os dois.
13
- *
14
- * ⚠️ `isTrusted` é OPCIONAL, e a ausência dele não é o mesmo que `false` por acaso: um duplo que não o declara
15
- * está a dizer «não afirmei nada sobre isto», e a resposta certa a isso é `undefined` e não `'teclado'`. É a
16
- * mesma regra do `origemDe` do `input/state`, aplicada uma camada acima.
17
- */
18
- export interface EventoDeTeclaLike {
19
- readonly isTrusted?: boolean;
20
- }
21
- /**
22
- * DECLARA que este evento veio daquele aparelho. Devolve o próprio evento, para o despacho ficar numa linha.
23
- *
24
- * ⚠️ Carimba-se ANTES de despachar. Depois de `dispatchEvent` os ouvintes já correram, e o carimbo chegaria
25
- * a um evento que ninguém mais vai ler.
26
- */
27
- export declare function carimbarOrigem<T extends object>(ev: T, origem: Transporte): T;
28
- /**
29
- * QUEM PRODUZIU ESTE EVENTO? `undefined` quando não se sabe.
30
- *
31
- * A regra inteira, em três linhas e por esta ordem:
32
- *
33
- * 1. **Carimbo válido ganha.** Uma declaração explícita vence sempre uma inferência — inverter isto faria
34
- * um evento REAL que alguém reatribuiu (um pedal, um interruptor de sopro que emite teclas de verdade)
35
- * ser lido como teclado, apagando exactamente a informação que quem carimbou se deu ao trabalho de pôr.
36
- * 2. **Sem carimbo mas de confiança → `'teclado'`.** É o que `isTrusted` significa: o navegador viu a
37
- * pessoa carregar. É a única inferência que este módulo faz, e fá-la sobre a propriedade que não se forja.
38
- * 3. **Sem carimbo e sem confiança → `undefined`.** Um evento sintético que ninguém assinou. Depois desta
39
- * migração nada nesta engine produz um; quem o produz é código de fora, e código de fora não declarou.
40
- * ⚠️ Devolver `'teclado'` aqui seria a erasão a voltar por outra porta, que é o defeito que o ADR-0109
41
- * inteiro existe para fechar — e seria pior do que a erasão original, porque teria a forma de uma
42
- * resposta.
43
- */
44
- export declare function origemDoEvento(ev: EventoDeTeclaLike): Transporte | undefined;