@the-inclusionist/engine 8.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 +467 -162
  307. package/dist-pkg/boot/create-game.js +3563 -426
  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 +250 -343
  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
@@ -0,0 +1,84 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import { FONT_GROUPS, FONT_BY_KEY, fontRole, faceAvailable } from './fonts.js';
3
+ /**
4
+ * A key is selectable when it exists in the catalog, is not marked `.off` (licence pending, etc.) — and is
5
+ * `geral`.
6
+ *
7
+ * ⚠️ WITHOUT THE THIRD TERM (issue #87) the menu would stop OFFERING the handwriting faces and they would stay
8
+ * SELECTABLE by any other path — `resolveFontKey` of a stored key, a `data-font` in a consumer's markup. "Not in the
9
+ * list" and "cannot be chosen" have to be the same statement, or the list is only a suggestion.
10
+ */
11
+ export function isSelectableFont(k, installed) {
12
+ const it = FONT_BY_KEY[k];
13
+ return !!it && faceAvailable(it, installed) && fontRole(it) === 'geral';
14
+ }
15
+ /**
16
+ * Maps a selectable font key to the CSS it drives. The three canonical fonts (atkinson/andika/lexend) use
17
+ * dedicated data-fonte values (Lexend's keeps the BDA letter/word spacing tied to data-fonte="dislexia"); every
18
+ * other catalog font goes through --font-custom with a generic fallback by family (serif/cursive/none).
19
+ */
20
+ export function fontCssTarget(k, it) {
21
+ // ⚠️ THE THREE CANONICAL FACES ARE NOT CURSIVE, and answering `false` for them is a statement, not an oversight:
22
+ // Atkinson, Andika and Lexend are reading faces, and it is exactly on them that the BDA spacing must hold.
23
+ if (k === 'atkinson')
24
+ return { font: 'padrao', customFamily: null, cursive: false };
25
+ if (k === 'andika')
26
+ return { font: 'alfabetizacao', customFamily: null, cursive: false };
27
+ if (k === 'lexend')
28
+ return { font: 'dislexia', customFamily: null, cursive: false };
29
+ // `joined` is the word the field's own documentation uses — "is this a JOINED face?".
30
+ const joined = it.fb === 'cursive';
31
+ const suffix = it.fb === 'serif' ? ',Georgia,serif' : joined ? ',cursive' : '';
32
+ return { font: 'custom', customFamily: `'${it.fam}'${suffix}`, cursive: joined };
33
+ }
34
+ /**
35
+ * ONE row of the list, from a catalogue face. A function of its own so the gate of the `.off` mechanism can exercise it
36
+ * with a FAKE face: a case that depends on the catalogue's composition fails every time the roster changes.
37
+ *
38
+ * The mechanism is needed (issue #87, item 4): the **Ronde** can only be offered if one of three faces is installed,
39
+ * because two of them are free for personal use only and cannot be bundled.
40
+ */
41
+ export function fontRow(t, it, fontKey, installed) {
42
+ // ⚠️ THE SAME question `isSelectableFont` asks, through the SAME function. Two answers would give a clickable row the
43
+ // click refuses — or, worse, a grey row that `resolveFontKey` accepts by another path. "Not available" and "cannot be
44
+ // chosen" have to be the same statement.
45
+ const disabled = !faceAvailable(it, installed);
46
+ // `d` and `off` hold KEYS too. The dash joining them is punctuation, not a sentence — the two halves are independent
47
+ // and each translates on its own.
48
+ const desc = it.d ? t(it.d) : '', reason = it.off ? t(it.off) : '';
49
+ const note = desc ? desc + (disabled ? ' — ' + reason : '') : disabled ? reason : '';
50
+ return { key: it.k, fam: it.fam, selected: fontKey === it.k, disabled, note };
51
+ }
52
+ /** Pure view-model for the typography list: which row is selected/disabled and its note, per catalog group. */
53
+ export function typoGroups(t, fontKey, installed) {
54
+ // ⚠️ ONLY THE GENERAL FACES ENTER THE LIST (ADR-0012 amendment, issue #87). The handwriting faces exist for the child
55
+ // to LEARN to read cursive — that is subject matter, and it lives INSIDE the activities, on buttons of their own.
56
+ // Offering them here would hand the child the subject as an obstacle everywhere they only want to navigate the menu.
57
+ //
58
+ // A group left with no general face disappears from the list, instead of appearing as an empty heading.
59
+ return FONT_GROUPS.map((g) => ({
60
+ g: t(g.g), // `g` holds an i18n KEY (see ui/fonts)
61
+ rows: g.items.filter((it) => fontRole(it) === 'geral').map((it) => fontRow(t, it, fontKey, installed)),
62
+ })).filter((group) => group.rows.length > 0);
63
+ }
64
+ /** The id of a face's button. It comes from the catalogue KEY, which is unique by construction (`FONT_BY_KEY`). */
65
+ export const typoControlId = (key) => `typo-font-${key}`;
66
+ /**
67
+ * What a font row SAYS, before any node exists — the shape the kit consumes.
68
+ *
69
+ * ⚠️ `shape: 'radio'` and not a switch: independent switches announcing on/off to choose ONE font say the opposite of
70
+ * the ADR-0012 amendment, «THE MENU IS A CHOICE, NOT A TOGGLE […] One font is active; the others are alternatives, not
71
+ * switches.»
72
+ *
73
+ * 📌 The note goes into the HINT — which `fillExplain` takes to the footer — and ALSO into the accessible name, because
74
+ * whoever does not see the row needs to hear who that face is for without hunting for the footer.
75
+ */
76
+ export function typoRowSpec(row) {
77
+ return {
78
+ id: typoControlId(row.key),
79
+ label: row.fam,
80
+ ...(row.note ? { hint: row.note } : {}),
81
+ shape: 'radio',
82
+ ariaLabel: row.fam + (row.note ? ' — ' + row.note : ''),
83
+ };
84
+ }
@@ -1,48 +1,12 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import { type Tema, type Correcao, type VisualState } from '../render/viz-axes.js';
3
- /** O rótulo de cada tema. Chave i18n — quem exibe resolve, como todo o resto do menu. */
4
- export declare const ROTULO_DO_TEMA: Readonly<Record<Tema, string>>;
5
- /** O rótulo de cada correção de cor. */
6
- export declare const ROTULO_DA_CORRECAO: Readonly<Record<Correcao, string>>;
7
- /**
8
- * Os rótulos CURTOS, para os ícones da barra rápida — «7:1», «deuteranopia».
9
- *
10
- * ⚠️ SÃO AS CHAVES QUE JÁ EXISTIAM (`contrast.*`, `cvd.*`), re-chaveadas por eixo. A barra rápida sempre
11
- * falou curto porque anuncia UM ícone de cada vez, e o painel sempre falou por extenso porque a criança está
12
- * a ler uma lista — a diferença é de contexto e sobrevive à divisão. Reaproveitar em vez de traduzir de novo
13
- * é o que mantém a mesma palavra nos dois sítios.
14
- */
15
- export declare const CURTO_DO_TEMA: Readonly<Record<Tema, string>>;
16
- export declare const CURTO_DA_CORRECAO: Readonly<Record<Correcao, string>>;
17
- /** Os dois eixos, como o painel os identifica no DOM. */
18
- export type EixoVisual = 'tema' | 'correcao';
19
- /** Um tradutor, igual ao que o resto da interface recebe. */
20
- export type Tradutor = (chave: string, params?: Record<string, string | number>) => string;
21
- /**
22
- * As linhas de UM eixo, no formato de rádio que o painel já usa.
23
- *
24
- * ⚠️ RÁDIO E NÃO SETE BOTÕES, e o motivo sobrevive à divisão: DENTRO de um eixo os valores continuam
25
- * exclusivos — um tema de cada vez, uma correção de cada vez. O que deixou de ser exclusivo é a relação
26
- * ENTRE os eixos, e é por isso que eles viram dois rádios em vez de um.
27
- *
28
- * ⚠️ E MANTÉM-SE A FORMA DE LINHA VISÍVEL, não um `<select>`. O `settings-visual` regista o erro que o Dev
29
- * apanhou na primeira tentativa: dentro de uma caixa fechada, um controle cuja razão de existir é ser ACHADO
30
- * por quem enxerga mal fica «quase o mesmo que não ter movido».
31
- */
32
- export declare function linhasDoEixo(eixo: EixoVisual, valores: readonly string[], rotulos: Readonly<Record<string, string>>, atual: string, t: Tradutor): string;
33
- /**
34
- * Os DOIS eixos, um a seguir ao outro, com um título cada.
35
- *
36
- * O título existe porque dois rádios seguidos sem nome são um rádio de oito para quem lê depressa — e essa
37
- * leitura é exactamente o mal-entendido que a divisão existe para desfazer.
38
- */
39
- export declare function eixosHtml(v: VisualState, t: Tradutor): string;
40
- /** O que um clique num botão do painel quer dizer. `null` quando o botão não é de eixo nenhum. */
41
- export interface EscolhaDeEixo {
42
- readonly eixo: EixoVisual;
43
- readonly valor: string;
44
- }
45
- export declare function escolhaDoBotao(dataset: {
46
- eixo?: string;
47
- valor?: string;
48
- }): EscolhaDeEixo | null;
2
+ import { axisRows as linhasDoEixoDeRender, axesHtml as eixosHtmlDeRender, buttonChoice as escolhaDoBotaoDeRender, type VisualAxis as EixoVisualDeRender, type Translator as TradutorDeRender, type AxisChoice as EscolhaDeEixoDeRender } from '../render/viz-axes-labels.js';
3
+ export declare const THEME_LABEL: Readonly<Record<import("../core/visual-state.js").Theme, string>>;
4
+ export declare const CORRECTION_LABEL: Readonly<Record<import("../core/visual-state.js").Correction, string>>;
5
+ export declare const SHORT_THEME: Readonly<Record<import("../core/visual-state.js").Theme, string>>;
6
+ export declare const SHORT_CORRECTION: Readonly<Record<import("../core/visual-state.js").Correction, string>>;
7
+ export declare const axisRows: typeof linhasDoEixoDeRender;
8
+ export declare const axesHtml: typeof eixosHtmlDeRender;
9
+ export declare const buttonChoice: typeof escolhaDoBotaoDeRender;
10
+ export type VisualAxis = EixoVisualDeRender;
11
+ export type Translator = TradutorDeRender;
12
+ export type AxisChoice = EscolhaDeEixoDeRender;
@@ -1,95 +1,13 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // ui/visual-axes-panel — O MENU VISUAL COM DOIS CONTROLES (ADR-0076, issue #104), na metade pura.
3
- //
4
- // ========================= O COMENTÁRIO QUE AUTORIZA ESTA MUDANÇA =========================
5
- // O `ui/settings-visual` justifica o controle ÚNICO com estas palavras, e elas continuam lá, verdadeiras
6
- // sobre o dia em que foram escritas:
7
- //
8
- // «Os sete vivem num CONTROLE SÓ, e isso não é economia de espaço: `p.viz` guarda UM valor. Dois
9
- // controles separados se sobrescreveriam em silêncio — a criança escolheria a correção, depois o
10
- // contraste, e perderia a correção sem nada dizer que perdeu.»
11
- //
12
- // ⚠️ A RAZÃO QUE ELE DÁ DEIXOU DE EXISTIR. `p.viz` já não guarda um valor: guarda dois eixos mais a
13
- // simulação, e os escritores por eixo (`setTemaDoJogador`/`setCorrecaoDoJogador`) mexem num sem tocar no
14
- // outro. O controle único era a forma honesta de contar uma exclusividade REAL; mantê-lo agora seria contar
15
- // uma exclusividade que já não existe — e continuar a negar os dois a quem precisa dos dois.
16
- //
17
- // ========================= OS NOMES DOS PADRÕES SÃO DECISÃO, NÃO ROTINA =========================
18
- // ⚠️ «Tema padrão» e «Visão tricromática», e o ADR-0076 fecha a *definition of done* com a regra que os
19
- // escolheu: **nenhum rótulo de padrão diagnostica quem lê**. `modo sem deficiência visual` foi oferecido e
20
- // recusado — ele diz à criança o que ela NÃO é, no menu que ela abriu para conseguir jogar. Um padrão
21
- // chama-se pelo que ele É.
22
- //
23
- // E `Modo padrão` (o `viz.normal` de hoje) deixa de servir aqui: era o neutro PARTILHADO, de quando os dois
24
- // eixos eram um só. Com dois controles, um «padrão» sem dizer padrão de QUÊ é ambíguo em ambos.
25
- //
26
- // Módulo puro: devolve HTML e chaves i18n, não toca documento nenhum. Quem monta é o `render/viz-setters`.
27
- import { TEMAS, CORRECOES } from '../render/viz-axes.js';
28
- /** O rótulo de cada tema. Chave i18n — quem exibe resolve, como todo o resto do menu. */
29
- export const ROTULO_DO_TEMA = Object.freeze({
30
- padrao: 'eixo.tema.padrao',
31
- hc3: 'viz.hc-direto',
32
- hc45: 'viz.hc-direto-45',
33
- hc7: 'viz.hc-direto-7',
34
- });
35
- /** O rótulo de cada correção de cor. */
36
- export const ROTULO_DA_CORRECAO = Object.freeze({
37
- tricro: 'eixo.correcao.tricro',
38
- protan: 'viz.fix-protan',
39
- deuter: 'viz.fix-deuter',
40
- tritan: 'viz.fix-tritan',
41
- });
42
- /**
43
- * Os rótulos CURTOS, para os ícones da barra rápida — «7:1», «deuteranopia».
44
- *
45
- * ⚠️ SÃO AS CHAVES QUE JÁ EXISTIAM (`contrast.*`, `cvd.*`), re-chaveadas por eixo. A barra rápida sempre
46
- * falou curto porque anuncia UM ícone de cada vez, e o painel sempre falou por extenso porque a criança está
47
- * a ler uma lista — a diferença é de contexto e sobrevive à divisão. Reaproveitar em vez de traduzir de novo
48
- * é o que mantém a mesma palavra nos dois sítios.
49
- */
50
- export const CURTO_DO_TEMA = Object.freeze({
51
- padrao: 'contrast.off', hc3: 'contrast.3', hc45: 'contrast.45', hc7: 'contrast.7',
52
- });
53
- export const CURTO_DA_CORRECAO = Object.freeze({
54
- tricro: 'cvd.off', protan: 'cvd.protan', deuter: 'cvd.deuter', tritan: 'cvd.tritan',
55
- });
56
- /**
57
- * As linhas de UM eixo, no formato de rádio que o painel já usa.
58
- *
59
- * ⚠️ RÁDIO E NÃO SETE BOTÕES, e o motivo sobrevive à divisão: DENTRO de um eixo os valores continuam
60
- * exclusivos — um tema de cada vez, uma correção de cada vez. O que deixou de ser exclusivo é a relação
61
- * ENTRE os eixos, e é por isso que eles viram dois rádios em vez de um.
62
- *
63
- * ⚠️ E MANTÉM-SE A FORMA DE LINHA VISÍVEL, não um `<select>`. O `settings-visual` regista o erro que o Dev
64
- * apanhou na primeira tentativa: dentro de uma caixa fechada, um controle cuja razão de existir é ser ACHADO
65
- * por quem enxerga mal fica «quase o mesmo que não ter movido».
66
- */
67
- export function linhasDoEixo(eixo, valores, rotulos, atual, t) {
68
- return valores.map((valor) => {
69
- const sel = valor === atual;
70
- return `<div class="ctrl-row"><span><strong>${t(rotulos[valor])}</strong></span>`
71
- + `<button class="mode-btn${sel ? ' is-on' : ''}" role="radio" aria-checked="${sel}"`
72
- + ` data-eixo="${eixo}" data-valor="${valor}" type="button">${sel ? t('viz.escolhido') : t('viz.escolher')}</button></div>`;
73
- }).join('');
74
- }
75
- /**
76
- * Os DOIS eixos, um a seguir ao outro, com um título cada.
77
- *
78
- * O título existe porque dois rádios seguidos sem nome são um rádio de oito para quem lê depressa — e essa
79
- * leitura é exactamente o mal-entendido que a divisão existe para desfazer.
80
- */
81
- export function eixosHtml(v, t) {
82
- return `<h3 class="opt-sub">${t('eixo.tema.titulo')}</h3>`
83
- + linhasDoEixo('tema', TEMAS, ROTULO_DO_TEMA, v.tema, t)
84
- + `<h3 class="opt-sub">${t('eixo.correcao.titulo')}</h3>`
85
- + linhasDoEixo('correcao', CORRECOES, ROTULO_DA_CORRECAO, v.correcao, t);
86
- }
87
- export function escolhaDoBotao(dataset) {
88
- const { eixo, valor } = dataset;
89
- if (eixo !== 'tema' && eixo !== 'correcao')
90
- return null;
91
- if (!valor)
92
- return null;
93
- const validos = eixo === 'tema' ? TEMAS : CORRECOES;
94
- return validos.includes(valor) ? { eixo, valor } : null;
95
- }
2
+ // ui/visual-axes-panel — the two visual axes' labels, rows and click reading (ADR-0076): the names cartridges import from ui.
3
+ //
4
+ // The module lives in `render/viz-axes-labels` since issue #167: `render/viz-setters` uses it, and render may not import ui
5
+ // (ADR-0173). These names stay, bound to the same values and types.
6
+ import { THEME_LABEL as ROTULO_DO_TEMADeRender, CORRECTION_LABEL as ROTULO_DA_CORRECAODeRender, SHORT_THEME as CURTO_DO_TEMADeRender, SHORT_CORRECTION as CURTO_DA_CORRECAODeRender, axisRows as linhasDoEixoDeRender, axesHtml as eixosHtmlDeRender, buttonChoice as escolhaDoBotaoDeRender, } from '../render/viz-axes-labels.js';
7
+ export const THEME_LABEL = ROTULO_DO_TEMADeRender;
8
+ export const CORRECTION_LABEL = ROTULO_DA_CORRECAODeRender;
9
+ export const SHORT_THEME = CURTO_DO_TEMADeRender;
10
+ export const SHORT_CORRECTION = CURTO_DA_CORRECAODeRender;
11
+ export const axisRows = linhasDoEixoDeRender;
12
+ export const axesHtml = eixosHtmlDeRender;
13
+ export const buttonChoice = escolhaDoBotaoDeRender;
@@ -0,0 +1,77 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import type { Translate } from '../core/i18n.js';
3
+ import type { HcRoleKey } from '../render/hc-role-data.js';
4
+ import { type VizMode } from '../render/viz-modes.js';
5
+ export type { HcRoleKey as RoleKey } from '../render/hc-role-data.js';
6
+ type RoleKey = HcRoleKey;
7
+ export type RGB = readonly [number, number, number];
8
+ /**
9
+ * EVERYTHING this menu writes into `p.viz`: the 4 contrast levels PLUS the 3 colour-blindness corrections, which live
10
+ * here by the Dev's decision (#60) — in the empathy panel a colour-blind child would have had to enter the menu for
11
+ * "feeling what a disability is like" to find the correction for the one they have.
12
+ *
13
+ * The seven live in ONE control, and that is not about saving space: `p.viz` holds ONE value. Two separate controls
14
+ * would overwrite each other silently — the child would pick the correction, then the contrast, and lose the
15
+ * correction with nothing saying so. One list tells the truth about the exclusivity.
16
+ */
17
+ export declare const VISUAL_MODES: readonly string[];
18
+ /** Short announcement labels. */
19
+ export declare const CONTRAST_LABELS: Readonly<Record<string, string>>;
20
+ export declare const ROLE_KEYS: readonly RoleKey[];
21
+ /** Readable labels for the color-blocking roles. */
22
+ export declare const ROLE_LABELS: Readonly<Record<RoleKey, string>>;
23
+ /**
24
+ * The 7 modes as the panel OFFERS them: a radio list, with a name and a description on each row.
25
+ *
26
+ * Not a `<select>`, and the Dev caught that immediately: inside a `<select>` the corrections become one closed line in
27
+ * a closed box. For a control whose reason to exist is to be FOUND by someone who sees poorly, hiding it behind a
28
+ * click is almost the same as not offering it.
29
+ *
30
+ * Radio, and not seven buttons: `p.viz` holds ONE value, and the exclusivity is said by the shape of the control
31
+ * instead of being discovered by losing the correction just chosen.
32
+ */
33
+ export declare const VISUAL_MODE_LIST: readonly VizMode[];
34
+ /**
35
+ * `viz` when it is a mode of THIS menu (contrast or correction), otherwise 'normal'.
36
+ *
37
+ * Named for what it returns: a name that said "contrast" would lie when it returns `fix-deuter`, and a name that lies
38
+ * about what it returns is worse than a long one.
39
+ */
40
+ export declare function resolveVisualMode(viz: string): string;
41
+ /** i18n KEY of a contrast level's label; unknown modes fall back to the 'off' key. Resolve with `t()`. */
42
+ export declare function contrastLabel(mode: string): string;
43
+ export declare function clamp01(t: number): number;
44
+ /**
45
+ * i18n KEY of the L->Q slider label ('lq.off'/'lq.linear'/'lq.mixed'/'lq.quadratic'). The label belongs to the L->Q
46
+ * feature, so it lives with the filter that owns it (render/lq-filter) and is re-exported here under the name this
47
+ * overlay has always used. Two copies of one rule is one copy too many: only the owner may change what the levels
48
+ * mean. Callers resolve with `t()` — see the note on lqName about the `t` shadowing.
49
+ */
50
+ export { lqName as lqLabel } from '../render/lq-filter.js';
51
+ /**
52
+ * THE FOUR POSITIONS OF THE CONTRAST BOOST, chosen with left and right (ADR-0151): off, linear, mixed and quadratic —
53
+ * «da mesma forma que se troca o número de jogadores, e não através de uma barra».
54
+ *
55
+ * ⚠️ THE "LINEAR" VALUE CANNOT BE ZERO: `setLq(0)` turns the filter off, and any value above turns the curve on. 0.05
56
+ * is the most linear value that still turns the filter on. Mixed is the middle, and quadratic is the whole S-curve.
57
+ * Each position falls within the range `lqName` already gives its name.
58
+ */
59
+ export declare const LQ_STEPS: readonly number[];
60
+ /**
61
+ * Which position a continuous value is in — including one STORED by the old slider (0.35, 0.7…). By `lqName`'s range,
62
+ * not by the nearest value: the NAME the child heard has to stay the name now.
63
+ */
64
+ export declare function lqPosition(amount: number): number;
65
+ /** t (0..1) -> slider percent (0..100, rounded) — mirrors `Math.round(lqT*100)`.
66
+ * @deprecated Since ADR-0151 the boost is chosen by STEPS (`LQ_STEPS`/`lqPosition`); kept for consumers.
67
+ * ⚠️ It has no reader inside the engine: that debt is said here so that it stays in view. */
68
+ export declare function lqPercent(t: number): number;
69
+ /** slider percent (any number) -> clamped t (0..1) — mirrors `+lq.value/100` fed into setLq's clamp.
70
+ * @deprecated Since ADR-0151 the boost is chosen by STEPS; kept for consumers. */
71
+ export declare function lqFromPercent(pct: number): number;
72
+ /** Defensive clamp when the player count shrank — mirrors `if(selVizPlayer>=numPlayers)selVizPlayer=0`. */
73
+ export declare function clampSelectedPlayer(selected: number, playerCount: number): number;
74
+ /** [r,g,b] (0..255) -> '#rrggbb'. */
75
+ export declare function rgbToHex(rgb: RGB): string;
76
+ /** Shared on/off button label used by this panel's toggle buttons. */
77
+ export declare function onOffLabel(t: Translate, on: boolean): string;
@@ -0,0 +1,107 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // ui/visual-choices — WHAT A VISUAL CHOICE IS, with no document anywhere near it.
3
+ //
4
+ // 📌 THE SUITE HAD ALREADY DRAWN THIS SEAM, which is what makes the cut a reading and not an opinion:
5
+ // `tests/settings-visual.node.test.js` imports exactly these names and nothing else, and the node project mounts no
6
+ // document — so whoever wrote those cases had to know where the panel stopped being a panel. It is the fourth module to
7
+ // come out this way, after `ui/audio-choices`, `ui/typo-choices` and `ui/control-choices`.
8
+ //
9
+ // What lives here answers «what are the positions, what is each one called, and what does a value mean»; what stayed in
10
+ // `ui/settings-visual` is the work its name never mentioned — finding the controls, wiring them, and reflecting the
11
+ // choice on three surfaces.
12
+ import { toggleLabel } from './dom.js';
13
+ import { CONTRAST_LEVELS } from '../core/visual-cycles.js';
14
+ import { HC_ROLE_KEYS } from '../render/hc-role-data.js';
15
+ import { VIZ_CORRECTIONS, VIZ_MODES } from '../render/viz-modes.js';
16
+ /**
17
+ * EVERYTHING this menu writes into `p.viz`: the 4 contrast levels PLUS the 3 colour-blindness corrections, which live
18
+ * here by the Dev's decision (#60) — in the empathy panel a colour-blind child would have had to enter the menu for
19
+ * "feeling what a disability is like" to find the correction for the one they have.
20
+ *
21
+ * The seven live in ONE control, and that is not about saving space: `p.viz` holds ONE value. Two separate controls
22
+ * would overwrite each other silently — the child would pick the correction, then the contrast, and lose the
23
+ * correction with nothing saying so. One list tells the truth about the exclusivity.
24
+ */
25
+ export const VISUAL_MODES = [...CONTRAST_LEVELS, ...VIZ_CORRECTIONS.map((m) => m.key)];
26
+ const VISUAL_MODE_SET = new Set(VISUAL_MODES);
27
+ /** Short announcement labels. */
28
+ // i18n keys, not text. The ratios look like universal numbers, but '4,5:1' uses the pt-BR decimal comma and becomes
29
+ // '4.5:1' in English — and 'off' is a word in each language.
30
+ export const CONTRAST_LABELS = { normal: 'contrast.off', 'hc-direto': 'contrast.3', 'hc-direto-45': 'contrast.45', 'hc-direto-7': 'contrast.7' };
31
+ export const ROLE_KEYS = HC_ROLE_KEYS;
32
+ /** Readable labels for the color-blocking roles. */
33
+ export const ROLE_LABELS = { hazard: 'perigo (lava)', climb: 'escalável (escada/trampolim)', water: 'água', gate: 'portão' };
34
+ /**
35
+ * The 7 modes as the panel OFFERS them: a radio list, with a name and a description on each row.
36
+ *
37
+ * Not a `<select>`, and the Dev caught that immediately: inside a `<select>` the corrections become one closed line in
38
+ * a closed box. For a control whose reason to exist is to be FOUND by someone who sees poorly, hiding it behind a
39
+ * click is almost the same as not offering it.
40
+ *
41
+ * Radio, and not seven buttons: `p.viz` holds ONE value, and the exclusivity is said by the shape of the control
42
+ * instead of being discovered by losing the correction just chosen.
43
+ */
44
+ export const VISUAL_MODE_LIST = VIZ_MODES.filter((m) => m.kind === 'normal' || m.kind === 'hcnew').concat(VIZ_CORRECTIONS);
45
+ /**
46
+ * `viz` when it is a mode of THIS menu (contrast or correction), otherwise 'normal'.
47
+ *
48
+ * Named for what it returns: a name that said "contrast" would lie when it returns `fix-deuter`, and a name that lies
49
+ * about what it returns is worse than a long one.
50
+ */
51
+ export function resolveVisualMode(viz) {
52
+ return VISUAL_MODE_SET.has(viz) ? viz : 'normal';
53
+ }
54
+ /** i18n KEY of a contrast level's label; unknown modes fall back to the 'off' key. Resolve with `t()`. */
55
+ export function contrastLabel(mode) {
56
+ return CONTRAST_LABELS[mode] ?? CONTRAST_LABELS.normal;
57
+ }
58
+ export function clamp01(t) {
59
+ return Math.max(0, Math.min(1, t));
60
+ }
61
+ /**
62
+ * i18n KEY of the L->Q slider label ('lq.off'/'lq.linear'/'lq.mixed'/'lq.quadratic'). The label belongs to the L->Q
63
+ * feature, so it lives with the filter that owns it (render/lq-filter) and is re-exported here under the name this
64
+ * overlay has always used. Two copies of one rule is one copy too many: only the owner may change what the levels
65
+ * mean. Callers resolve with `t()` — see the note on lqName about the `t` shadowing.
66
+ */
67
+ export { lqName as lqLabel } from '../render/lq-filter.js';
68
+ import { lqName } from '../render/lq-filter.js';
69
+ /**
70
+ * THE FOUR POSITIONS OF THE CONTRAST BOOST, chosen with left and right (ADR-0151): off, linear, mixed and quadratic —
71
+ * «da mesma forma que se troca o número de jogadores, e não através de uma barra».
72
+ *
73
+ * ⚠️ THE "LINEAR" VALUE CANNOT BE ZERO: `setLq(0)` turns the filter off, and any value above turns the curve on. 0.05
74
+ * is the most linear value that still turns the filter on. Mixed is the middle, and quadratic is the whole S-curve.
75
+ * Each position falls within the range `lqName` already gives its name.
76
+ */
77
+ export const LQ_STEPS = [0, 0.05, 0.5, 1];
78
+ /**
79
+ * Which position a continuous value is in — including one STORED by the old slider (0.35, 0.7…). By `lqName`'s range,
80
+ * not by the nearest value: the NAME the child heard has to stay the name now.
81
+ */
82
+ export function lqPosition(amount) {
83
+ return Math.max(0, ['lq.off', 'lq.linear', 'lq.mixed', 'lq.quadratic'].indexOf(lqName(amount)));
84
+ }
85
+ /** t (0..1) -> slider percent (0..100, rounded) — mirrors `Math.round(lqT*100)`.
86
+ * @deprecated Since ADR-0151 the boost is chosen by STEPS (`LQ_STEPS`/`lqPosition`); kept for consumers.
87
+ * ⚠️ It has no reader inside the engine: that debt is said here so that it stays in view. */
88
+ export function lqPercent(t) {
89
+ return Math.round(clamp01(t) * 100);
90
+ }
91
+ /** slider percent (any number) -> clamped t (0..1) — mirrors `+lq.value/100` fed into setLq's clamp.
92
+ * @deprecated Since ADR-0151 the boost is chosen by STEPS; kept for consumers. */
93
+ export function lqFromPercent(pct) {
94
+ return clamp01(pct / 100);
95
+ }
96
+ /** Defensive clamp when the player count shrank — mirrors `if(selVizPlayer>=numPlayers)selVizPlayer=0`. */
97
+ export function clampSelectedPlayer(selected, playerCount) {
98
+ return selected >= playerCount ? 0 : selected;
99
+ }
100
+ /** [r,g,b] (0..255) -> '#rrggbb'. */
101
+ export function rgbToHex(rgb) {
102
+ return '#' + rgb.map((n) => n.toString(16).padStart(2, '0')).join('');
103
+ }
104
+ /** Shared on/off button label used by this panel's toggle buttons. */
105
+ export function onOffLabel(t, on) {
106
+ return toggleLabel(t, on);
107
+ }
@@ -1,11 +1,34 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- /** Estado do modo pessoa surda. Escolha da PESSOA, persistida — não inferência sobre um widget de terceiro. */
3
- export declare let librasOpen: boolean;
4
- export declare function setOnLibrasChange(fn: () => void): void;
5
- export declare function vlibrasSay(text: string): void;
6
- /** O modo pessoa surda está ligado? Lê o NOSSO estado — nunca mais a geometria do widget. */
7
- export declare function vlibrasOpen(): boolean;
8
- /** Liga/desliga o modo pessoa surda. Um toggle de verdade: o estado é nosso, então ele sempre alterna. */
9
- export declare function toggleLibras(): void;
10
- /** Mantido para o laço do jogo, que o chama a cada quadro. Já não decide nada — o estado é nosso. */
11
- export declare function vlTick(): void;
2
+ import type { Translate } from '../core/i18n.js';
3
+ import type { Store } from '../platform/storage.js';
4
+ /** What deaf mode is read and written through: the page's store, built by the root (ADR-0232, issue #207). */
5
+ export type LibrasStore = Pick<Store, 'getBool' | 'setBool'>;
6
+ /** What a deaf mode is built over. */
7
+ export interface LibrasPorts {
8
+ /** Where the hidden node the interpreter clicks lives (its `body`), and where the widget's access button is looked for. */
9
+ readonly doc: Document;
10
+ /** Where the widget's close event is dispatched, and whose timer drains the one-utterance queue. */
11
+ readonly win: Pick<Window, 'dispatchEvent' | 'setTimeout'>;
12
+ /** The page's store: the person's choice is read once, at build, and written at each toggle. */
13
+ readonly store: LibrasStore;
14
+ /** Milliseconds now — the queue's clock (`Date.now`). */
15
+ readonly now: () => number;
16
+ }
17
+ /** One root's deaf mode. */
18
+ export interface Libras {
19
+ /** Is deaf mode on? Reads OUR state — never the widget's geometry. */
20
+ readonly isOpen: () => boolean;
21
+ /** Turns deaf mode on/off. A real toggle: the state is ours, so it always flips; the confirmation is signed in `t`'s language. */
22
+ readonly toggle: (t: Translate) => void;
23
+ /** Signs in Libras: sends the text to the interpreter (only while it is open). A queue of 1 — a new utterance replaces the pending one. */
24
+ readonly say: (text: string) => void;
25
+ /** Kept for a game loop that calls it every frame: it opens the interpreter for a choice restored from storage. It decides nothing. */
26
+ readonly tick: () => void;
27
+ /** Runs `fn` when the mode opens or closes (a host's reflow); returns its release. */
28
+ readonly onChange: (fn: () => void) => () => void;
29
+ }
30
+ /**
31
+ * Builds a deaf mode. The PERSON's choice, persisted — not an inference about a third-party widget — read from the store
32
+ * here, at build, never at import (ADR-0232).
33
+ */
34
+ export declare function createLibras({ doc, win, store, now }: LibrasPorts): Libras;
@@ -1,87 +1,64 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // ui/vlibras.ts — MODO PESSOA SURDA (intérprete de Libras) — Estágio 4, Tier 1.
3
- //
4
- // DOIS DEFEITOS CONSERTADOS AQUI, e eles têm a mesma raiz.
5
- //
6
- // `librasOpen` era deduzido da GEOMETRIA do botão de acesso do VLibras: altura zero ou sem `offsetParent`
7
- // significava "o painel está aberto". Isso funcionava enquanto o widget renderizava dentro do nosso
8
- // `<div vw>`. Ele parou — hoje ele anexa `#vlibras-access-wrapper` direto no `<body>` —, e o que sobrou no
9
- // nosso markup é um div VAZIO, de 747×0. Altura zero. Então o detector respondia "aberto" para sempre:
10
- //
11
- // 1. o layout reservava 380px à direita para um intérprete inexistente e empurrava o jogo para fora da
12
- // tela (medido: canvas em `left: -136`);
13
- // 2. o toggle não desligava, porque mandava um evento de fechar a um widget que não estava ali.
14
- //
15
- // (É a mesma raiz da falha do gate axe-core, consertada em 0657578: o VLibras mudou de lugar e três coisas
16
- // que o localizavam pelo nosso markup pararam juntas, em silêncio.)
17
- //
18
- // O ESTADO AGORA É NOSSO. `librasOpen` é uma escolha da pessoa, persistida, e não a leitura de um retângulo
19
- // de terceiro. Um modo de acessibilidade cujo estado é inferido da geometria de outra biblioteca é um modo
20
- // que desliga sozinho quando essa biblioteca muda — e quem paga é quem depende dele.
21
- //
22
- // O QUE AINDA NÃO É: o Dev decidiu que o intérprete deve aparecer NA FRENTE da tela quando um áudio toca e
23
- // sumir depois, sem clicar em nada e sem depender de clicar em textos. O widget do VLibras não faz isso (é um
24
- // painel encaixado, que traduz o texto do elemento clicado), então essa é a razão de o pilar 2 do ADR-0010
25
- // prever um motor próprio em zdog. Este arquivo para de empurrar a tela e passa a ter um toggle honesto; o
26
- // intérprete sob demanda é trabalho à parte.
27
- import { t } from '../core/i18n.js';
28
- import * as store from '../platform/storage.js';
29
- /** Estado do modo pessoa surda. Escolha da PESSOA, persistida — não inferência sobre um widget de terceiro. */
30
- export let librasOpen = store.getBool('incl_libras', false);
31
- let _vlOpen = false, _vlNode = null, _vlBusyUntil = 0, _vlNext = null;
32
- let _onLibrasChange = () => { };
33
- // Registra o reflow (layout) a rodar quando o painel abre/fecha. Chamado no boot do game.js.
34
- export function setOnLibrasChange(fn) { _onLibrasChange = fn; }
35
- // Fala em Libras: manda o texto ao intérprete (só quando o painel está aberto). Fila de 1 — fala nova substitui a pendente.
36
- export function vlibrasSay(text) {
37
- if (!_vlOpen || !text)
38
- return;
39
- const now = Date.now();
40
- if (now < _vlBusyUntil) {
41
- _vlNext = text;
42
- return;
43
- }
44
- _vlBusyUntil = now + 4000;
45
- if (!_vlNode) {
46
- _vlNode = document.createElement('span');
47
- _vlNode.setAttribute('aria-hidden', 'true');
48
- _vlNode.style.cssText = 'position:fixed;left:0;top:0;width:1px;height:1px;overflow:hidden;opacity:.01;z-index:1;pointer-events:auto';
49
- document.body.appendChild(_vlNode);
50
- }
51
- _vlNode.textContent = text;
52
- try {
53
- _vlNode.click();
54
- }
55
- catch (e) { /* noop */ }
56
- setTimeout(() => { const nx = _vlNext; _vlNext = null; _vlBusyUntil = 0; if (nx)
57
- vlibrasSay(nx); }, 4100);
58
- }
59
- const vwBtn = () => document.querySelector('[vw-access-button]');
60
- /** O modo pessoa surda está ligado? Lê o NOSSO estado — nunca mais a geometria do widget. */
61
- export function vlibrasOpen() { return librasOpen; }
62
- /** Liga/desliga o modo pessoa surda. Um toggle de verdade: o estado é nosso, então ele sempre alterna. */
63
- export function toggleLibras() {
64
- librasOpen = !librasOpen;
65
- _vlOpen = librasOpen;
66
- store.setBool('incl_libras', librasOpen);
67
- // Tentativa BEST-EFFORT de acordar o widget do VLibras, se ele estiver carregado. Falhar aqui não pode
68
- // impedir o modo de ligar: o estado é a escolha da pessoa, o widget é só um tradutor possível para ela.
69
- const b = vwBtn();
70
- if (librasOpen && b) {
71
- try {
72
- b.click();
2
+ /**
3
+ * Builds a deaf mode. The PERSON's choice, persisted — not an inference about a third-party widget — read from the store
4
+ * here, at build, never at import (ADR-0232).
5
+ */
6
+ export function createLibras({ doc, win, store, now }) {
7
+ let open = store.getBool('incl_libras', false);
8
+ let vlOpen = false, node = null, busyUntil = 0, next = null;
9
+ const changeListeners = new Set();
10
+ const say = (text) => {
11
+ if (!vlOpen || !text)
12
+ return;
13
+ const at = now();
14
+ if (at < busyUntil) {
15
+ next = text;
16
+ return;
73
17
  }
74
- catch (e) { /* noop */ }
75
- }
76
- else if (!librasOpen) {
18
+ busyUntil = at + 4000;
19
+ if (!node) {
20
+ node = doc.createElement('span');
21
+ node.setAttribute('aria-hidden', 'true');
22
+ node.style.cssText = 'position:fixed;left:0;top:0;width:1px;height:1px;overflow:hidden;opacity:.01;z-index:1;pointer-events:auto';
23
+ doc.body.appendChild(node);
24
+ }
25
+ node.textContent = text;
77
26
  try {
78
- window.dispatchEvent(new CustomEvent('vp-widget-close'));
27
+ node.click();
79
28
  }
80
29
  catch (e) { /* noop */ }
81
- }
82
- _onLibrasChange();
83
- if (librasOpen)
84
- vlibrasSay(t('sr.libras.on'));
30
+ win.setTimeout(() => { const nx = next; next = null; busyUntil = 0; if (nx)
31
+ say(nx); }, 4100);
32
+ };
33
+ const toggle = (t) => {
34
+ open = !open;
35
+ vlOpen = open;
36
+ store.setBool('incl_libras', open);
37
+ // A BEST-EFFORT attempt to wake the VLibras widget, if it is loaded. Failing here must not stop the mode from
38
+ // turning on: the state is the person's choice, and the widget is only one possible translator for them.
39
+ const b = doc.querySelector('[vw-access-button]');
40
+ if (open && b) {
41
+ try {
42
+ b.click();
43
+ }
44
+ catch (e) { /* noop */ }
45
+ }
46
+ else if (!open) {
47
+ try {
48
+ win.dispatchEvent(new CustomEvent('vp-widget-close'));
49
+ }
50
+ catch (e) { /* noop */ }
51
+ }
52
+ for (const fn of [...changeListeners])
53
+ fn();
54
+ if (open)
55
+ say(t('sr.libras.on'));
56
+ };
57
+ return {
58
+ isOpen: () => open,
59
+ toggle,
60
+ say,
61
+ tick: () => { vlOpen = open; },
62
+ onChange: (fn) => { changeListeners.add(fn); return () => { changeListeners.delete(fn); }; },
63
+ };
85
64
  }
86
- /** Mantido para o laço do jogo, que o chama a cada quadro. Já não decide nada — o estado é nosso. */
87
- export function vlTick() { _vlOpen = librasOpen; }