@the-inclusionist/engine 8.0.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -78
- package/app/css/style.css +584 -374
- package/app/public/vendor/fonts/bitter-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bitter-var.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cookie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ar_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_br_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ca_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_co_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_deco_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_j_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_s_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_mx_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pe_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pt_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-stix_two_math-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700.woff2 +0 -0
- package/app/public/vendor/fonts.css +1167 -51
- package/dist-pkg/boot/create-game.d.ts +467 -162
- package/dist-pkg/boot/create-game.js +3563 -426
- package/dist-pkg/core/a11y-sr.d.ts +25 -3
- package/dist-pkg/core/a11y-sr.js +40 -19
- package/dist-pkg/core/accessible-label.d.ts +17 -0
- package/dist-pkg/core/accessible-label.js +37 -0
- package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
- package/dist-pkg/core/accommodation-subjects.js +32 -0
- package/dist-pkg/core/accommodations.d.ts +107 -0
- package/dist-pkg/core/accommodations.js +178 -0
- package/dist-pkg/core/actions.d.ts +75 -51
- package/dist-pkg/core/actions.js +98 -69
- package/dist-pkg/core/calm-mode.d.ts +31 -0
- package/dist-pkg/core/calm-mode.js +47 -0
- package/dist-pkg/core/camera-cycle.d.ts +15 -0
- package/dist-pkg/core/camera-cycle.js +7 -0
- package/dist-pkg/core/caption-duration.d.ts +15 -0
- package/dist-pkg/core/caption-duration.js +19 -0
- package/dist-pkg/core/cartridge-problems.d.ts +34 -0
- package/dist-pkg/core/cartridge-problems.js +53 -0
- package/dist-pkg/core/constants.d.ts +0 -54
- package/dist-pkg/core/constants.js +9 -76
- package/dist-pkg/core/contract.d.ts +143 -163
- package/dist-pkg/core/contract.js +223 -207
- package/dist-pkg/core/dom-query.d.ts +4 -4
- package/dist-pkg/core/dom-query.js +12 -20
- package/dist-pkg/core/entity.d.ts +62 -77
- package/dist-pkg/core/entity.js +18 -32
- package/dist-pkg/core/escape-html.d.ts +9 -10
- package/dist-pkg/core/escape-html.js +16 -20
- package/dist-pkg/core/flash-threshold.d.ts +17 -0
- package/dist-pkg/core/flash-threshold.js +113 -0
- package/dist-pkg/core/game-speed.d.ts +11 -0
- package/dist-pkg/core/game-speed.js +16 -0
- package/dist-pkg/core/genres.d.ts +20 -0
- package/dist-pkg/core/genres.js +44 -0
- package/dist-pkg/core/i18n.d.ts +87 -41
- package/dist-pkg/core/i18n.js +206 -153
- package/dist-pkg/core/loop.d.ts +17 -6
- package/dist-pkg/core/loop.js +26 -26
- package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
- package/dist-pkg/core/pause-icon-catalogue.js +54 -0
- package/dist-pkg/core/ring.d.ts +17 -0
- package/dist-pkg/core/ring.js +29 -0
- package/dist-pkg/core/rng.d.ts +7 -12
- package/dist-pkg/core/rng.js +23 -53
- package/dist-pkg/core/route.d.ts +26 -26
- package/dist-pkg/core/route.js +126 -121
- package/dist-pkg/core/scenes.d.ts +37 -40
- package/dist-pkg/core/scenes.js +41 -43
- package/dist-pkg/core/screens.d.ts +4 -4
- package/dist-pkg/core/screens.js +11 -16
- package/dist-pkg/core/setting-defaults.d.ts +61 -0
- package/dist-pkg/core/setting-defaults.js +66 -0
- package/dist-pkg/core/speech-rate.d.ts +29 -0
- package/dist-pkg/core/speech-rate.js +47 -0
- package/dist-pkg/core/state.d.ts +118 -118
- package/dist-pkg/core/state.js +322 -297
- package/dist-pkg/core/visual-cycles.d.ts +30 -0
- package/dist-pkg/core/visual-cycles.js +52 -0
- package/dist-pkg/core/visual-state.d.ts +13 -0
- package/dist-pkg/core/visual-state.js +6 -0
- package/dist-pkg/educational/activities-registry.d.ts +1 -1
- package/dist-pkg/educational/activities-registry.js +9 -8
- package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
- package/dist-pkg/educational/adaptive-engine.js +17 -17
- package/dist-pkg/educational/segment-bar.d.ts +12 -12
- package/dist-pkg/educational/segment-bar.js +9 -9
- package/dist-pkg/i18n/en.js +321 -215
- package/dist-pkg/i18n/es.js +320 -215
- package/dist-pkg/i18n/pt.js +342 -215
- package/dist-pkg/input/default-bindings.d.ts +37 -38
- package/dist-pkg/input/default-bindings.js +127 -144
- package/dist-pkg/input/devices.d.ts +7 -7
- package/dist-pkg/input/devices.js +17 -16
- package/dist-pkg/input/edges.d.ts +23 -32
- package/dist-pkg/input/edges.js +23 -28
- package/dist-pkg/input/empathy-filter.d.ts +22 -0
- package/dist-pkg/input/empathy-filter.js +34 -0
- package/dist-pkg/input/face-map.d.ts +96 -0
- package/dist-pkg/input/face-map.js +255 -0
- package/dist-pkg/input/face-signals.d.ts +40 -0
- package/dist-pkg/input/face-signals.js +48 -0
- package/dist-pkg/input/gamepad.d.ts +164 -145
- package/dist-pkg/input/gamepad.js +351 -559
- package/dist-pkg/input/gaze-cycle.d.ts +64 -0
- package/dist-pkg/input/gaze-cycle.js +133 -0
- package/dist-pkg/input/gaze-relative.d.ts +68 -0
- package/dist-pkg/input/gaze-relative.js +142 -0
- package/dist-pkg/input/hand-map.d.ts +28 -0
- package/dist-pkg/input/hand-map.js +142 -0
- package/dist-pkg/input/input-cooldown.d.ts +17 -0
- package/dist-pkg/input/input-cooldown.js +39 -0
- package/dist-pkg/input/keyboard-runtime.d.ts +18 -20
- package/dist-pkg/input/keyboard-runtime.js +23 -27
- package/dist-pkg/input/keyboard.d.ts +68 -62
- package/dist-pkg/input/keyboard.js +83 -105
- package/dist-pkg/input/keydown.d.ts +124 -132
- package/dist-pkg/input/keydown.js +283 -288
- package/dist-pkg/input/latch-edge.d.ts +25 -21
- package/dist-pkg/input/latch-edge.js +33 -35
- package/dist-pkg/input/latch-scope.d.ts +43 -47
- package/dist-pkg/input/latch-scope.js +66 -75
- package/dist-pkg/input/latch-store.d.ts +28 -29
- package/dist-pkg/input/latch-store.js +44 -47
- package/dist-pkg/input/latch-sync.d.ts +28 -29
- package/dist-pkg/input/latch-sync.js +25 -25
- package/dist-pkg/input/latch.d.ts +14 -17
- package/dist-pkg/input/latch.js +29 -37
- package/dist-pkg/input/pad-defaults.d.ts +13 -16
- package/dist-pkg/input/pad-defaults.js +21 -28
- package/dist-pkg/input/pad-reading.d.ts +76 -0
- package/dist-pkg/input/pad-reading.js +164 -0
- package/dist-pkg/input/pad-wizard.d.ts +96 -0
- package/dist-pkg/input/pad-wizard.js +205 -0
- package/dist-pkg/input/pointer-space.d.ts +19 -20
- package/dist-pkg/input/pointer-space.js +27 -32
- package/dist-pkg/input/pointer.d.ts +39 -40
- package/dist-pkg/input/pointer.js +42 -45
- package/dist-pkg/input/state.d.ts +101 -89
- package/dist-pkg/input/state.js +54 -134
- package/dist-pkg/input/switch-scan.d.ts +42 -0
- package/dist-pkg/input/switch-scan.js +54 -0
- package/dist-pkg/input/synthetic-source.d.ts +42 -0
- package/dist-pkg/input/synthetic-source.js +57 -0
- package/dist-pkg/input/touch-bindings.d.ts +127 -113
- package/dist-pkg/input/touch-bindings.js +158 -173
- package/dist-pkg/input/touch.d.ts +130 -70
- package/dist-pkg/input/touch.js +321 -123
- package/dist-pkg/input/transport-in-use.d.ts +107 -0
- package/dist-pkg/input/transport-in-use.js +130 -0
- package/dist-pkg/input/transports.d.ts +96 -114
- package/dist-pkg/input/transports.js +104 -106
- package/dist-pkg/input/virtual-controller.d.ts +46 -0
- package/dist-pkg/input/virtual-controller.js +41 -0
- package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
- package/dist-pkg/input/vocabulary-migration.js +80 -79
- package/dist-pkg/input/voice-map.d.ts +43 -0
- package/dist-pkg/input/voice-map.js +125 -0
- package/dist-pkg/platform/audio-ambient.d.ts +13 -1
- package/dist-pkg/platform/audio-ambient.js +11 -13
- package/dist-pkg/platform/audio-earcons.d.ts +20 -19
- package/dist-pkg/platform/audio-earcons.js +51 -42
- package/dist-pkg/platform/audio-jingles.js +9 -10
- package/dist-pkg/platform/audio-mixer.d.ts +14 -2
- package/dist-pkg/platform/audio-mixer.js +36 -39
- package/dist-pkg/platform/audio-sonar.d.ts +96 -113
- package/dist-pkg/platform/audio-sonar.js +245 -238
- package/dist-pkg/platform/audio.d.ts +53 -19
- package/dist-pkg/platform/audio.js +161 -169
- package/dist-pkg/platform/flash-sampler.d.ts +19 -0
- package/dist-pkg/platform/flash-sampler.js +79 -0
- package/dist-pkg/platform/guide-intensity.d.ts +26 -27
- package/dist-pkg/platform/guide-intensity.js +50 -52
- package/dist-pkg/platform/heavy-catalogue.d.ts +31 -0
- package/dist-pkg/platform/heavy-catalogue.js +223 -0
- package/dist-pkg/platform/heavy-mirror.d.ts +26 -0
- package/dist-pkg/platform/heavy-mirror.js +76 -0
- package/dist-pkg/platform/heavy.d.ts +104 -0
- package/dist-pkg/platform/heavy.js +169 -0
- package/dist-pkg/platform/interruptible-speech.d.ts +16 -16
- package/dist-pkg/platform/interruptible-speech.js +50 -51
- package/dist-pkg/platform/kokoro-port.d.ts +27 -0
- package/dist-pkg/platform/kokoro-port.js +50 -0
- package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
- package/dist-pkg/platform/kokoro-runtime.js +52 -0
- package/dist-pkg/platform/kokoro.d.ts +70 -0
- package/dist-pkg/platform/kokoro.js +133 -0
- package/dist-pkg/platform/listener-scope.d.ts +12 -0
- package/dist-pkg/platform/listener-scope.js +81 -0
- package/dist-pkg/platform/locale-host.d.ts +10 -0
- package/dist-pkg/platform/locale-host.js +34 -0
- package/dist-pkg/platform/microphone.d.ts +51 -0
- package/dist-pkg/platform/microphone.js +118 -0
- package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
- package/dist-pkg/platform/onnx-runtime.js +42 -0
- package/dist-pkg/platform/reading-in-worker.d.ts +40 -0
- package/dist-pkg/platform/reading-in-worker.js +87 -0
- package/dist-pkg/platform/reading-model.d.ts +73 -0
- package/dist-pkg/platform/reading-model.js +247 -0
- package/dist-pkg/platform/reading-runtime.d.ts +24 -0
- package/dist-pkg/platform/reading-runtime.js +159 -0
- package/dist-pkg/platform/reading-worker.d.ts +41 -0
- package/dist-pkg/platform/reading-worker.js +58 -0
- package/dist-pkg/platform/reading.d.ts +69 -0
- package/dist-pkg/platform/reading.js +128 -0
- package/dist-pkg/platform/speech-recognition.d.ts +51 -0
- package/dist-pkg/platform/speech-recognition.js +84 -0
- package/dist-pkg/platform/speech.d.ts +14 -1
- package/dist-pkg/platform/speech.js +13 -13
- package/dist-pkg/platform/storage-keys.d.ts +96 -0
- package/dist-pkg/platform/storage-keys.js +106 -0
- package/dist-pkg/platform/storage.d.ts +46 -111
- package/dist-pkg/platform/storage.js +104 -169
- package/dist-pkg/platform/tts.d.ts +51 -38
- package/dist-pkg/platform/tts.js +217 -119
- package/dist-pkg/platform/vision-loop.d.ts +23 -0
- package/dist-pkg/platform/vision-loop.js +56 -0
- package/dist-pkg/platform/vision.d.ts +132 -0
- package/dist-pkg/platform/vision.js +117 -0
- package/dist-pkg/platform/voice-listener.d.ts +36 -0
- package/dist-pkg/platform/voice-listener.js +88 -0
- package/dist-pkg/platform/voice-plan.d.ts +6 -102
- package/dist-pkg/platform/voice-plan.js +9 -151
- package/dist-pkg/platform/vosk-runtime.d.ts +71 -0
- package/dist-pkg/platform/vosk-runtime.js +93 -0
- package/dist-pkg/render/canvas.d.ts +13 -7
- package/dist-pkg/render/canvas.js +13 -13
- package/dist-pkg/render/crt.d.ts +46 -12
- package/dist-pkg/render/crt.js +82 -80
- package/dist-pkg/render/cvd-matrices.d.ts +18 -18
- package/dist-pkg/render/cvd-matrices.js +33 -38
- package/dist-pkg/render/hc-role-data.d.ts +7 -7
- package/dist-pkg/render/hc-role-data.js +14 -14
- package/dist-pkg/render/high-contrast.d.ts +66 -54
- package/dist-pkg/render/high-contrast.js +221 -216
- package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
- package/dist-pkg/render/low-vision-drawing.js +46 -0
- package/dist-pkg/render/lq-filter.d.ts +32 -20
- package/dist-pkg/render/lq-filter.js +59 -65
- package/dist-pkg/render/port.d.ts +86 -88
- package/dist-pkg/render/port.js +17 -23
- package/dist-pkg/render/screen-pipeline.d.ts +42 -42
- package/dist-pkg/render/screen-pipeline.js +80 -87
- package/dist-pkg/render/sprite-fx.d.ts +2 -1
- package/dist-pkg/render/sprite-fx.js +16 -14
- package/dist-pkg/render/viewports.d.ts +20 -15
- package/dist-pkg/render/viewports.js +83 -114
- package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
- package/dist-pkg/render/viz-axes-labels.js +88 -0
- package/dist-pkg/render/viz-axes.d.ts +80 -86
- package/dist-pkg/render/viz-axes.js +115 -116
- package/dist-pkg/render/viz-modes.d.ts +28 -29
- package/dist-pkg/render/viz-modes.js +40 -45
- package/dist-pkg/render/viz-refusal.d.ts +32 -0
- package/dist-pkg/render/viz-refusal.js +57 -0
- package/dist-pkg/render/viz-setters.d.ts +104 -66
- package/dist-pkg/render/viz-setters.js +182 -191
- package/dist-pkg/ui/aac-sets.d.ts +40 -0
- package/dist-pkg/ui/aac-sets.js +49 -0
- package/dist-pkg/ui/audio-choices.d.ts +63 -0
- package/dist-pkg/ui/audio-choices.js +94 -0
- package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
- package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
- package/dist-pkg/ui/camera-control.d.ts +6 -0
- package/dist-pkg/ui/camera-control.js +14 -0
- package/dist-pkg/ui/changed-mark.d.ts +9 -8
- package/dist-pkg/ui/changed-mark.js +22 -53
- package/dist-pkg/ui/control-choices.d.ts +37 -0
- package/dist-pkg/ui/control-choices.js +84 -0
- package/dist-pkg/ui/debug-panel.d.ts +59 -43
- package/dist-pkg/ui/debug-panel.js +68 -69
- package/dist-pkg/ui/dom.d.ts +10 -14
- package/dist-pkg/ui/dom.js +10 -47
- package/dist-pkg/ui/drawing-problems.d.ts +25 -0
- package/dist-pkg/ui/drawing-problems.js +93 -0
- package/dist-pkg/ui/eye-control.d.ts +36 -0
- package/dist-pkg/ui/eye-control.js +178 -0
- package/dist-pkg/ui/face-control.d.ts +25 -0
- package/dist-pkg/ui/face-control.js +183 -0
- package/dist-pkg/ui/focus-trap.d.ts +39 -49
- package/dist-pkg/ui/focus-trap.js +56 -65
- package/dist-pkg/ui/fonts.d.ts +118 -63
- package/dist-pkg/ui/fonts.js +267 -111
- package/dist-pkg/ui/game-options.d.ts +42 -0
- package/dist-pkg/ui/game-options.js +138 -0
- package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
- package/dist-pkg/ui/gaze-overlay.js +165 -0
- package/dist-pkg/ui/hand-control.d.ts +25 -0
- package/dist-pkg/ui/hand-control.js +143 -0
- package/dist-pkg/ui/help-panel.d.ts +76 -0
- package/dist-pkg/ui/help-panel.js +232 -0
- package/dist-pkg/ui/hud-bands.d.ts +45 -0
- package/dist-pkg/ui/hud-bands.js +108 -0
- package/dist-pkg/ui/hud.d.ts +73 -70
- package/dist-pkg/ui/hud.js +94 -98
- package/dist-pkg/ui/item-announcement.d.ts +13 -12
- package/dist-pkg/ui/item-announcement.js +25 -26
- package/dist-pkg/ui/latch-refusal.d.ts +22 -21
- package/dist-pkg/ui/latch-refusal.js +37 -37
- package/dist-pkg/ui/layout.d.ts +103 -28
- package/dist-pkg/ui/layout.js +114 -99
- package/dist-pkg/ui/locale-flags.d.ts +16 -0
- package/dist-pkg/ui/locale-flags.js +30 -0
- package/dist-pkg/ui/loop-crash.d.ts +17 -17
- package/dist-pkg/ui/loop-crash.js +33 -62
- package/dist-pkg/ui/menu-intent.d.ts +32 -0
- package/dist-pkg/ui/menu-intent.js +54 -0
- package/dist-pkg/ui/menu-items.d.ts +10 -0
- package/dist-pkg/ui/menu-items.js +22 -0
- package/dist-pkg/ui/menu-nav.d.ts +60 -90
- package/dist-pkg/ui/menu-nav.js +301 -274
- package/dist-pkg/ui/mobility-choices.d.ts +26 -0
- package/dist-pkg/ui/mobility-choices.js +41 -0
- package/dist-pkg/ui/motion-choices.d.ts +31 -0
- package/dist-pkg/ui/motion-choices.js +68 -0
- package/dist-pkg/ui/motion-scene.d.ts +24 -19
- package/dist-pkg/ui/motion-scene.js +29 -61
- package/dist-pkg/ui/mount-panel.d.ts +81 -0
- package/dist-pkg/ui/mount-panel.js +61 -0
- package/dist-pkg/ui/panel-shell.d.ts +65 -31
- package/dist-pkg/ui/panel-shell.js +92 -66
- package/dist-pkg/ui/panel-widgets.d.ts +116 -0
- package/dist-pkg/ui/panel-widgets.js +208 -0
- package/dist-pkg/ui/pause-buttons.d.ts +35 -0
- package/dist-pkg/ui/pause-buttons.js +66 -0
- package/dist-pkg/ui/pause-icons.d.ts +250 -343
- package/dist-pkg/ui/pause-icons.js +614 -605
- package/dist-pkg/ui/pause-markup.d.ts +86 -0
- package/dist-pkg/ui/pause-markup.js +125 -0
- package/dist-pkg/ui/reach-notice.d.ts +22 -23
- package/dist-pkg/ui/reach-notice.js +55 -58
- package/dist-pkg/ui/scan-overlay.d.ts +23 -0
- package/dist-pkg/ui/scan-overlay.js +42 -0
- package/dist-pkg/ui/settings-aac.d.ts +68 -0
- package/dist-pkg/ui/settings-aac.js +189 -0
- package/dist-pkg/ui/settings-audio.d.ts +91 -113
- package/dist-pkg/ui/settings-audio.js +407 -405
- package/dist-pkg/ui/settings-controls.d.ts +53 -92
- package/dist-pkg/ui/settings-controls.js +143 -215
- package/dist-pkg/ui/settings-empathy.d.ts +39 -30
- package/dist-pkg/ui/settings-empathy.js +53 -60
- package/dist-pkg/ui/settings-mobility.d.ts +195 -0
- package/dist-pkg/ui/settings-mobility.js +374 -0
- package/dist-pkg/ui/settings-motion.d.ts +91 -70
- package/dist-pkg/ui/settings-motion.js +287 -198
- package/dist-pkg/ui/settings-panel.d.ts +48 -45
- package/dist-pkg/ui/settings-panel.js +164 -93
- package/dist-pkg/ui/settings-typo.d.ts +28 -76
- package/dist-pkg/ui/settings-typo.js +145 -125
- package/dist-pkg/ui/settings-visual.d.ts +29 -87
- package/dist-pkg/ui/settings-visual.js +240 -193
- package/dist-pkg/ui/shell.d.ts +113 -134
- package/dist-pkg/ui/shell.js +143 -216
- package/dist-pkg/ui/simulation-list.d.ts +27 -0
- package/dist-pkg/ui/simulation-list.js +76 -0
- package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
- package/dist-pkg/ui/simulation-over-the-world.js +131 -0
- package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
- package/dist-pkg/ui/simulation-refusal.js +8 -56
- package/dist-pkg/ui/switchable-control.d.ts +11 -0
- package/dist-pkg/ui/switchable-control.js +19 -0
- package/dist-pkg/ui/title.d.ts +4 -4
- package/dist-pkg/ui/title.js +11 -13
- package/dist-pkg/ui/top-band.d.ts +24 -0
- package/dist-pkg/ui/top-band.js +100 -0
- package/dist-pkg/ui/typo-choices.d.ts +71 -0
- package/dist-pkg/ui/typo-choices.js +84 -0
- package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
- package/dist-pkg/ui/visual-axes-panel.js +12 -94
- package/dist-pkg/ui/visual-choices.d.ts +77 -0
- package/dist-pkg/ui/visual-choices.js +107 -0
- package/dist-pkg/ui/vlibras.d.ts +33 -10
- package/dist-pkg/ui/vlibras.js +58 -81
- package/dist-pkg/ui/voice-control.d.ts +46 -0
- package/dist-pkg/ui/voice-control.js +143 -0
- package/dist-pkg/ui/voice-settings.d.ts +96 -0
- package/dist-pkg/ui/voice-settings.js +302 -0
- package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
- package/dist-pkg/ui/where-the-child-is.js +70 -0
- package/docs/CREDITS.md +198 -54
- package/docs/LICENSES.md +160 -145
- package/package.json +24 -25
- package/scripts/heavy-into-the-delivery.mjs +144 -0
- package/scripts/licences/Apache-2.0.txt +176 -0
- package/scripts/licences/GPL-3.0.txt +674 -0
- package/scripts/licences/MIT.txt +17 -0
- package/scripts/licences/third-party.mjs +287 -0
- package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
- package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
- package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
- package/dist-pkg/core/anel.d.ts +0 -17
- package/dist-pkg/core/anel.js +0 -31
- package/dist-pkg/core/collision.d.ts +0 -21
- package/dist-pkg/core/collision.js +0 -62
- package/dist-pkg/core/layers.d.ts +0 -63
- package/dist-pkg/core/layers.js +0 -95
- package/dist-pkg/core/letter-grid.d.ts +0 -55
- package/dist-pkg/core/letter-grid.js +0 -116
- package/dist-pkg/core/password.d.ts +0 -34
- package/dist-pkg/core/password.js +0 -205
- package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
- package/dist-pkg/core/rotulo-acessivel.js +0 -41
- package/dist-pkg/core/run-state.d.ts +0 -115
- package/dist-pkg/core/run-state.js +0 -40
- package/dist-pkg/core/tiles.d.ts +0 -12
- package/dist-pkg/core/tiles.js +0 -61
- package/dist-pkg/core/world.d.ts +0 -4
- package/dist-pkg/core/world.js +0 -58
- package/dist-pkg/input/origem-sintetica.d.ts +0 -44
- package/dist-pkg/input/origem-sintetica.js +0 -60
- package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
- package/dist-pkg/input/transporte-em-uso.js +0 -130
- package/dist-pkg/platform/audio-nav.d.ts +0 -51
- package/dist-pkg/platform/audio-nav.js +0 -99
- package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
- package/dist-pkg/platform/pesados-catalogo.js +0 -177
- package/dist-pkg/platform/pesados.d.ts +0 -31
- package/dist-pkg/platform/pesados.js +0 -75
- package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
- package/dist-pkg/platform/vozes-prontas.js +0 -61
- package/dist-pkg/render/camera.d.ts +0 -58
- package/dist-pkg/render/camera.js +0 -105
- package/dist-pkg/render/cenario-data.d.ts +0 -127
- package/dist-pkg/render/cenario-data.js +0 -145
- package/dist-pkg/render/city-tex.d.ts +0 -63
- package/dist-pkg/render/city-tex.js +0 -228
- package/dist-pkg/render/city-tiles.d.ts +0 -11
- package/dist-pkg/render/city-tiles.js +0 -140
- package/dist-pkg/render/draw.d.ts +0 -149
- package/dist-pkg/render/draw.js +0 -231
- package/dist-pkg/render/fx.d.ts +0 -63
- package/dist-pkg/render/fx.js +0 -123
- package/dist-pkg/render/minimap.d.ts +0 -11
- package/dist-pkg/render/minimap.js +0 -94
- package/dist-pkg/render/parallax.d.ts +0 -85
- package/dist-pkg/render/parallax.js +0 -158
- package/dist-pkg/render/player-anim.d.ts +0 -71
- package/dist-pkg/render/player-anim.js +0 -152
- package/dist-pkg/render/recycling-tex.d.ts +0 -48
- package/dist-pkg/render/recycling-tex.js +0 -164
- package/dist-pkg/render/scene-city.d.ts +0 -77
- package/dist-pkg/render/scene-city.js +0 -181
- package/dist-pkg/render/scene-parallax.d.ts +0 -72
- package/dist-pkg/render/scene-parallax.js +0 -426
- package/dist-pkg/render/scene-sky.d.ts +0 -126
- package/dist-pkg/render/scene-sky.js +0 -295
- package/dist-pkg/render/set-cenario.d.ts +0 -54
- package/dist-pkg/render/set-cenario.js +0 -103
- package/dist-pkg/render/textures.d.ts +0 -75
- package/dist-pkg/render/textures.js +0 -240
- package/dist-pkg/render/title-scene.d.ts +0 -46
- package/dist-pkg/render/title-scene.js +0 -75
- package/dist-pkg/render/weather.d.ts +0 -96
- package/dist-pkg/render/weather.js +0 -171
- package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
- package/dist-pkg/render/wheelchair-sprites.js +0 -69
- package/dist-pkg/render/world-tex.d.ts +0 -18
- package/dist-pkg/render/world-tex.js +0 -87
- package/dist-pkg/ui/activities-menu.d.ts +0 -258
- package/dist-pkg/ui/activities-menu.js +0 -648
- package/dist-pkg/ui/caa-sets.d.ts +0 -39
- package/dist-pkg/ui/caa-sets.js +0 -65
- package/dist-pkg/ui/map-hub.d.ts +0 -56
- package/dist-pkg/ui/map-hub.js +0 -138
- package/dist-pkg/ui/settings-caa.d.ts +0 -45
- package/dist-pkg/ui/settings-caa.js +0 -137
- package/dist-pkg/ui/settings-motor.d.ts +0 -175
- package/dist-pkg/ui/settings-motor.js +0 -342
- package/dist-pkg/ui/webcam.d.ts +0 -7
- package/dist-pkg/ui/webcam.js +0 -93
|
@@ -1,131 +1,126 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/audio-sonar —
|
|
2
|
+
// platform/audio-sonar — NAVIGATION BY SOUND, the part of audio navigation that serves ANY genre (item 19).
|
|
3
3
|
//
|
|
4
|
-
// =========================
|
|
5
|
-
//
|
|
4
|
+
// ========================= A FINDING, TURNED INTO A CUT =========================
|
|
5
|
+
// A second consumer recorded it and did not work around it: the sonar could not be used by anything but a platformer.
|
|
6
|
+
// Its context asked for tiles, a solid test, a hitbox, the tile size, a coin array and a scenery — a quiz would have had
|
|
7
|
+
// to invent fake tiles, a fake hitbox and a fake scenery to ask "point at the nearest option". The module was TWO
|
|
8
|
+
// modules under one name.
|
|
6
9
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// a alternativa mais próxima'. E o módulo é DOIS módulos com um nome só."
|
|
10
|
+
// This is one of them: what navigates by SOUND — pointing at the nearest target, the looping beacon, the pan by relative
|
|
11
|
+
// position and the question "does this child need audio cues?". The CANE and BLIND SWIMMING, which read tiles, floor and
|
|
12
|
+
// hitbox, are the platformer's and live in its repository (ADR-0228, note CC), and the audio guide is its decision.
|
|
11
13
|
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
14
|
+
// ========================= WHAT REPLACED THE PLATFORMER THINGS =========================
|
|
15
|
+
// None of them crossed over. The sonar used to ask the game for an array of coins and filter by taken/owner; now it
|
|
16
|
+
// receives the CONTRACT (ADR-0030):
|
|
15
17
|
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
18
|
+
// · the coins + the filter → `targetsOf(i)`, the "target" half of field 5. The game hands over the spots that still
|
|
19
|
+
// count for that player, and never says what they are.
|
|
20
|
+
// · the tile size (the ruler of "near") → `topology()` + `distance()`, the metric declared in field 1. In a
|
|
21
|
+
// platformer it is pixels over `unit`; on a grid, king's steps; in a quiz, a difference of index.
|
|
22
|
+
// · the target's name → `nameAt(spot)`, field 3. It is what lets the announcement say "coin", "question" or "box"
|
|
23
|
+
// without the engine knowing any of the three.
|
|
19
24
|
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
25
|
+
// ⚠️ AND ONE WAS LEFT, THE LAST AND THE WORST: the pan measured the stereo width as `LOGICAL_W * 0.55` — the SCREEN's
|
|
26
|
+
// width. The `wx` it divides comes from the TOPOLOGY, and dividing a world measure by a screen's width only works when
|
|
27
|
+
// both use the same ruler. Measured building a football game (#121): on a 90-METRE pitch, a team-mate ten metres to the
|
|
28
|
+
// right gives `10 / 176 = 0.057` — mono, in practice. The sonar would be **right and inaudible**. For the platformer it
|
|
29
|
+
// was true by chance (its world is measured in pixels) and for `grid`/`hotspots` it was vacuous, which is why it was
|
|
30
|
+
// never seen.
|
|
26
31
|
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
// estava certa sobre a origem e errada sobre a consequência: o `wx` que ela divide vem da TOPOLOGIA, e
|
|
30
|
-
// dividir uma medida de mundo pela largura de um ecrã só funciona quando as duas usam a mesma régua.
|
|
32
|
+
// The stereo width comes from the declared metric: `PAN_PACES * step`, where the step is the continuous space's `unit`,
|
|
33
|
+
// one cell on a grid, and nothing in a list — which has no space.
|
|
31
34
|
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
// medido em pixels) e para `grid`/`hotspots` era vácuo, e é por isso que nunca se viu.
|
|
36
|
-
//
|
|
37
|
-
// A largura do estéreo passa a vir da métrica declarada: `PAN_PACES * passo`, onde o passo é o `unit` do
|
|
38
|
-
// contínuo, uma célula na grade, e nada na lista — que não tem espaço.
|
|
39
|
-
//
|
|
40
|
-
// ========================= SEM I/O NO IMPORT =========================
|
|
41
|
-
// Nada aqui toca `window` fora de `playerCtx`, que é chamada e não importada. Roda no project `node`.
|
|
35
|
+
// ========================= NO I/O AT IMPORT =========================
|
|
36
|
+
// Nothing here touches `window`: a player's own context comes from the injected `newContext` (ADR-0232 D4). It runs in the
|
|
37
|
+
// `node` project.
|
|
42
38
|
import { distance, bearing } from '../core/contract.js';
|
|
43
|
-
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
import {
|
|
48
|
-
import { intensidadeDoGuia, CORTE_LONGE, PASSOS_ATE_O_FUNDO } from './guide-intensity.js';
|
|
39
|
+
// THE GUIDE (#84 item 2) is made of these two and nothing else: the ROUTE says how many steps remain going round walls,
|
|
40
|
+
// and the INTENSITY turns that number into brightness and volume. Neither touches Web Audio; the wiring — the only part
|
|
41
|
+
// that does — is `updateGuide` below, which is why the design can be checked in `node`.
|
|
42
|
+
import { routeTo } from '../core/route.js';
|
|
43
|
+
import { guideIntensity, FAR_CUT, STEPS_TO_FLOOR } from './guide-intensity.js';
|
|
49
44
|
/**
|
|
50
|
-
*
|
|
45
|
+
* How many STEPS of the declared metric saturate the stereo. Beyond this, "to the right" is just to the right.
|
|
51
46
|
*
|
|
52
|
-
* ⚠️
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
47
|
+
* ⚠️ ELEVEN IS NOT A NEW NUMBER — it is what the platformer always had, reread on the right ruler. The old denominator was
|
|
48
|
+
* `LOGICAL_W * 0.55 = 320 × 0.55 = 176` pixels, and the platformer declares `unit: TILE` = 16: **exactly 11 tiles**.
|
|
49
|
+
* Rewriting it in steps keeps what that child already hears, and says the same in any genre — 11 squares on a board,
|
|
50
|
+
* 11 metres on a pitch.
|
|
56
51
|
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* precisar de mais precisão.
|
|
52
|
+
* And it fits the ruler the rest of the module uses: `distanceKey` cuts "very near" at 4 steps and "near" at 9. The
|
|
53
|
+
* stereo saturates just after the thing becomes "far", which is where direction stops needing more precision.
|
|
60
54
|
*/
|
|
61
55
|
export const PAN_PACES = 11;
|
|
62
56
|
/**
|
|
63
|
-
*
|
|
57
|
+
* What ONE step is worth, in world units. Zero = this space has no sides.
|
|
64
58
|
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
59
|
+
* Continuous: the declared `unit`. Grid: one cell, by definition. List: nothing — `hotspots` is an order, not a geometry,
|
|
60
|
+
* and inventing a stereo width for it would point at a side that does not exist.
|
|
67
61
|
*/
|
|
68
|
-
export function
|
|
69
|
-
return
|
|
62
|
+
export function worldStep(shape) {
|
|
63
|
+
return shape.kind === 'continuous' ? shape.unit : shape.kind === 'grid' ? 1 : 0;
|
|
70
64
|
}
|
|
71
65
|
/**
|
|
72
|
-
* ⚠️
|
|
66
|
+
* ⚠️ THE TIMBRE MUST HAVE HARMONICS, and it is a technical requirement, not taste.
|
|
73
67
|
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
68
|
+
* The axis of #84 item 2 is BRIGHTNESS, and brightness is a low-pass opening and closing. **A low-pass over a `sine` wave
|
|
69
|
+
* does absolutely nothing**: a sine has nothing above its fundamental for the filter to cut, and the guide would be left
|
|
70
|
+
* with a dead axis and only the volume working. The sawtooth is the richest of Web Audio's four waves — it has ALL the
|
|
71
|
+
* harmonics — which is why it is the choice.
|
|
78
72
|
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
73
|
+
* And it solves, for free, the plan's other constraint: the sonar and the cane use `sine`. A different timbre was
|
|
74
|
+
* required so they would not collide on one channel; here the different timbre IS the mechanism.
|
|
81
75
|
*/
|
|
82
|
-
export const
|
|
76
|
+
export const GUIDE_WAVE = 'sawtooth';
|
|
83
77
|
/**
|
|
84
|
-
*
|
|
78
|
+
* The guide's fundamental, fixed.
|
|
85
79
|
*
|
|
86
|
-
* ⚠️
|
|
87
|
-
*
|
|
88
|
-
*
|
|
80
|
+
* ⚠️ FIXED ON PURPOSE: PITCH is already the sonar's language (`380 + 740 * near`, nearer = higher). If the guide also
|
|
81
|
+
* rose in pitch, both would say the same thing through the same means, and whoever hears both at once could not tell them
|
|
82
|
+
* apart. The guide says distance by brightness; the sonar, by pitch.
|
|
89
83
|
*/
|
|
90
|
-
|
|
84
|
+
const GUIDE_HZ = 220;
|
|
91
85
|
/**
|
|
92
|
-
*
|
|
86
|
+
* How many frames between two route computations.
|
|
93
87
|
*
|
|
94
|
-
* ⚠️
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
88
|
+
* ⚠️ THE ROUTE IS A BREADTH-FIRST SEARCH, and `__incl.update(dt)` counts FRAMES: running a BFS every frame on a platform
|
|
89
|
+
* map spends the whole frame budget on the target device (Positivo/Chromebook, pillar 1). Twelve frames are ~0.2 s at
|
|
90
|
+
* 60 fps — faster than a child takes a step, and the sound does not wait for them: the intensity is rewritten EVERY
|
|
91
|
+
* frame, with the steps the last route left.
|
|
98
92
|
*/
|
|
99
|
-
export const
|
|
93
|
+
export const FRAMES_BETWEEN_ROUTES = 12;
|
|
100
94
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
95
|
+
* The ceiling of spots for the guide's route. Well below `core/route`'s 4096, and that module says why: a cue every
|
|
96
|
+
* frame tolerates far less than a calculation when a level loads. Hitting it returns `null`, which is "I cannot say" —
|
|
97
|
+
* and the guide falls back to the straight line, which still sounds.
|
|
104
98
|
*/
|
|
105
|
-
|
|
99
|
+
const ROUTE_BUDGET = 1024;
|
|
106
100
|
/**
|
|
107
|
-
*
|
|
101
|
+
* The guide's base gain, before the intensity and the master volume multiply it.
|
|
108
102
|
*
|
|
109
|
-
* ⚠️
|
|
110
|
-
*
|
|
111
|
-
*
|
|
103
|
+
* ⚠️ LOWER THAN THE BEEP IT REPLACES (0.11), and not by mistake: a sound that **never stops** is perceived as louder
|
|
104
|
+
* than a transient of the same peak, and it tires by persistence rather than intensity — exactly what autism-support
|
|
105
|
+
* mode exists not to do.
|
|
112
106
|
*/
|
|
113
|
-
export const
|
|
114
|
-
/**
|
|
115
|
-
*
|
|
116
|
-
|
|
107
|
+
export const GUIDE_VOL = 0.06;
|
|
108
|
+
/** The `setTargetAtTime` time constant. Short enough to follow a step, long enough that a change is a glide and not a
|
|
109
|
+
* stair — a stair on every route would be a beep again. */
|
|
110
|
+
const GUIDE_TAU = 0.08;
|
|
117
111
|
export function createAudioSonar(ctx) {
|
|
112
|
+
const { t } = ctx;
|
|
118
113
|
let _sonarCount = 0, _guideCount = 0;
|
|
119
|
-
/**
|
|
114
|
+
/** The player's AudioContext (for `setSinkId` on their device), or null → the global context. */
|
|
120
115
|
function playerCtx(pl) {
|
|
121
116
|
if (!pl || !pl.audioSink)
|
|
122
117
|
return null;
|
|
123
118
|
try {
|
|
124
119
|
if (!pl._ac) {
|
|
125
|
-
const
|
|
126
|
-
if (!
|
|
120
|
+
const ac = ctx.newContext();
|
|
121
|
+
if (!ac)
|
|
127
122
|
return null;
|
|
128
|
-
pl._ac =
|
|
123
|
+
pl._ac = ac;
|
|
129
124
|
pl._acOut = pl._ac.createGain();
|
|
130
125
|
pl._acOut.connect(pl._ac.destination);
|
|
131
126
|
if (pl._ac.setSinkId)
|
|
@@ -140,242 +135,254 @@ export function createAudioSonar(ctx) {
|
|
|
140
135
|
}
|
|
141
136
|
}
|
|
142
137
|
function panFor(wx, pl) {
|
|
143
|
-
const
|
|
144
|
-
// `hotspots`
|
|
145
|
-
//
|
|
146
|
-
if (!(
|
|
138
|
+
const pace = worldStep(ctx.topology());
|
|
139
|
+
// `hotspots` has no space, so no side. `bearing` already answers `none` for the same reason, and centring is the only
|
|
140
|
+
// honest answer — a pan computed over list indices points at nothing.
|
|
141
|
+
if (!(pace > 0))
|
|
147
142
|
return 0;
|
|
148
|
-
return Math.max(-1, Math.min(1, (wx - pl.x) / (PAN_PACES *
|
|
143
|
+
return Math.max(-1, Math.min(1, (wx - pl.x) / (PAN_PACES * pace)));
|
|
149
144
|
}
|
|
150
145
|
/**
|
|
151
|
-
*
|
|
146
|
+
* Impaired sight? The edge guard and the guide exist only when the answer is yes (or in blind mode).
|
|
152
147
|
*
|
|
153
|
-
* ⚠️
|
|
154
|
-
*
|
|
155
|
-
* render
|
|
156
|
-
* `render/viz-axes` (uma aresta ao contrário: medido, `render/` importa de `platform/` em cinco pontos e o
|
|
157
|
-
* inverso em nenhum), ou deixava de saber o que é um modo visual.
|
|
148
|
+
* ⚠️ THE VISUAL HALF IS INJECTED (#104), and the module got SMALLER instead of migrating. It used to consult a table of
|
|
149
|
+
* RENDER modes, walked with a render key, from inside `platform/`. The choice was: import `render/` (an edge the wrong
|
|
150
|
+
* way — `render/` imports `platform/`, never the reverse), or stop knowing what a visual mode is.
|
|
158
151
|
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
* de composição responde, porque é ela que conhece os dois eixos.
|
|
152
|
+
* The second is right, and it is the move of `isNavigable`: inject the BOOLEAN, not the state. What this module needs to
|
|
153
|
+
* know is "does this child need audio cues", and that is not a question about filter tables — the composition root
|
|
154
|
+
* answers it, because it knows the two axes.
|
|
163
155
|
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
156
|
+
* What STAYS here is the rule that really is this module's: **blind mode turns the cues on for everyone**, whatever
|
|
157
|
+
* sight says.
|
|
166
158
|
*/
|
|
167
159
|
function needsAudioCues(pl) {
|
|
168
|
-
return ctx.
|
|
160
|
+
return ctx.getBlindMode() || ctx.visionImpaired(pl);
|
|
169
161
|
}
|
|
170
162
|
/**
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* Era um laço sobre `getCoins()` com `if (cn.taken || cn.owner !== pl.i) continue` e `Math.hypot`. As três
|
|
174
|
-
* coisas que ele sabia sobre o jogo (que alvos são moedas, que moedas têm dono, que distância é euclidiana
|
|
175
|
-
* em pixels) viraram uma pergunta ao contrato e uma chamada a `distance`.
|
|
176
|
-
*/
|
|
177
|
-
/**
|
|
178
|
-
* O RUMO EM PALAVRAS, na língua de quem joga e no referencial que o JOGO declarou.
|
|
163
|
+
* THE BEARING IN WORDS, in the player's language and in the frame the GAME declared.
|
|
179
164
|
*
|
|
180
|
-
* ⚠️
|
|
181
|
-
*
|
|
165
|
+
* ⚠️ WHAT THIS REPLACED WAS AN ACCESSIBILITY DEFECT, not a style detail. The sonar computed the side by hand, from a raw
|
|
166
|
+
* `x`, with a ±4 dead zone:
|
|
182
167
|
*
|
|
183
|
-
*
|
|
168
|
+
* target.at.x < pl.x - 4 ? 'left' : target.at.x > pl.x + 4 ? 'right' : 'ahead'
|
|
184
169
|
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
* a quem não vê a tela — apagada por uma zona morta.
|
|
170
|
+
* Three words where the contract has eight — and MIXING FRAMES: left/right is relative to the SCREEN, ahead is relative
|
|
171
|
+
* to the BODY, and a listener cannot know which origin each one speaks from. Worse: everything above or below the child
|
|
172
|
+
* became "ahead", exactly the information most missing for someone who cannot see the screen — erased by a dead zone.
|
|
189
173
|
*
|
|
190
|
-
* ⚠️
|
|
191
|
-
*
|
|
174
|
+
* ⚠️ AND THE FRAME IS THE GAME'S. On a board one says "to the north-east"; in a 2D platformer seen from the side, north
|
|
175
|
+
* means nothing, and what one says is "at 2 o'clock".
|
|
192
176
|
*/
|
|
193
|
-
function
|
|
177
|
+
function inWords(r) {
|
|
194
178
|
if (r.kind === 'none')
|
|
195
179
|
return t('sr.nav.here');
|
|
196
|
-
//
|
|
197
|
-
//
|
|
180
|
+
// One key with `{h}` and not twelve — but the singular has its own, because "at 1 hours" is not a sentence in any of
|
|
181
|
+
// the three languages the way the plural key would write it. Where two forms coincide, having both costs nothing.
|
|
198
182
|
if (r.kind === 'clock')
|
|
199
183
|
return r.hour === 1 ? t('sr.nav.clockOne') : t('sr.nav.clock', { h: r.hour });
|
|
200
184
|
return t('sr.nav.dir.' + r.heading);
|
|
201
185
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
186
|
+
/**
|
|
187
|
+
* This player's nearest target, in the DECLARED METRIC — and `null` if there is none.
|
|
188
|
+
*
|
|
189
|
+
* It was a loop over coins that skipped the taken and the unowned and measured with `Math.hypot`. The three things it
|
|
190
|
+
* knew about the game (that targets are coins, that coins have owners, that distance is Euclidean in pixels) became a
|
|
191
|
+
* question to the contract and a call to `distance`.
|
|
192
|
+
*/
|
|
193
|
+
function nearestSpot(pl) {
|
|
194
|
+
const shape = ctx.topology();
|
|
195
|
+
const here = { x: pl.x, y: pl.y };
|
|
196
|
+
let nearest = null, bd = Infinity;
|
|
197
|
+
for (const target of ctx.targetsOf(pl.i)) {
|
|
198
|
+
const d = distance(shape, here, target);
|
|
208
199
|
if (d < bd) {
|
|
209
200
|
bd = d;
|
|
210
|
-
|
|
201
|
+
nearest = target;
|
|
211
202
|
}
|
|
212
203
|
}
|
|
213
|
-
return
|
|
204
|
+
return nearest ? { at: nearest, d: bd } : null;
|
|
214
205
|
}
|
|
215
206
|
/**
|
|
216
|
-
* "
|
|
207
|
+
* "Near" in STEPS of the declared metric, not in pixels.
|
|
217
208
|
*
|
|
218
|
-
*
|
|
219
|
-
* a
|
|
220
|
-
*
|
|
209
|
+
* The original thresholds of 4 and 9 tiles become 4 and 9 UNITS: in a platformer with `unit = TILE` the sum is the same
|
|
210
|
+
* as before; on a grid it is four and nine squares; in a quiz, four and nine items away in the list. The same sentence
|
|
211
|
+
* for the child in any genre, which is the contract's point.
|
|
221
212
|
*/
|
|
222
|
-
const
|
|
213
|
+
const distanceKey = (d) => d < 4 ? 'sr.nav.veryClose' : d < 9 ? 'sr.nav.close' : 'sr.nav.far';
|
|
223
214
|
function sonar(pl) {
|
|
224
215
|
_sonarCount++;
|
|
225
216
|
const pc = playerCtx(pl);
|
|
226
|
-
const
|
|
227
|
-
// A
|
|
228
|
-
//
|
|
229
|
-
|
|
230
|
-
if (!alvo) {
|
|
217
|
+
const target = nearestSpot(pl);
|
|
218
|
+
// A sonar that no longer knows what the target is cannot name it when there is NO target at all: it says "nothing
|
|
219
|
+
// nearby", which is true in any genre.
|
|
220
|
+
if (!target) {
|
|
231
221
|
ctx.tonePan(300, 0.2, 'sonar', 0, 0.2, 'sine', pc);
|
|
232
222
|
ctx.srSay(t('sr.nav.noTargetNear'));
|
|
233
223
|
return;
|
|
234
224
|
}
|
|
235
|
-
const pan = panFor(
|
|
236
|
-
ctx.tonePan(380 + 740 * near, 0.16, 'sonar', pan, 0.26, 'sine', pc); //
|
|
237
|
-
//
|
|
238
|
-
//
|
|
239
|
-
const
|
|
240
|
-
const
|
|
241
|
-
alvo:
|
|
242
|
-
lado:
|
|
243
|
-
dist: t(
|
|
225
|
+
const pan = panFor(target.at.x, pl), near = Math.max(0, 1 - target.d / 12);
|
|
226
|
+
ctx.tonePan(380 + 740 * near, 0.16, 'sonar', pan, 0.26, 'sine', pc); // nearer = higher
|
|
227
|
+
// The NAME comes from the game (field 3); the engine used to say "coin" because it only knew coins. The fallback is
|
|
228
|
+
// for a game that declares a target without a name: "target" is better than a raw key.
|
|
229
|
+
const name = ctx.nameAt(target.at);
|
|
230
|
+
const foundSentence = t('sr.nav.sonarFound', {
|
|
231
|
+
alvo: name ? name.text : t('sr.nav.target'),
|
|
232
|
+
lado: inWords(bearing(ctx.topology(), { x: pl.x, y: pl.y }, target.at)),
|
|
233
|
+
dist: t(distanceKey(target.d)),
|
|
244
234
|
});
|
|
245
|
-
const msg = (ctx.getNumPlayers() > 1 ? t('sr.player.prefix', { n: pl.i + 1 }) : '') +
|
|
235
|
+
const msg = (ctx.getNumPlayers() > 1 ? t('sr.player.prefix', { n: pl.i + 1 }) : '') + foundSentence;
|
|
246
236
|
ctx.srSay(msg);
|
|
247
237
|
ctx.narrate(msg);
|
|
248
238
|
}
|
|
249
239
|
/**
|
|
250
|
-
*
|
|
240
|
+
* HOW MANY STEPS REMAIN, and the preferred answer is the one that goes round walls.
|
|
251
241
|
*
|
|
252
|
-
* ⚠️
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
242
|
+
* ⚠️ BOTH ANSWERS ARE ALREADY IN THE SAME UNIT, which is the only reason this is a line and not a conversion: the route
|
|
243
|
+
* counts steps by definition, and `distance()` returns steps in EVERY topology — it divides by the `unit` itself in the
|
|
244
|
+
* continuous branch. Dividing again by the world step here was the mistake waiting to be made, and in a game with
|
|
245
|
+
* `unit = 16` it would put the guide at full brightness forever — the defect #121 took out of `panFor`: mixing a world
|
|
246
|
+
* ruler with a screen ruler.
|
|
257
247
|
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
248
|
+
* The route is lost two ways — a game that did not inject `roleAt`, and a budget run out — and both fall back to the
|
|
249
|
+
* STRAIGHT LINE. ⚠️ It lies behind a wall (says "near" of a target that needs going round), which is why it is a
|
|
250
|
+
* fallback and not a choice. But continuing to say it is strictly better than going quiet — quiet would claim there is
|
|
251
|
+
* no target.
|
|
262
252
|
*/
|
|
263
|
-
function
|
|
253
|
+
function stepsToTarget(pl, target) {
|
|
264
254
|
const roleAt = ctx.roleAt;
|
|
265
255
|
if (roleAt) {
|
|
266
|
-
const
|
|
267
|
-
if (
|
|
268
|
-
return
|
|
256
|
+
const path = routeTo({ topology: ctx.topology(), roleAt, budget: ROUTE_BUDGET }, { x: pl.x, y: pl.y }, [target.at]);
|
|
257
|
+
if (path)
|
|
258
|
+
return path.steps;
|
|
269
259
|
}
|
|
270
|
-
return
|
|
260
|
+
return target.d;
|
|
271
261
|
}
|
|
272
|
-
/**
|
|
273
|
-
function
|
|
262
|
+
/** Lights this player's continuous graph. `null` = it could not (no context, or an engine without Web Audio). */
|
|
263
|
+
function startGuide(pl) {
|
|
274
264
|
const pc = playerCtx(pl);
|
|
275
265
|
const ac = pc ? pc.ac : ctx.getAudioCtx();
|
|
276
266
|
if (!ac)
|
|
277
267
|
return null;
|
|
278
268
|
try {
|
|
279
|
-
const osc = ac.createOscillator(),
|
|
280
|
-
osc.type =
|
|
281
|
-
osc.frequency.value =
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
let
|
|
269
|
+
const osc = ac.createOscillator(), lowpass = ac.createBiquadFilter(), level = ac.createGain();
|
|
270
|
+
osc.type = GUIDE_WAVE;
|
|
271
|
+
osc.frequency.value = GUIDE_HZ;
|
|
272
|
+
lowpass.type = 'lowpass';
|
|
273
|
+
lowpass.frequency.value = FAR_CUT; // born at the bottom of the scale and rising; born open would be a fright
|
|
274
|
+
level.gain.value = 0; // and born quiet, so it does not click when it starts
|
|
275
|
+
let migrated = level;
|
|
286
276
|
let panner = null;
|
|
287
277
|
if (ac.createStereoPanner) {
|
|
288
278
|
panner = ac.createStereoPanner();
|
|
289
|
-
|
|
290
|
-
|
|
279
|
+
level.connect(panner);
|
|
280
|
+
migrated = panner;
|
|
291
281
|
}
|
|
292
|
-
osc.connect(
|
|
293
|
-
|
|
282
|
+
osc.connect(lowpass).connect(level);
|
|
283
|
+
migrated.connect(pc ? pc.out : (ctx.catNode?.('guide') || ctx.audioOut?.() || ac.destination));
|
|
294
284
|
osc.start();
|
|
295
|
-
// `
|
|
296
|
-
//
|
|
297
|
-
return { ac, osc,
|
|
285
|
+
// `framesSinceRoute` is born at the ceiling so the FIRST pass measures the route, instead of sounding for twelve
|
|
286
|
+
// frames on invented steps.
|
|
287
|
+
return { ac, osc, filter: lowpass, gain: level, panner, framesSinceRoute: FRAMES_BETWEEN_ROUTES, steps: STEPS_TO_FLOOR, pan: 0 };
|
|
298
288
|
}
|
|
299
289
|
catch (e) {
|
|
300
290
|
return null;
|
|
301
291
|
}
|
|
302
292
|
}
|
|
303
293
|
/**
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
294
|
+
* Puts the graph out — and it HAS to be put out, because an oscillator that stays is the difference between this shape
|
|
295
|
+
* and the old one. The beep died by itself; this plays until someone stops it. Without this, turning the `guide`
|
|
296
|
+
* category off in the mixer would leave the sound playing, and changing visual mode would leave a second graph adding
|
|
297
|
+
* to the first.
|
|
308
298
|
*
|
|
309
|
-
*
|
|
310
|
-
*
|
|
299
|
+
* It ramps down (does not cut) because a dry cut on a live oscillator is a click — a transient, precisely what this item
|
|
300
|
+
* exists to take out of the child's ear.
|
|
311
301
|
*/
|
|
312
|
-
function
|
|
313
|
-
const g = pl.
|
|
302
|
+
function stopGuide(pl) {
|
|
303
|
+
const g = pl._guide;
|
|
314
304
|
if (!g)
|
|
315
305
|
return;
|
|
316
|
-
pl.
|
|
306
|
+
pl._guide = null;
|
|
317
307
|
try {
|
|
318
|
-
const
|
|
319
|
-
g.
|
|
320
|
-
g.osc.stop(
|
|
308
|
+
const audioNow = g.ac.currentTime;
|
|
309
|
+
g.gain.gain.setTargetAtTime(0, audioNow, 0.05);
|
|
310
|
+
g.osc.stop(audioNow + 0.3);
|
|
321
311
|
}
|
|
322
312
|
catch (e) { /* noop */ }
|
|
323
313
|
}
|
|
324
314
|
/**
|
|
325
|
-
*
|
|
315
|
+
* THE CONTINUOUS PRESENCE, one frame at a time (#84 item 2).
|
|
326
316
|
*
|
|
327
|
-
* ⚠️
|
|
328
|
-
*
|
|
329
|
-
*
|
|
317
|
+
* ⚠️ WHAT LEFT HERE WAS A BEEP, forever, whether or not the child moved or anything changed. The Dev's verdict: «um
|
|
318
|
+
* ping é a pior escolha possível, tenebroso para quem tem TEA». What replaces it fires nothing — the sound is already
|
|
319
|
+
* there, and changes brightness.
|
|
330
320
|
*
|
|
331
|
-
* ⚠️
|
|
332
|
-
*
|
|
333
|
-
*
|
|
321
|
+
* ⚠️ AND GOING QUIET IS STILL A STATEMENT, with one meaning only: THERE IS NO TARGET. That is why "no target" puts the
|
|
322
|
+
* graph out and "far" does not: `guide-intensity`'s floor (`FAR_VOL`) exists exactly so the child does not confuse "it
|
|
323
|
+
* is far" with "there is nothing to find".
|
|
334
324
|
*/
|
|
335
325
|
function updateGuide() {
|
|
336
|
-
const
|
|
337
|
-
const ligado = !!ctx.getAudioCtx() && ctx.getSoundOn() && !!cat && !!cat.guide && cat.guide.on;
|
|
326
|
+
const audible = guideAudible();
|
|
338
327
|
const vol = ctx.getVolume ? ctx.getVolume() : 1;
|
|
339
328
|
for (const pl of ctx.getPlayers()) {
|
|
340
|
-
if (!
|
|
341
|
-
|
|
329
|
+
if (!audible || !needsAudioCues(pl)) {
|
|
330
|
+
stopGuide(pl);
|
|
342
331
|
continue;
|
|
343
332
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
// que o trouxe. `alvoMaisProximo` é um laço sobre `targetsOf`, não a BFS: perguntar por quadro custa
|
|
350
|
-
// zero quando a lista está vazia, que é exactamente o caso em questão.
|
|
351
|
-
if (!alvoMaisProximo(pl))
|
|
352
|
-
continue;
|
|
353
|
-
g = pl._guia = ligarGuia(pl);
|
|
354
|
-
if (!g)
|
|
355
|
-
continue;
|
|
356
|
-
}
|
|
357
|
-
if (++g.desdeARota >= QUADROS_ENTRE_ROTAS) {
|
|
358
|
-
g.desdeARota = 0;
|
|
359
|
-
const alvo = alvoMaisProximo(pl);
|
|
360
|
-
if (!alvo) {
|
|
361
|
-
desligarGuia(pl);
|
|
362
|
-
continue;
|
|
363
|
-
}
|
|
364
|
-
g.passos = passosAteOAlvo(pl, alvo);
|
|
365
|
-
g.pan = panFor(alvo.at.x, pl);
|
|
366
|
-
}
|
|
367
|
-
// TODO quadro, e não só quando a rota é nova: é isto que faz a mudança ser um deslize.
|
|
368
|
-
const i = intensidadeDoGuia(g.passos);
|
|
369
|
-
try {
|
|
370
|
-
const agora = g.ac.currentTime;
|
|
371
|
-
g.filtro.frequency.setTargetAtTime(i.corte, agora, TAU_DO_GUIA);
|
|
372
|
-
g.ganho.gain.setTargetAtTime(GUIA_VOL * i.volume * vol, agora, TAU_DO_GUIA);
|
|
373
|
-
g.panner?.pan.setTargetAtTime(g.pan, agora, TAU_DO_GUIA);
|
|
333
|
+
// no guide lit (no target, or a device that refused it), or the target gone: silence says «nothing to find»
|
|
334
|
+
const g = liveGuide(pl);
|
|
335
|
+
if (!g || !remeasure(pl, g)) {
|
|
336
|
+
stopGuide(pl);
|
|
337
|
+
continue;
|
|
374
338
|
}
|
|
375
|
-
|
|
339
|
+
glide(g, vol);
|
|
376
340
|
_guideCount++;
|
|
377
341
|
}
|
|
378
342
|
}
|
|
343
|
+
/** Can the guide be heard at all: the engine's audio started, the game's sound on, and a `guide` category that is on. */
|
|
344
|
+
function guideAudible() {
|
|
345
|
+
const cat = ctx.getAudioCat();
|
|
346
|
+
return !!ctx.getAudioCtx() && ctx.getSoundOn() && !!cat && !!cat.guide && cat.guide.on;
|
|
347
|
+
}
|
|
348
|
+
/** This player's live guide — lit here only if there is a target to point to, and `null` where it cannot be lit. */
|
|
349
|
+
function liveGuide(pl) {
|
|
350
|
+
if (pl._guide)
|
|
351
|
+
return pl._guide;
|
|
352
|
+
// ⚠️ THE QUESTION "IS THERE A TARGET?" COMES BEFORE LIGHTING, and the gate insisted: with the graph born first, a
|
|
353
|
+
// player with no target created an oscillator, measured the route, found nothing and put it out — SIXTY TIMES A
|
|
354
|
+
// SECOND. The beep did not have this problem because nothing of it lasted; permanence brought it. `nearestSpot` is a
|
|
355
|
+
// loop over `targetsOf`, not the BFS: asking every frame costs nothing when the list is empty, which is the case here.
|
|
356
|
+
if (!nearestSpot(pl))
|
|
357
|
+
return null;
|
|
358
|
+
return (pl._guide = startGuide(pl));
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Every FRAMES_BETWEEN_ROUTES frames the route and the side are measured again — the BFS on a cadence, not sixty times a
|
|
362
|
+
* second. Answers `false` when the target is gone.
|
|
363
|
+
*/
|
|
364
|
+
function remeasure(pl, g) {
|
|
365
|
+
if (++g.framesSinceRoute < FRAMES_BETWEEN_ROUTES)
|
|
366
|
+
return true;
|
|
367
|
+
g.framesSinceRoute = 0;
|
|
368
|
+
const target = nearestSpot(pl);
|
|
369
|
+
if (!target)
|
|
370
|
+
return false;
|
|
371
|
+
g.steps = stepsToTarget(pl, target);
|
|
372
|
+
g.pan = panFor(target.at.x, pl);
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
/** EVERY frame, not only when the route is new: this is what makes the change a glide. */
|
|
376
|
+
function glide(g, vol) {
|
|
377
|
+
const i = guideIntensity(g.steps);
|
|
378
|
+
try {
|
|
379
|
+
const audioNow = g.ac.currentTime;
|
|
380
|
+
g.filter.frequency.setTargetAtTime(i.cutoff, audioNow, GUIDE_TAU);
|
|
381
|
+
g.gain.gain.setTargetAtTime(GUIDE_VOL * i.volume * vol, audioNow, GUIDE_TAU);
|
|
382
|
+
g.panner?.pan.setTargetAtTime(g.pan, audioNow, GUIDE_TAU);
|
|
383
|
+
}
|
|
384
|
+
catch (e) { /* noop */ }
|
|
385
|
+
}
|
|
379
386
|
return {
|
|
380
387
|
playerCtx, panFor, needsAudioCues, sonar, updateGuide,
|
|
381
388
|
get sonarCount() { return _sonarCount; },
|