@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,115 +1,118 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- /** O eixo do CONTRASTE. `padrao` não é ausência de tema: é o tema desenhado do jogo. */
3
- export type Tema = 'padrao' | 'hc3' | 'hc45' | 'hc7';
4
- /** O eixo da CORREÇÃO DE COR. `tricro` = visão tricromática, e é um nome, não uma ausência. */
5
- export type Correcao = 'tricro' | 'protan' | 'deuter' | 'tritan';
6
- /** A simulação, que NÃO é eixo. `null` = nenhuma a correr. */
7
- export type Simulacao = null | 'sim-protan' | 'sim-deuter' | 'sim-tritan' | 'lv-blur' | 'lv-haze' | 'lv-tunnel' | 'lv-macular' | 'lv-diabetic' | 'blind';
8
- /** O estado visual de UM jogador. Substitui a string única de `p.viz`. */
9
- export interface VisualState {
10
- readonly tema: Tema;
11
- readonly correcao: Correcao;
12
- readonly simulacao: Simulacao;
13
- }
14
- export declare const PADRAO: VisualState;
2
+ import type { Theme as TemaDoCore, Correction as CorrecaoDoCore, Simulation as SimulacaoDoCore, VisualState as VisualStateDoCore } from '../core/visual-state.js';
3
+ /** The CONTRAST axis (`core/visual-state`). */
4
+ export type Theme = TemaDoCore;
5
+ /** The COLOUR CORRECTION axis (`core/visual-state`). */
6
+ export type Correction = CorrecaoDoCore;
7
+ /** The simulation, which is NOT an axis (`core/visual-state`). */
8
+ export type Simulation = SimulacaoDoCore;
9
+ /** ONE player's visual state (`core/visual-state`). The field names and values stay Portuguese: they are stored. */
10
+ export type VisualState = VisualStateDoCore;
11
+ export declare const DEFAULT_VISUAL: VisualState;
15
12
  /**
16
- * Os dois eixos estão no padrão?
13
+ * Are both axes at their default?
17
14
  *
18
- * ⚠️ É A PERGUNTA QUE LIBERA A SIMULAÇÃO, e é por isso que ela é uma função e não um booleano guardado:
19
- * guardar o resultado deixaria as duas coisas divergirem, e a divergência aqui significa uma demonstração a
20
- * correr por cima de uma adaptação — que ensina uma coisa falsa.
15
+ * ⚠️ IT IS THE QUESTION THAT RELEASES THE SIMULATION, which is why it is a function and not a stored boolean: storing the
16
+ * result would let the two drift apart, and here a drift means a demonstration running over an adaptation — which
17
+ * teaches something false.
21
18
  */
22
- export declare function nosPadroes(v: VisualState): boolean;
19
+ export declare function bothAxesAtDefault(v: VisualState): boolean;
23
20
  /**
24
- * Esta simulação pode correr AGORA? E se não, por quê?
21
+ * Can this simulation run NOW? And if not, why?
25
22
  *
26
- * ⚠️ DEVOLVE O MOTIVO E NÃO SÓ `false`. O ADR-0076 exige que a recusa seja VISÍVEL e explicada — nunca
27
- * silenciosamente removida, nunca aceita e depois ignorada. E o motivo é um FACTO SOBRE A DEMONSTRAÇÃO, não
28
- * uma repreensão a quem escolheu: quem ligou o alto contraste ligou-o porque precisa.
23
+ * ⚠️ IT RETURNS THE REASON AND NOT JUST `false`. ADR-0076 requires the refusal to be VISIBLE and explained — never
24
+ * silently removed, never accepted then ignored. And the reason is a FACT ABOUT THE DEMONSTRATION, not a reproach to
25
+ * whoever chose: whoever turned high contrast on did so because they need it.
29
26
  */
30
- export type MotivoIndisponivel = 'tema' | 'correcao' | 'ambos';
31
- export declare function simulacaoIndisponivel(v: VisualState): MotivoIndisponivel | null;
32
- /** A chave de modo DIRETO que este tema usa, ou `null` para o tema padrão. */
33
- export declare function temaDireto(v: VisualState): string | null;
27
+ export type UnavailableReason = 'tema' | 'correcao' | 'ambos';
28
+ export declare function simulationUnavailable(v: VisualState): UnavailableReason | null;
34
29
  /**
35
- * A chave de FILTRO CSS que este estado usa, ou `null`.
30
+ * The CSS FILTER key this state uses, or `null`.
36
31
  *
37
- * ⚠️ SIMULAÇÃO VENCE CORREÇÃO AQUI, e não é uma regra de precedência escondida: as duas não podem coexistir
38
- * porque `simulacaoIndisponivel` já as separa — uma simulação só corre com a correção no padrão. Este `??`
39
- * é o que acontece quando alguém constrói um estado à mão que a interface não deixaria montar, e escolher a
40
- * simulação é o menos errado dos dois: ela é a intenção mais recente e mais visível.
32
+ * ⚠️ SIMULATION BEATS CORRECTION HERE, and it is not a hidden precedence rule: the two cannot coexist because
33
+ * `simulationUnavailable` already keeps them apart — a simulation only runs with the correction at its default. This
34
+ * branch is what happens when someone builds by hand a state the interface would not let them build, and picking the
35
+ * simulation is the less wrong of the two: it is the most recent and most visible intent.
41
36
  */
42
- export declare function filtroChave(v: VisualState): string | null;
37
+ export declare function filterKey(v: VisualState): string | null;
43
38
  /**
44
- * As DUAS coisas que a raiz precisa aplicar, num objeto só.
39
+ * The TWO things the root needs to apply, in one object.
45
40
  *
46
- * ⚠️ Devolver os dois JUNTOS é o ponto da issue #104: enquanto eram um campo, aplicar um apagava o outro.
47
- * Aqui um estado com tema `hc7` e correção `deuter` devolve os dois preenchidos, e é o que o gate afirma.
41
+ * ⚠️ Returning both TOGETHER is the point of issue #104: while they were one field, applying one erased the other. Here
42
+ * a state with theme `hc7` and correction `deuter` returns both filled in, and that is what the gate asserts.
48
43
  */
49
- export interface Aplicacao {
50
- /** A chave do modo direto (alto contraste), ou `null`. */
51
- readonly direto: string | null;
52
- /** A chave do filtro CSS (correção ou simulação), ou `null`. */
53
- readonly filtro: string | null;
44
+ export interface HowItApplies {
45
+ /** The direct mode key (high contrast), or `null`. */
46
+ readonly direct: string | null;
47
+ /** The CSS filter key (correction or simulation), or `null`. */
48
+ readonly filter: string | null;
54
49
  }
55
- export declare function aplicacao(v: VisualState): Aplicacao;
56
- /** Há uma simulação a correr? É a pergunta que `simulatesDisability` fazia à string. */
57
- export declare function ehSimulacao(v: VisualState): boolean;
58
- /** É a simulação de CEGUEIRA? O quiz e o sonar perguntam isto para se comportarem sem tela. */
59
- export declare function ehCego(v: VisualState): boolean;
60
- /** É uma das cinco simulações de BAIXA VISÃO? Elas pedem o overlay como textura, e não só um filtro. */
61
- export declare function ehBaixaVisao(v: VisualState): boolean;
62
- /** O tema está fora do padrão? Era o `/^hc-direto/.test(s.viz)` espalhado pela interface. */
63
- export declare function temAltoContraste(v: VisualState): boolean;
64
- /** Próximo TEMA no ciclo do ícone da barra rápida. Anda só no seu eixo, e não toca na correção. */
65
- export declare function proximoTema(v: VisualState): VisualState;
50
+ export declare function howItApplies(v: VisualState): HowItApplies;
51
+ /** Is a simulation running? The question `simulatesDisability` asked of the string. */
52
+ export declare function isSimulation(v: VisualState): boolean;
53
+ /** Is it the BLINDNESS simulation? The quiz and the sonar ask this to behave without a screen. */
54
+ export declare function isBlind(v: VisualState): boolean;
55
+ /** Is it one of the five LOW-VISION simulations? They need the overlay as a texture, not only a filter. */
56
+ export declare function isLowVision(v: VisualState): boolean;
57
+ /**
58
+ * Is a COLOUR-VISION mode the only visual mode in this state — the 🚥 correction, or the simulation of the same colour
59
+ * blindness, with the theme at its default? The decorative scanline stays under these (ADR-0241): they change hue, not
60
+ * contrast or sharpness.
61
+ *
62
+ * 📌 The list is `CVD_KEYS`, where those six modes are defined with their matrices: a colour-vision mode added there
63
+ * counts here, with no second list of names to keep true.
64
+ */
65
+ export declare function onlyColourVision(v: VisualState): boolean;
66
+ /** Is the theme off its default? It replaces a `/^hc-direto/` test on the old string. */
67
+ export declare function hasHighContrast(v: VisualState): boolean;
68
+ /** The next THEME in the quick bar icon's cycle. It moves only on its own axis and does not touch the correction. */
69
+ export declare function nextTheme(v: VisualState): VisualState;
66
70
  /**
67
- * Próxima CORREÇÃO no ciclo do ícone. Anda só no seu eixo, e não toca no tema.
71
+ * The next CORRECTION in the icon's cycle. It moves only on its own axis and does not touch the theme.
68
72
  *
69
- * ⚠️ A ASSIMETRIA DO ORIGINAL FICA REGISTRADA E NÃO É COPIADA: `nextCvd` mapeava um valor desconhecido para
70
- * o ÍNDICE 1 (`fix-protan`) enquanto `nextContrast` mapeava para 0. Era um comentário no ficheiro a explicar
71
- * uma diferença que ninguém tinha decidido. Aqui as duas começam no padrão, porque um valor desconhecido é
72
- * exatamente o caso em que não se sabe o que a criança queria — e o padrão é a única resposta que não
73
- * escolhe por ela.
73
+ * ⚠️ AN UNKNOWN VALUE STARTS AT THE DEFAULT, on both axes. (One old cycle mapped it to index 1 and the other to 0 — a
74
+ * difference nobody had decided.) An unknown value is exactly the case where nobody knows what the child wanted — and
75
+ * the default is the only answer that does not choose for them.
74
76
  */
75
- export declare function proximaCorrecao(v: VisualState): VisualState;
77
+ export declare function nextCorrection(v: VisualState): VisualState;
76
78
  /**
77
- * A chave que o sprite do jogador usa para escolher textura.
79
+ * The key the player's sprite uses to pick a texture.
78
80
  *
79
- * ⚠️ É a SIMULAÇÃO quando há uma, e o TEMA quando não há — nesta ordem porque é a ordem do que a criança vê:
80
- * uma cegueira simulada apaga a tela inteira, e nesse instante o tema não muda nada do que ela percebe.
81
+ * ⚠️ It is the SIMULATION when there is one, and the THEME when there is not — in this order because it is the order of
82
+ * what the child sees: a simulated blindness blanks the whole screen, and at that moment the theme changes nothing they
83
+ * perceive.
81
84
  */
82
- export declare function chaveDeTextura(v: VisualState): string;
85
+ export declare function textureKey(v: VisualState): string;
83
86
  /**
84
- * A CHAVE ÚNICA que melhor descreve este estado no vocabulário ANTIGO — para quem só sabe ler uma.
87
+ * The ONE key that best describes this state in the OLD vocabulary — for whoever can only read one.
85
88
  *
86
- * ⚠️ NÃO É A `chaveDeTextura`, e a diferença custou um gate vermelho para aparecer. A de textura devolve
87
- * `normal` para uma correção de cor, porque correção não muda textura nenhuma — e usá-la como espelho faria
88
- * uma criança em `fix-deuter` passar a gravar `'normal'` na chave legada. **Um leitor antigo perderia a
89
- * correção dela**, que é exactamente o estrago que a migração inteira existe para não cometer.
89
+ * ⚠️ IT IS NOT `textureKey`, and the difference took a red gate to show. The texture one returns `normal` for a colour
90
+ * correction, because a correction changes no texture — and using it as the mirror would make a child in `fix-deuter`
91
+ * start writing `'normal'` into the legacy key. **An old reader would lose their correction**, which is exactly the
92
+ * damage the whole migration exists not to do.
90
93
  *
91
- * A ordem é simulação → tema → correção → padrão, e ela preserva TODO ajuste que já existia: nenhum estado
92
- * antigo tinha dois eixos, então nenhum deles perde nada aqui.
94
+ * The order is simulation → theme → correction → default, and it keeps EVERY setting that already existed: no old state
95
+ * had two axes, so none of them loses anything here.
93
96
  *
94
- * ⚠️ O ÚNICO CASO COM PERDA É O NOVO — `hc7 + fix-deuter` só cabe como uma das duas metades, e a escolhida é
95
- * o tema. Não há regressão possível nisso: esse estado NÃO EXISTIA antes, e um leitor que só entende uma
96
- * chave nunca soube exprimi-lo. Quem quiser as duas metades lê a chave nova, que existe precisamente para
97
- * isso.
97
+ * ⚠️ THE ONLY LOSSY CASE IS THE NEW ONE — `hc7 + fix-deuter` fits only as one of its two halves, and the chosen one is
98
+ * the theme. There is no possible regression in that: this state DID NOT EXIST before, and a reader that understands one
99
+ * key never could express it. Whoever wants both halves reads the new key, which exists precisely for that.
98
100
  */
99
- export declare function chaveLegada(v: VisualState): string;
101
+ export declare function legacyKey(v: VisualState): string;
100
102
  /**
101
- * Traduz o valor salvo. Aceita o antigo (string) e o novo (objeto), e devolve sempre um estado válido.
103
+ * Translates the saved value. It accepts the old one (a string) and the new one (an object), and always returns a
104
+ * valid state.
102
105
  *
103
- * ⚠️ IDEMPOTENTE POR CONSTRUÇÃO: um objeto já migrado atravessa com os campos conferidos. Importa porque a
104
- * leitura acontece por jogador e mais de uma vez por sessão.
106
+ * ⚠️ IDEMPOTENT BY CONSTRUCTION: an already migrated object passes through with its fields checked. It matters because
107
+ * the read happens per player and more than once a session.
105
108
  *
106
- * ⚠️ E DESCONHECIDO CAI NO PADRÃO EM VEZ DE ESTOURAR. O dado vem do navegador de uma criança e pode ser de
107
- * uma versão futura, de outra máquina, ou lixo. Um `throw` aqui tiraria o jogo do ar por causa de uma
108
- * preferência; o padrão apenas devolve o jogo como ele nasce.
109
+ * ⚠️ AND THE UNKNOWN FALLS TO THE DEFAULT INSTEAD OF THROWING. The data comes from a child's browser and may be from a
110
+ * future version, another machine, or garbage. A `throw` here would take the game down over a preference; the default
111
+ * just gives the game back as it is born.
109
112
  */
110
- export declare function migrarVisual(salvo: unknown): VisualState;
111
- export declare const TEMAS: readonly Tema[];
112
- export declare const CORRECOES: readonly Correcao[];
113
- export declare const SIMULACOES: readonly Simulacao[];
114
- /** As chaves antigas que a migração conhece — exportada para o gate poder exigir que TODAS estejam cobertas. */
115
- export declare const CHAVES_ANTIGAS: readonly string[];
113
+ export declare function migrateVisual(saved: unknown): VisualState;
114
+ export declare const THEMES: readonly Theme[];
115
+ export declare const CORRECTIONS: readonly Correction[];
116
+ export declare const SIMULATIONS: readonly Simulation[];
117
+ /** The old keys the migration knows — exported so the gate can demand that ALL of them are covered. */
118
+ export declare const LEGACY_KEYS: readonly string[];
@@ -1,35 +1,37 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/viz-axes — OS DOIS EIXOS, e a simulação que NÃO é um deles (ADR-0076). Módulo-folha, zero deps.
2
+ // render/viz-axes — THE TWO AXES, and the simulation that is NOT one of them (ADR-0076). Dependencies: the shapes, from
3
+ // `core/visual-state`, and the list of colour-vision modes, from the leaf `render/cvd-matrices` that defines them.
3
4
  //
4
- // ========================= O DEFEITO QUE ISTO CONSERTA =========================
5
- // Hoje o menu visual é UM rádio e `p.viz` guarda UMA string. Escolher `fix-deuter` desliga o contraste 7:1;
6
- // escolher um nível de contraste desliga a correção. ⚠️ UMA CRIANÇA COM DALTONISMO QUE TAMBÉM PRECISE DE
7
- // ALTO CONTRASTE NÃO PODE TER OS DOIS — e as duas necessidades coexistem numa mesma pessoa com frequência.
5
+ // ========================= THE DEFECT THIS FIXES =========================
6
+ // With ONE radio and `p.viz` keeping ONE string, choosing `fix-deuter` turned 7:1 contrast off, and choosing a contrast
7
+ // level turned the correction off. ⚠️ A COLOUR-BLIND CHILD WHO ALSO NEEDS HIGH CONTRAST COULD NOT HAVE BOTH — and the
8
+ // two needs often coexist in one person. Two axes let them.
8
9
  //
9
- // ========================= POR QUE A SIMULAÇÃO NÃO É UM EIXO =========================
10
- // Correção e simulação são ambas implementadas como filtro e servem a PROPÓSITOS OPOSTOS: uma deixa uma
11
- // criança JOGAR, a outra deixa alguém SENTIR como é não conseguir. Agrupá-las pelo mecanismo já as fundiu
12
- // duas vezes — no ADR-0011 (as correções listadas no painel de Empatia, de modo que *«a criança que
13
- // PRECISAVA da correção tinha de a procurar no menu sobre fingir»*) e no ADR-0075.
10
+ // ========================= WHY THE SIMULATION IS NOT AN AXIS =========================
11
+ // Correction and simulation are both implemented as a filter and serve OPPOSITE PURPOSES: one lets a child PLAY, the
12
+ // other lets someone FEEL what not being able to is like. Grouping them by mechanism merged them twice — in ADR-0011
13
+ // (the corrections listed in the Empathy panel, so that *«a criança que PRECISAVA da correção tinha de a procurar no
14
+ // menu sobre fingir»*) and in ADR-0075.
14
15
  //
15
- // ⚠️ UM GRUPO DE AJUSTES CHAMA-SE PELO QUE ELE SERVE, NUNCA PELO COMO É IMPLEMENTADO.
16
+ // ⚠️ A GROUP OF SETTINGS IS NAMED FOR WHAT IT SERVES, NEVER FOR HOW IT IS IMPLEMENTED.
16
17
  //
17
- // ========================= E POR QUE A SIMULAÇÃO É TRAVADA NOS DOIS PADRÕES =========================
18
- // De uma tela já corrigida, uma simulação não mostra nem a deficiência nem a correção; por cima de um tema
19
- // de alto contraste, mostra o que o tema faz e não o que a deuteranopia faz. Uma demonstração a correr em
20
- // cima de uma adaptação não é uma demonstração mais fraca — **ela ensina uma coisa falsa**.
21
- export const PADRAO = Object.freeze({ tema: 'padrao', correcao: 'tricro', simulacao: null });
18
+ // ========================= AND WHY THE SIMULATION IS LOCKED TO BOTH DEFAULTS =========================
19
+ // Over an already corrected screen, a simulation shows neither the disability nor the correction; over a high-contrast
20
+ // theme, it shows what the theme does and not what deuteranopia does. A demonstration running over an adaptation is not
21
+ // a weaker demonstration — **it teaches something false**.
22
+ import { CVD_KEYS } from './cvd-matrices.js';
23
+ export const DEFAULT_VISUAL = Object.freeze({ tema: 'padrao', correcao: 'tricro', simulacao: null });
22
24
  /**
23
- * Os dois eixos estão no padrão?
25
+ * Are both axes at their default?
24
26
  *
25
- * ⚠️ É A PERGUNTA QUE LIBERA A SIMULAÇÃO, e é por isso que ela é uma função e não um booleano guardado:
26
- * guardar o resultado deixaria as duas coisas divergirem, e a divergência aqui significa uma demonstração a
27
- * correr por cima de uma adaptação — que ensina uma coisa falsa.
27
+ * ⚠️ IT IS THE QUESTION THAT RELEASES THE SIMULATION, which is why it is a function and not a stored boolean: storing the
28
+ * result would let the two drift apart, and here a drift means a demonstration running over an adaptation — which
29
+ * teaches something false.
28
30
  */
29
- export function nosPadroes(v) {
31
+ export function bothAxesAtDefault(v) {
30
32
  return v.tema === 'padrao' && v.correcao === 'tricro';
31
33
  }
32
- export function simulacaoIndisponivel(v) {
34
+ export function simulationUnavailable(v) {
33
35
  const t = v.tema !== 'padrao';
34
36
  const c = v.correcao !== 'tricro';
35
37
  if (t && c)
@@ -40,126 +42,135 @@ export function simulacaoIndisponivel(v) {
40
42
  return 'correcao';
41
43
  return null;
42
44
  }
43
- /* ===================== A COMPOSIÇÃO ===================== */
45
+ /* ===================== THE COMPOSITION ===================== */
44
46
  //
45
- // ⚠️ ELA JÁ ERA MECANICAMENTE POSSÍVEL, e é isso que torna o defeito mais caro do que parecia: o TEMA de
46
- // alto contraste vai pela RENDERIZAÇÃO DIRETA (`DIRECT_CFG`/PIXI) e a CORREÇÃO vai por FILTRO CSS
47
- // (`url(#cvd-fix-*)`). São dois mecanismos que não colidem. O que impedia os dois de coexistir não era a
48
- // máquina — era o campo único que só cabia um valor.
49
- /** A chave de modo DIRETO que este tema usa, ou `null` para o tema padrão. */
50
- export function temaDireto(v) {
47
+ // ⚠️ IT WAS ALWAYS MECHANICALLY POSSIBLE, which is what made the defect costlier than it looked: the high-contrast THEME
48
+ // goes through DIRECT RENDERING (`DIRECT_CFG`/PIXI) and the CORRECTION through a CSS FILTER (`url(#cvd-fix-*)`). Two
49
+ // mechanisms that do not collide. What kept them from coexisting was not the machine — it was the single field that
50
+ // held one value.
51
+ /** The DIRECT mode key this theme uses, or `null` for the default theme. */
52
+ function directTheme(v) {
51
53
  return v.tema === 'hc3' ? 'hc-direto'
52
54
  : v.tema === 'hc45' ? 'hc-direto-45'
53
55
  : v.tema === 'hc7' ? 'hc-direto-7'
54
56
  : null;
55
57
  }
56
58
  /**
57
- * A chave de FILTRO CSS que este estado usa, ou `null`.
59
+ * The CSS FILTER key this state uses, or `null`.
58
60
  *
59
- * ⚠️ SIMULAÇÃO VENCE CORREÇÃO AQUI, e não é uma regra de precedência escondida: as duas não podem coexistir
60
- * porque `simulacaoIndisponivel` já as separa — uma simulação só corre com a correção no padrão. Este `??`
61
- * é o que acontece quando alguém constrói um estado à mão que a interface não deixaria montar, e escolher a
62
- * simulação é o menos errado dos dois: ela é a intenção mais recente e mais visível.
61
+ * ⚠️ SIMULATION BEATS CORRECTION HERE, and it is not a hidden precedence rule: the two cannot coexist because
62
+ * `simulationUnavailable` already keeps them apart — a simulation only runs with the correction at its default. This
63
+ * branch is what happens when someone builds by hand a state the interface would not let them build, and picking the
64
+ * simulation is the less wrong of the two: it is the most recent and most visible intent.
63
65
  */
64
- export function filtroChave(v) {
66
+ export function filterKey(v) {
65
67
  if (v.simulacao)
66
68
  return v.simulacao;
67
69
  return v.correcao === 'tricro' ? null : 'fix-' + (v.correcao === 'deuter' ? 'deuter' : v.correcao);
68
70
  }
69
- export function aplicacao(v) {
70
- return { direto: temaDireto(v), filtro: filtroChave(v) };
71
+ export function howItApplies(v) {
72
+ return { direct: directTheme(v), filter: filterKey(v) };
71
73
  }
72
- /* ===================== O QUE OS LEITORES DE FACTO PERGUNTAM ===================== */
74
+ /* ===================== WHAT THE READERS ACTUALLY ASK ===================== */
73
75
  //
74
- // ⚠️ ESTAS FUNÇÕES SAÍRAM DE UMA MEDIDA, e não de um desenho a priori. Os 31 leitores de `p.viz` foram
75
- // classificados pelo que PERGUNTAM, e a lista curta abaixo é o resultado — quatro perguntam o «kind», duas
76
- // se é simulação, uma a textura, e o resto é escrita. Um leitor que precise de algo fora daqui é sinal de
77
- // que a pergunta dele merecia um nome.
76
+ // ⚠️ THESE FUNCTIONS CAME FROM A MEASUREMENT, not from an a-priori design: the readers of `p.viz` were sorted by what they
77
+ // ASK, and the short list below is the result — whether it is a simulation, blindness, low vision, high contrast, which
78
+ // texture. A reader that needs something outside this list is a sign its question deserves a name.
78
79
  //
79
- // ⚠️ E A MEDIDA TROUXE UM ACHADO: `ui/pause-icons` já tem `nextContrast` e `nextCvd`, cada uma a ciclar
80
- // DENTRO do seu eixo. A interface já pensava em dois eixos há muito tempo; era o ARMAZENAMENTO que os
81
- // colapsava num campo. As funções de ciclo abaixo são as mesmas duas, agora com onde guardar o resultado.
82
- /** Há uma simulação a correr? É a pergunta que `simulatesDisability` fazia à string. */
83
- export function ehSimulacao(v) {
80
+ // ⚠️ And the interface already thought in two axes: the quick bar's two icons always cycled WITHIN their own axis; it
81
+ // was the STORAGE that collapsed them into one field. The cycle functions below are those two, now with a place to keep
82
+ // the result.
83
+ /** Is a simulation running? The question `simulatesDisability` asked of the string. */
84
+ export function isSimulation(v) {
84
85
  return v.simulacao !== null;
85
86
  }
86
- /** É a simulação de CEGUEIRA? O quiz e o sonar perguntam isto para se comportarem sem tela. */
87
- export function ehCego(v) {
87
+ /** Is it the BLINDNESS simulation? The quiz and the sonar ask this to behave without a screen. */
88
+ export function isBlind(v) {
88
89
  return v.simulacao === 'blind';
89
90
  }
90
- /** É uma das cinco simulações de BAIXA VISÃO? Elas pedem o overlay como textura, e não só um filtro. */
91
- export function ehBaixaVisao(v) {
91
+ /** Is it one of the five LOW-VISION simulations? They need the overlay as a texture, not only a filter. */
92
+ export function isLowVision(v) {
92
93
  return v.simulacao !== null && v.simulacao.startsWith('lv-');
93
94
  }
94
- /** O tema está fora do padrão? Era o `/^hc-direto/.test(s.viz)` espalhado pela interface. */
95
- export function temAltoContraste(v) {
95
+ /**
96
+ * Is a COLOUR-VISION mode the only visual mode in this state — the 🚥 correction, or the simulation of the same colour
97
+ * blindness, with the theme at its default? The decorative scanline stays under these (ADR-0241): they change hue, not
98
+ * contrast or sharpness.
99
+ *
100
+ * 📌 The list is `CVD_KEYS`, where those six modes are defined with their matrices: a colour-vision mode added there
101
+ * counts here, with no second list of names to keep true.
102
+ */
103
+ export function onlyColourVision(v) {
104
+ const key = filterKey(v);
105
+ return !hasHighContrast(v) && key !== null && CVD_KEYS.includes(key);
106
+ }
107
+ /** Is the theme off its default? It replaces a `/^hc-direto/` test on the old string. */
108
+ export function hasHighContrast(v) {
96
109
  return v.tema !== 'padrao';
97
110
  }
98
- /** Próximo TEMA no ciclo do ícone da barra rápida. Anda só no seu eixo, e não toca na correção. */
99
- export function proximoTema(v) {
100
- const i = TEMAS.indexOf(v.tema);
101
- return { ...v, tema: TEMAS[(i < 0 ? 0 : i + 1) % TEMAS.length] };
111
+ /** The next THEME in the quick bar icon's cycle. It moves only on its own axis and does not touch the correction. */
112
+ export function nextTheme(v) {
113
+ const i = THEMES.indexOf(v.tema);
114
+ return { ...v, tema: THEMES[(i < 0 ? 0 : i + 1) % THEMES.length] };
102
115
  }
103
116
  /**
104
- * Próxima CORREÇÃO no ciclo do ícone. Anda só no seu eixo, e não toca no tema.
117
+ * The next CORRECTION in the icon's cycle. It moves only on its own axis and does not touch the theme.
105
118
  *
106
- * ⚠️ A ASSIMETRIA DO ORIGINAL FICA REGISTRADA E NÃO É COPIADA: `nextCvd` mapeava um valor desconhecido para
107
- * o ÍNDICE 1 (`fix-protan`) enquanto `nextContrast` mapeava para 0. Era um comentário no ficheiro a explicar
108
- * uma diferença que ninguém tinha decidido. Aqui as duas começam no padrão, porque um valor desconhecido é
109
- * exatamente o caso em que não se sabe o que a criança queria — e o padrão é a única resposta que não
110
- * escolhe por ela.
119
+ * ⚠️ AN UNKNOWN VALUE STARTS AT THE DEFAULT, on both axes. (One old cycle mapped it to index 1 and the other to 0 — a
120
+ * difference nobody had decided.) An unknown value is exactly the case where nobody knows what the child wanted — and
121
+ * the default is the only answer that does not choose for them.
111
122
  */
112
- export function proximaCorrecao(v) {
113
- const i = CORRECOES.indexOf(v.correcao);
114
- return { ...v, correcao: CORRECOES[(i < 0 ? 0 : i + 1) % CORRECOES.length] };
123
+ export function nextCorrection(v) {
124
+ const i = CORRECTIONS.indexOf(v.correcao);
125
+ return { ...v, correcao: CORRECTIONS[(i < 0 ? 0 : i + 1) % CORRECTIONS.length] };
115
126
  }
116
127
  /**
117
- * A chave que o sprite do jogador usa para escolher textura.
128
+ * The key the player's sprite uses to pick a texture.
118
129
  *
119
- * ⚠️ É a SIMULAÇÃO quando há uma, e o TEMA quando não há — nesta ordem porque é a ordem do que a criança vê:
120
- * uma cegueira simulada apaga a tela inteira, e nesse instante o tema não muda nada do que ela percebe.
130
+ * ⚠️ It is the SIMULATION when there is one, and the THEME when there is not — in this order because it is the order of
131
+ * what the child sees: a simulated blindness blanks the whole screen, and at that moment the theme changes nothing they
132
+ * perceive.
121
133
  */
122
- export function chaveDeTextura(v) {
123
- return v.simulacao ?? temaDireto(v) ?? 'normal';
134
+ export function textureKey(v) {
135
+ return v.simulacao ?? directTheme(v) ?? 'normal';
124
136
  }
125
137
  /**
126
- * A CHAVE ÚNICA que melhor descreve este estado no vocabulário ANTIGO — para quem só sabe ler uma.
138
+ * The ONE key that best describes this state in the OLD vocabulary — for whoever can only read one.
127
139
  *
128
- * ⚠️ NÃO É A `chaveDeTextura`, e a diferença custou um gate vermelho para aparecer. A de textura devolve
129
- * `normal` para uma correção de cor, porque correção não muda textura nenhuma — e usá-la como espelho faria
130
- * uma criança em `fix-deuter` passar a gravar `'normal'` na chave legada. **Um leitor antigo perderia a
131
- * correção dela**, que é exactamente o estrago que a migração inteira existe para não cometer.
140
+ * ⚠️ IT IS NOT `textureKey`, and the difference took a red gate to show. The texture one returns `normal` for a colour
141
+ * correction, because a correction changes no texture — and using it as the mirror would make a child in `fix-deuter`
142
+ * start writing `'normal'` into the legacy key. **An old reader would lose their correction**, which is exactly the
143
+ * damage the whole migration exists not to do.
132
144
  *
133
- * A ordem é simulação → tema → correção → padrão, e ela preserva TODO ajuste que já existia: nenhum estado
134
- * antigo tinha dois eixos, então nenhum deles perde nada aqui.
145
+ * The order is simulation → theme → correction → default, and it keeps EVERY setting that already existed: no old state
146
+ * had two axes, so none of them loses anything here.
135
147
  *
136
- * ⚠️ O ÚNICO CASO COM PERDA É O NOVO — `hc7 + fix-deuter` só cabe como uma das duas metades, e a escolhida é
137
- * o tema. Não há regressão possível nisso: esse estado NÃO EXISTIA antes, e um leitor que só entende uma
138
- * chave nunca soube exprimi-lo. Quem quiser as duas metades lê a chave nova, que existe precisamente para
139
- * isso.
148
+ * ⚠️ THE ONLY LOSSY CASE IS THE NEW ONE — `hc7 + fix-deuter` fits only as one of its two halves, and the chosen one is
149
+ * the theme. There is no possible regression in that: this state DID NOT EXIST before, and a reader that understands one
150
+ * key never could express it. Whoever wants both halves reads the new key, which exists precisely for that.
140
151
  */
141
- export function chaveLegada(v) {
142
- return v.simulacao ?? temaDireto(v) ?? filtroChave(v) ?? 'normal';
152
+ export function legacyKey(v) {
153
+ return v.simulacao ?? directTheme(v) ?? filterKey(v) ?? 'normal';
143
154
  }
144
- /* ===================== A MIGRAÇÃO ===================== */
155
+ /* ===================== THE MIGRATION ===================== */
145
156
  //
146
- // ⚠️ ELA NÃO É OPCIONAL E VEM ANTES DA PRIMEIRA LEITURA DA FORMA NOVA. O ajuste salvo guarda o valor único
147
- // antigo; sem a tradução, o modo visual que cada criança já escolheu é DESCARTADO — e quem escolheu um
148
- // desses valores escolheu-o porque enxerga assim.
149
- /** O valor único antigo → o estado de dois eixos. Chave desconhecida cai no padrão, e nunca estoura. */
150
- const DE_CHAVE_UNICA = Object.freeze({
151
- normal: PADRAO,
152
- // Os três níveis de contraste viram TEMA, e a correção fica no padrão.
157
+ // ⚠️ IT IS NOT OPTIONAL AND IT COMES BEFORE THE FIRST READ OF THE NEW SHAPE. The saved setting keeps the old single value;
158
+ // without the translation, the visual mode each child already chose is DISCARDED — and whoever chose one of those values
159
+ // chose it because that is how they see.
160
+ /** The old single value → the two-axis state. An unknown key falls to the default and never throws. */
161
+ const FROM_SINGLE_KEY = Object.freeze({
162
+ normal: DEFAULT_VISUAL,
163
+ // The three contrast levels become a THEME, and the correction stays at its default.
153
164
  'hc-direto': { tema: 'hc3', correcao: 'tricro', simulacao: null },
154
165
  'hc-direto-45': { tema: 'hc45', correcao: 'tricro', simulacao: null },
155
166
  'hc-direto-7': { tema: 'hc7', correcao: 'tricro', simulacao: null },
156
- // As três correções viram CORREÇÃO, e o tema fica no padrão.
167
+ // The three corrections become a CORRECTION, and the theme stays at its default.
157
168
  'fix-protan': { tema: 'padrao', correcao: 'protan', simulacao: null },
158
169
  'fix-deuter': { tema: 'padrao', correcao: 'deuter', simulacao: null },
159
170
  'fix-tritan': { tema: 'padrao', correcao: 'tritan', simulacao: null },
160
- // ⚠️ AS NOVE SIMULAÇÕES VOLTAM COM OS DOIS EIXOS NO PADRÃO, e não é perda de informação: uma simulação
161
- // só era possível a partir do padrão de qualquer maneira, porque ela SUBSTITUÍA tudo o resto. O que a
162
- // forma nova acrescenta é dizer isso em vez de o deixar implícito.
171
+ // ⚠️ THE NINE SIMULATIONS COME BACK WITH BOTH AXES AT THEIR DEFAULT, and no information is lost: a simulation was only
172
+ // possible from the default anyway, because it REPLACED everything else. The new shape says so instead of leaving it
173
+ // implicit.
163
174
  'sim-protan': { tema: 'padrao', correcao: 'tricro', simulacao: 'sim-protan' },
164
175
  'sim-deuter': { tema: 'padrao', correcao: 'tricro', simulacao: 'sim-deuter' },
165
176
  'sim-tritan': { tema: 'padrao', correcao: 'tricro', simulacao: 'sim-tritan' },
@@ -171,33 +182,34 @@ const DE_CHAVE_UNICA = Object.freeze({
171
182
  blind: { tema: 'padrao', correcao: 'tricro', simulacao: 'blind' },
172
183
  });
173
184
  /**
174
- * Traduz o valor salvo. Aceita o antigo (string) e o novo (objeto), e devolve sempre um estado válido.
185
+ * Translates the saved value. It accepts the old one (a string) and the new one (an object), and always returns a
186
+ * valid state.
175
187
  *
176
- * ⚠️ IDEMPOTENTE POR CONSTRUÇÃO: um objeto já migrado atravessa com os campos conferidos. Importa porque a
177
- * leitura acontece por jogador e mais de uma vez por sessão.
188
+ * ⚠️ IDEMPOTENT BY CONSTRUCTION: an already migrated object passes through with its fields checked. It matters because
189
+ * the read happens per player and more than once a session.
178
190
  *
179
- * ⚠️ E DESCONHECIDO CAI NO PADRÃO EM VEZ DE ESTOURAR. O dado vem do navegador de uma criança e pode ser de
180
- * uma versão futura, de outra máquina, ou lixo. Um `throw` aqui tiraria o jogo do ar por causa de uma
181
- * preferência; o padrão apenas devolve o jogo como ele nasce.
191
+ * ⚠️ AND THE UNKNOWN FALLS TO THE DEFAULT INSTEAD OF THROWING. The data comes from a child's browser and may be from a
192
+ * future version, another machine, or garbage. A `throw` here would take the game down over a preference; the default
193
+ * just gives the game back as it is born.
182
194
  */
183
- export function migrarVisual(salvo) {
184
- if (typeof salvo === 'string')
185
- return DE_CHAVE_UNICA[salvo] ?? PADRAO;
186
- if (salvo && typeof salvo === 'object') {
187
- const o = salvo;
195
+ export function migrateVisual(saved) {
196
+ if (typeof saved === 'string')
197
+ return FROM_SINGLE_KEY[saved] ?? DEFAULT_VISUAL;
198
+ if (saved && typeof saved === 'object') {
199
+ const o = saved;
188
200
  return {
189
- tema: TEMAS.includes(o.tema) ? o.tema : PADRAO.tema,
190
- correcao: CORRECOES.includes(o.correcao) ? o.correcao : PADRAO.correcao,
191
- simulacao: SIMULACOES.includes(o.simulacao) ? o.simulacao : null,
201
+ tema: THEMES.includes(o.tema) ? o.tema : DEFAULT_VISUAL.tema,
202
+ correcao: CORRECTIONS.includes(o.correcao) ? o.correcao : DEFAULT_VISUAL.correcao,
203
+ simulacao: SIMULATIONS.includes(o.simulacao) ? o.simulacao : null,
192
204
  };
193
205
  }
194
- return PADRAO;
206
+ return DEFAULT_VISUAL;
195
207
  }
196
- export const TEMAS = ['padrao', 'hc3', 'hc45', 'hc7'];
197
- export const CORRECOES = ['tricro', 'protan', 'deuter', 'tritan'];
198
- export const SIMULACOES = [
208
+ export const THEMES = ['padrao', 'hc3', 'hc45', 'hc7'];
209
+ export const CORRECTIONS = ['tricro', 'protan', 'deuter', 'tritan'];
210
+ export const SIMULATIONS = [
199
211
  null, 'sim-protan', 'sim-deuter', 'sim-tritan',
200
212
  'lv-blur', 'lv-haze', 'lv-tunnel', 'lv-macular', 'lv-diabetic', 'blind',
201
213
  ];
202
- /** As chaves antigas que a migração conhece — exportada para o gate poder exigir que TODAS estejam cobertas. */
203
- export const CHAVES_ANTIGAS = Object.keys(DE_CHAVE_UNICA);
214
+ /** The old keys the migration knows — exported so the gate can demand that ALL of them are covered. */
215
+ export const LEGACY_KEYS = Object.keys(FROM_SINGLE_KEY);