@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,29 +1,29 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  /**
3
- * `sim` — este modo SIMULA uma deficiência em quem não a tem, em vez de CORRIGIR a tela para quem a tem.
3
+ * `sim` — this mode SIMULATES a disability in someone who does not have it, instead of CORRECTING the screen for someone
4
+ * who does.
4
5
  *
5
- * O `kind` não responde a isso e nunca respondeu: `sim-deuter` (simular daltonismo) e `fix-deuter` (corrigir
6
- * daltonismo) compartilham `kind:'filter'`, ainda que sirvam a duas pessoas opostas. Enquanto ninguém
7
- * precisava distinguir, a lacuna era inofensiva. Passou a não ser quando o menu de empatia ganhou um
8
- * "restaurar padrões" (ADR-0028): desligar as simulações é o objetivo do botão, e desligar as correções junto
9
- * seria tirar de uma criança daltônica a única correção que ela tem — a partir do menu que existe para quem
10
- * NÃO tem a deficiência. Um reset que faz isso é pior que a armadilha que ele deveria desfazer.
6
+ * `kind` does not answer that: `sim-deuter` (simulating colour blindness) and `fix-deuter` (correcting it) share
7
+ * `kind:'filter'`, though they serve two opposite people. It matters because the empathy menu's "restore defaults"
8
+ * (ADR-0028) turns the simulations off, and turning the corrections off with them would take from a colour-blind child
9
+ * the only correction they have — from the menu that exists for whoever does NOT have the disability. A reset that does
10
+ * that is worse than the trap it should undo.
11
11
  *
12
- * Só os 9 modos marcados simulam. Os 3 `fix-*` corrigem, os 3 `hc-direto*` corrigem, e `normal` não faz nada.
12
+ * Only the 9 marked modes simulate. The 3 `fix-*` correct, the 3 `hc-direto*` correct, and `normal` does nothing.
13
13
  */
14
14
  /**
15
- * Um modo de visão. `nome` e `desc` guardam CHAVE i18n, não texto — mesma decisão de `CenarioTema.nome` e
16
- * `RM_LABEL`, e pelo mesmo motivo: uma tabela de `const` com texto resolve UMA vez, no import, e fica
17
- * congelada no idioma do boot. Este menu é o que uma criança de baixa visão ou daltônica lê para configurar o
18
- * PRÓPRIO jogo; deixá-lo em português numa build em inglês tira dela a única página que ela precisava ler.
15
+ * A vision mode. `name` and `desc` keep an i18n KEY, not text — the same decision as `SceneryTheme.name` and
16
+ * `RM_LABEL`, for the same reason: a `const` table with text resolves ONCE, on import, and stays frozen in the boot's
17
+ * language. This menu is what a low-vision or colour-blind child reads to configure their OWN game; leaving it in
18
+ * Portuguese in an English build takes from them the one page they needed to read.
19
19
  *
20
- * Quem EXIBE resolve (`render/viz-setters`, `consumer-quiz`), e por isso este módulo continua FOLHA: dado
21
- * puro, sem dependência nenhuma, importável dos dois lados da fronteira.
20
+ * Whoever SHOWS it resolves it (`render/viz-setters`, `consumer-quiz`), and that is why this module stays a LEAF: pure
21
+ * data, no dependency, importable from both sides of the boundary.
22
22
  */
23
23
  export type VizMode = {
24
24
  key: string;
25
25
  kind: string;
26
- nome: string;
26
+ name: string;
27
27
  desc: string;
28
28
  lv?: string;
29
29
  sim?: true;
@@ -33,29 +33,28 @@ export declare const VIZ_BY_KEY: Record<string, VizMode>;
33
33
  export declare const VIZ_FILTER: Record<string, string>;
34
34
  export declare const VIZ_CYCLE: string[];
35
35
  /**
36
- * Este modo simula uma deficiência? Chave desconhecida (ou vazia) → false, porque a pergunta que o chamador
37
- * está fazendo é "posso desligar isto sem tirar nada de ninguém?", e a resposta honesta diante do
38
- * desconhecido é não.
36
+ * Does this mode simulate a disability? An unknown (or empty) key → false, because the question the caller is asking is
37
+ * "can I turn this off without taking anything from anyone?", and the honest answer in front of the unknown is no.
39
38
  */
40
39
  export declare function simulatesDisability(key: string): boolean;
41
40
  /**
42
- * As CORREÇÕES de daltonismo: daltonizam a tela para quem TEM a condição. Derivadas do catálogo, nunca
43
- * listadas à mão — são exatamente os filtros que não simulam.
41
+ * The colour-blindness CORRECTIONS: they daltonise the screen for whoever HAS the condition. Derived from the catalogue,
42
+ * never listed by hand — they are exactly the filters that do not simulate.
44
43
  *
45
- * Existem como lista própria porque moram no menu de ACESSIBILIDADE VISUAL, e não no de empatia (decisão do
46
- * Dev, issue #60). Ficaram anos no menu errado por um motivo que este arquivo agora conserta: `kind` não
47
- * distinguia simular de corrigir, então o painel de empatia, que se recorta por `kind:'filter'`, arrastava as
48
- * três junto. Dois públicos opostos na mesma lista — quem quer sentir como é ser daltônico e quem é.
44
+ * They exist as a list of their own because they live in the VISUAL ACCESSIBILITY menu, and not in the empathy one (the
45
+ * Dev's decision, issue #60). With `kind` not telling simulating from correcting, the empathy panel, which cuts itself
46
+ * by `kind:'filter'`, dragged the three along: two opposite audiences in one list — whoever wants to feel what being
47
+ * colour-blind is like, and whoever is.
49
48
  */
50
49
  export declare const VIZ_CORRECTIONS: readonly VizMode[];
51
- /** Este modo precisa de um CANVAS de mundo para existir? Só os `hcnew` precisam: eles repintam texturas. */
50
+ /** Does this mode need a world CANVAS to exist? Only the `hcnew` ones do: they repaint textures. */
52
51
  export declare function needsCanvas(key: string): boolean;
53
52
  /**
54
- * Os modos que funcionam em QUALQUER jogo — os que se aplicam como filtro de CSS sobre um elemento.
53
+ * The modes that work in ANY game — the ones applied as a CSS filter over an element.
55
54
  *
56
- * Derivada, nunca listada à mão: um modo novo entra na pilha certa por causa do `kind` que ele declara, e não
57
- * porque alguém lembrou de acrescentá-lo aqui. É a mesma regra de `VIZ_CORRECTIONS`.
55
+ * Derived, never listed by hand: a new mode enters the right stack because of the `kind` it declares, not because
56
+ * someone remembered to add it here. The same rule as `VIZ_CORRECTIONS`.
58
57
  */
59
58
  export declare const VIZ_DOM_ONLY: readonly VizMode[];
60
- /** Os modos que EXIGEM mundo. Complemento exato de `VIZ_DOM_ONLY` — juntos, os 16, sem sobra nem repetição. */
59
+ /** The modes that REQUIRE a world. The exact complement of `VIZ_DOM_ONLY` — together, the 16, no leftover and no repeat. */
61
60
  export declare const VIZ_CANVAS_ONLY: readonly VizMode[];
@@ -1,21 +1,21 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  export const VIZ_MODES = [
3
- { key: 'normal', kind: 'normal', nome: 'viz.normal', desc: 'viz.desc.normal' },
4
- { key: 'hc-direto', kind: 'hcnew', nome: 'viz.hc-direto', desc: 'viz.desc.hc-direto' },
5
- { key: 'hc-direto-45', kind: 'hcnew', nome: 'viz.hc-direto-45', desc: 'viz.desc.hc-direto-45' },
6
- { key: 'hc-direto-7', kind: 'hcnew', nome: 'viz.hc-direto-7', desc: 'viz.desc.hc-direto-7' },
7
- { key: 'sim-deuter', sim: true, kind: 'filter', nome: 'viz.sim-deuter', desc: 'viz.desc.sim-deuter' },
8
- { key: 'sim-protan', sim: true, kind: 'filter', nome: 'viz.sim-protan', desc: 'viz.desc.sim-protan' },
9
- { key: 'sim-tritan', sim: true, kind: 'filter', nome: 'viz.sim-tritan', desc: 'viz.desc.sim-tritan' },
10
- { key: 'fix-protan', kind: 'filter', nome: 'viz.fix-protan', desc: 'viz.desc.fix-protan' },
11
- { key: 'fix-deuter', kind: 'filter', nome: 'viz.fix-deuter', desc: 'viz.desc.fix-deuter' },
12
- { key: 'fix-tritan', kind: 'filter', nome: 'viz.fix-tritan', desc: 'viz.desc.fix-tritan' },
13
- { key: 'lv-blur', sim: true, kind: 'lowvision', lv: 'blur', nome: 'viz.lv-blur', desc: 'viz.desc.lv-blur' },
14
- { key: 'lv-haze', sim: true, kind: 'lowvision', lv: 'haze', nome: 'viz.lv-haze', desc: 'viz.desc.lv-haze' },
15
- { key: 'lv-tunnel', sim: true, kind: 'lowvision', lv: 'tunnel', nome: 'viz.lv-tunnel', desc: 'viz.desc.lv-tunnel' },
16
- { key: 'lv-macular', sim: true, kind: 'lowvision', lv: 'macular', nome: 'viz.lv-macular', desc: 'viz.desc.lv-macular' },
17
- { key: 'lv-diabetic', sim: true, kind: 'lowvision', lv: 'diabetic', nome: 'viz.lv-diabetic', desc: 'viz.desc.lv-diabetic' },
18
- { key: 'blind', sim: true, kind: 'blind', nome: 'viz.blind', desc: 'viz.desc.blind' },
3
+ { key: 'normal', kind: 'normal', name: 'viz.normal', desc: 'viz.desc.normal' },
4
+ { key: 'hc-direto', kind: 'hcnew', name: 'viz.hc-direto', desc: 'viz.desc.hc-direto' },
5
+ { key: 'hc-direto-45', kind: 'hcnew', name: 'viz.hc-direto-45', desc: 'viz.desc.hc-direto-45' },
6
+ { key: 'hc-direto-7', kind: 'hcnew', name: 'viz.hc-direto-7', desc: 'viz.desc.hc-direto-7' },
7
+ { key: 'sim-deuter', sim: true, kind: 'filter', name: 'viz.sim-deuter', desc: 'viz.desc.sim-deuter' },
8
+ { key: 'sim-protan', sim: true, kind: 'filter', name: 'viz.sim-protan', desc: 'viz.desc.sim-protan' },
9
+ { key: 'sim-tritan', sim: true, kind: 'filter', name: 'viz.sim-tritan', desc: 'viz.desc.sim-tritan' },
10
+ { key: 'fix-protan', kind: 'filter', name: 'viz.fix-protan', desc: 'viz.desc.fix-protan' },
11
+ { key: 'fix-deuter', kind: 'filter', name: 'viz.fix-deuter', desc: 'viz.desc.fix-deuter' },
12
+ { key: 'fix-tritan', kind: 'filter', name: 'viz.fix-tritan', desc: 'viz.desc.fix-tritan' },
13
+ { key: 'lv-blur', sim: true, kind: 'lowvision', lv: 'blur', name: 'viz.lv-blur', desc: 'viz.desc.lv-blur' },
14
+ { key: 'lv-haze', sim: true, kind: 'lowvision', lv: 'haze', name: 'viz.lv-haze', desc: 'viz.desc.lv-haze' },
15
+ { key: 'lv-tunnel', sim: true, kind: 'lowvision', lv: 'tunnel', name: 'viz.lv-tunnel', desc: 'viz.desc.lv-tunnel' },
16
+ { key: 'lv-macular', sim: true, kind: 'lowvision', lv: 'macular', name: 'viz.lv-macular', desc: 'viz.desc.lv-macular' },
17
+ { key: 'lv-diabetic', sim: true, kind: 'lowvision', lv: 'diabetic', name: 'viz.lv-diabetic', desc: 'viz.desc.lv-diabetic' },
18
+ { key: 'blind', sim: true, kind: 'blind', name: 'viz.blind', desc: 'viz.desc.blind' },
19
19
  ];
20
20
  export const VIZ_BY_KEY = Object.fromEntries(VIZ_MODES.map((m) => [m.key, m]));
21
21
  export const VIZ_FILTER = { 'sim-deuter': 'url(#cvd-deuter)', 'sim-protan': 'url(#cvd-protan)', 'sim-tritan': 'url(#cvd-tritan)',
@@ -23,52 +23,47 @@ export const VIZ_FILTER = { 'sim-deuter': 'url(#cvd-deuter)', 'sim-protan': 'url
23
23
  'lv-blur': 'blur(2.4px)', 'lv-haze': 'contrast(.58) brightness(1.14) blur(.6px)', 'lv-tunnel': 'blur(.5px)', 'lv-macular': '', 'lv-diabetic': 'blur(.8px)', 'blind': 'brightness(0)' };
24
24
  export const VIZ_CYCLE = VIZ_MODES.map((m) => m.key);
25
25
  /**
26
- * Este modo simula uma deficiência? Chave desconhecida (ou vazia) → false, porque a pergunta que o chamador
27
- * está fazendo é "posso desligar isto sem tirar nada de ninguém?", e a resposta honesta diante do
28
- * desconhecido é não.
26
+ * Does this mode simulate a disability? An unknown (or empty) key → false, because the question the caller is asking is
27
+ * "can I turn this off without taking anything from anyone?", and the honest answer in front of the unknown is no.
29
28
  */
30
29
  export function simulatesDisability(key) {
31
30
  return VIZ_BY_KEY[key]?.sim === true;
32
31
  }
33
32
  /**
34
- * As CORREÇÕES de daltonismo: daltonizam a tela para quem TEM a condição. Derivadas do catálogo, nunca
35
- * listadas à mão — são exatamente os filtros que não simulam.
33
+ * The colour-blindness CORRECTIONS: they daltonise the screen for whoever HAS the condition. Derived from the catalogue,
34
+ * never listed by hand — they are exactly the filters that do not simulate.
36
35
  *
37
- * Existem como lista própria porque moram no menu de ACESSIBILIDADE VISUAL, e não no de empatia (decisão do
38
- * Dev, issue #60). Ficaram anos no menu errado por um motivo que este arquivo agora conserta: `kind` não
39
- * distinguia simular de corrigir, então o painel de empatia, que se recorta por `kind:'filter'`, arrastava as
40
- * três junto. Dois públicos opostos na mesma lista — quem quer sentir como é ser daltônico e quem é.
36
+ * They exist as a list of their own because they live in the VISUAL ACCESSIBILITY menu, and not in the empathy one (the
37
+ * Dev's decision, issue #60). With `kind` not telling simulating from correcting, the empathy panel, which cuts itself
38
+ * by `kind:'filter'`, dragged the three along: two opposite audiences in one list — whoever wants to feel what being
39
+ * colour-blind is like, and whoever is.
41
40
  */
42
41
  export const VIZ_CORRECTIONS = VIZ_MODES.filter((m) => m.kind === 'filter' && !m.sim);
43
- /* ===================== AS DUAS PILHAS COM UM NOME SÓ (achado 8, item 19) ===================== */
42
+ /* ===================== TWO STACKS UNDER ONE NAME ===================== */
44
43
  //
45
- // O segundo consumidor mediu, e a medição é o motivo desta seção existir:
44
+ // What the menu calls "visual accessibility" is TWO stacks under one name — the engine's second consumer measured it:
45
+ // the `hcnew` modes REPAINT tile TEXTURES in PIXI, and a quiz has no tiles to repaint. One stack is DOM/CSS
46
+ // (colour-blindness filters, typography, letter case) and serves any game; the other is CANVAS (direct rendering,
47
+ // outlines, role colours) and only exists where there is a world.
46
48
  //
47
- // "O ALTO CONTRASTE NÃO VIAJA, e a razão é estrutural, não um defeito. Os modos `hcnew` REPINTAM
48
- // TEXTURAS de tile na PIXI; um quiz não tem tiles, e não há o que repintar. Ou seja: o que o menu chama
49
- // de 'acessibilidade visual' são DUAS pilhas com um nome só — uma de DOM/CSS (filtros de daltonismo,
50
- // tipografia, caixa alta) que serve a qualquer jogo; uma de CANVAS (renderização direta, contornos,
51
- // cores de papel) que só existe onde há mundo. O painel as apresenta numa lista única de 7 modos… A
52
- // divisão do passo 5 precisa cortar AQUI."
49
+ // This is the cut, and it is one of DATA, not of files — the files were already apart (`render/cvd-matrices` is pure
50
+ // DOM; `render/high-contrast` repaints a world whose tiles it is handed). What was missing was the table SAYING which
51
+ // stack each mode belongs to, so nobody rebuilds the answer in their head.
53
52
  //
54
- // Este é o corte, e ele é de DADO e não de arquivo — os arquivos já estavam separados (`render/cvd-matrices`
55
- // é DOM puro; `render/high-contrast` importa `core/collision.tileAt`). O que faltava era a tabela DIZER a
56
- // qual pilha cada modo pertence, para que ninguém mais reconstruísse a resposta de cabeça.
57
- //
58
- // E era reconstruída: o segundo consumidor escrevia
53
+ // And it was being rebuilt: the second consumer wrote
59
54
  // `VIZ_MODES.filter((m) => m.kind === 'normal' || (m.kind === 'filter' && !simulatesDisability(m.key)))`
60
- // — uma expressão que mistura DUAS perguntas diferentes ("precisa de canvas?" e "isto simula deficiência?")
61
- // e que todo consumidor futuro teria de reinventar, com a chance de acertar uma e errar a outra.
62
- /** Este modo precisa de um CANVAS de mundo para existir? Só os `hcnew` precisam: eles repintam texturas. */
55
+ // — an expression mixing TWO different questions ("does it need a canvas?" and "does it simulate a disability?") that
56
+ // every future consumer would have to reinvent, with the chance of getting one right and the other wrong.
57
+ /** Does this mode need a world CANVAS to exist? Only the `hcnew` ones do: they repaint textures. */
63
58
  export function needsCanvas(key) {
64
59
  return VIZ_BY_KEY[key]?.kind === 'hcnew';
65
60
  }
66
61
  /**
67
- * Os modos que funcionam em QUALQUER jogo — os que se aplicam como filtro de CSS sobre um elemento.
62
+ * The modes that work in ANY game — the ones applied as a CSS filter over an element.
68
63
  *
69
- * Derivada, nunca listada à mão: um modo novo entra na pilha certa por causa do `kind` que ele declara, e não
70
- * porque alguém lembrou de acrescentá-lo aqui. É a mesma regra de `VIZ_CORRECTIONS`.
64
+ * Derived, never listed by hand: a new mode enters the right stack because of the `kind` it declares, not because
65
+ * someone remembered to add it here. The same rule as `VIZ_CORRECTIONS`.
71
66
  */
72
67
  export const VIZ_DOM_ONLY = VIZ_MODES.filter((m) => !needsCanvas(m.key));
73
- /** Os modos que EXIGEM mundo. Complemento exato de `VIZ_DOM_ONLY` — juntos, os 16, sem sobra nem repetição. */
68
+ /** The modes that REQUIRE a world. The exact complement of `VIZ_DOM_ONLY` — together, the 16, no leftover and no repeat. */
74
69
  export const VIZ_CANVAS_ONLY = VIZ_MODES.filter((m) => needsCanvas(m.key));
@@ -0,0 +1,32 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import { type UnavailableReason, type VisualState } from './viz-axes.js';
3
+ /** A line ready to translate: the key and what it needs. `null` = nothing to say. */
4
+ export interface Refusal {
5
+ readonly key: string;
6
+ /** What the child has to undo for the demonstration to be honest. */
7
+ readonly axis: UnavailableReason;
8
+ }
9
+ /**
10
+ * The reason's i18n key, per axis off its default.
11
+ *
12
+ * ⚠️ THREE KEYS AND NOT ONE WITH A PARAMETER, and the difference is one of translation, not style: in Portuguese
13
+ * «o tema» and «a correção de cor» take different articles, and «os dois» is the plural of neither. A sentence with an
14
+ * axis parameter would force each language to build agreement from a loose noun — exactly the defect `sr.nav.clockOne`
15
+ * already recorded for «às 1 horas».
16
+ */
17
+ export declare const REASON_KEY: Readonly<Record<UnavailableReason, string>>;
18
+ /**
19
+ * Can this simulation be offered? And if not, what to say.
20
+ *
21
+ * `null` = it can; the interface shows nothing, because a notice that always appears stops being read.
22
+ */
23
+ export declare function simulationRefusal(v: VisualState): Refusal | null;
24
+ /**
25
+ * Should the simulation appear DISABLED instead of vanishing?
26
+ *
27
+ * ⚠️ ALWAYS, AND IT IS ADR-0076's «never silently removed» HALF. It exists as a function with a name of its own, and not
28
+ * as a `!refusal` at the call site, because it answers a different question: `simulationRefusal` says *why* it cannot;
29
+ * this one says *that the line stays on screen*. Whoever draws needs both, and merging them would make the answer
30
+ * "there is no reason" look like "do not draw the line".
31
+ */
32
+ export declare function showsEvenWhenUnavailable(): boolean;
@@ -0,0 +1,57 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // render/viz-refusal — WHY THE SIMULATION IS NOT AVAILABLE, told to the child (ADR-0076, issue #104).
3
+ //
4
+ // ========================= WHAT THE REFUSAL HAS TO DO, AND WHAT IT MUST NOT DO =========================
5
+ // ADR-0076 requires an unavailable simulation to appear **VISIBLE and explained** — «never silently removed, never
6
+ // accepted then ignored». The two halves of that sentence describe two different defects:
7
+ //
8
+ // · REMOVING SILENTLY teaches that the thing does not exist. An adult who showed the simulation to a class yesterday
9
+ // and cannot find it today concludes it was taken away, not that they themselves turned high contrast on.
10
+ // · ACCEPTING AND IGNORING is worse: the demonstration SEEMS to be running. Over an already corrected screen it shows
11
+ // neither the disability nor the correction; over a high-contrast theme it shows what the THEME does and not what
12
+ // deuteranopia does. ⚠️ It is not a weaker demonstration — **it teaches something false**.
13
+ //
14
+ // ⚠️ AND THE REASON IS A FACT ABOUT THE DEMONSTRATION, NEVER A REPROACH TO WHOEVER CHOSE. Whoever turned high contrast
15
+ // on did so because they need it; whoever turned colour correction on sees better with it. The sentence says what the
16
+ // demonstration needs to be honest, and how to go back — never "turn that off".
17
+ //
18
+ // ========================= WHY THIS IS A PURE MODULE =========================
19
+ // The same shape as `ui/reach-notice`: it returns DATA (an i18n key + parameters), not ready text. The sentence belongs
20
+ // to the interface and has to go through `t()`; returning prose from here would put a language in a module that has
21
+ // none. And, being pure, the refusal's design can be checked in the `node` project, with no document.
22
+ //
23
+ // A leaf module: it imports only the types and the predicate of the two-axis model.
24
+ import { simulationUnavailable } from './viz-axes.js';
25
+ /**
26
+ * The reason's i18n key, per axis off its default.
27
+ *
28
+ * ⚠️ THREE KEYS AND NOT ONE WITH A PARAMETER, and the difference is one of translation, not style: in Portuguese
29
+ * «o tema» and «a correção de cor» take different articles, and «os dois» is the plural of neither. A sentence with an
30
+ * axis parameter would force each language to build agreement from a loose noun — exactly the defect `sr.nav.clockOne`
31
+ * already recorded for «às 1 horas».
32
+ */
33
+ export const REASON_KEY = Object.freeze({
34
+ tema: 'sim.indisponivel.tema',
35
+ correcao: 'sim.indisponivel.correcao',
36
+ ambos: 'sim.indisponivel.ambos',
37
+ });
38
+ /**
39
+ * Can this simulation be offered? And if not, what to say.
40
+ *
41
+ * `null` = it can; the interface shows nothing, because a notice that always appears stops being read.
42
+ */
43
+ export function simulationRefusal(v) {
44
+ const reason = simulationUnavailable(v);
45
+ return reason === null ? null : { key: REASON_KEY[reason], axis: reason };
46
+ }
47
+ /**
48
+ * Should the simulation appear DISABLED instead of vanishing?
49
+ *
50
+ * ⚠️ ALWAYS, AND IT IS ADR-0076's «never silently removed» HALF. It exists as a function with a name of its own, and not
51
+ * as a `!refusal` at the call site, because it answers a different question: `simulationRefusal` says *why* it cannot;
52
+ * this one says *that the line stays on screen*. Whoever draws needs both, and merging them would make the answer
53
+ * "there is no reason" look like "do not draw the line".
54
+ */
55
+ export function showsEvenWhenUnavailable() {
56
+ return true;
57
+ }
@@ -1,60 +1,67 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  import { type VizMode } from './viz-modes.js';
3
- import { type Tema, type Correcao, type VisualState } from './viz-axes.js';
3
+ import { type Theme, type Correction, type VisualState } from './viz-axes.js';
4
+ import type { Translate } from '../core/i18n.js';
5
+ import { type HighContrast } from './high-contrast.js';
6
+ import type { Store } from '../platform/storage.js';
7
+ /** What each player's visual state is read and written through. */
8
+ export type VisualStore = Pick<Store, 'get' | 'getJSON' | 'set' | 'setJSON'>;
4
9
  import type { DomQuery } from '../core/dom-query.js';
5
- import type { ComFiltro, ComTextura, Visivel, DesenhoComCirculo, AplicarFiltroCss, AlcanceDoFiltro, AplicarAltoContrasteNoDom } from './port.js';
10
+ import type { WithFilter, WithTexture, Visible, DrawingWithCircle, ApplyCssFilter, FilterReach, ApplyHighContrastToDom } from './port.js';
6
11
  /**
7
- * Até onde o filtro deste modo vai. MELHORIA alcança os menus; EMPATIA fica no mundo (ver `AlcanceDoFiltro`).
8
- * Derivado de `sim`, do catálogo — a mesma flag que já distingue os dois, e não uma segunda lista para
9
- * alguém esquecer de atualizar.
12
+ * How far this mode's filter reaches. ENHANCEMENT reaches the menus; EMPATHY stays in the world (see `FilterReach`).
13
+ * Derived from the catalogue's `sim` — the same flag that already tells the two apart, not a second list for someone
14
+ * to forget to update.
10
15
  */
11
- export declare function alcanceDoModo(mode: string): AlcanceDoFiltro;
12
- /** Modo por chave, com o fallback do original: chave desconhecida (ou nula) CAI em `normal`. */
16
+ export declare function reachOfMode(mode: string): FilterReach;
17
+ /** The mode by key, with a fallback: an unknown (or null) key FALLS to `normal`. */
13
18
  export declare function resolveViz(key: string | null | undefined): VizMode;
14
19
  /**
15
- * O ESTADO VISUAL GUARDADO deste jogador, de qualquer das duas formas (issue #104).
20
+ * This player's STORED VISUAL STATE, in either of its two shapes (issue #104).
16
21
  *
17
- * ⚠️ ESTA FUNÇÃO É A CAIXA «um ajuste salvo antes da divisão restaura o mesmo estado visível» da definition
18
- * of done, e a ordem das duas leituras é a decisão inteira:
22
+ * ⚠️ THIS FUNCTION IS THE definition of done's box that says a setting saved before the split restores the same visible
23
+ * state, and the order of the two reads is the whole decision:
19
24
  *
20
- * 1. a chave NOVA (`visualP`), que é a única que sabe dizer dois eixos;
21
- * 2. na falta dela, a chave VELHA (`vizP`), que guarda a string única — e é aqui que mora o ajuste de toda
22
- * criança que já jogou este jogo antes de hoje;
23
- * 3. na falta das duas, o padrão.
25
+ * 1. the NEW key (`visualP`), the only one that can express two axes;
26
+ * 2. without it, the OLD key (`vizP`), which keeps the single string — and where the setting of every child who
27
+ * played this game before the split lives;
28
+ * 3. without either, the default.
24
29
  *
25
- * ⚠️ O RECUO NÃO É ZELO: sem ele, a primeira sessão depois da actualização apagaria o modo visual que ela
26
- * escolheu — e quem escolheu `fix-deuter` ou `hc-direto-7` escolheu-o porque enxerga assim. É a diferença
27
- * entre migrar e recomeçar.
30
+ * ⚠️ THE FALLBACK IS NOT ZEAL: without it, the first session after the update would erase the visual mode the child
31
+ * chose — and whoever chose `fix-deuter` or `hc-direto-7` chose it because that is how they see. It is the difference
32
+ * between migrating and starting over.
28
33
  *
29
- * `migrarVisual` aceita as duas formas e é idempotente, então isto pode correr quantas vezes for preciso.
34
+ * `migrateVisual` accepts both shapes and is idempotent, so this can run as many times as needed.
35
+ *
36
+ * 📌 THE STORE IS A PARAMETER (ADR-0232, issue #207): the page's store, built by whoever composes the page.
30
37
  */
31
- export declare function lerVisualGuardado(i: number): VisualState;
32
- /** É um dos três níveis de Renderização Direta (alto contraste)? Mesmo teste do original: `!!DIRECT_CFG[mode]`. */
38
+ export declare function readStoredVisual(store: VisualStore, i: number): VisualState;
39
+ /** Is it one of the three Direct Rendering (high contrast) levels? The test is `!!DIRECT_CFG[mode]`. */
33
40
  export declare function isDirectMode(mode: string): boolean;
34
- /** Filtro CSS da canvas no SOLO: simulação/correção de visão + realce L→Q, compostos e sem vazios. */
41
+ /** The canvas's CSS filter in SOLO: vision simulation/correction + the L→Q enhancement, composed and with no gaps. */
35
42
  export declare function cssFilterFor(mode: string, lq: string): string;
36
- /** Bolinha indicadora de um viewport: só cegueira (branca) e baixa visão (verde) acendem. */
43
+ /** A viewport's indicator dot: only blindness (white) and low vision (green) light it. */
37
44
  export declare function vizDotFor(m: VizMode | undefined): {
38
45
  visible: boolean;
39
46
  fill: number | null;
40
47
  };
41
- /** Bolinha GLOBAL (#viz-indicator) para um `kind`: visível, classes e rótulo de leitor de tela. */
48
+ /** The GLOBAL dot (#viz-indicator) for a `kind`: visible, classes and screen-reader label. */
42
49
  export declare function vizIndicatorFor(kind: string): {
43
50
  on: boolean;
44
51
  blind: boolean;
45
52
  low: boolean;
46
53
  label: string;
47
54
  };
48
- /** Classe do overlay DOM de baixa visão (`lv-haze`/`lv-tunnel`/…); '' para qualquer outro kind. */
55
+ /** The low-vision DOM overlay's class (`lv-haze`/`lv-tunnel`/…); '' for any other kind. */
49
56
  export declare function lvOverlayClassFor(m: VizMode): string;
50
- /** HTML do grupo de rádios de modos visuais (uma linha por modo; o atual marcado). Verbatim do game.js. */
51
- export declare function vizGroupHtml(modes: readonly VizMode[], cur: string): string;
52
- /** Fala do leitor de tela ao escolher um modo: prefixa "Jogador N:" só em multi-tela. */
53
- export declare function vizGroupSay(numPlayers: number, sel: number, nome: string): string;
54
- type Filtered = ComFiltro;
55
- type Textured = ComTextura;
56
- /** PIXI.Graphics da bolinha por viewport — só o que updateVpDots realmente usa. */
57
- type DotGfx = Visivel & DesenhoComCirculo;
57
+ /** The HTML of the vision modes' radio group (one row per mode; the current one marked). */
58
+ export declare function vizGroupHtml(t: Translate, modes: readonly VizMode[], cur: string): string;
59
+ /** The screen reader's line when a mode is chosen: prefixed with the player only on several screens. */
60
+ export declare function vizGroupSay(numPlayers: number, sel: number, name: string): string;
61
+ type Filtered = WithFilter;
62
+ type Textured = WithTexture;
63
+ /** The per-viewport dot's PIXI.Graphics — only what updateVpDots really uses. */
64
+ type DotGfx = Visible & DrawingWithCircle;
58
65
  interface ClassListHost {
59
66
  classList: {
60
67
  toggle(token: string, force?: boolean): unknown;
@@ -72,16 +79,21 @@ interface Pu {
72
79
  sprite?: Textured | null;
73
80
  }
74
81
  export interface VizSettersCtx {
75
- /** O seletor do jogo (#viz-overlay, #viz-indicator, listas do painel). `DomQuery` de `core/dom-query`
76
- * desde 2026-08-26: a versão local era NÃO-GENÉRICA, e uma função genérica atribuída a uma
77
- * assinatura não-genérica é instanciada pela RESTRIÇÃO. O `El` estrutural continua abaixo — ele é a
78
- * fatia que este módulo LÊ, e `HTMLElement` a satisfaz. */
82
+ /** Translates in the page's language — the root's translator (ADR-0232 D3). REQUIRED: text built from nowhere is a raw key. */
83
+ t: Translate;
84
+ /**
85
+ * Where each player's visual state is kept — the page's store, built by the root (ADR-0232, issue #207). Required: a
86
+ * correction written nowhere is gone at the next visit, for the child who chose it because that is how they see.
87
+ */
88
+ store: VisualStore;
89
+ /** The game's selector (#viz-overlay, #viz-indicator, the panel's lists). `DomQuery` from `core/dom-query`: a local
90
+ * NON-GENERIC version would instantiate a generic function by its CONSTRAINT when assigned to it. */
79
91
  $: DomQuery;
80
92
  body: ClassListHost;
81
93
  srSay: (s: string) => void;
82
- aplicarFiltroCss: AplicarFiltroCss;
83
- /** Alto contraste no DOM — o filtro não o alcança porque ele não É filtro. Issue #83. */
84
- aplicarAltoContrasteNoDom: AplicarAltoContrasteNoDom;
94
+ applyCssFilter: ApplyCssFilter;
95
+ /** High contrast in the DOM — the filter does not reach it because it IS not a filter. Issue #83. */
96
+ applyHighContrastToDom: ApplyHighContrastToDom;
85
97
  camera: Filtered;
86
98
  worldSprite: Textured;
87
99
  parallaxLayers: Textured[];
@@ -89,19 +101,17 @@ export interface VizSettersCtx {
89
101
  getVpSpr: () => Filtered[];
90
102
  getVpDots: () => DotGfx[];
91
103
  /**
92
- * Os sprites dos ITENS declarados (o array vive no jogo e pode ser recriado — por isso getter).
104
+ * The declared ITEMS' sprites (the array lives in the game and may be recreated — hence a getter).
93
105
  *
94
- * Era `getCoinSprites`, e o nome dizia o que eles são. Mesma fatia que `render/draw` recebe desde o corte
95
- * das entidades declaradas: uma lista de sprites, sem o desenho saber o que cada um representa.
106
+ * A list of sprites, with the drawing not knowing what each one represents — not a coin-shaped getter.
96
107
  */
97
108
  getItemSprites: () => (Textured | null | undefined)[];
98
109
  /**
99
- * Como o JOGO chama os itens dele no cache de recoloração de `render/high-contrast`.
110
+ * What the GAME calls its items in `render/high-contrast`'s recolour cache.
100
111
  *
101
- * Era `spriteTexFor('coin', mode)` — a string cravada aqui dentro. O cache já não tinha forma de moeda
102
- * (ele chaveia por `(id, modo)`); quem ainda nomeava uma era este módulo. Repare no vizinho de baixo: os
103
- * power-ups sempre carregaram o próprio `kind`, e a engine só o repassa. Os itens não carregavam nada, e
104
- * por isso o nome tinha de estar em algum lugar — agora está do lado de quem o escolheu.
112
+ * The cache keys by `(id, mode)`; a `'coin'` string fixed in here would be this module naming one game's item. Note
113
+ * the neighbour below: power-ups always carried their own `kind`, and the engine only passes it on. The items carried
114
+ * nothing, so the name had to live somewhere — it lives on the side of whoever chose it.
105
115
  */
106
116
  itemTexId: string;
107
117
  getPowerups: () => readonly Pu[];
@@ -117,46 +127,74 @@ export interface VizSettersCtx {
117
127
  playerVizTex: (base: unknown, mode: string) => unknown;
118
128
  pixiFilterFor: (mode: string) => unknown;
119
129
  clearPlayerDirectCache: () => void;
130
+ /**
131
+ * A POWER-UP'S TEXTURE IN THIS VISUAL MODE, and forgetting it — through a DOOR (ADR-0228).
132
+ *
133
+ * 🔴 A power-up is a game's furniture, and so is its texture cache. What is the ENGINE's is the rule — switching visual
134
+ * mode repaints what is on screen —, and that rule does not need to know what a power-up is.
135
+ */
136
+ pupTexFor: (kind: string, mode: string) => unknown;
137
+ resetPupTexCache: () => void;
138
+ /**
139
+ * THE WORLD'S HIGH CONTRAST (`render/high-contrast`'s `createHighContrast`), built by whoever has the world — the root
140
+ * has none (ADR-0232 D4, issue #207). REQUIRED: the recoloured world and sprites, and their caches, are that instance's.
141
+ */
142
+ hc: Pick<HighContrast, 'worldTexFor' | 'spriteTexFor' | 'clearWorldTexCache' | 'clearSpriteTexCache'>;
143
+ /**
144
+ * The L→Q contrast enhancement's CSS fragment (`render/lq-filter`'s `createLqFilter().filter`), '' when off. REQUIRED:
145
+ * the enhancement is a low-vision child's, and a filter recomposed without it would drop it in silence.
146
+ */
147
+ lqFilter: () => string;
120
148
  setFrontDim: (on: boolean) => void;
121
149
  rebuildExtras: () => void;
122
150
  rebuildCoins: () => void;
123
- setModoCego?: (on: boolean) => void;
151
+ /**
152
+ * The blindness empathy mode turns on the cane + audio cues: the settings store's blind-mode writer (write, persist,
153
+ * notify). REQUIRED (ADR-0232 D2c): the store is built by the root and passed in; a game that is its own root passes
154
+ * `setBlindModeValue` from `core/state`.
155
+ */
156
+ setBlindMode: (on: boolean) => void;
157
+ /**
158
+ * Writes the single LEGACY visual-mode mirror (`incl_viz`) — the settings store's `setVizModeValue`. REQUIRED for the
159
+ * same reason: the old readers of the global key would lose the child's mode without it.
160
+ */
161
+ setVizMode: (mode: string) => void;
124
162
  hideTouchControls: (reason?: string) => void;
125
163
  reflectVizButtons: () => void;
126
164
  renderVisualPanel: () => void;
127
165
  renderEmpathyPanel: () => void;
128
166
  }
129
167
  export interface VizSettersApi {
130
- /** Multi-tela: aplica as texturas ESTÁTICAS do modo (memoizado) + a do quadro atual de cada jogador. */
168
+ /** Several screens: applies the mode's STATIC textures (memoised) + each player's current frame. */
131
169
  applySharedTextures(mode: string): void;
132
- /** Bolinhas indicadoras por viewport (fora do filtro do viewport — visíveis mesmo em cegueira). */
170
+ /** Per-viewport indicator dots (outside the viewport's filter — visible even in blindness). */
133
171
  updateVpDots(): void;
134
- /** Filtro PIXI de cada viewport = modo do jogador daquela tela. */
172
+ /** Each viewport's PIXI filter = the mode of that screen's player. */
135
173
  applyVpFilters(): void;
136
- /** Troca o modo de UM jogador: persiste, invalida o render estático e reaplica pelo caminho certo. */
174
+ /** Changes ONE player's mode: persists, invalidates the static render and reapplies by the right path. */
137
175
  setPlayerViz(i: number, mode: string): void;
138
176
  /**
139
- * O ESTADO INTEIRO de um jogador, e os DOIS escritores por eixo (#104).
177
+ * A player's WHOLE state, and the TWO per-axis writers (#104).
140
178
  *
141
- * ⚠️ Os dois de eixo existem separados porque é isso que um painel de dois controles precisa: mexer no
142
- * TEMA sem tocar na correção, e vice-versa. Enquanto havia um campo só, «mexer num» significava
143
- * inevitavelmente «apagar o outro» — e era o defeito, não a API.
179
+ * ⚠️ The per-axis writers are separate because that is what a two-control panel needs: changing the THEME without
180
+ * touching the correction, and vice versa. With a single field, changing one inevitably meant erasing the other — and
181
+ * that was the defect, not the API.
144
182
  */
145
- setVisualDoJogador(i: number, v: VisualState): void;
146
- setTemaDoJogador(i: number, tema: Tema): void;
147
- setCorrecaoDoJogador(i: number, correcao: Correcao): void;
148
- /** Caminho SOLO: filtro CSS na canvas + texturas globais + overlay DOM + bolinha. */
183
+ setPlayerVisual(i: number, v: VisualState): void;
184
+ setPlayerTheme(i: number, theme: Theme): void;
185
+ setPlayerCorrection(i: number, correction: Correction): void;
186
+ /** The SOLO path: CSS filter on the canvas + global textures + DOM overlay + dot. */
149
187
  applyVizGlobal(v: VisualState): void;
150
- /** Reaplica tudo depois de uma mudança estrutural (cenário, nº de telas). */
188
+ /** Reapplies everything after a structural change (scenery, number of screens). */
151
189
  reapplyVizAll(): void;
152
- /** Bolinha global (#viz-indicator) para um `kind`. */
190
+ /** The global dot (#viz-indicator) for a `kind`. */
153
191
  updateVizIndicator(kind: string): void;
154
- /** Invalida os caches de textura direta (mundo/moeda/power-up/jogador) e re-renderiza. */
192
+ /** Invalidates the direct texture caches (world/sprites/power-ups/player) and re-renders. */
155
193
  rebakeDirect(): void;
156
- /** Grupo de rádios de modos visuais nos painéis (visual/empatia). */
194
+ /** The vision modes' radio group in the panels (visual/empathy). */
157
195
  renderVizGroup(listSel: string, tabsSel: string, modes: readonly VizMode[]): void;
158
- /** Os DOIS eixos do painel visual (#104). Irmão do de cima — ver a nota na implementação. */
159
- renderEixosVisuais(listSel: string, tabsSel: string): void;
196
+ /** The visual panel's TWO axes (#104). The sibling of the one above — see the note in the implementation. */
197
+ renderVisualAxes(listSel: string, tabsSel: string): void;
160
198
  }
161
199
  export declare function initVizSetters(ctx: VizSettersCtx): VizSettersApi;
162
200
  export {};