@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,146 +1,110 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  import type { PlayerView } from '../core/entity.js';
3
3
  import type { NavKeys } from '../input/edges.js';
4
- import { type Tema, type Correcao, type VisualState } from '../render/viz-axes.js';
4
+ import type { Translate, Translator } from '../core/i18n.js';
5
+ import { type PauseMenuButton, type PauseSub } from './pause-markup.js';
6
+ import { type PauseIcon } from '../core/pause-icon-catalogue.js';
7
+ import { type Theme, type Correction, type VisualState } from '../render/viz-axes.js';
5
8
  import type { MotionSceneFlags, MotionSceneKey, MotionCharDef } from './settings-motion.js';
6
- import type { AudioCatState } from './settings-audio.js';
9
+ import type { AudioCatState } from './audio-choices.js';
10
+ import { type MediaQuery } from '../core/setting-defaults.js';
11
+ import { type CameraControl } from '../core/camera-cycle.js';
7
12
  /**
8
- * A LEGENDA de um ícone da barra de acessibilidade — uma função, e não três cópias da mesma expressão.
13
+ * THE THREE POSITIONS OF ☝️ (ADR-0218): how the child's presses are read.
9
14
  *
10
- * Ela é escrita em TRÊS momentos que parecem diferentes e são o mesmo: o cursor direcional pousa no ícone
11
- * (`ui/menu-nav`), o dedo o aciona, e o mouse ou o foco passa por cima. Enquanto eram três linhas soltas, o
12
- * índice do ADR-0044 teria de ser acrescentado em três lugares — e a chance de um ficar para trás é a mesma
13
- * que este repositório já pagou dezesseis vezes com o `DomQuery`.
14
- *
15
- * O `aria-label` já conta o ESTADO ("Alto contraste, ativado"): é ele que o `reflectIconBtn` reescreve a cada
16
- * mudança, e é por isso que a legenda o lê de volta em vez de recompor o texto por conta própria.
15
+ * They are not three settings but three READINGS of the same press, which is why one icon holds them and why they are shown as
16
+ * one position. `standard` is the press as it arrives; `sticky` makes a tap last until the next one (ADR-0113); `scan` offers
17
+ * the game's positions one at a time and lets any press take the one showing.
17
18
  */
18
- export declare function legendaDoIcone(barra: ParentNode, el: HTMLElement): string;
19
- export interface PauseIcon {
20
- /** `data-pi` key — the dispatch key of iconAct/iconLabel/reflectIconBtn. */
21
- k: string;
22
- /** The emoji glyph rendered inside the button. */
23
- e: string;
24
- /** i18n KEY of the base name; also the `aria-label` when the icon carries no state (or is `soon`). */
25
- n: string;
26
- /** Under construction: the button announces itself and does nothing else. */
27
- soon?: boolean;
28
- }
29
- /** The accessibility shortcut bar at the top of every pause screen (and of the splash `#title-icons`).
30
- * Sound-bound icons (blind/TTS) require a private audio output; webcam/voice are still `soon`.
31
- * VERBATIM from game.js in order and behaviour; the names became i18n keys in the Fase-5 pass. */
32
- export declare const PAUSE_ICONS: readonly PauseIcon[];
33
- export declare function pauseIcon(k: string): PauseIcon | undefined;
34
- /** TEA cycle: 0 = normal · 1 = calmo (reduces) · 2 = silencioso (switches off). Never touches TTS/blind mode. */
35
- export declare const CALM_NAMES: readonly string[];
19
+ export type InputMode = 'standard' | 'sticky' | 'scan';
36
20
  /**
37
- * O nível TEA guardado, saneado. Fora de 0..2 devolve o padrão — dado do navegador é dado de fora, e um
38
- * nível inventado escolheria `CALM_NAMES[3]`, que é `undefined`, e o anúncio ao leitor de tela sairia vazio.
21
+ * Which of the three is showing. The SCAN WINS over the latch on purpose: with one button there is nothing to hold, so a stored
22
+ * latch would otherwise make the icon claim a position the child is not in.
39
23
  */
40
- export declare function saneiaNivelTea(bruto: number): number;
41
- /** The audio categories `applyCalm` governs. TTS/sonar/guarda/guia stay untouched — a calm player still needs them. */
42
- export declare const CALM_AUDIO_CATS: readonly string[];
43
- /** Colour-vision-deficiency cycle, in `player.viz` values. */
44
- export declare const CVD_SEQ: readonly string[];
45
- /** i18n keys of the CVD announcement names, indexed the same as CVD_SEQ.
46
- *
47
- * ⚠️ POSITION 0 IS `cvd.tricro` AND NOT `cvd.off`, AND THE TWO KEYS ARE NOT INTERCHANGEABLE.
48
- * This list names the four CHOICES of the cycle, so position 0 is a way of seeing — trichromatic
49
- * vision, the one that needs no correction — and it is said as one. `cvd.off` below is a FALLBACK
50
- * for `s.viz` values that are not corrections at all, and 13 of the 16 viz modes are exactly that:
51
- * the three simulations, the three contrast levels, the five low-vision modes and blind mode.
52
- * Announcing "trichromatic vision" there would have the software assert what the child sees, while
53
- * she is simulating not seeing it. The choice is named; the fallback is switched off. */
54
- export declare const CVD_NAMES: readonly string[];
55
- /** `player.viz` → i18n key of the label used by iconLabel (anything else falls back to the 'off' key). */
56
- export declare const CVD_LABELS: Readonly<Record<string, string>>;
57
- /** The slice of a player object the pause icons touch. `players` (core/state) is typed `unknown[]`. */
24
+ export declare function inputModeOf(s: {
25
+ readonly toggleMove?: boolean;
26
+ readonly switchScan?: boolean;
27
+ }): InputMode;
28
+ export declare function nextInputMode(m: InputMode, holdsKeys: boolean, latchRequired?: boolean): InputMode;
29
+ import type { Store } from '../platform/storage.js';
58
30
  /**
59
- * A fatia que os ícones de pausa tocam — derivada de core/entity, e SEM assinatura de índice.
60
- *
61
- * Havia uma (`[prop: string]: unknown`), posta ali porque `applyCalm` escreve por nome calculado
62
- * (`p[c.prop] = …`). Era andaime: `c.prop` tem tipo `MotionCharProp`, que é a união literal
63
- * `'rmWalk' | 'rmBreath' | 'rmFlavor'`, e o TypeScript verifica acesso por chave literal sem precisar de
64
- * assinatura nenhuma — bastava que os três campos tivessem nome, que é o que a derivação deu.
31
+ * Hover and focus on a bar's icons write its NAME in the bar's `.pause-icons-cap` and ask for its EXPLANATION.
65
32
  *
66
- * E ela custava caro: uma assinatura de índice aceita QUALQUER propriedade, com valor `unknown`. Enquanto
67
- * existiu, um erro de digitação em qualquer campo deste objeto compilava em silêncio. Quem a denunciou foi
68
- * tipar `core/state.players` como `Player[]`: o compilador recusou converter um `Player` — que não tem
69
- * assinatura de índice — para ela, e essa recusa é a informação.
33
+ * Shared by the per-screen quick bars and the bar the engine mounts in `#title-icons`: two copies of this wiring is
34
+ * how one bar showed the name and the other did not — the Dev found the engine's bar silent on hover and on the
35
+ * cursor. Leaving an icon falls back to the CURSOR of the bar's mode when there is one (`.pi-sel`): it is the only
36
+ * thing saying where that cursor is.
70
37
  */
71
- export type PausePlayer = PlayerView<'visual' | 'toggleMove' | 'walkDir' | 'audioSink' | 'rmWalk' | 'rmBreath' | 'rmFlavor'>;
72
- /** One `.pm-btn` descriptor — the shape of game.js's PM_BTNS (owned by ui/activities-menu). */
73
- export interface PauseMenuButton {
74
- act: string;
75
- /** Só é lido quando o botão tem rótulo dinâmico; ver a nota em `PauseBtnDef` (ui/activities-menu). */
76
- lbl?: string;
77
- /** Dynamic label (the ABC cycle) — rendered from `lbl`, not from i18n, and NOT given `data-i18n`. */
78
- letra?: boolean;
79
- /** Dynamic label (the literacy level) — rendered from quizLevel + qlName. Currently dormant: no PM_BTNS
80
- * entry sets it, but the branch is live code and is ported verbatim. */
81
- nivel?: boolean;
38
+ export declare function wireBarCaption(bar: HTMLElement, explain: (k: string | null) => void): void;
39
+ /**
40
+ * THE SETTINGS THE BAR READS AND WRITES — the page's settings store, built by the root (ADR-0232 D2c, issue #207). The
41
+ * names are `core/state`'s own, so the root passes the store itself; the reads are LIVE (a getter or a live binding),
42
+ * because another surface — the motion panel, a gamepad, a second screen — changes them between two presses.
43
+ */
44
+ export interface PauseIconsSettings {
45
+ /** The «N de M» at the end of an announcement (ADR-0044 item 3). */
46
+ readonly menuIndexOn: boolean;
47
+ readonly gameSpeed: number;
48
+ setGameSpeedValue(speed: number): void;
49
+ readonly cameraControl: CameraControl;
50
+ setCameraControlValue(mode: CameraControl): void;
51
+ readonly voiceControl: boolean;
52
+ setVoiceControlValue(on: boolean): void;
53
+ readonly switchScan: boolean;
54
+ setSwitchScanValue(on: boolean): void;
55
+ /** The blind-mode writer used when the host injects no `setBlindMode`: write, persist, notify. */
56
+ setBlindModeValue(on: boolean): void;
82
57
  }
58
+ /** What the bar reads and writes through: the calm level, the movement latch and the scene flags' default. */
59
+ export type PauseIconsStore = Pick<Store, 'getNum' | 'set' | 'setBool' | 'getJSON' | 'setJSON'>;
60
+ /**
61
+ * The slice of a player the pause icons touch — derived from core/entity, and WITHOUT an index signature: one would
62
+ * accept ANY property with an `unknown` value, so a typo in any field would compile silently. `applyCalm` writes by a
63
+ * computed name (`p[c.prop] = …`), and `c.prop` is the literal union `'rmWalk' | 'rmBreath' | 'rmFlavor'`, which TypeScript
64
+ * checks without any signature.
65
+ */
66
+ export type PausePlayer = PlayerView<'visual' | 'toggleMove' | 'walkDir' | 'audioSink' | 'rmWalk' | 'rmBreath' | 'rmFlavor'>;
83
67
  /** Everything the label/visual of ONE icon depends on, gathered in one value. */
84
68
  export interface IconStateSnapshot {
85
- modoCego: boolean;
69
+ blindMode: boolean;
86
70
  ttsOn: boolean;
87
71
  librasOn: boolean;
88
72
  calmMode: number;
89
73
  toggleMove: boolean;
90
74
  /**
91
- * O estado visual em DOIS EIXOS (#104).
92
- *
93
- * ⚠️ ERA `viz: string`, E O COMENTÁRIO DIZIA: «shared by the contrast and CVD icons (they overwrite each
94
- * other; **that is by design**)». Não era desenho — era o campo único a impor-se, e a frase é o defeito
95
- * escrito como se fosse decisão. Os dois ícones sempre ciclaram DENTRO do seu eixo (`nextContrast` e
96
- * `nextCvd` existem desde sempre, separados); só não tinham onde guardar o resultado sem apagar o vizinho.
75
+ * The visual state on TWO AXES (#104): the contrast icon cycles the theme and the colour icon cycles the correction,
76
+ * each within its own axis, and neither erases the other.
97
77
  */
98
78
  visual: VisualState;
79
+ /** Playing by SPEAKING (ADR-0189): the 👄 of the bar, on or off. */
80
+ voice?: boolean;
81
+ /** Playing with ONE button (ADR-0218): the third position of ☝️, which wins over the latch when it is on. */
82
+ switchScan?: boolean;
83
+ /** The game speed (ADR-0180), a step of `core/game-speed`; absent reads as 100%. */
84
+ speed?: number;
85
+ /** Playing through the webcam (ADR-0215); absent reads as off. */
86
+ camera?: CameraControl;
87
+ /** The current locale (`core/i18n`), for the language button. */
88
+ locale?: string;
99
89
  /** False disables the blind/TTS icons: those need an audio output nobody else is listening to. */
100
90
  privateOutput: boolean;
101
91
  /**
102
- * O aparelho em uso EXIGE a alternância? (ADR-0113 cláusula 3.)
103
- *
104
- * ⚠️ Em olhos, rosto, gestos e fala ela é o que faz a entrada funcionar, logo não há escolha a oferecer.
105
- * O ícone fica desabilitado COM MOTIVO, como o painel — e não pode divergir dele: as duas superfícies
106
- * escrevem o mesmo valor, e uma que aceitasse o clique enquanto a outra recusa deixaria a criança com
107
- * dois botões que discordam sobre o mesmo ajuste.
92
+ * Does the device in use REQUIRE the latch? (ADR-0113 clause 3.) With the eyes, the face, gestures and speech the latch
93
+ * is what makes the input work, so there is no choice to offer: the ☝️ cycle then skips `standard` (see
94
+ * `inputModeOrder`).
108
95
  *
109
- * 🔴 OPCIONAL PORQUE O GATE DA FORMA ME APANHOU: eu escrevi-o obrigatório, e o
110
- * `tests/superficie-publica` reprovou com «ENTROU como obrigatório» — que é uma MUDANÇA QUEBRANTE do
111
- * pacote, porque quem constrói este snapshot passa a ter de o preencher. Foi para isto que o gate da
112
- * FORMA (`2f2582f`) foi escrito, e é a primeira vez que ele apanha um campo A ENTRAR e não a sair.
113
- * Ausente significa «ninguém me disse», que degrada para «não exijo» — o comportamento de hoje.
96
+ * OPTIONAL because adding a required member to a published snapshot is a breaking change (the shape gate,
97
+ * `tests/public-surface-shrinks-by-declaration`, fails on it). Absent means «nobody told me», which degrades to «not required».
114
98
  */
115
- alternanciaExigida?: boolean;
99
+ latchRequired?: boolean;
100
+ /** No voice speaks the current language (ADR-0185): the narration icon is locked. Absent reads as a voice. */
101
+ noVoice?: boolean;
116
102
  }
117
- /** A player has private output when nobody else is on the same sink. Single screen ⇒ always private.
118
- * Pure form of game.js's hasPrivateOutput (see the report: it had no other caller left). */
103
+ /** A player has private output when nobody else is on the same sink. Single screen ⇒ always private. */
119
104
  export declare function hasPrivateOutputIn(list: readonly PausePlayer[], count: number, i: number): boolean;
120
- /** TEA cycle step. */
121
- export declare function nextCalmMode(cur: number): number;
122
- /** Next high-contrast level. An unlisted `viz` (e.g. a CVD filter) is treated as index 0 ⇒ jumps to 'hc-direto'. */
123
- export declare function nextContrast(cur: string | undefined): string;
124
- /** Next CVD filter. NOTE the asymmetry with nextContrast: an unlisted `viz` maps to index 1 ('fix-protan'),
125
- * not 0 — verbatim from game.js (`idx = idx<0 ? 1 : (idx+1)%seq.length`). */
126
- export declare function nextCvd(cur: string | undefined): {
127
- idx: number;
128
- mode: string;
129
- };
130
- /** What `applyCalm` does to ONE audio category, given the TEA level. Extracted so the (destructive) volume
131
- * clamp at level 1 is visible and testable — see the report. */
132
- export declare function calmAudioPlan(calmMode: number, vol: number): {
133
- on: boolean;
134
- vol: number;
135
- };
136
- /** What `applyCalm` does to the scene/character reduced-motion flags. */
137
- export declare function calmMotionPlan(calmMode: number): {
138
- sceneReduced: boolean;
139
- charFrozen: boolean;
140
- };
141
105
  /** The `aria-label` of one icon — it MUST reflect the current state, on/off or level. This is the whole
142
106
  * point of the function: a toggle that looks pressed but does not say so is invisible to a screen reader. */
143
- export declare function computeIconLabel(k: string, s: IconStateSnapshot): string;
107
+ export declare function computeIconLabel(t: Translate, k: string, s: IconStateSnapshot): string;
144
108
  /** The visual state of one icon button. `active` is what becomes `aria-pressed`. */
145
109
  export interface IconVisual {
146
110
  /** `.pi-on` — the yellow "this is on" state. */
@@ -154,316 +118,250 @@ export interface IconVisual {
154
118
  /** aria-pressed: on OR calm OR a CVD tint. */
155
119
  active: boolean;
156
120
  }
157
- /** Pure form of reflectIconBtn's branching. A `soon` icon lands on all-false — it never claims to be on. */
121
+ /** Pure form of reflectIconBtn's branching. */
158
122
  export declare function computeIconVisual(k: string, s: IconStateSnapshot): IconVisual;
159
123
  /** The CSS classes reflectIconBtn clears before applying a fresh visual — in the original order. */
160
124
  export declare const ICON_STATE_CLASSES: readonly string[];
161
- /** One `.pi-btn`. `soon` icons get `.pi-soon` and the "under construction" suffix baked into the aria-label.
162
- * The label is the RESTING one: reflectIconBtn overwrites it with the stateful label as soon as the bar is
163
- * reflected. `ic.n` is an i18n key, so it must be resolved here too — the markup is rendered once at build
164
- * time and would otherwise ship the raw key to a screen reader. */
165
- export declare function iconBtnMarkup(ic: PauseIcon): string;
166
125
  /**
167
- * OS ÍCONES QUE ESTE JOGO CONSEGUE MESMO ACCIONAR (ADR-0106 §5).
168
- *
169
- * ⚠️ NENHUMA ETAPA PODE ENTREGAR BOTÃO MORTO, e o registo diz porquê com todas as letras: «uma barra que
170
- * oferece a uma criança um caminho e depois o recusa é pior do que uma barra que ela vê que não está lá,
171
- * porque a primeira ensina-lhe que o caminho não é para ela».
172
- *
173
- * ⚠️ E O CONTRASTE E A COR SÃO O CASO REAL, medido em 2026-09-08 e diferente dos outros seis campos
174
- * «acidentais»: eles não são estado que um cartucho calhou de guardar — precisam de um `render/viz-setters`,
175
- * cujo contexto tem **34 campos** do grafo de render de UM jogo (`parallaxLayers`, `decoSprites`,
176
- * `getPowerups`, `rebuildCoins`, `worldSprite`…). O `createGame` não monta isso, e um quiz não tem nada
177
- * disso para montar. Então aqui a engine não pode oferecer um padrão — o que ela pode é **não fingir**.
178
- *
179
- * ⚠️ Isto NÃO é o mesmo que `soon`. `soon` é «ainda não construímos»; isto é «este jogo não tem por onde», e
180
- * um botão que anuncia «em breve» diria a coisa errada.
126
+ * THE ICONS THIS GAME CAN ACTUALLY ACTIVATE (ADR-0106 §5): no stage may ship a dead button — «a bar that offers a child a
127
+ * way and then refuses it is worse than a bar she sees is not there, because the first teaches her the way is not for
128
+ * her». An icon with nothing to activate it is not mounted, rather than mounted to announce «soon».
181
129
  */
182
- export interface AccionaveisDoJogo {
183
- /** Há quem escreva o TEMA (o alto contraste)? Sem ele, o ícone `contrast` não é montado. */
184
- readonly tema: boolean;
185
- /** Há quem escreva a CORREÇÃO de cor? Sem ela, o ícone `cvd` não é montado. */
186
- readonly correcao: boolean;
130
+ export interface ActionableIcons {
131
+ /** Is there anyone to write the THEME (high contrast)? Without it, the `contrast` icon is not mounted. */
132
+ readonly theme: boolean;
133
+ /** Is there anyone to write the colour CORRECTION? Without it, the `cvd` icon is not mounted. */
134
+ readonly correction: boolean;
187
135
  /**
188
- * ESTE JOGO SEGURA ALGUMA TECLA? — `GameDeclaration.seguraTeclas`, o campo do ADR-0115.
136
+ * DOES THIS GAME HOLD ANY KEY? — `GameDeclaration.holdsKeys`, the field of ADR-0115.
189
137
  *
190
- * 🔴 Sem ele o ícone `altmove` não é montado, e a AUSÊNCIA é a decisão. A alternância existe para quem não
191
- * consegue manter uma tecla premida; num jogo onde nada se segura ela não tem o que travar, e um controle
192
- * que não faz nada ensina a uma criança que o ajuste de que ela depende está partido.
138
+ * The latch exists for whoever cannot keep a key pressed; in a game where nothing is held it has nothing to hold, and a
139
+ * control that does nothing teaches a child that the setting she depends on is broken. (A different absence from
140
+ * ADR-0113 clause 3's, where the device REQUIRES the latch: see `latchRequired`.)
193
141
  *
194
- * ⚠️ E ISTO É UMA AUSÊNCIA DIFERENTE DA DO ADR-0113 cláusula 3, que também vive neste ficheiro: lá o
195
- * controle fica DESABILITADO com o motivo, porque o aparelho EXIGE a alternância e ela não se pode
196
- * desligar. Aqui não há nada a travar, e um controle que explica por que não faz nada continua a ser um
197
- * controle que não faz nada.
142
+ * A FUNCTION, not a value (as in ADR-0084): an answer read once goes stale silently, and with one `createGame` serving
143
+ * several cartridges (ADR-0142) the icon would describe the game that booted first.
144
+ */
145
+ readonly holdsKeys: () => boolean;
146
+ /**
147
+ * HOW MANY POSITIONS THIS GAME DECLARED (`CreateGameOptions.preset`, ADR-0162) — what a scan would have to offer (ADR-0218).
148
+ * A function like its neighbour, so a cartridge mounted later answers for itself (ADR-0142); absent reads as none.
149
+ */
150
+ readonly declaredPositions?: () => number;
151
+ /**
152
+ * Does this game's time run by itself? (`tick: 'clock'`, ADR-0180.) Without it the hourglass is not mounted. A function,
153
+ * like `holdsKeys`, so a cartridge mounted later answers for itself (ADR-0142).
154
+ */
155
+ readonly clock?: () => boolean;
156
+ /**
157
+ * Does anyone know how to walk the typography cycle? (ADR-0149 §1.)
198
158
  *
199
- * ⚠️ É FUNÇÃO E NÃO VALOR, e a razão é a mesma do ADR-0084: uma resposta lida uma vez envelhece em
200
- * silêncio. Aqui envelhecia no pior sítio — o `reflectPauseIcons` existe justamente porque «a tabela de
201
- * acções deste jogo pode ter mudado desde a montagem» (ADR-0106 §5), e refrescava a partir de um booleano
202
- * congelado no arranque. Com um `createGame` a servir vários cartuchos (ADR-0142), o ícone descrevia o
203
- * jogo que arrancou primeiro. O contrato nunca esteve errado: `GameDeclaration.seguraTeclas` já é função.
159
+ * OPTIONAL, absent meaning `false` — unlike `holdsKeys`, which is required because both of its values can be wrong.
160
+ * Here `false` hides an icon that would do nothing, which is exactly what ADR-0106 §5 wants.
204
161
  */
205
- readonly seguraTeclas: () => boolean;
162
+ readonly typography?: boolean;
163
+ /** Can this device play through the webcam — is there a camera to ask for? Without it the 📷 is not mounted (ADR-0215). */
164
+ readonly camera?: boolean;
165
+ /** Is there a microphone to ask for? Without one the 👄 is not mounted. */
166
+ readonly microphone?: boolean;
167
+ /** Is there a card of menus to open? Without it the ☰ is not mounted. */
168
+ readonly menus?: boolean;
206
169
  }
207
170
  /**
208
- * @deprecated O nome dizia «escritores VISUAIS» e a pergunta deixou de ser só visual quando o `seguraTeclas`
209
- * entrou (ADR-0115). Use `AccionaveisDoJogo`. O alias fica para o consumidor não pagar duas quebras no mesmo
210
- * major — uma pelo campo novo e outra pelo nome.
211
- */
212
- export type EscritoresVisuais = AccionaveisDoJogo;
213
- export declare function iconesQueAccionam(escritores: AccionaveisDoJogo): readonly PauseIcon[];
214
- /**
215
- * OS TRÊS ITENS QUE A ENGINE ACCIONA SOZINHA, e que por isso nunca dependem do `getPauseActs` de um jogo.
216
- *
217
- * 📏 Lidos do despacho, e não decididos aqui: `options`/`pmback` trocam qual lista está no cartão e
218
- * `acessibilidade` leva o cursor à barra rápida — os três são tratados neste módulo e voltam antes de a
219
- * tabela do jogo ser consultada.
220
- */
221
- export declare const ITENS_DA_ENGINE: ReadonlySet<string>;
222
- /**
223
- * OS ITENS DO MENU QUE ESTE JOGO CONSEGUE MESMO ACCIONAR (ADR-0106 §5).
224
- *
225
- * ⚠️ HOJE UM ITEM SEM ACÇÃO É UM BOTÃO MORTO, E EM SILÊNCIO. O despacho faz `const fn = acts[act]; if (fn)
226
- * fn();` — quem carrega num item que o jogo não implementou não recebe erro, não recebe anúncio, não recebe
227
- * nada. Para quem vê, parece que o clique falhou; para quem navega por leitor de tela, o menu leu-lhe um
228
- * item que não existe. É exactamente o que o §5 chama de pior do que a ausência: «uma barra que oferece um
229
- * caminho e depois o recusa ensina-lhe que o caminho não é para ela».
230
- */
231
- export declare function itensQueAccionam(botoes: readonly PauseMenuButton[], acts: Record<string, (() => void) | undefined>): readonly PauseMenuButton[];
232
- /**
233
- * A LISTA RAIZ, com uma regra a mais: `options` é uma PORTA, e uma porta para uma sala vazia também é um
234
- * botão morto.
235
- *
236
- * ⚠️ Esta é a parte que um filtro item-a-item não apanha. Se todos os painéis de ajuste forem filtrados —
237
- * um jogo que não monta nenhum —, o item `options` sobrevive (a engine acciona-o) e abre uma lista sem nada.
238
- * A criança atravessa uma porta e fica presa num submenu vazio, cuja única saída é o `pmback` que também
239
- * sumiu com ele.
240
- */
241
- export declare function raizQueAcciona(raiz: readonly PauseMenuButton[], opcoes: readonly PauseMenuButton[], acts: Record<string, (() => void) | undefined>): readonly PauseMenuButton[];
242
- /** The whole icon bar. Used by the pause screen AND by the splash `#title-icons` (which built the same string
243
- * by hand in game.js — that duplication dies with this export).
244
- * O parâmetro é ADITIVO e o padrão é a lista inteira: quem já chamava sem argumentos não muda de resultado. */
245
- export declare function iconsMarkup(icones?: readonly PauseIcon[]): string;
246
- /** One `.pm-btn`. Dynamic labels (`letra`/`nivel`) are rendered eagerly and carry NO `data-i18n`, so
247
- * i18n.applyDom() cannot overwrite them. */
248
- /**
249
- * ⚠️ O RÓTULO DINÂMICO ENTRA PRONTO (item 19), e a mudança conserta DUAS coisas de uma vez.
250
- *
251
- * A linha era `'📚 Nível ' + level + ' · ' + qlName[level]` — e ela tinha dois defeitos que só se enxergam
252
- * juntos:
253
- *
254
- * 1. FRONTEIRA. `level` vinha de `core/state.quizLevel` e `qlName` de uma tabela do jogo. Um menu de pausa
255
- * da ENGINE montava o rótulo de uma atividade de alfabetização — conteúdo pedagógico, não mecânica.
256
- * 2. IDIOMA. "Nível" é pt-BR CRU dentro de um módulo de engine. O gate do item 14 vigia o `main.js` e não
257
- * alcança `ui/`, então esta linha atravessou a i18n inteira sem ser vista. Num build em inglês, o menu
258
- * de pausa de uma criança dizia "📚 Nível 2 · …".
259
- *
260
- * Agora o jogo entrega a frase montada (`dynLabel`), e a engine só a coloca no botão. O jogo é quem sabe o
261
- * que é um nível, quem sabe o nome dele e quem sabe em que idioma dizê-lo.
262
- */
263
- export declare function pmBtnMarkup(b: PauseMenuButton, dynLabel: (b: PauseMenuButton) => string | null, tr: (key: string) => string): string;
264
- /**
265
- * Qual das duas listas o cartão de pausa está mostrando.
266
- *
267
- * DUAS listas no markup, UMA visível — e a escondida carrega `hidden`, que a tira da árvore de acessibilidade
268
- * inteira. É o que faz "um menu por tela" (ADR-0044 §5) valer para quem escuta e não só para quem vê, e é o
269
- * que permite o anel dar a volta DENTRO da lista visível sem nunca atravessar para a outra.
171
+ * @deprecated The name said «VISUAL writers», and the question stopped being only visual when `holdsKeys` joined it
172
+ * (ADR-0115). Use `ActionableIcons`.
270
173
  */
271
- export type PauseSub = 'raiz' | 'opcoes';
174
+ export type VisualWriters = ActionableIcons;
175
+ export declare function iconsThatAct(writers: ActionableIcons): readonly PauseIcon[];
272
176
  /**
273
- * Os itens navegáveis de um cartão de pausa — os da lista VISÍVEL, e só eles.
274
- *
275
- * Uma constante porque TRÊS módulos a consultam (a navegação em `ui/menu-nav`, a seleção inicial em
276
- * `ui/shell` e a troca de submenu aqui). Enquanto fosse `.pm-btn` escrito três vezes, bastaria um deles
277
- * esquecer o `:not([hidden])` para o anel atravessar para a lista invisível — e a criança ouviria itens de um
278
- * menu que não está na tela.
177
+ * THE ROOT LIST, with one more rule: `options` is a DOOR, and a door to an empty room acts no more than a dead button.
178
+ * An item-by-item filter misses this: the engine activates `options` itself, so it would pass and open a list with
179
+ * nothing in it.
279
180
  */
280
- export declare const PM_ITENS_VISIVEIS = ".pause-menu:not([hidden]) .pm-btn";
281
- /** O innerHTML de UMA `.pause-menu`: a lista, e só ela. */
282
- export declare function pauseMenuHtml(bs: readonly PauseMenuButton[], sub: PauseSub, dynLabel: (b: PauseMenuButton) => string | null, tr: (key: string) => string): string;
181
+ export declare function rootThatActs(rootEl: readonly PauseMenuButton[], options: readonly PauseMenuButton[], acts: Record<string, (() => void) | undefined>, fromGame?: readonly PauseMenuButton[]): readonly PauseMenuButton[];
283
182
  /**
284
- * Troca a lista visível de UM cartão de pausa, e põe o cursor no PRIMEIRO item da lista que entrou.
183
+ * The navigable items of a pause card — those of the VISIBLE list, and only those.
285
184
  *
286
- * Livre (e não um método do `init`) de propósito: `ui/menu-nav` precisa dela para o "não" voltar da lista de
287
- * opções à raiz, e não tem acesso às tabelas de botões. Como as duas listas já existem no markup, a troca é
288
- * só DOM — nada a re-renderizar, nada a injetar.
185
+ * One constant because THREE modules ask (navigation in `ui/menu-nav`, the first selection in `ui/shell` and the list
186
+ * switch here): if one of them forgot `:not([hidden])`, the ring would step into the invisible list and the child would
187
+ * hear items of a menu that is not on screen. `:not([hidden])` on the ITEM too: a hidden item must not be reached nor
188
+ * counted in «N de M» (a locked one is not hidden — it is reached, and says why).
289
189
  */
290
- export declare function mostrarSubmenuDaPausa(sp: HTMLElement, sub: PauseSub): HTMLElement | null;
190
+ export declare const PM_VISIBLE_ITEMS = ".pause-menu:not([hidden]) .pm-btn:not([hidden])";
291
191
  /**
292
- * A BARRA RÁPIDA DE ACESSIBILIDADE — dez alternadores e a legenda que os explica (ADR-0044, item 7).
192
+ * Switches the visible list of ONE pause card, and puts the cursor on the FIRST item of the list that came in.
293
193
  *
294
- * Saiu do cartão de pausa e passou a viver no HUD. O motivo é de uso, não de arrumação: é DURANTE a partida
295
- * que uma criança precisa mudar um ajuste que está a atrapalhando, e não depois de pausar. E o motivo
296
- * secundário é estrutural — sem ela, o cartão deixa de ter duas zonas e vira uma LISTA, o que é o que
297
- * finalmente autoriza o anel (a XAG 106 permite laço para menu linear e o proíbe para grade).
298
- *
299
- * A LEGENDA VIAJA JUNTO. Ela é a dica que substitui, para quem não vê, o `title` que só o mouse revela;
300
- * deixá-la no cartão tornaria a barra do HUD muda.
194
+ * Free-standing (not a method of `init`) on purpose: `ui/menu-nav` needs it for «no» to go back to the root, and it has no
195
+ * access to the button tables. Every list already exists in the markup, so the switch is DOM only.
301
196
  */
302
- export declare function quickBarMarkup(icones?: readonly PauseIcon[]): string;
197
+ export declare function showPauseOptions(sp: HTMLElement, sub: PauseSub): HTMLElement | null;
303
198
  /**
304
- * O QUE UMA INTENÇÃO SIGNIFICA DENTRO DO MODO `accessibility` (ADR-0044, item 7).
199
+ * WHAT AN INTENT MEANS INSIDE THE `accessibility` MODE (ADR-0044 item 7).
305
200
  *
306
- * O registro listou este modo entre as consequências NEGATIVAS da decisão, e disse por quê: "um modo em que
307
- * se entra e não se sabe sair é a própria armadilha de que este registro trata — então a saída dele (START ou
308
- * VOLTAR) é parte da decisão, e não um detalhe de implementação".
201
+ * The record lists this mode among the decision's NEGATIVE consequences, and says why: a mode one enters and does not
202
+ * know how to leave is the very trap the record is about — so its way out (START or BACK) is part of the decision.
309
203
  *
310
- * Daí a forma desta função: SAIR vem primeiro, e vem por DUAS portas. Não é redundância. VOLTAR é a saída de
311
- * tudo no jogo, e é o que quem já o conhece tenta primeiro; START é o botão que ABRE a pausa, e a pausa é de
312
- * onde se entrou aqui — quem se perde tenta voltar por onde veio. Ter só uma das duas seria apostar que a
313
- * criança adivinhe qual delas foi escolhida.
204
+ * Hence the shape: LEAVING comes first, through TWO doors. BACK is the way out of everything in the game, the one a child
205
+ * who knows it tries first; START is the button that OPENS the pause, and the pause is where this mode was entered from —
206
+ * whoever gets lost tries to go back the way they came. One door only would be betting that the child guesses which.
314
207
  *
315
- * E a precedência é decisão também: um controle registra mais de uma borda no mesmo quadro (dedos apertam
316
- * junto), e nesse quadro `sair` não pode ficar atrás de `ativar`.
208
+ * The precedence is a decision too: a controller can report more than one edge in the same frame (fingers press
209
+ * together), and in that frame leaving must not come after activating.
317
210
  */
318
- export type AcaoNaBarra = 'sair' | 'ativar' | 'andar' | 'nada';
319
- export declare function acaoNaBarra(k: NavKeys, temStart: boolean): AcaoNaBarra;
320
- export interface ScreenPauseMarkupOpts {
321
- /** Screen/player index (0-based); the dialog label and the "· Jogador N" suffix are 1-based. */
322
- player: number;
323
- /** Live player count — the suffix only appears in multiplayer. */
324
- numPlayers: number;
325
- /** A lista RAIZ: os sete itens do ADR-0044, `resume` primeiro e `quit` último. */
326
- pmButtons: readonly PauseMenuButton[];
327
- /** O submenu de opções: os sete painéis de ajuste, com o "Voltar" na frente. */
328
- optionsButtons: readonly PauseMenuButton[];
329
- /** Rótulo pronto de um botão DINÂMICO, ou `null` se aquele botão não tem um. Quem monta a frase é o jogo. */
330
- dynLabel: (b: PauseMenuButton) => string | null;
331
- t: (key: string) => string;
332
- }
333
- /** The full innerHTML of a `.screen-pause`. Pure — every input is a parameter. */
334
- export declare function screenPauseMarkup(o: ScreenPauseMarkupOpts): string;
211
+ export type BarAction = 'sair' | 'ativar' | 'andar' | 'nada';
212
+ export declare function barAction(k: NavKeys, hasStart: boolean): BarAction;
335
213
  export interface PauseIconsCtx {
336
214
  /**
337
- * O DOCUMENTO onde a pausa e a barra são CONSTRUÍDAS. Ausente, vale o global.
338
- *
339
- * ⚠️ ISTO É O ACHADO 15 OUTRA VEZ, e o `boot/create-game` já o descreve no próprio cabeçalho: «`initI18n()`
340
- * chamava `applyDom(document)`, o GLOBAL, por baixo de quem a chamasse. Num navegador dá no mesmo e por
341
- * isso sobreviveu; num teste de lógica pura é a diferença entre bootar e não bootar, e num futuro com dois
342
- * documentos (uma engine em iframe, um editor ao lado do jogo) seria a diferença entre traduzir o documento
343
- * certo e o outro.»
344
- *
345
- * 📏 Medido em 2026-09-08: as duas metades que constroem DOM (`buildScreenPause`, `buildQuickBar`) faziam
346
- * `document.createElement` no global. Enquanto a raiz de composição de cada jogo era um `main.ts` a correr
347
- * num navegador, dava no mesmo — e foi por isso que sobreviveu. Deixa de dar assim que a ENGINE monta,
348
- * porque o `createGame` recebe o documento por `host.doc` e pode estar a montar noutro.
215
+ * The root's translator (ADR-0232 D3 erratum): its `t`, the page's language — the 🌐 shows it as a flag — and the setter
216
+ * the 🌐 switches it with. A Pick and not a bare `t`, because the bar reads and sets the language.
349
217
  */
350
- doc?: Document;
351
- /** Quantos jogadores/telas. Estado de RODADA (ADR-0038): vem da instância que a raiz possui.
352
- * Era `numPlayers`, um `let` de `core/state` importado como binding vivo — e um `let` de módulo
353
- * é compartilhado por qualquer segundo jogo que a mesma página carregue (D13 do `demos`). */
218
+ translator: Pick<Translator, 't' | 'locale' | 'setLocale'>;
219
+ /**
220
+ * The DOCUMENT where the pause card and the bar are BUILT. REQUIRED (ADR-0232 D4): `createGame` receives its document
221
+ * through `host.doc` and may be building in another one (an iframe, an editor beside the game), and a fallback to the
222
+ * global would put the card in the wrong document — or throw where there is none.
223
+ */
224
+ doc: Pick<Document, 'createElement'>;
225
+ /** How many players/screens. ROUND state (ADR-0038): it comes from the instance the host owns — a module-level
226
+ * binding would be shared by a second game on the same page. */
354
227
  getNumPlayers: () => number;
355
- /** Os jogadores. Estado de RODADA, pelo mesmo motivo. `readonly unknown[]` porque cada consumidor
356
- * estreita para a SUA fatia — o tipo real é do jogo, não da engine (ADR-0033). */
228
+ /** The players. ROUND state, for the same reason. `readonly unknown[]` because each consumer narrows to ITS slice —
229
+ * the real type is the game's, not the engine's (ADR-0033). */
357
230
  getPlayers: () => readonly unknown[];
358
231
  /** aria-live "polite" — every successful toggle announces its NEW state. */
359
232
  srSay: (text: string) => void;
360
- /** aria-live "assertive" — the two refusals (`soon` icon, shared audio output). */
233
+ /** aria-live "assertive" — the refusals (a shared audio output, a device that always latches). */
361
234
  srAlert: (text: string) => void;
362
235
  /**
363
- * As BARRAS RÁPIDAS por tela (`.screen-a11y`), na ordem dos jogadores.
364
- *
365
- * Existe pelo mesmo motivo de `getPauseScreens`: `buildGameHud` REATRIBUI a array a cada remontagem, então
366
- * o que se injeta é o getter e não a array. E existe separada da pausa porque, desde o item 7, a barra não
367
- * mora mais dentro dela — o daltonismo é POR JOGADOR, e refletir os ícones exige achar a barra daquela tela.
236
+ * Called after EVERY exit from the bar mode, with the screen and whether it was silent. Absent, nothing happens. It lets
237
+ * the root unfreeze the game whichever door was used (ADR-0155) — the bar knows nothing of phases.
238
+ */
239
+ onLeaveBar?: (i: number, silent: boolean) => void;
240
+ /**
241
+ * The icon screen `i` is pointing at — by the cursor of the bar, or hover/focus — or `null` when nothing is. The
242
+ * root writes that icon's EXPLANATION in the footer (the Dev: the name below the row, what it does in the footer;
243
+ * `CLAUDE.md` §4, the three zones). Absent, the bar still shows the name.
244
+ */
245
+ explainIcon?: (i: number, k: string | null) => void;
246
+ /** A text for the screen footer — the reason of a locked pause item (ADR-0161) — or `null` to clear it. */
247
+ explainItem?: (text: string | null) => void;
248
+ /**
249
+ * The per-screen QUICK BARS (`.screen-a11y`), in player order. A getter, because the host rebuilds them when the number of
250
+ * screens changes. Separate from the pause card because the bar does not live inside it (ADR-0044 item 7) — colour
251
+ * correction is PER PLAYER, and reflecting the icons means finding that screen's bar.
368
252
  */
369
253
  getA11yBars: () => readonly HTMLElement[];
370
- /** PM_OPTIONS_BTNS — o submenu de opções. Mesma dona, mesmo motivo: ninguém tem duas cópias de uma lista. */
254
+ /** PM_OPTIONS_BTNS — the options sub-list. */
371
255
  optionsButtons?: readonly PauseMenuButton[];
372
- /** PM_BTNS — the `.pm-btn` list. Owned by ui/activities-menu; injected, never copied. */
256
+ /** The GAME's list (ADR-0146). Absent = `PM_GAME_BTNS`, which is only «back» — and the door drops by itself. */
257
+ gameButtons?: readonly PauseMenuButton[];
258
+ /** PM_BTNS — the root `.pm-btn` list (`ui/pause-buttons`). */
373
259
  pmButtons?: readonly PauseMenuButton[];
374
- /** QL_NAME — literacy-level names, for the (dormant) `nivel` button. Same owner as pmButtons. */
375
260
  /**
376
- * O RÓTULO de um botão dinâmico, pronto — ou `null` quando aquele botão não tem um (item 19).
377
- *
378
- * Era `quizLevel` (importado de `core/state`) mais `qlName` (tabela do jogo), e este módulo montava a
379
- * frase. Um menu de pausa da ENGINE não sabe o que é nível de alfabetização, nem em que idioma dizê-lo.
380
- * Função e não valor, porque o rótulo muda em execução — de nível E de idioma.
261
+ * The ready LABEL of a dynamic button, or `null` when that button has none. A function, because the label changes at run
262
+ * time — in value and in language. A pause card of the ENGINE does not know what a literacy level is, nor how to say it.
381
263
  */
382
- /** O rótulo dinâmico, pronto — ou `null`. Ausente: nenhum botão deste jogo tem rótulo dinâmico. */
383
264
  dynLabel?: (b: PauseMenuButton) => string | null;
384
- /** The `.pm-btn` action table. LAZY: `pauseActs` is a `const` declared far below the init site in game.js. */
265
+ /** The `.pm-btn` action table, asked when an item is pressed (so it can be wired after this module). */
385
266
  getPauseActs?: () => Record<string, (() => void) | undefined>;
386
- /** Records which player opened the menu. `pauseActor` itself stays in game.js — the gamepad, the keyboard
387
- * router, openHelp() and openOptions() all read it there. */
267
+ /** Records which player opened the card; the panels open scoped to that player. */
388
268
  setPauseActor?: (i: number) => void;
389
- getModoCego: () => boolean;
390
- setModoCego?: (on: boolean) => void;
269
+ getBlindMode: () => boolean;
270
+ setBlindMode?: (on: boolean) => void;
391
271
  /**
392
- * O mixer por categoria. NULO até `initAudioMixer()` — `platform/audio` o declara
393
- * `Record<string, CatState> | null` porque o import dele é PURO (não lê localStorage), e quem inicializa
394
- * é o boot do consumidor. Este ctx pedia não-nulo, o que era uma promessa que a fonte não faz.
272
+ * The mixer by category. NULL until `initAudioMixer()`: `platform/audio`'s import is PURE (it reads no storage), and the
273
+ * host's boot initialises it.
395
274
  */
396
275
  getAudioCat: () => Record<string, AudioCatState> | null;
397
276
  /** Re-applies a category's gain node after `on`/`vol` changed. */
398
277
  setCatGain: (k: string) => void;
399
- /** Repaints the TTS row of the auditory panel. See BUG #1 in the report: in game.js this call is behind a
400
- * `typeof reflectTTS==='function'` guard on a symbol that no longer exists, so it never fires. The guard is
401
- * ported verbatim as `reflectTtsPanelEnabled` below rather than silently fixed. */
278
+ /** Repaints the TTS row of the auditory panel after the icon changes it. */
402
279
  reflectTtsPanel: () => void;
403
- /** Verbatim port of game.js's dead guard: `typeof reflectTTS === 'function'`. Pass `false` to preserve
404
- * today's behaviour (the panel is NOT refreshed), `true` to restore the intended call. */
280
+ /** Whether the TTS icon also calls `reflectTtsPanel`. `createGame` passes `true`; `false` leaves the panel as it was. */
405
281
  reflectTtsPanelEnabled: boolean;
406
282
  isLibrasOn: () => boolean;
407
283
  toggleLibras: () => void;
284
+ /**
285
+ * THE PAGE'S STORE, built by the root (ADR-0232, issue #207): the calm level, the movement latch's default writer and the
286
+ * scene flags' default read and write through it. REQUIRED: a bar that stored nowhere would forget the calm level at every
287
+ * visit — for the child whom unexpected noise costs most — with no error at all.
288
+ */
289
+ store: PauseIconsStore;
290
+ /**
291
+ * THE PAGE'S SETTINGS STORE (ADR-0232 D2c): what the icons read and cycle — game speed, the camera and voice controls,
292
+ * switch scanning, the menu index — and the default blind-mode writer. REQUIRED: a bar reading settings from nowhere
293
+ * would show every icon at its default and write the child's choice where no game reads it.
294
+ */
295
+ settings: PauseIconsSettings;
408
296
  rm?: MotionSceneFlags;
409
297
  rmKeys?: readonly MotionSceneKey[];
410
298
  rmChar?: readonly MotionCharDef[];
411
299
  saveRM?: () => void;
300
+ /**
301
+ * The browser's media query (`win.matchMedia`), asked for `prefers-reduced-motion` when `rm` is absent and nothing is
302
+ * stored. MANDATORY and injected (ADR-0232, ADR-0227): this module reaches no global, and an optional port would let a
303
+ * host forget it and switch the animation back on for a child whose system asked for less.
304
+ */
305
+ matchMedia: MediaQuery;
412
306
  setToggleMove?: (i: number, on: boolean) => void;
413
307
  /**
414
- * QUAL APARELHO ESTE JOGADOR ESTÁ A USAR (ADR-0113).
415
- *
416
- * 📌 O ícone `altmove` desta barra é a OUTRA superfície que escreve a alternância — a mesma razão pela
417
- * qual o escritor voltou para a engine (ADR-0106 §4). Sem este campo, ele escreveria só a chave antiga
418
- * enquanto o painel escreve as duas, e as duas superfícies divergiriam em silêncio.
308
+ * WHICH DEVICE THIS PLAYER IS USING (ADR-0113). The `altmove` icon is the OTHER surface that writes the latch, besides
309
+ * the panel: without this it would write a different key from the panel's, and the two surfaces would disagree silently.
419
310
  */
420
- transporteEmUso?: (jogador: number) => string;
311
+ transportInUse?: (player: number) => string;
421
312
  setPlayerViz?: (i: number, mode: string) => void;
422
- /** Os escritores POR EIXO (#104): mexer no tema não apaga a correção, e vice-versa. */
423
- setTemaDoJogador?: (i: number, tema: Tema) => void;
424
- setCorrecaoDoJogador?: (i: number, correcao: Correcao) => void;
313
+ /** The writers PER AXIS (#104): changing the theme does not erase the correction, and vice versa. */
314
+ setPlayerTheme?: (i: number, theme: Theme) => void;
315
+ setPlayerCorrection?: (i: number, correction: Correction) => void;
425
316
  /**
426
- * ESTE JOGO SEGURA ALGUMA TECLA? — o valor de `GameDeclaration.seguraTeclas` (ADR-0115). Sem ele o ícone
427
- * `altmove` não é montado.
428
- *
429
- * ⚠️ OBRIGATÓRIO, e vai contra a direcção do ADR-0106, que passou a tornar campos deste ctx OPCIONAIS para
430
- * a engine poder montar sozinha. A excepção tem razão medida: os campos que ganharam padrão têm um padrão
431
- * SEGURO — o modo cego começa desligado, a lista de botões vem da engine. Aqui não há: `true` monta um
432
- * controle que pode não fazer nada, e `false` esconde um de que uma criança depende. Os dois lados erram, e
433
- * é essa a condição que o `holdsAtOnce` já usou para ser obrigatório também.
434
- *
435
- * 📌 Quem passa pelo `createGame` não escreve isto: a raiz lê a declaração, que já é obrigatória. O campo
436
- * só é visível para um cartucho que chame `initPauseIcons` por fora — e é exactamente esse que não pode
437
- * ficar em silêncio.
317
+ * MOVES ONE STEP IN THE TYPOGRAPHY CYCLE and returns the face it landed on (ADR-0149 §1). ONE field, not two (read and
318
+ * write): the position belongs to whoever keeps the cycle; this module only needs the face's NAME to announce it.
319
+ * ABSENT = THE ICON IS NOT MOUNTED (ADR-0106 §5).
320
+ */
321
+ cycleTypography?: () => string | null;
322
+ /**
323
+ * DOES THIS GAME HOLD ANY KEY? — `GameDeclaration.holdsKeys` (ADR-0115). Without it the `altmove` icon is not mounted.
438
324
  *
439
- * ⚠️ FUNÇÃO, não valor — ver a nota no campo homónimo de `EscritoresVisuais`. Um cartucho que monte isto
440
- * por fora passa `() => this.declaration.seguraTeclas()` e não o resultado dela.
325
+ * ⚠️ REQUIRED, against ADR-0106's direction of making this ctx's fields optional: the fields that got a default have a
326
+ * SAFE one (blind mode starts off, the button lists come from the engine). This one has none — `true` mounts a control
327
+ * that may do nothing, `false` hides one a child depends on. Both are wrong, which is the same reason `holdsAtOnce` is
328
+ * required. Whoever goes through `createGame` never writes it: the root reads the declaration. A FUNCTION, not a value
329
+ * (see `ActionableIcons.holdsKeys`): a cartridge wiring this itself passes `() => declaration.holdsKeys()`.
441
330
  */
442
- seguraTeclas: () => boolean;
331
+ holdsKeys: () => boolean;
332
+ /** How many positions the current game declared — what «one button only» would scan (ADR-0218). Absent reads as none. */
333
+ declaredPositions?: () => number;
334
+ /** Does the current game's time run by itself? (ADR-0180: the hourglass.) Optional; absent, no hourglass. */
335
+ clock?: () => boolean;
336
+ /** Can this device play through the webcam? (ADR-0215: the 📷.) Optional; absent, no 📷. */
337
+ camera?: boolean;
338
+ /** Can this device hear the child — is there a microphone to ask for? (issue #184: the 👄.) Absent, no 👄. */
339
+ microphone?: boolean;
340
+ /** Opens the menus of seat `i`, as SELECT does (the ☰). Optional; absent, no ☰. */
341
+ openMenus?: (i: number) => void;
342
+ /** Does no voice speak the current language? (ADR-0185: the narration icon locks.) Optional; absent, a voice. */
343
+ noVoice?: () => boolean;
443
344
  }
444
345
  export interface PauseIconsApi {
445
346
  /** Builds one `.screen-pause` (hidden), wired for click + hover/focus caption. Caller appends it. */
446
347
  buildScreenPause: (i: number) => HTMLElement;
447
- /** Monta a BARRA RÁPIDA (`.screen-a11y`) da tela `i`, já fiada. Chamada por ui/hud.ts, uma por tela. */
348
+ /** Builds screen `i`'s QUICK BAR (`.screen-a11y`), already wired. Called by ui/hud.ts, one per screen. */
448
349
  buildQuickBar: (i: number) => HTMLElement;
449
350
  /**
450
- * OS ÍCONES QUE ESTA INSTÂNCIA MONTA — já filtrados pelo §5 do ADR-0106.
451
- *
452
- * ⚠️ Existe para que quem monta a barra do TÍTULO não repita o filtro. A barra do título não pode usar
453
- * `buildQuickBar` (ele põe `tabIndex = -1`, e o próprio comentário lá diz porquê: no título não se está a
454
- * jogar), então ela chama `iconsMarkup` directamente — e sem este acessor teria de recalcular quais ícones
455
- * accionam, que é uma segunda cópia da mesma decisão.
351
+ * THE ICONS THIS INSTANCE MOUNTS — already filtered by ADR-0106 §5. It exists so the bar the root mounts in
352
+ * `#title-icons` (which cannot use `buildQuickBar`: that one sets `tabIndex = -1`, for a game in play) does not repeat
353
+ * the filter — a second copy of the same decision.
456
354
  */
457
- iconesMontados: readonly PauseIcon[];
458
- /** ENTRA no modo `accessibility` da tela `i` — é o que o item `acessibilidade` da pausa faz. */
459
- entrarNaBarra: (i: number) => void;
460
- /** SAI do modo e devolve o direcional ao personagem. */
461
- sairDaBarra: (i: number) => void;
462
- /** A tela `i` está com o direcional na BARRA em vez de no personagem? Perguntado a cada quadro. */
463
- naBarraDe: (i: number) => boolean;
464
- /** Um passo dentro do modo. `temStart` é a borda do botão de pausa — a segunda saída (ADR-0044, item 7). */
465
- navBar: (i: number, k: NavKeys, temStart?: boolean) => void;
466
- /** Runs the icon `k` for screen `i`. Does NOT reflect — callers reflect after, as game.js always did. */
355
+ mountedIcons: readonly PauseIcon[];
356
+ /** ENTERS screen `i`'s `accessibility` mode — the bar half of the quick pause (ADR-0155). Does not touch the phase. */
357
+ enterBar: (i: number) => void;
358
+ /** LEAVES the mode and gives the d-pad back to the character. `silent` = leaving for another screen, not for the game. */
359
+ leaveBar: (i: number, silent?: boolean) => void;
360
+ /** Is screen `i`'s d-pad on the BAR instead of on the character? Asked every frame. */
361
+ onBar: (i: number) => boolean;
362
+ /** One step inside the mode. `hasStart` is the pause button's edge — the second way out (ADR-0044 item 7). */
363
+ navBar: (i: number, k: NavKeys, hasStart?: boolean) => void;
364
+ /** Runs the icon `k` for screen `i`. Does NOT reflect — callers reflect after. */
467
365
  iconAct: (k: string, i: number) => void;
468
366
  /** The state-reflecting `aria-label` of icon `k` for screen `i`. */
469
367
  iconLabel: (k: string, i: number) => string;