@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,68 +1,65 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // ui/settings-empathy.ts — Empathy/simulation panel (Sensibilidade → Empatia): lets a player WITHOUT a disability
3
- // experience one (VIZ_SIM: color-blindness/low-vision/blindness simulation, simulated hearing loss, one-button
4
- // play, wheelchair). This is the opposite of settings-visual, which CORRECTS the game for a player who has the
5
- // disability — do not merge the two, even where they share the viz-mode catalog or a helper.
2
+ // ui/settings-empathy.ts — Empathy/simulation panel: lets a player WITHOUT a disability experience one
3
+ // (color-blindness/low-vision/blindness simulation, simulated hearing loss, one-button play, wheelchair). This is the
4
+ // opposite of settings-visual, which CORRECTS the game for a player who has the disability — do not merge the two,
5
+ // even where they share the viz-mode catalog or a helper.
6
6
  // Injected via initSettingsEmpathy(ctx): DOM selector, srSay, store, the state setters (setHearingLoss/
7
- // setOneButton/setWheelchair — still game.js: they touch the audio graph, player powers and world geometry far
8
- // beyond this panel) plus their live getters, and the shared reflect/overlay helpers (renderVizGroup,
9
- // reflectMotorEmpathy, reflectVizButtons, frontOverlay — used by sibling panels too, so they stay in game.js).
10
- // Pure catalog logic (isSimKind/EMPATHY_VIZ_MODES) is unit-tested in node; render/open/close
11
- // are a thin DOM shell tested in browser. Model: app/js/render/fx.ts.
7
+ // setOneButton/setWheelchair — the host's: they reach far beyond this panel) plus their live getters, and the shared
8
+ // reflect/overlay helpers (renderVizGroup, reflectMobilityEmpathy, reflectVizButtons, frontOverlay — used by sibling
9
+ // panels too). The pure catalog slice (EMPATHY_VIZ_MODES) is unit-tested in node; render/open/close are a thin DOM
10
+ // shell tested in browser.
12
11
  import { toggleLabel } from './dom.js';
13
12
  import { VIZ_MODES, simulatesDisability } from '../render/viz-modes.js';
14
- import { hearingLoss, setHearingLossGraph } from '../platform/audio.js';
15
- import { t } from '../core/i18n.js';
16
- import { DEFAULTS } from '../core/state.js';
13
+ import { DEFAULTS } from '../core/setting-defaults.js';
17
14
  import { markChanged, markMenuChanged } from './changed-mark.js';
18
15
  /**
19
- * A fatia do catálogo que ESTE painel mostra: só o que SIMULA uma deficiência.
16
+ * The slice of the catalogue THIS panel shows: only what SIMULATES a disability.
20
17
  *
21
- * Era `VIZ_MODES.filter(m => isSimKind(m.kind))`, e `kind` não distingue simular de corrigir — então as três
22
- * "Correção de daltonismo" vinham junto, num menu chamado "sentir como é ter uma deficiência". A criança
23
- * daltônica precisava entrar ali para achar a correção da própria condição, ao lado do botão que simula a
24
- * condição dela para quem não a tem. Dois públicos opostos na mesma lista.
18
+ * The catalogue's `kind` does not tell simulating from correcting, so a filter by `kind` brings the colour-blindness
19
+ * corrections into a menu about feeling what a disability is like — a colour-blind child would have to enter it to find
20
+ * the correction for their own condition, beside the button that simulates it for someone who does not have it. Two
21
+ * opposite audiences in one list.
25
22
  *
26
- * O Dev decidiu (#60): as correções vão para a Acessibilidade visual, e a lista passa a se recortar pelo
27
- * campo `sim` do catálogo, que responde a pergunta certa. `isSimKind` foi apagado — havia TRÊS cópias dele
28
- * (aqui, no main.js e uma derivada morta), todas respondendo pelo `kind`, todas errando junto.
23
+ * The Dev decided (#60): the corrections live in visual accessibility, and this list is cut by `simulatesDisability`,
24
+ * which answers the right question.
29
25
  */
30
26
  export const EMPATHY_VIZ_MODES = VIZ_MODES.filter((m) => simulatesDisability(m.key));
31
- /** Wires the empathy panel's DOM (buttons + boot restore) and returns render/open/close for game.js to call. */
27
+ /** Wires the empathy panel's DOM (buttons + boot restore) and returns render/open/close for the host to call. */
32
28
  export function initSettingsEmpathy(ctx) {
29
+ const { t } = ctx;
33
30
  function render() {
34
31
  ctx.renderVizGroup('#empathy-list', '#empathy-players', EMPATHY_VIZ_MODES);
35
32
  const h = ctx.$('#opt-hearing');
36
33
  if (h) {
37
- h.classList.toggle('is-on', hearingLoss);
38
- h.setAttribute('aria-pressed', String(hearingLoss));
39
- h.textContent = toggleLabel(hearingLoss); // ui/dom
34
+ h.classList.toggle('is-on', ctx.hearing.hearingLoss);
35
+ h.setAttribute('aria-pressed', String(ctx.hearing.hearingLoss));
36
+ h.textContent = toggleLabel(t, ctx.hearing.hearingLoss); // ui/dom
40
37
  }
41
- ctx.reflectMotorEmpathy();
38
+ ctx.reflectMobilityEmpathy();
42
39
  refreshMarks();
43
- // Depois do `renderVizGroup`, e não antes: é ele quem repõe o `.opt-hint` dentro das linhas.
40
+ // After `renderVizGroup`, not before: it is what puts the `.opt-hint` back inside the rows.
44
41
  ctx.fillExplain?.(ctx.$('#empathy .overlay__card'));
45
42
  }
46
43
  /**
47
- * A marca de "saiu do padrão" (ADR-0029). Neste menu ela quer dizer "esta simulação está LIGADA", e por
48
- * isso é a mais útil dos sete: uma criança que ligou a simulação de cegueira está com a tela preta e não
49
- * consegue ler nada — mas o leitor de tela dela percorre o menu e diz qual linha saiu do padrão.
44
+ * The left-the-default mark (ADR-0029). In this menu it means this simulation is ON, which makes it the most useful
45
+ * of all: a child who switched on the blindness simulation has a black screen and cannot read anything — but their
46
+ * screen reader walks the menu and says which row left the default.
50
47
  *
51
- * O recorte é o do reset, pelo mesmo motivo dele: as três CORREÇÕES de daltonismo que este painel lista
52
- * não são deste menu. Marcá-las aqui mandaria a criança daltônica desfazer, no menu de empatia, a correção
53
- * que a faz enxergar o jogo.
48
+ * The cut is the reset's, for the same reason: a colour-blindness CORRECTION a player chose in the visual panel is
49
+ * not this menu's. Marking it here would send the colour-blind child to undo, in the empathy menu, the correction
50
+ * that lets them see the game.
54
51
  */
55
52
  function refreshMarks() {
56
- const simulando = ctx.getPlayers().some((p) => simulatesDisability(p.viz));
57
- const surdez = hearingLoss;
53
+ const simulating = ctx.getPlayers().some((p) => simulatesDisability(p.viz));
54
+ const deafness = ctx.hearing.hearingLoss;
58
55
  const um = ctx.getOneButton() !== DEFAULTS.oneButton;
59
- const cadeira = ctx.getWheelchair() !== DEFAULTS.wheelchair;
60
- const linha = (sel) => ctx.$(sel)?.closest('.ctrl-row') ?? null;
61
- markChanged(linha('#opt-hearing'), surdez);
62
- markChanged(linha('#opt-onebtn'), um);
63
- markChanged(linha('#opt-wheelchair'), cadeira);
64
- markChanged(ctx.$('#empathy-list'), simulando);
65
- markMenuChanged(ctx.$('[data-act="empatia"]'), [simulando, surdez, um, cadeira]);
56
+ const wheelchair = ctx.getWheelchair() !== DEFAULTS.wheelchair;
57
+ const rowOf = (sel) => ctx.$(sel)?.closest('.ctrl-row') ?? null;
58
+ markChanged(t, rowOf('#opt-hearing'), deafness);
59
+ markChanged(t, rowOf('#opt-onebtn'), um);
60
+ markChanged(t, rowOf('#opt-wheelchair'), wheelchair);
61
+ markChanged(t, ctx.$('#empathy-list'), simulating);
62
+ markMenuChanged(t, ctx.$('[data-act="empatia"]'), [simulating, deafness, um, wheelchair]);
66
63
  }
67
64
  function open() {
68
65
  const ov = ctx.$('#empathy');
@@ -84,7 +81,7 @@ export function initSettingsEmpathy(ctx) {
84
81
  return;
85
82
  const b = ctx.$('#opt-empathy');
86
83
  if (b)
87
- b.focus(); // recuo: este id nao existe no documento hoje (gancho de uma barra futura)
84
+ b.focus(); // fallback: this id does not exist in the document today (a hook for a future bar)
88
85
  }
89
86
  const empathyBtn = ctx.$('#opt-empathy');
90
87
  if (empathyBtn)
@@ -94,38 +91,34 @@ export function initSettingsEmpathy(ctx) {
94
91
  empathyClose.addEventListener('click', close);
95
92
  const hearingBtn = ctx.$('#opt-hearing');
96
93
  if (hearingBtn)
97
- hearingBtn.addEventListener('click', () => { ctx.setHearingLoss(!hearingLoss); render(); ctx.reflectVizButtons(); });
94
+ hearingBtn.addEventListener('click', () => { ctx.setHearingLoss(!ctx.hearing.hearingLoss); render(); ctx.reflectVizButtons(); });
98
95
  if (ctx.store.getBool('incl_hearingloss'))
99
- setHearingLossGraph(true); // restaura o grafo de áudio persistido no boot
100
- // `refreshMarks()` depois de CADA um: estes dois setters não passam por `render()` — eles refletem o botão
101
- // por conta própria —, então a marca precisa ser puxada aqui ou nunca acompanha a mudança.
96
+ ctx.hearing.setHearingLossGraph(true); // restores the persisted audio graph at boot
97
+ // `refreshMarks()` after EACH one: these two setters do not go through `render()` — they reflect the button on
98
+ // their own —, so the mark has to be pulled here or it never follows the change.
102
99
  const oneBtn = ctx.$('#opt-onebtn');
103
100
  if (oneBtn)
104
101
  oneBtn.addEventListener('click', () => { ctx.setOneButton(!ctx.getOneButton()); refreshMarks(); });
105
102
  const wheelBtn = ctx.$('#opt-wheelchair');
106
103
  if (wheelBtn)
107
104
  wheelBtn.addEventListener('click', () => { ctx.setWheelchair(!ctx.getWheelchair()); refreshMarks(); });
108
- // ---- restaurar os padrões DESTE menu (ADR-0028) ----
105
+ // ---- reset THIS menu's defaults (ADR-0028) ----
109
106
  //
110
- // De todos os oito, este é o reset que mais precisa existir e o que mais precisa ter cuidado, pelo mesmo
111
- // motivo: é o menu que simula deficiências. Uma criança que liga "Simular cegueira total" fica com a tela
112
- // preta, e a saída — o toque duplo na bolinha — é justamente o que ela acabou de perder a capacidade de ver.
107
+ // Of all the panels, this is the reset that most needs to exist and most needs care, for the same reason: it is the
108
+ // menu that simulates disabilities. A child who switches on the total-blindness simulation has a black screen.
113
109
  //
114
- // E o cuidado: A LISTA DESTE PAINEL NÃO É A LISTA QUE O RESET DESLIGA, e a diferença é deliberada. O painel
115
- // mostra também `fix-protan/fix-deuter/fix-tritan`, que são CORREÇÃO de daltonismo, porque hoje elas não têm
116
- // outro lugar onde morar — o painel visual só cobre os 4 níveis de contraste. Desligá-las junto tiraria de
117
- // uma criança daltônica a única correção que ela tem, a mando de um menu feito para quem não é daltônico.
118
- // Por isso o reset pergunta `simulatesDisability`, que responde pelo modo, e não `isSimKind`, que responde
119
- // pelo `kind` e não distingue simular de corrigir.
110
+ // And the care: THE RESET ASKS `simulatesDisability`, which answers per mode. A colour-blindness CORRECTION a player
111
+ // chose in the visual panel is not a simulation; switching it off here would take the only correction a colour-blind
112
+ // child has, at the command of a menu made for whoever is not colour-blind.
120
113
  const resetBtn = ctx.$('#empathy-reset');
121
114
  if (resetBtn)
122
115
  resetBtn.addEventListener('click', () => {
123
- // Cada setter já é idempotente e anuncia sozinho ao mudar; chamar só na diferença evita anúncio falso de
124
- // "desligado" para algo que nunca esteve ligado. O anúncio-resumo vem por último, e é o que fica no
125
- // `#sr-status` — uma ação, uma frase, em vez de três.
116
+ // Each setter is idempotent and announces on its own when it changes; calling only on a difference avoids a false
117
+ // "off" announcement for something that was never on. The summary announcement comes last, and it is what stays in
118
+ // `#sr-status` — one action, one sentence, instead of three.
126
119
  ctx.getPlayers().forEach((p, i) => { if (simulatesDisability(p.viz))
127
120
  ctx.setPlayerViz(i, 'normal'); });
128
- if (hearingLoss)
121
+ if (ctx.hearing.hearingLoss)
129
122
  ctx.setHearingLoss(false);
130
123
  if (ctx.getOneButton() !== DEFAULTS.oneButton)
131
124
  ctx.setOneButton(DEFAULTS.oneButton);
@@ -0,0 +1,192 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import type { PlayerView } from '../core/entity.js';
3
+ import type { Translate } from '../core/i18n.js';
4
+ import type { DomQuery } from '../core/dom-query.js';
5
+ import { type LatchPlayer as JogadorDaAlternanciaDaAresta } from '../input/latch-sync.js';
6
+ import type { PanelShellCtx } from './panel-shell.js';
7
+ /** Minimal platform/storage.ts shape this module needs. */
8
+ export interface MobilityStore {
9
+ setBool(key: string, on: boolean): void;
10
+ /** Reads the raw key. Only ADR-0029's mark uses it, for one precise question: did the child CHOOSE this? */
11
+ get(key: string): string | null;
12
+ }
13
+ /** Minimal per-player shape this module reads/writes (core/state.ts's `players` entries carry much more). */
14
+ /** The per-player mobility choices: Easy Mode and the latches. */
15
+ export type MobilityPlayer = PlayerView<'easy' | 'toggleMove' | 'toggleRun' | 'walkDir'>;
16
+ export interface SettingsMobilityCtx {
17
+ /** Translates in the page's language — the root's translator (ADR-0232 D3). REQUIRED: text built from nowhere is a raw key. */
18
+ t: Translate;
19
+ /** DOM selector (querySelector), injected — never reaches `document` globally. */
20
+ $: DomQuery;
21
+ /** Screen-reader announcement (core/a11y-sr's srSay), injected. */
22
+ srSay: (msg: string) => void;
23
+ /** Persistence (platform/storage.ts), injected. */
24
+ store: MobilityStore;
25
+ /** Live player list (core/state.ts's `players` — mutated in place, same reference every call). */
26
+ players: MobilityPlayer[];
27
+ /** Live player count (core/state.ts's `numPlayers`); a getter because the value is reassigned over time. */
28
+ getNumPlayers: () => number;
29
+ /** SHARED setter (also used by the pause-menu quick icon `altmove`) — optional: the engine's `setMoveLatch` otherwise. */
30
+ setToggleMove?: (i: number, on: boolean) => void;
31
+ /**
32
+ * DOES THIS GAME HOLD ANY KEY? — `GameDeclaration.holdsKeys` (ADR-0115). Without it the latch row is ABSENT from this
33
+ * panel.
34
+ *
35
+ * ⚠️ Not offering it means making the row absent for everyone, with `hidden`, which takes it off the screen AND out of
36
+ * the accessibility tree — not an `aria-disabled` row that stays in the tab order doing nothing.
37
+ *
38
+ * ⚠️ REQUIRED, for the same reason as in `PauseIconsCtx`: there is no safe default. `true` leaves the row in a game
39
+ * where it does nothing; `false` hides it from a child who depends on it.
40
+ */
41
+ holdsKeys: boolean;
42
+ /**
43
+ * WHICH DEVICE THIS PLAYER IS USING (ADR-0113) — it travels from here to the write.
44
+ *
45
+ * ⚠️ Optional for the same reason as in `LatchWriteCtx`: without it the write does what it already did.
46
+ */
47
+ transportInUse?: (player: number) => string;
48
+ /**
49
+ * THE RUN BUTTON'S LATCH.
50
+ *
51
+ * ⚠️ OPTIONAL (ADR-0106 §1): the engine answers it itself, through `setRunLatch` — none of its steps is the game's.
52
+ * Whoever injects still rules.
53
+ */
54
+ setToggleRun?: (i: number, on: boolean) => void;
55
+ /**
56
+ * THE WORLD'S REACTION to Easy Mode (e.g. coins on the ground) — the game's, and therefore OPTIONAL rather than
57
+ * required.
58
+ *
59
+ * 📌 The default is to DO NOTHING, which is what `core/state` decides a setter does — store, persist, notify — and
60
+ * nothing more: game effects are REACTIONS, subscribed by whoever reacts. The child's choice is stored and holds for
61
+ * whoever reads it; a game without coins has nothing to rebuild, and one that has them injects its own.
62
+ *
63
+ * ⚠️ AND THE ROW STAYS ALIVE WITHOUT IT — not a dead button. `setEasy` writes `p.easy`, persists and announces before
64
+ * calling this; what is missing without the injection is the finishing touch in the world, not the effect.
65
+ */
66
+ rebuildCoins?: () => void;
67
+ /**
68
+ * Moves the rows' prose to the footer (`ui/settings-panel` → `fillExplain`). Called on EVERY render.
69
+ *
70
+ * ⚠️ Relabelling a row puts its `.opt-hint` back inside it — so without this call the explanation appears twice, in
71
+ * the footer and under the label, from the first click. `CLAUDE.md` §4 records exactly this (issue #109).
72
+ *
73
+ * Optional in the signature because a consumer can mount the panel without the shell (a test): without the shell
74
+ * there is no footer to duplicate.
75
+ */
76
+ fillExplain?: (card: HTMLElement | null) => void;
77
+ }
78
+ export interface SettingsMobilityApi {
79
+ /** Re-renders #movement-players (kept `hidden` — see playerTabsHTML) and (re)wires its buttons. */
80
+ renderMovPlayers: () => void;
81
+ /** Reflects the selected player's Easy Mode onto #opt-facil (+ the #opt-movement bar light). */
82
+ reflectEasy: () => void;
83
+ /** Reflects the selected player's movement latch onto #opt-altmove (+ the #opt-movement bar light). */
84
+ reflectAltMove: () => void;
85
+ /** Likewise for the RUN button's latch (#opt-togglerun). */
86
+ reflectToggleRun: () => void;
87
+ /** Sets Easy Mode for player `i`. */
88
+ setEasy: (i: number, on: boolean) => void;
89
+ /** Selects which player this panel edits (the pause actor, before opening the panel). */
90
+ setSelPlayer: (i: number) => void;
91
+ /** Currently selected player index. */
92
+ getSelPlayer: () => number;
93
+ }
94
+ /** localStorage key for a player's Modo Fácil flag (== platform/storage.ts's `easy_p{i}` pattern). */
95
+ export declare function easyKey(i: number): string;
96
+ /**
97
+ * localStorage key of the RUN button's latch, in the LEGACY form (no transport).
98
+ *
99
+ * ⚠️ IT DELEGATES to `platform/storage`, so there is one name only.
100
+ *
101
+ * ⚠️ AND IT IS THE LEGACY KEY. ADR-0104 §C put the TRANSPORT in the name, because the latch belongs to the device and not
102
+ * the person; this one is still read to inherit what the child already had, and is not written. The new key is
103
+ * `latchKey`, in `input/latch-scope`.
104
+ */
105
+ export declare function toggleRunKey(i: number): string;
106
+ /** localStorage key of the MOVEMENT latch, per player. It delegates, like the two siblings above. */
107
+ export declare function toggleMoveKey(i: number): string;
108
+ /**
109
+ * The minimal slice the movement latch's write touches.
110
+ *
111
+ * ⚠️ `walkDir` IS IN IT, and not as a detail: switching the latch off has to STOP whoever is walking by latch. Without
112
+ * it, the child switches the mode off and the character keeps walking by itself, with no key pressed — and no error
113
+ * says so.
114
+ *
115
+ * ⚠️ AND IT IS ITS OWN SLICE, not `MobilityPlayer`, because the TWO callers have different slices: the mobility panel
116
+ * brings `easy`/`toggleRun`, which this does not read, and `PausePlayer` brings the visual and the three reduced-motion
117
+ * flags. A minimal slice lets both pass without either carrying the other's.
118
+ *
119
+ * 📌 THE DEFINITION LIVES IN `input/latch-sync` (issue #127), beside the rule that uses it, and the NAME stays published
120
+ * here, as an alias (ADR-0106 step 1a). Since issue #204 the names snapshot reads a re-export too, so either form keeps
121
+ * the name in this module's snapshot.
122
+ */
123
+ export type LatchPlayer = JogadorDaAlternanciaDaAresta;
124
+ /** What the write needs to know. Everything here already lives in `SettingsMobilityCtx` and `PauseIconsCtx`. */
125
+ export interface LatchWriteCtx {
126
+ /** Translates in the page's language — the root's translator (ADR-0232 D3). REQUIRED: text built from nowhere is a raw key. */
127
+ readonly t: Translate;
128
+ readonly players: readonly LatchPlayer[];
129
+ readonly store: {
130
+ setBool(key: string, on: boolean): void;
131
+ };
132
+ readonly srSay: (msg: string) => void;
133
+ readonly getNumPlayers: () => number;
134
+ /**
135
+ * WHICH DEVICE THIS PLAYER IS USING (ADR-0113). `input/state.inputOf(i)` answers it.
136
+ *
137
+ * ⚠️ OPTIONAL ON PURPOSE, because of what happens without it: the write falls back to exactly what it did before —
138
+ * only the per-player key.
139
+ *
140
+ * 📌 And it is INJECTED instead of imported: `ui/` reading `input/` module state would be a new edge between two
141
+ * layers, to save one argument. This ctx receives everything else that way.
142
+ */
143
+ readonly transportInUse?: (player: number) => string;
144
+ }
145
+ /**
146
+ * SWITCHES A PLAYER'S MOVEMENT LATCH ON OR OFF — the engine does it (ADR-0106 §4).
147
+ *
148
+ * ⚠️ Being shared by TWO engine surfaces (this panel and the pause bar's `altmove` icon) is a reason for the engine to
149
+ * own it, not for the cartridge to keep it — and every step is the engine's: `toggleMove` and `walkDir` are
150
+ * `PlayerBase` fields, the key is `platform/storage`'s, and `sr.motor.toggleMove*` are engine i18n keys. There is no
151
+ * game effect left to inject.
152
+ */
153
+ export declare function setMoveLatch(ctx: LatchWriteCtx, i: number, on: boolean): void;
154
+ /**
155
+ * SWITCHES THE RUN LATCH ON OR OFF — `setMoveLatch`'s sibling, and simpler.
156
+ *
157
+ * 🎯 THE SAME REASON TO EXIST: every step is the engine's — `toggleRun` is a `PlayerBase` field, the key is
158
+ * `platform/storage`'s `KEYS.toggleRunP(i)`, and `sr.motor.toggleRun*` are engine i18n keys. **There is no game effect
159
+ * to inject**, which is why `SettingsMobilityCtx.setToggleRun` is optional: a game that does not supply it still gets a
160
+ * live run row instead of a dead one.
161
+ *
162
+ * ⚠️ AND IT DOES NOT CALL `applyLatch`, unlike its sibling. That one stops whoever walks by latch on switch-off, because
163
+ * the MOVEMENT latch leaves the character walking by itself; the run latch governs a speed lock, which cannot leave anyone
164
+ * moving. Copying the line "for symmetry" would touch `walkDir` because of a button that does not.
165
+ *
166
+ * 📌 The announcement is UNCONDITIONAL, like its sibling's: the child pressed the button, and staying silent because the
167
+ * value already was that leaves the control with no answer for whoever listens instead of looking.
168
+ */
169
+ export declare function setRunLatch(ctx: LatchWriteCtx, i: number, on: boolean): void;
170
+ /**
171
+ * MOUNTS THIS PANEL'S INSIDE — the per-seat tabs and the three rows it reaches.
172
+ *
173
+ * 🔴 THE CONTRACT WOULD OTHERWISE BE INVISIBLE (the shape `ui/panel-shell` names one level up): this module looks for
174
+ * `#movement-players`, `#opt-facil`, `#opt-altmove` and `#opt-togglerun`, and nothing in the type says so — so it builds
175
+ * them, instead of a panel that opens with nothing but a card, a title and a reset button.
176
+ *
177
+ * ⚠️ AND IT LIVES HERE, not in the composition root: whoever knows these four ids and each control's shape is this file,
178
+ * and nobody else. A root writing them would be a root guessing.
179
+ *
180
+ * ⚠️ THE THREE ROWS ARE ALWAYS CREATED, the latch row included. Whether it is SEEN is decided at init by `holdsKeys`
181
+ * (ADR-0115), with `hidden`, which takes the row off the screen AND out of the accessibility tree. Creating it only when
182
+ * it applies would put the same rule in two places, and the day they diverged the row would appear in a game where it
183
+ * does nothing.
184
+ *
185
+ * 📌 THE ORDER IS THE DECISION, as in every menu of this project (ADR-0044 §2): the tabs first, because they say WHOSE
186
+ * the next choices are; then Easy Mode, the most sought; and the two latches together, the same idea applied to two
187
+ * buttons.
188
+ *
189
+ * Idempotent: calling it twice reuses the list instead of duplicating it.
190
+ */
191
+ export declare function mountMobilityInside(t: Translate, ctx: PanelShellCtx, card: HTMLElement, list: HTMLElement): void;
192
+ export declare function initSettingsMobility(ctx: SettingsMobilityCtx): SettingsMobilityApi;