@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.
- package/README.md +89 -78
- package/app/css/style.css +584 -374
- package/app/public/vendor/fonts/bitter-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bitter-var.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cookie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ar_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_br_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ca_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_co_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_deco_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_j_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_s_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_mx_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pe_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pt_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-stix_two_math-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700.woff2 +0 -0
- package/app/public/vendor/fonts.css +1167 -51
- package/dist-pkg/boot/create-game.d.ts +467 -162
- package/dist-pkg/boot/create-game.js +3563 -426
- package/dist-pkg/core/a11y-sr.d.ts +25 -3
- package/dist-pkg/core/a11y-sr.js +40 -19
- package/dist-pkg/core/accessible-label.d.ts +17 -0
- package/dist-pkg/core/accessible-label.js +37 -0
- package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
- package/dist-pkg/core/accommodation-subjects.js +32 -0
- package/dist-pkg/core/accommodations.d.ts +107 -0
- package/dist-pkg/core/accommodations.js +178 -0
- package/dist-pkg/core/actions.d.ts +75 -51
- package/dist-pkg/core/actions.js +98 -69
- package/dist-pkg/core/calm-mode.d.ts +31 -0
- package/dist-pkg/core/calm-mode.js +47 -0
- package/dist-pkg/core/camera-cycle.d.ts +15 -0
- package/dist-pkg/core/camera-cycle.js +7 -0
- package/dist-pkg/core/caption-duration.d.ts +15 -0
- package/dist-pkg/core/caption-duration.js +19 -0
- package/dist-pkg/core/cartridge-problems.d.ts +34 -0
- package/dist-pkg/core/cartridge-problems.js +53 -0
- package/dist-pkg/core/constants.d.ts +0 -54
- package/dist-pkg/core/constants.js +9 -76
- package/dist-pkg/core/contract.d.ts +143 -163
- package/dist-pkg/core/contract.js +223 -207
- package/dist-pkg/core/dom-query.d.ts +4 -4
- package/dist-pkg/core/dom-query.js +12 -20
- package/dist-pkg/core/entity.d.ts +62 -77
- package/dist-pkg/core/entity.js +18 -32
- package/dist-pkg/core/escape-html.d.ts +9 -10
- package/dist-pkg/core/escape-html.js +16 -20
- package/dist-pkg/core/flash-threshold.d.ts +17 -0
- package/dist-pkg/core/flash-threshold.js +113 -0
- package/dist-pkg/core/game-speed.d.ts +11 -0
- package/dist-pkg/core/game-speed.js +16 -0
- package/dist-pkg/core/genres.d.ts +20 -0
- package/dist-pkg/core/genres.js +44 -0
- package/dist-pkg/core/i18n.d.ts +87 -41
- package/dist-pkg/core/i18n.js +206 -153
- package/dist-pkg/core/loop.d.ts +17 -6
- package/dist-pkg/core/loop.js +26 -26
- package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
- package/dist-pkg/core/pause-icon-catalogue.js +54 -0
- package/dist-pkg/core/ring.d.ts +17 -0
- package/dist-pkg/core/ring.js +29 -0
- package/dist-pkg/core/rng.d.ts +7 -12
- package/dist-pkg/core/rng.js +23 -53
- package/dist-pkg/core/route.d.ts +26 -26
- package/dist-pkg/core/route.js +126 -121
- package/dist-pkg/core/scenes.d.ts +37 -40
- package/dist-pkg/core/scenes.js +41 -43
- package/dist-pkg/core/screens.d.ts +4 -4
- package/dist-pkg/core/screens.js +11 -16
- package/dist-pkg/core/setting-defaults.d.ts +61 -0
- package/dist-pkg/core/setting-defaults.js +66 -0
- package/dist-pkg/core/speech-rate.d.ts +29 -0
- package/dist-pkg/core/speech-rate.js +47 -0
- package/dist-pkg/core/state.d.ts +118 -118
- package/dist-pkg/core/state.js +322 -297
- package/dist-pkg/core/visual-cycles.d.ts +30 -0
- package/dist-pkg/core/visual-cycles.js +52 -0
- package/dist-pkg/core/visual-state.d.ts +13 -0
- package/dist-pkg/core/visual-state.js +6 -0
- package/dist-pkg/educational/activities-registry.d.ts +1 -1
- package/dist-pkg/educational/activities-registry.js +9 -8
- package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
- package/dist-pkg/educational/adaptive-engine.js +17 -17
- package/dist-pkg/educational/segment-bar.d.ts +12 -12
- package/dist-pkg/educational/segment-bar.js +9 -9
- package/dist-pkg/i18n/en.js +321 -215
- package/dist-pkg/i18n/es.js +320 -215
- package/dist-pkg/i18n/pt.js +342 -215
- package/dist-pkg/input/default-bindings.d.ts +37 -38
- package/dist-pkg/input/default-bindings.js +127 -144
- package/dist-pkg/input/devices.d.ts +7 -7
- package/dist-pkg/input/devices.js +17 -16
- package/dist-pkg/input/edges.d.ts +23 -32
- package/dist-pkg/input/edges.js +23 -28
- package/dist-pkg/input/empathy-filter.d.ts +22 -0
- package/dist-pkg/input/empathy-filter.js +34 -0
- package/dist-pkg/input/face-map.d.ts +96 -0
- package/dist-pkg/input/face-map.js +255 -0
- package/dist-pkg/input/face-signals.d.ts +40 -0
- package/dist-pkg/input/face-signals.js +48 -0
- package/dist-pkg/input/gamepad.d.ts +164 -145
- package/dist-pkg/input/gamepad.js +351 -559
- package/dist-pkg/input/gaze-cycle.d.ts +64 -0
- package/dist-pkg/input/gaze-cycle.js +133 -0
- package/dist-pkg/input/gaze-relative.d.ts +68 -0
- package/dist-pkg/input/gaze-relative.js +142 -0
- package/dist-pkg/input/hand-map.d.ts +28 -0
- package/dist-pkg/input/hand-map.js +142 -0
- package/dist-pkg/input/input-cooldown.d.ts +17 -0
- package/dist-pkg/input/input-cooldown.js +39 -0
- package/dist-pkg/input/keyboard-runtime.d.ts +18 -20
- package/dist-pkg/input/keyboard-runtime.js +23 -27
- package/dist-pkg/input/keyboard.d.ts +68 -62
- package/dist-pkg/input/keyboard.js +83 -105
- package/dist-pkg/input/keydown.d.ts +124 -132
- package/dist-pkg/input/keydown.js +283 -288
- package/dist-pkg/input/latch-edge.d.ts +25 -21
- package/dist-pkg/input/latch-edge.js +33 -35
- package/dist-pkg/input/latch-scope.d.ts +43 -47
- package/dist-pkg/input/latch-scope.js +66 -75
- package/dist-pkg/input/latch-store.d.ts +28 -29
- package/dist-pkg/input/latch-store.js +44 -47
- package/dist-pkg/input/latch-sync.d.ts +28 -29
- package/dist-pkg/input/latch-sync.js +25 -25
- package/dist-pkg/input/latch.d.ts +14 -17
- package/dist-pkg/input/latch.js +29 -37
- package/dist-pkg/input/pad-defaults.d.ts +13 -16
- package/dist-pkg/input/pad-defaults.js +21 -28
- package/dist-pkg/input/pad-reading.d.ts +76 -0
- package/dist-pkg/input/pad-reading.js +164 -0
- package/dist-pkg/input/pad-wizard.d.ts +96 -0
- package/dist-pkg/input/pad-wizard.js +205 -0
- package/dist-pkg/input/pointer-space.d.ts +19 -20
- package/dist-pkg/input/pointer-space.js +27 -32
- package/dist-pkg/input/pointer.d.ts +39 -40
- package/dist-pkg/input/pointer.js +42 -45
- package/dist-pkg/input/state.d.ts +101 -89
- package/dist-pkg/input/state.js +54 -134
- package/dist-pkg/input/switch-scan.d.ts +42 -0
- package/dist-pkg/input/switch-scan.js +54 -0
- package/dist-pkg/input/synthetic-source.d.ts +42 -0
- package/dist-pkg/input/synthetic-source.js +57 -0
- package/dist-pkg/input/touch-bindings.d.ts +127 -113
- package/dist-pkg/input/touch-bindings.js +158 -173
- package/dist-pkg/input/touch.d.ts +130 -70
- package/dist-pkg/input/touch.js +321 -123
- package/dist-pkg/input/transport-in-use.d.ts +107 -0
- package/dist-pkg/input/transport-in-use.js +130 -0
- package/dist-pkg/input/transports.d.ts +96 -114
- package/dist-pkg/input/transports.js +104 -106
- package/dist-pkg/input/virtual-controller.d.ts +46 -0
- package/dist-pkg/input/virtual-controller.js +41 -0
- package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
- package/dist-pkg/input/vocabulary-migration.js +80 -79
- package/dist-pkg/input/voice-map.d.ts +43 -0
- package/dist-pkg/input/voice-map.js +125 -0
- package/dist-pkg/platform/audio-ambient.d.ts +13 -1
- package/dist-pkg/platform/audio-ambient.js +11 -13
- package/dist-pkg/platform/audio-earcons.d.ts +20 -19
- package/dist-pkg/platform/audio-earcons.js +51 -42
- package/dist-pkg/platform/audio-jingles.js +9 -10
- package/dist-pkg/platform/audio-mixer.d.ts +14 -2
- package/dist-pkg/platform/audio-mixer.js +36 -39
- package/dist-pkg/platform/audio-sonar.d.ts +96 -113
- package/dist-pkg/platform/audio-sonar.js +245 -238
- package/dist-pkg/platform/audio.d.ts +53 -19
- package/dist-pkg/platform/audio.js +161 -169
- package/dist-pkg/platform/flash-sampler.d.ts +19 -0
- package/dist-pkg/platform/flash-sampler.js +79 -0
- package/dist-pkg/platform/guide-intensity.d.ts +26 -27
- package/dist-pkg/platform/guide-intensity.js +50 -52
- package/dist-pkg/platform/heavy-catalogue.d.ts +31 -0
- package/dist-pkg/platform/heavy-catalogue.js +223 -0
- package/dist-pkg/platform/heavy-mirror.d.ts +26 -0
- package/dist-pkg/platform/heavy-mirror.js +76 -0
- package/dist-pkg/platform/heavy.d.ts +104 -0
- package/dist-pkg/platform/heavy.js +169 -0
- package/dist-pkg/platform/interruptible-speech.d.ts +16 -16
- package/dist-pkg/platform/interruptible-speech.js +50 -51
- package/dist-pkg/platform/kokoro-port.d.ts +27 -0
- package/dist-pkg/platform/kokoro-port.js +50 -0
- package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
- package/dist-pkg/platform/kokoro-runtime.js +52 -0
- package/dist-pkg/platform/kokoro.d.ts +70 -0
- package/dist-pkg/platform/kokoro.js +133 -0
- package/dist-pkg/platform/listener-scope.d.ts +12 -0
- package/dist-pkg/platform/listener-scope.js +81 -0
- package/dist-pkg/platform/locale-host.d.ts +10 -0
- package/dist-pkg/platform/locale-host.js +34 -0
- package/dist-pkg/platform/microphone.d.ts +51 -0
- package/dist-pkg/platform/microphone.js +118 -0
- package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
- package/dist-pkg/platform/onnx-runtime.js +42 -0
- package/dist-pkg/platform/reading-in-worker.d.ts +40 -0
- package/dist-pkg/platform/reading-in-worker.js +87 -0
- package/dist-pkg/platform/reading-model.d.ts +73 -0
- package/dist-pkg/platform/reading-model.js +247 -0
- package/dist-pkg/platform/reading-runtime.d.ts +24 -0
- package/dist-pkg/platform/reading-runtime.js +159 -0
- package/dist-pkg/platform/reading-worker.d.ts +41 -0
- package/dist-pkg/platform/reading-worker.js +58 -0
- package/dist-pkg/platform/reading.d.ts +69 -0
- package/dist-pkg/platform/reading.js +128 -0
- package/dist-pkg/platform/speech-recognition.d.ts +51 -0
- package/dist-pkg/platform/speech-recognition.js +84 -0
- package/dist-pkg/platform/speech.d.ts +14 -1
- package/dist-pkg/platform/speech.js +13 -13
- package/dist-pkg/platform/storage-keys.d.ts +96 -0
- package/dist-pkg/platform/storage-keys.js +106 -0
- package/dist-pkg/platform/storage.d.ts +46 -111
- package/dist-pkg/platform/storage.js +104 -169
- package/dist-pkg/platform/tts.d.ts +51 -38
- package/dist-pkg/platform/tts.js +217 -119
- package/dist-pkg/platform/vision-loop.d.ts +23 -0
- package/dist-pkg/platform/vision-loop.js +56 -0
- package/dist-pkg/platform/vision.d.ts +132 -0
- package/dist-pkg/platform/vision.js +117 -0
- package/dist-pkg/platform/voice-listener.d.ts +36 -0
- package/dist-pkg/platform/voice-listener.js +88 -0
- package/dist-pkg/platform/voice-plan.d.ts +6 -102
- package/dist-pkg/platform/voice-plan.js +9 -151
- package/dist-pkg/platform/vosk-runtime.d.ts +71 -0
- package/dist-pkg/platform/vosk-runtime.js +93 -0
- package/dist-pkg/render/canvas.d.ts +13 -7
- package/dist-pkg/render/canvas.js +13 -13
- package/dist-pkg/render/crt.d.ts +46 -12
- package/dist-pkg/render/crt.js +82 -80
- package/dist-pkg/render/cvd-matrices.d.ts +18 -18
- package/dist-pkg/render/cvd-matrices.js +33 -38
- package/dist-pkg/render/hc-role-data.d.ts +7 -7
- package/dist-pkg/render/hc-role-data.js +14 -14
- package/dist-pkg/render/high-contrast.d.ts +66 -54
- package/dist-pkg/render/high-contrast.js +221 -216
- package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
- package/dist-pkg/render/low-vision-drawing.js +46 -0
- package/dist-pkg/render/lq-filter.d.ts +32 -20
- package/dist-pkg/render/lq-filter.js +59 -65
- package/dist-pkg/render/port.d.ts +86 -88
- package/dist-pkg/render/port.js +17 -23
- package/dist-pkg/render/screen-pipeline.d.ts +42 -42
- package/dist-pkg/render/screen-pipeline.js +80 -87
- package/dist-pkg/render/sprite-fx.d.ts +2 -1
- package/dist-pkg/render/sprite-fx.js +16 -14
- package/dist-pkg/render/viewports.d.ts +20 -15
- package/dist-pkg/render/viewports.js +83 -114
- package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
- package/dist-pkg/render/viz-axes-labels.js +88 -0
- package/dist-pkg/render/viz-axes.d.ts +80 -86
- package/dist-pkg/render/viz-axes.js +115 -116
- package/dist-pkg/render/viz-modes.d.ts +28 -29
- package/dist-pkg/render/viz-modes.js +40 -45
- package/dist-pkg/render/viz-refusal.d.ts +32 -0
- package/dist-pkg/render/viz-refusal.js +57 -0
- package/dist-pkg/render/viz-setters.d.ts +104 -66
- package/dist-pkg/render/viz-setters.js +182 -191
- package/dist-pkg/ui/aac-sets.d.ts +40 -0
- package/dist-pkg/ui/aac-sets.js +49 -0
- package/dist-pkg/ui/audio-choices.d.ts +63 -0
- package/dist-pkg/ui/audio-choices.js +94 -0
- package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
- package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
- package/dist-pkg/ui/camera-control.d.ts +6 -0
- package/dist-pkg/ui/camera-control.js +14 -0
- package/dist-pkg/ui/changed-mark.d.ts +9 -8
- package/dist-pkg/ui/changed-mark.js +22 -53
- package/dist-pkg/ui/control-choices.d.ts +37 -0
- package/dist-pkg/ui/control-choices.js +84 -0
- package/dist-pkg/ui/debug-panel.d.ts +59 -43
- package/dist-pkg/ui/debug-panel.js +68 -69
- package/dist-pkg/ui/dom.d.ts +10 -14
- package/dist-pkg/ui/dom.js +10 -47
- package/dist-pkg/ui/drawing-problems.d.ts +25 -0
- package/dist-pkg/ui/drawing-problems.js +93 -0
- package/dist-pkg/ui/eye-control.d.ts +36 -0
- package/dist-pkg/ui/eye-control.js +178 -0
- package/dist-pkg/ui/face-control.d.ts +25 -0
- package/dist-pkg/ui/face-control.js +183 -0
- package/dist-pkg/ui/focus-trap.d.ts +39 -49
- package/dist-pkg/ui/focus-trap.js +56 -65
- package/dist-pkg/ui/fonts.d.ts +118 -63
- package/dist-pkg/ui/fonts.js +267 -111
- package/dist-pkg/ui/game-options.d.ts +42 -0
- package/dist-pkg/ui/game-options.js +138 -0
- package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
- package/dist-pkg/ui/gaze-overlay.js +165 -0
- package/dist-pkg/ui/hand-control.d.ts +25 -0
- package/dist-pkg/ui/hand-control.js +143 -0
- package/dist-pkg/ui/help-panel.d.ts +76 -0
- package/dist-pkg/ui/help-panel.js +232 -0
- package/dist-pkg/ui/hud-bands.d.ts +45 -0
- package/dist-pkg/ui/hud-bands.js +108 -0
- package/dist-pkg/ui/hud.d.ts +73 -70
- package/dist-pkg/ui/hud.js +94 -98
- package/dist-pkg/ui/item-announcement.d.ts +13 -12
- package/dist-pkg/ui/item-announcement.js +25 -26
- package/dist-pkg/ui/latch-refusal.d.ts +22 -21
- package/dist-pkg/ui/latch-refusal.js +37 -37
- package/dist-pkg/ui/layout.d.ts +103 -28
- package/dist-pkg/ui/layout.js +114 -99
- package/dist-pkg/ui/locale-flags.d.ts +16 -0
- package/dist-pkg/ui/locale-flags.js +30 -0
- package/dist-pkg/ui/loop-crash.d.ts +17 -17
- package/dist-pkg/ui/loop-crash.js +33 -62
- package/dist-pkg/ui/menu-intent.d.ts +32 -0
- package/dist-pkg/ui/menu-intent.js +54 -0
- package/dist-pkg/ui/menu-items.d.ts +10 -0
- package/dist-pkg/ui/menu-items.js +22 -0
- package/dist-pkg/ui/menu-nav.d.ts +60 -90
- package/dist-pkg/ui/menu-nav.js +301 -274
- package/dist-pkg/ui/mobility-choices.d.ts +26 -0
- package/dist-pkg/ui/mobility-choices.js +41 -0
- package/dist-pkg/ui/motion-choices.d.ts +31 -0
- package/dist-pkg/ui/motion-choices.js +68 -0
- package/dist-pkg/ui/motion-scene.d.ts +24 -19
- package/dist-pkg/ui/motion-scene.js +29 -61
- package/dist-pkg/ui/mount-panel.d.ts +81 -0
- package/dist-pkg/ui/mount-panel.js +61 -0
- package/dist-pkg/ui/panel-shell.d.ts +65 -31
- package/dist-pkg/ui/panel-shell.js +92 -66
- package/dist-pkg/ui/panel-widgets.d.ts +116 -0
- package/dist-pkg/ui/panel-widgets.js +208 -0
- package/dist-pkg/ui/pause-buttons.d.ts +35 -0
- package/dist-pkg/ui/pause-buttons.js +66 -0
- package/dist-pkg/ui/pause-icons.d.ts +250 -343
- package/dist-pkg/ui/pause-icons.js +614 -605
- package/dist-pkg/ui/pause-markup.d.ts +86 -0
- package/dist-pkg/ui/pause-markup.js +125 -0
- package/dist-pkg/ui/reach-notice.d.ts +22 -23
- package/dist-pkg/ui/reach-notice.js +55 -58
- package/dist-pkg/ui/scan-overlay.d.ts +23 -0
- package/dist-pkg/ui/scan-overlay.js +42 -0
- package/dist-pkg/ui/settings-aac.d.ts +68 -0
- package/dist-pkg/ui/settings-aac.js +189 -0
- package/dist-pkg/ui/settings-audio.d.ts +91 -113
- package/dist-pkg/ui/settings-audio.js +407 -405
- package/dist-pkg/ui/settings-controls.d.ts +53 -92
- package/dist-pkg/ui/settings-controls.js +143 -215
- package/dist-pkg/ui/settings-empathy.d.ts +39 -30
- package/dist-pkg/ui/settings-empathy.js +53 -60
- package/dist-pkg/ui/settings-mobility.d.ts +195 -0
- package/dist-pkg/ui/settings-mobility.js +374 -0
- package/dist-pkg/ui/settings-motion.d.ts +91 -70
- package/dist-pkg/ui/settings-motion.js +287 -198
- package/dist-pkg/ui/settings-panel.d.ts +48 -45
- package/dist-pkg/ui/settings-panel.js +164 -93
- package/dist-pkg/ui/settings-typo.d.ts +28 -76
- package/dist-pkg/ui/settings-typo.js +145 -125
- package/dist-pkg/ui/settings-visual.d.ts +29 -87
- package/dist-pkg/ui/settings-visual.js +240 -193
- package/dist-pkg/ui/shell.d.ts +113 -134
- package/dist-pkg/ui/shell.js +143 -216
- package/dist-pkg/ui/simulation-list.d.ts +27 -0
- package/dist-pkg/ui/simulation-list.js +76 -0
- package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
- package/dist-pkg/ui/simulation-over-the-world.js +131 -0
- package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
- package/dist-pkg/ui/simulation-refusal.js +8 -56
- package/dist-pkg/ui/switchable-control.d.ts +11 -0
- package/dist-pkg/ui/switchable-control.js +19 -0
- package/dist-pkg/ui/title.d.ts +4 -4
- package/dist-pkg/ui/title.js +11 -13
- package/dist-pkg/ui/top-band.d.ts +24 -0
- package/dist-pkg/ui/top-band.js +100 -0
- package/dist-pkg/ui/typo-choices.d.ts +71 -0
- package/dist-pkg/ui/typo-choices.js +84 -0
- package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
- package/dist-pkg/ui/visual-axes-panel.js +12 -94
- package/dist-pkg/ui/visual-choices.d.ts +77 -0
- package/dist-pkg/ui/visual-choices.js +107 -0
- package/dist-pkg/ui/vlibras.d.ts +33 -10
- package/dist-pkg/ui/vlibras.js +58 -81
- package/dist-pkg/ui/voice-control.d.ts +46 -0
- package/dist-pkg/ui/voice-control.js +143 -0
- package/dist-pkg/ui/voice-settings.d.ts +96 -0
- package/dist-pkg/ui/voice-settings.js +302 -0
- package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
- package/dist-pkg/ui/where-the-child-is.js +70 -0
- package/docs/CREDITS.md +198 -54
- package/docs/LICENSES.md +160 -145
- package/package.json +24 -25
- package/scripts/heavy-into-the-delivery.mjs +144 -0
- package/scripts/licences/Apache-2.0.txt +176 -0
- package/scripts/licences/GPL-3.0.txt +674 -0
- package/scripts/licences/MIT.txt +17 -0
- package/scripts/licences/third-party.mjs +287 -0
- package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
- package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
- package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
- package/dist-pkg/core/anel.d.ts +0 -17
- package/dist-pkg/core/anel.js +0 -31
- package/dist-pkg/core/collision.d.ts +0 -21
- package/dist-pkg/core/collision.js +0 -62
- package/dist-pkg/core/layers.d.ts +0 -63
- package/dist-pkg/core/layers.js +0 -95
- package/dist-pkg/core/letter-grid.d.ts +0 -55
- package/dist-pkg/core/letter-grid.js +0 -116
- package/dist-pkg/core/password.d.ts +0 -34
- package/dist-pkg/core/password.js +0 -205
- package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
- package/dist-pkg/core/rotulo-acessivel.js +0 -41
- package/dist-pkg/core/run-state.d.ts +0 -115
- package/dist-pkg/core/run-state.js +0 -40
- package/dist-pkg/core/tiles.d.ts +0 -12
- package/dist-pkg/core/tiles.js +0 -61
- package/dist-pkg/core/world.d.ts +0 -4
- package/dist-pkg/core/world.js +0 -58
- package/dist-pkg/input/origem-sintetica.d.ts +0 -44
- package/dist-pkg/input/origem-sintetica.js +0 -60
- package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
- package/dist-pkg/input/transporte-em-uso.js +0 -130
- package/dist-pkg/platform/audio-nav.d.ts +0 -51
- package/dist-pkg/platform/audio-nav.js +0 -99
- package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
- package/dist-pkg/platform/pesados-catalogo.js +0 -177
- package/dist-pkg/platform/pesados.d.ts +0 -31
- package/dist-pkg/platform/pesados.js +0 -75
- package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
- package/dist-pkg/platform/vozes-prontas.js +0 -61
- package/dist-pkg/render/camera.d.ts +0 -58
- package/dist-pkg/render/camera.js +0 -105
- package/dist-pkg/render/cenario-data.d.ts +0 -127
- package/dist-pkg/render/cenario-data.js +0 -145
- package/dist-pkg/render/city-tex.d.ts +0 -63
- package/dist-pkg/render/city-tex.js +0 -228
- package/dist-pkg/render/city-tiles.d.ts +0 -11
- package/dist-pkg/render/city-tiles.js +0 -140
- package/dist-pkg/render/draw.d.ts +0 -149
- package/dist-pkg/render/draw.js +0 -231
- package/dist-pkg/render/fx.d.ts +0 -63
- package/dist-pkg/render/fx.js +0 -123
- package/dist-pkg/render/minimap.d.ts +0 -11
- package/dist-pkg/render/minimap.js +0 -94
- package/dist-pkg/render/parallax.d.ts +0 -85
- package/dist-pkg/render/parallax.js +0 -158
- package/dist-pkg/render/player-anim.d.ts +0 -71
- package/dist-pkg/render/player-anim.js +0 -152
- package/dist-pkg/render/recycling-tex.d.ts +0 -48
- package/dist-pkg/render/recycling-tex.js +0 -164
- package/dist-pkg/render/scene-city.d.ts +0 -77
- package/dist-pkg/render/scene-city.js +0 -181
- package/dist-pkg/render/scene-parallax.d.ts +0 -72
- package/dist-pkg/render/scene-parallax.js +0 -426
- package/dist-pkg/render/scene-sky.d.ts +0 -126
- package/dist-pkg/render/scene-sky.js +0 -295
- package/dist-pkg/render/set-cenario.d.ts +0 -54
- package/dist-pkg/render/set-cenario.js +0 -103
- package/dist-pkg/render/textures.d.ts +0 -75
- package/dist-pkg/render/textures.js +0 -240
- package/dist-pkg/render/title-scene.d.ts +0 -46
- package/dist-pkg/render/title-scene.js +0 -75
- package/dist-pkg/render/weather.d.ts +0 -96
- package/dist-pkg/render/weather.js +0 -171
- package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
- package/dist-pkg/render/wheelchair-sprites.js +0 -69
- package/dist-pkg/render/world-tex.d.ts +0 -18
- package/dist-pkg/render/world-tex.js +0 -87
- package/dist-pkg/ui/activities-menu.d.ts +0 -258
- package/dist-pkg/ui/activities-menu.js +0 -648
- package/dist-pkg/ui/caa-sets.d.ts +0 -39
- package/dist-pkg/ui/caa-sets.js +0 -65
- package/dist-pkg/ui/map-hub.d.ts +0 -56
- package/dist-pkg/ui/map-hub.js +0 -138
- package/dist-pkg/ui/settings-caa.d.ts +0 -45
- package/dist-pkg/ui/settings-caa.js +0 -137
- package/dist-pkg/ui/settings-motor.d.ts +0 -175
- package/dist-pkg/ui/settings-motor.js +0 -342
- package/dist-pkg/ui/webcam.d.ts +0 -7
- package/dist-pkg/ui/webcam.js +0 -93
|
@@ -1,277 +1,582 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
import { type
|
|
2
|
+
import { type Translate } from '../core/i18n.js';
|
|
3
|
+
import { type LiveInput } from '../input/state.js';
|
|
4
|
+
import { type FlashMeasurement } from '../platform/flash-sampler.js';
|
|
5
|
+
import { type Reach, type Availability } from '../input/transports.js';
|
|
6
|
+
import { type AccommodationAnswers } from '../core/accommodations.js';
|
|
3
7
|
import { type ActionPreset } from '../core/actions.js';
|
|
4
8
|
import type { KeyScheme } from '../core/entity.js';
|
|
9
|
+
import { type HowToPlaySlide } from '../ui/help-panel.js';
|
|
10
|
+
import { type SettingsStore } from '../core/state.js';
|
|
5
11
|
import { type GameDeclaration } from '../core/contract.js';
|
|
6
12
|
import { type SceneStack } from '../core/scenes.js';
|
|
7
|
-
import { createTts
|
|
13
|
+
import { createTts } from '../platform/tts.js';
|
|
14
|
+
import { type Reading } from '../platform/reading.js';
|
|
15
|
+
import { type Audio } from '../platform/audio.js';
|
|
8
16
|
import { type AudioSonar, type SonarPlayer } from '../platform/audio-sonar.js';
|
|
9
|
-
import type
|
|
17
|
+
import { type Theme, type Correction } from '../render/viz-axes.js';
|
|
18
|
+
import type { FilterReach } from '../render/port.js';
|
|
10
19
|
import { type SettingsPanelApi } from '../ui/settings-panel.js';
|
|
20
|
+
import { type VirtualCommand, type VirtualController } from '../input/virtual-controller.js';
|
|
21
|
+
export type { VirtualCommand } from '../input/virtual-controller.js';
|
|
22
|
+
import { type LqFilter } from '../render/lq-filter.js';
|
|
23
|
+
import { type Crt } from '../render/crt.js';
|
|
24
|
+
import { type HudNumber } from '../ui/hud-bands.js';
|
|
25
|
+
import { type GameOption } from '../ui/game-options.js';
|
|
26
|
+
import { type StorageLike } from '../platform/storage.js';
|
|
11
27
|
import { type MenuNavApi } from '../ui/menu-nav.js';
|
|
12
28
|
import type { NavKeys } from '../input/edges.js';
|
|
29
|
+
import { type GamepadGameHooks } from '../input/gamepad.js';
|
|
30
|
+
export type { GamepadGameHooks } from '../input/gamepad.js';
|
|
13
31
|
import { type KeyboardRuntime } from '../input/keyboard-runtime.js';
|
|
14
|
-
import { type
|
|
15
|
-
|
|
32
|
+
import { type KeyboardConfigApi } from '../input/keyboard.js';
|
|
33
|
+
import { type HeavyReport } from '../platform/heavy.js';
|
|
34
|
+
/** What the game lends from the document. Everything optional but `doc`/`win`: what is missing becomes `problems`. */
|
|
16
35
|
export interface EngineHost {
|
|
17
36
|
readonly doc: Document;
|
|
18
37
|
readonly win: Window;
|
|
19
|
-
/**
|
|
38
|
+
/** An empty `<svg>` where the six colour-vision filters are mounted at run time. */
|
|
20
39
|
readonly cvdHost?: SVGElement | Element | null;
|
|
21
40
|
/**
|
|
22
|
-
*
|
|
41
|
+
* WHERE THE ACCESSIBILITY BAR GOES, on the game's FIRST screen.
|
|
23
42
|
*
|
|
24
|
-
* ⚠️
|
|
43
|
+
* ⚠️ THE DEV'S REQUEST, 2026-09-07: «o menu de pausa, o design do menu de pausa e os ícones de acessibilidade
|
|
25
44
|
* que aparecem no jogo desde a primeira tela devem ser oferecidos pela ENGINE e não pela programação do
|
|
26
45
|
* jogo. Todo jogo da engine inclusionist deve ter o mesmo menu de pausa e ícones de acessibilidade desde a
|
|
27
46
|
* primeira.»
|
|
28
47
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* os montou por eles. O comentário do `ui/pause-icons` diz porquê sem o notar: «`initPauseIcons` é chamado
|
|
33
|
-
* pela raiz de composição de CADA jogo» — ou seja, cada jogo tinha de se lembrar, e cinco não se lembraram.
|
|
34
|
-
* A criança que depende do modo cego, do TTS ou do alto contraste abre esses cinco jogos e não tem por onde.
|
|
48
|
+
* Left to each game, the bar was missing from most of the catalogue: each game had to remember to call
|
|
49
|
+
* `initPauseIcons`, and a child who depends on blind mode, narration or high contrast opened those games with no way
|
|
50
|
+
* in. So the engine mounts it (ADR-0106 §4, step 2).
|
|
35
51
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* ✅ E DESDE 2026-09-08 ELA TAMBÉM **MONTA** (etapa 2 do ADR-0106 §4). Este parágrafo dizia «dizer não é
|
|
40
|
-
* montar, e a montagem é o passo seguinte»; o passo seguinte aconteceu. O que a destravou foram as etapas
|
|
41
|
-
* 1 e 3: nenhuma delas era sobre montar, e sem as duas o `PauseIconsCtx` exigia sete coisas que esta raiz
|
|
42
|
-
* não sabe responder por um jogo que não conhece.
|
|
43
|
-
*
|
|
44
|
-
* ⚠️ Achando o hospedeiro, a barra é escrita e fiada aqui. Não achando, continua a ser `problems` — porque
|
|
45
|
-
* a engine pode oferecer os ícones, mas não pode adivinhar ONDE eles cabem no desenho de um jogo alheio.
|
|
52
|
+
* Absent, the engine looks for `#title-icons` — the id the platformer has always used. Found, the bar is written and
|
|
53
|
+
* wired here; not found, it is a line of `problems`: the engine can offer the icons, but it cannot guess WHERE they
|
|
54
|
+
* fit in the layout of a game it does not know.
|
|
46
55
|
*/
|
|
47
56
|
readonly a11yBarHost?: Element | null;
|
|
48
57
|
/**
|
|
49
|
-
*
|
|
58
|
+
* WHERE THE PAUSE CARD of the first screen is hung. Absent, the engine uses `#game-region`.
|
|
50
59
|
*
|
|
51
|
-
* ⚠️
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
60
|
+
* ⚠️ For the same reason as `a11yBarHost`: the engine OFFERS the pause, but does not know where it fits in the
|
|
61
|
+
* layout of a game it does not know. 📌 And since ADR-0120/ADR-0122 WHERE is not WHETHER: the pause is not
|
|
62
|
+
* declinable, and what this field keeps is the place. A host that takes no children becomes a line of `problems` —
|
|
63
|
+
* the difference between the engine not knowing and the engine keeping quiet.
|
|
55
64
|
*/
|
|
56
65
|
readonly pauseHost?: Element | null;
|
|
66
|
+
/**
|
|
67
|
+
* WHERE THE VIRTUAL CONTROLLER IS HUNG (ADR-0143). Absent, the engine uses `#game-region`.
|
|
68
|
+
*
|
|
69
|
+
* ⚠️ For the same reason as `pauseHost`: the engine draws the pad from the `preset`, but does not know where it fits
|
|
70
|
+
* in the layout of a game it does not know. And the stylesheet puts `.touch` at `position:absolute` at the bottom of
|
|
71
|
+
* the host — so the host is the game's rectangle, not the page.
|
|
72
|
+
*/
|
|
73
|
+
readonly touchHost?: Element | null;
|
|
74
|
+
/**
|
|
75
|
+
* WHERE THE CHILD'S SETTINGS ARE KEPT (ADR-0232, issue #207). The root builds the page's one store from it and hands that
|
|
76
|
+
* store to every module that persists.
|
|
77
|
+
*
|
|
78
|
+
* 📌 OPTIONAL, against ADR-0224/ADR-0227's preference for required ports, because here absence has a SAFE answer rather
|
|
79
|
+
* than a silent one: the host window's `localStorage`, which is what «this browser remembers the child's choices» means.
|
|
80
|
+
* A host passes one to keep a root's settings apart from everything else on the origin — a test file its own
|
|
81
|
+
* `memoryBackend()`, so no file inherits or races another's keys; a page with two roots one each (ADR-0142).
|
|
82
|
+
*/
|
|
83
|
+
readonly storage?: StorageLike;
|
|
57
84
|
}
|
|
58
85
|
/**
|
|
59
|
-
*
|
|
86
|
+
* What this game does NOT have. Declared, not deduced from a getter that returns null.
|
|
60
87
|
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
88
|
+
* Finding 10 of the second consumer is why this exists as a type: the quiz had to declare itself paused to navigate its
|
|
89
|
+
* own menus, because the engine had no way to hear that a game has no phases.
|
|
63
90
|
*/
|
|
64
91
|
export interface Declinios {
|
|
65
|
-
/**
|
|
66
|
-
readonly
|
|
67
|
-
/** Sem "ator da pausa" — quem apertou o botão que abriu o menu. */
|
|
68
|
-
readonly semAtorDePausa?: boolean;
|
|
92
|
+
/** No pause actor — who pressed the button that opened the menu. */
|
|
93
|
+
readonly noPauseActor?: boolean;
|
|
69
94
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* ⚠️ EXISTE PORQUE A AUSÊNCIA ESTAVA A SER SILENCIOSA, e a medição de 2026-09-08 diz quanto: dos SEIS jogos
|
|
73
|
-
* do catálogo local, TRÊS declaram `carregarVozNeural` (platformer, 15-puzzle, 2048) e TRÊS não
|
|
74
|
-
* (`game-soccer`, `whackwhack`, `game-chess`). Nos três últimos não há voz neural nenhuma, e nada o dizia.
|
|
95
|
+
* No neural voice — this game does not declare `uses: { neuralVoice: true }` (ADR-0216 §3).
|
|
75
96
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* — passou a exigir UMA LINHA do jogo. As duas coisas podem ser verdade ao mesmo tempo (a engine é dona das
|
|
79
|
-
* VOZES, o jogo nomeia o FORNECEDOR), mas só se quem esquece a linha for avisado. Declinar é escolha; não
|
|
80
|
-
* declarar era omissão.
|
|
97
|
+
* Exists because the absence is otherwise silent: a game that does not ask for one has only the browser's voice, which a school
|
|
98
|
+
* Chromebook may not have for the child's language. Declining is a choice; not declaring is an omission, and `problems` says so.
|
|
81
99
|
*/
|
|
82
|
-
readonly
|
|
100
|
+
readonly noNeuralVoice?: boolean;
|
|
83
101
|
}
|
|
84
102
|
export interface CreateGameOptions {
|
|
85
|
-
/**
|
|
103
|
+
/** The SEVEN FIELDS (core/contract). It is what the accessibility stack reads, and the only thing it reads. */
|
|
86
104
|
readonly declaration: GameDeclaration;
|
|
87
105
|
readonly host: EngineHost;
|
|
88
106
|
readonly declines?: Declinios;
|
|
89
107
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
108
|
+
* Is it menu-navigation time NOW? The platformer answers `phase === 'paused'`; a quiz answers `true`.
|
|
109
|
+
* Absent = `true`, the case of a game with no phases — the simplest one, and the one that does not force one to be invented.
|
|
92
110
|
*/
|
|
93
111
|
readonly isNavigable?: () => boolean;
|
|
112
|
+
/** Is the position index (item N of M) on? Absent = yes. See `withIndex` in ui/menu-nav. */
|
|
113
|
+
readonly withIndex?: () => boolean;
|
|
94
114
|
/**
|
|
95
|
-
*
|
|
115
|
+
* ADR-0044's `accessibility` MODE (item 7): the directional drives the quick bar instead of the character.
|
|
96
116
|
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
117
|
+
* Optional: absent, the engine answers with the bar it mounted itself (`ui/pause-icons`). A game that draws its own
|
|
118
|
+
* bar answers for it.
|
|
99
119
|
*/
|
|
100
|
-
|
|
101
|
-
readonly comIndice?: () => boolean;
|
|
102
|
-
readonly naBarraDe?: (i: number) => boolean;
|
|
120
|
+
readonly onBar?: (i: number) => boolean;
|
|
103
121
|
readonly navBar?: (i: number, k: NavKeys) => void;
|
|
104
|
-
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
122
|
+
/**
|
|
123
|
+
* Players for the remappable keyboard. `Pick<ControlledPlayer,'ctrl'>` — a key scheme and nothing more.
|
|
124
|
+
* ⚠️ `KeyScheme` and not `Record<string, string[]>` (#118): a structural COPY of a type that nothing forces to agree
|
|
125
|
+
* drifts — the lesson `core/entity` opens with.
|
|
126
|
+
*
|
|
127
|
+
* ⚠️ `audioSink` is ADDITIVE AND OPTIONAL: no consumer needs to write it.
|
|
128
|
+
*
|
|
129
|
+
* 🎯 It is here because the seat has a second reader inside the engine. The hearing panel, which the engine mounts,
|
|
130
|
+
* writes into it the audio output the child chose — and `ui/pause-icons` reads it to answer a question that changes
|
|
131
|
+
* what the bar offers: does this child have an output of HER OWN? Without it, changing sound, narration or blind
|
|
132
|
+
* mode on a shared headset would change everyone's audio.
|
|
133
|
+
*
|
|
134
|
+
* 📌 AND ONLY THIS FIELD. The MOTOR fields (`easy`, `toggleMove`, `toggleRun`) are left out: they are required in
|
|
135
|
+
* `MobilityPlayer` — the panel READS them to draw its state — and making them required here would force every game
|
|
136
|
+
* to carry them. That is a contract decision still to be taken, and it is not taken in passing by a cast that would
|
|
137
|
+
* silence the compiler.
|
|
138
|
+
*/
|
|
108
139
|
readonly players?: {
|
|
109
140
|
ctrl: KeyScheme;
|
|
141
|
+
audioSink?: string | null;
|
|
110
142
|
}[];
|
|
111
|
-
/**
|
|
143
|
+
/** Phase change, for a game that has phases. Absent = does nothing (a game without phases loses nothing). */
|
|
112
144
|
readonly setPhase?: (p: 'title' | 'playing' | 'paused') => void;
|
|
113
145
|
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
146
|
+
* The players as NAVIGATION SOUND sees them. Absent, `createGame` DERIVES one from field 4 of the contract: the focus
|
|
147
|
+
* says where the player is, which is all the sonar needs to know about position.
|
|
116
148
|
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
149
|
+
* A game with several players, or with an audio device per player, supplies its own list. A one-child game supplies
|
|
150
|
+
* nothing — and gets the sonar anyway, which is the point.
|
|
119
151
|
*/
|
|
120
152
|
readonly sonarPlayers?: () => SonarPlayer[];
|
|
121
|
-
/**
|
|
153
|
+
/** Blind mode on? Absent = the engine's own stored value (`core/state.blindMode`). Applies to every player. */
|
|
122
154
|
readonly isBlindMode?: () => boolean;
|
|
123
155
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* aritmética existia, testada, e o `createGame` tinha ZERO ocorrências de qualquer coisa sobre ações.
|
|
156
|
+
* THIS GAME'S WORDS (`core/actions`). Without them the engine does not know HOW MANY actions to ask of a transport,
|
|
157
|
+
* and ADR-0079 §3's guarantee cannot be measured (issue #112).
|
|
127
158
|
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
159
|
+
* Optional because a game may not declare a preset yet; without it the reach notice simply does not appear, and the
|
|
160
|
+
* help and the scan have no words to show.
|
|
130
161
|
*/
|
|
131
162
|
readonly preset?: ActionPreset;
|
|
132
163
|
/**
|
|
133
|
-
*
|
|
164
|
+
* THE ON-SCREEN PAD, only when the cartridge asks for it (ADR-0166): «Controle de tela é só para jogo que não funciona tão
|
|
165
|
+
* bem como via mouse e/ou touch (o cartucho decide), nunca para menu.» Absent = no pad — a game played by touching its
|
|
166
|
+
* own elements, and every menu, need none on top of them. It leaves the pause card and the panels; it stays on the quick
|
|
167
|
+
* pause.
|
|
168
|
+
*/
|
|
169
|
+
readonly onScreenPad?: boolean;
|
|
170
|
+
/**
|
|
171
|
+
* THE NUMBERS THIS GAME SHOWS, each in the band of what it is about (ADR-0168, ADR-0175; issue #162). The engine mounts
|
|
172
|
+
* the HUD and places them: `identity` top left and `mission` under it, `power` top right (under the clock), `learning` bars (one to three, as
|
|
173
|
+
* `educational/segment-bar.barOf` returns them) centred in the footer, under the explanation; the room the game leaves free at the
|
|
174
|
+
* top (`--barra-a11y-h`) grows by what they take. Absent = no HUD mounted, and the game keeps drawing its own.
|
|
175
|
+
* 📏 Measured on 2026-09-13: six sibling games, six HUDs of their own, none in the bands.
|
|
176
|
+
* A malformed list is refused at boot and at `mount`, like the declaration.
|
|
177
|
+
*/
|
|
178
|
+
readonly hud?: readonly HudNumber[];
|
|
179
|
+
/**
|
|
180
|
+
* THE OPTIONS OF THIS GAME, as rows the engine draws (ADR-0182; issue #178): a label and hint in the game's words, a kind
|
|
181
|
+
* (steps, list or switch), how to read the value and how to write it. «Opções do jogo» opens them in a panel of the
|
|
182
|
+
* engine's own; absent or empty, the door stays on the card locked with its reason (ADR-0161). A cartridge draws its own
|
|
183
|
+
* options only where rows cannot express what it needs. A malformed list is refused at boot and at `mount`.
|
|
184
|
+
*/
|
|
185
|
+
readonly gameOptions?: readonly GameOption[];
|
|
186
|
+
/**
|
|
187
|
+
* HOW TO PLAY THIS GAME, as slides the help shows before the buttons (ADR-0195; issue #188): «O "Como jogar" é justamente algo a
|
|
188
|
+
* ser feito pelo cartucho.» Each slide's text is read at every showing, in the page's language; its figure, when given, is drawn
|
|
189
|
+
* by the cartridge on a surface the engine gives, with the time for an animation (still under reduced motion). Absent = the help
|
|
190
|
+
* shows the buttons alone. A malformed list is refused at boot and at `mount`.
|
|
191
|
+
*/
|
|
192
|
+
readonly howToPlay?: readonly HowToPlaySlide[];
|
|
193
|
+
/**
|
|
194
|
+
* THIS GAME'S DICTIONARIES, one per language (`pt`, `en`, `es`), registered into THIS ROOT's translator before anything is
|
|
195
|
+
* translated (ADR-0232 D3 erratum): a key resolves for this game and for no other root on the page. A string with markup is
|
|
196
|
+
* refused and named in the console, as `registerDict` does; a key given in one language and not another is a line of
|
|
197
|
+
* `problems`. Decision (mechanical, ADR-0232 D3): an option and not a method on the handle, because every game measured
|
|
198
|
+
* registers BEFORE `createGame` — and a method would come after the markup was translated.
|
|
199
|
+
*/
|
|
200
|
+
readonly dictionaries?: Readonly<Record<string, Readonly<Record<string, string>>>>;
|
|
201
|
+
/**
|
|
202
|
+
* THE VIRTUAL CONTROLLER'S COMMANDS, CARRIED TO THE GAME (ADR-0111 and its erratum; issue #197): «a engine lida com o hardware e passa
|
|
203
|
+
* para o jogo o nome virtual do botão». Each press and release of a position the child's hardware reached — the keyboard by the
|
|
204
|
+
* child's scheme, the eyes — with its source and seat. What it executes is the game's, named by its `preset`. Not called while a menu
|
|
205
|
+
* has the directional. Absent = the game hears commands only through what it reads itself.
|
|
206
|
+
*/
|
|
207
|
+
readonly onCommand?: (command: VirtualCommand) => void;
|
|
208
|
+
/**
|
|
209
|
+
/**
|
|
210
|
+
* WHAT ONLY THIS GAME KNOWS ABOUT THE GAMEPAD (ADR-0224). The engine mounts the transport; these are the few answers
|
|
211
|
+
* nothing in it can know — the title screen, the attract demo, the modal, joining and respawning a seat, the waiting
|
|
212
|
+
* badge, the wizard's art, and whether the world is running.
|
|
213
|
+
*
|
|
214
|
+
* 🎯 **Absent altogether is an answer**, not an oversight: the gamepad works, and what depends on the cartridge's
|
|
215
|
+
* world simply does not happen. Each absence is written in `GamepadGameHooks`.
|
|
216
|
+
*/
|
|
217
|
+
readonly gamepad?: GamepadGameHooks;
|
|
218
|
+
/**
|
|
219
|
+
* THE ACCOMMODATIONS THAT HAVE A SUBJECT IN THIS GAME — the cartridge's answer, REQUIRED (ADR-0153).
|
|
220
|
+
*
|
|
221
|
+
* 🔴 For each of the sixteen only the game can answer (`GAME_KEYED` in `core/accommodations`): the game's WORD, if
|
|
222
|
+
* it has a subject here, or `false`. In the Dev's words: «Gênero não precisa responder todas as acomodações, mas
|
|
223
|
+
* sim o cartucho, obrigatoriamente.»
|
|
224
|
+
*
|
|
225
|
+
* ⚠️ REQUIRED, by the `holdsAtOnce` rubric: there is no safe default — yes mounts the wheelchair in chess, no
|
|
226
|
+
* hides it from the platformer — and forgetting fails INVISIBLY to whoever writes the game. A missing or incomplete
|
|
227
|
+
* answer is a malformed declaration, and the boot REFUSES.
|
|
228
|
+
*
|
|
229
|
+
* 📌 The general ones always mount and the contract's are derived; none of them is answered here.
|
|
230
|
+
*/
|
|
231
|
+
readonly accommodations: AccommodationAnswers;
|
|
232
|
+
/**
|
|
233
|
+
* The game's genre, OPTIONAL (ADR-0153), from the engine's list (`core/genres`, ADR-0156): what the game plays like.
|
|
234
|
+
* The cartridge chooses it and nobody assigns it. Casino game and a name outside the list refuse the boot; Horror game
|
|
235
|
+
* boots and `problems` carries its «avoid» mark.
|
|
236
|
+
*/
|
|
237
|
+
readonly genre?: string;
|
|
238
|
+
/**
|
|
239
|
+
* WHAT THIS GAME USES OF THE VOICE (ADR-0216 §3) — never how. Two answers, and each one is a sentence about the child, not
|
|
240
|
+
* about a library:
|
|
241
|
+
*
|
|
242
|
+
* · `neuralVoice: true` — a child who cannot read is read TO by this game, so it wants a voice even where the device has
|
|
243
|
+
* none of its own. The engine loads Kokoro from the delivery at the first such utterance (ADR-0216 §1); the game names no
|
|
244
|
+
* phonemizer, runtime or model. Absent, no Kokoro voice is listed, the audio panel does not offer the neural engine, and
|
|
245
|
+
* the 371 MiB of model, voices and runtime never enter the delivery.
|
|
246
|
+
* · `reading: true` — a child reads aloud TO this game and it wants the text; the engine decides who hears her, and a
|
|
247
|
+
* delivery carries the reading model of her language because of this answer. Absent, `motor.reading.listen()` refuses and
|
|
248
|
+
* says which line is missing: a game that asks for a microphone it never declared would also be a delivery without the
|
|
249
|
+
* model, which is a silence in a school nobody can debug.
|
|
250
|
+
*/
|
|
251
|
+
readonly uses?: {
|
|
252
|
+
readonly reading?: boolean;
|
|
253
|
+
readonly neuralVoice?: boolean;
|
|
254
|
+
};
|
|
255
|
+
/**
|
|
256
|
+
* FETCH THE HEAVY FILES ON THE FIRST LOAD? Default **yes** (ADR-0110 (b), ADR-0116, ADR-0119).
|
|
134
257
|
*
|
|
135
|
-
*
|
|
258
|
+
* The vision runtime and models, and with `uses.neuralVoice` Kokoro's model, voices and runtime (371 MiB), come down in the
|
|
259
|
+
* BACKGROUND, one at a time, without blocking the game: the child plays while they arrive, and what must not happen is a child
|
|
260
|
+
* back on the second day, offline, finding they were never fetched. Pillar 8 is «first day ONLINE, then offline-first», and
|
|
261
|
+
* ADR-0116 removed the contradiction that blocked this — installing is already a network act.
|
|
136
262
|
*
|
|
137
|
-
* ⚠️
|
|
138
|
-
*
|
|
139
|
-
* `node_modules` de todo consumidor, incluindo um jogo que nunca fale por voz neural. E declará-lo em
|
|
140
|
-
* `devDependencies`, que era o estado até 06/09, publicou uma engine que NÃO COMPILAVA para ninguém
|
|
141
|
-
* (ADR-0093). A porta é a única forma que resolve as duas coisas ao mesmo tempo.
|
|
263
|
+
* ⚠️ `false` IS FOR WHOEVER HAS A REASON, and the reason that exists is a TEST: a case that mounts the start in a real browser
|
|
264
|
+
* cannot fire hundreds of MB at the network. A game in production that turns it off decides its child has no neural voice offline.
|
|
142
265
|
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
266
|
+
* 📌 ADR-0117 says the one who should pay this once is the PLATFORM, not each cartridge — the Cache Storage is partitioned by
|
|
267
|
+
* origin, and on one site the heavy files come down once for every game. Until the platform asks for them, the game does: better
|
|
268
|
+
* twice than never.
|
|
145
269
|
*/
|
|
146
|
-
readonly
|
|
270
|
+
readonly downloadHeavy?: boolean;
|
|
147
271
|
/**
|
|
148
|
-
*
|
|
272
|
+
* WHAT HAPPENED TO EACH HEAVY FILE, as it happens. Absent = nobody is watching.
|
|
149
273
|
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* ADR-0116 tirou a contradição que travava isto — instalar já é um acto de rede.
|
|
274
|
+
* ⚠️ HERE AND NOT IN `problems`, because the download runs in the BACKGROUND: `createGame` returns `problems` synchronously, and a
|
|
275
|
+
* line arriving later lands in an array its reader already read. ADR-0110 asks that a failed fetch be REPORTED — reporting is having
|
|
276
|
+
* a channel that exists when the news arrives, not pushing into a list already delivered.
|
|
154
277
|
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
|
|
278
|
+
* 📌 The engine invents no surface for this: where «N MB left» fits on a game's screen is the game's to know.
|
|
279
|
+
* `bytesLeftToDownload(relatorio)` gives the number for the sentence.
|
|
280
|
+
*/
|
|
281
|
+
readonly onHeavyProgress?: (r: HeavyReport) => void;
|
|
282
|
+
/**
|
|
283
|
+
* How each transport is found to be here. Absent = the engine asks the device.
|
|
158
284
|
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
* plataforma não os pede, é o jogo que os pede: melhor descer duas vezes do que nunca.
|
|
285
|
+
* Injectable because whether a gamepad is connected and whether this is a touch screen are questions to the browser, and a
|
|
286
|
+
* test that cannot answer them cannot exercise the screen that depends on them.
|
|
162
287
|
*/
|
|
163
|
-
readonly
|
|
288
|
+
readonly availability?: Availability;
|
|
164
289
|
/**
|
|
165
|
-
*
|
|
290
|
+
* WHAT EACH ITEM OF THE PAUSE CARD DOES IN THIS GAME — «continuar», «sair», «ajuda», whatever the game wires.
|
|
166
291
|
*
|
|
167
|
-
*
|
|
168
|
-
* `
|
|
169
|
-
*
|
|
170
|
-
* empurrar para uma lista que já foi entregue.
|
|
292
|
+
* 🔴 The engine hides every item nothing acts on (ADR-0106 §5, no dead buttons — `refreshPauseItems` in
|
|
293
|
+
* `ui/pause-icons`), so without this field a game could wire no item beyond the ones the engine acts on itself
|
|
294
|
+
* (`ENGINE_ITEMS` and the engine's own actions below). The game's table is spread over the engine's, so the game wins.
|
|
171
295
|
*
|
|
172
|
-
* 📌 A
|
|
173
|
-
*
|
|
296
|
+
* 📌 A FUNCTION and not a value, for the reason `ui/pause-icons` records: a game's table changes during a match (a
|
|
297
|
+
* «sair» that is wired only after the first level), and freezing it at boot broke a case there. Absent = only what
|
|
298
|
+
* the engine acts on.
|
|
174
299
|
*/
|
|
175
|
-
readonly
|
|
300
|
+
readonly getPauseActs?: () => Record<string, (() => void) | undefined>;
|
|
176
301
|
/**
|
|
177
|
-
*
|
|
302
|
+
* WHO OPENED THE PAUSE, when there is more than one seat — the keyboard panel edits the seat of THIS index.
|
|
178
303
|
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
304
|
+
* ⚠️ Without it the child in the SECOND seat cannot remap, and `problems` says so for a game that declares more than
|
|
305
|
+
* one player and does not answer this (`core/cartridge-problems`).
|
|
181
306
|
*/
|
|
182
|
-
readonly
|
|
307
|
+
readonly setPauseActor?: (i: number, ...rest: unknown[]) => void;
|
|
308
|
+
/**
|
|
309
|
+
* HOW THIS GAME REPAINTS FOR HIGH CONTRAST, and how it corrects colour vision — the two axes of ADR-0104.
|
|
310
|
+
*
|
|
311
|
+
* 🔴 THE ⚫ ICON IS OFFERED ONLY TO A GAME THAT HANDS IN A WRITER. `iconsThatAct` mounts an icon only for whoever
|
|
312
|
+
* hands in its writer, and that rule is right — an icon that acts on nothing is worse than one icon fewer. What
|
|
313
|
+
* these fields add is the DOOR: without it, an outside consumer read the absence as this game having its own
|
|
314
|
+
* controls, true about the result and false about the cause. A gap the consumer reads as a choice is the worst kind.
|
|
315
|
+
* The 🚥 has an engine default (a filter over the world, below); a game that corrects colour in its own render wins.
|
|
316
|
+
*
|
|
317
|
+
* ⚠️ TWO FIELDS AND NOT ONE, because they are two questions: a game may know how to repaint textures and have no way
|
|
318
|
+
* to correct colour, or the other way round — `game-pinball`'s image is a 320×180 framebuffer with no texture to
|
|
319
|
+
* repaint, and it applies the colour filter itself.
|
|
320
|
+
*/
|
|
321
|
+
readonly setPlayerTheme?: (i: number, theme: Theme) => void;
|
|
322
|
+
readonly setPlayerCorrection?: (i: number, correction: Correction) => void;
|
|
183
323
|
}
|
|
324
|
+
export type { FlashMeasurement };
|
|
184
325
|
export interface Engine {
|
|
185
326
|
readonly declaration: GameDeclaration;
|
|
186
327
|
/**
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
* ⚠️ EXISTE PORQUE MONTAR NÃO É MOSTRAR, e a etapa 2 do ADR-0106 tinha ficado a meio sem que nada o
|
|
190
|
-
* dissesse. O cartão nasce `hidden` (é assim que o `buildScreenPause` o entrega, e tem de ser: a pausa
|
|
191
|
-
* abre-se, não está aberta) e QUEM O REVELA é o `ui/shell`, por fase — que esta raiz **não monta**, de
|
|
192
|
-
* propósito: «não substitui o boot do main.js, que tem catorze anos de ordem própria».
|
|
328
|
+
* THE PAUSE THIS ROOT MOUNTED — show and hide, without the consumer hunting for any id.
|
|
193
329
|
*
|
|
194
|
-
* ⚠️
|
|
195
|
-
*
|
|
196
|
-
*
|
|
330
|
+
* ⚠️ IT EXISTS BECAUSE MOUNTING IS NOT SHOWING. The card is born `hidden` (that is how `buildScreenPause` delivers
|
|
331
|
+
* it, and it must be: a pause is opened, not open). The engine opens it on SELECT, the ☰ and the quick pause's
|
|
332
|
+
* `action4`; these two let a game open and close it too, without looking for `#vp-pause-0` in the document — exactly
|
|
333
|
+
* the kind of knowledge this file exists not to demand.
|
|
197
334
|
*
|
|
198
|
-
* 📌
|
|
199
|
-
*
|
|
335
|
+
* 📌 The engine OFFERS the mechanism and does not take the phase. When to open the pause stays the game's, because
|
|
336
|
+
* only it knows what playing is; what stops being its business is HOW.
|
|
200
337
|
*/
|
|
201
|
-
readonly
|
|
202
|
-
/**
|
|
203
|
-
readonly
|
|
204
|
-
/**
|
|
205
|
-
readonly
|
|
338
|
+
readonly pause: {
|
|
339
|
+
/** Reveals screen `i`'s card and rebuilds its items — ADR-0106 §5 evaluated the moment it opens. */
|
|
340
|
+
readonly show: (i: number) => void;
|
|
341
|
+
/** Hides it again. */
|
|
342
|
+
readonly hide: (i: number) => void;
|
|
206
343
|
};
|
|
207
344
|
readonly tts: ReturnType<typeof createTts>;
|
|
345
|
+
/**
|
|
346
|
+
* THE CHILD READS ALOUD AND THIS ANSWERS WITH TEXT (ADR-0216, issue #200; the Dev, 2026-09-21: «o jogo… apenas deve pedir
|
|
347
|
+
* para ouvir e receber o texto»). `listen()` ends when she goes quiet or the ceiling falls; `stop()` gives the microphone
|
|
348
|
+
* back; `ready()` says whether this device can hear her language at all. Which recogniser hears her is the engine's
|
|
349
|
+
* business — and never one that would send her voice to a server. A game that wants it declares `uses: { reading: true }`.
|
|
350
|
+
*/
|
|
351
|
+
readonly reading: Reading;
|
|
352
|
+
/**
|
|
353
|
+
* THE SOUND CAPTION, hosted by the engine (study item D3; ADR-0014; ADR-0164 rules 4–5): a line for eyes that cannot
|
|
354
|
+
* hear, in the screen footer above the explanation, at most two lines, gone after a moment. Written only while the
|
|
355
|
+
* child has captions on. Pass it as `createAudioEarcons`'s `showCaption`.
|
|
356
|
+
* 📏 Before it, each game wrote its own `#caption` with its own timer (platformer 1300 ms, soccer 2600 ms).
|
|
357
|
+
*/
|
|
358
|
+
readonly captionSound: (text: string) => void;
|
|
359
|
+
/**
|
|
360
|
+
* The game speed the child chose on the quick bar (ADR-0180): 1 is 100%, down to 0.5. Pass it as `startLoop`'s REQUIRED
|
|
361
|
+
* `speed` (ADR-0232 D2c), which multiplies the frame time by it; a game that runs its own frames multiplies by this.
|
|
362
|
+
*/
|
|
363
|
+
readonly gameSpeed: () => number;
|
|
364
|
+
/**
|
|
365
|
+
* Does the child want the «N de M» said after an item (ADR-0044 item 3)? Read at each announcement: the hearing panel
|
|
366
|
+
* turns it off and on. A game that announces its own items asks here instead of reading the settings store by import
|
|
367
|
+
* (ADR-0232 D2c), as it asks `gameSpeed` — the demo quiz does.
|
|
368
|
+
*/
|
|
369
|
+
readonly menuIndexOn: () => boolean;
|
|
370
|
+
/**
|
|
371
|
+
* TRANSLATES IN THIS ROOT'S LANGUAGE (ADR-0232 D3): the root's own `t`, the one every engine module receives. A game that
|
|
372
|
+
* writes its own words asks here instead of importing `core/i18n` — the demo quiz does — as it asks `gameSpeed`.
|
|
373
|
+
*/
|
|
374
|
+
readonly t: Translate;
|
|
375
|
+
/**
|
|
376
|
+
* Resolves when the language chosen at boot has loaded — at once for pt (ADR-0232 D3). A game that draws its first screen
|
|
377
|
+
* waits on it, or the screen is born in the fallback language.
|
|
378
|
+
*/
|
|
379
|
+
readonly localeReady: () => Promise<void>;
|
|
380
|
+
/**
|
|
381
|
+
* THIS ROOT'S SCREEN-READER ANNOUNCEMENTS (ADR-0232 D4): «polite» (`#sr-status`, does not interrupt) — the announcer every
|
|
382
|
+
* engine module receives. A game announces HERE instead of importing `core/a11y-sr`, which is a factory now: a second
|
|
383
|
+
* announcer would write the same regions but carry none of this root's Libras mirror.
|
|
384
|
+
*/
|
|
385
|
+
readonly say: (text: string) => void;
|
|
386
|
+
/** The «assertive» announcement (`#sr-alert`): interrupts and speaks now — errors, a checkmate, a crash. See `say`. */
|
|
387
|
+
readonly alert: (text: string) => void;
|
|
388
|
+
/**
|
|
389
|
+
* SIGNS THIS ROOT'S ANNOUNCEMENTS TOO: every `say`/`alert` — the engine's and the game's — also goes to `sink`, until the
|
|
390
|
+
* returned release. Pass `engine.libras.say`. The root connects nothing by itself (decision DD1, pending the Dev): a game
|
|
391
|
+
* that signed its announcements before connects it here, and a game that did not keeps not signing.
|
|
392
|
+
*/
|
|
393
|
+
readonly mirrorAnnouncements: (sink: (text: string) => void) => () => void;
|
|
394
|
+
/**
|
|
395
|
+
* THIS ROOT'S DEAF MODE (ADR-0232 D4): the one the bar's 🦻 toggles. `isOpen` is the child's choice; `say` signs a text
|
|
396
|
+
* while it is open (a queue of one); `tick` opens the interpreter for a choice restored from storage, and a game that
|
|
397
|
+
* signs calls it from its loop; `toggle` flips the mode from a game's own control, confirming in this root's language.
|
|
398
|
+
*/
|
|
399
|
+
readonly libras: {
|
|
400
|
+
readonly isOpen: () => boolean;
|
|
401
|
+
readonly say: (text: string) => void;
|
|
402
|
+
readonly tick: () => void;
|
|
403
|
+
readonly toggle: () => void;
|
|
404
|
+
};
|
|
405
|
+
/**
|
|
406
|
+
* THIS ROOT'S SETTINGS STORE (ADR-0232 D4): the child's settings, read through live getters (`settings.blindMode`) and written
|
|
407
|
+
* by the setters, plus the bus a game subscribes and emits on. A game reads HERE instead of importing `core/state`, which is
|
|
408
|
+
* a factory now: a second store would read the same storage but hear none of this root's changes.
|
|
409
|
+
*/
|
|
410
|
+
readonly settings: SettingsStore;
|
|
411
|
+
/**
|
|
412
|
+
* THIS ROOT'S INPUT STATE (ADR-0232 D4): the held keys and who pressed them, the transport in use per player, the pads'
|
|
413
|
+
* frames, and `held(player, action)`. A game reads and writes HERE instead of importing `input/state`, which is a factory
|
|
414
|
+
* now: a second instance would hold keys this root's transports never press.
|
|
415
|
+
*/
|
|
416
|
+
readonly input: LiveInput;
|
|
417
|
+
/**
|
|
418
|
+
* THIS ROOT'S KEYBOARD MAP and its doors (ADR-0232 D4): `kb()` the live map, `set`, `save`, `reset` (back to the GAME's
|
|
419
|
+
* default, ADR-0115), `factoryWithGame()` and `load()`. For a game with a remapping screen of its own — `game-2048`'s —
|
|
420
|
+
* instead of importing `input/keyboard`'s module map, which no longer exists.
|
|
421
|
+
*/
|
|
422
|
+
readonly keyboardConfig: KeyboardConfigApi;
|
|
423
|
+
/**
|
|
424
|
+
* THIS ROOT'S SOUND (ADR-0232 D4): the context (made at the first sound, from the host's window), the master, the mixer and
|
|
425
|
+
* the syntheses. Read through live getters (`audio.soundOn`, `audio.audioCat`) and moved by its methods (`ensureAC()`,
|
|
426
|
+
* `tone(…)`). A game asks HERE instead of importing `platform/audio`, which is a factory now: a second one would make a
|
|
427
|
+
* second context and a second mixer, deaf to this root's volume and categories.
|
|
428
|
+
*/
|
|
429
|
+
readonly audio: Audio;
|
|
430
|
+
/**
|
|
431
|
+
* THIS ROOT'S CRT (ADR-0232 D4): its live config, `apply()` (classes on `#game-region`, kept in the store) and
|
|
432
|
+
* `scanVars()`, which re-anchors the scanlines to real pixels. A game that scales its own stage with `ui/layout`'s
|
|
433
|
+
* `createLayout` passes `engine.crt.scanVars` as `afterScale`; a game with a CRT menu of its own reads and writes `cfg`
|
|
434
|
+
* and calls `apply()` here instead of importing `render/crt`, as it asks `gameSpeed`.
|
|
435
|
+
*/
|
|
436
|
+
readonly crt: Crt;
|
|
437
|
+
/**
|
|
438
|
+
* THIS ROOT'S L→Q CONTRAST ENHANCEMENT (ADR-0232 D4): `filter()` for composing a CSS filter, `t()` the amount, `set(t)`
|
|
439
|
+
* to change it (kept in the store; the root recomposes the world's filter). A game asks here instead of importing
|
|
440
|
+
* `render/lq-filter`.
|
|
441
|
+
*/
|
|
442
|
+
readonly lq: LqFilter;
|
|
443
|
+
/**
|
|
444
|
+
* MEASURES WHAT THE WORLD'S CANVAS FLASHES for `ms`, against the WCAG 2.3.1 general flash threshold (study item B2;
|
|
445
|
+
* `core/flash-threshold`). Only when called — reading pixels every frame costs a school machine (pillar 1), so play never
|
|
446
|
+
* pays for it. A failure is also a line of `problems`. `lido: false` says why nothing was measured (no canvas, a canvas
|
|
447
|
+
* the page may not read, or one that reads transparent, as a WebGL canvas without `preserveDrawingBuffer` does) — never a
|
|
448
|
+
* pass by silence. The red flash is not measured.
|
|
449
|
+
*/
|
|
450
|
+
readonly measureFlashes: (ms: number) => Promise<FlashMeasurement>;
|
|
208
451
|
readonly overlays: SettingsPanelApi;
|
|
209
452
|
readonly nav: MenuNavApi;
|
|
210
453
|
readonly keyboard: KeyboardRuntime;
|
|
211
454
|
/**
|
|
212
|
-
*
|
|
455
|
+
* THE CONTROLLER OBJECT, offered to the cartridge (ADR-0216, in the Dev's words: «Assim como a engine oferece o objeto de
|
|
456
|
+
* controle, ela deve oferecer objetos de leitura e TTS»).
|
|
457
|
+
*
|
|
458
|
+
* 📌 Every transport the engine knows — keyboard, gamepad (ADR-0224), touch, eyes, face, hands, voice, scan — is mounted
|
|
459
|
+
* here and presses this controller by itself. This is for a transport a game mounts ITSELF: pressing a position by hand
|
|
460
|
+
* is telling the engine that the child's device produced that position — with the source, which ADR-0109 demands.
|
|
461
|
+
*
|
|
462
|
+
* ⚠️ What it is NOT: a second way for the game to receive input. The game receives through `onCommand`.
|
|
463
|
+
*/
|
|
464
|
+
readonly controller: VirtualController;
|
|
465
|
+
/**
|
|
466
|
+
* APPLIES THE VISION FILTER TO THE WORLD THIS GAME DECLARED (ADR-0087).
|
|
213
467
|
*
|
|
214
|
-
* ⚠️
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
* criança dentro da simulação (#82).
|
|
468
|
+
* ⚠️ It exists because, without it, each consumer wrote its own — and `game-15puzzle` did, with the right reasoning
|
|
469
|
+
* and on its own. What it adds is the rule of MENUS, which a consumer has no way to know: they live over the
|
|
470
|
+
* simulation and are the way out of it, so if they inherited the filter by being INSIDE the world, it is undone on
|
|
471
|
+
* them. A blindness that blacked out the pause menu would lock the child inside the simulation (#82).
|
|
219
472
|
*/
|
|
220
|
-
readonly
|
|
473
|
+
readonly applyVisionFilter: (css: string, reach: FilterReach) => void;
|
|
221
474
|
/**
|
|
222
|
-
*
|
|
475
|
+
* NAVIGATION SOUND, ready and wired to this game's declaration (item 19).
|
|
223
476
|
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
477
|
+
* It comes for free because the sonar no longer needs tiles: it asks for topology (field 1), targets (field 5) and
|
|
478
|
+
* names (field 3), and the game already declared all three to exist. It was finding 9 of the second consumer: wiring
|
|
479
|
+
* the sonar meant LYING to the engine, and the lie was demanded by the SHAPE of the question, not by the sound.
|
|
227
480
|
*/
|
|
228
481
|
readonly sonar: AudioSonar;
|
|
229
482
|
/**
|
|
230
|
-
*
|
|
483
|
+
* THE SCENE STACK (item 22, C3 of ADR-0030), empty and ready.
|
|
231
484
|
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* registra alargar a união como NÃO-opção, e é essa a razão).
|
|
485
|
+
* It comes from `createGame` and not from each game for the same reason as the sonar: it is infrastructure. What it
|
|
486
|
+
* replaces is `phase: 'title' | 'playing' | 'paused'` — ONE game's enum that engine modules read, and that a game
|
|
487
|
+
* with a level map or a results screen could not extend without asking the engine for a new constant (ADR-0030
|
|
488
|
+
* records widening the union as a NON-option, and that is why).
|
|
237
489
|
*
|
|
238
|
-
*
|
|
490
|
+
* It is born EMPTY: the game pushes, because which scenes there are is the only part of this that is its own.
|
|
239
491
|
*/
|
|
240
|
-
readonly
|
|
241
|
-
/**
|
|
492
|
+
readonly scenes: SceneStack;
|
|
493
|
+
/**
|
|
494
|
+
* TELLS THE CARTRIDGE THE LANGUAGE CHANGED — the only thing it needs to know about it (ADR-0225).
|
|
495
|
+
*
|
|
496
|
+
* 📌 The engine already redraws everything that IS its own: the bar, the caption, the card, the pad, an open panel, the
|
|
497
|
+
* voice that speaks and the model that listens. What it cannot redraw is the ACTIVITY — and without this door the
|
|
498
|
+
* cartridge would have to subscribe to `i18n:change` on the window, knowing the event's name and reaching a global to
|
|
499
|
+
* do it. It is the rule the Dev wrote for reading and speech: «o jogo não deve precisar saber como isso funciona»
|
|
500
|
+
* (ADR-0216).
|
|
501
|
+
*
|
|
502
|
+
* ⚠️ Called AFTER the engine has redrawn itself, so the cartridge never sees a half-translated screen.
|
|
503
|
+
*/
|
|
504
|
+
readonly onLocaleChange: (fn: () => void) => void;
|
|
505
|
+
/** How many colour-vision filters were mounted. `0` = there was no host, and the visual menu loses half. */
|
|
242
506
|
readonly cvdFilters: number;
|
|
243
|
-
/**
|
|
507
|
+
/** What the host page lacks and what the cartridge left undone, each line naming its fix. Empty = nothing to fix. */
|
|
244
508
|
readonly problems: readonly string[];
|
|
245
|
-
/**
|
|
509
|
+
/** What this game declared it does not have. Returned so it can be audited — declining stays on the record. */
|
|
246
510
|
readonly declines: Declinios;
|
|
247
511
|
/**
|
|
248
|
-
*
|
|
512
|
+
* THE ANNOUNCEMENT THAT THE LOOP STOPPED, ready to go into `startLoop(ticker, frame, maxDt, { onFailure })`.
|
|
249
513
|
*
|
|
250
|
-
* ⚠️
|
|
251
|
-
*
|
|
252
|
-
*
|
|
514
|
+
* ⚠️ ADR-0054 says in writing that it is only half true while this does not exist, and the missing half is the one
|
|
515
|
+
* that matters: **a blind child does not see a frozen screen.** Without an announcement, blind mode cannot tell
|
|
516
|
+
* a crash from a pause to think, and the silence is the same in both cases.
|
|
253
517
|
*
|
|
254
|
-
* ⚠️
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
* parar não é opcional; o que ele perde é dizer que parou.
|
|
518
|
+
* ⚠️ IT COMES FROM THE ENGINE AND NOT FROM EACH GAME because the message is the same in all of them and the channel
|
|
519
|
+
* (screen reader + narration + what is SEEN) is infrastructure. The game owns the ticker and calls `startLoop`, whose
|
|
520
|
+
* `onFailure` is REQUIRED (ADR-0232 D4): the game passes this, and no registration in `core/loop` stands in for it.
|
|
258
521
|
*/
|
|
259
|
-
readonly
|
|
522
|
+
readonly onFailure: (failure: unknown) => void;
|
|
260
523
|
/**
|
|
261
|
-
*
|
|
524
|
+
* THE REACH MEASURED FOR THE MOUNTED CARTRIDGE — ADR-0079 §3's guarantee as data, for whoever wants to read it.
|
|
262
525
|
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
*
|
|
526
|
+
* The engine has already shown the notice if there was something to say; this is returned because a game may want to
|
|
527
|
+
* decide more (hide a level that demands twelve actions, for example), and because `ok: false` is the kind of fact
|
|
528
|
+
* that must be auditable instead of living only on a screen that has closed.
|
|
266
529
|
*/
|
|
267
|
-
readonly
|
|
530
|
+
readonly reach: Reach;
|
|
531
|
+
/**
|
|
532
|
+
* MAKES THIS CARTRIDGE THE CURRENT ONE (ADR-0142). One composition root, several games.
|
|
533
|
+
*
|
|
534
|
+
* ⚠️ **THROWS** on a malformed declaration, and does not put it in `problems`: the contract is a PRECONDITION and not
|
|
535
|
+
* a diagnosis, as at boot. A bad cartridge is never mounted.
|
|
536
|
+
*
|
|
537
|
+
* 📌 What it redoes is only what reading again cannot fix: effects written elsewhere — the two mapping registers, the
|
|
538
|
+
* HUD, the game-options rows, the bar, the reach notice and the pad. `problems` and `reach` describe the mounted
|
|
539
|
+
* cartridge because they are derived when read, not because `mount` copies them.
|
|
540
|
+
*/
|
|
541
|
+
mount(declaration: GameDeclaration, hooks?: CartridgeHooks): void;
|
|
542
|
+
/**
|
|
543
|
+
* RELEASES THE CURRENT ONE: mappings set to `null`, reach notice and HUD removed, reading thread
|
|
544
|
+
* closed, scene stack emptied.
|
|
545
|
+
*
|
|
546
|
+
* ⚠️ The stack is emptied with `pop()` and not with a `clear()`, and the difference is the decision: a scene's `exit()`
|
|
547
|
+
* is its DOM cleanup, so running it is the teardown wanted. A `clear()` that skipped them would be the wrong fix.
|
|
548
|
+
*/
|
|
549
|
+
unmount(): void;
|
|
550
|
+
/**
|
|
551
|
+
* ENDS THIS ROOT: it releases the current cartridge, like `unmount()`, AND STOPS LISTENING TO THE WINDOW.
|
|
552
|
+
*
|
|
553
|
+
* 🔴 The two are separate on purpose, and the separation is the whole point. `unmount()` releases the CARTRIDGE (ADR-0142) and
|
|
554
|
+
* a `mount()` after it must find a root that still hears the keyboard — so `unmount()` may not take the listeners off. But a
|
|
555
|
+
* page that is finished with a root had, until this method existed, no way to say so: the root kept its ~30 window listeners
|
|
556
|
+
* for the lifetime of the document, and since every query it makes is document-wide, it went on driving the pause card of
|
|
557
|
+
* whatever root came after it. 📏 Measured: one ArrowDown moved the cursor one item with one root, two with a second root
|
|
558
|
+
* alive, three with a third.
|
|
559
|
+
*
|
|
560
|
+
* ⚠️ A disposed root is not to be used again: it no longer hears anything. Call it when the page drops the root, not between
|
|
561
|
+
* cartridges — that is what `unmount()` is for.
|
|
562
|
+
*/
|
|
563
|
+
dispose(): void;
|
|
268
564
|
}
|
|
565
|
+
/** The game's half WITHOUT the declaration — what `mount` receives beside it. */
|
|
566
|
+
export type CartridgeHooks = Omit<GameHalf, 'declaration'>;
|
|
567
|
+
/**
|
|
568
|
+
* THE GAME'S HALF of `CreateGameOptions` — the fields ADR-0139 §1 says a cartridge SUPPLIES, apart from the ones that
|
|
569
|
+
* describe the page and the device.
|
|
570
|
+
*
|
|
571
|
+
* The test that record gives: could a PAGE answer this without knowing which game runs? If not, the field is here.
|
|
572
|
+
*/
|
|
573
|
+
type GameHalf = Pick<CreateGameOptions, 'declaration' | 'isNavigable' | 'withIndex' | 'onBar' | 'navBar' | 'players' | 'setPhase' | 'sonarPlayers' | 'isBlindMode' | 'preset' | 'declines' | 'getPauseActs' | 'setPauseActor' | 'setPlayerTheme' | 'setPlayerCorrection' | 'accommodations' | 'genre' | 'onScreenPad' | 'hud' | 'gameOptions' | 'howToPlay' | 'onCommand' | 'gamepad'>;
|
|
269
574
|
/**
|
|
270
|
-
*
|
|
575
|
+
* Switches the engine on for a declared game.
|
|
271
576
|
*
|
|
272
|
-
* ⚠️
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
*
|
|
577
|
+
* ⚠️ THROWS if the declaration is malformed, and does NOT throw if markup is missing. The difference is not taste: a
|
|
578
|
+
* wrong declaration is a PROGRAM defect, and a game that runs half-declared is worse than one that does not open; a
|
|
579
|
+
* missing id is a gap of the HOST, and the quiz proved that switching on only the part that serves is legitimate —
|
|
580
|
+
* that is how it declined the pad and the sonar without lying. So one becomes an exception and the other `problems`.
|
|
276
581
|
*/
|
|
277
582
|
export declare function createGame(o: CreateGameOptions): Engine;
|