@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
package/dist-pkg/platform/tts.js
CHANGED
|
@@ -1,66 +1,111 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/tts —
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// · DESCONTINUADO: nenhuma versão tem campo `deprecated`, e a 1.0.5 foi publicada em 2026-08-11 — depois de
|
|
18
|
-
// o ADR-0022 (2026-07-06) a dar por morta. A frase é de Julho e está atribuída ao Dev; o registo não a nega
|
|
19
|
-
// no passado, nega-a HOJE.
|
|
20
|
-
// · DUAS VOZES pt-BR: o `VoiceId` da 1.0.4 instalada traz 118 vozes, e entre elas as QUATRO exactas do
|
|
21
|
-
// ADR-0110 — `pt_BR-faber-medium`, `en_US-ryan-medium`, `en_US-amy-medium`, `es_MX-claude-high`.
|
|
22
|
-
// ⚠️ O QUE CONTINUA VERDADEIRO, e é mais afiado do que o motivo velho: o bundle prende `HF_BASE` a
|
|
23
|
-
// `huggingface.co/diffusionstudio/piper-voices` COM UMA GUARDA (`if (!url.match("https://huggingface.co")) return`),
|
|
24
|
-
// logo nenhum espelho de escola é alcançável por ele; e ele busca o PRÓPRIO runtime de cdnjs/jsDelivr por
|
|
25
|
-
// omissão, que é o que o ADR-0114 retira. A montante, o Piper mudou para `OHF-Voice/piper1-gpl` e a Open Home
|
|
26
|
-
// Foundation procura mantenedores — o risco existe, mas está noutro sítio.
|
|
27
|
-
// 📌 A ESCOLHA CONTINUA A SER A #129, e este comentário não a toma: descreve o que foi medido para que o
|
|
28
|
-
// próximo leitor não herde o motivo velho como se fosse medição.
|
|
29
|
-
// ⚠️ E DESDE O ADR-0094 ESTE MÓDULO NÃO NOMEIA FORNECEDOR NENHUM — quem o nomeia é o JOGO, por `ctx.carregarVozNeural`.
|
|
30
|
-
// O nome estava aqui num `import()` e o pacote em `devDependencies`, o que publicou uma engine que não compilava
|
|
31
|
-
// (ADR-0093); pô-lo em `dependencies` consertava o build e obrigava todo consumidor a 135,4 MB de `onnxruntime-web`,
|
|
32
|
-
// que o fornecedor traz como peer não-opcional. A porta é o que faz a troca do ADR-0022 não ser um segundo abalo.
|
|
33
|
-
/**
|
|
34
|
-
* Voz NEURAL por idioma, indexada pela etiqueta BCP-47 de core/i18n. Só o pt-BR tem uma hoje, e essa ausência
|
|
35
|
-
* é agora CONSULTÁVEL em vez de presumida: `loadTTS` pergunta à tabela se existe voz para o idioma corrente,
|
|
36
|
-
* em vez de carregar a portuguesa aconteça o que acontecer.
|
|
37
|
-
*
|
|
38
|
-
* Era `TTS_SOURCES['pt-BR']` escrito à mão no ponto de uso, o que fazia o jogo em inglês baixar 25,6 MB de
|
|
39
|
-
* voz portuguesa para ler texto em inglês com fonética errada — pior que não ter voz neural nenhuma, porque
|
|
40
|
-
* gasta a banda da escola para entregar algo ininteligível.
|
|
41
|
-
*/
|
|
42
|
-
const TTS_SOURCES = {
|
|
43
|
-
'pt-BR': { engine: 'piper', voice: 'pt_BR-faber-medium' },
|
|
44
|
-
};
|
|
2
|
+
// platform/tts — spoken narration. The browser's voice speaks first (Web Speech, ADR-0200); the neural fallback is Kokoro, which
|
|
3
|
+
// THE ENGINE ITSELF loads from the delivery (ADR-0216 §1) the first time a child picks it — the game only says it wants one; the
|
|
4
|
+
// loader, the browser's speech, the clock and the `<audio>` maker are the root's, received here (ADR-0232 D4). narrate()
|
|
5
|
+
// is the entry point, gated by the mixer's narration toggle (audioCat.tts.on) — independent of captions. The PANEL's side (the
|
|
6
|
+
// engine and voice lists) lives in `ui/voice-settings` and reads and writes the choice through this module. Injection by closure.
|
|
7
|
+
import { KEYS } from './storage-keys.js';
|
|
8
|
+
import { createInterruptibleSpeech } from './interruptible-speech.js';
|
|
9
|
+
import { voicesForLocale } from './voice-plan.js';
|
|
10
|
+
import { spokenWords, speechSeconds, speechPlaybackRate } from '../core/speech-rate.js';
|
|
11
|
+
import { KOKORO_VOICES, tokenize, sentenceStyle, eFala, wavDe, } from './kokoro.js';
|
|
12
|
+
// 📌 The only neural engine is Kokoro (ADR-0207): the engine's earlier neural engine left when the licence chain of its voices came
|
|
13
|
+
// to light. 📌 And ADR-0094's fear — «a provider named here lands its runtime in every consumer's `node_modules`» — is answered by the
|
|
14
|
+
// delivery and not by a port: the runtime is catalogued, fetched by the build and read from `heavy/`, never imported from npm.
|
|
15
|
+
/** An engine the child may have stored before it left the engine (ADR-0207): read as no explicit choice, so the voice in use speaks. */
|
|
16
|
+
const ENGINES_THAT_LEFT = ['piper'];
|
|
45
17
|
export function createTts(ctx) {
|
|
46
|
-
|
|
47
|
-
let
|
|
48
|
-
let
|
|
18
|
+
const { t, bcp47 } = ctx.translator;
|
|
19
|
+
let ttsEngine = null, ttsLoading = false, ttsFailed = false, _narrateCount = 0;
|
|
20
|
+
let _ttsVoiceObj = null; // the selected Web Speech voice
|
|
21
|
+
// An engine set explicitly (stored, or by the panel) wins; otherwise the engine of the voice in use, which is the browser's when it
|
|
22
|
+
// offers one for the language (ADR-0200) — measured on the device at every call, since the browser lists its voices late.
|
|
23
|
+
const stored = ctx.store.get(KEYS.ttsEngine, null) || null; // webspeech | kokoro | kitten | espeak
|
|
24
|
+
let ttsEngineSelExplicito = stored && !ENGINES_THAT_LEFT.includes(stored) ? stored : null;
|
|
25
|
+
const engineSel = () => {
|
|
26
|
+
if (ttsEngineSelExplicito)
|
|
27
|
+
return ttsEngineSelExplicito;
|
|
28
|
+
const e = voiceInUse()?.engine;
|
|
29
|
+
// a fallback this game did not ask for is not the default: undeclared, the browser's voice (no «not bundled» alert)
|
|
30
|
+
return e === 'kokoro' && ctx.neuralVoice ? e : 'webspeech';
|
|
31
|
+
};
|
|
32
|
+
let kokoroBackend = null;
|
|
33
|
+
let loadedVoice = null; // the voice the loaded engine speaks; another choice reloads it
|
|
34
|
+
// Each voice's words per minute, averaged over the utterances long enough to measure (`core/speech-rate`): what a short
|
|
35
|
+
// utterance («Voltar») is played against. Neural voices by id; browser voices by name.
|
|
36
|
+
const voiceAverage = new Map();
|
|
37
|
+
const media = (voiceName, ppm) => {
|
|
38
|
+
if (!ppm)
|
|
39
|
+
return;
|
|
40
|
+
const before = voiceAverage.get(voiceName);
|
|
41
|
+
voiceAverage.set(voiceName, before ? before * 0.7 + ppm * 0.3 : ppm);
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* WEB SPEECH FIRST (ADR-0200; issue #190): the browser's voices for the language lead the list, so where the device already speaks
|
|
45
|
+
* no neural voice is loaded; then Kokoro's where the game declared it speaks neurally (ADR-0216 §3) — the fallback.
|
|
46
|
+
*/
|
|
47
|
+
const browserVoices = () => {
|
|
48
|
+
let list = [];
|
|
49
|
+
try {
|
|
50
|
+
list = ctx.speech.synth()?.getVoices() ?? [];
|
|
51
|
+
}
|
|
52
|
+
catch { /* no speech synthesis here */ }
|
|
53
|
+
return voicesForLocale(bcp47(), list.map((v) => ({ locale: v.lang.replace('_', '-'), engine: 'webspeech', voice: 'webspeech:' + v.name })));
|
|
54
|
+
};
|
|
55
|
+
const availableVoices = () => [...browserVoices(), ...(ctx.neuralVoice ? voicesForLocale(bcp47(), KOKORO_VOICES) : [])];
|
|
56
|
+
/** The browser voice an entry names, or null. */
|
|
57
|
+
const browserVoice = (id) => {
|
|
58
|
+
if (!id?.startsWith('webspeech:'))
|
|
59
|
+
return null;
|
|
60
|
+
try {
|
|
61
|
+
return ctx.speech.synth()?.getVoices().find((v) => 'webspeech:' + v.name === id) ?? null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
function voiceInUse() {
|
|
68
|
+
const list = availableVoices();
|
|
69
|
+
const storedVoiceId = ctx.store.get(KEYS.ttsVoz, null);
|
|
70
|
+
return list.find((v) => v.voice === storedVoiceId) ?? list[0] ?? null;
|
|
71
|
+
}
|
|
72
|
+
function chooseVoice(id) {
|
|
73
|
+
if (!availableVoices().some((v) => v.voice === id))
|
|
74
|
+
return false;
|
|
75
|
+
ctx.store.set(KEYS.ttsVoz, id);
|
|
76
|
+
ttsEngineSelExplicito = availableVoices().find((v) => v.voice === id).engine;
|
|
77
|
+
_ttsVoiceObj = browserVoice(id);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
49
80
|
function speakWebSpeech(text) {
|
|
50
81
|
try {
|
|
51
|
-
const ss =
|
|
82
|
+
const ss = ctx.speech.synth();
|
|
52
83
|
if (!ss)
|
|
53
84
|
return false;
|
|
54
85
|
ss.cancel();
|
|
55
|
-
// `u.lang`
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
const
|
|
86
|
+
// `u.lang` follows the game's language. Fixed at pt-BR, a game in English or Spanish would ask the browser for a
|
|
87
|
+
// PORTUGUESE voice for a text that is not Portuguese — and the result is not an accent, it is unintelligible: the
|
|
88
|
+
// wrong phonetics applied to the wrong letters.
|
|
89
|
+
const voiceName = _ttsVoiceObj ?? browserVoice(voiceInUse()?.voice);
|
|
90
|
+
const u = ctx.speech.utterance(text);
|
|
59
91
|
u.lang = bcp47();
|
|
60
|
-
if (
|
|
61
|
-
u.voice =
|
|
62
|
-
u.rate = 1;
|
|
92
|
+
if (voiceName)
|
|
93
|
+
u.voice = voiceName;
|
|
63
94
|
u.volume = Math.min(1, ctx.getVolume() * 1.4);
|
|
95
|
+
// ADR-0183 §1: the browser's `rate` is a multiplier. The voice's words a minute at rate 1 is measured on its own utterances
|
|
96
|
+
// (start to end, so the silent ends count — an approximation the neural path does not need); until one is measured, 1.
|
|
97
|
+
const voiceIdOf = 'webspeech:' + (voiceName?.name ?? bcp47());
|
|
98
|
+
const words = spokenWords(text);
|
|
99
|
+
const voiceBase = voiceAverage.get(voiceIdOf) ?? null;
|
|
100
|
+
u.rate = ctx.getSpeechPpm && voiceBase ? speechPlaybackRate(0, 0, ctx.getSpeechPpm(), voiceBase).rate : 1;
|
|
101
|
+
let startAt = 0;
|
|
102
|
+
u.onstart = () => { startAt = ctx.now(); };
|
|
103
|
+
u.onend = () => {
|
|
104
|
+
const seconds = startAt ? (ctx.now() - startAt) / 1000 : 0;
|
|
105
|
+
const measured = speechPlaybackRate(words, seconds, 150, null).voiceWpm;
|
|
106
|
+
if (measured)
|
|
107
|
+
media(voiceIdOf, measured / u.rate);
|
|
108
|
+
};
|
|
64
109
|
ss.speak(u);
|
|
65
110
|
return true;
|
|
66
111
|
}
|
|
@@ -68,104 +113,157 @@ export function createTts(ctx) {
|
|
|
68
113
|
return false;
|
|
69
114
|
}
|
|
70
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* A neural voice's utterances, whatever made the WAV (ADR-0183 §1): every utterance is measured — its words over its speech time,
|
|
118
|
+
* silent ends trimmed — and played at the child's rate over the voice's, through a media element that keeps the pitch.
|
|
119
|
+
*/
|
|
120
|
+
function speakByWav(voiceId, produce) {
|
|
121
|
+
return createInterruptibleSpeech({
|
|
122
|
+
synthesize: async (text) => {
|
|
123
|
+
const bytes = await produce(text);
|
|
124
|
+
const ac = ctx.ensureAC();
|
|
125
|
+
if (!ac)
|
|
126
|
+
throw new Error('AudioContext unavailable'); // the `catch` there handles it: this item is silent, the engine lives
|
|
127
|
+
let speedRatio = 1;
|
|
128
|
+
if (ctx.getSpeechPpm) {
|
|
129
|
+
const buf = await ac.decodeAudioData(bytes.slice(0));
|
|
130
|
+
const measure = speechPlaybackRate(spokenWords(text), speechSeconds(buf.getChannelData(0), buf.sampleRate), ctx.getSpeechPpm(), voiceAverage.get(voiceId) ?? null);
|
|
131
|
+
media(voiceId, measure.voiceWpm);
|
|
132
|
+
speedRatio = measure.rate;
|
|
133
|
+
}
|
|
134
|
+
return { url: URL.createObjectURL(new Blob([bytes], { type: 'audio/wav' })), rate: speedRatio };
|
|
135
|
+
},
|
|
136
|
+
play: (sound, onFinish) => {
|
|
137
|
+
const ac = ctx.ensureAC();
|
|
138
|
+
if (!ac) {
|
|
139
|
+
URL.revokeObjectURL(sound.url);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const el = ctx.createAudio();
|
|
143
|
+
el.preservesPitch = true;
|
|
144
|
+
el.src = sound.url;
|
|
145
|
+
el.playbackRate = sound.rate;
|
|
146
|
+
try {
|
|
147
|
+
ac.createMediaElementSource(el).connect(ctx.catNode('tts') || ctx.audioOut() || ac.destination);
|
|
148
|
+
}
|
|
149
|
+
catch { /* already routed */ }
|
|
150
|
+
el.onended = () => { URL.revokeObjectURL(sound.url); onFinish(); };
|
|
151
|
+
void el.play().catch(() => { URL.revokeObjectURL(sound.url); onFinish(); });
|
|
152
|
+
return el;
|
|
153
|
+
},
|
|
154
|
+
stop: (el) => { el.pause(); URL.revokeObjectURL(el.src); },
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* KOKORO (ADR-0186, ADR-0216; issues #181, #200): the voice's text becomes espeak-ng phonemes in its language, then the model's
|
|
159
|
+
* ids and a waveform. WebGPU only where a short test synthesis is speech — measured, WebGPU can run and return noise — and WASM
|
|
160
|
+
* with threads otherwise (ADR-0192).
|
|
161
|
+
*/
|
|
162
|
+
function loadKokoroEngine(forVoice) {
|
|
163
|
+
const load = ctx.loadKokoro;
|
|
164
|
+
const kv = KOKORO_VOICES.find((v) => v.voice === forVoice.voice);
|
|
165
|
+
if (!kv) {
|
|
166
|
+
ttsFailed = true;
|
|
167
|
+
ctx.srAlert(t('sr.tts.neuralNotBundled'));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
ttsLoading = true;
|
|
171
|
+
loadedVoice = forVoice.voice;
|
|
172
|
+
const t0 = ctx.now();
|
|
173
|
+
ctx.srSay(t('sr.tts.downloading'));
|
|
174
|
+
load().then(async (mod) => {
|
|
175
|
+
const [symbolIds, table] = await Promise.all([mod.vocabulary(), mod.voice(kv.voice)]);
|
|
176
|
+
const synthesiseWith = async (kokoroSession, text) => {
|
|
177
|
+
const ids = tokenize(await mod.phonemize(text, kv.espeak), symbolIds);
|
|
178
|
+
return kokoroSession.synthesize(ids, sentenceStyle(table, ids.length - 2));
|
|
179
|
+
};
|
|
180
|
+
let kokoroSession = null;
|
|
181
|
+
try {
|
|
182
|
+
const gpu = await mod.session('webgpu');
|
|
183
|
+
if (eFala(await synthesiseWith(gpu, t('tts.kokoro.teste')))) {
|
|
184
|
+
kokoroSession = gpu;
|
|
185
|
+
kokoroBackend = 'webgpu';
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch { /* no WebGPU here: WASM below */ }
|
|
189
|
+
if (!kokoroSession) {
|
|
190
|
+
kokoroSession = await mod.session('wasm');
|
|
191
|
+
kokoroBackend = 'wasm';
|
|
192
|
+
}
|
|
193
|
+
const used = kokoroSession;
|
|
194
|
+
const fala = speakByWav(kv.voice, async (text) => wavDe(await synthesiseWith(used, text)));
|
|
195
|
+
ttsEngine = { id: 'kokoro', speak: (text) => { fala.speak(text); } };
|
|
196
|
+
ttsLoading = false;
|
|
197
|
+
try {
|
|
198
|
+
ctx.speech.synth()?.cancel();
|
|
199
|
+
}
|
|
200
|
+
catch (e) { /* noop */ }
|
|
201
|
+
narrate(t('sr.tts.ready', { s: ((ctx.now() - t0) / 1000).toFixed(0) }));
|
|
202
|
+
}).catch(() => { ttsLoading = false; ttsFailed = true; ctx.srAlert(t('sr.tts.loadFailed')); });
|
|
203
|
+
}
|
|
71
204
|
function loadTTS() {
|
|
72
205
|
if (ttsEngine || ttsLoading || ttsFailed)
|
|
73
206
|
return;
|
|
74
|
-
|
|
75
|
-
|
|
207
|
+
const sel = engineSel();
|
|
208
|
+
if (sel !== 'kokoro') { // Kitten and eSpeak NG are not built
|
|
209
|
+
if (sel !== 'webspeech')
|
|
76
210
|
ctx.srAlert(t('sr.tts.engineNoLanguage'));
|
|
77
211
|
return;
|
|
78
212
|
}
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
if (!
|
|
213
|
+
// THIS GAME DID NOT ASK FOR A NEURAL VOICE (ADR-0216 §3). It comes BEFORE the language question on purpose: without
|
|
214
|
+
// the declaration there is no neural voice in any language — the delivery does not carry the model — and saying "there
|
|
215
|
+
// is no voice for your language" would make the child think switching language would fix it. `ttsFailed` so it is not
|
|
216
|
+
// repeated on every utterance.
|
|
217
|
+
if (!ctx.neuralVoice) {
|
|
84
218
|
ttsFailed = true;
|
|
85
219
|
ctx.srAlert(t('sr.tts.neuralNotBundled'));
|
|
86
220
|
return;
|
|
87
221
|
}
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
const
|
|
91
|
-
|
|
222
|
+
// The voice in use for the current language (ADR-0185); a browser voice in use with Kokoro set explicitly gives way to the
|
|
223
|
+
// language's first Kokoro voice. None: another language's voice is NOT fetched — it would read this text with the wrong phonetics.
|
|
224
|
+
const current = voiceInUse();
|
|
225
|
+
const forVoice = current?.engine === 'kokoro' ? current : voicesForLocale(bcp47(), KOKORO_VOICES)[0] ?? null;
|
|
226
|
+
if (!forVoice) {
|
|
92
227
|
ctx.srAlert(t('sr.tts.noNeuralForLanguage'));
|
|
93
228
|
return;
|
|
94
229
|
}
|
|
95
|
-
|
|
96
|
-
const t0 = performance.now();
|
|
97
|
-
ctx.srSay(t('sr.tts.downloading'));
|
|
98
|
-
carregar().then(async (mod) => {
|
|
99
|
-
const session = await mod.TtsSession.create({ voiceId: fonte.voice,
|
|
100
|
-
progress: (p) => { if (!p || !p.total)
|
|
101
|
-
return; const pct = Math.round(p.loaded * 100 / p.total); if (pct >= _ttsPct + 25 && pct < 100) {
|
|
102
|
-
_ttsPct = pct;
|
|
103
|
-
ctx.srSay(t('sr.tts.progress', { pct }));
|
|
104
|
-
} },
|
|
105
|
-
logger: () => { } });
|
|
106
|
-
// A FILA DE UM SAIU (ADR-0044, item 2). Ela era `if (busy) next = text; else speakNow(text)`, e o
|
|
107
|
-
// efeito, varrendo cinco itens de menu, era ouvir o PRIMEIRO inteiro e depois o ÚLTIMO — os três do
|
|
108
|
-
// meio sumiam, porque cada pedido sobrescrevia o `next`. Lento e lacunar, e quem não enxerga navega
|
|
109
|
-
// POR ESCUTA: a escuta ficava vários itens atrás do foco.
|
|
110
|
-
//
|
|
111
|
-
// A política agora mora em `platform/interruptible-speech`, pura e testada com falsos. Aqui só se
|
|
112
|
-
// diz COMO sintetizar, tocar e parar — o quando é lá, com a guarda de geração que impede uma síntese
|
|
113
|
-
// lenta de atropelar a mais nova.
|
|
114
|
-
const fala = criarFalaInterrompivel({
|
|
115
|
-
sintetizar: async (texto) => {
|
|
116
|
-
const wav = await session.predict(texto);
|
|
117
|
-
const ac = ctx.ensureAC();
|
|
118
|
-
if (!ac)
|
|
119
|
-
throw new Error('AudioContext unavailable'); // o `catch` de lá trata: silêncio deste item, motor vivo
|
|
120
|
-
return ac.decodeAudioData(await wav.arrayBuffer());
|
|
121
|
-
},
|
|
122
|
-
tocar: (buf, aoTerminar) => {
|
|
123
|
-
const ac = ctx.ensureAC();
|
|
124
|
-
if (!ac)
|
|
125
|
-
return null;
|
|
126
|
-
const src = ac.createBufferSource();
|
|
127
|
-
src.buffer = buf;
|
|
128
|
-
src.connect(ctx.catNode('tts') || ctx.audioOut() || ac.destination);
|
|
129
|
-
src.onended = aoTerminar;
|
|
130
|
-
src.start();
|
|
131
|
-
return src;
|
|
132
|
-
},
|
|
133
|
-
parar: (src) => { src.stop(); },
|
|
134
|
-
});
|
|
135
|
-
ttsEngine = { id: 'piper', speak: (text) => { fala.falar(text); } };
|
|
136
|
-
ttsLoading = false;
|
|
137
|
-
try {
|
|
138
|
-
window.speechSynthesis && window.speechSynthesis.cancel();
|
|
139
|
-
}
|
|
140
|
-
catch (e) { /* noop */ }
|
|
141
|
-
narrate(t('sr.tts.ready', { s: ((performance.now() - t0) / 1000).toFixed(0) })); // já sai NA voz nova
|
|
142
|
-
}).catch(() => { ttsLoading = false; ttsFailed = true; ctx.srAlert(t('sr.tts.loadFailed')); });
|
|
230
|
+
loadKokoroEngine(forVoice);
|
|
143
231
|
}
|
|
144
232
|
function ttsSpeak(text) {
|
|
145
|
-
if (
|
|
146
|
-
|
|
233
|
+
if (engineSel() !== 'webspeech') {
|
|
234
|
+
// another voice picked, or the language changed, since the engine loaded: load the voice in use
|
|
235
|
+
const inUse = voiceInUse();
|
|
236
|
+
if (ttsEngine && inUse?.engine !== 'webspeech' && loadedVoice !== inUse?.voice) {
|
|
237
|
+
ttsEngine = null;
|
|
238
|
+
ttsFailed = false;
|
|
239
|
+
}
|
|
240
|
+
if (ttsEngine && ttsEngine.speak) {
|
|
147
241
|
try {
|
|
148
242
|
ttsEngine.speak(text);
|
|
149
243
|
}
|
|
150
244
|
catch (e) { /* noop */ }
|
|
151
245
|
return true;
|
|
152
246
|
}
|
|
153
|
-
loadTTS(); //
|
|
247
|
+
loadTTS(); // the neural engine is downloading or unavailable → falls back
|
|
154
248
|
}
|
|
155
|
-
return speakWebSpeech(text); // fallback
|
|
249
|
+
return speakWebSpeech(text); // immediate fallback: Web Speech, in the game's language
|
|
156
250
|
}
|
|
157
251
|
function narrate(text) {
|
|
158
252
|
const cat = ctx.getAudioCat();
|
|
159
253
|
if (!ctx.getSoundOn() || !cat || !cat.tts || !cat.tts.on || !text)
|
|
160
254
|
return;
|
|
255
|
+
if (availableVoices().length === 0)
|
|
256
|
+
return; // no voice speaks this language: narration is locked (ADR-0185 §4)
|
|
161
257
|
_narrateCount++;
|
|
162
258
|
ttsSpeak(text);
|
|
163
259
|
}
|
|
164
260
|
return {
|
|
165
261
|
narrate, ttsSpeak, loadTTS, speakWebSpeech,
|
|
166
|
-
getEngineSel:
|
|
262
|
+
getEngineSel: engineSel, setEngineSel: (v) => { ttsEngineSelExplicito = v; },
|
|
167
263
|
getEngine: () => ttsEngine, getVoiceObj: () => _ttsVoiceObj, setVoiceObj: (v) => { _ttsVoiceObj = v; },
|
|
168
264
|
get loading() { return ttsLoading; }, get failed() { return ttsFailed; }, get narrateCount() { return _narrateCount; },
|
|
169
|
-
get
|
|
265
|
+
get neuralAvailable() { return !!ctx.neuralVoice; },
|
|
266
|
+
get kokoroDevice() { return kokoroBackend; },
|
|
267
|
+
voices: availableVoices, currentVoice: voiceInUse, setVoice: chooseVoice,
|
|
170
268
|
};
|
|
171
269
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
export type LoopHealth = 'ok' | 'slow' | 'stalled';
|
|
3
|
+
export interface VisionLoopDeps {
|
|
4
|
+
readonly requestFrame: (cb: (ms: number) => void) => number;
|
|
5
|
+
readonly cancelFrame: (handle: number) => void;
|
|
6
|
+
readonly now: () => number;
|
|
7
|
+
readonly every: (cb: () => void, ms: number) => number;
|
|
8
|
+
readonly stopEvery: (handle: number) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface VisionLoopOptions {
|
|
11
|
+
readonly onFrame: (ms: number) => void;
|
|
12
|
+
readonly onError?: (error: unknown) => void;
|
|
13
|
+
readonly onHealth?: (health: LoopHealth, framesPerSecond: number) => void;
|
|
14
|
+
readonly floorFps?: number;
|
|
15
|
+
readonly stallMs?: number;
|
|
16
|
+
readonly watchMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface VisionLoop {
|
|
19
|
+
start(): void;
|
|
20
|
+
stop(): void;
|
|
21
|
+
health(): LoopHealth;
|
|
22
|
+
}
|
|
23
|
+
export declare function createVisionLoop(deps: VisionLoopDeps, { onFrame, onError, onHealth, floorFps, stallMs, watchMs }: VisionLoopOptions): VisionLoop;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// platform/vision-loop — THE CAMERA'S FRAME LOOP, WHICH CANNOT STOP IN SILENCE (ADR-0213; issue #196).
|
|
3
|
+
//
|
|
4
|
+
// · The next frame is booked BEFORE anything that could throw. The lab's loop booked it at the end, one item threw on every frame, and the
|
|
5
|
+
// eye control stopped on its first frame with nothing on screen saying so — every measurement taken after that was of a stopped page.
|
|
6
|
+
// · A frame that throws is handed to `onError` and the loop goes on.
|
|
7
|
+
// · A watchdog on its OWN clock (a stopped loop cannot report itself) says whether frames are arriving: `stalled` when none came for
|
|
8
|
+
// `stallMs`, `slow` under `floorFps` in the last second, `ok` otherwise. A reading taken while it is not `ok` is not a reading, and the
|
|
9
|
+
// child must be told, not left gazing at a control that no longer listens. It reports on change only.
|
|
10
|
+
export function createVisionLoop(deps, { onFrame, onError = () => { }, onHealth = () => { }, floorFps = 8, stallMs = 1000, watchMs = 500 }) {
|
|
11
|
+
let frame = null, watch = null, health = 'ok', startedAt = 0;
|
|
12
|
+
const times = [];
|
|
13
|
+
const tick = (ms) => {
|
|
14
|
+
frame = deps.requestFrame(tick);
|
|
15
|
+
times.push(deps.now());
|
|
16
|
+
try {
|
|
17
|
+
onFrame(ms);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
onError(e);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const check = () => {
|
|
24
|
+
const now = deps.now();
|
|
25
|
+
while (times.length && now - times[0] > 1000)
|
|
26
|
+
times.shift();
|
|
27
|
+
const last = times.at(-1) ?? startedAt;
|
|
28
|
+
if (health === 'stalled' && now - last < stallMs)
|
|
29
|
+
startedAt = now; // back from a stall: judge the rate on a full second of the new frames
|
|
30
|
+
const next = now - last >= stallMs ? 'stalled' : now - startedAt >= 1000 && times.length < floorFps ? 'slow' : 'ok';
|
|
31
|
+
if (next !== health) {
|
|
32
|
+
health = next;
|
|
33
|
+
onHealth(health, times.length);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
start() {
|
|
38
|
+
if (frame !== null)
|
|
39
|
+
return;
|
|
40
|
+
startedAt = deps.now();
|
|
41
|
+
health = 'ok';
|
|
42
|
+
times.length = 0;
|
|
43
|
+
frame = deps.requestFrame(tick);
|
|
44
|
+
watch = deps.every(check, watchMs);
|
|
45
|
+
},
|
|
46
|
+
stop() {
|
|
47
|
+
if (frame !== null)
|
|
48
|
+
deps.cancelFrame(frame);
|
|
49
|
+
if (watch !== null)
|
|
50
|
+
deps.stopEvery(watch);
|
|
51
|
+
frame = null;
|
|
52
|
+
watch = null;
|
|
53
|
+
},
|
|
54
|
+
health: () => health,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/** The files the face reader needs, by catalogue id. */
|
|
3
|
+
export declare const FACE_VISION_FILES: readonly ["visao:runtime", "visao:runtime:cola", "visao:runtime:wasm", "visao:modelo:rosto"];
|
|
4
|
+
/** The files the hand reader needs (ADR-0210 hands map: the Gesture Recognizer gives the canned gestures and the landmarks). */
|
|
5
|
+
export declare const HAND_VISION_FILES: readonly ["visao:runtime", "visao:runtime:cola", "visao:runtime:wasm", "visao:modelo:gestos"];
|
|
6
|
+
/** The part of one detection the eye control reads. */
|
|
7
|
+
export interface FaceDetection {
|
|
8
|
+
readonly faceBlendshapes?: ReadonlyArray<{
|
|
9
|
+
readonly categories: ReadonlyArray<{
|
|
10
|
+
readonly categoryName: string;
|
|
11
|
+
readonly score: number;
|
|
12
|
+
}>;
|
|
13
|
+
}>;
|
|
14
|
+
readonly facialTransformationMatrixes?: ReadonlyArray<{
|
|
15
|
+
readonly data: ArrayLike<number>;
|
|
16
|
+
}>;
|
|
17
|
+
readonly faceLandmarks?: ReadonlyArray<ReadonlyArray<{
|
|
18
|
+
readonly x: number;
|
|
19
|
+
readonly y: number;
|
|
20
|
+
readonly z: number;
|
|
21
|
+
}>>;
|
|
22
|
+
}
|
|
23
|
+
interface Landmarker {
|
|
24
|
+
detectForVideo(frame: unknown, ms: number): FaceDetection;
|
|
25
|
+
close(): void;
|
|
26
|
+
}
|
|
27
|
+
/** The part of one Gesture Recognizer result the hands map reads: each hand's categories, best first, and its landmarks. */
|
|
28
|
+
export interface HandDetection {
|
|
29
|
+
readonly gestures?: ReadonlyArray<ReadonlyArray<{
|
|
30
|
+
readonly categoryName: string;
|
|
31
|
+
readonly score: number;
|
|
32
|
+
}>>;
|
|
33
|
+
readonly landmarks?: ReadonlyArray<ReadonlyArray<{
|
|
34
|
+
readonly x: number;
|
|
35
|
+
readonly y: number;
|
|
36
|
+
readonly z: number;
|
|
37
|
+
}>>;
|
|
38
|
+
}
|
|
39
|
+
interface Recognizer {
|
|
40
|
+
recognizeForVideo(frame: unknown, ms: number): HandDetection;
|
|
41
|
+
close(): void;
|
|
42
|
+
}
|
|
43
|
+
export type Connections = ReadonlyArray<{
|
|
44
|
+
readonly start: number;
|
|
45
|
+
readonly end: number;
|
|
46
|
+
}>;
|
|
47
|
+
/** The shape of the `tasks-vision` bundle this module uses. */
|
|
48
|
+
export interface TasksVision {
|
|
49
|
+
readonly FilesetResolver: {
|
|
50
|
+
forVisionTasks(wasmBase: string): Promise<unknown>;
|
|
51
|
+
};
|
|
52
|
+
readonly FaceLandmarker: {
|
|
53
|
+
createFromOptions(fileset: unknown, options: object): Promise<Landmarker>;
|
|
54
|
+
readonly FACE_LANDMARKS_LEFT_EYE: Connections;
|
|
55
|
+
readonly FACE_LANDMARKS_RIGHT_EYE: Connections;
|
|
56
|
+
readonly FACE_LANDMARKS_LEFT_IRIS: Connections;
|
|
57
|
+
readonly FACE_LANDMARKS_RIGHT_IRIS: Connections;
|
|
58
|
+
readonly FACE_LANDMARKS_LEFT_EYEBROW: Connections;
|
|
59
|
+
readonly FACE_LANDMARKS_RIGHT_EYEBROW: Connections;
|
|
60
|
+
readonly FACE_LANDMARKS_LIPS: Connections;
|
|
61
|
+
};
|
|
62
|
+
readonly GestureRecognizer: {
|
|
63
|
+
createFromOptions(fileset: unknown, options: object): Promise<Recognizer>;
|
|
64
|
+
readonly HAND_CONNECTIONS: Connections;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** The lines the eye control highlights (ADR-0213): the eyes with their irises, and the brows — never the camera's picture (ADR-0212). */
|
|
68
|
+
export interface EyeLines {
|
|
69
|
+
readonly eyes: Connections;
|
|
70
|
+
readonly brows: Connections;
|
|
71
|
+
}
|
|
72
|
+
/** The face mode also draws the lips (ADR-0212 §3). */
|
|
73
|
+
export interface FaceLines extends EyeLines {
|
|
74
|
+
readonly lips: Connections;
|
|
75
|
+
}
|
|
76
|
+
export interface VisionDeps {
|
|
77
|
+
/** The page's address, to make the delivery paths absolute. */
|
|
78
|
+
readonly base: string;
|
|
79
|
+
/**
|
|
80
|
+
* Whether a catalogue file (by its upstream address) is in the checked cache — `platform/heavy`'s `checkedCacheHas`, over
|
|
81
|
+
* the host's `caches`. REQUIRED (ADR-0232 D4): the root lends the cache; this module reaches none.
|
|
82
|
+
*/
|
|
83
|
+
readonly hasFile: (upstreamUrl: string) => Promise<boolean>;
|
|
84
|
+
readonly importBundle?: (absoluteUrl: string) => Promise<TasksVision>;
|
|
85
|
+
}
|
|
86
|
+
export type Delegate = 'GPU' | 'CPU';
|
|
87
|
+
export interface FaceTracker {
|
|
88
|
+
/** One frame; null while it has nothing to say (no face, or the CPU landmarker still being built after a GPU failure). */
|
|
89
|
+
detect(frame: unknown, ms: number): FaceDetection | null;
|
|
90
|
+
delegate(): Delegate;
|
|
91
|
+
/** The connection sets the bundle ships for the eyes, irises and brows, to draw over the game. */
|
|
92
|
+
readonly eyeLines: EyeLines;
|
|
93
|
+
/** The same lines and the lips, for the face mode. */
|
|
94
|
+
readonly faceLines: FaceLines;
|
|
95
|
+
close(): void;
|
|
96
|
+
}
|
|
97
|
+
export type FaceTrackerLoad = {
|
|
98
|
+
readonly ok: true;
|
|
99
|
+
readonly tracker: FaceTracker;
|
|
100
|
+
} | {
|
|
101
|
+
readonly ok: false;
|
|
102
|
+
readonly missing: readonly string[];
|
|
103
|
+
};
|
|
104
|
+
export interface HandTracker {
|
|
105
|
+
/** The hand's bones, as the bundle ships them, to draw over the game (ADR-0215). */
|
|
106
|
+
readonly handLines: Connections;
|
|
107
|
+
/** One frame; null while it has nothing to say. */
|
|
108
|
+
detect(frame: unknown, ms: number): HandDetection | null;
|
|
109
|
+
delegate(): Delegate;
|
|
110
|
+
close(): void;
|
|
111
|
+
}
|
|
112
|
+
export type HandTrackerLoad = {
|
|
113
|
+
readonly ok: true;
|
|
114
|
+
readonly tracker: HandTracker;
|
|
115
|
+
} | {
|
|
116
|
+
readonly ok: false;
|
|
117
|
+
readonly missing: readonly string[];
|
|
118
|
+
};
|
|
119
|
+
export declare function loadFaceTracker(deps: VisionDeps): Promise<FaceTrackerLoad>;
|
|
120
|
+
/** The Gesture Recognizer, one hand, in video mode — as the lab's map rounds ran it. */
|
|
121
|
+
export declare function loadHandTracker(deps: VisionDeps): Promise<HandTrackerLoad>;
|
|
122
|
+
/** The camera, video only, at the size the readings were measured. */
|
|
123
|
+
export declare function openCamera(media: {
|
|
124
|
+
getUserMedia(c: MediaStreamConstraints): Promise<MediaStream>;
|
|
125
|
+
}): Promise<MediaStream>;
|
|
126
|
+
/** Let the camera go: every track stops, so the device's light goes off. */
|
|
127
|
+
export declare function closeCamera(stream: {
|
|
128
|
+
getTracks(): ReadonlyArray<{
|
|
129
|
+
stop(): void;
|
|
130
|
+
}>;
|
|
131
|
+
} | null | undefined): void;
|
|
132
|
+
export {};
|