@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
@@ -1,103 +1,129 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // ui/panel-shell — A CASCA DE UM PAINEL DE AJUSTES, construída em vez de exigida.
2
+ // ui/panel-shell — THE SHELL OF A SETTINGS PANEL, built instead of required.
3
3
  //
4
- // ========================= O ACHADO QUE ISTO CONSERTA =========================
5
- // O segundo consumidor (a etapa C da issue #63) mediu-o e escreveu-o no achado 6:
4
+ // ========================= WHAT THIS FIXES =========================
5
+ // A second consumer (issue #63) measured it: a panel's ctx asks for `$` and `store`, but what it REALLY requires is
6
+ // that the consumer's document contain five ids (`#typo`, `#typo-list`, `#typo-close`, …). Nothing in the type says so;
7
+ // it is found by trial, and the failure mode is the worst possible one — the panel opens EMPTY, with no error.
6
8
  //
7
- // «O CONTRATO DE MARKUP É INVISÍVEL. O ctx do painel pede `$` e `store`; o que ele REALMENTE exige é que
8
- // o documento do consumidor contenha `#typo`, `#typo-list`, `#typo-preview`, `#typo-close` e
9
- // `#typo-reset`. Nada no tipo diz isso — descobre-se por tentativa, e o modo de falhar é o pior
10
- // possível: o painel abre VAZIO, sem erro.»
9
+ // Each `ui/settings-*.ts` fills the INSIDE of its panel; this module builds the OUTSIDE — the veil, the card, the title,
10
+ // the actions row and the reset button — and returns the ids it created, so the contract is stated instead of
11
+ // discovered.
11
12
  //
12
- // Cada `ui/settings-*.ts` preenche o INTERIOR do seu painel; o EXTERIOR — o véu, o cartão, o título, o
13
- // rodapé de ações e o botão de restaurar — vinha do `app/index.html`, que saiu com o cartucho (#111). Desde
14
- // então a engine EXIGE cinco ids por painel e não os declara em lado nenhum.
13
+ // ⚠️ AND THE MENU RULE OF `CLAUDE.md` §4 IS BUILT IN, not remembered. A panel's introduction goes in the card's
14
+ // `data-explain-idle` — never in a `<p>` of prose at the top —, because a menu that explains item by item makes the
15
+ // child READ EVERYTHING to find what they want (issue #62). The shell has no way to receive a `<p>` at the top.
15
16
  //
16
- // ⚠️ E A REGRA DE MENU DO `CLAUDE.md` §4 DEPENDIA DE ALGUÉM SE LEMBRAR DELA. A introdução de um painel vai no
17
- // `data-explain-idle` do cartão — nunca num `<p>` de prosa no topo —, porque um menu que explica item a item
18
- // obriga a criança a LER TUDO para achar o que procura. A issue #62 mandava editar seis blocos de markup para
19
- // isso; o markup saiu, e a regra ficou sem alvo. Aqui ela deixa de ser lembrete e passa a ser construção: a
20
- // casca não tem por onde receber um `<p>` no topo.
21
- //
22
- // ========================= A FORMA, QUE FOI MEDIDA E NÃO INVENTADA =========================
23
- // É a do painel de tipografia do `app/quiz.html`, que é o único que sobrou e o que o segundo consumidor
24
- // exercitou de facto:
17
+ // ========================= THE SHAPE =========================
25
18
  //
26
19
  // <div id="X" class="overlay" hidden>
27
20
  // <div class="overlay__card" role="dialog" aria-modal="true" aria-labelledby="X-title" [data-explain-idle]>
28
21
  // <h2 id="X-title">…</h2>
29
- // <div id="X-list" class="ctrl-list" role="group" aria-label="…"></div> ← o interior, do settings-*
22
+ // <button id="X-close">…</button> ← item 1 (ADR-0158)
23
+ // <div id="X-list" class="ctrl-list" role="group" aria-label="…"></div> ← the inside, from settings-*
30
24
  // <div class="overlay__actions">
31
- // <button id="X-reset">…</button> <button id="X-close">…</button>
25
+ // <button id="X-reset">…</button>
32
26
  // </div>
33
27
  // </div>
34
28
  // </div>
35
29
  //
36
- // ⚠️ O RODAPÉ `.opt-explain` NÃO É CRIADO AQUI, e isso é deliberado: `ui/settings-panel.fillExplain` cria-o
37
- // quando move a primeira dica para lá. Criá-lo vazio aqui daria uma região `aria-live` que anuncia nada, e
38
- // duas mãos a criar o mesmo nó é como ele acabaria duplicado.
30
+ // ⚠️ THE `.opt-explain` FOOTER IS NOT CREATED HERE, on purpose: `ui/settings-panel.fillExplain` creates it when it moves
31
+ // the first hint there. Creating it empty here would give an `aria-live` region that announces nothing, and two hands
32
+ // creating the same node is how it would end up duplicated.
39
33
  //
40
- // Sem `innerHTML`: tudo por `criar` + `textContent`, no molde de `ui/loop-crash` e `ui/focus-trap`. O título
41
- // e o rótulo da lista vêm do CHAMADOR já resolvidos — este módulo não traduz, para poder ser exercitado sem
42
- // dicionário.
34
+ // No `innerHTML`: everything through `create` + `textContent`, like `ui/loop-crash` and `ui/focus-trap`. The title and
35
+ // the list label come from the CALLER already resolved — this module does not translate, so it can be exercised with no
36
+ // dictionary.
43
37
  //
44
- // ⚠️ E NÃO IMPORTA NADA. Uma casca que não usa `innerHTML` também não precisa de escapar texto: `textContent`
45
- // escapa por construção. Chegou a haver aqui um `escaparHtml` importado «por conveniência» — que é como um
46
- // módulo-folha deixa de o ser, e como um leitor futuro passa a procurar a interpolação que não existe.
47
- /** Os ids que um painel de `id` ocupa. Exportado porque um gate e um consumidor precisam de os nomear. */
48
- export function idsDaCasca(id) {
49
- return { overlay: id, title: `${id}-title`, lista: `${id}-list`, reset: `${id}-reset`, fechar: `${id}-close` };
38
+ // ⚠️ AND IT IMPORTS NOTHING. A shell that does not use `innerHTML` does not need to escape text either: `textContent`
39
+ // escapes by construction. An import "for convenience" is how a leaf module stops being one, and how a future reader
40
+ // starts looking for an interpolation that does not exist.
41
+ /** The ids a panel of `id` occupies. Exported because a gate and a consumer need to name them. */
42
+ export function shellIds(id, customListId) {
43
+ return {
44
+ overlay: id,
45
+ title: `${id}-title`,
46
+ list: customListId ?? `${id}-list`,
47
+ reset: `${id}-reset`,
48
+ close: `${id}-close`,
49
+ };
50
50
  }
51
51
  /**
52
- * Monta (ou reaproveita) a casca do painel `spec.id` e devolve as suas partes.
52
+ * Mounts (or reuses) the shell of panel `spec.id` and returns its parts.
53
53
  *
54
- * IDEMPOTENTE: se já existir um `#id`, ele é reutilizado e o conteúdo do cartão é reconstruído. Um painel que
55
- * a raiz monte duas vezes não pode acabar com dois véus — e a raiz monta mais do que uma vez, porque a
56
- * contagem de jogadores muda a grade de telas.
54
+ * IDEMPOTENT: if a `#id` already exists, it is reused and the card's content is rebuilt. A panel mounted twice cannot
55
+ * end up with two veils — and it can be mounted more than once (two cartridges on one page, ADR-0139).
57
56
  */
58
- export function montarCasca(ctx, spec) {
59
- const ids = idsDaCasca(spec.id);
60
- const overlay = ctx.procurar('#' + ids.overlay) ?? ctx.criar('div');
57
+ export function mountShell(ctx, spec) {
58
+ const ids = shellIds(spec.id, spec.listId);
59
+ const overlay = ctx.find('#' + ids.overlay) ?? ctx.create('div');
61
60
  overlay.id = ids.overlay;
62
61
  overlay.className = 'overlay';
63
62
  overlay.hidden = true;
64
63
  while (overlay.firstChild)
65
64
  overlay.removeChild(overlay.firstChild);
66
- const card = ctx.criar('div');
65
+ const card = ctx.create('div');
67
66
  card.className = 'overlay__card';
68
67
  card.setAttribute('role', 'dialog');
69
68
  card.setAttribute('aria-modal', 'true');
70
69
  card.setAttribute('aria-labelledby', ids.title);
71
- // A introdução do painel é o texto de REPOUSO do rodapé (CLAUDE.md §4), nunca um `<p>` no topo.
72
- if (spec.introducao)
73
- card.setAttribute('data-explain-idle', spec.introducao);
74
- const h2 = ctx.criar('h2');
70
+ const h2 = ctx.create('h2');
75
71
  h2.id = ids.title;
76
- h2.textContent = spec.titulo;
77
72
  card.appendChild(h2);
78
- const lista = ctx.criar('div');
79
- lista.id = ids.lista;
80
- lista.className = 'ctrl-list';
81
- lista.setAttribute('role', 'group');
82
- lista.setAttribute('aria-label', spec.rotuloDaLista);
83
- card.appendChild(lista);
84
- const acoes = ctx.criar('div');
85
- acoes.className = 'overlay__actions';
86
- const reset = botao(ctx, ids.reset, spec.rotuloReset, 'mode-btn');
87
- const fechar = botao(ctx, ids.fechar, spec.rotuloFechar, 'mode-btn is-on');
88
- acoes.appendChild(reset);
89
- acoes.appendChild(fechar);
90
- card.appendChild(acoes);
73
+ // ADR-0158: «Voltar» is item 1 and nothing closes the panel after its rows. The way out is where the cursor lands
74
+ // when the panel opens — a close button at the bottom made the child walk every row to leave. The id stays
75
+ // `#X-close`, which is contract; only its place and its word changed.
76
+ const backButton = button(ctx, ids.close, 'mode-btn overlay__back');
77
+ card.appendChild(backButton);
78
+ const listNode = ctx.create('div');
79
+ listNode.id = ids.list;
80
+ listNode.className = 'ctrl-list';
81
+ listNode.setAttribute('role', 'group');
82
+ card.appendChild(listNode);
83
+ const actionsRow = ctx.create('div');
84
+ actionsRow.className = 'overlay__actions';
85
+ const reset = button(ctx, ids.reset, 'mode-btn');
86
+ actionsRow.appendChild(reset);
87
+ card.appendChild(actionsRow);
91
88
  overlay.appendChild(card);
92
- return { overlay, card, lista, reset, fechar, ids };
89
+ const shell = { overlay, card, title: h2, list: listNode, reset, close: backButton, ids };
90
+ applyLabels(shell, spec);
91
+ return shell;
92
+ }
93
+ /**
94
+ * WRITES THE SHELL'S WORDS — separate from construction because they change AFTER it exists.
95
+ *
96
+ * 🔴 `initI18n` applies the fallback language synchronously — so the page is never blank — and, if the preferred
97
+ * language is another, REQUESTS the switch, which is asynchronous. Anything JavaScript builds in that gap captures the
98
+ * fallback text and nothing rebuilds it; and the language can also change mid-game.
99
+ *
100
+ * ⚠️ AND REBUILDING THE SHELL TO FIX THE TITLE DOES NOT WORK. `mountShell` empties the card, and each `ui/settings-*`
101
+ * wires its `#X-reset` ONCE, at `init` — remounting leaves the reset button in the document with no listener, a dead
102
+ * button that looks alive (ADR-0106 §5). Writing only the words touches no listener.
103
+ *
104
+ * IDEMPOTENT: writing the same labels twice is writing the same labels.
105
+ */
106
+ export function applyLabels(shell, r) {
107
+ shell.title.textContent = r.title;
108
+ shell.list.setAttribute('aria-label', r.listLabel);
109
+ shell.reset.textContent = r.resetLabel;
110
+ shell.close.textContent = r.closeLabel;
111
+ // the arrow is drawn by the stylesheet, out of the name (ADR-0159 rule 12)
112
+ shell.close.setAttribute('data-glifo', '↩');
113
+ // The panel's introduction is the footer's RESTING text (CLAUDE.md §4), never a `<p>` at the top.
114
+ // ⚠️ ABSENCE HAS TO ERASE, not just stop writing: on a retranslation into a dictionary without the key, the old
115
+ // attribute would survive and the footer would rest in the previous language.
116
+ if (r.intro)
117
+ shell.card.setAttribute('data-explain-idle', r.intro);
118
+ else
119
+ shell.card.removeAttribute('data-explain-idle');
93
120
  }
94
- function botao(ctx, id, rotulo, classe) {
95
- const b = ctx.criar('button');
121
+ function button(ctx, id, cssClass) {
122
+ const b = ctx.create('button');
96
123
  b.id = id;
97
- b.className = classe;
124
+ b.className = cssClass;
98
125
  b.setAttribute('type', 'button');
99
- // `textContent` e não `innerHTML`: um rótulo traduzido é dado de fora como qualquer outro, e um dicionário
100
- // de consumidor pode trazer o que quiser dentro dele.
101
- b.textContent = rotulo;
126
+ // The label comes in through `applyLabels`, by `textContent` and not `innerHTML`: a translated label is outside data
127
+ // like any other, and a consumer's dictionary can bring anything inside it.
102
128
  return b;
103
129
  }
@@ -0,0 +1,116 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import type { PanelShellCtx } from './panel-shell.js';
3
+ /**
4
+ * The control's SHAPE, not its tag — because the question a panel asks is "does this turn on and off?", not "is this a
5
+ * `<button>`?".
6
+ *
7
+ * 📏 The first three came from measuring the panels: `interruptor` (a switch) covers most of the controls they reach,
8
+ * `escolha` (a select) and `cursor` (a slider) the rest. A new shape enters when a panel demands it, not before.
9
+ */
10
+ export type ControlShape = 'interruptor' | 'escolha' | 'cursor' | 'radio' | 'button';
11
+ export interface ControlRowSpec {
12
+ /** The CONTROL's id — `opt-facil`, `cane-div`. It is how the `settings-*` finds it. */
13
+ readonly id: string;
14
+ /** The SHORT label, already translated. It goes in the `<strong>`, and it is the only thing in view on the row. */
15
+ readonly label: string;
16
+ /**
17
+ * The explanation, already translated. It goes into a SINGLE `.opt-hint`, which `fillExplain` moves to the footer.
18
+ *
19
+ * 📌 Absent = this row has no explanation, which is a legitimate answer. The footer then rests on the panel's text
20
+ * (`data-explain-idle`) while the cursor is on it.
21
+ */
22
+ readonly hint?: string;
23
+ /** The control's shape. Absent: `interruptor`, the most common case. */
24
+ readonly shape?: ControlShape;
25
+ /**
26
+ * The name a screen reader announces, when it is not the label.
27
+ *
28
+ * ⚠️ IT EXISTS BECAUSE A SWITCH'S TEXT IS ITS STATE, not its name: a `<button>` whose `textContent` says "Off"
29
+ * announces "Off, button" and the person does not know off WHAT. The `<strong>` beside it solves that for whoever SEES
30
+ * the whole row; for whoever navigates control by control, this attribute solves it. Absent, it falls back to
31
+ * `label` — which is the right answer, not a fallback.
32
+ */
33
+ readonly ariaLabel?: string;
34
+ }
35
+ export interface ControlRow {
36
+ /** The whole `.ctrl-row`. It is where ADR-0029's `markChanged` puts the left-the-default mark. */
37
+ readonly row: HTMLElement;
38
+ /** The control itself, with the requested id. */
39
+ readonly control: HTMLElement;
40
+ }
41
+ /**
42
+ * Builds a menu row: a short label, a hint that goes to the footer, and a control.
43
+ *
44
+ * The row is NOT inserted anywhere — whoever mounts it decides the order, which in this project's menus is part of the
45
+ * decision (ADR-0044 §2).
46
+ */
47
+ export declare function controlRow(ctx: PanelShellCtx, spec: ControlRowSpec): ControlRow;
48
+ /**
49
+ * REWRITES THE WORDS OF A ROW THAT ALREADY EXISTS — the counterpart of `ui/panel-shell.applyLabels`, one level down.
50
+ *
51
+ * 🔴 The inside of a panel is mounted once, and anything mounted at boot captures the fallback language's text:
52
+ * `initI18n` applies the fallback synchronously and REQUESTS the preferred one, which arrives later — a panel would serve
53
+ * its TITLE in one language and its ROWS in another, on the same screen.
54
+ *
55
+ * ⚠️ AND NO UNIT TEST CATCHES IT, because they all run in a single language.
56
+ *
57
+ * ⚠️ REWRITE AND NOT REBUILD, for the reason `applyLabels` already states: each `ui/settings-*` wires its controls'
58
+ * clicks ONCE, at boot. Remaking the row would leave a control in the document with no listener — a dead button that
59
+ * looks alive (ADR-0106 §5).
60
+ */
61
+ export declare function labelRow(rowNode: HTMLElement, spec: ControlRowSpec): void;
62
+ /**
63
+ * The header of a panel section: a title and a tag that qualifies it.
64
+ *
65
+ * 📏 It is in the kit because several panels wrote it by hand, with the `.panel-sub__tag` markup copied into each — the
66
+ * same reason as `controlRow`: a rule repeated across files is a rule that drifts.
67
+ *
68
+ * ⚠️ AND IT REFUSES TO EXIST OVER NOTHING, which is the behaviour that makes it worth a function. An "awaiting
69
+ * negotiation" heading with no row under it tells the reader something is there when nothing is, and the person looks
70
+ * for what the title promises. `rows` is the NUMBER of rows the section will have — passing it is what makes this rule
71
+ * exercisable by a case, instead of an `if` no fixed tree reaches.
72
+ *
73
+ * 📌 The title and tag arrive ALREADY TRANSLATED, as in `controlRow`: the kit does not decide language, it builds shape.
74
+ */
75
+ export declare function sectionHeader(ctx: PanelShellCtx, title: string, tag: string, rows: number): HTMLElement | null;
76
+ /**
77
+ * What a steps control needs: a name, the positions (already translated) and the current one.
78
+ *
79
+ * 🎯 THE DEV ASKED FOR IT, with an exact shape: the contrast boost «deve funcionar trocando entre desligado, linear,
80
+ * misto e quadrático da mesma forma que se troca o número de jogadores, isto é, apertando botões direita e esquerda, e
81
+ * não através de uma barra», and the rounded corners «também». A slider hides how many positions there are; a dropdown
82
+ * hides them all until it opens. Steps always say where you are.
83
+ *
84
+ * 🔴 AND THE SHAPE IS A SINGLE LINE: «◀ Rótulo: valor ▶» (ADR-0130 errata, rule 3) — the Dev: «Não faça essa coisa
85
+ * estranha. Escreva "< Rounded corner: off >"». It is the way to cycle between FEW positions — up to five; above that,
86
+ * a dropdown.
87
+ */
88
+ export interface StepsSpec {
89
+ /** The control's spoken name — it goes to `aria-label`. */
90
+ readonly label: string;
91
+ /** The positions, in order, already translated. */
92
+ readonly values: readonly string[];
93
+ /** The index of the current position. */
94
+ readonly current: number;
95
+ }
96
+ /**
97
+ * The next step, CLAMPED at the ends — not a ring, and the difference is the decision.
98
+ *
99
+ * ⚠️ In a ring, right from the largest position would return to off: whoever adjusts looking for the maximum would pass
100
+ * it without warning and switch off what they wanted to raise. Clamped, the end is a wall you feel — the number of
101
+ * players, the model the Dev gave, does not wrap either.
102
+ */
103
+ export declare function nextStep(from: number, total: number, delta: number): number;
104
+ /**
105
+ * Builds the control: ONE focusable element (`role="spinbutton"`) with the two arrows inside.
106
+ *
107
+ * ⚠️ THE ARROWS ARE NOT BUTTONS, on purpose: menu navigation treats every `button` as an item, and three items for one
108
+ * adjustment would make the cursor stop twice on nameless arrows. Focus belongs to the control; the arrows are FINGER
109
+ * targets (`data-passo`), outside the accessibility tree — whoever listens gets the `aria-valuetext`.
110
+ *
111
+ * The control emits `passo` (`CustomEvent<number>`, -1 or +1): a tapped arrow emits it from here, and the keyboard's and
112
+ * controller's left and right emit it through `ui/menu-nav`. The user listens to a single event.
113
+ */
114
+ export declare function mountSteps(ctx: PanelShellCtx, spec: StepsSpec): HTMLElement;
115
+ /** Reflects the current position: the written value, what is heard, and the ends that no longer move. */
116
+ export declare function updateSteps(el: HTMLElement, spec: StepsSpec): void;
@@ -0,0 +1,208 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ /**
3
+ * Builds a menu row: a short label, a hint that goes to the footer, and a control.
4
+ *
5
+ * The row is NOT inserted anywhere — whoever mounts it decides the order, which in this project's menus is part of the
6
+ * decision (ADR-0044 §2).
7
+ */
8
+ export function controlRow(ctx, spec) {
9
+ const rowNode = ctx.create('div');
10
+ rowNode.className = 'ctrl-row';
11
+ const text = ctx.create('span');
12
+ const shortLabel = ctx.create('strong');
13
+ shortLabel.textContent = spec.label;
14
+ text.appendChild(shortLabel);
15
+ if (spec.hint) {
16
+ // ⚠️ ONLY ONE, and it is what `fillExplain` looks for. Two `.opt-hint`s on one row would give the control two
17
+ // descriptions, and the footer would show the first — the other would stay on the row, exactly the defect rule §4
18
+ // exists to prevent.
19
+ const explanation = ctx.create('span');
20
+ explanation.className = 'opt-hint';
21
+ explanation.textContent = spec.hint;
22
+ text.appendChild(explanation);
23
+ }
24
+ rowNode.appendChild(text);
25
+ const control = buildControl(ctx, spec);
26
+ control.id = spec.id;
27
+ control.setAttribute('aria-label', spec.ariaLabel ?? spec.label);
28
+ rowNode.appendChild(control);
29
+ return { row: rowNode, control: control };
30
+ }
31
+ /**
32
+ * REWRITES THE WORDS OF A ROW THAT ALREADY EXISTS — the counterpart of `ui/panel-shell.applyLabels`, one level down.
33
+ *
34
+ * 🔴 The inside of a panel is mounted once, and anything mounted at boot captures the fallback language's text:
35
+ * `initI18n` applies the fallback synchronously and REQUESTS the preferred one, which arrives later — a panel would serve
36
+ * its TITLE in one language and its ROWS in another, on the same screen.
37
+ *
38
+ * ⚠️ AND NO UNIT TEST CATCHES IT, because they all run in a single language.
39
+ *
40
+ * ⚠️ REWRITE AND NOT REBUILD, for the reason `applyLabels` already states: each `ui/settings-*` wires its controls'
41
+ * clicks ONCE, at boot. Remaking the row would leave a control in the document with no listener — a dead button that
42
+ * looks alive (ADR-0106 §5).
43
+ */
44
+ export function labelRow(rowNode, spec) {
45
+ const shortLabel = rowNode.querySelector('strong');
46
+ if (shortLabel)
47
+ shortLabel.textContent = spec.label;
48
+ const explanation = rowNode.querySelector('.opt-hint');
49
+ // ⚠️ A hint that DISAPPEARS has to be erased, not just left unwritten: on a retranslation into a dictionary without
50
+ // the key, the old text would survive and the footer would rest in the previous language.
51
+ if (explanation)
52
+ explanation.textContent = spec.hint ?? '';
53
+ // The control is found by COMPARING its id, not by building a selector from it: a selector needs the id escaped, escaping
54
+ // needs `CSS.escape`, and `CSS` is a browser global that THROWS where it does not exist — it took down a boot in a case's fake
55
+ // document once (2026-09-21). No selector, nothing to escape, no global (ADR-0221 step 7d).
56
+ const control = [...rowNode.querySelectorAll('[id]')].find((el) => el.id === spec.id);
57
+ if (control)
58
+ control.setAttribute('aria-label', spec.ariaLabel ?? spec.label);
59
+ }
60
+ function buildControl(ctx, spec) {
61
+ const controlShape = spec.shape ?? 'interruptor';
62
+ if (controlShape === 'escolha') {
63
+ const s = ctx.create('select');
64
+ s.className = 'vol';
65
+ return s;
66
+ }
67
+ if (controlShape === 'cursor') {
68
+ const i = ctx.create('input');
69
+ i.className = 'vol';
70
+ i.setAttribute('type', 'range');
71
+ // The volume slider's bounds, the same the audio panel reads: 0..100 in steps of 1, converted to the project's
72
+ // 0..1 volume by the panel.
73
+ i.setAttribute('min', '0');
74
+ i.setAttribute('max', '100');
75
+ i.setAttribute('step', '1');
76
+ return i;
77
+ }
78
+ if (controlShape === 'button') {
79
+ /*
80
+ * 🎯 THE ONE SHAPE THAT HOLDS NO VALUE: the others answer "which position am I in", this one DOES something.
81
+ * `ui/settings-controls` demands it — its button opens the capture of a key.
82
+ *
83
+ * 📌 No `aria-pressed` and no `role`: a button that acts already IS a button to whoever listens, and an announced
84
+ * state that does not exist is worse than no state. The panel puts the FACE on it — for remapping, the current
85
+ * keys —, because only the panel knows what the button shows.
86
+ */
87
+ const a = ctx.create('button');
88
+ a.className = 'mode-btn';
89
+ a.setAttribute('type', 'button');
90
+ return a;
91
+ }
92
+ if (controlShape === 'radio') {
93
+ /*
94
+ * 🔴 A CHOICE IS NOT A SWITCH, and the difference is what the ADR-0012 amendment says in so many words: «THE MENU IS
95
+ * A CHOICE, NOT A TOGGLE […] One font is active; the others are alternatives, not switches.» Hence three
96
+ * differences: no `switch` class (which draws a 52×28 px knob, the drawing of a state that does not exist),
97
+ * `role="radio"`, and `aria-checked` instead of `aria-pressed` — independent switches would announce on/off to
98
+ * choose ONE thing.
99
+ *
100
+ * 📌 `ui/settings-typo` demands it. The panel, not the kit, groups the `role="radio"`s in a `role="radiogroup"`,
101
+ * because the panel knows whether exclusivity covers a section or the whole menu.
102
+ */
103
+ const r = ctx.create('button');
104
+ r.className = 'mode-btn';
105
+ r.setAttribute('type', 'button');
106
+ r.setAttribute('role', 'radio');
107
+ r.setAttribute('aria-checked', 'false');
108
+ return r;
109
+ }
110
+ const b = ctx.create('button');
111
+ // `switch` is the class this project's CSS gives switches, and `aria-pressed` is what tells the state to whoever
112
+ // listens. The panel reflects the value; what is born here is the HONEST state of something that has read nothing
113
+ // yet: off.
114
+ b.className = 'mode-btn switch';
115
+ b.setAttribute('type', 'button');
116
+ b.setAttribute('aria-pressed', 'false');
117
+ return b;
118
+ }
119
+ /* ===================== THE SECTION HEADER — whose turn it is to act ===================== */
120
+ /**
121
+ * The header of a panel section: a title and a tag that qualifies it.
122
+ *
123
+ * 📏 It is in the kit because several panels wrote it by hand, with the `.panel-sub__tag` markup copied into each — the
124
+ * same reason as `controlRow`: a rule repeated across files is a rule that drifts.
125
+ *
126
+ * ⚠️ AND IT REFUSES TO EXIST OVER NOTHING, which is the behaviour that makes it worth a function. An "awaiting
127
+ * negotiation" heading with no row under it tells the reader something is there when nothing is, and the person looks
128
+ * for what the title promises. `rows` is the NUMBER of rows the section will have — passing it is what makes this rule
129
+ * exercisable by a case, instead of an `if` no fixed tree reaches.
130
+ *
131
+ * 📌 The title and tag arrive ALREADY TRANSLATED, as in `controlRow`: the kit does not decide language, it builds shape.
132
+ */
133
+ export function sectionHeader(ctx, title, tag, rows) {
134
+ if (rows === 0)
135
+ return null;
136
+ const h = ctx.create('h3');
137
+ h.className = 'panel-sub';
138
+ h.textContent = title + ' ';
139
+ const mark = ctx.create('span');
140
+ mark.className = 'panel-sub__tag';
141
+ mark.textContent = tag;
142
+ h.appendChild(mark);
143
+ return h;
144
+ }
145
+ /**
146
+ * The next step, CLAMPED at the ends — not a ring, and the difference is the decision.
147
+ *
148
+ * ⚠️ In a ring, right from the largest position would return to off: whoever adjusts looking for the maximum would pass
149
+ * it without warning and switch off what they wanted to raise. Clamped, the end is a wall you feel — the number of
150
+ * players, the model the Dev gave, does not wrap either.
151
+ */
152
+ export function nextStep(from, total, delta) {
153
+ if (total <= 0)
154
+ return 0;
155
+ return Math.max(0, Math.min(total - 1, from + Math.sign(delta)));
156
+ }
157
+ /**
158
+ * Builds the control: ONE focusable element (`role="spinbutton"`) with the two arrows inside.
159
+ *
160
+ * ⚠️ THE ARROWS ARE NOT BUTTONS, on purpose: menu navigation treats every `button` as an item, and three items for one
161
+ * adjustment would make the cursor stop twice on nameless arrows. Focus belongs to the control; the arrows are FINGER
162
+ * targets (`data-passo`), outside the accessibility tree — whoever listens gets the `aria-valuetext`.
163
+ *
164
+ * The control emits `passo` (`CustomEvent<number>`, -1 or +1): a tapped arrow emits it from here, and the keyboard's and
165
+ * controller's left and right emit it through `ui/menu-nav`. The user listens to a single event.
166
+ */
167
+ export function mountSteps(ctx, spec) {
168
+ const el = ctx.create('div');
169
+ el.className = 'passos';
170
+ el.setAttribute('role', 'spinbutton');
171
+ el.setAttribute('tabindex', '0');
172
+ el.setAttribute('data-passos', '');
173
+ const arrow = (delta, glyph) => {
174
+ const s = ctx.create('span');
175
+ s.className = 'passo-seta';
176
+ s.setAttribute('data-passo', String(delta));
177
+ s.setAttribute('aria-hidden', 'true');
178
+ s.textContent = glyph;
179
+ s.addEventListener('click', () => el.dispatchEvent(new CustomEvent('passo', { detail: delta, bubbles: true })));
180
+ return s;
181
+ };
182
+ const value = ctx.create('span');
183
+ value.className = 'passo-valor';
184
+ el.appendChild(arrow(-1, '◀'));
185
+ el.appendChild(value);
186
+ el.appendChild(arrow(1, '▶'));
187
+ updateSteps(el, spec);
188
+ return el;
189
+ }
190
+ /** Reflects the current position: the written value, what is heard, and the ends that no longer move. */
191
+ export function updateSteps(el, spec) {
192
+ const lastIndex = Math.max(0, spec.values.length - 1);
193
+ const from = Math.max(0, Math.min(lastIndex, spec.current));
194
+ const text = spec.values[from] ?? '';
195
+ el.setAttribute('aria-label', spec.label);
196
+ el.setAttribute('aria-valuemin', '0');
197
+ el.setAttribute('aria-valuemax', String(lastIndex));
198
+ el.setAttribute('aria-valuenow', String(from));
199
+ el.setAttribute('aria-valuetext', text);
200
+ const value = el.querySelector('.passo-valor');
201
+ // THE LABEL GOES INTO THE TEXT: the whole row is the control, «◀ Cantos arredondados: pequeno ▶». Whoever listens gets
202
+ // the same in two parts — the name in `aria-label` and the position in `aria-valuetext` —, without the name repeated.
203
+ if (value)
204
+ value.textContent = spec.label ? `${spec.label}: ${text}` : text;
205
+ // The end that no longer moves is marked — otherwise a wall's arrow looks like a broken button.
206
+ el.querySelector('[data-passo="-1"]')?.classList.toggle('no-limite', from === 0);
207
+ el.querySelector('[data-passo="1"]')?.classList.toggle('no-limite', from === lastIndex);
208
+ }
@@ -0,0 +1,35 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ /** One row of the per-screen pause menu. `letra` marks the label that ABC/abc rewrites live. */
3
+ export interface PauseBtnDef {
4
+ readonly act: string;
5
+ /**
6
+ * RAW label, used only when the button has a dynamic label (`dynamicLabel`/`level`).
7
+ *
8
+ * Optional because `pmBtnMarkup` resolves every ordinary button through `t('pause.' + act)`, so text here would
9
+ * never reach a screen — it would be raw text inside an ENGINE module, waiting for someone to trust it. No entry
10
+ * today sets a dynamic label; the `pause.*` key is the source, and it exists in all three languages.
11
+ */
12
+ readonly lbl?: string;
13
+ readonly dynamicLabel?: boolean;
14
+ readonly level?: boolean;
15
+ }
16
+ /** The pause menu's items — MENU DATA, so it lives with the other menu tables. The pause slice (ui/pause-icons)
17
+ * receives it through its own ctx instead of re-declaring it; nobody owns two copies of a list of buttons. */
18
+ export declare const PM_BTNS: readonly PauseBtnDef[];
19
+ /**
20
+ * THE THIRD LIST: what belongs to THIS game (ADR-0146, ADR-0145).
21
+ *
22
+ * ⚠️ IT STARTS WITH THE BACK ITEM AND NOTHING ELSE, and the emptiness is the decision: the engine does not know what a
23
+ * game has of its own — the game declares it. A list the engine filled in would be the wheelchair in chess again.
24
+ *
25
+ * 📌 And that is why the door drops by itself: `rootThatActs` drops a door whose room is empty, and with this list
26
+ * reduced to `pmback` that is exactly the case of a game that declares nothing.
27
+ */
28
+ export declare const PM_GAME_BTNS: readonly PauseBtnDef[];
29
+ /**
30
+ * THE INCLUSION SETTINGS SUBMENU — the panels, in the order the Dev dictated (ADR-0151).
31
+ *
32
+ * The way out comes FIRST here too, for the same reason `resume` comes first there: ADR-0044's rule is about menus,
33
+ * not about one menu. A submenu you cannot leave is the same trap, one level down.
34
+ */
35
+ export declare const PM_OPTIONS_BTNS: readonly PauseBtnDef[];
@@ -0,0 +1,66 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // ui/pause-buttons — the items of the pause card the engine mounts: root, the game's options and the inclusion settings.
3
+ //
4
+ // Menu data for `ui/pause-icons`. They lived in `ui/activities-menu`, the platformer's title menu, which left the engine
5
+ // (ADR-0174, issue #171); the card is the engine's, so its buttons stay.
6
+ /** The pause menu's items — MENU DATA, so it lives with the other menu tables. The pause slice (ui/pause-icons)
7
+ * receives it through its own ctx instead of re-declaring it; nobody owns two copies of a list of buttons. */
8
+ export const PM_BTNS = [
9
+ // ===================== THE ORDER IS THE DECISION (ADR-0044 §2) =====================
10
+ // A menu you cannot leave is a trap, and the trap costs most to whoever cannot see it. `resume` comes FIRST because
11
+ // that is what a pause is for. `quit` comes LAST because it is its least wanted outcome — and, since the list is a
12
+ // RING, one key UP from `resume` reaches it: far in reading order, near to the finger.
13
+ //
14
+ // The settings panels live in `PM_OPTIONS_BTNS`.
15
+ //
16
+ // 🔴 SIX (ADR-0151), and the number is MEASURED, not taste: at 640×360, the target screen, seven items fit exactly
17
+ // and more overflow, while the target ruler is already at its floor (ADR-0095: «tela menor mostra menos itens, não
18
+ // alvos menores»).
19
+ //
20
+ // 📌 The accessibility bar and the print view are reached through SELECT — «basta apertar SELECT que se tem a visão
21
+ // apropriada pra print», in the Dev's words. Their `act`s still exist and work for whoever passes a list of their own.
22
+ { act: 'resume' },
23
+ // Help — how to play comes SECOND: it is the first thing someone who paused without knowing how to play looks for.
24
+ { act: 'ajuda' },
25
+ // ⚠️ The `act` stays `addplayer` and the LABEL is the number of players (ADR-0147 §3): `ui/shell.ts` implements
26
+ // `pauseActs.addplayer`, and cases in `shell.browser.test.js` call it.
27
+ { act: 'addplayer' },
28
+ // Inclusion settings: what the child CARRIES between games (ADR-0146, named by ADR-0151).
29
+ { act: 'options' },
30
+ // Game options: what belongs to THIS game. The door drops by itself when the game declares nothing of its own.
31
+ { act: 'opcoesdojogo' },
32
+ { act: 'quit' },
33
+ ];
34
+ /**
35
+ * THE THIRD LIST: what belongs to THIS game (ADR-0146, ADR-0145).
36
+ *
37
+ * ⚠️ IT STARTS WITH THE BACK ITEM AND NOTHING ELSE, and the emptiness is the decision: the engine does not know what a
38
+ * game has of its own — the game declares it. A list the engine filled in would be the wheelchair in chess again.
39
+ *
40
+ * 📌 And that is why the door drops by itself: `rootThatActs` drops a door whose room is empty, and with this list
41
+ * reduced to `pmback` that is exactly the case of a game that declares nothing.
42
+ */
43
+ export const PM_GAME_BTNS = [
44
+ { act: 'pmback' },
45
+ ];
46
+ /**
47
+ * THE INCLUSION SETTINGS SUBMENU — the panels, in the order the Dev dictated (ADR-0151).
48
+ *
49
+ * The way out comes FIRST here too, for the same reason `resume` comes first there: ADR-0044's rule is about menus,
50
+ * not about one menu. A submenu you cannot leave is the same trap, one level down.
51
+ */
52
+ export const PM_OPTIONS_BTNS = [
53
+ // 📌 Not here, and each has somewhere to go (ADR-0151): letter case walks the communication cycle of the bar's
54
+ // eleventh button, and typography — «quem escolhe a tipografia é o jogo, o jogador escolhe suas fontes via o menu de
55
+ // acessibilidade rápida».
56
+ // 📏 AND THE NUMBER IS WHAT FITS at 640×360; the submenu has its own case in the 44 px gate, not only the root.
57
+ // ✅ The audio panel (music, ambience, interaction, earcons), separate from hearing accessibility, is listed because
58
+ // the panel it opens exists — a door to a panel that does not exist would be ADR-0106 §5's dead button.
59
+ { act: 'pmback' },
60
+ { act: 'empatia' },
61
+ { act: 'audio' },
62
+ { act: 'som' },
63
+ { act: 'motora' },
64
+ { act: 'visual' },
65
+ { act: 'anim' },
66
+ ];