@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,5 +1,5 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // Locale pt-BR — idioma base (import ESTÁTICO em core/i18n.ts → boot síncrono). Ver docs/plano-i18n.md.
2
+ // Locale pt-BR — idioma base (import ESTÁTICO em core/i18n.ts → boot síncrono). Ver docs/1-Discovery/plan-i18n.md.
3
3
  // A UI em pt é extraída em lotes; en/es caem no fallback pt até serem completados (Etapa 4).
4
4
  const pt = {
5
5
  // ===================== ANÚNCIOS DE LEITOR DE TELA (`sr.*`) =====================
@@ -13,15 +13,11 @@ const pt = {
13
13
  'sr.player.entered': 'Jogador {n} entrou!',
14
14
  // A RECICLAGEM (ADR-0049 §1: a boa ação vale um PONTO, e ponto não move barra nenhuma). As quatro cores
15
15
  // são conteúdo curricular — Resolução CONAMA 275/2001 —, então a fala DIZ a cor, e não só "certo/errado".
16
- 'sr.lixo.pegou': 'Você pegou: {o}.',
17
16
  'sr.lixo.soltou': 'Você soltou: {o}.',
18
- 'sr.lixo.acertou': 'Certo! {o} vai na lixeira {cor}. Um ponto.',
19
- 'sr.lixo.errou': 'Essa não é a lixeira do {o}. Tente outra cor.',
20
17
  'sr.lixo.solta': 'Aqui não se joga lixo. Você deixou cair na placa.',
21
18
  'sr.lixo.barreira': 'A placa não deixa o lixo passar.',
22
19
  'lixo.obj.papel': 'caixa de papelão',
23
20
  'lixo.obj.plastico': 'garrafa PET',
24
- 'lixo.obj.metal': 'latinha de alumínio',
25
21
  'lixo.obj.vidro': 'pote de vidro',
26
22
  'lixo.cor.azul': 'azul',
27
23
  'lixo.cor.vermelha': 'vermelha',
@@ -29,80 +25,94 @@ const pt = {
29
25
  'lixo.cor.verde': 'verde',
30
26
  'sr.print.on': 'Modo Print: veja a tela sem menus. Aperte qualquer botão para voltar.',
31
27
  'sr.player.pressToJoin': 'Jogador {n}: aperte um botão para entrar.',
28
+ // O selo VISÍVEL da tela sem dono (`ui/hud.waitBadgeHtml`). Parece-se com a linha acima e não é a mesma: a
29
+ // de cima é para quem ESCUTA, esta diz QUAL botão, porque quem a lê tem outras pessoas à volta.
30
+ 'hud.waitBadge': 'Jogador {n}: aperte um botão do SEU teclado ou de um controle livre para entrar',
32
31
  'sr.libras.loading': 'Intérprete de Libras ainda carregando — tente de novo em instantes.',
33
- 'sr.eyes.loadFailed': 'WebGazer não carregou.',
34
- 'sr.eyes.calibrate': 'Jogar com os olhos: olhe pela tela e clique em alguns pontos para calibrar. Olhar esquerda/direita anda; olhar para cima pula.',
35
- 'sr.eyes.needsInternet': 'Não foi possível carregar o WebGazer (precisa de internet no 1º uso).',
32
+ // told to a deaf child when the sonar asks for signing and no interpreter can sign: what she keeps matters as much as what
33
+ // she lost (ADR-0234)
34
+ 'sr.deaf.noSigning': 'Sem intérprete de Libras agora: as legendas e o texto continuam na tela.',
35
+ // the accessible name of the interpreter's frame, in front of the screen while it signs (ADR-0234)
36
+ 'sr.deaf.interpreter': 'Intérprete de Libras',
37
+ 'sr.eyes.needsInternet': 'O controle pelo olhar ainda não chegou a este aparelho: ele desce na primeira vez que o jogo abre com internet.',
38
+ 'sr.eyes.failed': 'O controle pelo olhar não conseguiu começar neste aparelho.',
39
+ // the eye control's words over the game (ADR-0213 §6): a region tells a preparing look which way to go, the opposite of itself
40
+ 'gaze.lookHere': 'Olhe aqui',
41
+ 'gaze.loading': 'Carregando...',
42
+ 'gaze.prepare.up': 'Desça!',
43
+ 'gaze.prepare.right': 'Pra Esquerda!',
44
+ 'gaze.prepare.down': 'Suba!',
45
+ 'gaze.prepare.left': 'Pra Direita!',
46
+ 'sr.face.lookMiddle': 'Olhe para o meio da tela com o rosto parado até eu dizer pronto.',
47
+ 'sr.face.ready': 'Pronto: já pode jogar com o rosto.',
48
+ 'sr.face.noCamera': 'O controle pelo rosto precisa da câmera, e ela não abriu. Permita a câmera para esta página.',
49
+ 'sr.face.needsInternet': 'O controle pelo rosto ainda não chegou a este aparelho: ele desce na primeira vez que o jogo abre com internet.',
50
+ 'sr.face.failed': 'O controle pelo rosto não conseguiu começar neste aparelho.',
51
+ 'sr.face.stopped': 'O controle pelo rosto parou de receber imagens da câmera.',
52
+ 'sr.face.slow': 'O controle pelo rosto está lento neste aparelho e pode não responder.',
53
+ 'sr.eyes.lookMiddle': 'Olhe para o meio da tela e não mexa os olhos até eu dizer pronto.',
54
+ 'sr.eyes.ready': 'Pronto: já pode jogar com os olhos.',
55
+ 'sr.eyes.noCamera': 'O controle pelo olhar precisa da câmera, e ela não abriu. Permita a câmera para esta página.',
56
+ 'sr.eyes.stopped': 'O controle pelo olhar parou de receber imagens da câmera.',
57
+ 'sr.eyes.slow': 'O controle pelo olhar está lento neste aparelho e pode não responder.',
36
58
  'sr.typo.font': 'Tipografia: {fam}.',
59
+ 'sr.icon.velocidade': 'Velocidade do jogo: {pct}%.',
37
60
  'sr.visual.contrast': 'Alto contraste: {v}.',
38
61
  'sr.visual.lq': 'Realce de contraste: {v}.',
39
- 'sr.gate.open': 'Portão aberto!',
40
- 'sr.key.taken': '{who}pegou a chave. Toque no portão para abri-lo.',
41
- 'sr.key.returned': 'A chave voltou para o lugar de origem.',
42
- 'sr.power.swapHint': '{msg} (Trocar poder cicla entre os coletados.)',
43
- 'sr.round.multi': '{n} jogadores, cada um na sua tela. Corram pelas moedas.',
44
- 'sr.round.somasub': 'Modo Soma-Sub. Toque nas figuras e resolva as contas.',
45
- 'sr.round.silabas': 'Modo Sílabas. Toque nas letras e monte as palavras.',
46
- 'sr.round.ludico': 'Nova rodada. Colete 10 moedas.',
47
- 'sr.screens.mobileOnly': 'No celular o jogo roda em uma tela só.',
48
- 'sr.screens.alreadyN': '{n} telas já ativas.',
49
- 'sr.screens.already1': '1 tela.',
50
- 'sr.screens.wontFitN': 'Não cabem {n} telas nesta janela — cada tela precisa de ao menos 640×360. Aumente a janela ou use tela cheia.',
51
62
  'sr.screens.wontFitOneMore': 'Não cabe mais uma tela nesta janela — cada tela precisa de ao menos 640×360. Aumente a janela ou use tela cheia.',
52
- 'sr.screens.activeN': '{n} telas ativas.',
53
- 'sr.screens.newRoundN': '{n} telas ativas — nova rodada.',
54
- 'sr.screens.newRound1': '1 tela — nova rodada.',
55
63
  'sr.screens.maxPlayers': 'Já são 4 jogadores.',
56
- 'sr.player.restarted': 'Jogador {n} recomeçou nesta tela.',
57
- 'sr.player.joined': 'Jogador {n} entrou no jogo em andamento.',
58
- 'sr.player.quit': 'Jogador {n} abandonou o jogo.',
59
64
  // Objetivo no HUD (texto em DOM, mesma árvore de decisão do anúncio de rodada)
60
- 'hud.objective.multi': '{n} jogadores — corrida pelas {alvo} moedas',
61
- 'hud.objective.somasub': 'Resolva 10 contas',
62
- 'hud.objective.silabas': 'Monte 10 palavras',
63
- 'hud.objective.ludico': 'Colete 10 moedas',
64
65
  // A MOLDURA do contador do HUD. O nome do objetivo atravessa por `{nome}` e NÃO se traduz aqui: quem
65
66
  // o declara é o jogo (campo 5 do contrato). Sem artigo de propósito — assim a frase serve a qualquer
66
67
  // gênero gramatical, e o `gender` do Speakable fica para as frases que precisam concordar.
67
68
  'hud.contador': '{have} de {need} {nome}',
69
+ 'hud.numero': '{nome}: {valor}',
70
+ 'hud.barra': '{nome}: {azuis} de primeira, {verdes} com ajuda, {vermelhos} sem acertar',
71
+ 'hud.barra.sobe': 'o nível sobe',
72
+ 'hud.barra.desce': 'o nível desce',
73
+ // The score in the HUD row is drawn as five digits (ADR-0238, ADR-0239); a listener hears the number itself, not the zeros.
74
+ 'hud.points': '{count} {name}',
75
+ // The session clock's accessible name (ADR-0236): the time left in words, never «0:45». Rewritten each whole minute.
76
+ 'clock.left': 'Tempo de jogo: faltam {minutes} minutos',
77
+ 'clock.left.one': 'Tempo de jogo: falta 1 minuto',
78
+ 'clock.over': 'Tempo de jogo: acabou',
79
+ 'clock.label': 'TEMPO', // the small word over the clock's digits (ADR-0239)
68
80
  // O NOME do que este jogo junta. Currículo não se traduz (pilar 3), mas "moedas" não é currículo — é um
69
81
  // substantivo comum da interface, e a criança que joga em inglês tem de ouvir "coins". Por isso o nome
70
82
  // atravessa por `{nome}` JÁ RESOLVIDO pelo jogo, e a chave mora aqui.
71
- 'hud.nome.moedas': 'moedas',
72
- 'hud.nome.moeda': 'moeda',
73
83
  // O rótulo do botão dinâmico do menu de pausa. `{nome}` é o nome do nível, que o JOGO resolve — currículo
74
84
  // não se traduz (pilar 3); a MOLDURA, sim, e é ela que mora aqui.
75
85
  'pause.nivel': '📚 Nível {n} · {nome}',
76
86
  // LEGENDAS DOS EARCONS (item 19). Eram texto cru dentro de `platform/audio` — nove frases numa camada de
77
87
  // engine, invisíveis ao gate de i18n do `main.js`. É o que a criança SURDA lê no lugar do som: deixá-las em
78
88
  // português num build em inglês tirava dela exatamente a informação que a legenda existe para dar.
79
- 'sfx.jump': '🔊 Pulo',
80
- 'sfx.coin': '🔊 Coletou',
81
- 'sfx.hurt': '🔊 Ai! Dano',
82
- 'sfx.win': '🔊 Vitória!',
83
- 'sfx.correct': '🔊 Acertou!',
84
- 'sfx.wrong': '🔊 Tente de novo',
85
- 'sfx.power': '🔊 Power-up!',
86
- 'sfx.key': '🔊 Chave',
87
- 'sfx.gate': '🔊 Portão abriu',
88
89
  // Chrome / navegação
89
90
  'skip.toGame': 'Pular para o jogo',
90
- 'menu.ludico': 'Lúdico',
91
- 'menu.alfabetizacao': 'Alfabetização',
92
- 'menu.matematica': 'Matemática',
93
91
  // Tela de título
94
- 'title.byline': 'by Prof. José Rocha',
95
- 'title.wait': 'Aguarde o Jogador 1 escolher o jogo',
96
92
  // Vitória
97
- 'win.title': '🎉 Você coletou as 10 moedas!',
98
- 'win.again': 'Jogar de novo',
99
93
  // Menu de pausa (por tela — buildScreenPause). O botão de letra (ABC/abc/Braille) é dinâmico, fica fora.
100
94
  'pause.title': 'Pausado',
101
- 'pause.resume': '▶ Continuar',
102
- 'pause.acessibilidade': '♿ Acessibilidade',
103
- 'pause.options': '⚙ Opções',
104
- 'pause.pmback': '↩ Voltar',
95
+ 'pause.resume': 'Voltar',
96
+ // A palavra da PAUSA RÁPIDA, ao centro da tela congelada (ADR-0155). Curta: é para ler de relance.
97
+ 'pause.quick': 'PAUSADO',
98
+ // A legenda do rodapé da pausa rápida (errata do ADR-0155), nas palavras do Dev.
99
+ 'pause.quick.legenda': '2: confirmar · 3: voltar · 4: menu · START: voltar ao jogo',
100
+ 'pause.card.legenda': '2: confirmar · 3: voltar',
101
+ 'pause.acessibilidade': 'Acessibilidade',
102
+ 'pause.options': 'Configurações de inclusão',
103
+ 'pause.opcoesdojogo': 'Opções do jogo',
104
+ 'pause.pmback': 'Voltar',
105
105
  'pause.cardAria': 'Menu de pausa do jogador {n}',
106
+ // O sufixo do título do cartão, só em multijogador. Era português cru colado no markup de `ui/pause-icons`.
107
+ 'pause.cardSeat': ' · Jogador {n}',
108
+ // A TELA DE AJUDA (ADR-0147 §4): qual botão faz o quê, neste jogo, no teclado desta criança. A moldura mora
109
+ // aqui; as PALAVRAS de cada posição são do jogo e chegam pelo `preset` (ADR-0085).
110
+ 'menu.help': 'Ajuda',
111
+ 'help.grupo.rotulo': 'Os botões deste jogo',
112
+ // O que a linha diz quando o teclado não alcança aquela posição. É informação e não erro: quem joga só com
113
+ // controle ou só com o dedo tem posições sem tecla, e dizê-lo é melhor do que mostrar uma linha vazia.
114
+ 'help.noKey': 'sem tecla',
115
+ 'help.slide.tecla': 'Tecla {k}',
106
116
  /* --- CATÁLOGO DE ATIVIDADES: só o que NÃO é alfabetização. As cinco de alfabetização seguem cruas em
107
117
  pt-BR no `educational/activities-registry`, porque a palavra e a sílaba SÃO a matéria (pilar 3). --- */
108
118
  'act.ludico.nome': 'Coletar 10 moedas',
@@ -130,19 +140,23 @@ const pt = {
130
140
  'act.fr632.d': 'Some e subtraia sextos, terços e meios.',
131
141
  'act.fr2a6.nome': 'Soma e subtração com frações de meio a sextos',
132
142
  'act.fr2a6.d': 'Some e subtraia frações de meios a sextos.',
133
- 'pause.tipo': '🔤 Tipografia',
134
- 'pause.addplayer': '👥 Adicionar jogador',
135
- 'pause.audio': '🦻 Acessibilidade auditiva',
136
- 'pause.motora': '♿ Acessibilidade motora',
137
- 'pause.anim': '🎞 Sensibilidade visual',
138
- 'pause.visual': '🎨 Acessibilidade visual',
139
- 'pause.empatia': '🫂 Modo empatia',
140
- 'pause.ajuda': '❓ Ajuda',
141
- 'pause.print': '📷 Print (ver a tela)',
142
- 'pause.quit': '🚪 Sair do jogo',
143
+ 'pause.tipo': 'Tipografia',
144
+ 'pause.addplayer': 'Número de jogadores',
145
+ 'pause.audio': 'Acessibilidade auditiva',
146
+ 'pause.som': 'Conforto auditivo',
147
+ 'pause.motora': 'Acessibilidade motora',
148
+ 'pause.anim': 'Sensibilidade visual',
149
+ 'pause.visual': 'Acessibilidade visual',
150
+ 'pause.empatia': 'Modo empatia',
151
+ 'pause.ajuda': 'Ajuda — Como jogar',
152
+ 'pause.print': 'Print (ver a tela)',
153
+ 'pause.quit': 'Sair do jogo',
154
+ 'pause.motivo': 'Este jogo não usa esta opção.',
155
+ 'pause.motivo.ajuda': 'Este jogo ainda não disse o que cada botão faz.',
156
+ 'pause.motivo.addplayer': 'Quem decide quantos jogadores podem jogar é o jogo.',
157
+ 'pause.motivo.opcoesdojogo': 'Este jogo não tem opções próprias.',
158
+ 'pause.motivo.caa': 'Menu desabilitado',
143
159
  // Acessibilidade (leitores de tela)
144
- 'a11y.gameRegion': 'Área de jogo. Mova com A e D ou setas; pule com L ou Espaço; suba e desça escadas (e nade na água) com W e S ou setas; corra com P ou Shift. Colete 10 moedas.',
145
- 'game.instructions': 'Mova o personagem pela caverna e colete 10 moedas. Sem limite de tempo. Controles: A e D ou setas movem; L ou Espaço pulam; W e S (ou setas cima/baixo) sobem/descem escadas e nadam; P ou Shift correm.',
146
160
  // Controles de toque — rótulos das 9 posições e das 9 ações mapeáveis (painel #touchcfg) e os anúncios.
147
161
  // Rótulo é MOLDURA inteira: em inglês "(cima)" vira "(up)" e a seta fica onde está, então a seta viaja
148
162
  // dentro da tradução em vez de ser concatenada fora dela.
@@ -151,10 +165,20 @@ const pt = {
151
165
  'touch.slot.left': 'Direcional ← (esquerda)',
152
166
  'touch.slot.right': 'Direcional → (direita)',
153
167
  'touch.slot.start': 'START (enter)',
168
+ 'touch.start': 'START',
169
+ 'touch.nome.up': 'Cima',
170
+ 'touch.nome.down': 'Baixo',
171
+ 'touch.nome.left': 'Esquerda',
172
+ 'touch.nome.right': 'Direita',
173
+ 'touch.select': 'SELECT',
154
174
  'touch.slot.b0': 'Botão 0 (baixo)',
155
175
  'touch.slot.b1': 'Botão 1 (direita)',
156
176
  'touch.slot.b2': 'Botão 2 (esquerda)',
157
177
  'touch.slot.b3': 'Botão 3 (cima)',
178
+ 'touch.slot.bl2': 'L2 (gatilho esquerdo)',
179
+ 'touch.slot.bl1': 'L1 (ombro esquerdo)',
180
+ 'touch.slot.br2': 'R2 (gatilho direito)',
181
+ 'touch.slot.br1': 'R1 (ombro direito)',
158
182
  'touch.slot.fallback': 'Botão',
159
183
  'touch.act.left': 'Andar à esquerda',
160
184
  'touch.act.right': 'Andar à direita',
@@ -164,7 +188,6 @@ const pt = {
164
188
  'touch.act.run': 'Correr / interagir',
165
189
  'touch.act.especial': 'Especial',
166
190
  'touch.act.swap': 'Trocar poder',
167
- 'touch.act.pause': 'Pausar (START)',
168
191
  'touch.dir.cross': 'cruz (D-pad)',
169
192
  'touch.dir.stick': 'analógico',
170
193
  'sr.touch.slotSet': '{slot}: {acao}.',
@@ -207,7 +230,6 @@ const pt = {
207
230
  'audio.voiceSample': 'Olá! Esta é a voz da narração do Inclusionista. Um, dois, três, testando.',
208
231
  // Os NOMES dos motores são nomes próprios e ficam; o que traduz é a explicação entre parênteses.
209
232
  'tts.engine.webspeech': 'Voz do navegador (Web Speech)',
210
- 'tts.engine.piper': 'Piper (neural, offline) — baixa no 1º uso',
211
233
  'tts.engine.kokoro': 'Kokoro-82M (neural) — baixa no 1º uso',
212
234
  'tts.engine.kitten': 'Kitten (neural) — baixa no 1º uso',
213
235
  'tts.engine.espeak': 'eSpeak NG (embutido)',
@@ -224,18 +246,71 @@ const pt = {
224
246
  'sr.audio.voicePicked': 'Voz selecionada.',
225
247
  'sr.audio.testingVoice': 'Testando a voz selecionada.',
226
248
  // Barra de icones de acessibilidade (menu de pausa e splash) + os niveis que ela cicla.
227
- 'icon.blind': 'Modo cego (navegação sonora)',
228
- 'icon.tts': 'Narração por voz (TTS)',
229
- 'icon.libras': 'Modo pessoa surda (Libras)',
230
- 'icon.tea': 'Modo TEA (calmo / silencioso)',
231
- 'icon.altmove': 'Teclas de alternância',
249
+ 'icon.blind': 'Modo cego',
250
+ 'icon.tts': 'Narração por voz',
251
+ 'icon.libras': 'Modo pessoa surda',
252
+ 'icon.tea': 'Modo TEA',
253
+ // ☝️ deixou de ser um interruptor e passou a três posições (ADR-0218): o nome diz o ASSUNTO e o valor diz a posição.
254
+ 'icon.altmove': 'Jeito de apertar',
255
+ 'input.standard': 'padrão',
256
+ 'input.sticky': 'não precisa segurar',
257
+ 'scan.nothing': 'cancelar',
258
+ // One-button scanning inside a menu: that menu's own steps (ADR-0218 erratum of 2026-09-26, interface log).
259
+ 'scan.menu.next': 'próximo',
260
+ 'scan.menu.confirm': 'confirmar',
261
+ 'scan.menu.back': 'voltar',
262
+ 'scan.menu.previous': 'anterior',
263
+ // ...and, on a control with a value, the sideways step (the interface log's entry on the sideways step).
264
+ 'scan.menu.increase': 'aumentar',
265
+ 'scan.menu.decrease': 'diminuir',
266
+ // ...and the engine's two doors, offered in play after the game's own words (ADR-0218 §3).
267
+ 'scan.door.menus': 'menu',
268
+ 'scan.door.pause': 'pausar',
269
+ 'input.scan': 'um botão só',
232
270
  'icon.contrast': 'Alto contraste',
233
- 'icon.cvd': 'Correção de daltonismo (protan/deutan/tritan)',
234
- 'icon.face': 'Webcam — rosto',
235
- 'icon.eyes': 'Webcam — olhos',
271
+ 'icon.cvd': 'Correção de daltonismo',
236
272
  'icon.voice': 'Comando de voz',
273
+ // O 11.º ícone (ADR-0149): um ciclo de tipografia — muda a CAIXA e a FACE de uma vez, sem sair da tela.
274
+ // ADR-0151: o ciclo de «leitura e tipografia» virou o ciclo de COMUNICAÇÃO (vai ganhar ARASAAC e PCS).
275
+ 'icon.tipografia': 'Comunicação',
276
+ 'icon.velocidade': 'Velocidade do jogo',
277
+ 'icon.velocidade.valor': '{pct}%',
278
+ 'icon.blind.dica': 'Joga-se pelo som: a navegação sonora diz o que a tela mostra.',
279
+ 'icon.tts.dica': 'O jogo lê em voz alta o que está escrito na tela.',
280
+ 'icon.libras.dica': 'Os sons ganham legenda, e o sonar chama um intérprete de Libras para o que está na tela.',
281
+ 'icon.tea.dica': 'Deixa o jogo mais calmo ou em silêncio, para quem se sobrecarrega com estímulos.',
282
+ 'icon.altmove.dica': 'Como os seus toques são lidos: do jeito padrão; ou com um toque que liga e outro que desliga, sem segurar; ou com um botão só, em que o jogo mostra cada coisa por vez e você aperta na que quer.',
283
+ 'sr.icon.inputMode': 'Jeito de apertar: {v}.',
284
+ 'icon.contrast.dica': 'Aumenta a diferença entre o que importa e o fundo: 3:1, 4,5:1 ou 7:1.',
285
+ 'icon.cvd.dica': 'Ajusta as cores para quem confunde vermelho e verde (protan, deutan) ou azul e amarelo (tritan).',
286
+ 'icon.idioma': 'Idioma',
287
+ 'icon.idioma.dica': 'Trocar o idioma do jogo: menus, explicações, voz e reconhecimento de fala.',
288
+ 'icon.camera': 'Webcam',
289
+ 'icon.camera.dica': 'Jogar pela webcam: com gestos das mãos, com o rosto ou com os olhos. As linhas mostram o que a câmera lê.',
290
+ 'camera.hands': 'gestos das mãos',
291
+ 'camera.face': 'rosto',
292
+ 'camera.eyes': 'olhos',
293
+ 'sr.icon.voice': 'Comando de voz: {v}.',
294
+ 'sr.icon.camera': 'Jogar pela webcam: {v}.',
295
+ 'sr.voice.ready': 'Pronto: já pode jogar falando.',
296
+ 'sr.voice.noMicrophone': 'O controle por voz precisa do microfone, e ele não abriu. Permita o microfone para esta página.',
297
+ 'sr.voice.failed': 'O comando de voz não conseguiu começar neste aparelho.',
298
+ 'sr.voice.needsInternet': 'O controle por voz ainda não chegou a este aparelho: ele desce na primeira vez que o jogo abre com internet.',
299
+ 'sr.reading.failed': 'A leitura em voz alta não conseguiu começar neste idioma, neste aparelho.',
300
+ 'sr.hands.ready': 'Pronto: já pode jogar com gestos das mãos.',
301
+ 'sr.hands.noCamera': 'O controle por gestos precisa da câmera, e ela não abriu. Permita a câmera para esta página.',
302
+ 'sr.hands.needsInternet': 'O controle por gestos ainda não chegou a este aparelho: ele desce na primeira vez que o jogo abre com internet.',
303
+ 'sr.hands.failed': 'O controle por gestos não conseguiu começar neste aparelho.',
304
+ 'sr.hands.stopped': 'O controle por gestos parou de receber imagens da câmera.',
305
+ 'sr.hands.slow': 'O controle por gestos está lento neste aparelho e pode não responder.',
306
+ 'icon.menu': 'Menu',
307
+ 'icon.menu.dica': 'Abrir os menus: ajuda, configurações de inclusão, opções do jogo e sair.',
308
+ 'sr.icon.idioma': 'Idioma: {v}.',
309
+ 'icon.voice.dica': 'Controlar o jogo falando.',
310
+ 'icon.tipografia.dica': 'Troca a forma das letras: caixa alta, letras mais legíveis ou a letra cursiva do seu país.',
311
+ 'icon.velocidade.dica': 'Deixa o jogo inteiro mais devagar: o tempo, o mundo e o momento de agir.',
237
312
  'icon.state': '{nome}: {v}',
238
- 'icon.soon': '{nome} (em construção)',
313
+ 'ui.soon': 'em breve',
239
314
  'state.on': 'ligado',
240
315
  'state.off': 'desligado',
241
316
  'calm.off': 'desligado',
@@ -250,6 +325,31 @@ const pt = {
250
325
  'contrast.3': '3:1',
251
326
  'contrast.45': '4,5:1',
252
327
  'contrast.7': '7:1',
328
+ 'visual.lq': 'Realce de contraste',
329
+ 'visual.lq.dica': 'Curva de tom na tela inteira: linear estica o contraste, quadrático realça sombras e altas-luzes, e misto fica entre os dois. Vale para todos os jogadores.',
330
+ 'menu.visual': 'Acessibilidade visual',
331
+ 'menu.empathy': 'Modo empatia',
332
+ 'empathy.grupo.rotulo': 'Simulações',
333
+ 'empathy.simulacao.dica': 'Mostra o jogo como o vê quem tem a deficiência escolhida.',
334
+ 'empathy.hearing': 'Simular perda auditiva',
335
+ 'empathy.hearing.dica': 'Sons fracos ficam abafados e os agudos são cortados, como ouve quem tem perda auditiva.',
336
+ 'empathy.onebtn': 'Simular um botão por vez',
337
+ 'empathy.onebtn.dica': 'Enquanto um botão está apertado, o jogo não aceita um segundo, como para quem não consegue apertar dois ao mesmo tempo.',
338
+ 'empathy.semforca': 'Simular sem força para segurar',
339
+ 'empathy.semforca.dica': 'Segurar um botão vale só um toque, como para quem não tem força para manter o botão apertado.',
340
+ 'empathy.select': 'Selecionar',
341
+ 'empathy.selected': '✓ Selecionado',
342
+ 'visual.grupo.rotulo': 'Ajustes visuais',
343
+ 'visual.cbsafe': 'Paleta segura para daltonismo',
344
+ 'visual.cbsafe.dica': 'Troca as cores dos menus e do HUD por uma paleta que se distingue em qualquer tipo de daltonismo (Okabe-Ito).',
345
+ 'visual.dono': 'Itens na cor do dono',
346
+ 'visual.dono.dica': 'No multiplayer, cada jogador vê os próprios itens na cor dele. Desligado: itens na cor original para todos.',
347
+ 'visual.papeis': 'Cores do color-blocking',
348
+ 'visual.papeis.dica': 'Nos modos de alto contraste, escolha a cor de cada papel. ↺ restaura o padrão.',
349
+ // 📌 A MOLDURA NA CHAVE, O CONTEÚDO POR `{param}` (`CLAUDE.md` §A FRONTEIRA): o nome de um papel é a palavra do JOGO
350
+ // que monta este painel, e a engine não a traduz nem a inventa — ela traduz o «Cor de» que a envolve.
351
+ 'visual.papel.cor': 'Cor de {papel}',
352
+ 'visual.papel.repor': 'Restaurar cores padrão',
253
353
  'lq.off': 'desligado',
254
354
  'lq.linear': 'linear',
255
355
  'lq.mixed': 'misto',
@@ -266,49 +366,34 @@ const pt = {
266
366
  'icon.cvd.short': 'Correção de daltonismo',
267
367
  'pause.iconBarAria': 'Atalhos de acessibilidade',
268
368
  // Menu de atividades (splash) — escolha de atividade, cenário, nº de jogadores e notações de fração.
269
- 'fnot.v': 'Fracionária vertical',
270
- 'fnot.d': 'Fracionária diagonal',
271
- 'fnot.dec': 'Decimal',
272
- 'fnot.pct': 'Percentual',
273
- 'fnot.mix': 'Mista',
274
- 'menu.playerCountAria': 'Número de jogadores: {n}. Clique à esquerda para menos, à direita para mais.',
275
- 'sr.menu.pickScenario': 'Escolha o cenário.',
276
- 'sr.menu.gameStarted': '{atividade}. Jogo iniciado.',
277
- 'sr.menu.pickNumbers': '{atividade}: escolha os números.',
278
- 'sr.menu.player1': '{n} jogador.',
279
- 'sr.menu.playersN': '{n} jogadores.',
280
369
  'sr.menu.index': '{n} de {m}',
370
+ 'sr.papel.botao': 'botão',
371
+ 'sr.papel.interruptor': 'interruptor',
372
+ 'sr.papel.lista': 'lista',
373
+ 'sr.papel.cursor': 'controle deslizante',
374
+ 'sr.papel.passos': 'seletor',
375
+ 'sr.papel.opcao': 'opção',
376
+ 'sr.estado.selecionado': 'selecionada',
281
377
  'sr.menu.indexOn': 'Posição na lista ligada.',
282
378
  'sr.menu.indexOff': 'Posição na lista desligada.',
283
- 'sr.a11y.barEnter': 'Barra de acessibilidade. Use as direções para escolher e confirmar para ligar. Para voltar ao jogo, aperte voltar ou START.',
379
+ 'sr.a11y.barEnter': 'Jogo pausado. Barra de acessibilidade. Use as direções para escolher e confirmar para ligar. Para voltar ao jogo, aperte voltar ou START.',
284
380
  'sr.a11y.barExit': 'De volta ao jogo.',
381
+ 'sr.a11y.quickPause': 'Jogo pausado. Para voltar ao jogo, aperte START.',
285
382
  'pad.glyph.cross': 'xis',
286
383
  'pad.glyph.circle': 'bola',
287
384
  'pad.glyph.square': 'quadrado',
288
385
  'pad.glyph.triangle': 'triângulo',
289
386
  'pad.wiz.step': '{n} de {total} — aperte: {acao}',
387
+ 'pad.wiz.stepStart': '{n} de {total} — aperte o botão que você quer como START (ele pausa o jogo)',
388
+ 'pad.wiz.stepSelect': '{n} de {total} — aperte o botão que você quer como SELECT (ele abre os menus)',
290
389
  'pad.wiz.mapped': 'Mapeados: {lista}',
291
390
  'pad.wiz.pressAny': 'Aperte QUALQUER botão no controle que deseja mapear.',
292
391
  'pad.wiz.detected': 'Controle novo detectado: {id}. O jogo pausou para você configurá-lo. SOLTE tudo para começar.',
293
392
  'pad.wiz.releaseAll': 'Controle: {id}. Agora SOLTE tudo.',
294
393
  'menu.legendSpoken': 'Botão {sim} para confirmar, botão {nao} para voltar.',
295
- 'sr.menu.fractionsIntro': 'Soma e subtração de frações: escolha a notação e o tipo.',
296
- 'sr.menu.keepOneNotation': 'Deixe ao menos uma notação ligada.',
297
- 'sr.menu.notationOn': '{notacao} ligada.',
298
- 'sr.menu.notationOff': '{notacao} desligada.',
299
- 'sr.menu.pickOneNumber': 'Escolha ao menos um número para treinar.',
300
- 'sr.menu.numberOn': 'Número {n} ligado.',
301
- 'sr.menu.numberOff': 'Número {n} desligado.',
302
- 'fnot.desc.v': 'Liga a exibição de frações verticais.',
303
- 'fnot.desc.d': 'Liga a exibição de frações na horizontal.',
304
394
  'fnot.desc.dec': 'Liga números que sempre aparecem com uma casa decimal.',
305
- 'fnot.desc.pct': 'Liga números percentuais.',
306
- 'fnot.desc.mix': 'Liga números inteiros e frações reduzidas.',
307
- 'menu.notationGroupAria': 'Notação',
308
395
  // Física (lava, ventosa-aranha), navegação sonora e o modo de demonstração.
309
- 'sr.physics.lava': 'Cuidado! Tocou na lava. As moedas voltaram para posições aleatórias.',
310
396
  'sr.physics.spiderOn': 'Modo aranha! Engatinha em paredes e teto; contorna quinas. {botao} solta.',
311
- 'sr.physics.spiderOff': 'Soltou da superfície.',
312
397
  'sr.nav.noTargetNear': 'Nada por perto.',
313
398
  // O laço parou porque um quadro lançou (ADR-0054). Criança cega não vê tela congelada: sem esta frase,
314
399
  // «travou» e «está pensando» são o mesmo silêncio.
@@ -331,6 +416,7 @@ const pt = {
331
416
  'eixo.correcao.tricro': 'Visão tricromática',
332
417
  'viz.escolher': 'Selecionar',
333
418
  'viz.escolhido': '✓ Selecionado',
419
+ 'sim.indisponivel.alternancia': 'Para ver a simulação sem força para segurar, as teclas de alternância precisam estar desligadas: com elas ligadas, a demonstração mostraria o ajuste e não a dificuldade.',
334
420
  'sim.indisponivel.tema': 'Para ver a simulação, o tema precisa estar no padrão: por cima do alto contraste ela mostraria o que o tema faz, e não o que a deficiência faz.',
335
421
  'sim.indisponivel.correcao': 'Para ver a simulação, a correção de cor precisa estar em visão tricromática: de uma tela já corrigida ela não mostraria nem a deficiência nem a correção.',
336
422
  'sim.indisponivel.ambos': 'Para ver a simulação, o tema e a correção de cor precisam estar no padrão: por cima de um ajuste, a demonstração mostra o ajuste e não a deficiência.',
@@ -342,18 +428,9 @@ const pt = {
342
428
  'reach.nome.gamepad': 'controle',
343
429
  'reach.nome.teclado': 'teclado',
344
430
  'reach.nome.toque': 'controle de tela',
345
- 'sr.attract.demo': 'Demonstração.',
346
- 'sr.attract.recorded': 'Demo de 30 segundos gravada para {cenario}.',
347
431
  // Molduras dos submenus de título e os nomes dos cenários.
348
432
  'menu.back': 'Voltar',
349
- 'menu.play': 'Jogar',
350
433
  'menu.alf': 'Alfabetização',
351
- 'menu.mat': 'Matemática',
352
- 'menu.frac': 'Fração',
353
- 'menu.fracTitle': 'Soma e subtração de frações',
354
- 'menu.tab': 'Tabuada',
355
- 'menu.tabHint': 'Escolha os números para treinar',
356
- 'menu.cen': 'Cenário',
357
434
  'cen.cidade': 'Cidade',
358
435
  'cen.campo': 'Dia no Campo',
359
436
  'cen.cemiterio': 'Amanhecer no Campo',
@@ -361,58 +438,139 @@ const pt = {
361
438
  'cen.floresta': 'Floresta',
362
439
  // Narração por voz (TTS).
363
440
  'audio.noSystemVoices': '(sem vozes do sistema)',
364
- 'sr.tts.engineNoLanguage': 'Este motor ainda não fala este idioma — por enquanto, use Piper (neural) ou a voz do navegador.',
441
+ 'sr.tts.engineNoLanguage': 'Este motor ainda não fala este idioma — por enquanto, use a voz do navegador.',
365
442
  'sr.tts.noNeuralForLanguage': 'Ainda não há voz neural para este idioma — seguindo com a voz do navegador, que fala a língua certa.',
443
+ 'sr.tts.noVoiceForLanguage': 'Este aparelho não tem voz em {language}: essa parte não é lida em voz alta, mas continua na tela.',
366
444
  // ⚠️ NÃO diz «para este idioma» (ADR-0094): sem motor neural nesta montagem, não há voz neural em idioma
367
445
  // nenhum, e a outra frase faria a criança trocar de idioma à procura do que não está lá.
368
446
  'sr.tts.neuralNotBundled': 'Esta versão do jogo não traz voz neural — seguindo com a voz do navegador.',
369
447
  'sr.tts.downloading': 'Baixando a voz neural (precisa de internet só no 1º uso)…',
370
- 'sr.tts.progress': 'Voz neural: {pct}%.',
371
448
  'sr.tts.ready': 'Voz neural pronta, em {s} segundos.',
372
449
  'sr.tts.loadFailed': 'Não deu para carregar a voz neural (precisa de internet no 1º uso) — seguindo com a voz do navegador.',
373
450
  // Quiz — só a MOLDURA. O currículo de alfabetização (palavra, letra, sílaba, soletração, célula Braille) NÃO
374
451
  // entra aqui: é específico da língua e pede currículo próprio por idioma, não tradução. Ver o CLAUDE.md.
375
- 'sr.quiz.tryAgain': 'Tente de novo.',
376
- 'sr.quiz.erase': 'apagar',
377
452
  'sr.quiz.ok': 'ok',
378
453
  'sr.blind.on': 'Modo cego ligado: bengala e pistas de áudio ativas. O 1º item de poder vira a bengala de corrida.',
379
454
  'sr.blind.off': 'Modo cego desligado.',
380
455
  'sr.motor.oneButtonOn': 'Um botão por vez ligado: só uma tecla/botão de cada vez.',
381
- 'sr.motor.oneButtonOff': 'Um botão por vez desligado.',
382
- 'sr.motor.wheelchairOn': 'Modo cadeirante ligado: sem pulo; rampas e elevadores no lugar de degraus e escada; moedas no chão; só voo e super-corrida.',
383
- 'sr.motor.wheelchairOff': 'Modo cadeirante desligado.',
384
- 'sr.visual.ownerColorsOn': 'Itens na cor do dono ligados.',
385
- 'sr.visual.ownerColorsOff': 'Itens na cor do dono desligados: todos na cor original.',
386
- 'sr.visual.cbSafeOn': 'Paleta segura para daltonismo ligada (Okabe-Ito).',
387
- 'sr.visual.cbSafeOff': 'Paleta segura para daltonismo desligada.',
388
- 'sr.visual.outlineFg': 'Contorno do primeiro plano: {v}.',
389
- 'sr.visual.outlineBg': 'Contorno do segundo plano: {v}.',
390
- 'outline.none': 'nenhum',
391
- 'outline.thin': 'fino',
392
- 'outline.thick': 'grosso',
393
- 'sr.captions.on': 'Legendas ligadas.',
394
- 'sr.captions.off': 'Legendas desligadas.',
395
456
  // Quiz — MATEMÁTICA: enunciado inteiro, operadores inclusive (2+3 independe de língua).
396
- 'math.howManyDots': 'Quantas bolinhas?',
397
- 'math.op.plus': 'mais',
398
- 'math.op.minus': 'menos',
399
- 'math.op.times': 'vezes',
400
- 'math.op.dividedBy': 'dividido por',
401
- 'sr.math.howManyDots': 'Quantas bolinhas você vê?',
402
- 'sr.math.howMuchIs': 'Quanto é {a} {op} {b}?',
403
457
  // Quiz — ALFABETIZAÇÃO: a MOLDURA traduz; a palavra, a letra e a cela Braille atravessam por parâmetro,
404
458
  // em pt-BR, porque são a matéria de uma disciplina de idioma e não se traduzem ao trocar o idioma do jogo.
405
- 'sr.quiz.who': 'Jogador {n}: ',
406
- 'sr.quiz.wins': '{n} de 3 acertos para a moeda',
407
459
  'sr.quiz.buildWord': 'Letra {letra}. Monte a palavra: {palavra}.',
408
460
  'sr.quiz.whichSpelling': '{palavra}. Qual é a escrita certa? O jogo soletra cada opção.',
409
461
  'sr.quiz.writeWord': 'Escreva a palavra: {palavra}. {n} letras.',
410
462
  'sr.quiz.brailleDictation': '{palavra}. {celas} Pule para coletar.',
411
463
  'sr.quiz.wellDone': 'Muito bem! {palavra}. {n} de 3.',
412
- 'sr.quiz.correctSoFar': 'Acertou! {n} de 3 para ganhar a moeda.',
413
464
  'menu.restoreDefaults': 'Restaurar padrões deste menu',
414
465
  'menu.close': 'Fechar',
415
466
  'menu.typo': 'Tipografia',
467
+ // O TÍTULO do painel, sem o emoji: `pause.caa` é o rótulo do BOTÃO no cartão de pausa, onde o símbolo ajuda
468
+ // a distinguir sete itens de relance. Dentro do painel já se sabe onde se está, e um emoji no `<h2>` é lido
469
+ // em voz alta por quem usa leitor de tela antes do nome do que ele abriu.
470
+ 'menu.caa': 'Comunicação',
471
+ 'aac.grupo.rotulo': 'Escolhas de comunicação',
472
+ // O nome vem do botão da pausa (`pause.anim`), sem o emoji, pela mesma razão do `menu.caa`. E o nome é
473
+ // «Sensibilidade visual» e não «Animação» porque é o que a pessoa sente: quem precisa deste painel chega
474
+ // por enjoo ou por crise, não por curiosidade sobre quadros por segundo.
475
+ 'menu.animation': 'Sensibilidade visual',
476
+ 'animation.grupo.rotulo': 'Movimento e animação',
477
+ // ===================== AS LINHAS DO PAINEL MOTORA =====================
478
+ // O rótulo é CURTO e a explicação vai numa dica só, que a casca move para o rodapé (CLAUDE.md §4). As dicas
479
+ // são as mesmas frases que os anúncios `sr.motor.*On` já dizem, no PRESENTE em vez de no passado: duas
480
+ // redações da mesma escolha divergem, e quem ouve o anúncio depois de ler a linha merece reconhecê-la.
481
+ 'motor.facil': 'Modo Fácil',
482
+ 'motor.facil.dica': 'Gravidade menor, pulo mais alto, coleta tolerante, moedas no chão, sem perigos e sem quedas acidentais.',
483
+ 'motor.altmove': 'Jeito de apertar',
484
+ 'motor.espera': 'Esperar entre toques',
485
+ 'motora.camera': 'Jogar com a câmera',
486
+ 'motora.camera.dica': 'A câmera fica no aparelho: nada do que ela vê sai daqui. Escolha o que joga — as mãos, o rosto ou os olhos.',
487
+ 'motora.voz': 'Jogar falando',
488
+ 'motora.voz.dica': 'O microfone fica no aparelho: o que a criança diz é ouvido aqui e não sai daqui. Diga o nome do que quer — «acima», «confirma» — ou o nome do item do menu que está à vista.',
489
+ 'motor.espera.dica': 'Depois de um toque, espera meio segundo antes de aceitar o próximo — para quando a mão treme e o toque sai dobrado.',
490
+ 'motor.altmove.dica': 'Um toque liga e outro desliga, em vez de manter o botão pressionado.',
491
+ 'motor.togglerun': 'Alternância do correr',
492
+ 'motor.togglerun.dica': 'O botão de correr fica ligado num toque, em vez de precisar ser segurado.',
493
+ 'motor.grupo.rotulo': 'Escolhas de movimento',
494
+ 'menu.motora': 'Acessibilidade motora',
495
+ // O tamanho do controle de toque, em quatro passos — um por persona (errata do ADR-0151).
496
+ 'motora.pad': 'Tamanho do controle',
497
+ 'motora.pad.dica': 'Escolha pela mão de quem joga: criança pequena até 6 anos, criança grande por volta dos 12. A criança pequena tem os botões maiores: ela ainda acerta longe do centro.',
498
+ 'motora.pad.crianca-pequena': 'criança pequena',
499
+ 'motora.pad.crianca-grande': 'criança grande',
500
+ 'motora.pad.adulto-pequeno': 'adulto pequeno',
501
+ 'motora.pad.adulto-maos-grandes': 'adulto de mãos grandes',
502
+ // O mapeamento de teclado por modo de jogadores (ADR-0151 §2 item 5). A de 3–4 só aparece sem ombros nem gatilhos.
503
+ 'motora.teclado.1': 'Mapear teclado — 1 jogador',
504
+ 'motora.teclado.2': 'Mapear teclado — 2 jogadores',
505
+ 'motora.teclado.34': 'Mapear teclado — 3–4 jogadores',
506
+ 'motora.controle': 'Mapear controle',
507
+ 'motora.toque': 'Mapear toque',
508
+ 'motora.abrir': 'Abrir',
509
+ 'ctrl.assento': 'Teclado de',
510
+ 'ctrl.jogador': 'Jogador {n}',
511
+ // ===================== AS LINHAS DO PAINEL AUDITIVO =====================
512
+ // Onde já havia palavra para a coisa, ela é REUSADA — `icon.blind` e `icon.tts` nomeiam os mesmos dois
513
+ // ajustes na barra de acessibilidade. Dois nomes para o mesmo ajuste em duas telas da mesma engine é como
514
+ // uma criança deixa de reconhecer o que já aprendeu.
515
+ 'audio.som': 'Som',
516
+ 'audio.som.dica': 'Desliga todo o som do jogo de uma vez, sem mexer nas escolhas de cada tipo.',
517
+ 'audio.volume': 'Volume geral',
518
+ 'audio.modocego': 'Modo cego',
519
+ 'audio.narracao': 'Narração por voz',
520
+ 'audio.cat.music': 'Música',
521
+ 'audio.cat.ambient': 'Sons ambiente',
522
+ 'audio.cat.interact': 'Efeitos de interação',
523
+ 'audio.cat.earcons': 'Earcons',
524
+ 'audio.cat.tts': 'Narração',
525
+ 'audio.cat.sonar': 'Sonar',
526
+ 'audio.cat.volumeDe': 'Volume de {c}',
527
+ 'audio.navsound.grupo': 'Sons de navegação',
528
+ 'audio.cane': 'Batida da bengala',
529
+ 'audio.cane.dica': 'De quanto em quanto chão a bengala bate. Uma batida por bloco é mais calma; a cada meio bloco dá mais detalhe.',
530
+ // the two positions of the cycle row «◀ Batida da bengala: … ▶» (ADR-0130 rule 3)
531
+ 'audio.cane.block': 'uma por bloco',
532
+ 'audio.cane.halfBlock': 'a cada meio bloco',
533
+ 'audio.menuindex': 'Índice falado dos menus',
534
+ 'audio.menuindex.dica': 'O leitor de tela diz "3 de 7" ao andar num menu, para saber onde se está sem contar.',
535
+ 'audio.tts.dica': 'O jogo lê em voz alta o que está escrito na tela.',
536
+ 'audio.ttsEngine': 'Motor de voz',
537
+ 'audio.ttsEngine.dica': 'A voz do navegador funciona logo; as neurais soam melhor e baixam no primeiro uso.',
538
+ 'audio.ttsVoice': 'Voz',
539
+ 'audio.ttsVol': 'Volume da narração',
540
+ 'audio.ttsPpm': 'Ritmo da fala',
541
+ 'audio.ttsPpm.dica': 'Quantas palavras por minuto a narração fala.',
542
+ 'tts.kokoro.teste': 'Olá.', // the short sentence that tests whether WebGPU speaks (ADR-0198 §4)
543
+ 'visual.captions': 'Legendas',
544
+ 'visual.legenda.ritmo': 'Ritmo das legendas',
545
+ 'visual.legenda.ppm': '{n} PPM',
546
+ 'visual.legenda.ritmo.dica': 'Quanto tempo a legenda fica na tela, em palavras por minuto.',
547
+ 'visual.contorno.fg': 'Contorno do 1º plano',
548
+ 'visual.contorno.bg': 'Contorno do 2º plano',
549
+ 'visual.contorno.fg.dica': 'No alto contraste, contorna o que se mexe e o que se pega.',
550
+ 'visual.contorno.bg.dica': 'No alto contraste, contorna onde se anda e onde não se anda.',
551
+ 'visual.contorno.0': 'nenhum',
552
+ 'visual.contorno.1': 'fino',
553
+ 'visual.contorno.2': 'grosso',
554
+ 'visual.captions.dica': 'Escreve na tela os sons do jogo.',
555
+ 'sr.visual.captionsOn': 'Legendas ligadas.',
556
+ 'sr.visual.captionsOff': 'Legendas desligadas.',
557
+ 'audio.voz': 'Voz',
558
+ 'audio.voz.nenhuma': 'Nenhuma voz',
559
+ 'audio.semVoz': 'Não há voz que fale este idioma.',
560
+ 'audio.comVoz': 'Agora há uma voz que fala este idioma.',
561
+ 'sr.audio.voz': 'Voz: {nome}.',
562
+ 'audio.ttsTest': 'Testar a voz',
563
+ 'audio.ttsTest.dica': 'Fala uma frase de exemplo com a voz escolhida agora.',
564
+ 'audio.sinks.grupo': 'Saída de áudio por jogador',
565
+ 'audio.detect': 'Detectar saídas',
566
+ 'menu.audio': 'Acessibilidade auditiva',
567
+ 'menu.som': 'Conforto auditivo',
568
+ 'audio.grupo.rotulo': 'Sons do jogo',
569
+ // O texto de REPOUSO do rodapé de todo painel — o que ele diz enquanto ninguém aponta para linha nenhuma.
570
+ // Era um literal em português dentro do `ui/settings-panel`, e até 2026-09-12 ninguém o via: nenhum painel
571
+ // montado pela engine existia. Com quatro deles montados, ele passou a aparecer — em português, num jogo
572
+ // em inglês.
573
+ 'menu.explainIdle': 'Passe o mouse ou navegue pelas opções para ver a explicação.',
416
574
  'sr.audio.reset': 'Acessibilidade auditiva restaurada aos padrões. Os outros menus não mudaram.',
417
575
  'sr.empathy.reset': 'Modo empatia restaurado aos padrões: simulações desligadas. Correções de daltonismo e os outros menus não mudaram.',
418
576
  'sr.motor.reset': 'Modo Fácil e movimento por alternância restaurados aos padrões. O controle pelos olhos e o mapeamento de teclas continuam como estavam.',
@@ -420,20 +578,34 @@ const pt = {
420
578
  'a11y.changed': 'alterado',
421
579
  'sr.visual.reset': 'Acessibilidade visual restaurada aos padrões: contraste, realce, cores e contornos. As legendas e os outros menus não mudaram.',
422
580
  'sr.motion.reset': 'Sensibilidade visual restaurada aos padrões: animações e estética CRT. As animações voltam ao que o seu sistema pede.',
423
- 'caa.emPreparo': 'em preparação',
424
- 'caa.aguardandoNegociacao': 'aguardando negociação',
425
- 'caa.secao.agora': 'Disponível agora',
426
- 'caa.secao.agoraTag': 'funciona sem rede',
427
- 'caa.secao.preparo': 'Em preparação',
428
- 'caa.secao.preparoTag': 'licença resolvida; falta o trabalho',
429
- 'caa.secao.negociacao': 'Aguardando negociação',
430
- 'caa.secao.negociacaoTag': 'a permissão não é nossa',
431
- 'sr.caa.escolha': 'Comunicação: {v}.',
432
- 'sr.caa.reset': 'Comunicação restaurada ao padrão: letras maiúsculas, como a alfabetização costuma começar.',
433
- 'pause.caa': '🔠 Comunicação',
434
- 'sr.caa.caixaAltaOn': 'Letras maiúsculas ligadas: o jogo inteiro em caixa alta.',
435
- 'sr.caa.caixaAltaOff': 'Letras maiúsculas desligadas: maiúsculas e minúsculas.',
436
- 'sr.quiz.bemVindo': 'Quiz. Use as setas para escolher e Enter para responder.',
581
+ 'aac.letras': 'Letras maiúsculas',
582
+ 'aac.letras.dica': 'Ligado: o jogo inteiro em caixa alta, como a alfabetização brasileira costuma começar. '
583
+ + 'Desligado: maiúsculas e minúsculas, a escrita do dia a dia.',
584
+ 'aac.noLicence': 'sem licença',
585
+ 'aac.secao.agora': 'Disponível agora',
586
+ 'aac.secao.agoraTag': 'funciona sem rede',
587
+ 'aac.section.pictograms': 'Pictogramas',
588
+ 'aac.section.pictogramsTag': 'cada um só com licença',
589
+ 'sr.aac.escolha': 'Comunicação: {v}.',
590
+ 'sr.aac.reset': 'Comunicação restaurada ao padrão: letras maiúsculas, como a alfabetização costuma começar.',
591
+ 'pause.caa': 'Comunicação',
592
+ 'sr.aac.caixaAltaOn': 'Letras maiúsculas ligadas: o jogo inteiro em caixa alta.',
593
+ 'sr.aac.caixaAltaOff': 'Letras maiúsculas desligadas: maiúsculas e minúsculas.',
594
+ // The quiz's welcome: the frame is here, the child's own keys cross as `{mover}`/`{responder}` (consumer-quiz `welcomeText`).
595
+ 'sr.quiz.bemVindo': 'Quiz. Use {mover} para escolher e {responder} para responder.',
596
+ 'sr.quiz.bemVindo.soEscolher': 'Quiz. Use {mover} para escolher.',
597
+ 'sr.quiz.bemVindo.soResponder': 'Quiz. Use {responder} para responder.',
598
+ 'sr.quiz.bemVindo.semTeclas': 'Quiz. Toque numa resposta para responder.',
599
+ 'sr.quiz.teclas.duas': '{a} e {b}',
600
+ // AS PERGUNTAS DO QUIZ. O quiz NÃO é uma disciplina de idioma, logo nem a excepção do `CLAUDE.md` §A FRONTEIRA
601
+ // se aplica: «o ENUNCIADO SEMPRE TRADUZ». Eram literais em pt-BR dentro do cartucho até 23/09, e trocar a
602
+ // bandeira mudava a moldura da engine sem tocar na atividade (ADR-0225).
603
+ 'quiz.pageTitle': 'The Inclusionist — quiz de demonstração',
604
+ 'quiz.carregando': 'Carregando…',
605
+ 'quiz.ouvindo': 'Estou ouvindo. Diga a resposta.',
606
+ 'quiz.ouviNada': 'Não ouvi nada. Diga de novo ou escolha com as setas.',
607
+ 'quiz.semLeitura': 'Este aparelho não consegue ouvir agora. Escolha com as setas.',
608
+ 'quiz.alternativas': 'Alternativas',
437
609
  'sr.nav.sonarFound': 'Sonar: {alvo} {lado}, {dist}.',
438
610
  // `sr.nav.coin` ficou para o JOGO nomear o alvo (item 19): o sonar recebe o nome por `nameAt`, campo 3 do
439
611
  // contrato. `sr.nav.target` e o que ele diz quando o jogo declara um alvo SEM nome — melhor uma palavra
@@ -458,16 +630,10 @@ const pt = {
458
630
  'sr.player.prefix': 'Jogador {n}: ',
459
631
  'sr.empathy.hearingOn': 'Simulação de perda auditiva ligada: sons fracos ficam abafados e os agudos são cortados; falas ficam difíceis de entender.',
460
632
  'sr.empathy.hearingOff': 'Simulação de perda auditiva desligada.',
461
- 'sr.pad.disconnected': 'Controle do Jogador {n} desconectado — o teclado continua funcionando. Aperte START para reassociar.',
462
- 'sr.quiz.levelSet': 'Nível {n}: {v}.',
463
- 'sr.visual.roleColorSet': 'Cor de {v} alterada.',
464
- 'sr.visual.roleColorsReset': 'Cores do color-blocking restauradas ao padrão.',
465
- 'sr.visual.defaultColors': 'Cores padrão restauradas.',
466
- 'sr.pad.connected': 'Controle conectado: layout {v}.',
467
- 'sr.pad.design': 'Desenho dos botões: {v}.',
468
- 'sr.eyes.loading': 'Jogar com os olhos: carregando a webcam (permita o acesso).',
469
- 'sr.eyes.off': 'Jogar com os olhos desligado.',
470
- 'sr.boot.loaded': 'Jogo carregado. Colete {n} moedas. Suba escadas com W/S, nade segurando pulo na água.',
633
+ 'sr.empathy.onebtnOn': 'Simulação de um botão por vez ligada: um segundo botão apertado junto não conta.',
634
+ 'sr.empathy.onebtnOff': 'Simulação de um botão por vez desligada.',
635
+ 'sr.empathy.semforcaOn': 'Simulação sem força para segurar ligada: segurar um botão vale só um toque.',
636
+ 'sr.empathy.semforcaOff': 'Simulação sem força para segurar desligada.',
471
637
  // ===================== PODERES =====================
472
638
  // `sr.power.*` é FALADO quando o poder muda (game/physics, game/session); `hud.power.*` é o rótulo curto do
473
639
  // HUD. Eram duas tabelas de `const` no main.js, e por isso estavam CONGELADAS no idioma do boot: um `const`
@@ -477,28 +643,28 @@ const pt = {
477
643
  'sr.power.turbo': 'Super-corrida! Correndo você fica bem mais rápido.',
478
644
  'sr.power.fly': 'Voo! No ar, aperte Pular para começar a voar; Pular de novo encerra.',
479
645
  'sr.power.wallcling': 'Escalada (aranha)! No ar, aperte {botao} perto de uma parede/teto para grudar; engatinha e contorna quinas; {botao} de novo solta.',
480
- 'sr.power.none': 'Sem poder ativo.',
481
- 'sr.power.generic': 'Poder ativado!',
482
646
  'hud.power.off': '—',
483
647
  'hud.power.superjump': '🐇 Super-pulo',
484
648
  'hud.power.ultrajump': '🦘 Ultra-pulo',
485
649
  'hud.power.turbo': '👟 Super-corrida',
486
- 'hud.power.fly': '🎈 Voo',
487
650
  'hud.power.wallcling': '🕷️ Escalada',
488
651
  'hud.power.runcane': '👟 Bengala de corrida',
489
652
  // ===================== MOVIMENTO REDUZIDO (WCAG 2.3.3) + CRT =====================
490
653
  // Os rótulos ficavam em DUAS tabelas `const` de texto — uma em main.js e outra em ui/settings-motion — com
491
654
  // três entradas repetidas palavra por palavra e nada ligando as duas. Agora a tabela guarda a CHAVE.
492
655
  'rm.parallax': 'Parallax do fundo',
493
- 'rm.decor': 'Decoração (nuvens, grama)',
494
- 'rm.items': 'Animação de itens (moedas)',
495
- 'rm.walk': 'Personagem em movimento (andar, escalar, nadar, pular)',
496
- 'rm.breath': 'Respiração (parado)',
497
- 'rm.flavor': 'Gracinhas (animações de descanso)',
656
+ 'rm.decor': 'Decoração',
657
+ 'rm.items': 'Animação de itens',
658
+ 'rm.walk': 'Personagem em movimento',
659
+ 'rm.breath': 'Respiração',
660
+ 'rm.flavor': 'Gracinhas',
498
661
  'rm.particles': 'Partículas e cintilação',
499
662
  'rm.crt.scan': 'Scanlines',
500
663
  'rm.crt.vig': 'Vinheta',
501
664
  'rm.crt.round': 'Cantos arredondados',
665
+ 'crt.round.off': 'desligado',
666
+ 'crt.round.small': 'pequeno',
667
+ 'crt.round.large': 'grande',
502
668
  'rm.sec.all': 'todos os jogadores',
503
669
  'sr.rm.frozen': '{alvo} congelado.',
504
670
  'sr.rm.animated': '{alvo} animado.',
@@ -510,8 +676,8 @@ const pt = {
510
676
  // ===================== LIGADO / DESLIGADO =====================
511
677
  // Duas palavras que estavam copiadas TREZE vezes, em nove arquivos — e dois desses arquivos declaravam um
512
678
  // helper "compartilhado" que só eles usavam. Agora é um só, em ui/dom, ao lado do `toggleBtn`.
513
- 'ui.toggle.on': '❚❚ Ligado',
514
- 'ui.toggle.off': '▶ Desligado',
679
+ 'ui.toggle.on': 'Ligado',
680
+ 'ui.toggle.off': 'Desligado',
515
681
  'ui.toggle.ariaOn': '{alvo}: ligado',
516
682
  'ui.toggle.ariaOff': '{alvo}: desligado',
517
683
  // ===================== AS DUAS ESCOLHAS MOTORAS POR JOGADOR =====================
@@ -520,30 +686,14 @@ const pt = {
520
686
  // só consegue se a frase inteira morar no dicionário. O 'Jogador N: ' vem de `sr.player.prefix`.
521
687
  'sr.motor.easyOn': 'Modo Fácil ligado: gravidade menor, pulo mais alto, coleta tolerante, moedas no chão, sem perigos e sem quedas acidentais (segure ↓ para descer).',
522
688
  'sr.motor.easyOff': 'Modo Fácil desligado.',
523
- 'sr.motor.toggleMoveOn': 'Movimento por alternância ligado: toque a direção para andar sem segurar; toque de novo para parar; segure para ir mais rápido. O pulo não interrompe a caminhada.',
524
- 'sr.motor.toggleMoveOff': 'Movimento por alternância desligado.',
525
- // ⚠️ O MOTIVO É UM FACTO SOBRE O APARELHO, NUNCA UMA REPREENSÃO (ADR-0113 cláusula 3). Estas frases
526
- // dizem por que o botão não responde; «não desligue isto» repreenderia uma criança por mexer num ajuste
527
- // de que ela depende. QUATRO chaves e não uma com `{aparelho}`: «os gestos» é plural e «o olhar» não.
528
- 'alt.exigida.olhos': 'O controle por olhar precisa das teclas de alternância para funcionar.',
529
- 'alt.exigida.rosto': 'O controle por rosto precisa das teclas de alternância para funcionar.',
530
- 'alt.exigida.gestos': 'Os gestos precisam das teclas de alternância para funcionar.',
531
- 'alt.exigida.fala': 'O comando de voz precisa das teclas de alternância para funcionar.',
689
+ 'sr.motor.toggleMoveOn': 'Não precisa segurar, ligado: um toque liga e outro desliga.',
690
+ 'sr.motor.toggleMoveOff': 'Não precisa segurar, desligado.',
532
691
  'sr.motor.toggleRunOn': 'Alternância do correr ligada.',
533
692
  'sr.motor.toggleRunOff': 'Alternância do correr desligada.',
534
- 'sr.physics.runLatchOn': 'Correndo.',
535
- 'sr.physics.runLatchOff': 'Andando.',
536
693
  // ===================== AJUDA (menu de pausa) + rótulo de nível =====================
537
694
  // `pause.level` é MOLDURA: `{v}` é o nome do nível da psicogênese de Ferreiro e atravessa SEM TRADUÇÃO —
538
695
  // currículo de alfabetização não se traduz, reescreve-se por idioma (pilar 3 do ADR-0010). Ver `QL_NAME`.
539
696
  'pause.level': '📚 Nível {n} · {v}',
540
- 'help.controls': 'Seus controles',
541
- 'help.controlsPlayer': 'Seus controles · Jogador {n}',
542
- 'help.keyboard': 'teclado',
543
- 'help.buildNotes': 'Notas desta build',
544
- 'help.powerups': 'Power-ups: 👟 super-corrida · 🕷️ escalada · 🎈 voo · 🐇 super-pulo · 🦘 ultra-pulo · 🔑 chave abre o 🚪 portão.',
545
- 'help.multiplayer': '2–4 jogadores: telas lado a lado, cada uma com seu menu e sua configuração.',
546
- 'help.tech': 'v{v} — PixiJS (WebGL, fallback Canvas) · texto/UI no DOM (acessibilidade) · offline via PWA.',
547
697
  // A legenda 'Sim'/'Não' do rodapé de cada pausa (os dois botões do controle). Achado pelo crivo LARGO do
548
698
  // item 14: o estreito não o pegou porque 'Sim' não tem acento e 'Não' tem três letras.
549
699
  'menu.yes': 'Sim',
@@ -588,44 +738,13 @@ const pt = {
588
738
  // 41 rótulos de leitor de tela (36 distintos) estavam em português CRU no markup, e só UM dos 53 usava o
589
739
  // `data-i18n-aria` que já existia. Numa build em inglês, uma criança cega ouvia a interface inteira em
590
740
  // português — o pilar 2 falhando na superfície onde ele mais importa, e em silêncio.
591
- 'a11y.choosePlayer': 'Escolha o jogador',
592
- 'a11y.animations': 'Animações',
593
- 'a11y.literacy': 'Alfabetização',
594
- 'a11y.shortcuts': 'Atalhos de acessibilidade',
595
- 'a11y.hearing': 'Audição',
596
- 'a11y.actionButtons': 'Botões de ação',
597
- 'a11y.screenButtons': 'Botões de tela (toque)',
598
- 'a11y.touchButtons': 'Botões de toque na tela',
599
- 'a11y.audioCategories': 'Categorias de áudio',
600
741
  'a11y.communication': 'Comunicação: letras e símbolos',
601
- 'a11y.outlineFg': 'Contorno de primeiro plano',
602
- 'a11y.outlineBg': 'Contorno de segundo plano',
603
- 'a11y.outlines': 'Contornos do alto contraste',
604
- 'a11y.touchControls': 'Controles de toque',
605
- 'a11y.padDesign': 'Desenho dos botões',
606
- 'a11y.chooseScenery': 'Escolha o cenário',
607
- 'a11y.chooseGame': 'Escolha o jogo',
608
- 'a11y.chooseNumbers': 'Escolha os números',
609
- 'a11y.hideDebug': 'Esconder as ferramentas de debug',
610
- 'a11y.btnSpecial': 'Especial (botão 1)',
611
- 'a11y.fraction': 'Fração',
612
- 'a11y.touchRoles': 'Função de cada botão de toque',
613
- 'a11y.btnRun': 'Interagir / correr (botão 2)',
614
- 'a11y.eyeGaze': 'Jogar com os olhos',
615
- 'a11y.mapControls': 'Mapear controles (por jogador)',
616
- 'a11y.math': 'Matemática',
617
742
  'a11y.pauseMenu': 'Menu de pausa',
618
- 'a11y.simActive': 'Modo de simulação ativo. Toque duas vezes para voltar às cores normais.',
619
743
  'a11y.stopAll': 'Parar todas as animações',
620
- 'a11y.btnJump': 'Pular (botão 0)',
621
- 'a11y.audioOut': 'Saída de áudio por jogador',
622
- 'a11y.visualSim': 'Simulação visual',
623
- 'a11y.switchScreens': 'Trocar o número de telas (jogadores)',
624
- 'a11y.btnSwap': 'Trocar poder (botão 3)',
744
+ 'a11y.resumeAll': 'Retomar todas as animações',
625
745
  // O rótulo VISÍVEL do #np-btn. Estava cru no index.html e não podia levar `data-i18n`: o texto embrulha um
626
746
  // `<span id="np-n">` com o número, e o `applyDom` escreve `textContent`, o que destruiria o span. A saída é
627
747
  // o JavaScript passar a ser dono do rótulo inteiro — o número já é dinâmico, então o texto sempre foi dele.
628
- 'menu.playerCount': '◀ Nº de jogadores: {n} ▶',
629
748
  // ===================== A LEGENDA DE CONTROLES (fileira sob o título) =====================
630
749
  // TERCEIRA família de rótulos para as mesmas ações, e de propósito. `act.*` serve à LISTA de mapeamento
631
750
  // ("Correr / interagir") e `touch.act.*` ao painel de toque ("Pausar (START)"); os dois cabem lá porque
@@ -643,13 +762,16 @@ const pt = {
643
762
  // catálogo, como os nomes dos motores de voz. O que traduz é o nome do GRUPO e a descrição — que é o texto
644
763
  // que explica à criança (ou a quem a acompanha) POR QUE aquela fonte existe na lista.
645
764
  'font.grupo.rotulo': 'Família de letra',
765
+ // A AMOSTRA do painel: um PANGRAMA, e por isso ele muda de idioma em vez de traduzir. A frase existe para
766
+ // pôr o alfabeto inteiro à vista — quem escolhe uma fonte está a perguntar «consigo ler isto?», e uma
767
+ // tradução literal deixaria letras de fora justamente no idioma em que a criança vai ler.
768
+ 'font.amostra': 'Juiz foge e bota fita de cetim na xícara',
646
769
  'font.group.sans': 'Sem serifa',
647
770
  'font.group.serif': 'Serifada',
648
771
  'font.group.hand': 'Manuscrita',
649
772
  'font.group.arcade': 'Arcade',
650
773
  'font.desc.atkinson': 'feita pelo Braille Institute para pessoas com baixa visão (padrão do jogo)',
651
774
  'font.desc.lexend': 'feita para reduzir stress visual e atender pessoas disléxicas (ativa o espaçamento extra)',
652
- 'font.desc.quattro': 'criada para diminuir a fadiga visual de quem passa muito tempo na tela',
653
775
  'font.desc.andika': 'baseada na Sassoon; fruto de pesquisa sobre como crianças leem e escrevem',
654
776
  'font.desc.opendyslexic': 'Letras com a base mais pesada, para não virarem de cabeça para baixo ao ler.',
655
777
  'font.desc.fondamento': 'Caligráfica de pena, para as atividades de escrita à mão.',
@@ -665,13 +787,13 @@ const pt = {
665
787
  // ⚠️ AS TRÊS PELO NOME, e não «uma fonte ronde» (ADR-0108 §4): um adulto não consegue agir sobre uma
666
788
  // categoria. A frase existe para ser executável — abrir o navegador, procurar UM destes três nomes,
667
789
  // instalar. Nomear a categoria seria a mesma linha morta que este catálogo já removeu duas vezes.
668
- 'font.off.ronde': 'Instale no aparelho uma destas três: Ronde Script, OPTIFrench-Script ou Merveille. '
669
- + 'Elas são gratuitas para uso pessoal, e por isso não podem vir dentro do jogo.',
790
+ 'font.notice.ronde': 'Instale no aparelho uma destas três: Ronde Script, OPTIFrench-Script ou Merveille. '
791
+ + 'Elas são gratuitas para uso pessoal, e por isso não podem vir dentro do jogo. '
792
+ + 'Sem elas, o jogo mostra a Cookie: uma letra ligada parecida, mas que não é a ronde da escola.',
670
793
  'font.desc.greatvibes': 'caligráfica inglesa',
671
794
  'font.desc.pinyon': 'caligráfica inglesa',
672
795
  'font.desc.ufcook': 'blackletter alemã',
673
796
  'font.desc.ufmag': 'blackletter alemã',
674
- 'font.desc.comicneue': 'bola e bastão (alfabetização)',
675
797
  'font.desc.pressstart': 'pixel de 8 bits (HUD e título do jogo)',
676
798
  'font.desc.learningcurve': 'cursiva inglesa',
677
799
  'font.desc.kindergarten': 'cursiva brasileira',