@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
@@ -0,0 +1,84 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import { ACTIONS } from '../core/actions.js';
3
+ /**
4
+ * THE FOUR ARROWS, one per direction.
5
+ *
6
+ * 🔴 The Dev asked for exactly these: «Por que está escrevendo "↔Up", "↔Down" etc ao invés de simplesmente "↑",
7
+ * "↓", "←" e "→"? Não escolha poluir a UI.» A chain of `replace` calls over the physical code is a hidden table, and a
8
+ * hidden table writes what nobody chose — so the table is written out.
9
+ *
10
+ * 📌 And there is nothing to translate here: an arrow is the same in pt, en and es, which is exactly why it is a
11
+ * glyph and not a word. The child who remaps sees the key they have in hand.
12
+ */
13
+ const GLYPH = {
14
+ ArrowUp: '↑', ArrowDown: '↓', ArrowLeft: '←', ArrowRight: '→',
15
+ };
16
+ /**
17
+ * Physical key code → short readable label.
18
+ *
19
+ * `Space` is the only one with a word to translate; the arrows are glyphs and the rest are the bare letter or
20
+ * digit, identical in every language.
21
+ *
22
+ * ⚠️ A TABLE AND A LADDER, and not a chain of replacements, which leaks the MACHINE's name whenever a prefix is not
23
+ * foreseen (`Digit1`, `Numpad5`). What is not recognised still passes through untouched on purpose: `Comma` is ugly
24
+ * and honest, and inventing a name for it would be guessing.
25
+ */
26
+ export function keyName(t, code) {
27
+ const c = String(code);
28
+ if (GLYPH[c])
29
+ return GLYPH[c];
30
+ if (c === 'Space')
31
+ return t('key.space');
32
+ if (c.startsWith('Shift'))
33
+ return 'Shift';
34
+ if (c.startsWith('Key'))
35
+ return c.slice(3);
36
+ if (c.startsWith('Digit'))
37
+ return c.slice(5);
38
+ // «Num 5», «Num Add»: the numeric keypad is a different PHYSICAL place, and saying only «5» would make two
39
+ // distinct keys show the same label in the same list.
40
+ if (c.startsWith('Numpad'))
41
+ return `Num ${c.slice(6)}`;
42
+ return c;
43
+ }
44
+ /**
45
+ * Which OTHER player already owns `code`, among `schemes` (one entry per player, same order as player index) —
46
+ * or -1 if free. `mapRef` (the scheme currently being edited) is excluded BY REFERENCE. Built over a Map (code →
47
+ * owner index) so a scheme with many bound keys does not cost a full re-scan per lookup.
48
+ */
49
+ export function keyUsedByOther(code, mapRef, schemes) {
50
+ const owners = new Map();
51
+ schemes.forEach((m, i) => {
52
+ if (m === mapRef)
53
+ return;
54
+ for (const a of ACTIONS)
55
+ for (const c of m[a] || [])
56
+ if (!owners.has(c))
57
+ owners.set(c, i);
58
+ });
59
+ return owners.get(code) ?? -1;
60
+ }
61
+ /**
62
+ * Which OTHER action OF THE SAME scheme already has `code` — or `null` if none.
63
+ *
64
+ * ⚠️ THE SIBLING `keyUsedByOther` NEEDS, AND ITS ABSENCE IS INVISIBLE IN A ONE-PLAYER GAME (#126). That function
65
+ * excludes the scheme being edited **by reference**; with a single player, `schemesFor()` returns exactly that
66
+ * scheme, so its guard scans an empty list and **can never fire**. A child who puts `W` on a new action would keep
67
+ * `W` on the old one too, and play the whole game with both firing together.
68
+ *
69
+ * ⚠️ AND THAT IS THE WORST SHAPE A DEFECT CAN TAKE, as the `input/default-bindings` header says: the two actions fire
70
+ * together, and the child sees an intermittent double action nobody can reproduce on purpose — on a screen they
71
+ * opened **because** they could not use the default controls.
72
+ *
73
+ * Returns the ACTION and not a boolean, because the announcement has to say which one — saying only that the key is
74
+ * in use sends the child looking for what the function already knows.
75
+ */
76
+ export function actionAlreadyBound(code, mapRef, except) {
77
+ for (const a of ACTIONS) {
78
+ if (a === except)
79
+ continue;
80
+ if ((mapRef[a] || []).includes(code))
81
+ return a;
82
+ }
83
+ return null;
84
+ }
@@ -1,67 +1,83 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import type { JuiceFlags } from '../render/fx.js';
3
2
  type Tune = Record<string, number>;
4
3
  type Anim = Record<string, number>;
5
- type Juice = JuiceFlags;
4
+ type Juice = {
5
+ dust: boolean;
6
+ sparkle: boolean;
7
+ squash: boolean;
8
+ hitstop: boolean;
9
+ shake: boolean;
10
+ shimmer: boolean;
11
+ };
6
12
  /**
7
- * UMA FOTO DO PERSONAGEM num quadro — DADOS, e nenhum objeto do PixiJS.
13
+ * A SNAPSHOT OF THE CHARACTER in one frame — DATA, and no PixiJS object.
8
14
  *
9
- * A raiz de composição, que é o único lugar onde o PixiJS já é conhecido, tira a foto e entrega strings. É a
10
- * mesma escolha de `RenderizarEm` e `CriarSprite` em render/port: pedir o VERBO cabe onde emprestar o objeto
11
- * não cabe — e aqui ela paga duas vezes, porque mantém `ui/debug-panel` testável no project `node`.
15
+ * The composition root, the only place where PixiJS is known, takes the snapshot and hands over strings. It is the
16
+ * same choice as `RenderInto` and `CreateSprite` in render/port: asking for the VERB fits where lending the object does
17
+ * not — and here it pays twice, because it keeps `ui/debug-panel` testable in the `node` project.
12
18
  */
13
- export interface AmostraDoPersonagem {
14
- /** Identidade da textura DENTRO desta gravação. Não é geometria: os quatro quadros de idle têm a mesma. */
15
- texturaId: number;
16
- /** O recorte, "x,y LxA". */
17
- recorte: string;
18
- /** A base da textura, "LxA". */
19
+ export interface CharacterSample {
20
+ /** Identity of the texture WITHIN this recording. Not geometry: the four idle frames share it. */
21
+ textureId: number;
22
+ /** The crop, "x,y WxH". */
23
+ crop: string;
24
+ /** The texture base, "WxH". */
19
25
  base: string;
20
- /** A posição do sprite, "x,y". */
21
- posicao: string;
22
- /** A escala, "x,y" — o squash & stretch mexe nela. */
23
- escala: string;
24
- /** Quantos IRMÃOS da câmera estavam desenhando alguma textura do personagem neste quadro. */
25
- irmaosDesenhando: number;
26
- /** Onde eles estavam, para o caso de haver algum. */
27
- posIrmaos: string;
26
+ /** The sprite position, "x,y". */
27
+ position: string;
28
+ /** The scale, "x,y" — squash & stretch moves it. */
29
+ scale: string;
30
+ /** How many camera SIBLINGS were drawing a texture of the character in this frame. */
31
+ siblingsDrawing: number;
32
+ /** Where they were, in case there is one. */
33
+ siblingPositions: string;
28
34
  }
29
- /** O que a sonda responde. Três perguntas, porque são elas que separam as causas que sobraram. */
30
- export interface ResumoDaSonda {
31
- quadros: number;
32
- texturas: number;
33
- maxIrmaos: number;
34
- exemploIrmaos: string;
35
- /** As texturas cujo recorte é grande demais para um quadro de personagem — sangramento de atlas. */
35
+ /** What the probe answers. Three questions, because they are what separates the remaining causes. */
36
+ export interface ProbeSummary {
37
+ frames: number;
38
+ textures: number;
39
+ maxSiblings: number;
40
+ siblingExample: string;
41
+ /** The textures whose crop is too large for a character frame — atlas bleeding. */
36
42
  sangramento: string[];
37
- escalas: string[];
38
- veredito: string;
43
+ scales: string[];
44
+ verdict: string;
39
45
  }
40
46
  /**
41
- * Reduz a gravação a três perguntas e um veredito.
47
+ * Reduces the recording to three questions and a verdict.
42
48
  *
43
- * A ORDEM DO VEREDITO É A DECISÃO: irmão desenhando vence sangramento, porque é ele que produz cópias
44
- * INTEIRAS em posições diferentes — que é exatamente o que foi relatado. E quando as três perguntas vêm
45
- * limpas o veredito NÃO diz "está tudo bem": ele diz ONDE procurar em seguida. Ausência de prova nas três
46
- * não é prova de ausência, e encerrar a busca aqui a encerraria no lugar errado.
49
+ * THE ORDER OF THE VERDICT IS THE DECISION: a sibling drawing beats bleeding, because it is what produces WHOLE copies
50
+ * at different positions. And when the three questions come back clean the verdict does NOT say "all is well": it says
51
+ * WHERE to look next. Absence of evidence in the three is not evidence of absence, and ending the search here would end
52
+ * it in the wrong place.
47
53
  */
48
- export declare function resumirSonda(amostras: readonly AmostraDoPersonagem[]): ResumoDaSonda;
54
+ export declare function summariseProbe(samples: readonly CharacterSample[]): ProbeSummary;
49
55
  export interface DebugPanelCtx {
50
56
  TUNE: Tune;
51
57
  ANIM: Anim;
52
58
  JUICE: Juice;
53
59
  saveJuice: () => void;
54
60
  /**
55
- * Uma foto do personagem AGORA, ou `null` se ainda não há personagem na cena.
61
+ * A snapshot of the character NOW, or `null` if there is no character in the scene yet.
56
62
  *
57
- * OPCIONAL: um hospedeiro sem personagem (o quiz) não a fornece, e a sonda simplesmente não aparece. O
58
- * painel continua sem conhecer o PixiJS.
63
+ * OPTIONAL: a host with no character (the quiz) does not provide it, and the probe simply does not appear. The
64
+ * panel still does not know PixiJS.
59
65
  */
60
- amostrarPersonagem?: () => AmostraDoPersonagem | null;
61
- /** Chama `fn` a cada quadro e devolve como cancelar. É o relógio do render, injetado como verbo. */
62
- aoQuadro?: (fn: () => void) => () => void;
63
- /** Override for tests; defaults to location.search. */
64
- search?: string;
66
+ sampleCharacter?: () => CharacterSample | null;
67
+ /** Calls `fn` every frame and returns how to cancel. It is the render clock, injected as a verb. */
68
+ onFrame?: (fn: () => void) => () => void;
69
+ /**
70
+ * The page's query string (`location.search`): the panel exists only under `?debug=true`. REQUIRED (ADR-0232 D4): the
71
+ * host reads its own location, and this module reaches none.
72
+ */
73
+ search: string;
74
+ /** The document the panel is built in and appended to (its `body`). REQUIRED (ADR-0232 D4): never the global one. */
75
+ doc: Document;
76
+ /**
77
+ * Where the probe's RAW recording goes, for whoever wants more than the summary without 180 lines in the panel — the
78
+ * platformer puts it on `window.__sonda`. REQUIRED (ADR-0232 D4): the module used to write that global itself.
79
+ */
80
+ expose: (samples: readonly CharacterSample[]) => void;
65
81
  }
66
82
  export declare function initDebugPanel(ctx: DebugPanelCtx): HTMLElement | null;
67
83
  export {};
@@ -1,43 +1,42 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  // ui/debug-panel — the ?debug=true live-tuning panel (physics/animation sliders + juice toggles). Leaf UI module.
3
3
  // Built via closure DI: receives the LIVE TUNE/ANIM/JUICE objects (mutated in place) + saveJuice from the composition
4
- // root, so the sliders/checkboxes tune the same state the game reads. Extracted from game.js (modularization Tier 1).
4
+ // root, so the sliders/checkboxes tune the same state the game reads.
5
5
  // Returns the panel element (or null when not in ?debug=true) — testable without booting the game.
6
- /** Um recorte maior que isto não é um quadro de personagem: é um pedaço do atlas. O maior real tem 31x35. */
7
- const MAIOR_QUADRO = 64;
6
+ /** A crop larger than this is not a character frame: it is a piece of the atlas. The largest real one is 31x35. */
7
+ const MAX_CHARACTER_FRAME_SIDE = 64;
8
8
  /**
9
- * Reduz a gravação a três perguntas e um veredito.
9
+ * Reduces the recording to three questions and a verdict.
10
10
  *
11
- * A ORDEM DO VEREDITO É A DECISÃO: irmão desenhando vence sangramento, porque é ele que produz cópias
12
- * INTEIRAS em posições diferentes — que é exatamente o que foi relatado. E quando as três perguntas vêm
13
- * limpas o veredito NÃO diz "está tudo bem": ele diz ONDE procurar em seguida. Ausência de prova nas três
14
- * não é prova de ausência, e encerrar a busca aqui a encerraria no lugar errado.
11
+ * THE ORDER OF THE VERDICT IS THE DECISION: a sibling drawing beats bleeding, because it is what produces WHOLE copies
12
+ * at different positions. And when the three questions come back clean the verdict does NOT say "all is well": it says
13
+ * WHERE to look next. Absence of evidence in the three is not evidence of absence, and ending the search here would end
14
+ * it in the wrong place.
15
15
  */
16
- export function resumirSonda(amostras) {
17
- if (!amostras.length) {
18
- return { quadros: 0, texturas: 0, maxIrmaos: 0, exemploIrmaos: '', sangramento: [], escalas: [], veredito: 'não gravou nada — o personagem existia?' };
16
+ export function summariseProbe(samples) {
17
+ if (!samples.length) {
18
+ return { frames: 0, textures: 0, maxSiblings: 0, siblingExample: '', sangramento: [], scales: [], verdict: 'não gravou nada — o personagem existia?' };
19
19
  }
20
- const texturas = new Set(amostras.map((a) => a.texturaId)).size;
21
- const comIrmaos = amostras.filter((a) => a.irmaosDesenhando > 0);
22
- const maxIrmaos = comIrmaos.reduce((m, a) => Math.max(m, a.irmaosDesenhando), 0);
23
- const grande = (r) => {
20
+ const textureCount = new Set(samples.map((a) => a.textureId)).size;
21
+ const withSiblings = samples.filter((a) => a.siblingsDrawing > 0);
22
+ const mostSiblings = withSiblings.reduce((m, a) => Math.max(m, a.siblingsDrawing), 0);
23
+ const isAtlasPiece = (r) => {
24
24
  const m = /(\d+)x(\d+)$/.exec(r);
25
- return !!m && (+m[1] > MAIOR_QUADRO || +m[2] > MAIOR_QUADRO);
25
+ return !!m && (+m[1] > MAX_CHARACTER_FRAME_SIDE || +m[2] > MAX_CHARACTER_FRAME_SIDE);
26
26
  };
27
- const sangramento = [...new Set(amostras.filter((a) => grande(a.recorte)).map((a) => a.recorte + ' (base ' + a.base + ')'))];
28
- const escalas = [...new Set(amostras.map((a) => a.escala))].sort();
29
- const veredito = maxIrmaos > 0
30
- ? 'ALGUÉM DESENHA DUAS VEZES: até ' + maxIrmaos + ' irmão(s) da câmera com a textura do personagem'
27
+ const sangramento = [...new Set(samples.filter((a) => isAtlasPiece(a.crop)).map((a) => a.crop + ' (base ' + a.base + ')'))];
28
+ const distinctScales = [...new Set(samples.map((a) => a.scale))].sort();
29
+ const finding = mostSiblings > 0
30
+ ? 'ALGUÉM DESENHA DUAS VEZES: até ' + mostSiblings + ' irmão(s) da câmera com a textura do personagem'
31
31
  : sangramento.length
32
32
  ? 'RECORTE GRANDE DEMAIS: o quadro está pegando pedaço do atlas'
33
33
  : 'sprite limpo (uma textura por quadro, sem irmão, recorte de quadro) — procure em composição: filtro, pós-efeito ou câmera';
34
- return { quadros: amostras.length, texturas, maxIrmaos, exemploIrmaos: comIrmaos.length ? comIrmaos[0].posIrmaos : '', sangramento, escalas, veredito };
34
+ return { frames: samples.length, textures: textureCount, maxSiblings: mostSiblings, siblingExample: withSiblings.length ? withSiblings[0].siblingPositions : '', sangramento, scales: distinctScales, verdict: finding };
35
35
  }
36
36
  export function initDebugPanel(ctx) {
37
- const search = ctx.search ?? location.search;
38
- if (!/[?&]debug=true/.test(search))
37
+ if (!/[?&]debug=true/.test(ctx.search))
39
38
  return null;
40
- const { TUNE, ANIM, JUICE, saveJuice } = ctx;
39
+ const { TUNE, ANIM, JUICE, saveJuice, doc } = ctx;
41
40
  const KNOBS = [
42
41
  { h: 'Movimento (valores absolutos)' },
43
42
  { label: 'Velocidade de andar', get: () => TUNE.hWalk, set: (v) => (TUNE.hWalk = v), min: 0.5, max: 5, step: 0.1 },
@@ -55,10 +54,10 @@ export function initDebugPanel(ctx) {
55
54
  { label: 'Queda máxima', get: () => TUNE.maxFall, set: (v) => (TUNE.maxFall = v), min: 3, max: 14, step: 0.5 },
56
55
  { label: 'Queda máxima na água', get: () => TUNE.waterMaxFall, set: (v) => (TUNE.waterMaxFall = v), min: 1, max: 8, step: 0.5 },
57
56
  { h: 'Animação (cadência: ticks/quadro)' },
58
- { label: 'Andar', get: () => ANIM.walkHold, set: (v) => (ANIM.walkHold = v), min: 1, max: 20, step: 1, cad: true },
59
- { label: 'Correr', get: () => ANIM.runHold, set: (v) => (ANIM.runHold = v), min: 1, max: 20, step: 1, cad: true },
60
- { label: 'Parado (idle)', get: () => ANIM.idleHold, set: (v) => (ANIM.idleHold = v), min: 2, max: 40, step: 1, cad: true },
61
- { label: 'Nado', get: () => ANIM.swimHold, set: (v) => (ANIM.swimHold = v), min: 2, max: 24, step: 1, cad: true },
57
+ { label: 'Andar', get: () => ANIM.walkHold, set: (v) => (ANIM.walkHold = v), min: 1, max: 20, step: 1, cadence: true },
58
+ { label: 'Correr', get: () => ANIM.runHold, set: (v) => (ANIM.runHold = v), min: 1, max: 20, step: 1, cadence: true },
59
+ { label: 'Parado (idle)', get: () => ANIM.idleHold, set: (v) => (ANIM.idleHold = v), min: 2, max: 40, step: 1, cadence: true },
60
+ { label: 'Nado', get: () => ANIM.swimHold, set: (v) => (ANIM.swimHold = v), min: 2, max: 24, step: 1, cadence: true },
62
61
  { h: 'Juice (efeitos de resposta) — toggles independentes' },
63
62
  { label: '💨 Poeira (pulo/pouso/corrida)', chk: () => JUICE.dust, set: (v) => { JUICE.dust = v; saveJuice(); } },
64
63
  { label: '✨ Brilho ao coletar', chk: () => JUICE.sparkle, set: (v) => { JUICE.sparkle = v; saveJuice(); } },
@@ -66,44 +65,44 @@ export function initDebugPanel(ctx) {
66
65
  { label: '⏱️ Hit-stop (impacto)', chk: () => JUICE.hitstop, set: (v) => { JUICE.hitstop = v; saveJuice(); } },
67
66
  { label: '📳 Tremor de tela', chk: () => JUICE.shake, set: (v) => { JUICE.shake = v; saveJuice(); } },
68
67
  { label: '🌟 Cintilar dos itens', chk: () => JUICE.shimmer, set: (v) => { JUICE.shimmer = v; saveJuice(); } },
69
- ]; // Estética CRT saiu daqui: mora no menu Sensibilidade visual (pedido do José).
70
- const p = document.createElement('div');
68
+ ]; // The CRT look is not here: it lives in the visual sensitivity panel (the Dev's request).
69
+ const p = doc.createElement('div');
71
70
  p.id = 'debug-panel';
72
- p.hidden = true; // começa oculto; abre pelo botão 🐞 Debug
71
+ p.hidden = true; // starts hidden; opened by the 🐞 Debug button
73
72
  p.setAttribute('role', 'group');
74
73
  p.setAttribute('aria-label', 'Painel de depuração');
75
74
  p.style.cssText = 'position:fixed;top:8px;right:8px;z-index:200;background:rgba(11,16,32,.97);color:#fff;border:2px solid #ffd23f;border-radius:8px;padding:.6rem .7rem;font:13px/1.4 system-ui,sans-serif;max-width:270px;max-height:86vh;overflow:auto;box-shadow:0 4px 16px rgba(0,0,0,.5)';
76
75
  p.innerHTML = '<strong>🔧 ?debug — valores ao vivo</strong>';
77
76
  for (const k of KNOBS) {
78
77
  if ('h' in k) {
79
- const h = document.createElement('div');
78
+ const h = doc.createElement('div');
80
79
  h.textContent = k.h;
81
80
  h.style.cssText = 'margin:.7rem 0 .1rem;font-weight:700;color:#ffd23f;border-bottom:1px solid rgba(255,210,63,.4)';
82
81
  p.appendChild(h);
83
82
  continue;
84
83
  }
85
84
  if ('chk' in k) {
86
- const row = document.createElement('label');
85
+ const row = doc.createElement('label');
87
86
  row.style.cssText = 'display:flex;gap:.4rem;align-items:center;margin-top:.4rem;font-size:12px;cursor:pointer';
88
- const inp = document.createElement('input');
87
+ const inp = doc.createElement('input');
89
88
  inp.type = 'checkbox';
90
89
  inp.checked = k.chk();
91
90
  inp.addEventListener('change', () => k.set(inp.checked));
92
91
  row.appendChild(inp);
93
- row.appendChild(document.createTextNode(k.label));
92
+ row.appendChild(doc.createTextNode(k.label));
94
93
  p.appendChild(row);
95
94
  continue;
96
95
  }
97
- const row = document.createElement('div');
96
+ const row = doc.createElement('div');
98
97
  row.style.cssText = 'margin-top:.5rem';
99
- const lab = document.createElement('label');
98
+ const lab = doc.createElement('label');
100
99
  lab.style.cssText = 'display:block;font-size:12px;margin-bottom:2px';
101
- const val = document.createElement('strong');
100
+ const val = doc.createElement('strong');
102
101
  val.style.cssText = 'color:#ffd23f;float:right';
103
- const upd = () => { val.textContent = k.cad ? `${k.get()} (${Math.round(60 / k.get())}fps)` : String(k.get()); };
102
+ const upd = () => { val.textContent = k.cadence ? `${k.get()} (${Math.round(60 / k.get())}fps)` : String(k.get()); };
104
103
  lab.textContent = k.label;
105
104
  lab.appendChild(val);
106
- const inp = document.createElement('input');
105
+ const inp = doc.createElement('input');
107
106
  inp.type = 'range';
108
107
  inp.min = String(k.min);
109
108
  inp.max = String(k.max);
@@ -117,23 +116,23 @@ export function initDebugPanel(ctx) {
117
116
  p.appendChild(row);
118
117
  upd();
119
118
  }
120
- /* ===================== A SONDA DO PERSONAGEM =====================
121
- Ela mora AQUI, e não num script para colar no console, porque foi o que o Dev pediu — e ele tem razão
122
- pelo motivo de sempre: um instrumento que só existe enquanto alguém lembra de colar não é instrumento, é
123
- lembrança. Aqui ele fica ao lado dos outros valores ao vivo, atrás do mesmo `?debug=true`.
119
+ /* ===================== THE CHARACTER PROBE =====================
120
+ It lives HERE, and not in a script to paste into the console, because that is what the Dev asked for — an
121
+ instrument that exists only while someone remembers to paste it is not an instrument, it is a memory. Here it
122
+ sits beside the other live values, behind the same `?debug=true`.
124
123
 
125
- Só aparece se o hospedeiro souber tirar a foto: um jogo sem personagem não ganha um botão que não faz
126
- nada. */
127
- if (ctx.amostrarPersonagem && ctx.aoQuadro) {
128
- const amostrar = ctx.amostrarPersonagem, aoQuadro = ctx.aoQuadro;
129
- const h = document.createElement('div');
124
+ It only appears if the host can take the snapshot: a game with no character does not get a button that does
125
+ nothing. */
126
+ if (ctx.sampleCharacter && ctx.onFrame) {
127
+ const sampleCharacter = ctx.sampleCharacter, everyFrame = ctx.onFrame;
128
+ const h = doc.createElement('div');
130
129
  h.textContent = 'Sonda do personagem';
131
130
  h.style.cssText = 'margin:.7rem 0 .1rem;font-weight:700;color:#ffd23f;border-bottom:1px solid rgba(255,210,63,.4)';
132
131
  p.appendChild(h);
133
- const saida = document.createElement('pre');
134
- saida.style.cssText = 'margin:.4rem 0 0;font:11px/1.35 ui-monospace,monospace;white-space:pre-wrap;color:#cfe';
135
- saida.setAttribute('aria-live', 'polite');
136
- const btn = document.createElement('button');
132
+ const migrated = doc.createElement('pre');
133
+ migrated.style.cssText = 'margin:.4rem 0 0;font:11px/1.35 ui-monospace,monospace;white-space:pre-wrap;color:#cfe';
134
+ migrated.setAttribute('aria-live', 'polite');
135
+ const btn = doc.createElement('button');
137
136
  btn.type = 'button';
138
137
  btn.textContent = '🥷 Gravar 180 quadros';
139
138
  btn.style.cssText = 'margin-top:.4rem;width:100%;min-height:32px;font:inherit;font-weight:700;cursor:pointer;border-radius:6px;border:1px solid #ffd23f;background:#1a2740;color:#fff';
@@ -141,33 +140,33 @@ export function initDebugPanel(ctx) {
141
140
  if (btn.disabled)
142
141
  return;
143
142
  btn.disabled = true;
144
- const amostras = [];
143
+ const samples = [];
145
144
  let n = 0;
146
- saida.textContent = 'gravando… PULE agora';
147
- const parar = aoQuadro(() => {
148
- const a = amostrar();
145
+ migrated.textContent = 'gravando… PULE agora';
146
+ const stopSampling = everyFrame(() => {
147
+ const a = sampleCharacter();
149
148
  if (a)
150
- amostras.push(a);
149
+ samples.push(a);
151
150
  if (++n < 180)
152
151
  return;
153
- parar();
152
+ stopSampling();
154
153
  btn.disabled = false;
155
- const r = resumirSonda(amostras);
156
- saida.textContent = [
157
- 'quadros: ' + r.quadros + ' texturas: ' + r.texturas,
158
- 'irmãos desenhando: ' + r.maxIrmaos + (r.exemploIrmaos ? ' em ' + r.exemploIrmaos : ''),
154
+ const r = summariseProbe(samples);
155
+ migrated.textContent = [
156
+ 'quadros: ' + r.frames + ' texturas: ' + r.textures,
157
+ 'irmãos desenhando: ' + r.maxSiblings + (r.siblingExample ? ' em ' + r.siblingExample : ''),
159
158
  'recorte grande: ' + (r.sangramento.length ? r.sangramento.join(' ') : 'nenhum'),
160
- 'escalas: ' + r.escalas.join(' '),
159
+ 'escalas: ' + r.scales.join(' '),
161
160
  '',
162
- '→ ' + r.veredito,
161
+ '→ ' + r.verdict,
163
162
  ].join(String.fromCharCode(10));
164
- // O BRUTO fica alcançável para quem quiser ir além do resumo — sem poluir o painel com 180 linhas.
165
- window.__sonda = amostras;
163
+ // The RAW recording stays reachable for whoever wants more than the summary — without filling the panel with 180 lines.
164
+ ctx.expose(samples);
166
165
  });
167
166
  });
168
167
  p.appendChild(btn);
169
- p.appendChild(saida);
168
+ p.appendChild(migrated);
170
169
  }
171
- document.body.appendChild(p);
170
+ doc.body.appendChild(p);
172
171
  return p;
173
172
  }
@@ -0,0 +1,21 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import type { ActionPreset } from '../core/actions.js';
3
+ import type { AccommodationAnswers } from '../core/accommodations.js';
4
+ import type { GameOption } from './game-options.js';
5
+ import type { HowToPlaySlide } from './help-panel.js';
6
+ import type { HudNumber } from './hud-bands.js';
7
+ /** The game's fields that carry declared words — a `Pick` of `CreateGameOptions`, written here so `ui` does not import `boot`. */
8
+ interface DeclaredWords {
9
+ readonly preset?: ActionPreset;
10
+ readonly accommodations?: AccommodationAnswers;
11
+ readonly gameOptions?: readonly GameOption[];
12
+ readonly howToPlay?: readonly HowToPlaySlide[];
13
+ readonly hud?: readonly HudNumber[];
14
+ }
15
+ /**
16
+ * THE DECLARED KEYS THIS GAME'S DICTIONARIES LACK, one line each for `problems` (ADR-0169). `declares` is the root's
17
+ * translator's (`Translator.declares`): a key in ANY language counts as present, because a key given in one language and not
18
+ * another is already a line of its own (`Translator.dictionaryGaps`).
19
+ */
20
+ export declare function missingDeclaredKeys(declared: DeclaredWords, declares: (key: string) => boolean): string[];
21
+ export {};
@@ -0,0 +1,66 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ const ACTION_NAME = 'the child sees this button unnamed: the help, the remap screen, the pad and the scan leave it out';
3
+ const ACTION_SHORT = 'the pad shows the long name squeezed under the glyph';
4
+ const ACTION_HINT = 'the help shows this button without its sentence';
5
+ const ACCOMMODATION_NAME = 'this accommodation has its row left out, and the child who needs it cannot reach it';
6
+ const ACCOMMODATION_SHORT = 'where only a short name fits, the long one is squeezed';
7
+ const ACCOMMODATION_HINT = 'the row explains itself in the engine\'s general words, or not at all';
8
+ const OPTION_NAME = 'this option has its row left out, and the child cannot change it';
9
+ const OPTION_HINT = 'the row shows without its explanation';
10
+ const SLIDE_TEXT = 'this slide is left out of the help';
11
+ const HUD_NAME = 'this number is hidden from the child';
12
+ function presetKeys(preset) {
13
+ if (!preset)
14
+ return [];
15
+ return Object.entries(preset).flatMap(([action, keys]) => (keys ? [
16
+ { subject: `preset.${action}.labelKey`, key: keys.labelKey, cost: ACTION_NAME, optional: false },
17
+ { subject: `preset.${action}.shortKey`, key: keys.shortKey, cost: ACTION_SHORT, optional: true },
18
+ { subject: `preset.${action}.hintKey`, key: keys.hintKey, cost: ACTION_HINT, optional: true },
19
+ ] : []));
20
+ }
21
+ function accommodationKeys(answers) {
22
+ if (!answers)
23
+ return [];
24
+ return Object.entries(answers).flatMap(([accommodation, keys]) => (keys ? [
25
+ { subject: `accommodations.${accommodation}.labelKey`, key: keys.labelKey, cost: ACCOMMODATION_NAME, optional: false },
26
+ { subject: `accommodations.${accommodation}.shortKey`, key: keys.shortKey, cost: ACCOMMODATION_SHORT, optional: true },
27
+ { subject: `accommodations.${accommodation}.hintKey`, key: keys.hintKey, cost: ACCOMMODATION_HINT, optional: true },
28
+ ] : []));
29
+ }
30
+ function optionKeys(options) {
31
+ return (options ?? []).flatMap((o) => [
32
+ { subject: `gameOptions «${o.id}».labelKey`, key: o.labelKey, cost: OPTION_NAME, optional: false },
33
+ { subject: `gameOptions «${o.id}».hintKey`, key: o.hintKey, cost: OPTION_HINT, optional: true },
34
+ ...(o.kind === 'switch' ? [] : o.values.map((v) => ({ subject: `gameOptions «${o.id}».values «${v.value}».labelKey`, key: v.labelKey, cost: OPTION_NAME, optional: false }))),
35
+ ]);
36
+ }
37
+ function slideKeys(slides) {
38
+ return (slides ?? []).map((s, i) => ({ subject: `howToPlay[${i}].textKey`, key: s.textKey, cost: SLIDE_TEXT, optional: false }));
39
+ }
40
+ function hudKeys(numbers) {
41
+ return (numbers ?? []).map((n, i) => ({ subject: `hud[${i}].nameKey`, key: n.nameKey, cost: HUD_NAME, optional: false }));
42
+ }
43
+ /** What is wrong with ONE declared key, or `null`: it must be text, and it must be in the game's dictionaries. */
44
+ function keyProblem(k, declares) {
45
+ if (k.optional && k.key === undefined)
46
+ return null;
47
+ const fix = 'add it to CreateGameOptions.dictionaries, in pt, en and es';
48
+ if (typeof k.key !== 'string' || !k.key.trim()) {
49
+ return `${k.subject} is not a key (since ADR-0232 D3 a game declares the KEY of each word, never the word): ${k.cost} — name a key, and ${fix}`;
50
+ }
51
+ return declares(k.key) ? null : `${k.subject} «${k.key}» is in none of this game's dictionaries: ${k.cost} — ${fix}`;
52
+ }
53
+ /**
54
+ * THE DECLARED KEYS THIS GAME'S DICTIONARIES LACK, one line each for `problems` (ADR-0169). `declares` is the root's
55
+ * translator's (`Translator.declares`): a key in ANY language counts as present, because a key given in one language and not
56
+ * another is already a line of its own (`Translator.dictionaryGaps`).
57
+ */
58
+ export function missingDeclaredKeys(declared, declares) {
59
+ return [
60
+ ...presetKeys(declared.preset),
61
+ ...accommodationKeys(declared.accommodations),
62
+ ...optionKeys(declared.gameOptions),
63
+ ...slideKeys(declared.howToPlay),
64
+ ...hudKeys(declared.hud),
65
+ ].map((k) => keyProblem(k, declares)).filter((line) => line !== null);
66
+ }
@@ -1,6 +1,5 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- export declare const $: <T extends Element = HTMLElement>(s: string) => T | null;
3
- export declare const $$: <T extends Element = HTMLElement>(s: string) => T[];
2
+ import type { Translate } from '../core/i18n.js';
4
3
  /**
5
4
  * Reflects an on/off state onto a toggle button: the visual class AND `aria-pressed`.
6
5
  * Lives here because the two must never drift apart — a button that looks pressed but does not
@@ -8,17 +7,14 @@ export declare const $$: <T extends Element = HTMLElement>(s: string) => T[];
8
7
  */
9
8
  export declare function toggleBtn(b: Element | null, on: boolean): void;
10
9
  /**
11
- * O TEXTO do botão de alternância: '❚❚ Ligado' / '▶ Desligado'.
10
+ * The TEXT of a toggle button: 'On' / 'Off' in English.
12
11
  *
13
- * Mora aqui pelo mesmo motivo do `toggleBtn` logo acima — os dois são as duas metades do mesmo gesto, e a
14
- * nota daquela função diz que elas "não podem se separar". Elas tinham se separado em TREZE cópias, em nove
15
- * arquivos, e dois deles declaravam um helper que se chamava compartilhado e servia um chamador só
16
- * (`settings-empathy.toggleLabel` e `settings-motor.onOffLabel`, ambos apagados agora).
17
- *
18
- * O custo dessa dispersão não era estético: com o texto em treze lugares, traduzir o jogo exigiria achar os
19
- * treze, e esquecer um deixaria um botão em português no meio do inglês — sem erro, sem teste vermelho.
12
+ * It lives here for the same reason as `toggleBtn` just above — the two are halves of one gesture, and must not
13
+ * drift apart. A text copied into each panel is a text that translating the game has to find everywhere, and the
14
+ * one copy it misses leaves a button in the wrong language — with no error and no red test.
20
15
  */
21
- export declare function toggleLabel(on: boolean): string;
22
- /** O `aria-label` da mesma alternância: '{alvo}: ligado'. Separado do rótulo visível porque o leitor de tela
23
- * precisa do NOME do alvo junto, e a tela não (o nome já está na linha ao lado do botão). */
24
- export declare function toggleAria(alvo: string, on: boolean): string;
16
+ export declare function toggleLabel(t: Translate, on: boolean): string;
17
+ /** The `aria-label` of the same toggle: '{alvo}: on' (`{alvo}` is the dictionary's interpolation key). Separate from
18
+ * the visible label because a screen reader needs the NAME of the target with it, and the screen does not (the
19
+ * name is already on the row beside the button). */
20
+ export declare function toggleAria(t: Translate, target: string, on: boolean): string;