@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
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Translate } from '../core/i18n.js';
|
|
3
|
+
export type AacTier =
|
|
4
|
+
/** CC BY-SA or ours: it may travel inside the game and works with no network at all. */
|
|
5
|
+
'bundled'
|
|
6
|
+
/** The licence allows use, not redistribution: the person downloads it, once, and it stays cached. */
|
|
7
|
+
| 'fetched'
|
|
8
|
+
/** Permission is missing. It appears in the menu and is not selectable. */
|
|
9
|
+
| 'negotiating';
|
|
10
|
+
export interface AacSet {
|
|
11
|
+
readonly key: string;
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly tier: AacTier;
|
|
14
|
+
/** The licence as it was VERIFIED, or null when there is none yet. Short text, to fit on screen. */
|
|
15
|
+
readonly license: string | null;
|
|
16
|
+
/** Does it work IN THIS build? The pictograms are files that have not arrived yet. */
|
|
17
|
+
readonly available: boolean;
|
|
18
|
+
/** Pictograms only: one line about the origin, when it changes what the choice means. */
|
|
19
|
+
readonly note?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const AAC_SETS: readonly AacSet[];
|
|
22
|
+
export declare const AAC_BY_KEY: Readonly<Record<string, AacSet>>;
|
|
23
|
+
/** Which SETS the child can choose today: none. The menu does not pretend otherwise — the pictograms are thousands
|
|
24
|
+
* of files that have not entered the repository, and four of the sets depend on negotiation. */
|
|
25
|
+
export declare function aacAvailable(): AacSet[];
|
|
26
|
+
/**
|
|
27
|
+
* Why this set is not available — an i18n key, never finished text.
|
|
28
|
+
*
|
|
29
|
+
* The two answers tell the reader different things, which is why there are two: "in preparation" means the licence
|
|
30
|
+
* is settled and the work is OURS; "awaiting negotiation" means the permission belongs to SOMEONE ELSE and no effort
|
|
31
|
+
* of ours brings it forward.
|
|
32
|
+
*
|
|
33
|
+
* And that is why the unavailable ones are shown instead of hidden: they are exactly the sets a Brazilian school is
|
|
34
|
+
* most likely to already use in another product. The educator who looks for PCS and does not find it concludes the
|
|
35
|
+
* game cannot do it — when the obstacle is a licence, not a capability. Hiding would answer the wrong question, and
|
|
36
|
+
* answer it wrongly.
|
|
37
|
+
*/
|
|
38
|
+
export declare function aacReason(s: AacSet): string | null;
|
|
39
|
+
/** A label ready for the menu row: the name + the reason, when there is one. */
|
|
40
|
+
export declare function aacLabel(t: Translate, s: AacSet): string;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// LETTERS ARE NOT IN THIS LIST, and the absence is the Dev's decision: letter case is ONE switch (upper case, on or
|
|
3
|
+
// off, with off meaning both cases), not two entries. A binary choice presented as two options makes the child compare
|
|
4
|
+
// two rows to discover they are the same question; a switch asks once.
|
|
5
|
+
//
|
|
6
|
+
// What remains here is genuinely a LIST: the pictogram sets, of which one is chosen.
|
|
7
|
+
export const AAC_SETS = [
|
|
8
|
+
// --- PICTOGRAMS that MAY travel with the game (CC BY-SA, verified by the Dev). ---
|
|
9
|
+
{ key: 'mulberry', name: 'Mulberry Symbols', tier: 'bundled', license: 'CC BY-SA', available: false },
|
|
10
|
+
{ key: 'blissymbolics', name: 'Blissymbolics', tier: 'bundled', license: 'CC BY-SA 4.0', available: false,
|
|
11
|
+
note: 'Escrita simbólica própria: os símbolos se combinam para formar sentidos novos.' },
|
|
12
|
+
{ key: 'tawasol', name: 'Tawasol', tier: 'bundled', license: 'CC BY-SA 4.0', available: false,
|
|
13
|
+
note: 'Desenhado na e para a cultura árabe. Um pictograma não é neutro — a criança reconhece mais depressa os objetos, as roupas e os rostos do próprio mundo.' },
|
|
14
|
+
// --- PICTOGRAMS that must be DOWNLOADED. ---
|
|
15
|
+
{ key: 'arasaac', name: 'ARASAAC', tier: 'fetched', license: 'baixado à parte', available: false },
|
|
16
|
+
// --- AWAITING NEGOTIATION. Visible on purpose: see `aacReason`. ---
|
|
17
|
+
{ key: 'sclera', name: 'Sclera', tier: 'negotiating', license: null, available: false },
|
|
18
|
+
{ key: 'pcs', name: 'PCS', tier: 'negotiating', license: null, available: false },
|
|
19
|
+
{ key: 'symbolstix', name: 'SymbolStix', tier: 'negotiating', license: null, available: false },
|
|
20
|
+
{ key: 'widgit', name: 'Widgit Symbols', tier: 'negotiating', license: null, available: false },
|
|
21
|
+
];
|
|
22
|
+
export const AAC_BY_KEY = Object.fromEntries(AAC_SETS.map((s) => [s.key, s]));
|
|
23
|
+
/** Which SETS the child can choose today: none. The menu does not pretend otherwise — the pictograms are thousands
|
|
24
|
+
* of files that have not entered the repository, and four of the sets depend on negotiation. */
|
|
25
|
+
export function aacAvailable() {
|
|
26
|
+
return AAC_SETS.filter((s) => s.available);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Why this set is not available — an i18n key, never finished text.
|
|
30
|
+
*
|
|
31
|
+
* The two answers tell the reader different things, which is why there are two: "in preparation" means the licence
|
|
32
|
+
* is settled and the work is OURS; "awaiting negotiation" means the permission belongs to SOMEONE ELSE and no effort
|
|
33
|
+
* of ours brings it forward.
|
|
34
|
+
*
|
|
35
|
+
* And that is why the unavailable ones are shown instead of hidden: they are exactly the sets a Brazilian school is
|
|
36
|
+
* most likely to already use in another product. The educator who looks for PCS and does not find it concludes the
|
|
37
|
+
* game cannot do it — when the obstacle is a licence, not a capability. Hiding would answer the wrong question, and
|
|
38
|
+
* answer it wrongly.
|
|
39
|
+
*/
|
|
40
|
+
export function aacReason(s) {
|
|
41
|
+
if (s.available)
|
|
42
|
+
return null;
|
|
43
|
+
return s.tier === 'negotiating' ? 'aac.aguardandoNegociacao' : 'aac.emPreparo';
|
|
44
|
+
}
|
|
45
|
+
/** A label ready for the menu row: the name + the reason, when there is one. */
|
|
46
|
+
export function aacLabel(t, s) {
|
|
47
|
+
const reason = aacReason(s);
|
|
48
|
+
return reason ? `${s.name} — ${t(reason)}` : s.name;
|
|
49
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Translate } from '../core/i18n.js';
|
|
3
|
+
/** `lbl` is an i18n key (a key missing from the dictionaries is shown as written). */
|
|
4
|
+
export interface AudioCatDef {
|
|
5
|
+
k: string;
|
|
6
|
+
lbl: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AudioCatState {
|
|
9
|
+
on: boolean;
|
|
10
|
+
vol: number;
|
|
11
|
+
}
|
|
12
|
+
/** The SOUND-NAVIGATION categories (cane/sonar/guard/guide) — their master volume is separate from the game's sound. */
|
|
13
|
+
export declare const NAV_CATS: readonly ["sonar", "guard", "guide"];
|
|
14
|
+
/** The game's GENERAL categories (TTS lives in the Voice section, outside this list). */
|
|
15
|
+
export declare const GEN_CATS: readonly ["music", "ambient", "interact", "earcons"];
|
|
16
|
+
/** 0..1 -> 0..100 rounded (slider display value). */
|
|
17
|
+
export declare function volPercent(v: number): number;
|
|
18
|
+
/** #navsound-master's value: the loudest of the nav categories, as a 0..100 slider value. */
|
|
19
|
+
export declare function navMasterVolume(state: Readonly<Record<string, AudioCatState>>, navCats?: readonly string[]): number;
|
|
20
|
+
/** Cane-hit spacing select -> validated int (garbage/empty -> 1, "one tap per block"). */
|
|
21
|
+
export declare function parseCaneDiv(raw: string): number;
|
|
22
|
+
/** srSay text for a cane-hit spacing choice. The two halves are ONE sentence per case, not a shared prefix
|
|
23
|
+
* plus a tail: a language that renders this as "One tap per block (cane)" needs to move the word "cane". */
|
|
24
|
+
export declare function caneDivMessage(t: Translate, div: number): string;
|
|
25
|
+
/** #tts-engine's option catalog: (value, i18n KEY of the label). The engine NAMES are proper nouns and stay
|
|
26
|
+
* put; what translates is the parenthetical that explains each one. Keys, not text — see input/devices. */
|
|
27
|
+
export declare const TTS_ENGINE_OPTIONS: readonly (readonly [string, string])[];
|
|
28
|
+
/**
|
|
29
|
+
* The engines THIS assembly can offer (ADR-0094): the neural one arrives through the game's Kokoro port (ADR-0198, ADR-0207), so
|
|
30
|
+
* without it Kokoro is not offered — a choice that cannot work leaves whoever picks it waiting for a download that never starts.
|
|
31
|
+
* `kitten`/`espeak` are not built and stay as they were.
|
|
32
|
+
*/
|
|
33
|
+
export declare function voiceEngineOptions(neuralAvailable: boolean): readonly (readonly [string, string])[];
|
|
34
|
+
export interface VoiceLike {
|
|
35
|
+
name: string;
|
|
36
|
+
lang: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The system voices in the language asked for; with none of them, the whole list.
|
|
40
|
+
*
|
|
41
|
+
* It was called `pickPtVoices` and filtered a hard-coded `/^pt/i`, so a game in English offered a child a list of PORTUGUESE
|
|
42
|
+
* voices to read English text. The name told the truth about what it did and lied about what it should do.
|
|
43
|
+
*
|
|
44
|
+
* The comparison is by language PREFIX and not by the whole tag: a child playing in pt-BR should also be able to choose a
|
|
45
|
+
* pt-PT voice if that is the only one installed, and a school's browser rarely has the exact variant. The fallback to the
|
|
46
|
+
* whole list stays: an empty list would be worse than a list in the wrong language, which at least she can hear and reject.
|
|
47
|
+
*/
|
|
48
|
+
export declare function pickVoicesFor<T extends VoiceLike>(voices: readonly T[], lang: string): readonly T[];
|
|
49
|
+
/** "<name> (<lang>)" option label. */
|
|
50
|
+
export declare function voiceLabel(v: VoiceLike): string;
|
|
51
|
+
/** Whether the browser can list/switch audio outputs at all (gates the #audio-sinks hint copy). */
|
|
52
|
+
export declare function sinksSupported(hasEnumerateDevices: boolean, hasAudioContextCtor: boolean): boolean;
|
|
53
|
+
export interface SinkDeviceLike {
|
|
54
|
+
deviceId: string;
|
|
55
|
+
label?: string;
|
|
56
|
+
}
|
|
57
|
+
/** A device's option label, falling back to a 1-based "Output N" when the browser withholds the real label
|
|
58
|
+
* (no getUserMedia permission granted yet). */
|
|
59
|
+
export declare function sinkOptionLabel(t: Translate, d: SinkDeviceLike, index: number): string;
|
|
60
|
+
/** A player's current sink select value ('' = default/shared). */
|
|
61
|
+
export declare function sinkSelectValue(p: {
|
|
62
|
+
audioSink?: string | null;
|
|
63
|
+
} | undefined): string;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// ui/audio-choices — WHAT THE AUDIO PANELS OFFER, computed without a document (ADR-0221; issue #203).
|
|
3
|
+
//
|
|
4
|
+
// The sound categories and their volumes, the cane's tap spacing, the speech engines, the system voices and the audio
|
|
5
|
+
// outputs: each one answered as a value or a string, with no `document`, no ctx and no state. `ui/settings-audio` keeps the
|
|
6
|
+
// other half — finding the thirteen controls, wiring them and reflecting what the child chose.
|
|
7
|
+
//
|
|
8
|
+
// 🔴 AND THE SUITE HAD ALREADY MADE THIS CUT, which is what made it obvious. `tests/settings-audio.node.test.js` imported
|
|
9
|
+
// exactly these fifteen names and nothing else, while `settings-audio.browser.test.js` drove the DOM half: the file was two
|
|
10
|
+
// modules wearing one name, and the only place that said so was the test folder. 📏 The module it left was 568 lines and 112
|
|
11
|
+
// decision nodes, the third largest in the engine.
|
|
12
|
+
//
|
|
13
|
+
// 📌 WHY IT IS `ui/` AND NOT `core/`: half of these resolve i18n KEYS (`t`) into the words a child reads, and a label is
|
|
14
|
+
// interface. What is genuinely free of language — the category lists and the volume arithmetic — stays here beside the rest
|
|
15
|
+
// rather than being split again for the sake of a layer.
|
|
16
|
+
/** The SOUND-NAVIGATION categories (cane/sonar/guard/guide) — their master volume is separate from the game's sound. */
|
|
17
|
+
export const NAV_CATS = ['sonar', 'guard', 'guide'];
|
|
18
|
+
/** The game's GENERAL categories (TTS lives in the Voice section, outside this list). */
|
|
19
|
+
// ⚠️ THEY BELONG TO THE «AUDIO» PANEL since ADR-0151, not to the hearing one: what is taste (music, ambience) does not live
|
|
20
|
+
// beside what is accessibility (sonar, guard, guide). And `other` left — it controlled no sound at all.
|
|
21
|
+
export const GEN_CATS = ['music', 'ambient', 'interact', 'earcons'];
|
|
22
|
+
/** 0..1 -> 0..100 rounded (slider display value). */
|
|
23
|
+
export function volPercent(v) {
|
|
24
|
+
return Math.round(v * 100);
|
|
25
|
+
}
|
|
26
|
+
/*
|
|
27
|
+
* 🔴 NO CATEGORY-ROW MARKUP HERE (note BV): the audio panel's category list is built as NODES (ADR-0129), in
|
|
28
|
+
* `ui/settings-audio.buildCatRow`, where the row is also RECONCILED instead of reborn. A markup builder with no consumer is
|
|
29
|
+
* published debt — it is deleted, not moved.
|
|
30
|
+
*
|
|
31
|
+
* 📌 And no alias is left: a re-export would keep alive a path nothing imports and make the surface snapshot lie, because
|
|
32
|
+
* it does not see re-exports (issue #204).
|
|
33
|
+
*/
|
|
34
|
+
/** #navsound-master's value: the loudest of the nav categories, as a 0..100 slider value. */
|
|
35
|
+
export function navMasterVolume(state, navCats = NAV_CATS) {
|
|
36
|
+
return volPercent(Math.max(...navCats.map((k) => state[k].vol)));
|
|
37
|
+
}
|
|
38
|
+
/** Cane-hit spacing select -> validated int (garbage/empty -> 1, "one tap per block"). */
|
|
39
|
+
export function parseCaneDiv(raw) {
|
|
40
|
+
return (+raw) || 1;
|
|
41
|
+
}
|
|
42
|
+
/** srSay text for a cane-hit spacing choice. The two halves are ONE sentence per case, not a shared prefix
|
|
43
|
+
* plus a tail: a language that renders this as "One tap per block (cane)" needs to move the word "cane". */
|
|
44
|
+
export function caneDivMessage(t, div) {
|
|
45
|
+
return t(div === 2 ? 'sr.audio.caneHalfBlock' : 'sr.audio.canePerBlock');
|
|
46
|
+
}
|
|
47
|
+
/** #tts-engine's option catalog: (value, i18n KEY of the label). The engine NAMES are proper nouns and stay
|
|
48
|
+
* put; what translates is the parenthetical that explains each one. Keys, not text — see input/devices. */
|
|
49
|
+
export const TTS_ENGINE_OPTIONS = [
|
|
50
|
+
['webspeech', 'tts.engine.webspeech'],
|
|
51
|
+
['kokoro', 'tts.engine.kokoro'],
|
|
52
|
+
['kitten', 'tts.engine.kitten'],
|
|
53
|
+
['espeak', 'tts.engine.espeak'],
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* The engines THIS assembly can offer (ADR-0094): the neural one arrives through the game's Kokoro port (ADR-0198, ADR-0207), so
|
|
57
|
+
* without it Kokoro is not offered — a choice that cannot work leaves whoever picks it waiting for a download that never starts.
|
|
58
|
+
* `kitten`/`espeak` are not built and stay as they were.
|
|
59
|
+
*/
|
|
60
|
+
export function voiceEngineOptions(neuralAvailable) {
|
|
61
|
+
return neuralAvailable ? TTS_ENGINE_OPTIONS : TTS_ENGINE_OPTIONS.filter(([v]) => v !== 'kokoro');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The system voices in the language asked for; with none of them, the whole list.
|
|
65
|
+
*
|
|
66
|
+
* It was called `pickPtVoices` and filtered a hard-coded `/^pt/i`, so a game in English offered a child a list of PORTUGUESE
|
|
67
|
+
* voices to read English text. The name told the truth about what it did and lied about what it should do.
|
|
68
|
+
*
|
|
69
|
+
* The comparison is by language PREFIX and not by the whole tag: a child playing in pt-BR should also be able to choose a
|
|
70
|
+
* pt-PT voice if that is the only one installed, and a school's browser rarely has the exact variant. The fallback to the
|
|
71
|
+
* whole list stays: an empty list would be worse than a list in the wrong language, which at least she can hear and reject.
|
|
72
|
+
*/
|
|
73
|
+
export function pickVoicesFor(voices, lang) {
|
|
74
|
+
const pref = lang.slice(0, 2).toLowerCase();
|
|
75
|
+
const sameTag = voices.filter((v) => v.lang.slice(0, 2).toLowerCase() === pref);
|
|
76
|
+
return sameTag.length ? sameTag : voices;
|
|
77
|
+
}
|
|
78
|
+
/** "<name> (<lang>)" option label. */
|
|
79
|
+
export function voiceLabel(v) {
|
|
80
|
+
return v.name + ' (' + v.lang + ')';
|
|
81
|
+
}
|
|
82
|
+
/** Whether the browser can list/switch audio outputs at all (gates the #audio-sinks hint copy). */
|
|
83
|
+
export function sinksSupported(hasEnumerateDevices, hasAudioContextCtor) {
|
|
84
|
+
return hasEnumerateDevices && hasAudioContextCtor;
|
|
85
|
+
}
|
|
86
|
+
/** A device's option label, falling back to a 1-based "Output N" when the browser withholds the real label
|
|
87
|
+
* (no getUserMedia permission granted yet). */
|
|
88
|
+
export function sinkOptionLabel(t, d, index) {
|
|
89
|
+
return d.label || t('audio.sinkFallback', { n: index + 1 });
|
|
90
|
+
}
|
|
91
|
+
/** A player's current sink select value ('' = default/shared). */
|
|
92
|
+
export function sinkSelectValue(p) {
|
|
93
|
+
return (p && p.audioSink) || '';
|
|
94
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { AccommodationWord } from '../core/accommodations.js';
|
|
3
|
+
export interface AudioRowsThatApplyCtx {
|
|
4
|
+
/** The host's DOM query — this module never reaches a global (ADR-0221 step 7d). */
|
|
5
|
+
readonly find: <T extends Element>(selector: string) => T | null;
|
|
6
|
+
/** The word this cartridge gives the cane row, or `null` when nobody walks in this game. */
|
|
7
|
+
readonly caneWord: () => AccommodationWord | null;
|
|
8
|
+
/** Does sound navigation have a subject here? A world AND a direction — read NOW, because a game changes between phases. */
|
|
9
|
+
readonly hasNavigationSound: () => boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Offers the rows this cartridge has a subject for, and hides the rest. Safe to call at every open. */
|
|
12
|
+
export declare function showOnlyRowsThatApply(ctx: AudioRowsThatApplyCtx): void;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// ui/audio-rows-that-apply — A ROW WITH NO SUBJECT IS NOT OFFERED, AND THE ONE THAT APPLIES CARRIES THE GAME'S WORD
|
|
3
|
+
// (ADR-0153; ADR-0106 §5; ADR-0113 clause 3; ADR-0145).
|
|
4
|
+
//
|
|
5
|
+
// Two rows of the hearing panel, and two different ways of knowing whether this cartridge has anything to say with them:
|
|
6
|
+
//
|
|
7
|
+
// · THE CANE. The cartridge ANSWERS for it (`acomodacoes.caneSpacing`), because whether anybody walks in this game is
|
|
8
|
+
// not derivable from a contract — a board game and a platformer both have a world. When the answer is a word, the row
|
|
9
|
+
// carries the GAME's word and the GAME's explanation; when it is `false`, nobody walks and the row is not offered.
|
|
10
|
+
// · THE SOUND NAVIGATION. DERIVED and never asked (ADR-0153): the sonar needs a world AND a bearing, and `bearing`
|
|
11
|
+
// answers `none` on `hotspots`. In a list-of-points game the sonar, the edge guard and the guide were three sliders
|
|
12
|
+
// with no subject, and asking the cartridge again would let the two answers disagree.
|
|
13
|
+
//
|
|
14
|
+
// ⚠️ `hidden` ON THE ROW, and never the row out of the document, and the reason is measured: `initSettingsAudio` wires
|
|
15
|
+
// `#cane-div` ONCE, at boot. A row that did not exist then and that a later `mount()` brought in would arrive with no
|
|
16
|
+
// listener — a dead control with the look of a live one. `hidden` takes it out of the accessibility tree entirely, which
|
|
17
|
+
// is the «not offered» of ADR-0113 clause 3, and leaves the listener alive for the cartridge that does have it.
|
|
18
|
+
//
|
|
19
|
+
// 📌 THE ANSWERS ARRIVE AS QUESTIONS AND NOT AS A CARTRIDGE, so this module has no opinion about where they come from and
|
|
20
|
+
// a case can drive it without a root. It is also what keeps the derivation in the composition root, where the contract
|
|
21
|
+
// lives: 📏 measured on 2026-09-23, this rule asks the subject set for ONE membership, and two of the three fields that
|
|
22
|
+
// set is built from cannot change that answer — passing them here would be carrying weight that never does anything.
|
|
23
|
+
/** Offers the rows this cartridge has a subject for, and hides the rest. Safe to call at every open. */
|
|
24
|
+
export function showOnlyRowsThatApply(ctx) {
|
|
25
|
+
const row = ctx.find('#cane-div')?.closest('.ctrl-row');
|
|
26
|
+
const cane = ctx.caneWord();
|
|
27
|
+
if (row) {
|
|
28
|
+
row.hidden = cane === null;
|
|
29
|
+
// 🔴 WHAT APPLIES CARRIES THE GAME'S WORD (ADR-0153's confirmation), and BOTH halves of it. `mountAudioInside`
|
|
30
|
+
// re-labels in the engine's own words at every open and this runs after it, so the game's label wins the `<strong>`
|
|
31
|
+
// and the game's explanation wins the `.opt-hint` the footer reads. ⚠️ An absent hint keeps the engine's sentence:
|
|
32
|
+
// «this game has nothing to add» is not «this row has nothing to say».
|
|
33
|
+
const label = row.querySelector('strong');
|
|
34
|
+
if (cane && label)
|
|
35
|
+
label.textContent = cane.label;
|
|
36
|
+
const hint = row.querySelector('.opt-hint');
|
|
37
|
+
if (cane?.hint && hint)
|
|
38
|
+
hint.textContent = cane.hint;
|
|
39
|
+
}
|
|
40
|
+
const navigation = ctx.find('#navsound-list');
|
|
41
|
+
if (navigation)
|
|
42
|
+
navigation.hidden = !ctx.hasNavigationSound();
|
|
43
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { CameraControl } from '../core/camera-cycle.js';
|
|
3
|
+
import type { SwitchableControl } from './switchable-control.js';
|
|
4
|
+
export declare function followCameraMode(mode: CameraControl, controls: {
|
|
5
|
+
readonly [M in Exclude<CameraControl, 'off'>]: SwitchableControl;
|
|
6
|
+
}): void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// ui/camera-control — THE 📷 POSITION TO THE THREE CAMERA CONTROLS (ADR-0215; issue #199).
|
|
3
|
+
//
|
|
4
|
+
// One stored position (`core/state.cameraControl`): off · hands · face · eyes. Each control starts only at its own position, so one camera
|
|
5
|
+
// mode at a time holds by construction (ADR-0197). The ones turning off are told first, so a camera is let go before the next mode asks.
|
|
6
|
+
export function followCameraMode(mode, controls) {
|
|
7
|
+
const all = Object.entries(controls);
|
|
8
|
+
for (const [m, c] of all)
|
|
9
|
+
if (m !== mode)
|
|
10
|
+
void c.apply(false);
|
|
11
|
+
for (const [m, c] of all)
|
|
12
|
+
if (m === mode)
|
|
13
|
+
void c.apply(true);
|
|
14
|
+
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Translate } from '../core/i18n.js';
|
|
2
3
|
export declare const CHANGED_CLASS = "is-changed";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
* Marks (or unmarks) ONE control. Idempotent by construction: clears and only then applies. The panels call this from
|
|
6
|
+
* inside the same `reflect*` that already redraws the control, so it runs many times in a row.
|
|
6
7
|
*/
|
|
7
|
-
export declare function markChanged(el: HTMLElement | null, changed: boolean): void;
|
|
8
|
+
export declare function markChanged(t: Translate, el: HTMLElement | null, changed: boolean): void;
|
|
8
9
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
10
|
+
* Raises the mark one level: the button that OPENS the menu stays marked while any option inside it is. Without this
|
|
11
|
+
* the trail would start inside the menu, and finding the right menu would still cost opening every one.
|
|
11
12
|
*
|
|
12
|
-
* `changes`
|
|
13
|
-
*
|
|
13
|
+
* `changes` is a list of booleans and not of elements because the panel is the one that knows how to compare with the
|
|
14
|
+
* default; this module must have no opinion on what the default is — there is one source, ADR-0028's DEFAULTS.
|
|
14
15
|
*/
|
|
15
|
-
export declare function markMenuChanged(opener: HTMLElement | null, changes: readonly boolean[]): void;
|
|
16
|
+
export declare function markMenuChanged(t: Translate, opener: HTMLElement | null, changes: readonly boolean[]): void;
|
|
@@ -1,56 +1,25 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// ui/changed-mark.ts — MARCA O QUE SAIU DO PADRÃO (ADR-0029). Módulo-folha: só DOM e i18n, nenhuma dep de
|
|
3
|
-
// estado. Quem sabe o que é padrão é cada painel, que já leu DEFAULTS (ADR-0028); aqui mora só o COMO marcar.
|
|
4
|
-
//
|
|
5
|
-
// O problema que ele resolve: o reset por menu do ADR-0028 só serve a quem sabe que há algo para desfazer.
|
|
6
|
-
// Sete menus, ~40 controles, e o que a criança mexeu tem exatamente a mesma aparência do que ela não mexeu.
|
|
7
|
-
// Os menus não estavam mal rotulados — estavam IMPESQUISÁVEIS.
|
|
8
|
-
//
|
|
9
|
-
// TRÊS CANAIS, e nenhum é enfeite. O ADR-0029 explica por quê; em resumo: a moldura branca sozinha não serve
|
|
10
|
-
// a quem não distingue cores, some no alto contraste (onde `--ink-soft` JÁ é branco) e não existe para quem
|
|
11
|
-
// não enxerga. Então:
|
|
12
|
-
//
|
|
13
|
-
// 1. COR — `--changed` na moldura (CSS; troca sozinha no alto contraste).
|
|
14
|
-
// 2. FORMA — anel interno, uma moldura dupla. Sobrevive a escala de cinza e a qualquer paleta, porque é uma
|
|
15
|
-
// CONTAGEM DE ANÉIS e não uma matiz.
|
|
16
|
-
// 3. NOME — o nome acessível do controle ganha um sufixo. É o canal que faz mais trabalho pelo menor preço:
|
|
17
|
-
// a criança cega PERCORRE o menu e OUVE, em ordem, o que saiu do padrão.
|
|
18
|
-
//
|
|
19
|
-
// O canal 3 tem dois caminhos porque os painéis constroem o nome de duas formas, e um `aria-label` vence o
|
|
20
|
-
// conteúdo do botão. Marcar só um deles deixaria metade dos controles mudos — em silêncio, que é o pior jeito
|
|
21
|
-
// de uma marca de acessibilidade falhar, porque nada na tela denuncia a falta.
|
|
22
|
-
//
|
|
23
|
-
// O sufixo NUNCA toca o `textContent`. A primeira versão pendurava um `<span class="sr-only">` dentro do
|
|
24
|
-
// botão, e um teste que aferia o rótulo visível caiu — mostrando o problema real: os painéis reescrevem
|
|
25
|
-
// `textContent` inteiro a cada reflect, então o sufixo vivia à mercê da ordem das chamadas. Agora o caminho
|
|
26
|
-
// sem `aria-label` CRIA um, a partir do conteúdo, e o desmarcar simplesmente o remove.
|
|
27
|
-
//
|
|
28
|
-
// E a idempotência é ESTRUTURAL, não caso a caso: toda chamada primeiro devolve o controle ao estado
|
|
29
|
-
// original — tirando qualquer rastro nosso, dos dois caminhos — e só então aplica. Uma marca que só soubesse
|
|
30
|
-
// acrescentar acabaria em tudo, e uma marca em tudo não é marca.
|
|
31
|
-
import { t } from '../core/i18n.js';
|
|
32
2
|
export const CHANGED_CLASS = 'is-changed';
|
|
33
|
-
/**
|
|
3
|
+
/** Keeps the ORIGINAL `aria-label` when it is the panel's, to give it back without guessing from text. */
|
|
34
4
|
const BASE_ATTR = 'markBase';
|
|
35
|
-
/**
|
|
5
|
+
/** Marks that the `aria-label` was created by US: unmarking removes the whole attribute instead of restoring one. */
|
|
36
6
|
const OWNED_ATTR = 'markOwnsLabel';
|
|
37
7
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
8
|
+
* The node whose accessible NAME gets the suffix: the row's FIRST control in document order, or the row itself when it
|
|
9
|
+
* has no control inside.
|
|
40
10
|
*
|
|
41
|
-
* "
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* coisa duas vezes ao atravessar uma linha só, que é ruído com cara de informação.
|
|
11
|
+
* "The first" is a decision, not chance. A mixer row has TWO controls: the volume and the on/off. The suffix goes on the
|
|
12
|
+
* volume, which comes first in the markup, for two reasons: it is the control the child reaches first when tabbing, so
|
|
13
|
+
* they hear the mark BEFORE deciding whether to stop on this row; and repeating the suffix on both would make the
|
|
14
|
+
* screen reader say the same thing twice across one row, which is noise dressed as information.
|
|
46
15
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
16
|
+
* What this leaves fragile, and why a test holds it: reordering the markup moves the suffix to another control without
|
|
17
|
+
* breaking anything visible.
|
|
49
18
|
*/
|
|
50
19
|
function namedNode(el) {
|
|
51
20
|
return el.querySelector('button, select, input, [role="button"]') ?? el;
|
|
52
21
|
}
|
|
53
|
-
/**
|
|
22
|
+
/** Returns the control to its original state, whether the label came from the panel or from us. The base of every call. */
|
|
54
23
|
function clearMark(node) {
|
|
55
24
|
if (node.dataset[OWNED_ATTR] !== undefined) {
|
|
56
25
|
node.removeAttribute('aria-label');
|
|
@@ -62,10 +31,10 @@ function clearMark(node) {
|
|
|
62
31
|
}
|
|
63
32
|
}
|
|
64
33
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
34
|
+
* Marks (or unmarks) ONE control. Idempotent by construction: clears and only then applies. The panels call this from
|
|
35
|
+
* inside the same `reflect*` that already redraws the control, so it runs many times in a row.
|
|
67
36
|
*/
|
|
68
|
-
export function markChanged(el, changed) {
|
|
37
|
+
export function markChanged(t, el, changed) {
|
|
69
38
|
if (!el)
|
|
70
39
|
return;
|
|
71
40
|
el.classList.toggle(CHANGED_CLASS, changed);
|
|
@@ -76,21 +45,21 @@ export function markChanged(el, changed) {
|
|
|
76
45
|
const suffix = t('a11y.changed');
|
|
77
46
|
const label = node.getAttribute('aria-label');
|
|
78
47
|
if (label !== null) {
|
|
79
|
-
node.dataset[BASE_ATTR] = label; //
|
|
48
|
+
node.dataset[BASE_ATTR] = label; // the panel's label: keep it and give it back later
|
|
80
49
|
node.setAttribute('aria-label', label + ', ' + suffix);
|
|
81
50
|
}
|
|
82
51
|
else {
|
|
83
|
-
node.dataset[OWNED_ATTR] = '1'; //
|
|
52
|
+
node.dataset[OWNED_ATTR] = '1'; // the label came from the content: create one and own it
|
|
84
53
|
node.setAttribute('aria-label', (node.textContent ?? '').trim() + ', ' + suffix);
|
|
85
54
|
}
|
|
86
55
|
}
|
|
87
56
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
57
|
+
* Raises the mark one level: the button that OPENS the menu stays marked while any option inside it is. Without this
|
|
58
|
+
* the trail would start inside the menu, and finding the right menu would still cost opening every one.
|
|
90
59
|
*
|
|
91
|
-
* `changes`
|
|
92
|
-
*
|
|
60
|
+
* `changes` is a list of booleans and not of elements because the panel is the one that knows how to compare with the
|
|
61
|
+
* default; this module must have no opinion on what the default is — there is one source, ADR-0028's DEFAULTS.
|
|
93
62
|
*/
|
|
94
|
-
export function markMenuChanged(opener, changes) {
|
|
95
|
-
markChanged(opener, changes.some(Boolean));
|
|
63
|
+
export function markMenuChanged(t, opener, changes) {
|
|
64
|
+
markChanged(t, opener, changes.some(Boolean));
|
|
96
65
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Translate } from '../core/i18n.js';
|
|
3
|
+
import { type Action } from '../core/actions.js';
|
|
4
|
+
import type { KeyScheme } from '../core/entity.js';
|
|
5
|
+
/**
|
|
6
|
+
* Physical key code → short readable label.
|
|
7
|
+
*
|
|
8
|
+
* `Space` is the only one with a word to translate; the arrows are glyphs and the rest are the bare letter or
|
|
9
|
+
* digit, identical in every language.
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ A TABLE AND A LADDER, and not a chain of replacements, which leaks the MACHINE's name whenever a prefix is not
|
|
12
|
+
* foreseen (`Digit1`, `Numpad5`). What is not recognised still passes through untouched on purpose: `Comma` is ugly
|
|
13
|
+
* and honest, and inventing a name for it would be guessing.
|
|
14
|
+
*/
|
|
15
|
+
export declare function keyName(t: Translate, code: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Which OTHER player already owns `code`, among `schemes` (one entry per player, same order as player index) —
|
|
18
|
+
* or -1 if free. `mapRef` (the scheme currently being edited) is excluded BY REFERENCE. Built over a Map (code →
|
|
19
|
+
* owner index) so a scheme with many bound keys does not cost a full re-scan per lookup.
|
|
20
|
+
*/
|
|
21
|
+
export declare function keyUsedByOther(code: string, mapRef: KeyScheme, schemes: readonly KeyScheme[]): number;
|
|
22
|
+
/**
|
|
23
|
+
* Which OTHER action OF THE SAME scheme already has `code` — or `null` if none.
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ THE SIBLING `keyUsedByOther` NEEDS, AND ITS ABSENCE IS INVISIBLE IN A ONE-PLAYER GAME (#126). That function
|
|
26
|
+
* excludes the scheme being edited **by reference**; with a single player, `schemesFor()` returns exactly that
|
|
27
|
+
* scheme, so its guard scans an empty list and **can never fire**. A child who puts `W` on a new action would keep
|
|
28
|
+
* `W` on the old one too, and play the whole game with both firing together.
|
|
29
|
+
*
|
|
30
|
+
* ⚠️ AND THAT IS THE WORST SHAPE A DEFECT CAN TAKE, as the `input/default-bindings` header says: the two actions fire
|
|
31
|
+
* together, and the child sees an intermittent double action nobody can reproduce on purpose — on a screen they
|
|
32
|
+
* opened **because** they could not use the default controls.
|
|
33
|
+
*
|
|
34
|
+
* Returns the ACTION and not a boolean, because the announcement has to say which one — saying only that the key is
|
|
35
|
+
* in use sends the child looking for what the function already knows.
|
|
36
|
+
*/
|
|
37
|
+
export declare function actionAlreadyBound(code: string, mapRef: KeyScheme, except: Action): Action | null;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import { ACTIONS } from '../core/actions.js';
|
|
3
|
+
/**
|
|
4
|
+
* THE FOUR ARROWS, one per direction.
|
|
5
|
+
*
|
|
6
|
+
* 🔴 The Dev asked for exactly these: «Por que está escrevendo "↔Up", "↔Down" etc ao invés de simplesmente "↑",
|
|
7
|
+
* "↓", "←" e "→"? Não escolha poluir a UI.» A chain of `replace` calls over the physical code is a hidden table, and a
|
|
8
|
+
* hidden table writes what nobody chose — so the table is written out.
|
|
9
|
+
*
|
|
10
|
+
* 📌 And there is nothing to translate here: an arrow is the same in pt, en and es, which is exactly why it is a
|
|
11
|
+
* glyph and not a word. The child who remaps sees the key they have in hand.
|
|
12
|
+
*/
|
|
13
|
+
const GLYPH = {
|
|
14
|
+
ArrowUp: '↑', ArrowDown: '↓', ArrowLeft: '←', ArrowRight: '→',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Physical key code → short readable label.
|
|
18
|
+
*
|
|
19
|
+
* `Space` is the only one with a word to translate; the arrows are glyphs and the rest are the bare letter or
|
|
20
|
+
* digit, identical in every language.
|
|
21
|
+
*
|
|
22
|
+
* ⚠️ A TABLE AND A LADDER, and not a chain of replacements, which leaks the MACHINE's name whenever a prefix is not
|
|
23
|
+
* foreseen (`Digit1`, `Numpad5`). What is not recognised still passes through untouched on purpose: `Comma` is ugly
|
|
24
|
+
* and honest, and inventing a name for it would be guessing.
|
|
25
|
+
*/
|
|
26
|
+
export function keyName(t, code) {
|
|
27
|
+
const c = String(code);
|
|
28
|
+
if (GLYPH[c])
|
|
29
|
+
return GLYPH[c];
|
|
30
|
+
if (c === 'Space')
|
|
31
|
+
return t('key.space');
|
|
32
|
+
if (c.startsWith('Shift'))
|
|
33
|
+
return 'Shift';
|
|
34
|
+
if (c.startsWith('Key'))
|
|
35
|
+
return c.slice(3);
|
|
36
|
+
if (c.startsWith('Digit'))
|
|
37
|
+
return c.slice(5);
|
|
38
|
+
// «Num 5», «Num Add»: the numeric keypad is a different PHYSICAL place, and saying only «5» would make two
|
|
39
|
+
// distinct keys show the same label in the same list.
|
|
40
|
+
if (c.startsWith('Numpad'))
|
|
41
|
+
return `Num ${c.slice(6)}`;
|
|
42
|
+
return c;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Which OTHER player already owns `code`, among `schemes` (one entry per player, same order as player index) —
|
|
46
|
+
* or -1 if free. `mapRef` (the scheme currently being edited) is excluded BY REFERENCE. Built over a Map (code →
|
|
47
|
+
* owner index) so a scheme with many bound keys does not cost a full re-scan per lookup.
|
|
48
|
+
*/
|
|
49
|
+
export function keyUsedByOther(code, mapRef, schemes) {
|
|
50
|
+
const owners = new Map();
|
|
51
|
+
schemes.forEach((m, i) => {
|
|
52
|
+
if (m === mapRef)
|
|
53
|
+
return;
|
|
54
|
+
for (const a of ACTIONS)
|
|
55
|
+
for (const c of m[a] || [])
|
|
56
|
+
if (!owners.has(c))
|
|
57
|
+
owners.set(c, i);
|
|
58
|
+
});
|
|
59
|
+
return owners.get(code) ?? -1;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Which OTHER action OF THE SAME scheme already has `code` — or `null` if none.
|
|
63
|
+
*
|
|
64
|
+
* ⚠️ THE SIBLING `keyUsedByOther` NEEDS, AND ITS ABSENCE IS INVISIBLE IN A ONE-PLAYER GAME (#126). That function
|
|
65
|
+
* excludes the scheme being edited **by reference**; with a single player, `schemesFor()` returns exactly that
|
|
66
|
+
* scheme, so its guard scans an empty list and **can never fire**. A child who puts `W` on a new action would keep
|
|
67
|
+
* `W` on the old one too, and play the whole game with both firing together.
|
|
68
|
+
*
|
|
69
|
+
* ⚠️ AND THAT IS THE WORST SHAPE A DEFECT CAN TAKE, as the `input/default-bindings` header says: the two actions fire
|
|
70
|
+
* together, and the child sees an intermittent double action nobody can reproduce on purpose — on a screen they
|
|
71
|
+
* opened **because** they could not use the default controls.
|
|
72
|
+
*
|
|
73
|
+
* Returns the ACTION and not a boolean, because the announcement has to say which one — saying only that the key is
|
|
74
|
+
* in use sends the child looking for what the function already knows.
|
|
75
|
+
*/
|
|
76
|
+
export function actionAlreadyBound(code, mapRef, except) {
|
|
77
|
+
for (const a of ACTIONS) {
|
|
78
|
+
if (a === except)
|
|
79
|
+
continue;
|
|
80
|
+
if ((mapRef[a] || []).includes(code))
|
|
81
|
+
return a;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|