@the-inclusionist/engine 9.0.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +444 -215
- package/dist-pkg/boot/create-game.js +3530 -549
- 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 +249 -351
- 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
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import { recognitionRoute, type RecognitionApi, type OnDeviceAvailability, type RecognitionInstance } from './speech-recognition.js';
|
|
3
|
+
/** The browser's recognition object, with the parts a reading uses. Assigned handlers, as the API has them. */
|
|
4
|
+
export interface ListeningSession extends RecognitionInstance {
|
|
5
|
+
start(): void;
|
|
6
|
+
stop(): void;
|
|
7
|
+
onresult: ((ev: {
|
|
8
|
+
readonly results: ArrayLike<ArrayLike<{
|
|
9
|
+
readonly transcript: string;
|
|
10
|
+
}> & {
|
|
11
|
+
readonly isFinal: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
}) => void) | null;
|
|
14
|
+
onerror: ((ev: {
|
|
15
|
+
readonly error?: string;
|
|
16
|
+
}) => void) | null;
|
|
17
|
+
onend: (() => void) | null;
|
|
18
|
+
}
|
|
19
|
+
/** What a reading gives back. `route` is which recogniser heard it — for `problems` and for a lab, never for the game's logic. */
|
|
20
|
+
export interface Heard {
|
|
21
|
+
readonly text: string;
|
|
22
|
+
readonly route: 'webspeech-local' | 'model';
|
|
23
|
+
/** The reading stopped because the child went quiet, because the time ran out, or because someone asked it to stop. */
|
|
24
|
+
readonly ended: 'silence' | 'timeout' | 'asked';
|
|
25
|
+
}
|
|
26
|
+
export interface ReadingDeps {
|
|
27
|
+
/** The BCP-47 tag of the child's language (`core/i18n.bcp47`). */
|
|
28
|
+
readonly language: () => string;
|
|
29
|
+
/** The browser's `SpeechRecognition` constructor, or nothing where there is none. */
|
|
30
|
+
readonly api?: RecognitionApi | null;
|
|
31
|
+
readonly now: () => number;
|
|
32
|
+
readonly every: (fn: () => void, ms: number) => unknown;
|
|
33
|
+
readonly stopEvery: (h: unknown) => void;
|
|
34
|
+
/** A line for `problems`, written once per reason (ADR-0169). */
|
|
35
|
+
readonly report: (line: string) => void;
|
|
36
|
+
/**
|
|
37
|
+
* The engine's own recogniser, when there is one to load — the models of ADR-0201, lazily (`platform/reading-runtime`).
|
|
38
|
+
* Absent: the refusal below.
|
|
39
|
+
*/
|
|
40
|
+
readonly model?: (language: string) => Promise<{
|
|
41
|
+
transcribe(samples: Float32Array): Promise<string>;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* The microphone, as 16 kHz mono samples. The model route needs sound, and the browser route does not: the browser's own
|
|
45
|
+
* recogniser opens the microphone itself. ⚠️ Absent with a model present is a reading that REFUSES and says which half is
|
|
46
|
+
* missing — never one that answers an empty sentence, which a game would show a child as «you read nothing».
|
|
47
|
+
*/
|
|
48
|
+
readonly record?: (options: ListenOptions) => Promise<Float32Array>;
|
|
49
|
+
readonly route?: typeof recognitionRoute;
|
|
50
|
+
readonly createSession?: (api: RecognitionApi, language: string) => ListeningSession;
|
|
51
|
+
}
|
|
52
|
+
export interface ListenOptions {
|
|
53
|
+
/** How long a silence ends the reading. Default 1.5 s: shorter cuts a child who is thinking between words. */
|
|
54
|
+
readonly silenceMs?: number;
|
|
55
|
+
/** The ceiling, so a forgotten microphone does not listen for ever. Default 30 s, the window Whisper reads at once. */
|
|
56
|
+
readonly maxMs?: number;
|
|
57
|
+
}
|
|
58
|
+
export interface Reading {
|
|
59
|
+
/** Listens until the child goes quiet, and answers with what was read. */
|
|
60
|
+
listen(options?: ListenOptions): Promise<Heard>;
|
|
61
|
+
/** Gives the microphone back now; the reading in hand answers with what it has. */
|
|
62
|
+
stop(): void;
|
|
63
|
+
/** Can this device serve the child's language at all? Answers with the reason when it cannot. */
|
|
64
|
+
ready(): Promise<{
|
|
65
|
+
readonly can: boolean;
|
|
66
|
+
readonly why: OnDeviceAvailability | 'sem-api' | 'sem-processamento-local' | 'no-model';
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
69
|
+
export declare function createReading(d: ReadingDeps): Reading;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// platform/reading — THE CHILD READS ALOUD, AND THE GAME RECEIVES TEXT (ADR-0216, issue #200).
|
|
3
|
+
//
|
|
4
|
+
// The Dev, 2026-09-21: «a engine deve oferecer objetos de leitura e TTS. O jogo não deve precisar saber como isso funciona, apenas
|
|
5
|
+
// deve pedir para ouvir e receber o texto.» So this module answers ONE question — what did the child say — and keeps the rest:
|
|
6
|
+
// which recogniser heard it, in which language, and whether it may run at all.
|
|
7
|
+
//
|
|
8
|
+
// · ON THE DEVICE OR NOT AT ALL (ADR-0200 erratum). The browser's recogniser is used only where it says it recognises on the device
|
|
9
|
+
// AND the language is installed there (`platform/speech-recognition`). Anything else waits for the models the project carries
|
|
10
|
+
// (Whisper for pt, Moonshine for en and es — ADR-0201), which arrive through `engine` below and are not built yet: until then a
|
|
11
|
+
// request is REFUSED with its reason, never answered by a recogniser that would send a child's voice to a server.
|
|
12
|
+
// · A reading ends when the child stops talking (`silenceMs`) or when the time runs out (`maxMs`), whichever comes first, and what
|
|
13
|
+
// was heard so far is what the game gets — a child who stops mid-sentence is not an error.
|
|
14
|
+
// · Asking twice does not open two microphones: the second caller waits on the same reading.
|
|
15
|
+
import { recognitionRoute, createOnDeviceRecognition } from './speech-recognition.js';
|
|
16
|
+
const SILENCE_MS = 1500;
|
|
17
|
+
const MAX_MS = 30_000;
|
|
18
|
+
export function createReading(d) {
|
|
19
|
+
const routeOf = d.route ?? recognitionRoute;
|
|
20
|
+
const make = d.createSession ?? ((api, language) => createOnDeviceRecognition(api, language));
|
|
21
|
+
const said = new Set();
|
|
22
|
+
const once = (key, line) => { if (!said.has(key)) {
|
|
23
|
+
said.add(key);
|
|
24
|
+
d.report(line);
|
|
25
|
+
} };
|
|
26
|
+
let inFlight = null;
|
|
27
|
+
let askToStop = null;
|
|
28
|
+
async function ready() {
|
|
29
|
+
const { route: route, status: state } = await routeOf(d.language(), d.api);
|
|
30
|
+
if (route === 'webspeech-local')
|
|
31
|
+
return { can: true, why: state };
|
|
32
|
+
return { can: !!d.model, why: d.model ? state : 'no-model' };
|
|
33
|
+
}
|
|
34
|
+
function byBrowser(api, options) {
|
|
35
|
+
const silenceMs = options.silenceMs ?? SILENCE_MS;
|
|
36
|
+
const maxMs = options.maxMs ?? MAX_MS;
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
let session;
|
|
39
|
+
try {
|
|
40
|
+
session = make(api, d.language());
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
reject(e instanceof Error ? e : new Error(String(e)));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
let text = '', lastSound = d.now(), done = false;
|
|
47
|
+
const ticker = d.every(() => {
|
|
48
|
+
if (done)
|
|
49
|
+
return;
|
|
50
|
+
const quietFor = d.now() - lastSound;
|
|
51
|
+
if (quietFor >= silenceMs && text)
|
|
52
|
+
finish('silence');
|
|
53
|
+
else if (d.now() - startedAt >= maxMs)
|
|
54
|
+
finish('timeout');
|
|
55
|
+
}, 100);
|
|
56
|
+
const startedAt = d.now();
|
|
57
|
+
const finish = (ended) => {
|
|
58
|
+
if (done)
|
|
59
|
+
return;
|
|
60
|
+
done = true;
|
|
61
|
+
d.stopEvery(ticker);
|
|
62
|
+
askToStop = null;
|
|
63
|
+
try {
|
|
64
|
+
session.stop();
|
|
65
|
+
}
|
|
66
|
+
catch { /* a session that already ended is not a failure */ }
|
|
67
|
+
resolve({ text: text.trim(), route: 'webspeech-local', ended });
|
|
68
|
+
};
|
|
69
|
+
askToStop = () => finish('asked');
|
|
70
|
+
session.onresult = (ev) => {
|
|
71
|
+
let together = '';
|
|
72
|
+
for (let i = 0; i < ev.results.length; i++)
|
|
73
|
+
together += `${ev.results[i][0].transcript} `;
|
|
74
|
+
text = together;
|
|
75
|
+
lastSound = d.now();
|
|
76
|
+
};
|
|
77
|
+
session.onerror = (ev) => {
|
|
78
|
+
// ⚠️ A refusal is not a silence: a child waiting to be heard must not wait for ever, and the adult must read why.
|
|
79
|
+
once('error', `reading: the browser's recogniser stopped (${ev.error ?? 'unknown'}) — the child reads and nothing is heard; `
|
|
80
|
+
+ 'allow the microphone for this page, or install the language on the device');
|
|
81
|
+
if (!done) {
|
|
82
|
+
done = true;
|
|
83
|
+
d.stopEvery(ticker);
|
|
84
|
+
askToStop = null;
|
|
85
|
+
reject(new Error(ev.error ?? 'recognition failed'));
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
session.onend = () => { if (!done)
|
|
89
|
+
finish(text ? 'silence' : 'asked'); };
|
|
90
|
+
session.start();
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
ready,
|
|
95
|
+
stop() { askToStop?.('asked'); },
|
|
96
|
+
async listen(options = {}) {
|
|
97
|
+
if (inFlight)
|
|
98
|
+
return inFlight; // one microphone, one reading: the second caller waits on the first
|
|
99
|
+
const { route: route, status: state } = await routeOf(d.language(), d.api);
|
|
100
|
+
if (route !== 'webspeech-local') {
|
|
101
|
+
if (!d.model) {
|
|
102
|
+
once('sem-route', `reading: nothing on this device can hear ${d.language()} (${state}) — the child's reading is not assessed; `
|
|
103
|
+
+ 'install the language in the browser, or build a delivery that carries the reading model for this language');
|
|
104
|
+
throw new Error(`reading is not available here: ${state}`);
|
|
105
|
+
}
|
|
106
|
+
if (!d.record) {
|
|
107
|
+
once('sem-microfone', `reading: the model for ${d.language()} is here and nothing captures the child's voice — `
|
|
108
|
+
+ 'the reading cannot run; pass `record`, the 16 kHz samples the model reads');
|
|
109
|
+
throw new Error('reading has no microphone here');
|
|
110
|
+
}
|
|
111
|
+
const capture = d.record;
|
|
112
|
+
inFlight = (async () => {
|
|
113
|
+
const [transcriber, samples] = await Promise.all([d.model(d.language()), capture(options)]);
|
|
114
|
+
return { text: (await transcriber.transcribe(samples)).trim(), route: 'model', ended: 'silence' };
|
|
115
|
+
})();
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
inFlight = byBrowser(d.api, options);
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
return await inFlight;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
inFlight = null;
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/** What the browser answers about recognising a language on the device (Chrome's `SpeechRecognition.available`). */
|
|
3
|
+
export type OnDeviceAvailability = 'available' | 'downloadable' | 'downloading' | 'unavailable';
|
|
4
|
+
/** The part of the browser's `SpeechRecognition` constructor this module reads. */
|
|
5
|
+
export interface RecognitionApi {
|
|
6
|
+
new (): RecognitionInstance;
|
|
7
|
+
readonly prototype: object;
|
|
8
|
+
readonly available?: (options: {
|
|
9
|
+
langs: readonly string[];
|
|
10
|
+
processLocally: boolean;
|
|
11
|
+
}) => Promise<OnDeviceAvailability>;
|
|
12
|
+
}
|
|
13
|
+
export interface RecognitionInstance {
|
|
14
|
+
lang: string;
|
|
15
|
+
processLocally?: boolean;
|
|
16
|
+
continuous: boolean;
|
|
17
|
+
interimResults: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface RecognitionRoute {
|
|
20
|
+
/** `webspeech-local`: the browser recognises on the device. `recuo`: the engine's own recogniser. */
|
|
21
|
+
readonly route: 'webspeech-local' | 'recuo';
|
|
22
|
+
/** Why: the browser's answer, or what is missing. */
|
|
23
|
+
readonly status: OnDeviceAvailability | 'sem-api' | 'sem-processamento-local';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* THE ROUTE, measured on the device (ADR-0200 §3). ⚠️ A browser whose recognition object has no `processLocally` would take the
|
|
27
|
+
* flag as an unknown property and recognise on its servers — it is never the route, whatever it says about availability.
|
|
28
|
+
*/
|
|
29
|
+
export declare function recognitionRoute(language: string, api: RecognitionApi | null | undefined): Promise<RecognitionRoute>;
|
|
30
|
+
/** A recognition object set to recognise on the device, continuously, with partial hypotheses. Refuses a browser that cannot. */
|
|
31
|
+
export declare function createOnDeviceRecognition(api: RecognitionApi, language: string): RecognitionInstance;
|
|
32
|
+
/** A command heard: a direction word, or the name of an item of the open menu. */
|
|
33
|
+
export type HeardCommand = {
|
|
34
|
+
readonly kind: 'palavra';
|
|
35
|
+
readonly word: string;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: 'item';
|
|
38
|
+
readonly name: string;
|
|
39
|
+
};
|
|
40
|
+
/** How a heard text is compared: lower case, letters and spaces only. */
|
|
41
|
+
export declare const spokenText: (t: string) => string;
|
|
42
|
+
export interface CommandReader {
|
|
43
|
+
/** The menu's item names now on screen (already as spoken). */
|
|
44
|
+
items(names: readonly string[]): void;
|
|
45
|
+
/**
|
|
46
|
+
* One hypothesis of utterance `index`: returns the commands it completes that were not returned before for that utterance. A
|
|
47
|
+
* partial one holds back its last name while another item's name continues it («voltar» may become «voltar ao jogo»).
|
|
48
|
+
*/
|
|
49
|
+
read(index: number, text: string, final: boolean): readonly HeardCommand[];
|
|
50
|
+
}
|
|
51
|
+
export declare function createCommandReader(vocabulary: readonly string[]): CommandReader;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// platform/speech-recognition — which recogniser hears the child, and what a command is in what was heard (ADR-0200 and its
|
|
3
|
+
// erratum, ADR-0193, ADR-0194; issue #190).
|
|
4
|
+
//
|
|
5
|
+
// The browser's recognition comes first, and ONLY on the device: the Dev, «Só local, voz da criança não deve sair do aparelho». So
|
|
6
|
+
// Web Speech is the route only where the browser can say it recognises on the device (`processLocally`) AND the language is
|
|
7
|
+
// installed there; anything else — no API, a browser that would ignore the flag and send the voice to its servers, a language to
|
|
8
|
+
// download — falls back to the recognisers the engine carries (Vosk for commands). The words heard, whoever heard them, become
|
|
9
|
+
// commands the same way: the direction words and the open menu's item names, the longest name first, a partial hypothesis firing
|
|
10
|
+
// what it already holds and a name another item's name continues waiting for the end (ADR-0194 §3).
|
|
11
|
+
/**
|
|
12
|
+
* THE ROUTE, measured on the device (ADR-0200 §3). ⚠️ A browser whose recognition object has no `processLocally` would take the
|
|
13
|
+
* flag as an unknown property and recognise on its servers — it is never the route, whatever it says about availability.
|
|
14
|
+
*/
|
|
15
|
+
export async function recognitionRoute(language, api) {
|
|
16
|
+
if (!api)
|
|
17
|
+
return { route: 'recuo', status: 'sem-api' };
|
|
18
|
+
if (!('processLocally' in api.prototype) || typeof api.available !== 'function')
|
|
19
|
+
return { route: 'recuo', status: 'sem-processamento-local' };
|
|
20
|
+
let availability;
|
|
21
|
+
try {
|
|
22
|
+
availability = await api.available({ langs: [language], processLocally: true });
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { route: 'recuo', status: 'unavailable' };
|
|
26
|
+
}
|
|
27
|
+
return { route: availability === 'available' ? 'webspeech-local' : 'recuo', status: availability };
|
|
28
|
+
}
|
|
29
|
+
/** A recognition object set to recognise on the device, continuously, with partial hypotheses. Refuses a browser that cannot. */
|
|
30
|
+
export function createOnDeviceRecognition(api, language) {
|
|
31
|
+
if (!('processLocally' in api.prototype))
|
|
32
|
+
throw new Error('speech recognition on the device is not supported here: the voice would leave the device');
|
|
33
|
+
const rec = new api();
|
|
34
|
+
rec.lang = language;
|
|
35
|
+
rec.processLocally = true;
|
|
36
|
+
rec.continuous = true;
|
|
37
|
+
rec.interimResults = true;
|
|
38
|
+
return rec;
|
|
39
|
+
}
|
|
40
|
+
/** How a heard text is compared: lower case, letters and spaces only. */
|
|
41
|
+
export const spokenText = (t) => t.toLowerCase().normalize('NFC').replace(/[^\p{L}\s]/gu, ' ').replace(/\s+/g, ' ').trim();
|
|
42
|
+
export function createCommandReader(vocabulary) {
|
|
43
|
+
const spokenForms = vocabulary.map(spokenText);
|
|
44
|
+
let spokenItems = [];
|
|
45
|
+
const firedCount = new Map();
|
|
46
|
+
const phrasesIn = (text) => {
|
|
47
|
+
const p = spokenText(text).split(' ').filter(Boolean);
|
|
48
|
+
const found = [];
|
|
49
|
+
for (let i = 0; i < p.length;) {
|
|
50
|
+
let matched = null;
|
|
51
|
+
for (let n = p.length - i; n >= 1; n--) {
|
|
52
|
+
const f = p.slice(i, i + n).join(' ');
|
|
53
|
+
if (spokenItems.includes(f) || spokenForms.includes(f)) {
|
|
54
|
+
matched = f;
|
|
55
|
+
i += n;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (matched)
|
|
60
|
+
found.push(matched);
|
|
61
|
+
else
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
return found;
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
items(names) { spokenItems = names.map(spokenText); },
|
|
68
|
+
read(index, text, final) {
|
|
69
|
+
const found = phrasesIn(text);
|
|
70
|
+
const alreadyFired = firedCount.get(index) ?? 0;
|
|
71
|
+
const newCommands = [];
|
|
72
|
+
for (let i = alreadyFired; i < found.length; i++) {
|
|
73
|
+
const f = found[i];
|
|
74
|
+
if (!final && i === found.length - 1 && spokenItems.some((o) => o !== f && o.startsWith(f + ' ')))
|
|
75
|
+
break;
|
|
76
|
+
newCommands.push(spokenItems.includes(f) ? { kind: 'item', name: f } : { kind: 'palavra', word: f });
|
|
77
|
+
firedCount.set(index, i + 1);
|
|
78
|
+
}
|
|
79
|
+
if (final)
|
|
80
|
+
firedCount.delete(index);
|
|
81
|
+
return newCommands;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* THE BROWSER'S SPEECH, lent by whoever holds the window (the composition root, from `host.win`). The same port
|
|
4
|
+
* `platform/tts` receives. `synth()` is asked at every utterance and may answer `null`: a browser without speech synthesis.
|
|
5
|
+
*/
|
|
6
|
+
export interface SpeechPort {
|
|
7
|
+
synth(): SpeechSynthesis | null;
|
|
8
|
+
utterance(text: string): SpeechSynthesisUtterance;
|
|
9
|
+
}
|
|
10
|
+
/** What the literacy voice reads: the browser's speech, and the master sound it obeys. */
|
|
11
|
+
export interface GameVoice extends SpeechPort {
|
|
12
|
+
soundOn(): boolean;
|
|
13
|
+
volume(): number;
|
|
14
|
+
}
|
|
15
|
+
export declare function gameSay(voice: GameVoice, text: string): void;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/speech.ts —
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
function ptbrVoice() {
|
|
2
|
+
// platform/speech.ts — the LITERACY voice (gameSay): pt-BR speech that is ALWAYS on (independent of the mixer's
|
|
3
|
+
// narration toggle), through the browser's native voice. It picks a pt-BR voice and avoids pt-PT. A helper that holds nothing:
|
|
4
|
+
// it takes the browser's speech and the master sound as a parameter (ADR-0232 D4, erratum D3 point 2).
|
|
5
|
+
// The MENU's TTS (narrate/ttsSpeak and the Kokoro neural engine) is another path, gated by the mixer — `platform/tts`.
|
|
6
|
+
function ptbrVoice(ss) {
|
|
7
7
|
try {
|
|
8
|
-
const vs =
|
|
8
|
+
const vs = ss.getVoices() || [];
|
|
9
9
|
if (!vs.length)
|
|
10
10
|
return null;
|
|
11
11
|
return vs.find((v) => /pt[-_]?br/i.test(v.lang)) || vs.find((v) => /pt/i.test(v.lang) && /bras|brazil/i.test(v.name)) || vs.find((v) => /pt/i.test(v.lang) && !/pt[-_]?pt/i.test(v.lang)) || null;
|
|
@@ -14,21 +14,21 @@ function ptbrVoice() {
|
|
|
14
14
|
return null;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
//
|
|
18
|
-
export function gameSay(text) {
|
|
19
|
-
if (!text || !soundOn)
|
|
17
|
+
// FORCES pt-BR (not the mixer's voice, which may be pt-PT). Volume ×1.4 so the speech sits above the effects.
|
|
18
|
+
export function gameSay(voice, text) {
|
|
19
|
+
if (!text || !voice.soundOn())
|
|
20
20
|
return;
|
|
21
21
|
try {
|
|
22
|
-
const ss =
|
|
22
|
+
const ss = voice.synth();
|
|
23
23
|
if (!ss)
|
|
24
24
|
return;
|
|
25
25
|
ss.cancel();
|
|
26
|
-
const u =
|
|
26
|
+
const u = voice.utterance(text);
|
|
27
27
|
u.lang = 'pt-BR';
|
|
28
|
-
const v = ptbrVoice();
|
|
28
|
+
const v = ptbrVoice(ss);
|
|
29
29
|
if (v)
|
|
30
30
|
u.voice = v;
|
|
31
|
-
u.volume = Math.min(1, volume * 1.4);
|
|
31
|
+
u.volume = Math.min(1, voice.volume() * 1.4);
|
|
32
32
|
ss.speak(u);
|
|
33
33
|
}
|
|
34
34
|
catch (e) { /* noop */ }
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/**
|
|
3
|
+
* The full name of a key in the GAME's scope.
|
|
4
|
+
*
|
|
5
|
+
* ⚠️ THE ID COMES IN AS AN ARGUMENT; it was once a constant. By ADR-0080's test — *would a second game want a different
|
|
6
|
+
* value here?* — the answer is yes, at once: two games in the same browser profile collided on every game-scoped key, and
|
|
7
|
+
* one overwrote the other's progress with no error at all.
|
|
8
|
+
*
|
|
9
|
+
* ⚠️ AND THE ID DOES NOT COME FROM THE DECLARATION, the obvious design. It cannot: a game's state is read before any
|
|
10
|
+
* `createGame()`, so an id from the declaration would arrive after the keys were resolved — against nothing, in silence.
|
|
11
|
+
* Whoever knows its own id is the GAME, which passes it as its own constant; ADR-0080 forbids the ENGINE from knowing it,
|
|
12
|
+
* not the game.
|
|
13
|
+
*/
|
|
14
|
+
export declare function gameKey(gameId: string, keyName: string): string;
|
|
15
|
+
export declare const KEYS: {
|
|
16
|
+
onebtn: string;
|
|
17
|
+
wheelchair: string;
|
|
18
|
+
modocego: string;
|
|
19
|
+
caneDiv: string;
|
|
20
|
+
hearingloss: string;
|
|
21
|
+
activity: (gameId: string) => string;
|
|
22
|
+
activityLegado: string;
|
|
23
|
+
quizlevel: (gameId: string) => string;
|
|
24
|
+
quizlevelLegado: string;
|
|
25
|
+
cenario: (gameId: string) => string;
|
|
26
|
+
cenarioLegado: string;
|
|
27
|
+
tabsel: (gameId: string) => string;
|
|
28
|
+
tabselLegado: string;
|
|
29
|
+
fracnot: (gameId: string) => string;
|
|
30
|
+
fracnotLegado: string;
|
|
31
|
+
viz: string;
|
|
32
|
+
lq: string;
|
|
33
|
+
cbsafe: string;
|
|
34
|
+
ownercolors: string;
|
|
35
|
+
outfg: string;
|
|
36
|
+
outbg: string;
|
|
37
|
+
hcrole: string;
|
|
38
|
+
juice: string;
|
|
39
|
+
crt: string;
|
|
40
|
+
crtLegacy: string;
|
|
41
|
+
ttsEngine: string;
|
|
42
|
+
ttsVoice: string;
|
|
43
|
+
ttsVoz: string;
|
|
44
|
+
lang: string;
|
|
45
|
+
letterCase: string;
|
|
46
|
+
captions: string;
|
|
47
|
+
tea: string;
|
|
48
|
+
menuIndex: string;
|
|
49
|
+
fontKey: string;
|
|
50
|
+
padDesign: string;
|
|
51
|
+
padDir: string;
|
|
52
|
+
touchmap: string;
|
|
53
|
+
padBtnMm: string;
|
|
54
|
+
padGapMm: string;
|
|
55
|
+
padStickMm: string;
|
|
56
|
+
padTravelMm: string;
|
|
57
|
+
padDpadMm: string;
|
|
58
|
+
reducedMotion: string;
|
|
59
|
+
toggleMoveLegacy: string;
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated ⚠️ THE LEGACY visual-mode KEY — ONE value, from when only one fitted (issue #104).
|
|
62
|
+
*
|
|
63
|
+
* It is still READ, which is what keeps the child from losing what they chose; it is still WRITTEN while the controls
|
|
64
|
+
* write one value at a time, because an old reader does `if (v && VIZ_BY_KEY[v])` and would reject a JSON — writing
|
|
65
|
+
* the new shape HERE would erase their setting in silence, exactly the defect the migration exists not to commit.
|
|
66
|
+
*/
|
|
67
|
+
vizP: (i: number) => string;
|
|
68
|
+
/**
|
|
69
|
+
* The two-axis VISUAL STATE, in JSON (ADR-0076, issue #104).
|
|
70
|
+
*
|
|
71
|
+
* ⚠️ A NEW KEY BESIDE THE OLD ONE, not the same key with new content. The same design as the `visual` field beside
|
|
72
|
+
* `viz`: both shapes coexist while both have readers, each reads the one it understands, and the old one dies only
|
|
73
|
+
* when nobody reads it. `migrateVisual` accepts both, so the fallback — new key absent, old key present — returns
|
|
74
|
+
* exactly what the child chose.
|
|
75
|
+
*/
|
|
76
|
+
visualP: (i: number) => string;
|
|
77
|
+
sinkP: (i: number) => string;
|
|
78
|
+
easyP: (i: number) => string;
|
|
79
|
+
/**
|
|
80
|
+
* ⚠️ THE TWO BELOW ARE LEGACY KEYS (ADR-0104 §C, issue #114). They are still READ — it is the child's setting, and
|
|
81
|
+
* inheriting it keeps them from losing it — and never written again. What is written is the key WITH A TRANSPORT,
|
|
82
|
+
* because the toggle belongs to the DEVICE and not the person: turning it on for the touch pad, where nobody holds a
|
|
83
|
+
* virtual button comfortably, turned it on for the keyboard too, where holding a key is exactly what the child can do.
|
|
84
|
+
*
|
|
85
|
+
* ⚠️ AND THE NEW KEY DOES NOT LIVE HERE, on purpose. It is `latchKey`, in `input/latch-scope` — `platform/` does not
|
|
86
|
+
* import `input/`, the layer above. Building it here would need either a backwards edge or a second copy of the name.
|
|
87
|
+
* Whoever owns the name is whoever knows the transport rule.
|
|
88
|
+
*/
|
|
89
|
+
toggleMoveP: (i: number) => string;
|
|
90
|
+
toggleRunP: (i: number) => string;
|
|
91
|
+
rmWalkP: (i: number) => string;
|
|
92
|
+
rmBreathP: (i: number) => string;
|
|
93
|
+
rmFlavorP: (i: number) => string;
|
|
94
|
+
attract: (gameId: string, scenery: string) => string;
|
|
95
|
+
attractLegado: (scenery: string) => string;
|
|
96
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// platform/storage-keys.ts — THE NAMES OF WHAT IS STORED: the register of known keys and the rule that scopes a game's key.
|
|
3
|
+
//
|
|
4
|
+
// 📌 A STATELESS MODULE ON PURPOSE (ADR-0232, issue #207): a key is a string, and a module that only needs the NAME must not
|
|
5
|
+
// import `platform/storage`, which reaches `localStorage`, to get it. `input/touch` and `ui/settings-mobility` read and write
|
|
6
|
+
// through an injected store and import only these names.
|
|
7
|
+
//
|
|
8
|
+
// 📌 WHY `platform/` AND NOT `core/` (ADR-0173): the table names places in the browser's persistent storage, and every module
|
|
9
|
+
// that reads it is at `platform` or above — the storage itself, the input, the renderer, the panels, and the games. `core/`
|
|
10
|
+
// reaches storage only through the port `core/state.createSettingsStore` receives (ADR-0178), which carries the keys it needs; putting
|
|
11
|
+
// the table in `core/` would invite the core to name storage places again, the dependency ADR-0178 took out.
|
|
12
|
+
//
|
|
13
|
+
// 📌 THIS IS THE ONLY HOME OF `KEYS` (ADR-0232 D2b): `platform/storage` is a factory now and publishes no key table. The
|
|
14
|
+
// port `core/state.createSettingsStore` receives carries the table beside the store — the root passes `{ ...store, KEYS }`.
|
|
15
|
+
/**
|
|
16
|
+
* The full name of a key in the GAME's scope.
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ THE ID COMES IN AS AN ARGUMENT; it was once a constant. By ADR-0080's test — *would a second game want a different
|
|
19
|
+
* value here?* — the answer is yes, at once: two games in the same browser profile collided on every game-scoped key, and
|
|
20
|
+
* one overwrote the other's progress with no error at all.
|
|
21
|
+
*
|
|
22
|
+
* ⚠️ AND THE ID DOES NOT COME FROM THE DECLARATION, the obvious design. It cannot: a game's state is read before any
|
|
23
|
+
* `createGame()`, so an id from the declaration would arrive after the keys were resolved — against nothing, in silence.
|
|
24
|
+
* Whoever knows its own id is the GAME, which passes it as its own constant; ADR-0080 forbids the ENGINE from knowing it,
|
|
25
|
+
* not the game.
|
|
26
|
+
*/
|
|
27
|
+
export function gameKey(gameId, keyName) { return 'incl.' + gameId + '.' + keyName; }
|
|
28
|
+
// The register of known keys (documentation in ONE place; the source of truth is still their use). Keys taking an
|
|
29
|
+
// argument are parameterised by player, scenery or game. The two scopes — the CHILD's `incl_*` and the GAME's
|
|
30
|
+
// `incl.<game>.*` — are explained in `platform/storage`.
|
|
31
|
+
export const KEYS = {
|
|
32
|
+
// motor/hearing empathy
|
|
33
|
+
onebtn: 'incl_onebtn', wheelchair: 'incl_wheelchair', modocego: 'incl_modocego', caneDiv: 'incl_cane_div',
|
|
34
|
+
hearingloss: 'incl_hearingloss',
|
|
35
|
+
// activity / quiz / scenery — the GAME's SCOPE (see the two scopes in `platform/storage`). `*Legado` is the old name, which
|
|
36
|
+
// the read inherits from once; the write goes to the new one only.
|
|
37
|
+
//
|
|
38
|
+
// ⚠️ THEY ARE FUNCTIONS OF THE GAME'S ID, and the child's are strings. The difference of SHAPE is what prevents the
|
|
39
|
+
// mistake: a child's preference cannot be prefixed by accident, because it has nowhere to take the id — and a
|
|
40
|
+
// play-through's key cannot be left unscoped, because without the argument it does not compile. The rule that once
|
|
41
|
+
// lived only in a comment lives in the type.
|
|
42
|
+
activity: (gameId) => gameKey(gameId, 'activity'), activityLegado: 'incl_activity',
|
|
43
|
+
quizlevel: (gameId) => gameKey(gameId, 'quizlevel'), quizlevelLegado: 'incl_quizlevel',
|
|
44
|
+
cenario: (gameId) => gameKey(gameId, 'cenario'), cenarioLegado: 'incl_cenario',
|
|
45
|
+
tabsel: (gameId) => gameKey(gameId, 'tabsel'), tabselLegado: 'incl_tabsel',
|
|
46
|
+
fracnot: (gameId) => gameKey(gameId, 'fracnot'), fracnotLegado: 'incl_fracnot',
|
|
47
|
+
// visual / contrast / colour
|
|
48
|
+
viz: 'incl_viz', lq: 'incl_lq', cbsafe: 'incl_cbsafe', ownercolors: 'incl_ownercolors',
|
|
49
|
+
outfg: 'incl_outfg', outbg: 'incl_outbg', hcrole: 'incl_hcrole', juice: 'incl_juice', crt: 'incl_crt2',
|
|
50
|
+
crtLegacy: 'incl_crt', // the old (boolean) format; render/crt migrates it to incl_crt2 on the first read
|
|
51
|
+
// audio / voice / i18n
|
|
52
|
+
ttsEngine: 'incl_tts_engine', ttsVoice: 'incl_tts_voice', ttsVoz: 'incl_tts_voz', lang: 'incl_lang', // audiocat_{k}
|
|
53
|
+
// communication / captions (ADR-0028: every panel persists)
|
|
54
|
+
letterCase: 'incl_lettercase', captions: 'incl_captions',
|
|
55
|
+
// ⚠️ THE AUTISM-SUPPORT LEVEL (calm / quiet) PERSISTS. It used not to: the extraction from the monolith PRESERVED "never
|
|
56
|
+
// written to storage" verbatim, which is not the same as deciding it. The cost fell on the child who needs it most —
|
|
57
|
+
// whoever uses quiet mode set it again every session, and unexpected noise costs them most. ADR-0028: every panel persists.
|
|
58
|
+
tea: 'incl_tea',
|
|
59
|
+
menuIndex: 'incl_menuindex', // the "6 of 10" at the end of an item's announcement (ADR-0044, item 3)
|
|
60
|
+
// typography / controls / touch
|
|
61
|
+
fontKey: 'incl_font_k', padDesign: 'incl_paddesign', padDir: 'incl_paddir', touchmap: 'incl_touchmap',
|
|
62
|
+
padBtnMm: 'incl_padbtnmm', padGapMm: 'incl_padgapmm', padStickMm: 'incl_padstickmm',
|
|
63
|
+
padTravelMm: 'incl_padtravelmm', padDpadMm: 'incl_paddpadmm',
|
|
64
|
+
// reduced motion (the whole object in one JSON) + the old toggle-movement key, still read once to migrate whoever came
|
|
65
|
+
// from the previous version
|
|
66
|
+
reducedMotion: 'inclusionist.reducedmotion.v1', toggleMoveLegacy: 'inclusionist.togglemove',
|
|
67
|
+
// PER PLAYER — parameterised by the screen's index. As functions here, no call site can write a crooked name.
|
|
68
|
+
/**
|
|
69
|
+
* @deprecated ⚠️ THE LEGACY visual-mode KEY — ONE value, from when only one fitted (issue #104).
|
|
70
|
+
*
|
|
71
|
+
* It is still READ, which is what keeps the child from losing what they chose; it is still WRITTEN while the controls
|
|
72
|
+
* write one value at a time, because an old reader does `if (v && VIZ_BY_KEY[v])` and would reject a JSON — writing
|
|
73
|
+
* the new shape HERE would erase their setting in silence, exactly the defect the migration exists not to commit.
|
|
74
|
+
*/
|
|
75
|
+
vizP: (i) => 'incl_viz_p' + i,
|
|
76
|
+
/**
|
|
77
|
+
* The two-axis VISUAL STATE, in JSON (ADR-0076, issue #104).
|
|
78
|
+
*
|
|
79
|
+
* ⚠️ A NEW KEY BESIDE THE OLD ONE, not the same key with new content. The same design as the `visual` field beside
|
|
80
|
+
* `viz`: both shapes coexist while both have readers, each reads the one it understands, and the old one dies only
|
|
81
|
+
* when nobody reads it. `migrateVisual` accepts both, so the fallback — new key absent, old key present — returns
|
|
82
|
+
* exactly what the child chose.
|
|
83
|
+
*/
|
|
84
|
+
visualP: (i) => 'incl_visual_p' + i,
|
|
85
|
+
sinkP: (i) => 'incl_sink_p' + i,
|
|
86
|
+
easyP: (i) => 'incl_easy_p' + i,
|
|
87
|
+
/**
|
|
88
|
+
* ⚠️ THE TWO BELOW ARE LEGACY KEYS (ADR-0104 §C, issue #114). They are still READ — it is the child's setting, and
|
|
89
|
+
* inheriting it keeps them from losing it — and never written again. What is written is the key WITH A TRANSPORT,
|
|
90
|
+
* because the toggle belongs to the DEVICE and not the person: turning it on for the touch pad, where nobody holds a
|
|
91
|
+
* virtual button comfortably, turned it on for the keyboard too, where holding a key is exactly what the child can do.
|
|
92
|
+
*
|
|
93
|
+
* ⚠️ AND THE NEW KEY DOES NOT LIVE HERE, on purpose. It is `latchKey`, in `input/latch-scope` — `platform/` does not
|
|
94
|
+
* import `input/`, the layer above. Building it here would need either a backwards edge or a second copy of the name.
|
|
95
|
+
* Whoever owns the name is whoever knows the transport rule.
|
|
96
|
+
*/
|
|
97
|
+
toggleMoveP: (i) => 'incl_togglemove_p' + i,
|
|
98
|
+
toggleRunP: (i) => 'incl_togglerun_p' + i, // the RUN-button toggle (the movement one's sibling)
|
|
99
|
+
rmWalkP: (i) => 'incl_rmWalk_p' + i,
|
|
100
|
+
rmBreathP: (i) => 'incl_rmBreath_p' + i,
|
|
101
|
+
rmFlavorP: (i) => 'incl_rmFlavor_p' + i,
|
|
102
|
+
// demo/attract: one recording per scenery (a function, not a string — a parameterised key). The GAME's SCOPE: the
|
|
103
|
+
// recording is of a level of THIS game and means nothing in another.
|
|
104
|
+
attract: (gameId, scenery) => gameKey(gameId, 'attract_' + scenery),
|
|
105
|
+
attractLegado: (scenery) => 'incl_attract_' + scenery,
|
|
106
|
+
};
|