@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,37 +1,49 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import type { Store } from '../platform/storage.js';
2
3
  /**
3
4
  * 17-sample `feFuncR/G/B` table for tableValues, blending contrast-stretch (linear, α=1.3, μ=0.5) with an
4
- * S-curve (quadratic) by `t`. NOT clamped — mirrors game.js's lqCurve verbatim (callers clamp `t` upstream).
5
+ * S-curve (quadratic) by `t`. NOT clamped — callers clamp `t` upstream.
5
6
  */
6
7
  export declare function lqCurve(t: number): string;
7
8
  /**
8
- * Continuous `t` -> the i18n KEY of the screen-reader/UI label. NOT clamped — mirrors game.js's lqName verbatim
9
- * (t<=0 and t>=1-ish inputs fall through to the end labels naturally).
9
+ * Continuous `t` -> the i18n KEY of the screen-reader/UI label. NOT clamped (t<=0 and t>=1-ish inputs fall through to
10
+ * the end labels naturally).
10
11
  *
11
12
  * Returns a key rather than resolved text for two reasons. This module is a render leaf and stays free of the
12
13
  * i18n dependency; and its parameter is already called `t`, so importing i18n's `t` here would shadow it — a
13
14
  * rename to dodge a name clash is a worse reason to change a signature than the boundary itself.
14
15
  */
15
16
  export declare function lqName(t: number): string;
16
- /** Reads (or lazily creates) the shared `<filter id="lq-enh">` SVG node, appended once to `document.body`. */
17
- export declare function ensureLqFilter(): SVGFilterElement;
18
- /** CSS `filter` fragment for the current lqT ('' when off) — ensures the SVG node exists BEFORE returning the
19
- * `url()` reference (a dangling reference would hide the canvas). Composed by callers with viz-mode filters. */
20
- export declare function lqFilter(): string;
21
- /** Current lqT (0..1) — read by the visual-settings panel and the debug/`__incl` surface. */
22
- export declare function getLqT(): number;
17
+ /** The document the `<filter>` node lives in — only what the shell touches. */
18
+ export type LqDoc = Pick<Document, 'getElementById' | 'createElementNS' | 'body'>;
23
19
  export interface LqFilterCtx {
20
+ /** The document the SVG `<filter>` is created in and looked up from — passed, never the global one (ADR-0232). */
21
+ doc: LqDoc;
24
22
  /**
25
- * Recomposes the app's CSS filter after lqT changes. In game.js this is either a full `applyVizGlobal()`
26
- * re-apply (single-player: also touches viz-mode texture caches, `_lastSharedViz`) or a direct
27
- * `app.view.style.filter = ...` write composed with the active viz-mode filter (multiplayer). That
28
- * composition — and the texture-cache invalidation it triggers elsewhere — belongs to other subsystems and
29
- * stays in game.js; this module only owns lqT + the SVG filter node.
23
+ * Recomposes the app's CSS filter after the amount changes — composed with the active colour/simulation filter, and
24
+ * with whatever texture-cache invalidation that triggers elsewhere. That composition belongs to other subsystems and
25
+ * stays with the host; this module only owns the amount + the SVG filter node.
30
26
  */
31
27
  onChange: () => void;
28
+ /**
29
+ * Where the amount is kept — the page's store, built by the root (ADR-0232, issue #207). Required: an enhancement read
30
+ * from nowhere starts OFF at every visit for the child with low vision who turned it on.
31
+ */
32
+ store: Pick<Store, 'getNum' | 'set'>;
33
+ }
34
+ /** One root's L→Q enhancement. */
35
+ export interface LqFilter {
36
+ /** CSS `filter` fragment for the current amount ('' when off) — ensures the SVG node exists BEFORE returning the
37
+ * `url()` reference (a dangling reference would hide the canvas). Composed by callers with viz-mode filters. */
38
+ filter(): string;
39
+ /** The current amount (0..1) — read by the visual-settings panel and the debug/`__incl` surface. */
40
+ t(): number;
41
+ /** Sets the amount (clamped to 0..1), persists it, updates the live SVG table (if the filter is already on-screen),
42
+ * then calls the injected `onChange` to let the host recompose the CSS filter. */
43
+ set(t: number): void;
32
44
  }
33
- /** Wires the injected recompose callback. Call once during game.js boot. */
34
- export declare function initLqFilter(ctx: LqFilterCtx): void;
35
- /** Sets lqT (clamped to 0..1), persists it, updates the live SVG table (if the filter is already on-screen),
36
- * then calls the injected `onChange` to let game.js recompose the CSS filter. Mirrors game.js's setLq. */
37
- export declare function setLq(t: number): void;
45
+ /**
46
+ * Builds the enhancement and READS the stored amount — at build, never at import (ADR-0232). The amount lives in this
47
+ * closure: two roots on one page each keep their own.
48
+ */
49
+ export declare function createLqFilter(ctx: LqFilterCtx): LqFilter;
@@ -1,17 +1,18 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/lq-filter.ts — Realce de contraste Linear→Quadrático (baixa visão, PESQUISA-ALTO-CONTRASTE §2.3).
3
- // Curva de tom POR PIXEL na tela inteira, composta via SVG feComponentTransfer (17 amostras, sRGB) no CSS
4
- // filter do canvas. `lqCurve`/`lqName` são puros (project node); `ensureLqFilter`/`setLq` são a casca fina que
5
- // cria o nó SVG e escreve no DOM. Recompor o CSS filter final (junto com os modos de cor) fica em game.js via
6
- // `onChange` injetado — não duplica _lastSharedViz/_rebakeDirect (outros subsistemas). Extraído verbatim.
7
- import * as store from '../platform/storage.js';
2
+ // render/lq-filter.ts — the Linear→Quadratic contrast enhancement (low vision, RESEARCH-HIGH-CONTRAST §2.3).
3
+ // A PER-PIXEL tone curve over the whole screen, composed through an SVG feComponentTransfer (17 samples, sRGB) in the
4
+ // canvas's CSS filter. `lqCurve`/`lqName` are pure (node project); `createLqFilter` is the thin shell that keeps the amount,
5
+ // creates the SVG node in the document it is HANDED and writes to it (ADR-0232 D4, issue #207: one per root, the root
6
+ // builds it). Recomposing the final CSS filter (with the colour modes) belongs to the host, through the injected
7
+ // `onChange` — this module does not duplicate the other subsystems' caches.
8
+ import { KEYS } from '../platform/storage-keys.js';
8
9
  const FILTER_ID = 'lq-enh';
9
10
  function clamp01(t) {
10
11
  return Math.max(0, Math.min(1, t));
11
12
  }
12
13
  /**
13
14
  * 17-sample `feFuncR/G/B` table for tableValues, blending contrast-stretch (linear, α=1.3, μ=0.5) with an
14
- * S-curve (quadratic) by `t`. NOT clamped — mirrors game.js's lqCurve verbatim (callers clamp `t` upstream).
15
+ * S-curve (quadratic) by `t`. NOT clamped — callers clamp `t` upstream.
15
16
  */
16
17
  export function lqCurve(t) {
17
18
  const N = 17, a = 1.3, out = [];
@@ -24,8 +25,8 @@ export function lqCurve(t) {
24
25
  return out.join(' ');
25
26
  }
26
27
  /**
27
- * Continuous `t` -> the i18n KEY of the screen-reader/UI label. NOT clamped — mirrors game.js's lqName verbatim
28
- * (t<=0 and t>=1-ish inputs fall through to the end labels naturally).
28
+ * Continuous `t` -> the i18n KEY of the screen-reader/UI label. NOT clamped (t<=0 and t>=1-ish inputs fall through to
29
+ * the end labels naturally).
29
30
  *
30
31
  * Returns a key rather than resolved text for two reasons. This module is a render leaf and stays free of the
31
32
  * i18n dependency; and its parameter is already called `t`, so importing i18n's `t` here would shadow it — a
@@ -34,61 +35,54 @@ export function lqCurve(t) {
34
35
  export function lqName(t) {
35
36
  return t <= 0 ? 'lq.off' : t < 0.34 ? 'lq.linear' : t < 0.67 ? 'lq.mixed' : 'lq.quadratic';
36
37
  }
37
- // ---------- Thin DOM shell ----------
38
- /** Current L→Q amount (0..1), persisted in platform/storage under `KEYS.lq` ('incl_lq'). Module-local state. */
39
- let lqT = clamp01(store.getNum(store.KEYS.lq, 0));
40
- /** Reads (or lazily creates) the shared `<filter id="lq-enh">` SVG node, appended once to `document.body`. */
41
- export function ensureLqFilter() {
42
- const existing = document.getElementById(FILTER_ID);
43
- if (existing)
44
- return existing;
45
- const NS = 'http://www.w3.org/2000/svg';
46
- const svg = document.createElementNS(NS, 'svg');
47
- svg.setAttribute('width', '0');
48
- svg.setAttribute('height', '0');
49
- svg.setAttribute('aria-hidden', 'true');
50
- svg.style.position = 'absolute';
51
- const f = document.createElementNS(NS, 'filter');
52
- f.id = FILTER_ID;
53
- f.setAttribute('color-interpolation-filters', 'sRGB');
54
- const ct = document.createElementNS(NS, 'feComponentTransfer');
55
- ['feFuncR', 'feFuncG', 'feFuncB'].forEach((ch) => {
56
- const fn = document.createElementNS(NS, ch);
57
- fn.setAttribute('type', 'table');
58
- fn.setAttribute('tableValues', lqCurve(lqT));
59
- ct.appendChild(fn);
60
- });
61
- f.appendChild(ct);
62
- svg.appendChild(f);
63
- document.body.appendChild(svg);
64
- return f;
65
- }
66
- /** CSS `filter` fragment for the current lqT ('' when off) — ensures the SVG node exists BEFORE returning the
67
- * `url()` reference (a dangling reference would hide the canvas). Composed by callers with viz-mode filters. */
68
- export function lqFilter() {
69
- if (lqT <= 0)
70
- return '';
71
- ensureLqFilter();
72
- return `url(#${FILTER_ID})`;
73
- }
74
- /** Current lqT (0..1) — read by the visual-settings panel and the debug/`__incl` surface. */
75
- export function getLqT() {
76
- return lqT;
77
- }
78
- let onChange = () => { };
79
- /** Wires the injected recompose callback. Call once during game.js boot. */
80
- export function initLqFilter(ctx) {
81
- onChange = ctx.onChange;
82
- }
83
- /** Sets lqT (clamped to 0..1), persists it, updates the live SVG table (if the filter is already on-screen),
84
- * then calls the injected `onChange` to let game.js recompose the CSS filter. Mirrors game.js's setLq. */
85
- export function setLq(t) {
86
- lqT = clamp01(t);
87
- store.set(store.KEYS.lq, lqT);
88
- if (lqT > 0) {
89
- const f = ensureLqFilter();
90
- const tv = lqCurve(lqT);
91
- f.querySelectorAll('feFuncR,feFuncG,feFuncB').forEach((fn) => fn.setAttribute('tableValues', tv));
38
+ /**
39
+ * Builds the enhancement and READS the stored amount — at build, never at import (ADR-0232). The amount lives in this
40
+ * closure: two roots on one page each keep their own.
41
+ */
42
+ export function createLqFilter(ctx) {
43
+ const { doc, store, onChange } = ctx;
44
+ let amount = clamp01(store.getNum(KEYS.lq, 0));
45
+ /** Reads (or lazily creates) the `<filter id="lq-enh">` SVG node, appended once to the document's body. */
46
+ function ensureNode() {
47
+ const existing = doc.getElementById(FILTER_ID);
48
+ if (existing)
49
+ return existing;
50
+ const NS = 'http://www.w3.org/2000/svg';
51
+ const svg = doc.createElementNS(NS, 'svg');
52
+ svg.setAttribute('width', '0');
53
+ svg.setAttribute('height', '0');
54
+ svg.setAttribute('aria-hidden', 'true');
55
+ svg.style.position = 'absolute';
56
+ const f = doc.createElementNS(NS, 'filter');
57
+ f.id = FILTER_ID;
58
+ f.setAttribute('color-interpolation-filters', 'sRGB');
59
+ const ct = doc.createElementNS(NS, 'feComponentTransfer');
60
+ ['feFuncR', 'feFuncG', 'feFuncB'].forEach((ch) => {
61
+ const fn = doc.createElementNS(NS, ch);
62
+ fn.setAttribute('type', 'table');
63
+ fn.setAttribute('tableValues', lqCurve(amount));
64
+ ct.appendChild(fn);
65
+ });
66
+ f.appendChild(ct);
67
+ svg.appendChild(f);
68
+ doc.body.appendChild(svg);
69
+ return f;
70
+ }
71
+ function filter() {
72
+ if (amount <= 0)
73
+ return '';
74
+ ensureNode();
75
+ return `url(#${FILTER_ID})`;
76
+ }
77
+ function set(t) {
78
+ amount = clamp01(t);
79
+ store.set(KEYS.lq, amount);
80
+ if (amount > 0) {
81
+ const f = ensureNode();
82
+ const tv = lqCurve(amount);
83
+ f.querySelectorAll('feFuncR,feFuncG,feFuncB').forEach((fn) => fn.setAttribute('tableValues', tv));
84
+ }
85
+ onChange();
92
86
  }
93
- onChange();
87
+ return { filter, t: () => amount, set };
94
88
  }
@@ -1,143 +1,141 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- /** O MÍNIMO de uma camada de desenho vetorial: limpar, preencher, retangular. */
3
- export interface Desenho {
2
+ /** The MINIMUM of a vector drawing layer: clear, fill, rectangle. */
3
+ export interface Drawing {
4
4
  clear(): this;
5
5
  beginFill(color: number, alpha?: number): this;
6
6
  drawRect(x: number, y: number, w: number, h: number): this;
7
7
  endFill(): this;
8
8
  }
9
- /** Desenho que também traça linha — chuva, cabos, tracinhos de lava. */
10
- export interface DesenhoComLinha extends Desenho {
9
+ /** A drawing that also strokes lines — rain, cables, lava dashes. */
10
+ export interface DrawingWithLine extends Drawing {
11
11
  lineStyle(width: number, color?: number, alpha?: number): this;
12
12
  moveTo(x: number, y: number): this;
13
13
  lineTo(x: number, y: number): this;
14
14
  }
15
- /** O que se pode esconder. Separado de `Desenho` porque nem toda camada é escondida por quem a desenha. */
16
- export interface Visivel {
15
+ /** What can be hidden. Separate from `Drawing` because not every layer is hidden by whoever draws it. */
16
+ export interface Visible {
17
17
  visible: boolean;
18
18
  }
19
- /** Um contêiner do grafo de cena, do ponto de vista de quem só adiciona e remove filhos. */
20
- export interface Camada {
19
+ /** A scene-graph container, from the point of view of whoever only adds and removes children. */
20
+ export interface Layer {
21
21
  addChild(c: unknown): unknown;
22
22
  removeChild(c: unknown): unknown;
23
23
  }
24
- /** O que tem textura trocável — o recolor do alto contraste escreve aqui. */
25
- export interface ComTextura {
24
+ /** What has a swappable texture — the high-contrast recolour writes here. */
25
+ export interface WithTexture {
26
26
  texture: unknown;
27
27
  }
28
28
  /**
29
- * DESENHAR UM OBJETO DENTRO DE UMA TEXTURA — a captura de tela de cada jogador no multi-tela.
29
+ * DRAW AN OBJECT INTO A TEXTURE — each player's screen capture in multi-screen.
30
30
  *
31
- * É uma FUNÇÃO e não um objeto `{ render(...) }`, e a diferença é o que faz a porta funcionar. Dois módulos
32
- * declaravam `interface RendererLike { render(displayObject: unknown, options: { renderTexture: unknown }) }`
33
- * — idênticos, e ambos recusados pelo PixiJS real: o `render` dele pede `IRenderableObject`, e `unknown` não
34
- * é atribuível a isso. Por contravariância, quem DECLARA o parâmetro mais largo é quem não cabe.
31
+ * A FUNCTION and not a `{ render(...) }` object, and the difference is what makes the port work. An
32
+ * `interface RendererLike { render(displayObject: unknown, options: { renderTexture: unknown }) }` is refused by the real
33
+ * PixiJS: its `render` asks for an `IRenderableObject`, and `unknown` is not assignable to that. By contravariance,
34
+ * whoever DECLARES the wider parameter is who does not fit.
35
35
  *
36
- * Pedir a CAPACIDADE resolve: o módulo diz o que quer que aconteça, e a raiz de composição — que é o único
37
- * lugar onde o PixiJS já é conhecido — entrega a função. É o adaptador que o ADR-0035 prometeu, e a promessa
38
- * só vira fato quando o pedido tem a forma de um verbo, não a de um objeto emprestado.
36
+ * Asking for the CAPABILITY solves it: the module says what it wants to happen, and the composition root — the one place
37
+ * where PixiJS is already known — hands in the function. It is the adapter ADR-0035 promised, and the promise only
38
+ * becomes fact when the request has the shape of a verb, not of a borrowed object.
39
39
  *
40
- * ⚠️ `limpar` É OBRIGATÓRIO, e era opcional. Desenhar numa textura de render sem dizer se ela deve ser limpa
41
- * antes é a diferença entre um quadro e um BORRÃO: sem limpar, cada quadro se acumula sobre o anterior e o
42
- * personagem aparece várias vezes, em várias posições. Havia dois chamadores — um passava `false` de
43
- * propósito (a passada extra de baixa visão, que compõe POR CIMA) e o outro não passava nada, deixando a
44
- * decisão para um padrão que ninguém escreveu.
40
+ * ⚠️ `clearFirst` IS REQUIRED. Drawing into a render texture without saying whether it should be cleared first is the
41
+ * difference between a frame and a SMEAR: without clearing, each frame piles on the previous one and the character shows
42
+ * several times, in several places. One caller passes `false` on purpose (the extra low-vision pass, which composes ON
43
+ * TOP); an optional parameter would let another leave the decision to a default nobody wrote.
45
44
  *
46
- * Um padrão implícito aqui é caro de duas formas: ele muda com a versão do renderizador, e o sintoma dele é
47
- * visual — nenhum teste de lógica o vê. Tornar o parâmetro obrigatório faz o compilador cobrar a intenção de
48
- * cada chamador, uma vez, e para sempre.
45
+ * An implicit default here is expensive twice over: it changes with the renderer's version, and its symptom is visual —
46
+ * no logic test sees it. A required parameter makes the compiler demand each caller's intent, once, and forever.
49
47
  */
50
- export type RenderizarEm = (objeto: unknown, alvo: unknown, limpar: boolean) => void;
48
+ export type RenderInto = (displayObject: unknown, target: unknown, clearFirst: boolean) => void;
51
49
  /**
52
- * CRIAR UM SPRITE a partir de uma textura, e um AZULEJO a partir dela.
50
+ * CREATE A SPRITE from a texture, and a TILE from one.
53
51
  *
54
- * Fábricas, não construtores — e pelo mesmo motivo do `RenderizarEm` acima. Três módulos pediam
55
- * `interface SpriteCtor { new (tex: unknown): Sprite }`, e o `PIXI.Sprite` real não cabe: o construtor dele
56
- * aceita `Texture | undefined`, e um parâmetro declarado `unknown` é MAIS LARGO — por contravariância, quem
57
- * promete aceitar qualquer coisa é quem não pode receber um construtor que só aceita textura.
52
+ * Factories, not constructors — for the same reason as `RenderInto` above. An `interface SpriteCtor { new (tex:
53
+ * unknown): Sprite }` does not fit the real `PIXI.Sprite`: its constructor accepts `Texture | undefined`, and a
54
+ * parameter declared `unknown` is WIDER — by contravariance, whoever promises to accept anything cannot receive a
55
+ * constructor that only accepts a texture.
58
56
  *
59
- * Uma função apaga o problema: quem chama passa a textura que já tem, e quem compõe fecha a diferença uma
60
- * vez. `T` é o que o módulo espera de volta — cada um sabe qual fatia do sprite ele vai tocar.
57
+ * A function erases the problem: the caller passes the texture it already has, and the composer closes the difference
58
+ * once. `T` is what the module expects back — each knows which slice of the sprite it will touch.
61
59
  */
62
- export type CriarSprite<T> = (textura: unknown) => T;
63
- /** Idem para o azulejo do parallax, que também recebe largura e altura. */
64
- export type CriarAzulejo<T> = (textura: unknown, largura: number, altura: number) => T;
65
- /** E o desenho vetorial vazio (`new PIXI.Graphics()`), pela mesma razão. */
66
- export type CriarDesenho<T> = () => T;
60
+ export type CreateSprite<T> = (sourceTexture: unknown) => T;
61
+ /** Likewise for the parallax tile, which also gets a width and a height. */
62
+ export type CreateTile<T> = (sourceTexture: unknown, tileWidth: number, tileHeight: number) => T;
63
+ /** And the empty vector drawing (`new PIXI.Graphics()`), for the same reason. */
64
+ export type CreateDrawing<T> = () => T;
67
65
  /**
68
- * O QUE SE TINGE — um sprite do ponto de vista de quem só ESCREVE a cor nele.
66
+ * WHAT GETS TINTED — a sprite from the point of view of whoever only WRITES its colour.
69
67
  *
70
- * `tint: unknown`, e o `unknown` aqui é a coisa certa, não preguiça. Dois módulos declaravam
71
- * `tint: number` — e o `PIXI.Sprite` real NÃO CABE nisso: o `tint` dele é `ColorSource`, que aceita
72
- * número, texto (`'red'`), array e mais. `number` é um SUBTIPO estrito disso, e um módulo que não é
73
- * dono do campo declarando algo MAIS ESTREITO que a verdade é exatamente o que o ADR-0039 proíbe:
74
- * estreitar é o que quebra a atribuição.
68
+ * `tint: unknown`, and `unknown` here is right, not lazy. `tint: number` does NOT fit the real `PIXI.Sprite`: its
69
+ * `tint` is a `ColorSource`, which accepts a number, text (`'red'`), an array and more. `number` is a strict SUBTYPE of
70
+ * that, and a module that does not own the field declaring something NARROWER than the truth is exactly what ADR-0039
71
+ * forbids: narrowing is what breaks the assignment.
75
72
  *
76
- * O supertipo verdadeiro que dá para provar sem importar PixiJS é `unknown`. O preço é conhecido e
77
- * pequeno: quem escreve aqui não é mais conferido pelo compilador — mas as duas únicas escritas da
78
- * árvore são constantes hexadecimais literais, e o `ColorSource` aceitaria todas elas de qualquer jeito.
73
+ * The true supertype provable without importing PixiJS is `unknown`. The price is known and small: whoever writes here
74
+ * is no longer checked by the compiler — nothing in the engine writes a tint today, and the hex constants a game writes
75
+ * are all `ColorSource`s anyway.
79
76
  */
80
- export interface Tingivel {
77
+ export interface Tintable {
81
78
  tint: unknown;
82
79
  }
83
- /** O que se descarta. `DisplayObject.destroy(options?)` do PixiJS satisfaz — o opcional não atrapalha. */
84
- export interface Descartavel {
80
+ /** What gets disposed. PixiJS's `DisplayObject.destroy(options?)` satisfies it — the optional does not get in the way. */
81
+ export interface Disposable {
85
82
  destroy(): void;
86
83
  }
87
84
  /**
88
- * Camada que também ESVAZIA, devolvendo o que saiu para quem precisa destruir os filhos removidos.
85
+ * A layer that also EMPTIES, returning what came out to whoever needs to destroy the removed children.
89
86
  *
90
- * Separada de `Camada` porque só um consumidor esvazia, e porque o retorno é a parte delicada: quem
91
- * declarava `removeChildren(): CoinSprite[]` pedia de volta algo mais ESPECÍFICO do que o PixiJS
92
- * entrega (`DisplayObject[]`) — e retorno é covariante, então o pedido específico é o que não cabe.
93
- * `Descartavel` é o que o chamador de fato usa.
87
+ * Separate from `Layer` because only one consumer empties, and because the return is the delicate part: asking for
88
+ * `removeChildren(): CoinSprite[]` asks back for something more SPECIFIC than PixiJS delivers (`DisplayObject[]`) — and
89
+ * a return is covariant, so the specific request is what does not fit. `Disposable` is what the caller actually uses.
94
90
  */
95
- export interface CamadaEsvaziavel extends Camada {
96
- removeChildren(): Descartavel[];
91
+ export interface ClearableLayer extends Layer {
92
+ removeChildren(): Disposable[];
97
93
  }
98
- /** O que tem filtro de GPU — a câmera e cada sprite de saída do multi-tela. */
99
- export interface ComFiltro {
94
+ /** What has a GPU filter — the camera and each multi-screen output sprite. */
95
+ export interface WithFilter {
100
96
  filters: unknown;
101
97
  }
102
- /** Desenho que também traça CÍRCULO — a bolinha indicadora de cada viewport. */
103
- export interface DesenhoComCirculo extends DesenhoComLinha {
98
+ /** A drawing that also draws a CIRCLE — each viewport's indicator dot. */
99
+ export interface DrawingWithCircle extends DrawingWithLine {
104
100
  drawCircle(x: number, y: number, r: number): this;
105
101
  }
106
102
  /**
107
- * APLICAR UM FILTRO CSS NO SOLO — o filtro global da tela, que compõe daltonismo, baixa visão,
108
- * cegueira e o realce de luminância/quantização.
103
+ * APPLY A CSS FILTER TO THE GROUND — the screen's global filter, composing colour blindness, low vision, blindness and
104
+ * the luminance/quantisation enhancement.
109
105
  *
110
- * Era `app: AppLike | null` com `AppLike { view?: { style: { filter: string } } }` — o módulo alcançava
111
- * TRÊS níveis para dentro de um objeto que não é dele, e o `PIXI.Application` real não cabia: o `style`
112
- * do `ICanvas` do PixiJS é `ICanvasStyle`, que sequer TEM `filter` (ele existe para a `OffscreenCanvas`,
113
- * onde não há CSS). Em produção o `view` é um `HTMLCanvasElement` de verdade e o campo existe — mas isso
114
- * é uma coisa que só a raiz de composição sabe, e é lá que a conversão pertence.
106
+ * Not `app: AppLike | null` with `AppLike { view?: { style: { filter: string } } }`: that reached THREE levels into an
107
+ * object that is not the module's, and the real `PIXI.Application` did not fit — PixiJS's `ICanvas` `style` is an
108
+ * `ICanvasStyle`, which does not even HAVE `filter` (it exists for `OffscreenCanvas`, where there is no CSS). In
109
+ * production the `view` is a real `HTMLCanvasElement` and the field exists — but only the composition root knows that,
110
+ * and that is where the conversion belongs.
115
111
  *
116
- * Mesma lição do `RenderizarEm` e do `CriarSprite`: pedir o VERBO cabe onde emprestar o objeto não cabe.
112
+ * The same lesson as `RenderInto` and `CreateSprite`: asking for the VERB fits where borrowing the object does not.
117
113
  */
118
- export type AplicarFiltroCss = (css: string, alcance: AlcanceDoFiltro) => void;
114
+ export type ApplyCssFilter = (css: string, reach: FilterReach) => void;
119
115
  /**
120
- * ONDE o filtro de acessibilidade cai — e a distinção é de PRODUTO, decidida pelo Dev em 2026-08-26.
116
+ * WHERE the accessibility filter lands — and the distinction is one of PRODUCT, decided by the Dev.
121
117
  *
122
- * O quadro é metade canvas e metade DOM, e filtro de PIXI não alcança DOM. Até aqui o filtro caía SÓ na
123
- * canvas, e os menus ficavam crus: a criança daltônica recebia o jogo corrigido e as palavras não (issue
124
- * #82). Mas a correção não é o único modo, e nem todos devem alcançar o menu:
118
+ * The frame is half canvas and half DOM, and a PIXI filter does not reach the DOM. With the filter landing ONLY on the
119
+ * canvas, the menus stayed raw: the colour-blind child got the game corrected and the words not (issue #82). But the
120
+ * correction is not the only mode, and not all of them should reach the menu:
125
121
  *
126
- * · MELHORIA (`normal`, `hc-direto*`, `fix-*`) — existe para a criança ENXERGAR MELHOR. Tem de alcançar
127
- * tudo que ela lê, menus inclusive. É o caso que estava quebrado.
128
- * · EMPATIA (`sim-*`, `lv-*`, `blind`) — existe para um adulto SENTIR como é. Fica no mundo. O menu é o
129
- * instrumento de SAIR da simulação, e uma cegueira que apagasse o menu de pausa trancaria a criança
130
- * dentro dela.
122
+ * · ENHANCEMENT (`normal`, `hc-direto*`, `fix-*`) — exists so the child SEES BETTER. It has to reach everything they
123
+ * read, menus included.
124
+ * · EMPATHY (`sim-*`, `lv-*`, `blind`) — exists so an adult FEELS what it is like. It stays in the world. The menu is
125
+ * the instrument for LEAVING the simulation, and a blindness that blanked the pause menu would lock the child
126
+ * inside it.
131
127
  *
132
- * O catálogo já sabia disto antes de a regra ser escrita: `VIZ_MODES` traz `sim: true` exatamente nos nove
133
- * modos de empatia, e `simulatesDisability(chave)` é a pergunta pronta. Nada de taxonomia nova.
128
+ * The catalogue already knew this before the rule was written: `VIZ_MODES` carries `sim: true` exactly on the nine
129
+ * empathy modes, and `simulatesDisability(key)` is the ready-made question. No new taxonomy. (The values stay
130
+ * Portuguese: `mundo` is "world", `mundo-e-menus` "world and menus".)
134
131
  */
135
- export type AlcanceDoFiltro = 'mundo' | 'mundo-e-menus';
132
+ export type FilterReach = 'mundo' | 'mundo-e-menus';
136
133
  /**
137
- * LIGAR/DESLIGAR O ALTO CONTRASTE NO DOM — a metade que o filtro não alcança.
134
+ * TURN HIGH CONTRAST ON/OFF IN THE DOM — the half the filter does not reach.
138
135
  *
139
- * O alto contraste não é filtro de CSS: é Renderização Direta, e repinta as TEXTURAS da canvas. O DOM não
140
- * tem textura, então não há o que propagar — há que escrever o equivalente, e ele mora no `style.css` sob
141
- * `#dom-layer.hc`. Aqui só se diz SE está ligado; o desenho é do CSS, com as razões medidas (issue #83).
136
+ * High contrast is not a CSS filter: it is Direct Rendering, and it repaints the canvas's TEXTURES. The DOM has no
137
+ * texture, so there is nothing to propagate — the equivalent has to be written, and it lives in `style.css` under
138
+ * `#dom-layer.hc`. Here only WHETHER it is on is said; the drawing belongs to the CSS, with the measured reasons (issue
139
+ * #83).
142
140
  */
143
- export type AplicarAltoContrasteNoDom = (ligado: boolean) => void;
141
+ export type ApplyHighContrastToDom = (isOn: boolean) => void;
@@ -1,29 +1,23 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/port — A PORTA DO RENDERIZADOR (Fase D do plano, ADR-0035).
2
+ // render/port — THE RENDERER'S PORT (ADR-0035).
3
3
  //
4
- // ========================= O QUE ESTE ARQUIVO RESOLVE =========================
5
- // O ADR-0035 apostou a reversibilidade da escolha do renderizador num adaptador: os módulos não importam
6
- // PixiJS, recebem por injeção o que vão desenhar. A aposta foi cumprida pela metade — os módulos de fato não
7
- // importam PixiJS, mas cada um descreveu a forma do que recebe POR CONTA PRÓPRIA, e as descrições
8
- // divergiram.
4
+ // ========================= WHAT THIS FILE SOLVES =========================
5
+ // ADR-0035 bet the reversibility of the renderer choice on an adapter: modules do not import PixiJS, they get what they
6
+ // will draw by injection. Without one declaration, each module described the shape of what it gets ON ITS OWN, and the
7
+ // descriptions drift — a graphics type was once written FIVE times with four different definitions (some with
8
+ // `clear(): void`, others with `clear(): Gfx`; one with `visible`, another with `lineStyle`/`moveTo`/`lineTo`).
9
9
  //
10
- // `Gfx` estava escrito CINCO vezes, em `render/scene-city`, `render/scene-sky`, `render/title-scene`,
11
- // `render/weather` e `game/traffic`, com quatro definições diferentes: umas com `clear(): void`, outras com
12
- // `clear(): Gfx`; uma com `visible`, outra com `lineStyle`/`moveTo`/`lineTo`. `Layer` e `SpriteCtor`, duas
13
- // vezes cada. `RendererLike`, `ContainerLike` e `GraphicsLike`, duas cada.
10
+ // It is the same defect as `DomQuery` (sixteen copies) and `KeyScheme` (six), in the renderer: a truth written in many
11
+ // places drifts, and the drift shows at the composition root — the one point where the real PixiJS meets all of them at
12
+ // once.
14
13
  //
15
- // É o mesmo defeito do `DomQuery` (dezesseis cópias) e do `KeyScheme` (seis), agora no renderizador: uma
16
- // verdade escrita em muitos lugares diverge, e a divergência aparece na raiz de composição — que é o único
17
- // ponto onde o PixiJS de verdade encontra todas elas ao mesmo tempo.
14
+ // ========================= WHAT THE PORT IS NOT =========================
15
+ // It is NOT the `Scene`/`Handle` implementation the `demos` plan's D14 specifies — only the port, and only where the
16
+ // modules already are. This describes what the CURRENT renderer offers, in one declaration, in a way PixiJS satisfies
17
+ // with no adapter. The `Scene` comes later, and can reuse these names.
18
18
  //
19
- // ========================= O QUE A PORTA NÃO É =========================
20
- // NÃO é a implementação de `Scene`/`Handle` que a D14 do `demos` especifica. O plano é explícito: "não fazer
21
- // agora a implementação completa de `Scene`; só a porta, e só onde os módulos já estão". Isto aqui descreve
22
- // o que o renderizador ATUAL oferece, numa declaração só, de um jeito que o PixiJS satisfaz sem adaptador.
23
- // A `Scene` nasce depois, e nasce podendo reusar estes nomes.
24
- //
25
- // ========================= POR QUE OS RETORNOS ENCADEIAM =========================
26
- // `beginFill(…): this` e não `: void`. O PixiJS encadeia (`g.beginFill(c).drawRect(…).endFill()`), e três
27
- // dos cinco módulos já dependiam disso. `this` em vez do nome do tipo é o que permite uma interface derivada
28
- // continuar encadeando sem redeclarar cada método — foi o que fez as cinco cópias divergirem.
19
+ // ========================= WHY THE RETURNS CHAIN =========================
20
+ // `beginFill(…): this` and not `: void`. PixiJS chains (`g.beginFill(c).drawRect(…).endFill()`), and consumers depend on
21
+ // it. `this` instead of the type's name is what lets a derived interface keep chaining without redeclaring each method
22
+ // — the lack of it is what made the copies drift.
29
23
  export {};