@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,59 +1,82 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/viewports — a FÁBRICA de imagem dos modos de visão acessível: como um MODO vira PIXEL.
2
+ // render/viewports — the IMAGE FACTORY of the accessible vision modes: how a MODE becomes a PIXEL.
3
3
  //
4
- // Par de render/viz-setters, que levou a POLÍTICA ("qual modo vale onde": por jogador, global, overlays, painéis).
5
- // Aqui mora a outra metade — a produção do pixel em si, que a política consome:
6
- // · `pixiFilterFor` — modo → filtro GPU do viewport (daltonismo, cegueira, baixa visão)
7
- // · `parallaxTexFor` — camada de fundo i, recolorida (ou não) para o modo
8
- // · `treeTexFor` — decoração de fundo, idem
9
- // · `playerVizTex` — quadro do jogador com contorno escuro no alto contraste
10
- // · `lvOverlay*` / `renderVpOverlay` — a névoa/túnel/mancha de baixa visão DENTRO da render-texture do viewport
11
- // Os quatro primeiros entravam em viz-setters por injeção (`parallaxTexFor`/`treeTexFor`/`playerVizTex`/
12
- // `pixiFilterFor` no `VizSettersCtx`) enquanto ainda moravam no game.js; a partir daqui quem os fornece é este
13
- // módulo. Ver docs/5-Refactoring/plano-modularizacao-mapa.md (B2).
4
+ // The pair of render/viz-setters, which holds the POLICY ("which mode counts where": per player, global, overlays,
5
+ // panels). Here lives the other half — producing the pixel itself, which the policy consumes:
6
+ // · `pixiFilterFor` — mode → the viewport's GPU filter (colour blindness, blindness, low vision)
7
+ // · `parallaxTexFor` — background layer i, recoloured (or not) for the mode
8
+ // · `treeTexFor` — background decoration, likewise
9
+ // · `playerVizTex` — the player's frame with a dark outline in high contrast
10
+ // · `lvOverlay*` / `renderVpOverlay` — low vision's haze/tunnel/spot INSIDE the viewport's render texture
14
11
  //
15
- // A DUPLICAÇÃO QUE ESTA EXTRAÇÃO CUROU: as seis matrizes de daltonismo estavam escritas duas vezes — como
16
- // `<feColorMatrix>` no app/index.html (caminho de tela única) e como `PIXI.ColorMatrixFilter` dentro de
17
- // `pixiFilterFor` (caminho multi-tela). Saíram para render/cvd-matrices (folha, zero deps); `pixiFilterFor` lê
18
- // de lá e `initViewports` GERA os `<filter>` do documento de lá também. O sintoma da divergência era silencioso
19
- // e de acessibilidade: a mesma pessoa daltônica veria cores diferentes em tela única e em multi-tela.
12
+ // THE DUPLICATION THIS CURES: the six colour-blindness matrices were once written twice — as `<feColorMatrix>` in a
13
+ // page's HTML (the single-screen path) and as a `PIXI.ColorMatrixFilter` (the multi-screen path). They live in
14
+ // render/cvd-matrices (a leaf, zero deps); `pixiFilterFor` reads from there and `initViewports` GENERATES the document's
15
+ // `<filter>`s from there too. A divergence would be silent and about accessibility: the same colour-blind person would
16
+ // see different colours on one screen and on several.
20
17
  //
21
- // Fronteiras que este módulo NÃO reabre:
22
- // · `parallaxTexNormal` e `treeTexNormal` (as texturas CRUAS, fonte do recolor) continuam nascendo no game.js
23
- // — a primeira é preenchida por `setCenario` (carrega PNG por tema), a segunda pelo desenho procedural da
24
- // árvore. Entram injetadas. `parallaxTexNormal` é `const` cujos ELEMENTOS `setCenario` troca in place → entra
25
- // por VALOR (o array é o mesmo objeto); `vpTex` é `let` que `configureRender` REATRIBUI a cada troca de nº de
26
- // telas → entra por GETTER.
27
- // · `lvOverlaySpr` e o renderer são objetos PIXI criados no game.js e entram por interface ESTRUTURAL, para o
28
- // módulo rodar no project `node` sem importar PIXI. Mesmo precedente de render/scene-sky e game/traffic.
29
- // · `_lastSharedViz` NÃO é daqui (é o registro do render estático, fica no game.js) — ver o topo de viz-setters.
18
+ // Boundaries this module does NOT reopen:
19
+ // · `parallaxTexNormal` and the tree texture (the RAW textures, the recolour's source) are born in the host — the
20
+ // first filled by the host's scenery loader (a PNG per theme), the second by its procedural drawing. They come in
21
+ // injected. `parallaxTexNormal` is an array whose ELEMENTS the host swaps in place → it comes in by VALUE (the array
22
+ // is the same object); the viewport textures are REASSIGNED whenever the number of screens changes → by GETTER.
23
+ // · The overlay sprite and the renderer are PIXI objects the host creates and come in through a STRUCTURAL
24
+ // interface, so the module runs in the `node` project without importing PIXI.
30
25
  //
31
- // POR QUE `getTreeTexNormal`/`getLvOverlaySpr` são GETTERS e não valores, sendo os dois `const` no game.js:
32
- // não é reatribuição, é ORDEM DE BOOT. `clearParallaxTexCache` precisa existir dentro de `setCenario`, que o
33
- // game.js chama no topo do módulo (na restauração do cenário salvo) — bem ANTES de `treeTexNormal` e
34
- // `lvOverlaySpr` serem declarados. Com getters, `initViewports` pode ser chamado cedo o bastante para aquela
35
- // chamada não cair em TDZ; com valores, o `const` ainda não inicializado derrubaria a restauração do tema
36
- // dentro de um `try/catch` que apenas cai para 'cidade' — o jogador perderia o cenário escolhido em silêncio.
26
+ // WHY `getTreeTexNormal`/`getLvOverlaySpr` are GETTERS and not values: BOOT ORDER, not reassignment. A host may call
27
+ // `clearParallaxTexCache` while restoring a saved scenery before those objects exist; with getters, `initViewports`
28
+ // can be called early enough for that call to work, where a value would be read before it exists — and a scenery
29
+ // restore inside a `try/catch` that falls back to a default would lose the chosen scenery silently.
37
30
  //
38
- // SEM I/O no import: nada de makeCanvas/tex no corpo do módulo (precedente de render/textures). O único efeito
39
- // de `initViewports` é gerar os `<filter>` SVG, que é justamente o ponto da cura da duplicação.
31
+ // NO I/O on import: no makeCanvas/tex in the module body. `initViewports`'s one effect is generating the SVG `<filter>`s,
32
+ // which is precisely the point of curing the duplication.
40
33
  import { LOGICAL_W, LOGICAL_H } from '../core/constants.js';
41
34
  import { makeCanvas, tex } from './canvas.js';
42
- import { DIRECT_CFG, directBgTexture, directSpriteTexture } from './high-contrast.js';
35
+ import { DIRECT_CFG } from './high-contrast.js';
43
36
  import { VIZ_BY_KEY } from './viz-modes.js';
37
+ import { drawLowVision } from './low-vision-drawing.js';
44
38
  import { CVD_MATRIX, installCvdFilters } from './cvd-matrices.js';
39
+ /**
40
+ * The modes a COLOUR MATRIX draws, besides colour vision (which reads the single source, `CVD_MATRIX`). Blindness is
41
+ * brightness 0 NOT multiplied — black, not darkened; the cataract's haze is contrast lowered and THEN a multiplied
42
+ * brightness, and the order is the effect.
43
+ */
44
+ const MATRIX_OF = {
45
+ blind: (c) => { c.brightness(0, false); },
46
+ 'lv-haze': (c) => { c.contrast(-0.45, false); c.brightness(1.12, true); },
47
+ };
48
+ /** The modes a BLUR draws, and how strong. The tunnel and the spots are also drawn as a texture on top (`renderVpOverlay`). */
49
+ const BLUR_OF = { 'lv-blur': 5, 'lv-tunnel': 1.5, 'lv-diabetic': 2, 'lv-macular': 2 };
50
+ /**
51
+ * A mode's viewport filter, or `null` for a mode with none — and for one whose PIXI constructor is missing, which falls back
52
+ * to no filter instead of throwing. High contrast is never here: it is a texture, not a filter.
53
+ */
54
+ function filterFor(mode, CM, BL) {
55
+ const cvd = CVD_MATRIX[mode]; // the single source: the SAME numbers that build the HTML `<feColorMatrix>`
56
+ // a COPY of the matrix: holding the module's array, the filter's own calls would rewrite the source every mode reads
57
+ const paint = cvd ? (c) => { c.matrix = cvd.slice(); } : MATRIX_OF[mode];
58
+ if (paint)
59
+ return CM ? [matrixWith(CM, paint)] : null;
60
+ const strength = BLUR_OF[mode];
61
+ return strength !== undefined && BL ? [new BL(strength)] : null;
62
+ }
63
+ function matrixWith(CM, paint) {
64
+ const c = new CM();
65
+ paint(c);
66
+ return c;
67
+ }
45
68
  export function initViewports(ctx) {
46
- // Gera os seis <filter> de daltonismo do documento a partir de render/cvd-matrices — a MESMA fonte que
47
- // pixiFilterFor lê logo abaixo. É por isso que tela única e multi-tela não podem mais divergir.
69
+ // Generates the document's six colour-blindness <filter>s from render/cvd-matrices — the SAME source pixiFilterFor
70
+ // reads just below. That is why one screen and several can no longer diverge.
48
71
  installCvdFilters(ctx.cvdDefsHost);
49
- /* ===================== fundo: parallax e decoração ===================== */
72
+ /* ===================== background: parallax and decoration ===================== */
50
73
  const _parallaxTexHC = {}; // {mode: [tex,tex,tex]}
51
74
  function parallaxTexFor(i, mode) {
52
75
  if (DIRECT_CFG[mode]) {
53
76
  (_parallaxTexHC[mode] = _parallaxTexHC[mode] || []);
54
77
  if (!_parallaxTexHC[mode][i])
55
- _parallaxTexHC[mode][i] = directBgTexture(ctx.parallaxTexNormal[i], mode);
56
- return _parallaxTexHC[mode][i]; // direto: fundo recua
78
+ _parallaxTexHC[mode][i] = ctx.hc.directBgTexture(ctx.parallaxTexNormal[i], mode);
79
+ return _parallaxTexHC[mode][i]; // direct: the background steps back
57
80
  }
58
81
  return ctx.parallaxTexNormal[i];
59
82
  }
@@ -63,14 +86,14 @@ export function initViewports(ctx) {
63
86
  function treeTexFor(mode) {
64
87
  if (DIRECT_CFG[mode]) {
65
88
  if (!_treeTexHC[mode])
66
- _treeTexHC[mode] = directBgTexture(ctx.getTreeTexNormal(), mode);
67
- return _treeTexHC[mode]; // direto: decoração recua
89
+ _treeTexHC[mode] = ctx.hc.directBgTexture(ctx.getTreeTexNormal(), mode);
90
+ return _treeTexHC[mode]; // direct: the decoration steps back
68
91
  }
69
92
  return ctx.getTreeTexNormal();
70
93
  }
71
- /* ===================== frente: o jogador ===================== */
72
- // {mode: Map<texturaBase, texturaComContorno>} — chaveado pela textura de ORIGEM porque o jogador troca de
73
- // quadro toda frame; um Map por modo evita recontornar o mesmo quadro a cada volta da animação.
94
+ /* ===================== foreground: the player ===================== */
95
+ // {mode: Map<baseTexture, outlinedTexture>} — keyed by the SOURCE texture because the player changes frame every tick;
96
+ // a Map per mode avoids outlining the same frame again on every loop of the animation.
74
97
  let _playerDirect = {};
75
98
  function playerVizTex(base, mode) {
76
99
  if (!base)
@@ -78,94 +101,40 @@ export function initViewports(ctx) {
78
101
  if (DIRECT_CFG[mode]) {
79
102
  const mm = (_playerDirect[mode] = _playerDirect[mode] || new Map());
80
103
  if (!mm.has(base))
81
- mm.set(base, directSpriteTexture(base, mode));
82
- return mm.get(base); // direto: player com contorno escuro → salta
104
+ mm.set(base, ctx.hc.directSpriteTexture(base, mode));
105
+ return mm.get(base); // direct: the player with a dark outline → it jumps out
83
106
  }
84
107
  return base;
85
108
  }
86
109
  function clearPlayerDirectCache() { _playerDirect = {}; }
87
- /* ===================== o filtro do viewport ===================== */
88
- // Cacheado por MODO e por identidade: o mesmo array de filtros volta sempre, então trocar de viewport não
89
- // reconstrói o filtro (nem invalida o shader do PIXI). Guarda `null` também — `mode in cache` e não
90
- // `cache[mode]` — para que modo sem filtro (normal, hc-*) não seja reprocessado a cada frame.
110
+ /* ===================== the viewport's filter ===================== */
111
+ // Cached per MODE and by identity: the same filter array always comes back, so switching viewport does not rebuild the
112
+ // filter (nor invalidate PIXI's shader). It keeps `null` too — `mode in cache` and not `cache[mode]` — so a mode with
113
+ // no filter (normal, hc-*) is not reprocessed every frame.
91
114
  const _vpFilterCache = {};
92
115
  function pixiFilterFor(mode) {
93
116
  if (mode in _vpFilterCache)
94
117
  return _vpFilterCache[mode];
95
- let f = null;
96
- const CM = ctx.ColorMatrixFilter, BL = ctx.BlurFilter;
97
- const cvd = CVD_MATRIX[mode]; // fonte única: os MESMOS números que geram o <feColorMatrix> do HTML
98
- if (cvd && CM) {
99
- const c = new CM();
100
- c.matrix = cvd.slice();
101
- f = [c];
102
- } // slice: o filtro não fica com o array do módulo
103
- else if (mode === 'blind' && CM) {
104
- const c = new CM();
105
- c.brightness(0, false);
106
- f = [c];
107
- }
108
- else if (mode === 'lv-blur' && BL) {
109
- f = [new BL(5)];
110
- }
111
- else if (mode === 'lv-haze' && CM) {
112
- const c = new CM();
113
- c.contrast(-0.45, false);
114
- c.brightness(1.12, true);
115
- f = [c];
116
- }
117
- else if ((mode === 'lv-tunnel' || mode === 'lv-diabetic' || mode === 'lv-macular') && BL) {
118
- f = [new BL(mode === 'lv-tunnel' ? 1.5 : 2)];
119
- }
120
- return _vpFilterCache[mode] = f;
118
+ return _vpFilterCache[mode] = filterFor(mode, ctx.ColorMatrixFilter, ctx.BlurFilter);
121
119
  }
122
- /* ===================== baixa visão: o overlay como textura ===================== */
123
- // O que o filtro GPU não sabe fazer: névoa de catarata, o túnel do glaucoma, a mancha central da degeneração
124
- // macular e as manchas espalhadas da retinopatia. São desenho, não transformação de cor — vêm como textura.
120
+ /* ===================== low vision: the overlay as a texture ===================== */
121
+ // What the GPU filter cannot do: a cataract's haze, glaucoma's tunnel, macular degeneration's central spot and
122
+ // retinopathy's scattered spots. They are drawing, not a colour transform — they come as a texture.
125
123
  function lvOverlayCanvas(lv) {
126
- const W = LOGICAL_W, H = LOGICAL_H, cv = makeCanvas(W, H), c = cv.getContext('2d'), cx = W / 2, cy = H / 2;
127
- if (lv === 'haze') {
128
- c.fillStyle = 'rgba(244,246,250,0.42)';
129
- c.fillRect(0, 0, W, H);
130
- }
131
- else if (lv === 'tunnel') {
132
- const g = c.createRadialGradient(cx, cy, H * 0.12, cx, cy, H * 0.6);
133
- g.addColorStop(0, 'rgba(0,0,0,0)');
134
- g.addColorStop(.5, 'rgba(0,0,0,.55)');
135
- g.addColorStop(1, 'rgba(0,0,0,.99)');
136
- c.fillStyle = g;
137
- c.fillRect(0, 0, W, H);
138
- }
139
- else if (lv === 'macular') {
140
- const g = c.createRadialGradient(cx, cy, 2, cx, cy, H * 0.34);
141
- g.addColorStop(0, 'rgba(12,12,15,.95)');
142
- g.addColorStop(.55, 'rgba(12,12,15,.5)');
143
- g.addColorStop(1, 'rgba(12,12,15,0)');
144
- c.fillStyle = g;
145
- c.fillRect(0, 0, W, H);
146
- }
147
- else if (lv === 'diabetic') {
148
- for (const [fx, fy, fr] of [[.22, .3, .1], [.64, .22, .075], [.8, .58, .11], [.4, .7, .085], [.16, .8, .07], [.54, .48, .06]]) {
149
- const x = fx * W, y = fy * H, r = fr * W, g = c.createRadialGradient(x, y, 1, x, y, r);
150
- g.addColorStop(0, 'rgba(10,10,14,.95)');
151
- g.addColorStop(.5, 'rgba(10,10,14,.7)');
152
- g.addColorStop(1, 'rgba(10,10,14,0)');
153
- c.fillStyle = g;
154
- c.fillRect(x - r, y - r, 2 * r, 2 * r);
155
- }
156
- }
124
+ const W = LOGICAL_W, H = LOGICAL_H, cv = makeCanvas(ctx.doc, W, H), c = cv.getContext('2d');
125
+ drawLowVision(c, lv, W, H); // one drawing for the viewports and for the world `createGame` declares (issue #182)
157
126
  return cv;
158
127
  }
159
128
  const _lvOverlayTex = {};
160
129
  function lvOverlayTex(lv) {
161
130
  if (lv === 'blur')
162
- return null; // desfoque é filtro puro, não tem o que carimbar
131
+ return null; // blur is a pure filter, there is nothing to stamp
163
132
  if (!_lvOverlayTex[lv])
164
133
  _lvOverlayTex[lv] = tex(lvOverlayCanvas(lv));
165
134
  return _lvOverlayTex[lv];
166
135
  }
167
- // Overlay DENTRO da render-texture (a bolinha indicadora do viewport fica por cima, FORA do filtro — é por
168
- // isso que ela continua visível no modo cegueira; ver updateVpDots em render/viz-setters).
136
+ // The overlay INSIDE the render texture (the viewport's indicator dot sits on top, OUTSIDE the filter — which is why
137
+ // it stays visible in blindness mode; see updateVpDots in render/viz-setters).
169
138
  function renderVpOverlay(i, mode) {
170
139
  const m = VIZ_BY_KEY[mode];
171
140
  if (!m || m.kind !== 'lowvision')
@@ -174,7 +143,7 @@ export function initViewports(ctx) {
174
143
  if (t) {
175
144
  const spr = ctx.getLvOverlaySpr();
176
145
  spr.texture = t;
177
- ctx.renderizarEm(spr, ctx.getVpTex()[i], false);
146
+ ctx.renderInto(spr, ctx.getVpTex()[i], false);
178
147
  }
179
148
  }
180
149
  return {
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import { type Theme, type Correction, type VisualState } from './viz-axes.js';
3
+ /** Each theme's label. An i18n key — whoever shows it resolves it, like the rest of the menu. */
4
+ export declare const THEME_LABEL: Readonly<Record<Theme, string>>;
5
+ /** Each colour correction's label. */
6
+ export declare const CORRECTION_LABEL: Readonly<Record<Correction, string>>;
7
+ /**
8
+ * The SHORT labels, for the quick bar's icons — «7:1», «deuteranopia».
9
+ *
10
+ * ⚠️ THEY ARE THE KEYS THAT ALREADY EXISTED (`contrast.*`, `cvd.*`), rekeyed per axis. The quick bar speaks short
11
+ * because it announces ONE icon at a time, and the panel speaks in full because the child is reading a list — the
12
+ * difference is one of context. Reusing instead of translating again keeps the same word in both places.
13
+ */
14
+ export declare const SHORT_THEME: Readonly<Record<Theme, string>>;
15
+ export declare const SHORT_CORRECTION: Readonly<Record<Correction, string>>;
16
+ /** The two axes, as the panel identifies them in the DOM (stored values, and so Portuguese). */
17
+ export type VisualAxis = 'tema' | 'correcao';
18
+ /** A translator, the same the rest of the interface gets. */
19
+ export type Translator = (key: string, params?: Record<string, string | number>) => string;
20
+ /**
21
+ * ONE axis's rows, in the radio shape the panel already uses.
22
+ *
23
+ * ⚠️ A RADIO AND NOT SEVEN BUTTONS: WITHIN an axis the values stay exclusive — one theme at a time, one correction at a
24
+ * time. What stopped being exclusive is the relation BETWEEN the axes, which is why they become two radios instead of
25
+ * one.
26
+ *
27
+ * ⚠️ AND THE VISIBLE-ROW SHAPE STAYS, not a `<select>`. The visual panel records the mistake the Dev caught on the first
28
+ * attempt: inside a closed box, a control whose reason to exist is to be FOUND by whoever sees poorly becomes «quase o
29
+ * mesmo que não ter movido».
30
+ */
31
+ export declare function axisRows(axisName: VisualAxis, options: readonly string[], optionLabels: Readonly<Record<string, string>>, selected: string, t: Translator): string;
32
+ /**
33
+ * The TWO axes, one after the other, with a title each.
34
+ *
35
+ * The title exists because two unnamed radios in a row are one radio of eight for whoever reads fast — and that reading
36
+ * is exactly the misunderstanding the split exists to undo.
37
+ */
38
+ export declare function axesHtml(v: VisualState, t: Translator): string;
39
+ /** What a click on a panel button means. `null` when the button belongs to no axis. */
40
+ export interface AxisChoice {
41
+ readonly axis: VisualAxis;
42
+ readonly value: string;
43
+ }
44
+ export declare function buttonChoice(dataset: {
45
+ eixo?: string;
46
+ valor?: string;
47
+ }): AxisChoice | null;
@@ -0,0 +1,88 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // render/viz-axes-labels — THE VISUAL MENU WITH TWO CONTROLS (ADR-0076, issue #104), the pure half.
3
+ //
4
+ // ========================= WHY TWO CONTROLS AND NOT ONE =========================
5
+ // A SINGLE control was the honest way to state a REAL exclusivity while `p.viz` kept ONE value: two separate controls
6
+ // would overwrite each other silently — the child would pick the correction, then the contrast, and lose the correction
7
+ // with nothing saying so. ⚠️ THAT REASON IS GONE: `p.viz` keeps two axes plus the simulation, and the per-axis writers
8
+ // (`setPlayerTheme`/`setPlayerCorrection`) change one without touching the other. Keeping the single control would state
9
+ // an exclusivity that no longer exists — and keep denying both to whoever needs both.
10
+ //
11
+ // ========================= THE DEFAULTS' NAMES ARE A DECISION, NOT ROUTINE =========================
12
+ // ⚠️ «Tema padrão» and «Visão tricromática», and ADR-0076 closes its *definition of done* with the rule that chose them:
13
+ // **no default label diagnoses the reader**. `modo sem deficiência visual` was offered and refused — it tells the child
14
+ // what they are NOT, in the menu they opened to be able to play. A default is named by what it IS.
15
+ //
16
+ // And `Modo padrão` (`viz.normal`) does not serve here: it was the SHARED neutral from when the two axes were one. With
17
+ // two controls, a «padrão» that does not say the default of WHAT is ambiguous in both.
18
+ //
19
+ // A pure module: it returns HTML and i18n keys and touches no document. `render/viz-setters`, in the same layer,
20
+ // mounts it (issue #167).
21
+ import { THEMES, CORRECTIONS } from './viz-axes.js';
22
+ /** Each theme's label. An i18n key — whoever shows it resolves it, like the rest of the menu. */
23
+ export const THEME_LABEL = Object.freeze({
24
+ padrao: 'eixo.tema.padrao',
25
+ hc3: 'viz.hc-direto',
26
+ hc45: 'viz.hc-direto-45',
27
+ hc7: 'viz.hc-direto-7',
28
+ });
29
+ /** Each colour correction's label. */
30
+ export const CORRECTION_LABEL = Object.freeze({
31
+ tricro: 'eixo.correcao.tricro',
32
+ protan: 'viz.fix-protan',
33
+ deuter: 'viz.fix-deuter',
34
+ tritan: 'viz.fix-tritan',
35
+ });
36
+ /**
37
+ * The SHORT labels, for the quick bar's icons — «7:1», «deuteranopia».
38
+ *
39
+ * ⚠️ THEY ARE THE KEYS THAT ALREADY EXISTED (`contrast.*`, `cvd.*`), rekeyed per axis. The quick bar speaks short
40
+ * because it announces ONE icon at a time, and the panel speaks in full because the child is reading a list — the
41
+ * difference is one of context. Reusing instead of translating again keeps the same word in both places.
42
+ */
43
+ export const SHORT_THEME = Object.freeze({
44
+ padrao: 'contrast.off', hc3: 'contrast.3', hc45: 'contrast.45', hc7: 'contrast.7',
45
+ });
46
+ export const SHORT_CORRECTION = Object.freeze({
47
+ tricro: 'cvd.off', protan: 'cvd.protan', deuter: 'cvd.deuter', tritan: 'cvd.tritan',
48
+ });
49
+ /**
50
+ * ONE axis's rows, in the radio shape the panel already uses.
51
+ *
52
+ * ⚠️ A RADIO AND NOT SEVEN BUTTONS: WITHIN an axis the values stay exclusive — one theme at a time, one correction at a
53
+ * time. What stopped being exclusive is the relation BETWEEN the axes, which is why they become two radios instead of
54
+ * one.
55
+ *
56
+ * ⚠️ AND THE VISIBLE-ROW SHAPE STAYS, not a `<select>`. The visual panel records the mistake the Dev caught on the first
57
+ * attempt: inside a closed box, a control whose reason to exist is to be FOUND by whoever sees poorly becomes «quase o
58
+ * mesmo que não ter movido».
59
+ */
60
+ export function axisRows(axisName, options, optionLabels, selected, t) {
61
+ return options.map((valueName) => {
62
+ const sel = valueName === selected;
63
+ return `<div class="ctrl-row"><span><strong>${t(optionLabels[valueName])}</strong></span>`
64
+ + `<button class="mode-btn${sel ? ' is-on' : ''}" role="radio" aria-checked="${sel}"`
65
+ + ` data-eixo="${axisName}" data-valor="${valueName}" type="button">${sel ? t('viz.escolhido') : t('viz.escolher')}</button></div>`;
66
+ }).join('');
67
+ }
68
+ /**
69
+ * The TWO axes, one after the other, with a title each.
70
+ *
71
+ * The title exists because two unnamed radios in a row are one radio of eight for whoever reads fast — and that reading
72
+ * is exactly the misunderstanding the split exists to undo.
73
+ */
74
+ export function axesHtml(v, t) {
75
+ return `<h3 class="opt-sub">${t('eixo.tema.titulo')}</h3>`
76
+ + axisRows('tema', THEMES, THEME_LABEL, v.tema, t)
77
+ + `<h3 class="opt-sub">${t('eixo.correcao.titulo')}</h3>`
78
+ + axisRows('correcao', CORRECTIONS, CORRECTION_LABEL, v.correcao, t);
79
+ }
80
+ export function buttonChoice(dataset) {
81
+ const { eixo: axisName, valor: valueName } = dataset;
82
+ if (axisName !== 'tema' && axisName !== 'correcao')
83
+ return null;
84
+ if (!valueName)
85
+ return null;
86
+ const allowed = axisName === 'tema' ? THEMES : CORRECTIONS;
87
+ return allowed.includes(valueName) ? { axis: axisName, value: valueName } : null;
88
+ }