@the-inclusionist/engine 9.0.0 → 10.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 (756) hide show
  1. package/README.md +89 -78
  2. package/app/css/style.css +584 -374
  3. package/app/public/vendor/fonts/bitter-var-ext.woff2 +0 -0
  4. package/app/public/vendor/fonts/bitter-var.woff2 +0 -0
  5. package/app/public/vendor/fonts/bodonimoda-var-ext.woff2 +0 -0
  6. package/app/public/vendor/fonts/bodonimoda-var.woff2 +0 -0
  7. package/app/public/vendor/fonts/cat-abril_fatface-400-ext.woff2 +0 -0
  8. package/app/public/vendor/fonts/cat-abril_fatface-400.woff2 +0 -0
  9. package/app/public/vendor/fonts/cat-adlam_display-400-ext.woff2 +0 -0
  10. package/app/public/vendor/fonts/cat-adlam_display-400.woff2 +0 -0
  11. package/app/public/vendor/fonts/cat-agu_display-400-ext.woff2 +0 -0
  12. package/app/public/vendor/fonts/cat-agu_display-400.woff2 +0 -0
  13. package/app/public/vendor/fonts/cat-alfa_slab_one-400-ext.woff2 +0 -0
  14. package/app/public/vendor/fonts/cat-alfa_slab_one-400.woff2 +0 -0
  15. package/app/public/vendor/fonts/cat-are_you_serious-400-ext.woff2 +0 -0
  16. package/app/public/vendor/fonts/cat-are_you_serious-400.woff2 +0 -0
  17. package/app/public/vendor/fonts/cat-asimovian-400-ext.woff2 +0 -0
  18. package/app/public/vendor/fonts/cat-asimovian-400.woff2 +0 -0
  19. package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400-ext.woff2 +0 -0
  20. package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400.woff2 +0 -0
  21. package/app/public/vendor/fonts/cat-bakbak_one-400-ext.woff2 +0 -0
  22. package/app/public/vendor/fonts/cat-bakbak_one-400.woff2 +0 -0
  23. package/app/public/vendor/fonts/cat-bangers-400-ext.woff2 +0 -0
  24. package/app/public/vendor/fonts/cat-bangers-400.woff2 +0 -0
  25. package/app/public/vendor/fonts/cat-barriecito-400-ext.woff2 +0 -0
  26. package/app/public/vendor/fonts/cat-barriecito-400.woff2 +0 -0
  27. package/app/public/vendor/fonts/cat-berkshire_swash-400-ext.woff2 +0 -0
  28. package/app/public/vendor/fonts/cat-berkshire_swash-400.woff2 +0 -0
  29. package/app/public/vendor/fonts/cat-bevan-400-ext.woff2 +0 -0
  30. package/app/public/vendor/fonts/cat-bevan-400.woff2 +0 -0
  31. package/app/public/vendor/fonts/cat-bitcount-400-ext.woff2 +0 -0
  32. package/app/public/vendor/fonts/cat-bitcount-400.woff2 +0 -0
  33. package/app/public/vendor/fonts/cat-bowlby_one_sc-400-ext.woff2 +0 -0
  34. package/app/public/vendor/fonts/cat-bowlby_one_sc-400.woff2 +0 -0
  35. package/app/public/vendor/fonts/cat-bungee_shade-400-ext.woff2 +0 -0
  36. package/app/public/vendor/fonts/cat-bungee_shade-400.woff2 +0 -0
  37. package/app/public/vendor/fonts/cat-charm-400-ext.woff2 +0 -0
  38. package/app/public/vendor/fonts/cat-charm-400.woff2 +0 -0
  39. package/app/public/vendor/fonts/cat-charm-700-ext.woff2 +0 -0
  40. package/app/public/vendor/fonts/cat-charm-700.woff2 +0 -0
  41. package/app/public/vendor/fonts/cat-cherry_bomb_one-400-ext.woff2 +0 -0
  42. package/app/public/vendor/fonts/cat-cherry_bomb_one-400.woff2 +0 -0
  43. package/app/public/vendor/fonts/cat-chokokutai-400-ext.woff2 +0 -0
  44. package/app/public/vendor/fonts/cat-chokokutai-400.woff2 +0 -0
  45. package/app/public/vendor/fonts/cat-chonburi-400-ext.woff2 +0 -0
  46. package/app/public/vendor/fonts/cat-chonburi-400.woff2 +0 -0
  47. package/app/public/vendor/fonts/cat-climate_crisis-400-ext.woff2 +0 -0
  48. package/app/public/vendor/fonts/cat-climate_crisis-400.woff2 +0 -0
  49. package/app/public/vendor/fonts/cat-cookie-400.woff2 +0 -0
  50. package/app/public/vendor/fonts/cat-dela_gothic_one-400-ext.woff2 +0 -0
  51. package/app/public/vendor/fonts/cat-dela_gothic_one-400.woff2 +0 -0
  52. package/app/public/vendor/fonts/cat-fascinate_inline-400-ext.woff2 +0 -0
  53. package/app/public/vendor/fonts/cat-fascinate_inline-400.woff2 +0 -0
  54. package/app/public/vendor/fonts/cat-ga_maamli-400-ext.woff2 +0 -0
  55. package/app/public/vendor/fonts/cat-ga_maamli-400.woff2 +0 -0
  56. package/app/public/vendor/fonts/cat-itim-400-ext.woff2 +0 -0
  57. package/app/public/vendor/fonts/cat-itim-400.woff2 +0 -0
  58. package/app/public/vendor/fonts/cat-jacquard_24-400-ext.woff2 +0 -0
  59. package/app/public/vendor/fonts/cat-jacquard_24-400.woff2 +0 -0
  60. package/app/public/vendor/fonts/cat-kablammo-400-ext.woff2 +0 -0
  61. package/app/public/vendor/fonts/cat-kablammo-400.woff2 +0 -0
  62. package/app/public/vendor/fonts/cat-kalam-400-ext.woff2 +0 -0
  63. package/app/public/vendor/fonts/cat-kalam-400.woff2 +0 -0
  64. package/app/public/vendor/fonts/cat-kalam-700-ext.woff2 +0 -0
  65. package/app/public/vendor/fonts/cat-kalam-700.woff2 +0 -0
  66. package/app/public/vendor/fonts/cat-katibeh-400-ext.woff2 +0 -0
  67. package/app/public/vendor/fonts/cat-katibeh-400.woff2 +0 -0
  68. package/app/public/vendor/fonts/cat-lemonada-400-ext.woff2 +0 -0
  69. package/app/public/vendor/fonts/cat-lemonada-400.woff2 +0 -0
  70. package/app/public/vendor/fonts/cat-lilita_one-400-ext.woff2 +0 -0
  71. package/app/public/vendor/fonts/cat-lilita_one-400.woff2 +0 -0
  72. package/app/public/vendor/fonts/cat-lobster-400-ext.woff2 +0 -0
  73. package/app/public/vendor/fonts/cat-lobster-400.woff2 +0 -0
  74. package/app/public/vendor/fonts/cat-luckiest_guy-400-ext.woff2 +0 -0
  75. package/app/public/vendor/fonts/cat-luckiest_guy-400.woff2 +0 -0
  76. package/app/public/vendor/fonts/cat-marhey-400-ext.woff2 +0 -0
  77. package/app/public/vendor/fonts/cat-marhey-400.woff2 +0 -0
  78. package/app/public/vendor/fonts/cat-modak-400-ext.woff2 +0 -0
  79. package/app/public/vendor/fonts/cat-modak-400.woff2 +0 -0
  80. package/app/public/vendor/fonts/cat-momo_signature-400-ext.woff2 +0 -0
  81. package/app/public/vendor/fonts/cat-momo_signature-400.woff2 +0 -0
  82. package/app/public/vendor/fonts/cat-monofett-400-ext.woff2 +0 -0
  83. package/app/public/vendor/fonts/cat-monofett-400.woff2 +0 -0
  84. package/app/public/vendor/fonts/cat-monomakh-400-ext.woff2 +0 -0
  85. package/app/public/vendor/fonts/cat-monomakh-400.woff2 +0 -0
  86. package/app/public/vendor/fonts/cat-monoton-400-ext.woff2 +0 -0
  87. package/app/public/vendor/fonts/cat-monoton-400.woff2 +0 -0
  88. package/app/public/vendor/fonts/cat-nerko_one-400-ext.woff2 +0 -0
  89. package/app/public/vendor/fonts/cat-nerko_one-400.woff2 +0 -0
  90. package/app/public/vendor/fonts/cat-noto_sans_adlam-400-ext.woff2 +0 -0
  91. package/app/public/vendor/fonts/cat-noto_sans_adlam-400.woff2 +0 -0
  92. package/app/public/vendor/fonts/cat-noto_sans_arabic-400-ext.woff2 +0 -0
  93. package/app/public/vendor/fonts/cat-noto_sans_arabic-400.woff2 +0 -0
  94. package/app/public/vendor/fonts/cat-noto_sans_devanagari-400-ext.woff2 +0 -0
  95. package/app/public/vendor/fonts/cat-noto_sans_devanagari-400.woff2 +0 -0
  96. package/app/public/vendor/fonts/cat-noto_sans_hebrew-400-ext.woff2 +0 -0
  97. package/app/public/vendor/fonts/cat-noto_sans_hebrew-400.woff2 +0 -0
  98. package/app/public/vendor/fonts/cat-noto_sans_jp-400-ext.woff2 +0 -0
  99. package/app/public/vendor/fonts/cat-noto_sans_jp-400.woff2 +0 -0
  100. package/app/public/vendor/fonts/cat-noto_sans_khmer-400-ext.woff2 +0 -0
  101. package/app/public/vendor/fonts/cat-noto_sans_khmer-400.woff2 +0 -0
  102. package/app/public/vendor/fonts/cat-noto_sans_kr-400-ext.woff2 +0 -0
  103. package/app/public/vendor/fonts/cat-noto_sans_kr-400.woff2 +0 -0
  104. package/app/public/vendor/fonts/cat-noto_sans_sc-400-ext.woff2 +0 -0
  105. package/app/public/vendor/fonts/cat-noto_sans_sc-400.woff2 +0 -0
  106. package/app/public/vendor/fonts/cat-noto_sans_thai-400-ext.woff2 +0 -0
  107. package/app/public/vendor/fonts/cat-noto_sans_thai-400.woff2 +0 -0
  108. package/app/public/vendor/fonts/cat-ole-400-ext.woff2 +0 -0
  109. package/app/public/vendor/fonts/cat-ole-400.woff2 +0 -0
  110. package/app/public/vendor/fonts/cat-pacifico-400-ext.woff2 +0 -0
  111. package/app/public/vendor/fonts/cat-pacifico-400.woff2 +0 -0
  112. package/app/public/vendor/fonts/cat-patrick_hand-400-ext.woff2 +0 -0
  113. package/app/public/vendor/fonts/cat-patrick_hand-400.woff2 +0 -0
  114. package/app/public/vendor/fonts/cat-petit_formal_script-400-ext.woff2 +0 -0
  115. package/app/public/vendor/fonts/cat-petit_formal_script-400.woff2 +0 -0
  116. package/app/public/vendor/fonts/cat-pixelify_sans-400-ext.woff2 +0 -0
  117. package/app/public/vendor/fonts/cat-pixelify_sans-400.woff2 +0 -0
  118. package/app/public/vendor/fonts/cat-plaster-400-ext.woff2 +0 -0
  119. package/app/public/vendor/fonts/cat-plaster-400.woff2 +0 -0
  120. package/app/public/vendor/fonts/cat-playwrite_ar_guides-400-0.woff2 +0 -0
  121. package/app/public/vendor/fonts/cat-playwrite_at-400-0.woff2 +0 -0
  122. package/app/public/vendor/fonts/cat-playwrite_at_guides-400-0.woff2 +0 -0
  123. package/app/public/vendor/fonts/cat-playwrite_au_nsw-400-0.woff2 +0 -0
  124. package/app/public/vendor/fonts/cat-playwrite_au_nsw_guides-400-0.woff2 +0 -0
  125. package/app/public/vendor/fonts/cat-playwrite_au_qld-400-0.woff2 +0 -0
  126. package/app/public/vendor/fonts/cat-playwrite_au_qld_guides-400-0.woff2 +0 -0
  127. package/app/public/vendor/fonts/cat-playwrite_au_sa-400-0.woff2 +0 -0
  128. package/app/public/vendor/fonts/cat-playwrite_au_sa_guides-400-0.woff2 +0 -0
  129. package/app/public/vendor/fonts/cat-playwrite_au_tas-400-0.woff2 +0 -0
  130. package/app/public/vendor/fonts/cat-playwrite_au_tas_guides-400-0.woff2 +0 -0
  131. package/app/public/vendor/fonts/cat-playwrite_au_vic-400-0.woff2 +0 -0
  132. package/app/public/vendor/fonts/cat-playwrite_au_vic_guides-400-0.woff2 +0 -0
  133. package/app/public/vendor/fonts/cat-playwrite_be_vlg-400-0.woff2 +0 -0
  134. package/app/public/vendor/fonts/cat-playwrite_be_vlg_guides-400-0.woff2 +0 -0
  135. package/app/public/vendor/fonts/cat-playwrite_be_wal-400-0.woff2 +0 -0
  136. package/app/public/vendor/fonts/cat-playwrite_be_wal_guides-400-0.woff2 +0 -0
  137. package/app/public/vendor/fonts/cat-playwrite_br_guides-400-0.woff2 +0 -0
  138. package/app/public/vendor/fonts/cat-playwrite_ca_guides-400-0.woff2 +0 -0
  139. package/app/public/vendor/fonts/cat-playwrite_cl_guides-400-0.woff2 +0 -0
  140. package/app/public/vendor/fonts/cat-playwrite_co_guides-400-0.woff2 +0 -0
  141. package/app/public/vendor/fonts/cat-playwrite_cu_guides-400-0.woff2 +0 -0
  142. package/app/public/vendor/fonts/cat-playwrite_cz-400-0.woff2 +0 -0
  143. package/app/public/vendor/fonts/cat-playwrite_cz_guides-400-0.woff2 +0 -0
  144. package/app/public/vendor/fonts/cat-playwrite_de_grund-400-0.woff2 +0 -0
  145. package/app/public/vendor/fonts/cat-playwrite_de_grund_guides-400-0.woff2 +0 -0
  146. package/app/public/vendor/fonts/cat-playwrite_de_la-400-0.woff2 +0 -0
  147. package/app/public/vendor/fonts/cat-playwrite_de_la_guides-400-0.woff2 +0 -0
  148. package/app/public/vendor/fonts/cat-playwrite_de_sas-400-0.woff2 +0 -0
  149. package/app/public/vendor/fonts/cat-playwrite_de_sas_guides-400-0.woff2 +0 -0
  150. package/app/public/vendor/fonts/cat-playwrite_de_va-400-0.woff2 +0 -0
  151. package/app/public/vendor/fonts/cat-playwrite_de_va_guides-400-0.woff2 +0 -0
  152. package/app/public/vendor/fonts/cat-playwrite_dk_loopet-400-0.woff2 +0 -0
  153. package/app/public/vendor/fonts/cat-playwrite_dk_loopet_guides-400-0.woff2 +0 -0
  154. package/app/public/vendor/fonts/cat-playwrite_dk_uloopet-400-0.woff2 +0 -0
  155. package/app/public/vendor/fonts/cat-playwrite_dk_uloopet_guides-400-0.woff2 +0 -0
  156. package/app/public/vendor/fonts/cat-playwrite_es_deco_guides-400-0.woff2 +0 -0
  157. package/app/public/vendor/fonts/cat-playwrite_es_guides-400-0.woff2 +0 -0
  158. package/app/public/vendor/fonts/cat-playwrite_fr_moderne-400-0.woff2 +0 -0
  159. package/app/public/vendor/fonts/cat-playwrite_fr_moderne_guides-400-0.woff2 +0 -0
  160. package/app/public/vendor/fonts/cat-playwrite_fr_trad-400-0.woff2 +0 -0
  161. package/app/public/vendor/fonts/cat-playwrite_fr_trad_guides-400-0.woff2 +0 -0
  162. package/app/public/vendor/fonts/cat-playwrite_gb_j_guides-400-0.woff2 +0 -0
  163. package/app/public/vendor/fonts/cat-playwrite_gb_s_guides-400-0.woff2 +0 -0
  164. package/app/public/vendor/fonts/cat-playwrite_hr-400-0.woff2 +0 -0
  165. package/app/public/vendor/fonts/cat-playwrite_hr_guides-400-0.woff2 +0 -0
  166. package/app/public/vendor/fonts/cat-playwrite_hr_lijeva-400-0.woff2 +0 -0
  167. package/app/public/vendor/fonts/cat-playwrite_hr_lijeva_guides-400-0.woff2 +0 -0
  168. package/app/public/vendor/fonts/cat-playwrite_hu-400-0.woff2 +0 -0
  169. package/app/public/vendor/fonts/cat-playwrite_hu_guides-400-0.woff2 +0 -0
  170. package/app/public/vendor/fonts/cat-playwrite_id-400-0.woff2 +0 -0
  171. package/app/public/vendor/fonts/cat-playwrite_id_guides-400-0.woff2 +0 -0
  172. package/app/public/vendor/fonts/cat-playwrite_ie-400-0.woff2 +0 -0
  173. package/app/public/vendor/fonts/cat-playwrite_ie_guides-400-0.woff2 +0 -0
  174. package/app/public/vendor/fonts/cat-playwrite_in-400-0.woff2 +0 -0
  175. package/app/public/vendor/fonts/cat-playwrite_in_guides-400-0.woff2 +0 -0
  176. package/app/public/vendor/fonts/cat-playwrite_is-400-0.woff2 +0 -0
  177. package/app/public/vendor/fonts/cat-playwrite_is_guides-400-0.woff2 +0 -0
  178. package/app/public/vendor/fonts/cat-playwrite_it_moderna-400-0.woff2 +0 -0
  179. package/app/public/vendor/fonts/cat-playwrite_it_moderna_guides-400-0.woff2 +0 -0
  180. package/app/public/vendor/fonts/cat-playwrite_it_trad-400-0.woff2 +0 -0
  181. package/app/public/vendor/fonts/cat-playwrite_it_trad_guides-400-0.woff2 +0 -0
  182. package/app/public/vendor/fonts/cat-playwrite_mx_guides-400-0.woff2 +0 -0
  183. package/app/public/vendor/fonts/cat-playwrite_ng_modern-400-0.woff2 +0 -0
  184. package/app/public/vendor/fonts/cat-playwrite_ng_modern_guides-400-0.woff2 +0 -0
  185. package/app/public/vendor/fonts/cat-playwrite_nl-400-0.woff2 +0 -0
  186. package/app/public/vendor/fonts/cat-playwrite_nl_guides-400-0.woff2 +0 -0
  187. package/app/public/vendor/fonts/cat-playwrite_no-400-0.woff2 +0 -0
  188. package/app/public/vendor/fonts/cat-playwrite_no_guides-400-0.woff2 +0 -0
  189. package/app/public/vendor/fonts/cat-playwrite_nz-400-0.woff2 +0 -0
  190. package/app/public/vendor/fonts/cat-playwrite_nz_basic-400-0.woff2 +0 -0
  191. package/app/public/vendor/fonts/cat-playwrite_nz_basic_guides-400-0.woff2 +0 -0
  192. package/app/public/vendor/fonts/cat-playwrite_nz_guides-400-0.woff2 +0 -0
  193. package/app/public/vendor/fonts/cat-playwrite_pe_guides-400-0.woff2 +0 -0
  194. package/app/public/vendor/fonts/cat-playwrite_pl-400-0.woff2 +0 -0
  195. package/app/public/vendor/fonts/cat-playwrite_pl_guides-400-0.woff2 +0 -0
  196. package/app/public/vendor/fonts/cat-playwrite_pt_guides-400-0.woff2 +0 -0
  197. package/app/public/vendor/fonts/cat-playwrite_ro-400-0.woff2 +0 -0
  198. package/app/public/vendor/fonts/cat-playwrite_ro_guides-400-0.woff2 +0 -0
  199. package/app/public/vendor/fonts/cat-playwrite_sk-400-0.woff2 +0 -0
  200. package/app/public/vendor/fonts/cat-playwrite_sk_guides-400-0.woff2 +0 -0
  201. package/app/public/vendor/fonts/cat-playwrite_tz-400-0.woff2 +0 -0
  202. package/app/public/vendor/fonts/cat-playwrite_tz_guides-400-0.woff2 +0 -0
  203. package/app/public/vendor/fonts/cat-playwrite_us_modern_guides-400-0.woff2 +0 -0
  204. package/app/public/vendor/fonts/cat-playwrite_us_trad_guides-400-0.woff2 +0 -0
  205. package/app/public/vendor/fonts/cat-playwrite_vn-400-0.woff2 +0 -0
  206. package/app/public/vendor/fonts/cat-playwrite_vn_guides-400-0.woff2 +0 -0
  207. package/app/public/vendor/fonts/cat-playwrite_za-400-0.woff2 +0 -0
  208. package/app/public/vendor/fonts/cat-playwrite_za_guides-400-0.woff2 +0 -0
  209. package/app/public/vendor/fonts/cat-potta_one-400-ext.woff2 +0 -0
  210. package/app/public/vendor/fonts/cat-potta_one-400.woff2 +0 -0
  211. package/app/public/vendor/fonts/cat-ranchers-400-ext.woff2 +0 -0
  212. package/app/public/vendor/fonts/cat-ranchers-400.woff2 +0 -0
  213. package/app/public/vendor/fonts/cat-ranga-400-ext.woff2 +0 -0
  214. package/app/public/vendor/fonts/cat-ranga-400.woff2 +0 -0
  215. package/app/public/vendor/fonts/cat-ranga-700-ext.woff2 +0 -0
  216. package/app/public/vendor/fonts/cat-ranga-700.woff2 +0 -0
  217. package/app/public/vendor/fonts/cat-risque-400-ext.woff2 +0 -0
  218. package/app/public/vendor/fonts/cat-risque-400.woff2 +0 -0
  219. package/app/public/vendor/fonts/cat-rowdies-400-ext.woff2 +0 -0
  220. package/app/public/vendor/fonts/cat-rowdies-400.woff2 +0 -0
  221. package/app/public/vendor/fonts/cat-rowdies-700-ext.woff2 +0 -0
  222. package/app/public/vendor/fonts/cat-rowdies-700.woff2 +0 -0
  223. package/app/public/vendor/fonts/cat-ruge_boogie-400-ext.woff2 +0 -0
  224. package/app/public/vendor/fonts/cat-ruge_boogie-400.woff2 +0 -0
  225. package/app/public/vendor/fonts/cat-ruslan_display-400-ext.woff2 +0 -0
  226. package/app/public/vendor/fonts/cat-ruslan_display-400.woff2 +0 -0
  227. package/app/public/vendor/fonts/cat-sacramento-400-ext.woff2 +0 -0
  228. package/app/public/vendor/fonts/cat-sacramento-400.woff2 +0 -0
  229. package/app/public/vendor/fonts/cat-sancreek-400-ext.woff2 +0 -0
  230. package/app/public/vendor/fonts/cat-sancreek-400.woff2 +0 -0
  231. package/app/public/vendor/fonts/cat-sankofa_display-400-ext.woff2 +0 -0
  232. package/app/public/vendor/fonts/cat-sankofa_display-400.woff2 +0 -0
  233. package/app/public/vendor/fonts/cat-sedgwick_ave_display-400-ext.woff2 +0 -0
  234. package/app/public/vendor/fonts/cat-sedgwick_ave_display-400.woff2 +0 -0
  235. package/app/public/vendor/fonts/cat-shantell_sans-400-ext.woff2 +0 -0
  236. package/app/public/vendor/fonts/cat-shantell_sans-400.woff2 +0 -0
  237. package/app/public/vendor/fonts/cat-smokum-400-ext.woff2 +0 -0
  238. package/app/public/vendor/fonts/cat-smokum-400.woff2 +0 -0
  239. package/app/public/vendor/fonts/cat-solitreo-400-ext.woff2 +0 -0
  240. package/app/public/vendor/fonts/cat-solitreo-400.woff2 +0 -0
  241. package/app/public/vendor/fonts/cat-spicy_rice-400-ext.woff2 +0 -0
  242. package/app/public/vendor/fonts/cat-spicy_rice-400.woff2 +0 -0
  243. package/app/public/vendor/fonts/cat-sriracha-400-ext.woff2 +0 -0
  244. package/app/public/vendor/fonts/cat-sriracha-400.woff2 +0 -0
  245. package/app/public/vendor/fonts/cat-srisakdi-400-ext.woff2 +0 -0
  246. package/app/public/vendor/fonts/cat-srisakdi-400.woff2 +0 -0
  247. package/app/public/vendor/fonts/cat-srisakdi-700-ext.woff2 +0 -0
  248. package/app/public/vendor/fonts/cat-srisakdi-700.woff2 +0 -0
  249. package/app/public/vendor/fonts/cat-stix_two_math-400-0.woff2 +0 -0
  250. package/app/public/vendor/fonts/cat-tillana-400-ext.woff2 +0 -0
  251. package/app/public/vendor/fonts/cat-tillana-400.woff2 +0 -0
  252. package/app/public/vendor/fonts/cat-tillana-700-ext.woff2 +0 -0
  253. package/app/public/vendor/fonts/cat-tillana-700.woff2 +0 -0
  254. package/app/public/vendor/fonts/cat-titan_one-400-ext.woff2 +0 -0
  255. package/app/public/vendor/fonts/cat-titan_one-400.woff2 +0 -0
  256. package/app/public/vendor/fonts/cat-yatra_one-400-ext.woff2 +0 -0
  257. package/app/public/vendor/fonts/cat-yatra_one-400.woff2 +0 -0
  258. package/app/public/vendor/fonts/cat-yomogi-400-ext.woff2 +0 -0
  259. package/app/public/vendor/fonts/cat-yomogi-400.woff2 +0 -0
  260. package/app/public/vendor/fonts/dmserifdisplay-400-ext.woff2 +0 -0
  261. package/app/public/vendor/fonts/dmserifdisplay-400.woff2 +0 -0
  262. package/app/public/vendor/fonts/domine-var-ext.woff2 +0 -0
  263. package/app/public/vendor/fonts/domine-var.woff2 +0 -0
  264. package/app/public/vendor/fonts/fraunces-var-ext.woff2 +0 -0
  265. package/app/public/vendor/fonts/fraunces-var.woff2 +0 -0
  266. package/app/public/vendor/fonts/fredoka-var-ext.woff2 +0 -0
  267. package/app/public/vendor/fonts/fredoka-var.woff2 +0 -0
  268. package/app/public/vendor/fonts/jakarta-var-ext.woff2 +0 -0
  269. package/app/public/vendor/fonts/jakarta-var.woff2 +0 -0
  270. package/app/public/vendor/fonts/lora-var-ext.woff2 +0 -0
  271. package/app/public/vendor/fonts/lora-var.woff2 +0 -0
  272. package/app/public/vendor/fonts/merriweather-var-ext.woff2 +0 -0
  273. package/app/public/vendor/fonts/merriweather-var.woff2 +0 -0
  274. package/app/public/vendor/fonts/notosans-var-ext.woff2 +0 -0
  275. package/app/public/vendor/fonts/notosans-var.woff2 +0 -0
  276. package/app/public/vendor/fonts/nunito-var-ext.woff2 +0 -0
  277. package/app/public/vendor/fonts/nunito-var.woff2 +0 -0
  278. package/app/public/vendor/fonts/playfair-var-ext.woff2 +0 -0
  279. package/app/public/vendor/fonts/playfair-var.woff2 +0 -0
  280. package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
  281. package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
  282. package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
  283. package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
  284. package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
  285. package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
  286. package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
  287. package/app/public/vendor/fonts/quicksand-var-ext.woff2 +0 -0
  288. package/app/public/vendor/fonts/quicksand-var.woff2 +0 -0
  289. package/app/public/vendor/fonts/robotoflex-var-ext.woff2 +0 -0
  290. package/app/public/vendor/fonts/robotoflex-var.woff2 +0 -0
  291. package/app/public/vendor/fonts/sora-var-ext.woff2 +0 -0
  292. package/app/public/vendor/fonts/sora-var.woff2 +0 -0
  293. package/app/public/vendor/fonts/spacegrotesk-var-ext.woff2 +0 -0
  294. package/app/public/vendor/fonts/spacegrotesk-var.woff2 +0 -0
  295. package/app/public/vendor/fonts/spectral-400-ext.woff2 +0 -0
  296. package/app/public/vendor/fonts/spectral-400.woff2 +0 -0
  297. package/app/public/vendor/fonts/spectral-700-ext.woff2 +0 -0
  298. package/app/public/vendor/fonts/spectral-700.woff2 +0 -0
  299. package/app/public/vendor/fonts/teachers-var-ext.woff2 +0 -0
  300. package/app/public/vendor/fonts/teachers-var.woff2 +0 -0
  301. package/app/public/vendor/fonts/ubuntu-400-ext.woff2 +0 -0
  302. package/app/public/vendor/fonts/ubuntu-400.woff2 +0 -0
  303. package/app/public/vendor/fonts/ubuntu-700-ext.woff2 +0 -0
  304. package/app/public/vendor/fonts/ubuntu-700.woff2 +0 -0
  305. package/app/public/vendor/fonts.css +1167 -51
  306. package/dist-pkg/boot/create-game.d.ts +444 -215
  307. package/dist-pkg/boot/create-game.js +3530 -549
  308. package/dist-pkg/core/a11y-sr.d.ts +25 -3
  309. package/dist-pkg/core/a11y-sr.js +40 -19
  310. package/dist-pkg/core/accessible-label.d.ts +17 -0
  311. package/dist-pkg/core/accessible-label.js +37 -0
  312. package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
  313. package/dist-pkg/core/accommodation-subjects.js +32 -0
  314. package/dist-pkg/core/accommodations.d.ts +107 -0
  315. package/dist-pkg/core/accommodations.js +178 -0
  316. package/dist-pkg/core/actions.d.ts +75 -51
  317. package/dist-pkg/core/actions.js +98 -69
  318. package/dist-pkg/core/calm-mode.d.ts +31 -0
  319. package/dist-pkg/core/calm-mode.js +47 -0
  320. package/dist-pkg/core/camera-cycle.d.ts +15 -0
  321. package/dist-pkg/core/camera-cycle.js +7 -0
  322. package/dist-pkg/core/caption-duration.d.ts +15 -0
  323. package/dist-pkg/core/caption-duration.js +19 -0
  324. package/dist-pkg/core/cartridge-problems.d.ts +34 -0
  325. package/dist-pkg/core/cartridge-problems.js +53 -0
  326. package/dist-pkg/core/constants.d.ts +0 -54
  327. package/dist-pkg/core/constants.js +9 -76
  328. package/dist-pkg/core/contract.d.ts +143 -163
  329. package/dist-pkg/core/contract.js +223 -207
  330. package/dist-pkg/core/dom-query.d.ts +4 -4
  331. package/dist-pkg/core/dom-query.js +12 -20
  332. package/dist-pkg/core/entity.d.ts +62 -77
  333. package/dist-pkg/core/entity.js +18 -32
  334. package/dist-pkg/core/escape-html.d.ts +9 -10
  335. package/dist-pkg/core/escape-html.js +16 -20
  336. package/dist-pkg/core/flash-threshold.d.ts +17 -0
  337. package/dist-pkg/core/flash-threshold.js +113 -0
  338. package/dist-pkg/core/game-speed.d.ts +11 -0
  339. package/dist-pkg/core/game-speed.js +16 -0
  340. package/dist-pkg/core/genres.d.ts +20 -0
  341. package/dist-pkg/core/genres.js +44 -0
  342. package/dist-pkg/core/i18n.d.ts +87 -41
  343. package/dist-pkg/core/i18n.js +206 -153
  344. package/dist-pkg/core/loop.d.ts +17 -6
  345. package/dist-pkg/core/loop.js +26 -26
  346. package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
  347. package/dist-pkg/core/pause-icon-catalogue.js +54 -0
  348. package/dist-pkg/core/ring.d.ts +17 -0
  349. package/dist-pkg/core/ring.js +29 -0
  350. package/dist-pkg/core/rng.d.ts +7 -12
  351. package/dist-pkg/core/rng.js +23 -53
  352. package/dist-pkg/core/route.d.ts +26 -26
  353. package/dist-pkg/core/route.js +126 -121
  354. package/dist-pkg/core/scenes.d.ts +37 -40
  355. package/dist-pkg/core/scenes.js +41 -43
  356. package/dist-pkg/core/screens.d.ts +4 -4
  357. package/dist-pkg/core/screens.js +11 -16
  358. package/dist-pkg/core/setting-defaults.d.ts +61 -0
  359. package/dist-pkg/core/setting-defaults.js +66 -0
  360. package/dist-pkg/core/speech-rate.d.ts +29 -0
  361. package/dist-pkg/core/speech-rate.js +47 -0
  362. package/dist-pkg/core/state.d.ts +118 -118
  363. package/dist-pkg/core/state.js +322 -297
  364. package/dist-pkg/core/visual-cycles.d.ts +30 -0
  365. package/dist-pkg/core/visual-cycles.js +52 -0
  366. package/dist-pkg/core/visual-state.d.ts +13 -0
  367. package/dist-pkg/core/visual-state.js +6 -0
  368. package/dist-pkg/educational/activities-registry.d.ts +1 -1
  369. package/dist-pkg/educational/activities-registry.js +9 -8
  370. package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
  371. package/dist-pkg/educational/adaptive-engine.js +17 -17
  372. package/dist-pkg/educational/segment-bar.d.ts +12 -12
  373. package/dist-pkg/educational/segment-bar.js +9 -9
  374. package/dist-pkg/i18n/en.js +321 -215
  375. package/dist-pkg/i18n/es.js +320 -215
  376. package/dist-pkg/i18n/pt.js +342 -215
  377. package/dist-pkg/input/default-bindings.d.ts +37 -38
  378. package/dist-pkg/input/default-bindings.js +127 -144
  379. package/dist-pkg/input/devices.d.ts +7 -7
  380. package/dist-pkg/input/devices.js +17 -16
  381. package/dist-pkg/input/edges.d.ts +23 -32
  382. package/dist-pkg/input/edges.js +23 -28
  383. package/dist-pkg/input/empathy-filter.d.ts +22 -0
  384. package/dist-pkg/input/empathy-filter.js +34 -0
  385. package/dist-pkg/input/face-map.d.ts +96 -0
  386. package/dist-pkg/input/face-map.js +255 -0
  387. package/dist-pkg/input/face-signals.d.ts +40 -0
  388. package/dist-pkg/input/face-signals.js +48 -0
  389. package/dist-pkg/input/gamepad.d.ts +164 -145
  390. package/dist-pkg/input/gamepad.js +351 -559
  391. package/dist-pkg/input/gaze-cycle.d.ts +64 -0
  392. package/dist-pkg/input/gaze-cycle.js +133 -0
  393. package/dist-pkg/input/gaze-relative.d.ts +68 -0
  394. package/dist-pkg/input/gaze-relative.js +142 -0
  395. package/dist-pkg/input/hand-map.d.ts +28 -0
  396. package/dist-pkg/input/hand-map.js +142 -0
  397. package/dist-pkg/input/input-cooldown.d.ts +17 -0
  398. package/dist-pkg/input/input-cooldown.js +39 -0
  399. package/dist-pkg/input/keyboard-runtime.d.ts +18 -20
  400. package/dist-pkg/input/keyboard-runtime.js +23 -27
  401. package/dist-pkg/input/keyboard.d.ts +68 -62
  402. package/dist-pkg/input/keyboard.js +83 -105
  403. package/dist-pkg/input/keydown.d.ts +124 -132
  404. package/dist-pkg/input/keydown.js +283 -288
  405. package/dist-pkg/input/latch-edge.d.ts +25 -21
  406. package/dist-pkg/input/latch-edge.js +33 -35
  407. package/dist-pkg/input/latch-scope.d.ts +43 -47
  408. package/dist-pkg/input/latch-scope.js +66 -75
  409. package/dist-pkg/input/latch-store.d.ts +28 -29
  410. package/dist-pkg/input/latch-store.js +44 -47
  411. package/dist-pkg/input/latch-sync.d.ts +28 -29
  412. package/dist-pkg/input/latch-sync.js +25 -25
  413. package/dist-pkg/input/latch.d.ts +14 -17
  414. package/dist-pkg/input/latch.js +29 -37
  415. package/dist-pkg/input/pad-defaults.d.ts +13 -16
  416. package/dist-pkg/input/pad-defaults.js +21 -28
  417. package/dist-pkg/input/pad-reading.d.ts +76 -0
  418. package/dist-pkg/input/pad-reading.js +164 -0
  419. package/dist-pkg/input/pad-wizard.d.ts +96 -0
  420. package/dist-pkg/input/pad-wizard.js +205 -0
  421. package/dist-pkg/input/pointer-space.d.ts +19 -20
  422. package/dist-pkg/input/pointer-space.js +27 -32
  423. package/dist-pkg/input/pointer.d.ts +39 -40
  424. package/dist-pkg/input/pointer.js +42 -45
  425. package/dist-pkg/input/state.d.ts +101 -89
  426. package/dist-pkg/input/state.js +54 -134
  427. package/dist-pkg/input/switch-scan.d.ts +42 -0
  428. package/dist-pkg/input/switch-scan.js +54 -0
  429. package/dist-pkg/input/synthetic-source.d.ts +42 -0
  430. package/dist-pkg/input/synthetic-source.js +57 -0
  431. package/dist-pkg/input/touch-bindings.d.ts +127 -113
  432. package/dist-pkg/input/touch-bindings.js +158 -173
  433. package/dist-pkg/input/touch.d.ts +130 -70
  434. package/dist-pkg/input/touch.js +321 -123
  435. package/dist-pkg/input/transport-in-use.d.ts +107 -0
  436. package/dist-pkg/input/transport-in-use.js +130 -0
  437. package/dist-pkg/input/transports.d.ts +96 -114
  438. package/dist-pkg/input/transports.js +104 -106
  439. package/dist-pkg/input/virtual-controller.d.ts +46 -0
  440. package/dist-pkg/input/virtual-controller.js +41 -0
  441. package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
  442. package/dist-pkg/input/vocabulary-migration.js +80 -79
  443. package/dist-pkg/input/voice-map.d.ts +43 -0
  444. package/dist-pkg/input/voice-map.js +125 -0
  445. package/dist-pkg/platform/audio-ambient.d.ts +13 -1
  446. package/dist-pkg/platform/audio-ambient.js +11 -13
  447. package/dist-pkg/platform/audio-earcons.d.ts +20 -19
  448. package/dist-pkg/platform/audio-earcons.js +51 -42
  449. package/dist-pkg/platform/audio-jingles.js +9 -10
  450. package/dist-pkg/platform/audio-mixer.d.ts +14 -2
  451. package/dist-pkg/platform/audio-mixer.js +36 -39
  452. package/dist-pkg/platform/audio-sonar.d.ts +96 -113
  453. package/dist-pkg/platform/audio-sonar.js +245 -238
  454. package/dist-pkg/platform/audio.d.ts +53 -19
  455. package/dist-pkg/platform/audio.js +161 -169
  456. package/dist-pkg/platform/flash-sampler.d.ts +19 -0
  457. package/dist-pkg/platform/flash-sampler.js +79 -0
  458. package/dist-pkg/platform/guide-intensity.d.ts +26 -27
  459. package/dist-pkg/platform/guide-intensity.js +50 -52
  460. package/dist-pkg/platform/heavy-catalogue.d.ts +31 -0
  461. package/dist-pkg/platform/heavy-catalogue.js +223 -0
  462. package/dist-pkg/platform/heavy-mirror.d.ts +26 -0
  463. package/dist-pkg/platform/heavy-mirror.js +76 -0
  464. package/dist-pkg/platform/heavy.d.ts +104 -0
  465. package/dist-pkg/platform/heavy.js +169 -0
  466. package/dist-pkg/platform/interruptible-speech.d.ts +16 -16
  467. package/dist-pkg/platform/interruptible-speech.js +50 -51
  468. package/dist-pkg/platform/kokoro-port.d.ts +27 -0
  469. package/dist-pkg/platform/kokoro-port.js +50 -0
  470. package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
  471. package/dist-pkg/platform/kokoro-runtime.js +52 -0
  472. package/dist-pkg/platform/kokoro.d.ts +70 -0
  473. package/dist-pkg/platform/kokoro.js +133 -0
  474. package/dist-pkg/platform/listener-scope.d.ts +12 -0
  475. package/dist-pkg/platform/listener-scope.js +81 -0
  476. package/dist-pkg/platform/locale-host.d.ts +10 -0
  477. package/dist-pkg/platform/locale-host.js +34 -0
  478. package/dist-pkg/platform/microphone.d.ts +51 -0
  479. package/dist-pkg/platform/microphone.js +118 -0
  480. package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
  481. package/dist-pkg/platform/onnx-runtime.js +42 -0
  482. package/dist-pkg/platform/reading-in-worker.d.ts +40 -0
  483. package/dist-pkg/platform/reading-in-worker.js +87 -0
  484. package/dist-pkg/platform/reading-model.d.ts +73 -0
  485. package/dist-pkg/platform/reading-model.js +247 -0
  486. package/dist-pkg/platform/reading-runtime.d.ts +24 -0
  487. package/dist-pkg/platform/reading-runtime.js +159 -0
  488. package/dist-pkg/platform/reading-worker.d.ts +41 -0
  489. package/dist-pkg/platform/reading-worker.js +58 -0
  490. package/dist-pkg/platform/reading.d.ts +69 -0
  491. package/dist-pkg/platform/reading.js +128 -0
  492. package/dist-pkg/platform/speech-recognition.d.ts +51 -0
  493. package/dist-pkg/platform/speech-recognition.js +84 -0
  494. package/dist-pkg/platform/speech.d.ts +14 -1
  495. package/dist-pkg/platform/speech.js +13 -13
  496. package/dist-pkg/platform/storage-keys.d.ts +96 -0
  497. package/dist-pkg/platform/storage-keys.js +106 -0
  498. package/dist-pkg/platform/storage.d.ts +46 -111
  499. package/dist-pkg/platform/storage.js +104 -169
  500. package/dist-pkg/platform/tts.d.ts +51 -38
  501. package/dist-pkg/platform/tts.js +217 -119
  502. package/dist-pkg/platform/vision-loop.d.ts +23 -0
  503. package/dist-pkg/platform/vision-loop.js +56 -0
  504. package/dist-pkg/platform/vision.d.ts +132 -0
  505. package/dist-pkg/platform/vision.js +117 -0
  506. package/dist-pkg/platform/voice-listener.d.ts +36 -0
  507. package/dist-pkg/platform/voice-listener.js +88 -0
  508. package/dist-pkg/platform/voice-plan.d.ts +6 -102
  509. package/dist-pkg/platform/voice-plan.js +9 -151
  510. package/dist-pkg/platform/vosk-runtime.d.ts +71 -0
  511. package/dist-pkg/platform/vosk-runtime.js +93 -0
  512. package/dist-pkg/render/canvas.d.ts +13 -7
  513. package/dist-pkg/render/canvas.js +13 -13
  514. package/dist-pkg/render/crt.d.ts +46 -12
  515. package/dist-pkg/render/crt.js +82 -80
  516. package/dist-pkg/render/cvd-matrices.d.ts +18 -18
  517. package/dist-pkg/render/cvd-matrices.js +33 -38
  518. package/dist-pkg/render/hc-role-data.d.ts +7 -7
  519. package/dist-pkg/render/hc-role-data.js +14 -14
  520. package/dist-pkg/render/high-contrast.d.ts +66 -54
  521. package/dist-pkg/render/high-contrast.js +221 -216
  522. package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
  523. package/dist-pkg/render/low-vision-drawing.js +46 -0
  524. package/dist-pkg/render/lq-filter.d.ts +32 -20
  525. package/dist-pkg/render/lq-filter.js +59 -65
  526. package/dist-pkg/render/port.d.ts +86 -88
  527. package/dist-pkg/render/port.js +17 -23
  528. package/dist-pkg/render/screen-pipeline.d.ts +42 -42
  529. package/dist-pkg/render/screen-pipeline.js +80 -87
  530. package/dist-pkg/render/sprite-fx.d.ts +2 -1
  531. package/dist-pkg/render/sprite-fx.js +16 -14
  532. package/dist-pkg/render/viewports.d.ts +20 -15
  533. package/dist-pkg/render/viewports.js +83 -114
  534. package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
  535. package/dist-pkg/render/viz-axes-labels.js +88 -0
  536. package/dist-pkg/render/viz-axes.d.ts +80 -86
  537. package/dist-pkg/render/viz-axes.js +115 -116
  538. package/dist-pkg/render/viz-modes.d.ts +28 -29
  539. package/dist-pkg/render/viz-modes.js +40 -45
  540. package/dist-pkg/render/viz-refusal.d.ts +32 -0
  541. package/dist-pkg/render/viz-refusal.js +57 -0
  542. package/dist-pkg/render/viz-setters.d.ts +104 -66
  543. package/dist-pkg/render/viz-setters.js +182 -191
  544. package/dist-pkg/ui/aac-sets.d.ts +40 -0
  545. package/dist-pkg/ui/aac-sets.js +49 -0
  546. package/dist-pkg/ui/audio-choices.d.ts +63 -0
  547. package/dist-pkg/ui/audio-choices.js +94 -0
  548. package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
  549. package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
  550. package/dist-pkg/ui/camera-control.d.ts +6 -0
  551. package/dist-pkg/ui/camera-control.js +14 -0
  552. package/dist-pkg/ui/changed-mark.d.ts +9 -8
  553. package/dist-pkg/ui/changed-mark.js +22 -53
  554. package/dist-pkg/ui/control-choices.d.ts +37 -0
  555. package/dist-pkg/ui/control-choices.js +84 -0
  556. package/dist-pkg/ui/debug-panel.d.ts +59 -43
  557. package/dist-pkg/ui/debug-panel.js +68 -69
  558. package/dist-pkg/ui/dom.d.ts +10 -14
  559. package/dist-pkg/ui/dom.js +10 -47
  560. package/dist-pkg/ui/drawing-problems.d.ts +25 -0
  561. package/dist-pkg/ui/drawing-problems.js +93 -0
  562. package/dist-pkg/ui/eye-control.d.ts +36 -0
  563. package/dist-pkg/ui/eye-control.js +178 -0
  564. package/dist-pkg/ui/face-control.d.ts +25 -0
  565. package/dist-pkg/ui/face-control.js +183 -0
  566. package/dist-pkg/ui/focus-trap.d.ts +39 -49
  567. package/dist-pkg/ui/focus-trap.js +56 -65
  568. package/dist-pkg/ui/fonts.d.ts +118 -63
  569. package/dist-pkg/ui/fonts.js +267 -111
  570. package/dist-pkg/ui/game-options.d.ts +42 -0
  571. package/dist-pkg/ui/game-options.js +138 -0
  572. package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
  573. package/dist-pkg/ui/gaze-overlay.js +165 -0
  574. package/dist-pkg/ui/hand-control.d.ts +25 -0
  575. package/dist-pkg/ui/hand-control.js +143 -0
  576. package/dist-pkg/ui/help-panel.d.ts +76 -0
  577. package/dist-pkg/ui/help-panel.js +232 -0
  578. package/dist-pkg/ui/hud-bands.d.ts +45 -0
  579. package/dist-pkg/ui/hud-bands.js +108 -0
  580. package/dist-pkg/ui/hud.d.ts +73 -70
  581. package/dist-pkg/ui/hud.js +94 -98
  582. package/dist-pkg/ui/item-announcement.d.ts +13 -12
  583. package/dist-pkg/ui/item-announcement.js +25 -26
  584. package/dist-pkg/ui/latch-refusal.d.ts +22 -21
  585. package/dist-pkg/ui/latch-refusal.js +37 -37
  586. package/dist-pkg/ui/layout.d.ts +103 -28
  587. package/dist-pkg/ui/layout.js +114 -99
  588. package/dist-pkg/ui/locale-flags.d.ts +16 -0
  589. package/dist-pkg/ui/locale-flags.js +30 -0
  590. package/dist-pkg/ui/loop-crash.d.ts +17 -17
  591. package/dist-pkg/ui/loop-crash.js +33 -62
  592. package/dist-pkg/ui/menu-intent.d.ts +32 -0
  593. package/dist-pkg/ui/menu-intent.js +54 -0
  594. package/dist-pkg/ui/menu-items.d.ts +10 -0
  595. package/dist-pkg/ui/menu-items.js +22 -0
  596. package/dist-pkg/ui/menu-nav.d.ts +60 -90
  597. package/dist-pkg/ui/menu-nav.js +301 -274
  598. package/dist-pkg/ui/mobility-choices.d.ts +26 -0
  599. package/dist-pkg/ui/mobility-choices.js +41 -0
  600. package/dist-pkg/ui/motion-choices.d.ts +31 -0
  601. package/dist-pkg/ui/motion-choices.js +68 -0
  602. package/dist-pkg/ui/motion-scene.d.ts +24 -19
  603. package/dist-pkg/ui/motion-scene.js +29 -61
  604. package/dist-pkg/ui/mount-panel.d.ts +81 -0
  605. package/dist-pkg/ui/mount-panel.js +61 -0
  606. package/dist-pkg/ui/panel-shell.d.ts +65 -31
  607. package/dist-pkg/ui/panel-shell.js +92 -66
  608. package/dist-pkg/ui/panel-widgets.d.ts +116 -0
  609. package/dist-pkg/ui/panel-widgets.js +208 -0
  610. package/dist-pkg/ui/pause-buttons.d.ts +35 -0
  611. package/dist-pkg/ui/pause-buttons.js +66 -0
  612. package/dist-pkg/ui/pause-icons.d.ts +249 -351
  613. package/dist-pkg/ui/pause-icons.js +614 -605
  614. package/dist-pkg/ui/pause-markup.d.ts +86 -0
  615. package/dist-pkg/ui/pause-markup.js +125 -0
  616. package/dist-pkg/ui/reach-notice.d.ts +22 -23
  617. package/dist-pkg/ui/reach-notice.js +55 -58
  618. package/dist-pkg/ui/scan-overlay.d.ts +23 -0
  619. package/dist-pkg/ui/scan-overlay.js +42 -0
  620. package/dist-pkg/ui/settings-aac.d.ts +68 -0
  621. package/dist-pkg/ui/settings-aac.js +189 -0
  622. package/dist-pkg/ui/settings-audio.d.ts +91 -113
  623. package/dist-pkg/ui/settings-audio.js +407 -405
  624. package/dist-pkg/ui/settings-controls.d.ts +53 -92
  625. package/dist-pkg/ui/settings-controls.js +143 -215
  626. package/dist-pkg/ui/settings-empathy.d.ts +39 -30
  627. package/dist-pkg/ui/settings-empathy.js +53 -60
  628. package/dist-pkg/ui/settings-mobility.d.ts +195 -0
  629. package/dist-pkg/ui/settings-mobility.js +374 -0
  630. package/dist-pkg/ui/settings-motion.d.ts +91 -70
  631. package/dist-pkg/ui/settings-motion.js +287 -198
  632. package/dist-pkg/ui/settings-panel.d.ts +48 -45
  633. package/dist-pkg/ui/settings-panel.js +164 -93
  634. package/dist-pkg/ui/settings-typo.d.ts +28 -76
  635. package/dist-pkg/ui/settings-typo.js +145 -125
  636. package/dist-pkg/ui/settings-visual.d.ts +29 -87
  637. package/dist-pkg/ui/settings-visual.js +240 -193
  638. package/dist-pkg/ui/shell.d.ts +113 -134
  639. package/dist-pkg/ui/shell.js +143 -216
  640. package/dist-pkg/ui/simulation-list.d.ts +27 -0
  641. package/dist-pkg/ui/simulation-list.js +76 -0
  642. package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
  643. package/dist-pkg/ui/simulation-over-the-world.js +131 -0
  644. package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
  645. package/dist-pkg/ui/simulation-refusal.js +8 -56
  646. package/dist-pkg/ui/switchable-control.d.ts +11 -0
  647. package/dist-pkg/ui/switchable-control.js +19 -0
  648. package/dist-pkg/ui/title.d.ts +4 -4
  649. package/dist-pkg/ui/title.js +11 -13
  650. package/dist-pkg/ui/top-band.d.ts +24 -0
  651. package/dist-pkg/ui/top-band.js +100 -0
  652. package/dist-pkg/ui/typo-choices.d.ts +71 -0
  653. package/dist-pkg/ui/typo-choices.js +84 -0
  654. package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
  655. package/dist-pkg/ui/visual-axes-panel.js +12 -94
  656. package/dist-pkg/ui/visual-choices.d.ts +77 -0
  657. package/dist-pkg/ui/visual-choices.js +107 -0
  658. package/dist-pkg/ui/vlibras.d.ts +33 -10
  659. package/dist-pkg/ui/vlibras.js +58 -81
  660. package/dist-pkg/ui/voice-control.d.ts +46 -0
  661. package/dist-pkg/ui/voice-control.js +143 -0
  662. package/dist-pkg/ui/voice-settings.d.ts +96 -0
  663. package/dist-pkg/ui/voice-settings.js +302 -0
  664. package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
  665. package/dist-pkg/ui/where-the-child-is.js +70 -0
  666. package/docs/CREDITS.md +198 -54
  667. package/docs/LICENSES.md +160 -145
  668. package/package.json +24 -25
  669. package/scripts/heavy-into-the-delivery.mjs +144 -0
  670. package/scripts/licences/Apache-2.0.txt +176 -0
  671. package/scripts/licences/GPL-3.0.txt +674 -0
  672. package/scripts/licences/MIT.txt +17 -0
  673. package/scripts/licences/third-party.mjs +287 -0
  674. package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
  675. package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
  676. package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
  677. package/dist-pkg/core/anel.d.ts +0 -17
  678. package/dist-pkg/core/anel.js +0 -31
  679. package/dist-pkg/core/collision.d.ts +0 -21
  680. package/dist-pkg/core/collision.js +0 -62
  681. package/dist-pkg/core/layers.d.ts +0 -63
  682. package/dist-pkg/core/layers.js +0 -95
  683. package/dist-pkg/core/letter-grid.d.ts +0 -55
  684. package/dist-pkg/core/letter-grid.js +0 -116
  685. package/dist-pkg/core/password.d.ts +0 -34
  686. package/dist-pkg/core/password.js +0 -205
  687. package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
  688. package/dist-pkg/core/rotulo-acessivel.js +0 -41
  689. package/dist-pkg/core/run-state.d.ts +0 -115
  690. package/dist-pkg/core/run-state.js +0 -40
  691. package/dist-pkg/core/tiles.d.ts +0 -12
  692. package/dist-pkg/core/tiles.js +0 -61
  693. package/dist-pkg/core/world.d.ts +0 -4
  694. package/dist-pkg/core/world.js +0 -58
  695. package/dist-pkg/input/origem-sintetica.d.ts +0 -44
  696. package/dist-pkg/input/origem-sintetica.js +0 -60
  697. package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
  698. package/dist-pkg/input/transporte-em-uso.js +0 -130
  699. package/dist-pkg/platform/audio-nav.d.ts +0 -51
  700. package/dist-pkg/platform/audio-nav.js +0 -99
  701. package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
  702. package/dist-pkg/platform/pesados-catalogo.js +0 -177
  703. package/dist-pkg/platform/pesados.d.ts +0 -31
  704. package/dist-pkg/platform/pesados.js +0 -75
  705. package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
  706. package/dist-pkg/platform/vozes-prontas.js +0 -61
  707. package/dist-pkg/render/camera.d.ts +0 -58
  708. package/dist-pkg/render/camera.js +0 -105
  709. package/dist-pkg/render/cenario-data.d.ts +0 -127
  710. package/dist-pkg/render/cenario-data.js +0 -145
  711. package/dist-pkg/render/city-tex.d.ts +0 -63
  712. package/dist-pkg/render/city-tex.js +0 -228
  713. package/dist-pkg/render/city-tiles.d.ts +0 -11
  714. package/dist-pkg/render/city-tiles.js +0 -140
  715. package/dist-pkg/render/draw.d.ts +0 -149
  716. package/dist-pkg/render/draw.js +0 -231
  717. package/dist-pkg/render/fx.d.ts +0 -63
  718. package/dist-pkg/render/fx.js +0 -123
  719. package/dist-pkg/render/minimap.d.ts +0 -11
  720. package/dist-pkg/render/minimap.js +0 -94
  721. package/dist-pkg/render/parallax.d.ts +0 -85
  722. package/dist-pkg/render/parallax.js +0 -158
  723. package/dist-pkg/render/player-anim.d.ts +0 -71
  724. package/dist-pkg/render/player-anim.js +0 -152
  725. package/dist-pkg/render/recycling-tex.d.ts +0 -48
  726. package/dist-pkg/render/recycling-tex.js +0 -164
  727. package/dist-pkg/render/scene-city.d.ts +0 -77
  728. package/dist-pkg/render/scene-city.js +0 -181
  729. package/dist-pkg/render/scene-parallax.d.ts +0 -72
  730. package/dist-pkg/render/scene-parallax.js +0 -426
  731. package/dist-pkg/render/scene-sky.d.ts +0 -126
  732. package/dist-pkg/render/scene-sky.js +0 -295
  733. package/dist-pkg/render/set-cenario.d.ts +0 -54
  734. package/dist-pkg/render/set-cenario.js +0 -103
  735. package/dist-pkg/render/textures.d.ts +0 -75
  736. package/dist-pkg/render/textures.js +0 -240
  737. package/dist-pkg/render/title-scene.d.ts +0 -46
  738. package/dist-pkg/render/title-scene.js +0 -75
  739. package/dist-pkg/render/weather.d.ts +0 -96
  740. package/dist-pkg/render/weather.js +0 -171
  741. package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
  742. package/dist-pkg/render/wheelchair-sprites.js +0 -69
  743. package/dist-pkg/render/world-tex.d.ts +0 -18
  744. package/dist-pkg/render/world-tex.js +0 -87
  745. package/dist-pkg/ui/activities-menu.d.ts +0 -258
  746. package/dist-pkg/ui/activities-menu.js +0 -648
  747. package/dist-pkg/ui/caa-sets.d.ts +0 -39
  748. package/dist-pkg/ui/caa-sets.js +0 -65
  749. package/dist-pkg/ui/map-hub.d.ts +0 -56
  750. package/dist-pkg/ui/map-hub.js +0 -138
  751. package/dist-pkg/ui/settings-caa.d.ts +0 -45
  752. package/dist-pkg/ui/settings-caa.js +0 -137
  753. package/dist-pkg/ui/settings-motor.d.ts +0 -175
  754. package/dist-pkg/ui/settings-motor.js +0 -342
  755. package/dist-pkg/ui/webcam.d.ts +0 -7
  756. package/dist-pkg/ui/webcam.js +0 -93
@@ -1,353 +1,582 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import { type Alcance, type Disponibilidade } from '../input/transports.js';
2
+ import { type Translate } from '../core/i18n.js';
3
+ import { type LiveInput } from '../input/state.js';
4
+ import { type FlashMeasurement } from '../platform/flash-sampler.js';
5
+ import { type Reach, type Availability } from '../input/transports.js';
6
+ import { type AccommodationAnswers } from '../core/accommodations.js';
3
7
  import { type ActionPreset } from '../core/actions.js';
4
8
  import type { KeyScheme } from '../core/entity.js';
9
+ import { type HowToPlaySlide } from '../ui/help-panel.js';
10
+ import { type SettingsStore } from '../core/state.js';
5
11
  import { type GameDeclaration } from '../core/contract.js';
6
12
  import { type SceneStack } from '../core/scenes.js';
7
- import { createTts, type CarregarVozNeural } from '../platform/tts.js';
13
+ import { createTts } from '../platform/tts.js';
14
+ import { type Reading } from '../platform/reading.js';
15
+ import { type Audio } from '../platform/audio.js';
8
16
  import { type AudioSonar, type SonarPlayer } from '../platform/audio-sonar.js';
9
- import { type Tema, type Correcao } from '../render/viz-axes.js';
10
- import type { AlcanceDoFiltro } from '../render/port.js';
17
+ import { type Theme, type Correction } from '../render/viz-axes.js';
18
+ import type { FilterReach } from '../render/port.js';
11
19
  import { type SettingsPanelApi } from '../ui/settings-panel.js';
20
+ import { type VirtualCommand, type VirtualController } from '../input/virtual-controller.js';
21
+ export type { VirtualCommand } from '../input/virtual-controller.js';
22
+ import { type LqFilter } from '../render/lq-filter.js';
23
+ import { type Crt } from '../render/crt.js';
24
+ import { type HudNumber } from '../ui/hud-bands.js';
25
+ import { type GameOption } from '../ui/game-options.js';
26
+ import { type StorageLike } from '../platform/storage.js';
12
27
  import { type MenuNavApi } from '../ui/menu-nav.js';
13
28
  import type { NavKeys } from '../input/edges.js';
29
+ import { type GamepadGameHooks } from '../input/gamepad.js';
30
+ export type { GamepadGameHooks } from '../input/gamepad.js';
14
31
  import { type KeyboardRuntime } from '../input/keyboard-runtime.js';
15
- import { type RelatorioPesado } from '../platform/pesados.js';
16
- /** O que o jogo empresta do documento. Tudo opcional menos `doc`/`win`: o que faltar vira `problems`. */
32
+ import { type KeyboardConfigApi } from '../input/keyboard.js';
33
+ import { type HeavyReport } from '../platform/heavy.js';
34
+ /** What the game lends from the document. Everything optional but `doc`/`win`: what is missing becomes `problems`. */
17
35
  export interface EngineHost {
18
36
  readonly doc: Document;
19
37
  readonly win: Window;
20
- /** Um `<svg>` vazio onde os seis filtros de daltonismo são montados em tempo de execução. */
38
+ /** An empty `<svg>` where the six colour-vision filters are mounted at run time. */
21
39
  readonly cvdHost?: SVGElement | Element | null;
22
40
  /**
23
- * ONDE A BARRA DE ACESSIBILIDADE ENTRA, na PRIMEIRA tela do jogo.
41
+ * WHERE THE ACCESSIBILITY BAR GOES, on the game's FIRST screen.
24
42
  *
25
- * ⚠️ PEDIDO DO DEV, 2026-09-07: «o menu de pausa, o design do menu de pausa e os ícones de acessibilidade
43
+ * ⚠️ THE DEV'S REQUEST, 2026-09-07: «o menu de pausa, o design do menu de pausa e os ícones de acessibilidade
26
44
  * que aparecem no jogo desde a primeira tela devem ser oferecidos pela ENGINE e não pela programação do
27
45
  * jogo. Todo jogo da engine inclusionist deve ter o mesmo menu de pausa e ícones de acessibilidade desde a
28
46
  * primeira.»
29
47
  *
30
- * ⚠️ E A MEDIÇÃO DE 2026-09-08 MOSTROU QUE É UM ACHADO, e não uma arrumação: dos seis jogos do catálogo
31
- * local, CINCO não têm barra de acessibilidade nenhuma — nem menu de pausa. `pixi-15-puzzle`, `game-chess`,
32
- * `game-soccer`, `2048` e `whackwhack` não chamam `initPauseIcons` nem montam HUD, e o `createGame` nunca
33
- * os montou por eles. O comentário do `ui/pause-icons` diz porquê sem o notar: «`initPauseIcons` é chamado
34
- * pela raiz de composição de CADA jogo» — ou seja, cada jogo tinha de se lembrar, e cinco não se lembraram.
35
- * A criança que depende do modo cego, do TTS ou do alto contraste abre esses cinco jogos e não tem por onde.
48
+ * Left to each game, the bar was missing from most of the catalogue: each game had to remember to call
49
+ * `initPauseIcons`, and a child who depends on blind mode, narration or high contrast opened those games with no way
50
+ * in. So the engine mounts it (ADR-0106 §4, step 2).
36
51
  *
37
- * Ausente, a engine procura `#title-icons` — o id que o jogo de plataforma usa desde sempre — e, não o
38
- * achando, diz-o em `problems`.
39
- *
40
- * ✅ E DESDE 2026-09-08 ELA TAMBÉM **MONTA** (etapa 2 do ADR-0106 §4). Este parágrafo dizia «dizer não é
41
- * montar, e a montagem é o passo seguinte»; o passo seguinte aconteceu. O que a destravou foram as etapas
42
- * 1 e 3: nenhuma delas era sobre montar, e sem as duas o `PauseIconsCtx` exigia sete coisas que esta raiz
43
- * não sabe responder por um jogo que não conhece.
44
- *
45
- * ⚠️ Achando o hospedeiro, a barra é escrita e fiada aqui. Não achando, continua a ser `problems` — porque
46
- * a engine pode oferecer os ícones, mas não pode adivinhar ONDE eles cabem no desenho de um jogo alheio.
52
+ * Absent, the engine looks for `#title-icons` — the id the platformer has always used. Found, the bar is written and
53
+ * wired here; not found, it is a line of `problems`: the engine can offer the icons, but it cannot guess WHERE they
54
+ * fit in the layout of a game it does not know.
47
55
  */
48
56
  readonly a11yBarHost?: Element | null;
49
57
  /**
50
- * ONDE O CARTÃO DE PAUSA da primeira tela é pendurado. Ausente, a engine usa `#game-region`.
58
+ * WHERE THE PAUSE CARD of the first screen is hung. Absent, the engine uses `#game-region`.
51
59
  *
52
- * ⚠️ Existe pela mesma razão do `a11yBarHost`: a engine pode OFERECER a pausa, mas não sabe onde ela cabe
53
- * no desenho de um jogo alheio. 📌 E desde o ADR-0120 ONDE já não é SE: a pausa deixou de ser declinável, e
54
- * o que sobra deste campo é o lugar. Um hospedeiro que não aceite filhos vira linha de `problems`, que é a
55
- * diferença entre a engine não saber e a engine calar-se.
60
+ * ⚠️ For the same reason as `a11yBarHost`: the engine OFFERS the pause, but does not know where it fits in the
61
+ * layout of a game it does not know. 📌 And since ADR-0120/ADR-0122 WHERE is not WHETHER: the pause is not
62
+ * declinable, and what this field keeps is the place. A host that takes no children becomes a line of `problems` —
63
+ * the difference between the engine not knowing and the engine keeping quiet.
56
64
  */
57
65
  readonly pauseHost?: Element | null;
66
+ /**
67
+ * WHERE THE VIRTUAL CONTROLLER IS HUNG (ADR-0143). Absent, the engine uses `#game-region`.
68
+ *
69
+ * ⚠️ For the same reason as `pauseHost`: the engine draws the pad from the `preset`, but does not know where it fits
70
+ * in the layout of a game it does not know. And the stylesheet puts `.touch` at `position:absolute` at the bottom of
71
+ * the host — so the host is the game's rectangle, not the page.
72
+ */
73
+ readonly touchHost?: Element | null;
74
+ /**
75
+ * WHERE THE CHILD'S SETTINGS ARE KEPT (ADR-0232, issue #207). The root builds the page's one store from it and hands that
76
+ * store to every module that persists.
77
+ *
78
+ * 📌 OPTIONAL, against ADR-0224/ADR-0227's preference for required ports, because here absence has a SAFE answer rather
79
+ * than a silent one: the host window's `localStorage`, which is what «this browser remembers the child's choices» means.
80
+ * A host passes one to keep a root's settings apart from everything else on the origin — a test file its own
81
+ * `memoryBackend()`, so no file inherits or races another's keys; a page with two roots one each (ADR-0142).
82
+ */
83
+ readonly storage?: StorageLike;
58
84
  }
59
85
  /**
60
- * O que este jogo NÃO tem. Declarado, e não deduzido de um getter que devolve null.
86
+ * What this game does NOT have. Declared, not deduced from a getter that returns null.
61
87
  *
62
- * O achado 10 do segundo consumidor é a razão de isto existir como tipo: o quiz precisava se declarar
63
- * "pausado" para navegar os próprios menus, porque a engine não tinha por onde ouvir "eu não tenho fases".
88
+ * Finding 10 of the second consumer is why this exists as a type: the quiz had to declare itself paused to navigate its
89
+ * own menus, because the engine had no way to hear that a game has no phases.
64
90
  */
65
91
  export interface Declinios {
66
- /** Sem assistente de mapeamento de controle. */
67
- readonly semAssistenteDePad?: boolean;
68
- /** Sem "ator da pausa" — quem apertou o botão que abriu o menu. */
69
- readonly semAtorDePausa?: boolean;
92
+ /** No pause actor — who pressed the button that opened the menu. */
93
+ readonly noPauseActor?: boolean;
70
94
  /**
71
- * Sem voz neural — este jogo não abre a porta do ADR-0094.
72
- *
73
- * ⚠️ EXISTE PORQUE A AUSÊNCIA ESTAVA A SER SILENCIOSA, e a medição de 2026-09-08 diz quanto: dos SEIS jogos
74
- * do catálogo local, TRÊS declaram `carregarVozNeural` (platformer, 15-puzzle, 2048) e TRÊS não
75
- * (`game-soccer`, `whackwhack`, `game-chess`). Nos três últimos não há voz neural nenhuma, e nada o dizia.
95
+ * No neural voice — this game does not declare `uses: { neuralVoice: true }` (ADR-0216 §3).
76
96
  *
77
- * ⚠️ E ISSO CONTRADIZ UMA PROMESSA ESCRITA. O ADR-0065 §3 diz que as vozes «fazem parte da engine, e não do
78
- * jogo em si» e que um cartucho «não tem de saber que existe»; o ADR-0094 — com razão, e por 135 MB de WASM
79
- * — passou a exigir UMA LINHA do jogo. As duas coisas podem ser verdade ao mesmo tempo (a engine é dona das
80
- * VOZES, o jogo nomeia o FORNECEDOR), mas só se quem esquece a linha for avisado. Declinar é escolha; não
81
- * declarar era omissão.
97
+ * Exists because the absence is otherwise silent: a game that does not ask for one has only the browser's voice, which a school
98
+ * Chromebook may not have for the child's language. Declining is a choice; not declaring is an omission, and `problems` says so.
82
99
  */
83
- readonly semVozNeural?: boolean;
100
+ readonly noNeuralVoice?: boolean;
84
101
  }
85
102
  export interface CreateGameOptions {
86
- /** Os SETE CAMPOS (core/contract). É o que a pilha de acessibilidade lê, e a única coisa que ela lê. */
103
+ /** The SEVEN FIELDS (core/contract). It is what the accessibility stack reads, and the only thing it reads. */
87
104
  readonly declaration: GameDeclaration;
88
105
  readonly host: EngineHost;
89
106
  readonly declines?: Declinios;
90
107
  /**
91
- * É AGORA hora de navegar menu? A plataforma responde `phase === 'paused'`; um quiz responde `true`.
92
- * Ausente = `true`, que é o caso do jogo sem fases — o mais simples, e o que não obriga a inventar uma.
108
+ * Is it menu-navigation time NOW? The platformer answers `phase === 'paused'`; a quiz answers `true`.
109
+ * Absent = `true`, the case of a game with no phases — the simplest one, and the one that does not force one to be invented.
93
110
  */
94
111
  readonly isNavigable?: () => boolean;
112
+ /** Is the position index (item N of M) on? Absent = yes. See `withIndex` in ui/menu-nav. */
113
+ readonly withIndex?: () => boolean;
95
114
  /**
96
- * O MODO `accessibility` do ADR-0044 (item 7): o direcional dirige a barra rápida em vez do personagem.
115
+ * ADR-0044's `accessibility` MODE (item 7): the directional drives the quick bar instead of the character.
97
116
  *
98
- * Opcionais porque um hospedeiro pode não ter barra nenhuma — sem eles a resposta é "ninguém está nela" e
99
- * nada é chamado. O jogo de plataforma os fornece; um quiz sem HUD de a11y, não.
117
+ * Optional: absent, the engine answers with the bar it mounted itself (`ui/pause-icons`). A game that draws its own
118
+ * bar answers for it.
100
119
  */
101
- /** O índice "N de M" está ligado? Ausente = sim. Ver `comIndice` em ui/menu-nav. */
102
- readonly comIndice?: () => boolean;
103
- readonly naBarraDe?: (i: number) => boolean;
120
+ readonly onBar?: (i: number) => boolean;
104
121
  readonly navBar?: (i: number, k: NavKeys) => void;
105
- /** Jogadores para o teclado remapeável. `Pick<ControlledPlayer,'ctrl'>` — esquema de teclas e nada mais.
106
- * ⚠️ `KeyScheme` e não `Record<string, string[]>` desde a #118: era uma CÓPIA ESTRUTURAL do tipo, e uma
107
- * cópia que ninguém obriga a concordar diverge — é a lição que o próprio `core/entity` abre a dizer, com
108
- * o `DomQuery` (dezasseis cópias) e o `KeyScheme` (seis) como as contas já pagas. */
122
+ /**
123
+ * Players for the remappable keyboard. `Pick<ControlledPlayer,'ctrl'>` — a key scheme and nothing more.
124
+ * ⚠️ `KeyScheme` and not `Record<string, string[]>` (#118): a structural COPY of a type that nothing forces to agree
125
+ * drifts — the lesson `core/entity` opens with.
126
+ *
127
+ * ⚠️ `audioSink` is ADDITIVE AND OPTIONAL: no consumer needs to write it.
128
+ *
129
+ * 🎯 It is here because the seat has a second reader inside the engine. The hearing panel, which the engine mounts,
130
+ * writes into it the audio output the child chose — and `ui/pause-icons` reads it to answer a question that changes
131
+ * what the bar offers: does this child have an output of HER OWN? Without it, changing sound, narration or blind
132
+ * mode on a shared headset would change everyone's audio.
133
+ *
134
+ * 📌 AND ONLY THIS FIELD. The MOTOR fields (`easy`, `toggleMove`, `toggleRun`) are left out: they are required in
135
+ * `MobilityPlayer` — the panel READS them to draw its state — and making them required here would force every game
136
+ * to carry them. That is a contract decision still to be taken, and it is not taken in passing by a cast that would
137
+ * silence the compiler.
138
+ */
109
139
  readonly players?: {
110
140
  ctrl: KeyScheme;
141
+ audioSink?: string | null;
111
142
  }[];
112
- /** Troca de fase, para quem tem fases. Ausente = não faz nada (o jogo sem fases não perde nada). */
143
+ /** Phase change, for a game that has phases. Absent = does nothing (a game without phases loses nothing). */
113
144
  readonly setPhase?: (p: 'title' | 'playing' | 'paused') => void;
114
145
  /**
115
- * Os jogadores como a NAVEGAÇÃO SONORA os vê. Ausente, `createGame` DERIVA um do campo 4 do contrato: o
116
- * foco diz onde o jogador está, que é tudo o que o sonar precisa saber sobre posição.
146
+ * The players as NAVIGATION SOUND sees them. Absent, `createGame` DERIVES one from field 4 of the contract: the focus
147
+ * says where the player is, which is all the sonar needs to know about position.
117
148
  *
118
- * Um jogo com vários jogadores, ou com dispositivo de áudio por jogador, fornece a sua lista. Um jogo de
119
- * uma criança só não fornece nada — e ganha sonar assim mesmo, que é o ponto.
149
+ * A game with several players, or with an audio device per player, supplies its own list. A one-child game supplies
150
+ * nothing — and gets the sonar anyway, which is the point.
120
151
  */
121
152
  readonly sonarPlayers?: () => SonarPlayer[];
122
- /** Modo cego ligado? Ausente = não. Vale para todos os jogadores, como no jogo de plataforma. */
153
+ /** Blind mode on? Absent = the engine's own stored value (`core/state.blindMode`). Applies to every player. */
123
154
  readonly isBlindMode?: () => boolean;
124
155
  /**
125
- * AS PALAVRAS DESTE JOGO (`core/actions`). Sem elas a engine não sabe QUANTAS ações pedir a um transporte,
126
- * e a garantia do ADR-0079 §3 não tem como ser medida — foi a lacuna que a issue #112 encontrou: a
127
- * aritmética existia, testada, e o `createGame` tinha ZERO ocorrências de qualquer coisa sobre ações.
156
+ * THIS GAME'S WORDS (`core/actions`). Without them the engine does not know HOW MANY actions to ask of a transport,
157
+ * and ADR-0079 §3's guarantee cannot be measured (issue #112).
128
158
  *
129
- * Opcional porque um jogo pode não declarar preset ainda; sem ele o aviso de alcance simplesmente não
130
- * aparece, que é o comportamento de hoje e não uma regressão.
159
+ * Optional because a game may not declare a preset yet; without it the reach notice simply does not appear, and the
160
+ * help and the scan have no words to show.
131
161
  */
132
162
  readonly preset?: ActionPreset;
133
163
  /**
134
- * COMO SE CARREGA A VOZ NEURAL — uma linha do lado do jogo (ADR-0094):
164
+ * THE ON-SCREEN PAD, only when the cartridge asks for it (ADR-0166): «Controle de tela é só para jogo que não funciona tão
165
+ * bem como via mouse e/ou touch (o cartucho decide), nunca para menu.» Absent = no pad — a game played by touching its
166
+ * own elements, and every menu, need none on top of them. It leaves the pause card and the panels; it stays on the quick
167
+ * pause.
168
+ */
169
+ readonly onScreenPad?: boolean;
170
+ /**
171
+ * THE NUMBERS THIS GAME SHOWS, each in the band of what it is about (ADR-0168, ADR-0175; issue #162). The engine mounts
172
+ * the HUD and places them: `identity` top left and `mission` under it, `power` top right (under the clock), `learning` bars (one to three, as
173
+ * `educational/segment-bar.barOf` returns them) centred in the footer, under the explanation; the room the game leaves free at the
174
+ * top (`--barra-a11y-h`) grows by what they take. Absent = no HUD mounted, and the game keeps drawing its own.
175
+ * 📏 Measured on 2026-09-13: six sibling games, six HUDs of their own, none in the bands.
176
+ * A malformed list is refused at boot and at `mount`, like the declaration.
177
+ */
178
+ readonly hud?: readonly HudNumber[];
179
+ /**
180
+ * THE OPTIONS OF THIS GAME, as rows the engine draws (ADR-0182; issue #178): a label and hint in the game's words, a kind
181
+ * (steps, list or switch), how to read the value and how to write it. «Opções do jogo» opens them in a panel of the
182
+ * engine's own; absent or empty, the door stays on the card locked with its reason (ADR-0161). A cartridge draws its own
183
+ * options only where rows cannot express what it needs. A malformed list is refused at boot and at `mount`.
184
+ */
185
+ readonly gameOptions?: readonly GameOption[];
186
+ /**
187
+ * HOW TO PLAY THIS GAME, as slides the help shows before the buttons (ADR-0195; issue #188): «O "Como jogar" é justamente algo a
188
+ * ser feito pelo cartucho.» Each slide's text is read at every showing, in the page's language; its figure, when given, is drawn
189
+ * by the cartridge on a surface the engine gives, with the time for an animation (still under reduced motion). Absent = the help
190
+ * shows the buttons alone. A malformed list is refused at boot and at `mount`.
191
+ */
192
+ readonly howToPlay?: readonly HowToPlaySlide[];
193
+ /**
194
+ * THIS GAME'S DICTIONARIES, one per language (`pt`, `en`, `es`), registered into THIS ROOT's translator before anything is
195
+ * translated (ADR-0232 D3 erratum): a key resolves for this game and for no other root on the page. A string with markup is
196
+ * refused and named in the console, as `registerDict` does; a key given in one language and not another is a line of
197
+ * `problems`. Decision (mechanical, ADR-0232 D3): an option and not a method on the handle, because every game measured
198
+ * registers BEFORE `createGame` — and a method would come after the markup was translated.
199
+ */
200
+ readonly dictionaries?: Readonly<Record<string, Readonly<Record<string, string>>>>;
201
+ /**
202
+ * THE VIRTUAL CONTROLLER'S COMMANDS, CARRIED TO THE GAME (ADR-0111 and its erratum; issue #197): «a engine lida com o hardware e passa
203
+ * para o jogo o nome virtual do botão». Each press and release of a position the child's hardware reached — the keyboard by the
204
+ * child's scheme, the eyes — with its source and seat. What it executes is the game's, named by its `preset`. Not called while a menu
205
+ * has the directional. Absent = the game hears commands only through what it reads itself.
206
+ */
207
+ readonly onCommand?: (command: VirtualCommand) => void;
208
+ /**
209
+ /**
210
+ * WHAT ONLY THIS GAME KNOWS ABOUT THE GAMEPAD (ADR-0224). The engine mounts the transport; these are the few answers
211
+ * nothing in it can know — the title screen, the attract demo, the modal, joining and respawning a seat, the waiting
212
+ * badge, the wizard's art, and whether the world is running.
135
213
  *
136
- * carregarVozNeural: () => import('@mintplex-labs/piper-tts-web')
214
+ * 🎯 **Absent altogether is an answer**, not an oversight: the gamepad works, and what depends on the cartridge's
215
+ * world simply does not happen. Each absence is written in `GamepadGameHooks`.
216
+ */
217
+ readonly gamepad?: GamepadGameHooks;
218
+ /**
219
+ * THE ACCOMMODATIONS THAT HAVE A SUBJECT IN THIS GAME — the cartridge's answer, REQUIRED (ADR-0153).
137
220
  *
138
- * ⚠️ AUSENTE POR OMISSÃO, E ISSO É A DECISÃO E NÃO UM DESCUIDO. A engine não pode nomear o fornecedor:
139
- * ele traz `onnxruntime-web` como peer NÃO-opcional, que o npm instala sozinho — **135,4 MB** no
140
- * `node_modules` de todo consumidor, incluindo um jogo que nunca fale por voz neural. E declará-lo em
141
- * `devDependencies`, que era o estado até 06/09, publicou uma engine que NÃO COMPILAVA para ninguém
142
- * (ADR-0093). A porta é a única forma que resolve as duas coisas ao mesmo tempo.
221
+ * 🔴 For each of the sixteen only the game can answer (`GAME_KEYED` in `core/accommodations`): the game's WORD, if
222
+ * it has a subject here, or `false`. In the Dev's words: «Gênero não precisa responder todas as acomodações, mas
223
+ * sim o cartucho, obrigatoriamente.»
143
224
  *
144
- * Sem ela a narração cai na voz do navegador (Web Speech), que fala o idioma certo e não pesa nada — e o
145
- * painel de áudio deixa de OFERECER o motor neural, em vez de o oferecer e nunca o carregar.
225
+ * ⚠️ REQUIRED, by the `holdsAtOnce` rubric: there is no safe default — yes mounts the wheelchair in chess, no
226
+ * hides it from the platformer — and forgetting fails INVISIBLY to whoever writes the game. A missing or incomplete
227
+ * answer is a malformed declaration, and the boot REFUSES.
228
+ *
229
+ * 📌 The general ones always mount and the contract's are derived; none of them is answered here.
230
+ */
231
+ readonly accommodations: AccommodationAnswers;
232
+ /**
233
+ * The game's genre, OPTIONAL (ADR-0153), from the engine's list (`core/genres`, ADR-0156): what the game plays like.
234
+ * The cartridge chooses it and nobody assigns it. Casino game and a name outside the list refuse the boot; Horror game
235
+ * boots and `problems` carries its «avoid» mark.
146
236
  */
147
- readonly carregarVozNeural?: CarregarVozNeural;
237
+ readonly genre?: string;
148
238
  /**
149
- * BAIXAR AS COISAS PESADAS NO PRIMEIRO CARREGAMENTO? Padrão **sim** (ADR-0110 (b), ADR-0116, ADR-0119).
239
+ * WHAT THIS GAME USES OF THE VOICE (ADR-0216 §3) — never how. Two answers, and each one is a sentence about the child, not
240
+ * about a library:
241
+ *
242
+ * · `neuralVoice: true` — a child who cannot read is read TO by this game, so it wants a voice even where the device has
243
+ * none of its own. The engine loads Kokoro from the delivery at the first such utterance (ADR-0216 §1); the game names no
244
+ * phonemizer, runtime or model. Absent, no Kokoro voice is listed, the audio panel does not offer the neural engine, and
245
+ * the 371 MiB of model, voices and runtime never enter the delivery.
246
+ * · `reading: true` — a child reads aloud TO this game and it wants the text; the engine decides who hears her, and a
247
+ * delivery carries the reading model of her language because of this answer. Absent, `motor.reading.listen()` refuses and
248
+ * says which line is missing: a game that asks for a microphone it never declared would also be a delivery without the
249
+ * model, which is a silence in a school nobody can debug.
250
+ */
251
+ readonly uses?: {
252
+ readonly reading?: boolean;
253
+ readonly neuralVoice?: boolean;
254
+ };
255
+ /**
256
+ * FETCH THE HEAVY FILES ON THE FIRST LOAD? Default **yes** (ADR-0110 (b), ADR-0116, ADR-0119).
150
257
  *
151
- * As quatro vozes neurais são ~241 MB e descem em SEGUNDO PLANO, uma de cada vez, sem bloquear o jogo: a
152
- * criança joga enquanto elas chegam, e o que não pode acontecer é ela voltar no segundo dia, sem rede, e
153
- * descobrir que a voz nunca foi buscada. O pilar 8 é «primeiro dia ONLINE, depois offline-first», e o
154
- * ADR-0116 tirou a contradição que travava isto — instalar já é um acto de rede.
258
+ * The vision runtime and models, and with `uses.neuralVoice` Kokoro's model, voices and runtime (371 MiB), come down in the
259
+ * BACKGROUND, one at a time, without blocking the game: the child plays while they arrive, and what must not happen is a child
260
+ * back on the second day, offline, finding they were never fetched. Pillar 8 is «first day ONLINE, then offline-first», and
261
+ * ADR-0116 removed the contradiction that blocked this — installing is already a network act.
155
262
  *
156
- * ⚠️ PÔR `false` É PARA QUEM TEM RAZÃO PARA O FAZER, e a razão que já existe é um TESTE: um caso que monte
157
- * o arranque num navegador de verdade não pode disparar 241 MB contra o Hugging Face. Um jogo em produção
158
- * que o desligue está a decidir que a criança dele fica sem voz neural offline.
263
+ * ⚠️ `false` IS FOR WHOEVER HAS A REASON, and the reason that exists is a TEST: a case that mounts the start in a real browser
264
+ * cannot fire hundreds of MB at the network. A game in production that turns it off decides its child has no neural voice offline.
159
265
  *
160
- * 📌 E o ADR-0117 diz que quem devia pagar isto uma vez é a PLATAFORMA, não cada cartucho — a Cache Storage
161
- * é particionada por origem, e num site só os 241 MB descem uma vez para todos os jogos. Enquanto a
162
- * plataforma não os pede, é o jogo que os pede: melhor descer duas vezes do que nunca.
266
+ * 📌 ADR-0117 says the one who should pay this once is the PLATFORM, not each cartridge — the Cache Storage is partitioned by
267
+ * origin, and on one site the heavy files come down once for every game. Until the platform asks for them, the game does: better
268
+ * twice than never.
163
269
  */
164
- readonly baixarPesados?: boolean;
270
+ readonly downloadHeavy?: boolean;
165
271
  /**
166
- * O QUE ACONTECEU COM CADA COISA PESADA, à medida que acontece. Ausente = ninguém está a ver.
272
+ * WHAT HAPPENED TO EACH HEAVY FILE, as it happens. Absent = nobody is watching.
167
273
  *
168
- * ⚠️ É AQUI E NÃO EM `problems` porque a descarga é de FUNDO: `problems` é devolvido sincronamente pelo
169
- * `createGame`, e uma linha que chegue depois disso entra num vector que o leitor já leu. O ADR-0110 pede
170
- * que uma busca falhada seja REPORTADA — reportar é ter um canal que existe quando a notícia chega, e não
171
- * empurrar para uma lista que já foi entregue.
274
+ * ⚠️ HERE AND NOT IN `problems`, because the download runs in the BACKGROUND: `createGame` returns `problems` synchronously, and a
275
+ * line arriving later lands in an array its reader already read. ADR-0110 asks that a failed fetch be REPORTED — reporting is having
276
+ * a channel that exists when the news arrives, not pushing into a list already delivered.
172
277
  *
173
- * 📌 A engine não inventa superfície nenhuma com isto: quem sabe onde cabe «faltam 241 MB» na tela de um
174
- * jogo é o jogo. `pesoPorBaixar(relatorio)` dá o número para a frase.
278
+ * 📌 The engine invents no surface for this: where «N MB left» fits on a game's screen is the game's to know.
279
+ * `bytesLeftToDownload(relatorio)` gives the number for the sentence.
175
280
  */
176
- readonly aoProgredirPesados?: (r: RelatorioPesado) => void;
281
+ readonly onHeavyProgress?: (r: HeavyReport) => void;
177
282
  /**
178
- * Como se descobre que cada transporte está aqui. Ausente = a engine pergunta ao aparelho.
283
+ * How each transport is found to be here. Absent = the engine asks the device.
179
284
  *
180
- * Injetável porque «há um controle ligado?» e «isto é uma tela de toque?» são perguntas ao navegador, e um
181
- * teste que não as possa responder não consegue exercitar a tela que depende delas.
285
+ * Injectable because whether a gamepad is connected and whether this is a touch screen are questions to the browser, and a
286
+ * test that cannot answer them cannot exercise the screen that depends on them.
182
287
  */
183
- readonly disponibilidade?: Disponibilidade;
288
+ readonly availability?: Availability;
184
289
  /**
185
- * O QUE CADA ITEM DO CARTÃO DE PAUSA FAZ NESTE JOGO — «continuar», «sair», «ajuda», o que o jogo ligar.
186
- *
187
- * 🔴 ESTE CAMPO FALTAVA, E A FALTA ALCANÇAVA TODOS OS CONSUMIDORES DE UMA VEZ. O `initPauseIcons`
188
- * aceita `getPauseActs` desde que existe; esta raiz não o passava e não tinha campo para ele, logo
189
- * **nenhum jogo montado por `createGame`** conseguia ligar um item. O `refrescarItensDaPausa` esconde o
190
- * que não acciona — o §5 do ADR-0106, que proíbe botão morto — e o resultado era um cartão com os TRÊS
191
- * itens que a engine acciona sozinha (`ITENS_DA_ENGINE`) e nada mais, em todo o catálogo.
290
+ * WHAT EACH ITEM OF THE PAUSE CARD DOES IN THIS GAME — «continuar», «sair», «ajuda», whatever the game wires.
192
291
  *
193
- * ⚠️ E O CUSTO MAIOR NÃO ERA O CARTÃO, ERA A BARRA. O `entrarNaBarra` chama `acts.resume?.()` para sair
194
- * do cartão antes de entregar as direcções à barra de acessibilidade; com a tabela vazia esse `resume` era
195
- * `undefined`, o cartão ficava por cima do jogo, e o item 7 do ADR-0044 — o direccional a conduzir a barra
196
- * — era **inalcançável a partir de qualquer jogo**.
292
+ * 🔴 The engine hides every item nothing acts on (ADR-0106 §5, no dead buttons — `refreshPauseItems` in
293
+ * `ui/pause-icons`), so without this field a game could wire no item beyond the ones the engine acts on itself
294
+ * (`ENGINE_ITEMS` and the engine's own actions below). The game's table is spread over the engine's, so the game wins.
197
295
  *
198
- * 📌 FUNÇÃO e não valor, pela razão que o próprio `ui/pause-icons` regista: a tabela de um jogo muda
199
- * durante a partida (um «sair» que só liga depois da primeira fase), e congelá-la no arranque já partiu
200
- * um caso lá dentro. Ausente = tabela vazia, que é o comportamento de sempre.
296
+ * 📌 A FUNCTION and not a value, for the reason `ui/pause-icons` records: a game's table changes during a match (a
297
+ * «sair» that is wired only after the first level), and freezing it at boot broke a case there. Absent = only what
298
+ * the engine acts on.
201
299
  */
202
300
  readonly getPauseActs?: () => Record<string, (() => void) | undefined>;
203
301
  /**
204
- * QUEM ABRIU A PAUSA, quando há mais de um assento — o painel de controle edita o assento DESTE índice.
302
+ * WHO OPENED THE PAUSE, when there is more than one seat — the keyboard panel edits the seat of THIS index.
205
303
  *
206
- * ⚠️ A RAIZ JÁ SE DENUNCIAVA POR NÃO TER ISTO: o bloco 4d empurra uma linha de `problems` quando um jogo
207
- * declara mais de um jogador, porque sem ator da pausa a criança do SEGUNDO assento não tem como remapear.
208
- * O que faltava para a linha ser accionável era este campo — até agora ela dizia «conserte» sem haver por
209
- * onde, e a única saída era declarar `semAtorDePausa`, que é aceitar a perda em vez de a corrigir.
304
+ * ⚠️ Without it the child in the SECOND seat cannot remap, and `problems` says so for a game that declares more than
305
+ * one player and does not answer this (`core/cartridge-problems`).
210
306
  */
211
- readonly setPauseActor?: (i: number, ...resto: unknown[]) => void;
307
+ readonly setPauseActor?: (i: number, ...rest: unknown[]) => void;
212
308
  /**
213
- * COMO ESTE JOGO REPINTA PARA ALTO CONTRASTE, e como corrige daltonismo — os dois eixos do ADR-0104.
309
+ * HOW THIS GAME REPAINTS FOR HIGH CONTRAST, and how it corrects colour vision — the two axes of ADR-0104.
214
310
  *
215
- * 🔴 SEM ELES OS ÍCONES ⚫ E 🚥 NÃO SÃO MONTÁVEIS POR NENHUM JOGO. O `iconesQueAccionam` só os monta
216
- * para quem entrega quem os escreve, e essa regra está certa — um ícone que não acciona é pior que um
217
- * ícone a menos. O que estava errado era não haver PORTA: o consumidor externo que mediu isto leu a
218
- * ausência como «este jogo tem os seus próprios controles», o que é verdade sobre o resultado e falso
219
- * sobre a causa. Uma lacuna que o consumidor lê como escolha é a pior forma de lacuna.
311
+ * 🔴 THE ⚫ ICON IS OFFERED ONLY TO A GAME THAT HANDS IN A WRITER. `iconsThatAct` mounts an icon only for whoever
312
+ * hands in its writer, and that rule is right — an icon that acts on nothing is worse than one icon fewer. What
313
+ * these fields add is the DOOR: without it, an outside consumer read the absence as this game having its own
314
+ * controls, true about the result and false about the cause. A gap the consumer reads as a choice is the worst kind.
315
+ * The 🚥 has an engine default (a filter over the world, below); a game that corrects colour in its own render wins.
220
316
  *
221
- * ⚠️ SÃO DOIS CAMPOS E NÃO UM, porque são duas perguntas: um jogo pode saber repintar texturas e não ter
222
- * como corrigir cor, ou o contrário. O `game-pinball` é o segundo caso — a imagem dele é um framebuffer
223
- * de 320x180 sem textura para repintar, e o filtro de cor ele aplica há semanas.
317
+ * ⚠️ TWO FIELDS AND NOT ONE, because they are two questions: a game may know how to repaint textures and have no way
318
+ * to correct colour, or the other way round — `game-pinball`'s image is a 320×180 framebuffer with no texture to
319
+ * repaint, and it applies the colour filter itself.
224
320
  */
225
- readonly setTemaDoJogador?: (i: number, tema: Tema) => void;
226
- readonly setCorrecaoDoJogador?: (i: number, correcao: Correcao) => void;
321
+ readonly setPlayerTheme?: (i: number, theme: Theme) => void;
322
+ readonly setPlayerCorrection?: (i: number, correction: Correction) => void;
227
323
  }
324
+ export type { FlashMeasurement };
228
325
  export interface Engine {
229
326
  readonly declaration: GameDeclaration;
230
327
  /**
231
- * A PAUSA QUE ESTA RAIZ MONTOU — mostrar e esconder, sem o consumidor caçar id nenhum.
328
+ * THE PAUSE THIS ROOT MOUNTED — show and hide, without the consumer hunting for any id.
232
329
  *
233
- * ⚠️ EXISTE PORQUE MONTAR NÃO É MOSTRAR, e a etapa 2 do ADR-0106 tinha ficado a meio sem que nada o
234
- * dissesse. O cartão nasce `hidden` (é assim que o `buildScreenPause` o entrega, e tem de ser: a pausa
235
- * abre-se, não está aberta) e QUEM O REVELA é o `ui/shell`, por fase — que esta raiz **não monta**, de
236
- * propósito: «não substitui o boot do main.js, que tem catorze anos de ordem própria».
330
+ * ⚠️ IT EXISTS BECAUSE MOUNTING IS NOT SHOWING. The card is born `hidden` (that is how `buildScreenPause` delivers
331
+ * it, and it must be: a pause is opened, not open). The engine opens it on SELECT, the ☰ and the quick pause's
332
+ * `action4`; these two let a game open and close it too, without looking for `#vp-pause-0` in the document — exactly
333
+ * the kind of knowledge this file exists not to demand.
237
334
  *
238
- * ⚠️ Sem estas duas, um jogo montado por `createGame` ficava com um cartão de pausa que NADA mostrava. Não
239
- * é «o consumidor esqueceu-se»: não havia por onde, a não ser procurar `#vp-pause-0` no documento — que é
240
- * exactamente o tipo de conhecimento que este ficheiro existe para não exigir.
241
- *
242
- * 📌 A engine OFERECE o mecanismo e não toma a fase. Quando abrir a pausa continua a ser do jogo, porque só
243
- * ele sabe o que é estar a jogar; o que deixa de ser dele é saber COMO.
335
+ * 📌 The engine OFFERS the mechanism and does not take the phase. When to open the pause stays the game's, because
336
+ * only it knows what playing is; what stops being its business is HOW.
244
337
  */
245
- readonly pausa: {
246
- /** Revela o cartão da tela `i` e refaz os itens — o §5 avaliado no instante em que ela abre. */
247
- readonly mostrar: (i: number) => void;
248
- /** Esconde-o outra vez. */
249
- readonly esconder: (i: number) => void;
338
+ readonly pause: {
339
+ /** Reveals screen `i`'s card and rebuilds its items — ADR-0106 §5 evaluated the moment it opens. */
340
+ readonly show: (i: number) => void;
341
+ /** Hides it again. */
342
+ readonly hide: (i: number) => void;
250
343
  };
251
344
  readonly tts: ReturnType<typeof createTts>;
345
+ /**
346
+ * THE CHILD READS ALOUD AND THIS ANSWERS WITH TEXT (ADR-0216, issue #200; the Dev, 2026-09-21: «o jogo… apenas deve pedir
347
+ * para ouvir e receber o texto»). `listen()` ends when she goes quiet or the ceiling falls; `stop()` gives the microphone
348
+ * back; `ready()` says whether this device can hear her language at all. Which recogniser hears her is the engine's
349
+ * business — and never one that would send her voice to a server. A game that wants it declares `uses: { reading: true }`.
350
+ */
351
+ readonly reading: Reading;
352
+ /**
353
+ * THE SOUND CAPTION, hosted by the engine (study item D3; ADR-0014; ADR-0164 rules 4–5): a line for eyes that cannot
354
+ * hear, in the screen footer above the explanation, at most two lines, gone after a moment. Written only while the
355
+ * child has captions on. Pass it as `createAudioEarcons`'s `showCaption`.
356
+ * 📏 Before it, each game wrote its own `#caption` with its own timer (platformer 1300 ms, soccer 2600 ms).
357
+ */
358
+ readonly captionSound: (text: string) => void;
359
+ /**
360
+ * The game speed the child chose on the quick bar (ADR-0180): 1 is 100%, down to 0.5. Pass it as `startLoop`'s REQUIRED
361
+ * `speed` (ADR-0232 D2c), which multiplies the frame time by it; a game that runs its own frames multiplies by this.
362
+ */
363
+ readonly gameSpeed: () => number;
364
+ /**
365
+ * Does the child want the «N de M» said after an item (ADR-0044 item 3)? Read at each announcement: the hearing panel
366
+ * turns it off and on. A game that announces its own items asks here instead of reading the settings store by import
367
+ * (ADR-0232 D2c), as it asks `gameSpeed` — the demo quiz does.
368
+ */
369
+ readonly menuIndexOn: () => boolean;
370
+ /**
371
+ * TRANSLATES IN THIS ROOT'S LANGUAGE (ADR-0232 D3): the root's own `t`, the one every engine module receives. A game that
372
+ * writes its own words asks here instead of importing `core/i18n` — the demo quiz does — as it asks `gameSpeed`.
373
+ */
374
+ readonly t: Translate;
375
+ /**
376
+ * Resolves when the language chosen at boot has loaded — at once for pt (ADR-0232 D3). A game that draws its first screen
377
+ * waits on it, or the screen is born in the fallback language.
378
+ */
379
+ readonly localeReady: () => Promise<void>;
380
+ /**
381
+ * THIS ROOT'S SCREEN-READER ANNOUNCEMENTS (ADR-0232 D4): «polite» (`#sr-status`, does not interrupt) — the announcer every
382
+ * engine module receives. A game announces HERE instead of importing `core/a11y-sr`, which is a factory now: a second
383
+ * announcer would write the same regions but carry none of this root's Libras mirror.
384
+ */
385
+ readonly say: (text: string) => void;
386
+ /** The «assertive» announcement (`#sr-alert`): interrupts and speaks now — errors, a checkmate, a crash. See `say`. */
387
+ readonly alert: (text: string) => void;
388
+ /**
389
+ * SIGNS THIS ROOT'S ANNOUNCEMENTS TOO: every `say`/`alert` — the engine's and the game's — also goes to `sink`, until the
390
+ * returned release. Pass `engine.libras.say`. The root connects nothing by itself (decision DD1, pending the Dev): a game
391
+ * that signed its announcements before connects it here, and a game that did not keeps not signing.
392
+ */
393
+ readonly mirrorAnnouncements: (sink: (text: string) => void) => () => void;
394
+ /**
395
+ * THIS ROOT'S DEAF MODE (ADR-0232 D4): the one the bar's 🦻 toggles. `isOpen` is the child's choice; `say` signs a text
396
+ * while it is open (a queue of one); `tick` opens the interpreter for a choice restored from storage, and a game that
397
+ * signs calls it from its loop; `toggle` flips the mode from a game's own control, confirming in this root's language.
398
+ */
399
+ readonly libras: {
400
+ readonly isOpen: () => boolean;
401
+ readonly say: (text: string) => void;
402
+ readonly tick: () => void;
403
+ readonly toggle: () => void;
404
+ };
405
+ /**
406
+ * THIS ROOT'S SETTINGS STORE (ADR-0232 D4): the child's settings, read through live getters (`settings.blindMode`) and written
407
+ * by the setters, plus the bus a game subscribes and emits on. A game reads HERE instead of importing `core/state`, which is
408
+ * a factory now: a second store would read the same storage but hear none of this root's changes.
409
+ */
410
+ readonly settings: SettingsStore;
411
+ /**
412
+ * THIS ROOT'S INPUT STATE (ADR-0232 D4): the held keys and who pressed them, the transport in use per player, the pads'
413
+ * frames, and `held(player, action)`. A game reads and writes HERE instead of importing `input/state`, which is a factory
414
+ * now: a second instance would hold keys this root's transports never press.
415
+ */
416
+ readonly input: LiveInput;
417
+ /**
418
+ * THIS ROOT'S KEYBOARD MAP and its doors (ADR-0232 D4): `kb()` the live map, `set`, `save`, `reset` (back to the GAME's
419
+ * default, ADR-0115), `factoryWithGame()` and `load()`. For a game with a remapping screen of its own — `game-2048`'s —
420
+ * instead of importing `input/keyboard`'s module map, which no longer exists.
421
+ */
422
+ readonly keyboardConfig: KeyboardConfigApi;
423
+ /**
424
+ * THIS ROOT'S SOUND (ADR-0232 D4): the context (made at the first sound, from the host's window), the master, the mixer and
425
+ * the syntheses. Read through live getters (`audio.soundOn`, `audio.audioCat`) and moved by its methods (`ensureAC()`,
426
+ * `tone(…)`). A game asks HERE instead of importing `platform/audio`, which is a factory now: a second one would make a
427
+ * second context and a second mixer, deaf to this root's volume and categories.
428
+ */
429
+ readonly audio: Audio;
430
+ /**
431
+ * THIS ROOT'S CRT (ADR-0232 D4): its live config, `apply()` (classes on `#game-region`, kept in the store) and
432
+ * `scanVars()`, which re-anchors the scanlines to real pixels. A game that scales its own stage with `ui/layout`'s
433
+ * `createLayout` passes `engine.crt.scanVars` as `afterScale`; a game with a CRT menu of its own reads and writes `cfg`
434
+ * and calls `apply()` here instead of importing `render/crt`, as it asks `gameSpeed`.
435
+ */
436
+ readonly crt: Crt;
437
+ /**
438
+ * THIS ROOT'S L→Q CONTRAST ENHANCEMENT (ADR-0232 D4): `filter()` for composing a CSS filter, `t()` the amount, `set(t)`
439
+ * to change it (kept in the store; the root recomposes the world's filter). A game asks here instead of importing
440
+ * `render/lq-filter`.
441
+ */
442
+ readonly lq: LqFilter;
443
+ /**
444
+ * MEASURES WHAT THE WORLD'S CANVAS FLASHES for `ms`, against the WCAG 2.3.1 general flash threshold (study item B2;
445
+ * `core/flash-threshold`). Only when called — reading pixels every frame costs a school machine (pillar 1), so play never
446
+ * pays for it. A failure is also a line of `problems`. `lido: false` says why nothing was measured (no canvas, a canvas
447
+ * the page may not read, or one that reads transparent, as a WebGL canvas without `preserveDrawingBuffer` does) — never a
448
+ * pass by silence. The red flash is not measured.
449
+ */
450
+ readonly measureFlashes: (ms: number) => Promise<FlashMeasurement>;
252
451
  readonly overlays: SettingsPanelApi;
253
452
  readonly nav: MenuNavApi;
254
453
  readonly keyboard: KeyboardRuntime;
255
454
  /**
256
- * APLICA O FILTRO DE VISÃO NO MUNDO QUE ESTE JOGO DECLAROU (ADR-0087).
455
+ * THE CONTROLLER OBJECT, offered to the cartridge (ADR-0216, in the Dev's words: «Assim como a engine oferece o objeto de
456
+ * controle, ela deve oferecer objetos de leitura e TTS»).
457
+ *
458
+ * 📌 Every transport the engine knows — keyboard, gamepad (ADR-0224), touch, eyes, face, hands, voice, scan — is mounted
459
+ * here and presses this controller by itself. This is for a transport a game mounts ITSELF: pressing a position by hand
460
+ * is telling the engine that the child's device produced that position — with the source, which ADR-0109 demands.
461
+ *
462
+ * ⚠️ What it is NOT: a second way for the game to receive input. The game receives through `onCommand`.
463
+ */
464
+ readonly controller: VirtualController;
465
+ /**
466
+ * APPLIES THE VISION FILTER TO THE WORLD THIS GAME DECLARED (ADR-0087).
257
467
  *
258
- * ⚠️ Existe porque, sem ela, cada consumidor escrevia a sua — e o `game-15puzzle` escreveu, com o
259
- * raciocínio certo e sozinho. O que ela acrescenta é a regra dos MENUS, que um consumidor não tem como
260
- * saber: eles vivem por cima da simulação e são o instrumento de sair dela, então se herdaram o filtro por
261
- * estarem DENTRO do mundo, ele é desfeito neles. Uma cegueira que apagasse o menu de pausa trancaria a
262
- * criança dentro da simulação (#82).
468
+ * ⚠️ It exists because, without it, each consumer wrote its own — and `game-15puzzle` did, with the right reasoning
469
+ * and on its own. What it adds is the rule of MENUS, which a consumer has no way to know: they live over the
470
+ * simulation and are the way out of it, so if they inherited the filter by being INSIDE the world, it is undone on
471
+ * them. A blindness that blacked out the pause menu would lock the child inside the simulation (#82).
263
472
  */
264
- readonly aplicarFiltroDeVisao: (css: string, alcance: AlcanceDoFiltro) => void;
473
+ readonly applyVisionFilter: (css: string, reach: FilterReach) => void;
265
474
  /**
266
- * A NAVEGAÇÃO SONORA, pronta e ligada à declaração deste jogo (item 19).
475
+ * NAVIGATION SOUND, ready and wired to this game's declaration (item 19).
267
476
  *
268
- * Ela vem de graça porque o sonar deixou de precisar de tiles: pergunta topologia (campo 1), alvos (campo
269
- * 5) e nome (campo 3), e o jogo já declarou os três para existir. Era o achado 9 do segundo consumidor —
270
- * "ligá-lo exigiria MENTIR para a engine" —, e a mentira era exigida pela FORMA da pergunta, não pelo som.
477
+ * It comes for free because the sonar no longer needs tiles: it asks for topology (field 1), targets (field 5) and
478
+ * names (field 3), and the game already declared all three to exist. It was finding 9 of the second consumer: wiring
479
+ * the sonar meant LYING to the engine, and the lie was demanded by the SHAPE of the question, not by the sound.
271
480
  */
272
481
  readonly sonar: AudioSonar;
273
482
  /**
274
- * A PILHA DE CENAS (item 22, C3 do ADR-0030), vazia e pronta.
483
+ * THE SCENE STACK (item 22, C3 of ADR-0030), empty and ready.
484
+ *
485
+ * It comes from `createGame` and not from each game for the same reason as the sonar: it is infrastructure. What it
486
+ * replaces is `phase: 'title' | 'playing' | 'paused'` — ONE game's enum that engine modules read, and that a game
487
+ * with a level map or a results screen could not extend without asking the engine for a new constant (ADR-0030
488
+ * records widening the union as a NON-option, and that is why).
489
+ *
490
+ * It is born EMPTY: the game pushes, because which scenes there are is the only part of this that is its own.
491
+ */
492
+ readonly scenes: SceneStack;
493
+ /**
494
+ * TELLS THE CARTRIDGE THE LANGUAGE CHANGED — the only thing it needs to know about it (ADR-0225).
275
495
  *
276
- * Vem de `createGame` e não de cada jogo pelo mesmo motivo do sonar: é infraestrutura, e um jogo que a
277
- * montasse sozinho montaria a décima quinta versão de push/pop. O que ela substitui é o
278
- * `phase: 'title' | 'playing' | 'paused'` — um enum DESTE jogo que doze módulos leem, e que um jogo com
279
- * mapa de fases ou tela de resultados não teria como estender sem pedir constante nova à engine (o ADR-0030
280
- * registra alargar a união como NÃO-opção, e é essa a razão).
496
+ * 📌 The engine already redraws everything that IS its own: the bar, the caption, the card, the pad, an open panel, the
497
+ * voice that speaks and the model that listens. What it cannot redraw is the ACTIVITY — and without this door the
498
+ * cartridge would have to subscribe to `i18n:change` on the window, knowing the event's name and reaching a global to
499
+ * do it. It is the rule the Dev wrote for reading and speech: «o jogo não deve precisar saber como isso funciona»
500
+ * (ADR-0216).
281
501
  *
282
- * Nasce VAZIA: quem empilha é o jogo, porque quais são as cenas é a única parte disto que é dele.
502
+ * ⚠️ Called AFTER the engine has redrawn itself, so the cartridge never sees a half-translated screen.
283
503
  */
284
- readonly cenas: SceneStack;
285
- /** Quantos filtros de daltonismo foram montados. `0` = não havia host, e o menu visual perde metade. */
504
+ readonly onLocaleChange: (fn: () => void) => void;
505
+ /** How many colour-vision filters were mounted. `0` = there was no host, and the visual menu loses half. */
286
506
  readonly cvdFilters: number;
287
- /** O que FALTOU no documento do consumidor. Vazia = o hospedeiro cumpriu o contrato de marcação. */
507
+ /** What the host page lacks and what the cartridge left undone, each line naming its fix. Empty = nothing to fix. */
288
508
  readonly problems: readonly string[];
289
- /** O que este jogo declarou não ter. Devolvido para poder ser auditado — declinar fica no registro. */
509
+ /** What this game declared it does not have. Returned so it can be audited — declining stays on the record. */
290
510
  readonly declines: Declinios;
291
511
  /**
292
- * O ANÚNCIO DE QUE O LAÇO PAROU, pronto para entrar em `startLoop(ticker, quadro, maxDt, { aoFalhar })`.
512
+ * THE ANNOUNCEMENT THAT THE LOOP STOPPED, ready to go into `startLoop(ticker, frame, maxDt, { onFailure })`.
293
513
  *
294
- * ⚠️ O ADR-0054 diz por escrito que fica *"só metade verdadeiro"* enquanto isto não existir, e a metade que
295
- * faltava é a que importa: **criança cega não vê tela congelada.** Sem anúncio, o modo cego não distingue
296
- * «travou» de «está pensando», e o silêncio é a mesma coisa nos dois casos.
514
+ * ⚠️ ADR-0054 says in writing that it is only half true while this does not exist, and the missing half is the one
515
+ * that matters: **a blind child does not see a frozen screen.** Without an announcement, blind mode cannot tell
516
+ * a crash from a pause to think, and the silence is the same in both cases.
297
517
  *
298
- * ⚠️ VEM DA ENGINE E NÃO DE CADA JOGO porque a mensagem é a mesma em todos e o canal (leitor de tela +
299
- * narração + o que se VÊ) é infraestrutura. Mas quem chama `startLoop` é o JOGO — ele é o dono do ticker —,
300
- * então isto é entregue e não instalado: um jogo que monte o laço sem passar isto continua a PARAR, porque
301
- * parar não é opcional; o que ele perde é dizer que parou.
518
+ * ⚠️ IT COMES FROM THE ENGINE AND NOT FROM EACH GAME because the message is the same in all of them and the channel
519
+ * (screen reader + narration + what is SEEN) is infrastructure. The game owns the ticker and calls `startLoop`, whose
520
+ * `onFailure` is REQUIRED (ADR-0232 D4): the game passes this, and no registration in `core/loop` stands in for it.
302
521
  */
303
- readonly aoFalhar: (erro: unknown) => void;
522
+ readonly onFailure: (failure: unknown) => void;
304
523
  /**
305
- * O ALCANCE MEDIDO NO ARRANQUE — a garantia do ADR-0079 §3 como dado, para quem quiser lê-la.
524
+ * THE REACH MEASURED FOR THE MOUNTED CARTRIDGE — ADR-0079 §3's guarantee as data, for whoever wants to read it.
306
525
  *
307
- * A engine já mostrou o aviso se havia o que dizer; isto fica devolvido porque um jogo pode querer decidir
308
- * mais (esconder uma fase que exige doze ações, por exemplo), e porque `ok: false` é o tipo de facto que
309
- * tem de poder ser auditado em vez de ficar só numa tela que já fechou.
526
+ * The engine has already shown the notice if there was something to say; this is returned because a game may want to
527
+ * decide more (hide a level that demands twelve actions, for example), and because `ok: false` is the kind of fact
528
+ * that must be auditable instead of living only on a screen that has closed.
310
529
  */
311
- readonly alcance: Alcance;
530
+ readonly reach: Reach;
312
531
  /**
313
- * TORNA ESTE CARTUCHO O CORRENTE (ADR-0142). Uma raiz de composição, vários jogos.
532
+ * MAKES THIS CARTRIDGE THE CURRENT ONE (ADR-0142). One composition root, several games.
314
533
  *
315
- * ⚠️ **LANÇA** numa declaração malformada, e não a põe em `problems`: o contrato é PRÉ-CONDIÇÃO e não
316
- * diagnóstico, tal como no arranque. Um cartucho mau não chega a ser montado.
534
+ * ⚠️ **THROWS** on a malformed declaration, and does not put it in `problems`: the contract is a PRECONDITION and not
535
+ * a diagnosis, as at boot. A bad cartridge is never mounted.
317
536
  *
318
- * 📌 O que ele refaz é só o que não se conserta lendo de novo: os dois registos de mapeamento, que são
319
- * efeito global, e o alcance com o seu aviso, que escreve DOM. `problems` e `alcance` passam a descrever
320
- * o cartucho montado porque são derivados, não porque `mount` os copie.
537
+ * 📌 What it redoes is only what reading again cannot fix: effects written elsewhere — the two mapping registers, the
538
+ * HUD, the game-options rows, the bar, the reach notice and the pad. `problems` and `reach` describe the mounted
539
+ * cartridge because they are derived when read, not because `mount` copies them.
321
540
  */
322
- mount(declaration: GameDeclaration, ganchos?: GanchosDoCartucho): void;
541
+ mount(declaration: GameDeclaration, hooks?: CartridgeHooks): void;
323
542
  /**
324
- * SOLTA O CORRENTE: mapeamentos a `null`, aviso de alcance retirado, pilha de cenas esvaziada.
543
+ * RELEASES THE CURRENT ONE: mappings set to `null`, reach notice and HUD removed, reading thread
544
+ * closed, scene stack emptied.
325
545
  *
326
- * ⚠️ A pilha esvazia-se com `pop()` e não com um `clear()`, e a diferença é a decisão: 📏 medido nos seis
327
- * jogos, os quatro `exit()` que existem são LIMPEZA DE DOM, logo dispará-los é o teardown que se quer.
328
- * Um `clear()` que os saltasse seria o conserto errado.
546
+ * ⚠️ The stack is emptied with `pop()` and not with a `clear()`, and the difference is the decision: a scene's `exit()`
547
+ * is its DOM cleanup, so running it is the teardown wanted. A `clear()` that skipped them would be the wrong fix.
329
548
  */
330
549
  unmount(): void;
550
+ /**
551
+ * ENDS THIS ROOT: it releases the current cartridge, like `unmount()`, AND STOPS LISTENING TO THE WINDOW.
552
+ *
553
+ * 🔴 The two are separate on purpose, and the separation is the whole point. `unmount()` releases the CARTRIDGE (ADR-0142) and
554
+ * a `mount()` after it must find a root that still hears the keyboard — so `unmount()` may not take the listeners off. But a
555
+ * page that is finished with a root had, until this method existed, no way to say so: the root kept its ~30 window listeners
556
+ * for the lifetime of the document, and since every query it makes is document-wide, it went on driving the pause card of
557
+ * whatever root came after it. 📏 Measured: one ArrowDown moved the cursor one item with one root, two with a second root
558
+ * alive, three with a third.
559
+ *
560
+ * ⚠️ A disposed root is not to be used again: it no longer hears anything. Call it when the page drops the root, not between
561
+ * cartridges — that is what `unmount()` is for.
562
+ */
563
+ dispose(): void;
331
564
  }
332
- /** A metade do jogo SEM a declaração — o que `mount` recebe ao lado dela. */
333
- export type GanchosDoCartucho = Omit<MetadeDoJogo, 'declaration'>;
565
+ /** The game's half WITHOUT the declaration — what `mount` receives beside it. */
566
+ export type CartridgeHooks = Omit<GameHalf, 'declaration'>;
334
567
  /**
335
- * Liga a engine para um jogo declarado.
568
+ * THE GAME'S HALF of `CreateGameOptions` — the fields ADR-0139 §1 says a cartridge SUPPLIES, apart from the ones that
569
+ * describe the page and the device.
336
570
  *
337
- * ⚠️ LANÇA se a declaração for malformada, e NÃO lança se faltar marcação. A diferença não é gosto: uma
338
- * declaração errada é defeito de PROGRAMA, e um jogo que roda meio declarado é pior do que um que não abre;
339
- * um id ausente é lacuna do HOSPEDEIRO, e o quiz provou que ligar só a parte que serve é legítimo — foi
340
- * assim que ele recusou o pad e o sonar sem mentir. Por isso um vira exceção e o outro vira `problems`.
571
+ * The test that record gives: could a PAGE answer this without knowing which game runs? If not, the field is here.
341
572
  */
573
+ type GameHalf = Pick<CreateGameOptions, 'declaration' | 'isNavigable' | 'withIndex' | 'onBar' | 'navBar' | 'players' | 'setPhase' | 'sonarPlayers' | 'isBlindMode' | 'preset' | 'declines' | 'getPauseActs' | 'setPauseActor' | 'setPlayerTheme' | 'setPlayerCorrection' | 'accommodations' | 'genre' | 'onScreenPad' | 'hud' | 'gameOptions' | 'howToPlay' | 'onCommand' | 'gamepad'>;
342
574
  /**
343
- * A METADE DO JOGO de `CreateGameOptions` — os quinze campos que o ADR-0139 §1 diz que um cartucho
344
- * FORNECE, separados dos cinco que descrevem a página e o aparelho.
575
+ * Switches the engine on for a declared game.
345
576
  *
346
- * ⚠️ São quinze e não dez: a primeira versão daquele registo contou quinze campos num total de vinte e
347
- * deixou `declines`, `getPauseActs`, `setPauseActor`, `setTemaDoJogador` e `setCorrecaoDoJogador` de fora.
348
- * O teste que ele próprio dá — «uma PÁGINA conseguiria responder isto sem saber que jogo corre?» — põe os
349
- * cinco deste lado, e a errata de 2026-09-11 corrigiu a lista.
577
+ * ⚠️ THROWS if the declaration is malformed, and does NOT throw if markup is missing. The difference is not taste: a
578
+ * wrong declaration is a PROGRAM defect, and a game that runs half-declared is worse than one that does not open; a
579
+ * missing id is a gap of the HOST, and the quiz proved that switching on only the part that serves is legitimate —
580
+ * that is how it declined the pad and the sonar without lying. So one becomes an exception and the other `problems`.
350
581
  */
351
- type MetadeDoJogo = Pick<CreateGameOptions, 'declaration' | 'isNavigable' | 'comIndice' | 'naBarraDe' | 'navBar' | 'players' | 'setPhase' | 'sonarPlayers' | 'isBlindMode' | 'preset' | 'declines' | 'getPauseActs' | 'setPauseActor' | 'setTemaDoJogador' | 'setCorrecaoDoJogador'>;
352
582
  export declare function createGame(o: CreateGameOptions): Engine;
353
- export {};