@the-inclusionist/engine 9.0.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -78
- package/app/css/style.css +584 -374
- package/app/public/vendor/fonts/bitter-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bitter-var.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cookie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ar_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_br_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ca_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_co_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_deco_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_j_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_s_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_mx_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pe_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pt_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-stix_two_math-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700.woff2 +0 -0
- package/app/public/vendor/fonts.css +1167 -51
- package/dist-pkg/boot/create-game.d.ts +444 -215
- package/dist-pkg/boot/create-game.js +3530 -549
- package/dist-pkg/core/a11y-sr.d.ts +25 -3
- package/dist-pkg/core/a11y-sr.js +40 -19
- package/dist-pkg/core/accessible-label.d.ts +17 -0
- package/dist-pkg/core/accessible-label.js +37 -0
- package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
- package/dist-pkg/core/accommodation-subjects.js +32 -0
- package/dist-pkg/core/accommodations.d.ts +107 -0
- package/dist-pkg/core/accommodations.js +178 -0
- package/dist-pkg/core/actions.d.ts +75 -51
- package/dist-pkg/core/actions.js +98 -69
- package/dist-pkg/core/calm-mode.d.ts +31 -0
- package/dist-pkg/core/calm-mode.js +47 -0
- package/dist-pkg/core/camera-cycle.d.ts +15 -0
- package/dist-pkg/core/camera-cycle.js +7 -0
- package/dist-pkg/core/caption-duration.d.ts +15 -0
- package/dist-pkg/core/caption-duration.js +19 -0
- package/dist-pkg/core/cartridge-problems.d.ts +34 -0
- package/dist-pkg/core/cartridge-problems.js +53 -0
- package/dist-pkg/core/constants.d.ts +0 -54
- package/dist-pkg/core/constants.js +9 -76
- package/dist-pkg/core/contract.d.ts +143 -163
- package/dist-pkg/core/contract.js +223 -207
- package/dist-pkg/core/dom-query.d.ts +4 -4
- package/dist-pkg/core/dom-query.js +12 -20
- package/dist-pkg/core/entity.d.ts +62 -77
- package/dist-pkg/core/entity.js +18 -32
- package/dist-pkg/core/escape-html.d.ts +9 -10
- package/dist-pkg/core/escape-html.js +16 -20
- package/dist-pkg/core/flash-threshold.d.ts +17 -0
- package/dist-pkg/core/flash-threshold.js +113 -0
- package/dist-pkg/core/game-speed.d.ts +11 -0
- package/dist-pkg/core/game-speed.js +16 -0
- package/dist-pkg/core/genres.d.ts +20 -0
- package/dist-pkg/core/genres.js +44 -0
- package/dist-pkg/core/i18n.d.ts +87 -41
- package/dist-pkg/core/i18n.js +206 -153
- package/dist-pkg/core/loop.d.ts +17 -6
- package/dist-pkg/core/loop.js +26 -26
- package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
- package/dist-pkg/core/pause-icon-catalogue.js +54 -0
- package/dist-pkg/core/ring.d.ts +17 -0
- package/dist-pkg/core/ring.js +29 -0
- package/dist-pkg/core/rng.d.ts +7 -12
- package/dist-pkg/core/rng.js +23 -53
- package/dist-pkg/core/route.d.ts +26 -26
- package/dist-pkg/core/route.js +126 -121
- package/dist-pkg/core/scenes.d.ts +37 -40
- package/dist-pkg/core/scenes.js +41 -43
- package/dist-pkg/core/screens.d.ts +4 -4
- package/dist-pkg/core/screens.js +11 -16
- package/dist-pkg/core/setting-defaults.d.ts +61 -0
- package/dist-pkg/core/setting-defaults.js +66 -0
- package/dist-pkg/core/speech-rate.d.ts +29 -0
- package/dist-pkg/core/speech-rate.js +47 -0
- package/dist-pkg/core/state.d.ts +118 -118
- package/dist-pkg/core/state.js +322 -297
- package/dist-pkg/core/visual-cycles.d.ts +30 -0
- package/dist-pkg/core/visual-cycles.js +52 -0
- package/dist-pkg/core/visual-state.d.ts +13 -0
- package/dist-pkg/core/visual-state.js +6 -0
- package/dist-pkg/educational/activities-registry.d.ts +1 -1
- package/dist-pkg/educational/activities-registry.js +9 -8
- package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
- package/dist-pkg/educational/adaptive-engine.js +17 -17
- package/dist-pkg/educational/segment-bar.d.ts +12 -12
- package/dist-pkg/educational/segment-bar.js +9 -9
- package/dist-pkg/i18n/en.js +321 -215
- package/dist-pkg/i18n/es.js +320 -215
- package/dist-pkg/i18n/pt.js +342 -215
- package/dist-pkg/input/default-bindings.d.ts +37 -38
- package/dist-pkg/input/default-bindings.js +127 -144
- package/dist-pkg/input/devices.d.ts +7 -7
- package/dist-pkg/input/devices.js +17 -16
- package/dist-pkg/input/edges.d.ts +23 -32
- package/dist-pkg/input/edges.js +23 -28
- package/dist-pkg/input/empathy-filter.d.ts +22 -0
- package/dist-pkg/input/empathy-filter.js +34 -0
- package/dist-pkg/input/face-map.d.ts +96 -0
- package/dist-pkg/input/face-map.js +255 -0
- package/dist-pkg/input/face-signals.d.ts +40 -0
- package/dist-pkg/input/face-signals.js +48 -0
- package/dist-pkg/input/gamepad.d.ts +164 -145
- package/dist-pkg/input/gamepad.js +351 -559
- package/dist-pkg/input/gaze-cycle.d.ts +64 -0
- package/dist-pkg/input/gaze-cycle.js +133 -0
- package/dist-pkg/input/gaze-relative.d.ts +68 -0
- package/dist-pkg/input/gaze-relative.js +142 -0
- package/dist-pkg/input/hand-map.d.ts +28 -0
- package/dist-pkg/input/hand-map.js +142 -0
- package/dist-pkg/input/input-cooldown.d.ts +17 -0
- package/dist-pkg/input/input-cooldown.js +39 -0
- package/dist-pkg/input/keyboard-runtime.d.ts +18 -20
- package/dist-pkg/input/keyboard-runtime.js +23 -27
- package/dist-pkg/input/keyboard.d.ts +68 -62
- package/dist-pkg/input/keyboard.js +83 -105
- package/dist-pkg/input/keydown.d.ts +124 -132
- package/dist-pkg/input/keydown.js +283 -288
- package/dist-pkg/input/latch-edge.d.ts +25 -21
- package/dist-pkg/input/latch-edge.js +33 -35
- package/dist-pkg/input/latch-scope.d.ts +43 -47
- package/dist-pkg/input/latch-scope.js +66 -75
- package/dist-pkg/input/latch-store.d.ts +28 -29
- package/dist-pkg/input/latch-store.js +44 -47
- package/dist-pkg/input/latch-sync.d.ts +28 -29
- package/dist-pkg/input/latch-sync.js +25 -25
- package/dist-pkg/input/latch.d.ts +14 -17
- package/dist-pkg/input/latch.js +29 -37
- package/dist-pkg/input/pad-defaults.d.ts +13 -16
- package/dist-pkg/input/pad-defaults.js +21 -28
- package/dist-pkg/input/pad-reading.d.ts +76 -0
- package/dist-pkg/input/pad-reading.js +164 -0
- package/dist-pkg/input/pad-wizard.d.ts +96 -0
- package/dist-pkg/input/pad-wizard.js +205 -0
- package/dist-pkg/input/pointer-space.d.ts +19 -20
- package/dist-pkg/input/pointer-space.js +27 -32
- package/dist-pkg/input/pointer.d.ts +39 -40
- package/dist-pkg/input/pointer.js +42 -45
- package/dist-pkg/input/state.d.ts +101 -89
- package/dist-pkg/input/state.js +54 -134
- package/dist-pkg/input/switch-scan.d.ts +42 -0
- package/dist-pkg/input/switch-scan.js +54 -0
- package/dist-pkg/input/synthetic-source.d.ts +42 -0
- package/dist-pkg/input/synthetic-source.js +57 -0
- package/dist-pkg/input/touch-bindings.d.ts +127 -113
- package/dist-pkg/input/touch-bindings.js +158 -173
- package/dist-pkg/input/touch.d.ts +130 -70
- package/dist-pkg/input/touch.js +321 -123
- package/dist-pkg/input/transport-in-use.d.ts +107 -0
- package/dist-pkg/input/transport-in-use.js +130 -0
- package/dist-pkg/input/transports.d.ts +96 -114
- package/dist-pkg/input/transports.js +104 -106
- package/dist-pkg/input/virtual-controller.d.ts +46 -0
- package/dist-pkg/input/virtual-controller.js +41 -0
- package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
- package/dist-pkg/input/vocabulary-migration.js +80 -79
- package/dist-pkg/input/voice-map.d.ts +43 -0
- package/dist-pkg/input/voice-map.js +125 -0
- package/dist-pkg/platform/audio-ambient.d.ts +13 -1
- package/dist-pkg/platform/audio-ambient.js +11 -13
- package/dist-pkg/platform/audio-earcons.d.ts +20 -19
- package/dist-pkg/platform/audio-earcons.js +51 -42
- package/dist-pkg/platform/audio-jingles.js +9 -10
- package/dist-pkg/platform/audio-mixer.d.ts +14 -2
- package/dist-pkg/platform/audio-mixer.js +36 -39
- package/dist-pkg/platform/audio-sonar.d.ts +96 -113
- package/dist-pkg/platform/audio-sonar.js +245 -238
- package/dist-pkg/platform/audio.d.ts +53 -19
- package/dist-pkg/platform/audio.js +161 -169
- package/dist-pkg/platform/flash-sampler.d.ts +19 -0
- package/dist-pkg/platform/flash-sampler.js +79 -0
- package/dist-pkg/platform/guide-intensity.d.ts +26 -27
- package/dist-pkg/platform/guide-intensity.js +50 -52
- package/dist-pkg/platform/heavy-catalogue.d.ts +31 -0
- package/dist-pkg/platform/heavy-catalogue.js +223 -0
- package/dist-pkg/platform/heavy-mirror.d.ts +26 -0
- package/dist-pkg/platform/heavy-mirror.js +76 -0
- package/dist-pkg/platform/heavy.d.ts +104 -0
- package/dist-pkg/platform/heavy.js +169 -0
- package/dist-pkg/platform/interruptible-speech.d.ts +16 -16
- package/dist-pkg/platform/interruptible-speech.js +50 -51
- package/dist-pkg/platform/kokoro-port.d.ts +27 -0
- package/dist-pkg/platform/kokoro-port.js +50 -0
- package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
- package/dist-pkg/platform/kokoro-runtime.js +52 -0
- package/dist-pkg/platform/kokoro.d.ts +70 -0
- package/dist-pkg/platform/kokoro.js +133 -0
- package/dist-pkg/platform/listener-scope.d.ts +12 -0
- package/dist-pkg/platform/listener-scope.js +81 -0
- package/dist-pkg/platform/locale-host.d.ts +10 -0
- package/dist-pkg/platform/locale-host.js +34 -0
- package/dist-pkg/platform/microphone.d.ts +51 -0
- package/dist-pkg/platform/microphone.js +118 -0
- package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
- package/dist-pkg/platform/onnx-runtime.js +42 -0
- package/dist-pkg/platform/reading-in-worker.d.ts +40 -0
- package/dist-pkg/platform/reading-in-worker.js +87 -0
- package/dist-pkg/platform/reading-model.d.ts +73 -0
- package/dist-pkg/platform/reading-model.js +247 -0
- package/dist-pkg/platform/reading-runtime.d.ts +24 -0
- package/dist-pkg/platform/reading-runtime.js +159 -0
- package/dist-pkg/platform/reading-worker.d.ts +41 -0
- package/dist-pkg/platform/reading-worker.js +58 -0
- package/dist-pkg/platform/reading.d.ts +69 -0
- package/dist-pkg/platform/reading.js +128 -0
- package/dist-pkg/platform/speech-recognition.d.ts +51 -0
- package/dist-pkg/platform/speech-recognition.js +84 -0
- package/dist-pkg/platform/speech.d.ts +14 -1
- package/dist-pkg/platform/speech.js +13 -13
- package/dist-pkg/platform/storage-keys.d.ts +96 -0
- package/dist-pkg/platform/storage-keys.js +106 -0
- package/dist-pkg/platform/storage.d.ts +46 -111
- package/dist-pkg/platform/storage.js +104 -169
- package/dist-pkg/platform/tts.d.ts +51 -38
- package/dist-pkg/platform/tts.js +217 -119
- package/dist-pkg/platform/vision-loop.d.ts +23 -0
- package/dist-pkg/platform/vision-loop.js +56 -0
- package/dist-pkg/platform/vision.d.ts +132 -0
- package/dist-pkg/platform/vision.js +117 -0
- package/dist-pkg/platform/voice-listener.d.ts +36 -0
- package/dist-pkg/platform/voice-listener.js +88 -0
- package/dist-pkg/platform/voice-plan.d.ts +6 -102
- package/dist-pkg/platform/voice-plan.js +9 -151
- package/dist-pkg/platform/vosk-runtime.d.ts +71 -0
- package/dist-pkg/platform/vosk-runtime.js +93 -0
- package/dist-pkg/render/canvas.d.ts +13 -7
- package/dist-pkg/render/canvas.js +13 -13
- package/dist-pkg/render/crt.d.ts +46 -12
- package/dist-pkg/render/crt.js +82 -80
- package/dist-pkg/render/cvd-matrices.d.ts +18 -18
- package/dist-pkg/render/cvd-matrices.js +33 -38
- package/dist-pkg/render/hc-role-data.d.ts +7 -7
- package/dist-pkg/render/hc-role-data.js +14 -14
- package/dist-pkg/render/high-contrast.d.ts +66 -54
- package/dist-pkg/render/high-contrast.js +221 -216
- package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
- package/dist-pkg/render/low-vision-drawing.js +46 -0
- package/dist-pkg/render/lq-filter.d.ts +32 -20
- package/dist-pkg/render/lq-filter.js +59 -65
- package/dist-pkg/render/port.d.ts +86 -88
- package/dist-pkg/render/port.js +17 -23
- package/dist-pkg/render/screen-pipeline.d.ts +42 -42
- package/dist-pkg/render/screen-pipeline.js +80 -87
- package/dist-pkg/render/sprite-fx.d.ts +2 -1
- package/dist-pkg/render/sprite-fx.js +16 -14
- package/dist-pkg/render/viewports.d.ts +20 -15
- package/dist-pkg/render/viewports.js +83 -114
- package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
- package/dist-pkg/render/viz-axes-labels.js +88 -0
- package/dist-pkg/render/viz-axes.d.ts +80 -86
- package/dist-pkg/render/viz-axes.js +115 -116
- package/dist-pkg/render/viz-modes.d.ts +28 -29
- package/dist-pkg/render/viz-modes.js +40 -45
- package/dist-pkg/render/viz-refusal.d.ts +32 -0
- package/dist-pkg/render/viz-refusal.js +57 -0
- package/dist-pkg/render/viz-setters.d.ts +104 -66
- package/dist-pkg/render/viz-setters.js +182 -191
- package/dist-pkg/ui/aac-sets.d.ts +40 -0
- package/dist-pkg/ui/aac-sets.js +49 -0
- package/dist-pkg/ui/audio-choices.d.ts +63 -0
- package/dist-pkg/ui/audio-choices.js +94 -0
- package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
- package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
- package/dist-pkg/ui/camera-control.d.ts +6 -0
- package/dist-pkg/ui/camera-control.js +14 -0
- package/dist-pkg/ui/changed-mark.d.ts +9 -8
- package/dist-pkg/ui/changed-mark.js +22 -53
- package/dist-pkg/ui/control-choices.d.ts +37 -0
- package/dist-pkg/ui/control-choices.js +84 -0
- package/dist-pkg/ui/debug-panel.d.ts +59 -43
- package/dist-pkg/ui/debug-panel.js +68 -69
- package/dist-pkg/ui/dom.d.ts +10 -14
- package/dist-pkg/ui/dom.js +10 -47
- package/dist-pkg/ui/drawing-problems.d.ts +25 -0
- package/dist-pkg/ui/drawing-problems.js +93 -0
- package/dist-pkg/ui/eye-control.d.ts +36 -0
- package/dist-pkg/ui/eye-control.js +178 -0
- package/dist-pkg/ui/face-control.d.ts +25 -0
- package/dist-pkg/ui/face-control.js +183 -0
- package/dist-pkg/ui/focus-trap.d.ts +39 -49
- package/dist-pkg/ui/focus-trap.js +56 -65
- package/dist-pkg/ui/fonts.d.ts +118 -63
- package/dist-pkg/ui/fonts.js +267 -111
- package/dist-pkg/ui/game-options.d.ts +42 -0
- package/dist-pkg/ui/game-options.js +138 -0
- package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
- package/dist-pkg/ui/gaze-overlay.js +165 -0
- package/dist-pkg/ui/hand-control.d.ts +25 -0
- package/dist-pkg/ui/hand-control.js +143 -0
- package/dist-pkg/ui/help-panel.d.ts +76 -0
- package/dist-pkg/ui/help-panel.js +232 -0
- package/dist-pkg/ui/hud-bands.d.ts +45 -0
- package/dist-pkg/ui/hud-bands.js +108 -0
- package/dist-pkg/ui/hud.d.ts +73 -70
- package/dist-pkg/ui/hud.js +94 -98
- package/dist-pkg/ui/item-announcement.d.ts +13 -12
- package/dist-pkg/ui/item-announcement.js +25 -26
- package/dist-pkg/ui/latch-refusal.d.ts +22 -21
- package/dist-pkg/ui/latch-refusal.js +37 -37
- package/dist-pkg/ui/layout.d.ts +103 -28
- package/dist-pkg/ui/layout.js +114 -99
- package/dist-pkg/ui/locale-flags.d.ts +16 -0
- package/dist-pkg/ui/locale-flags.js +30 -0
- package/dist-pkg/ui/loop-crash.d.ts +17 -17
- package/dist-pkg/ui/loop-crash.js +33 -62
- package/dist-pkg/ui/menu-intent.d.ts +32 -0
- package/dist-pkg/ui/menu-intent.js +54 -0
- package/dist-pkg/ui/menu-items.d.ts +10 -0
- package/dist-pkg/ui/menu-items.js +22 -0
- package/dist-pkg/ui/menu-nav.d.ts +60 -90
- package/dist-pkg/ui/menu-nav.js +301 -274
- package/dist-pkg/ui/mobility-choices.d.ts +26 -0
- package/dist-pkg/ui/mobility-choices.js +41 -0
- package/dist-pkg/ui/motion-choices.d.ts +31 -0
- package/dist-pkg/ui/motion-choices.js +68 -0
- package/dist-pkg/ui/motion-scene.d.ts +24 -19
- package/dist-pkg/ui/motion-scene.js +29 -61
- package/dist-pkg/ui/mount-panel.d.ts +81 -0
- package/dist-pkg/ui/mount-panel.js +61 -0
- package/dist-pkg/ui/panel-shell.d.ts +65 -31
- package/dist-pkg/ui/panel-shell.js +92 -66
- package/dist-pkg/ui/panel-widgets.d.ts +116 -0
- package/dist-pkg/ui/panel-widgets.js +208 -0
- package/dist-pkg/ui/pause-buttons.d.ts +35 -0
- package/dist-pkg/ui/pause-buttons.js +66 -0
- package/dist-pkg/ui/pause-icons.d.ts +249 -351
- package/dist-pkg/ui/pause-icons.js +614 -605
- package/dist-pkg/ui/pause-markup.d.ts +86 -0
- package/dist-pkg/ui/pause-markup.js +125 -0
- package/dist-pkg/ui/reach-notice.d.ts +22 -23
- package/dist-pkg/ui/reach-notice.js +55 -58
- package/dist-pkg/ui/scan-overlay.d.ts +23 -0
- package/dist-pkg/ui/scan-overlay.js +42 -0
- package/dist-pkg/ui/settings-aac.d.ts +68 -0
- package/dist-pkg/ui/settings-aac.js +189 -0
- package/dist-pkg/ui/settings-audio.d.ts +91 -113
- package/dist-pkg/ui/settings-audio.js +407 -405
- package/dist-pkg/ui/settings-controls.d.ts +53 -92
- package/dist-pkg/ui/settings-controls.js +143 -215
- package/dist-pkg/ui/settings-empathy.d.ts +39 -30
- package/dist-pkg/ui/settings-empathy.js +53 -60
- package/dist-pkg/ui/settings-mobility.d.ts +195 -0
- package/dist-pkg/ui/settings-mobility.js +374 -0
- package/dist-pkg/ui/settings-motion.d.ts +91 -70
- package/dist-pkg/ui/settings-motion.js +287 -198
- package/dist-pkg/ui/settings-panel.d.ts +48 -45
- package/dist-pkg/ui/settings-panel.js +164 -93
- package/dist-pkg/ui/settings-typo.d.ts +28 -76
- package/dist-pkg/ui/settings-typo.js +145 -125
- package/dist-pkg/ui/settings-visual.d.ts +29 -87
- package/dist-pkg/ui/settings-visual.js +240 -193
- package/dist-pkg/ui/shell.d.ts +113 -134
- package/dist-pkg/ui/shell.js +143 -216
- package/dist-pkg/ui/simulation-list.d.ts +27 -0
- package/dist-pkg/ui/simulation-list.js +76 -0
- package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
- package/dist-pkg/ui/simulation-over-the-world.js +131 -0
- package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
- package/dist-pkg/ui/simulation-refusal.js +8 -56
- package/dist-pkg/ui/switchable-control.d.ts +11 -0
- package/dist-pkg/ui/switchable-control.js +19 -0
- package/dist-pkg/ui/title.d.ts +4 -4
- package/dist-pkg/ui/title.js +11 -13
- package/dist-pkg/ui/top-band.d.ts +24 -0
- package/dist-pkg/ui/top-band.js +100 -0
- package/dist-pkg/ui/typo-choices.d.ts +71 -0
- package/dist-pkg/ui/typo-choices.js +84 -0
- package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
- package/dist-pkg/ui/visual-axes-panel.js +12 -94
- package/dist-pkg/ui/visual-choices.d.ts +77 -0
- package/dist-pkg/ui/visual-choices.js +107 -0
- package/dist-pkg/ui/vlibras.d.ts +33 -10
- package/dist-pkg/ui/vlibras.js +58 -81
- package/dist-pkg/ui/voice-control.d.ts +46 -0
- package/dist-pkg/ui/voice-control.js +143 -0
- package/dist-pkg/ui/voice-settings.d.ts +96 -0
- package/dist-pkg/ui/voice-settings.js +302 -0
- package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
- package/dist-pkg/ui/where-the-child-is.js +70 -0
- package/docs/CREDITS.md +198 -54
- package/docs/LICENSES.md +160 -145
- package/package.json +24 -25
- package/scripts/heavy-into-the-delivery.mjs +144 -0
- package/scripts/licences/Apache-2.0.txt +176 -0
- package/scripts/licences/GPL-3.0.txt +674 -0
- package/scripts/licences/MIT.txt +17 -0
- package/scripts/licences/third-party.mjs +287 -0
- package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
- package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
- package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
- package/dist-pkg/core/anel.d.ts +0 -17
- package/dist-pkg/core/anel.js +0 -31
- package/dist-pkg/core/collision.d.ts +0 -21
- package/dist-pkg/core/collision.js +0 -62
- package/dist-pkg/core/layers.d.ts +0 -63
- package/dist-pkg/core/layers.js +0 -95
- package/dist-pkg/core/letter-grid.d.ts +0 -55
- package/dist-pkg/core/letter-grid.js +0 -116
- package/dist-pkg/core/password.d.ts +0 -34
- package/dist-pkg/core/password.js +0 -205
- package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
- package/dist-pkg/core/rotulo-acessivel.js +0 -41
- package/dist-pkg/core/run-state.d.ts +0 -115
- package/dist-pkg/core/run-state.js +0 -40
- package/dist-pkg/core/tiles.d.ts +0 -12
- package/dist-pkg/core/tiles.js +0 -61
- package/dist-pkg/core/world.d.ts +0 -4
- package/dist-pkg/core/world.js +0 -58
- package/dist-pkg/input/origem-sintetica.d.ts +0 -44
- package/dist-pkg/input/origem-sintetica.js +0 -60
- package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
- package/dist-pkg/input/transporte-em-uso.js +0 -130
- package/dist-pkg/platform/audio-nav.d.ts +0 -51
- package/dist-pkg/platform/audio-nav.js +0 -99
- package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
- package/dist-pkg/platform/pesados-catalogo.js +0 -177
- package/dist-pkg/platform/pesados.d.ts +0 -31
- package/dist-pkg/platform/pesados.js +0 -75
- package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
- package/dist-pkg/platform/vozes-prontas.js +0 -61
- package/dist-pkg/render/camera.d.ts +0 -58
- package/dist-pkg/render/camera.js +0 -105
- package/dist-pkg/render/cenario-data.d.ts +0 -127
- package/dist-pkg/render/cenario-data.js +0 -145
- package/dist-pkg/render/city-tex.d.ts +0 -63
- package/dist-pkg/render/city-tex.js +0 -228
- package/dist-pkg/render/city-tiles.d.ts +0 -11
- package/dist-pkg/render/city-tiles.js +0 -140
- package/dist-pkg/render/draw.d.ts +0 -149
- package/dist-pkg/render/draw.js +0 -231
- package/dist-pkg/render/fx.d.ts +0 -63
- package/dist-pkg/render/fx.js +0 -123
- package/dist-pkg/render/minimap.d.ts +0 -11
- package/dist-pkg/render/minimap.js +0 -94
- package/dist-pkg/render/parallax.d.ts +0 -85
- package/dist-pkg/render/parallax.js +0 -158
- package/dist-pkg/render/player-anim.d.ts +0 -71
- package/dist-pkg/render/player-anim.js +0 -152
- package/dist-pkg/render/recycling-tex.d.ts +0 -48
- package/dist-pkg/render/recycling-tex.js +0 -164
- package/dist-pkg/render/scene-city.d.ts +0 -77
- package/dist-pkg/render/scene-city.js +0 -181
- package/dist-pkg/render/scene-parallax.d.ts +0 -72
- package/dist-pkg/render/scene-parallax.js +0 -426
- package/dist-pkg/render/scene-sky.d.ts +0 -126
- package/dist-pkg/render/scene-sky.js +0 -295
- package/dist-pkg/render/set-cenario.d.ts +0 -54
- package/dist-pkg/render/set-cenario.js +0 -103
- package/dist-pkg/render/textures.d.ts +0 -75
- package/dist-pkg/render/textures.js +0 -240
- package/dist-pkg/render/title-scene.d.ts +0 -46
- package/dist-pkg/render/title-scene.js +0 -75
- package/dist-pkg/render/weather.d.ts +0 -96
- package/dist-pkg/render/weather.js +0 -171
- package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
- package/dist-pkg/render/wheelchair-sprites.js +0 -69
- package/dist-pkg/render/world-tex.d.ts +0 -18
- package/dist-pkg/render/world-tex.js +0 -87
- package/dist-pkg/ui/activities-menu.d.ts +0 -258
- package/dist-pkg/ui/activities-menu.js +0 -648
- package/dist-pkg/ui/caa-sets.d.ts +0 -39
- package/dist-pkg/ui/caa-sets.js +0 -65
- package/dist-pkg/ui/map-hub.d.ts +0 -56
- package/dist-pkg/ui/map-hub.js +0 -138
- package/dist-pkg/ui/settings-caa.d.ts +0 -45
- package/dist-pkg/ui/settings-caa.js +0 -137
- package/dist-pkg/ui/settings-motor.d.ts +0 -175
- package/dist-pkg/ui/settings-motor.js +0 -342
- package/dist-pkg/ui/webcam.d.ts +0 -7
- package/dist-pkg/ui/webcam.js +0 -93
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import { controlRow, mountSteps, updateSteps, nextStep } from './panel-widgets.js';
|
|
3
|
+
import { toggleLabel } from './dom.js';
|
|
4
|
+
const KINDS = ['steps', 'list', 'switch'];
|
|
5
|
+
/** ADR-0130 erratum, rule 3: steps cycle among FEW positions — up to five; past that, a list. */
|
|
6
|
+
const MAX_STEPS = 5;
|
|
7
|
+
/** Why a `gameOptions` declaration is malformed; empty when it is well formed. Absent is well formed: no options of its own. */
|
|
8
|
+
export function gameOptionsProblems(options) {
|
|
9
|
+
if (options === undefined)
|
|
10
|
+
return [];
|
|
11
|
+
if (!Array.isArray(options))
|
|
12
|
+
return ['gameOptions must be a list of rows'];
|
|
13
|
+
// a repeated id is only wrong the second time, so the ids seen so far travel from row to row
|
|
14
|
+
const ids = new Set();
|
|
15
|
+
return options.flatMap((o, i) => rowProblems(o, `gameOptions[${i}]`, ids));
|
|
16
|
+
}
|
|
17
|
+
/** What is wrong with one row, in the order a reader of the declaration meets it: the row, its id, its fields, its positions. */
|
|
18
|
+
function rowProblems(o, at, ids) {
|
|
19
|
+
if (!o || typeof o !== 'object')
|
|
20
|
+
return [`${at} must be a row`];
|
|
21
|
+
const out = [...idProblems(o, at, ids), ...FIELD_CHECKS.filter(([holds]) => !holds(o)).map(([, says]) => `${at}.${says}`)];
|
|
22
|
+
if (o.kind === 'steps' || o.kind === 'list')
|
|
23
|
+
out.push(...valuesProblems(o, at));
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
function idProblems(o, at, ids) {
|
|
27
|
+
if (typeof o.id !== 'string' || !o.id.trim())
|
|
28
|
+
return [`${at}.id must name the row`];
|
|
29
|
+
if (ids.has(o.id))
|
|
30
|
+
return [`${at}.id «${o.id}» repeats an earlier row's`];
|
|
31
|
+
ids.add(o.id);
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
/** Each field a row must have, and what is said when it does not: a row comes from outside the engine, so its TYPE is checked. */
|
|
35
|
+
const FIELD_CHECKS = [
|
|
36
|
+
[(o) => KINDS.includes(o.kind), `kind must be one of ${KINDS.join(', ')}`],
|
|
37
|
+
[(o) => typeof o.label === 'string' && !!o.label.trim(), "label must say what the row is, in the game's words"],
|
|
38
|
+
[(o) => o.hint === undefined || typeof o.hint === 'string', 'hint must be text'],
|
|
39
|
+
[(o) => typeof o.read === 'function', 'read must be a function returning the value in use'],
|
|
40
|
+
[(o) => typeof o.write === 'function', 'write must be a function taking the new value'],
|
|
41
|
+
];
|
|
42
|
+
/** The positions of a steps or list row: at least two, at most five for steps, each with a value and a label, none repeated. */
|
|
43
|
+
function valuesProblems(o, at) {
|
|
44
|
+
const values = o.values;
|
|
45
|
+
if (!Array.isArray(values) || values.length < 2)
|
|
46
|
+
return [`${at}.values must hold at least two positions`];
|
|
47
|
+
const out = o.kind === 'steps' && values.length > MAX_STEPS
|
|
48
|
+
? [`${at}.values holds ${values.length} steps: steps hold at most five positions — past that, declare a list (ADR-0130)`] : [];
|
|
49
|
+
const seen = new Set();
|
|
50
|
+
values.forEach((v, j) => {
|
|
51
|
+
const problem = positionProblem(v, `${at}.values[${j}]`, seen);
|
|
52
|
+
if (problem)
|
|
53
|
+
out.push(problem);
|
|
54
|
+
});
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
function positionProblem(v, at, seen) {
|
|
58
|
+
if (!v || typeof v.value !== 'string' || typeof v.label !== 'string' || !v.label.trim())
|
|
59
|
+
return `${at} must have a value and a label`;
|
|
60
|
+
if (seen.has(v.value))
|
|
61
|
+
return `${at} «${v.value}» repeats an earlier position`;
|
|
62
|
+
seen.add(v.value);
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Draws the rows into `list`, replacing what was there — the rows are the CURRENT cartridge's, and `mount()` may have
|
|
67
|
+
* swapped it (ADR-0142). Every value shown is READ from the cartridge, at drawing and after each write.
|
|
68
|
+
*/
|
|
69
|
+
export function drawGameOptions(ctx, list, options) {
|
|
70
|
+
const { t } = ctx;
|
|
71
|
+
while (list.firstChild)
|
|
72
|
+
list.removeChild(list.firstChild); // node by node: no markup sink, and a host without `replaceChildren` still clears
|
|
73
|
+
for (const o of options) {
|
|
74
|
+
const id = `game-option-${o.id}`;
|
|
75
|
+
if (o.kind === 'switch') {
|
|
76
|
+
const { row: rowNode, control: switchButton } = controlRow(ctx, { id, label: o.label, hint: o.hint });
|
|
77
|
+
const reflect = () => {
|
|
78
|
+
const on = o.read();
|
|
79
|
+
switchButton.classList.toggle('is-on', on);
|
|
80
|
+
switchButton.setAttribute('aria-pressed', String(on));
|
|
81
|
+
switchButton.textContent = toggleLabel(t, on);
|
|
82
|
+
return on;
|
|
83
|
+
};
|
|
84
|
+
reflect();
|
|
85
|
+
switchButton.addEventListener('click', () => {
|
|
86
|
+
o.write(!o.read());
|
|
87
|
+
ctx.say(`${o.label}: ${toggleLabel(t, reflect())}`);
|
|
88
|
+
});
|
|
89
|
+
list.appendChild(rowNode);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const labelOf = (chosen) => o.values.find((v) => v.value === chosen)?.label ?? chosen;
|
|
93
|
+
if (o.kind === 'list') {
|
|
94
|
+
const { row: rowNode, control: control } = controlRow(ctx, { id, label: o.label, hint: o.hint, shape: 'escolha' });
|
|
95
|
+
const sel = control;
|
|
96
|
+
for (const v of o.values) {
|
|
97
|
+
const op = ctx.create('option');
|
|
98
|
+
op.value = v.value;
|
|
99
|
+
op.textContent = v.label;
|
|
100
|
+
sel.appendChild(op);
|
|
101
|
+
}
|
|
102
|
+
sel.value = o.read();
|
|
103
|
+
sel.addEventListener('change', () => {
|
|
104
|
+
o.write(sel.value);
|
|
105
|
+
sel.value = o.read();
|
|
106
|
+
ctx.say(`${o.label}: ${labelOf(sel.value)}`);
|
|
107
|
+
});
|
|
108
|
+
list.appendChild(rowNode);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
// steps: the row IS the control, «◀ Label: value ▶» (ADR-0130 erratum); the hint rides in the row for the footer
|
|
112
|
+
const selectedIndex = () => Math.max(0, o.values.findIndex((v) => v.value === o.read()));
|
|
113
|
+
const spec = () => ({ label: o.label, values: o.values.map((v) => v.label), current: selectedIndex() });
|
|
114
|
+
const rowNode = ctx.create('div');
|
|
115
|
+
rowNode.className = 'ctrl-row ctrl-row--passos';
|
|
116
|
+
const envelope = ctx.create('span');
|
|
117
|
+
if (o.hint) {
|
|
118
|
+
const explanation = ctx.create('span');
|
|
119
|
+
explanation.className = 'opt-hint';
|
|
120
|
+
explanation.textContent = o.hint;
|
|
121
|
+
envelope.appendChild(explanation);
|
|
122
|
+
}
|
|
123
|
+
rowNode.appendChild(envelope);
|
|
124
|
+
const stepper = mountSteps(ctx, spec());
|
|
125
|
+
stepper.id = id;
|
|
126
|
+
rowNode.appendChild(stepper);
|
|
127
|
+
stepper.addEventListener('passo', (ev) => {
|
|
128
|
+
const currentIndex = selectedIndex();
|
|
129
|
+
const nextIndex = nextStep(currentIndex, o.values.length, ev.detail);
|
|
130
|
+
if (nextIndex === currentIndex)
|
|
131
|
+
return; // at the wall nothing moved, and nothing is said
|
|
132
|
+
o.write(o.values[nextIndex].value);
|
|
133
|
+
updateSteps(stepper, spec());
|
|
134
|
+
ctx.say(`${o.label}: ${labelOf(o.read())}`);
|
|
135
|
+
});
|
|
136
|
+
list.appendChild(rowNode);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Translate } from '../core/i18n.js';
|
|
3
|
+
import type { GazeZone } from '../input/gaze-relative.js';
|
|
4
|
+
import { type GazePreview } from '../input/gaze-cycle.js';
|
|
5
|
+
import type { EyeLines } from '../platform/vision.js';
|
|
6
|
+
export type GazeRegion = GazeZone | 'middle';
|
|
7
|
+
/** Centre x, centre y, width, height — fractions of the game region. */
|
|
8
|
+
export declare const GAZE_REGIONS: {
|
|
9
|
+
readonly [R in GazeRegion]: readonly [number, number, number, number];
|
|
10
|
+
};
|
|
11
|
+
export type ButtonShape = 'triangle' | 'circle' | 'cross' | 'square';
|
|
12
|
+
/** Each zone's face button: the Xbox letter and the PlayStation shape of the button on that side (ADR-0213 erratum: north is «Y»). */
|
|
13
|
+
export declare const FACE_BUTTON: {
|
|
14
|
+
readonly [Z in GazeZone]: readonly [string, ButtonShape];
|
|
15
|
+
};
|
|
16
|
+
export declare const SHOULDER: {
|
|
17
|
+
readonly [Z in GazeZone]: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Lucide `arrow-up`, `arrow-right`, `arrow-down`, `arrow-left`, 24×24 path data. Lucide's LICENSE lists these four as derived from Feather,
|
|
21
|
+
* so the notice they carry is Feather's MIT (Cole Bemis), not Lucide's ISC — credited in docs/CREDITS.md.
|
|
22
|
+
*/
|
|
23
|
+
export declare const LUCIDE_ARROWS: {
|
|
24
|
+
readonly [Z in GazeZone]: readonly string[];
|
|
25
|
+
};
|
|
26
|
+
export interface GazeView {
|
|
27
|
+
readonly zone: GazeZone | null;
|
|
28
|
+
readonly armed: boolean;
|
|
29
|
+
readonly preparing: boolean;
|
|
30
|
+
readonly preview: GazePreview | null;
|
|
31
|
+
readonly restReady: boolean;
|
|
32
|
+
/** While the rest is being measured: how long it still needs. */
|
|
33
|
+
readonly restLeftMs?: number;
|
|
34
|
+
}
|
|
35
|
+
export type RegionShows = {
|
|
36
|
+
readonly kind: 'nothing';
|
|
37
|
+
} | {
|
|
38
|
+
readonly kind: 'text';
|
|
39
|
+
readonly key: string;
|
|
40
|
+
} | {
|
|
41
|
+
readonly kind: 'arrow';
|
|
42
|
+
} | {
|
|
43
|
+
readonly kind: 'button';
|
|
44
|
+
} | {
|
|
45
|
+
readonly kind: 'shoulder';
|
|
46
|
+
readonly label: string;
|
|
47
|
+
};
|
|
48
|
+
export declare function whatRegionShows(region: GazeRegion, v: GazeView): RegionShows;
|
|
49
|
+
/** 16 px on a 720×360 game region, in proportion to it, bounded by the tighter side. */
|
|
50
|
+
export declare const gazeFontPx: (width: number, height: number) => number;
|
|
51
|
+
type Ctx = CanvasRenderingContext2D;
|
|
52
|
+
export interface GazeOverlayOptions {
|
|
53
|
+
/** The face of this frame, to highlight the eyes and brows. */
|
|
54
|
+
readonly face?: {
|
|
55
|
+
readonly landmarks: ReadonlyArray<{
|
|
56
|
+
readonly x: number;
|
|
57
|
+
readonly y: number;
|
|
58
|
+
}>;
|
|
59
|
+
readonly lines: EyeLines;
|
|
60
|
+
} | null;
|
|
61
|
+
}
|
|
62
|
+
/** Draws the five regions and the face's lines. is the root's translator (ADR-0232 D3): the regions' words are its keys. */
|
|
63
|
+
export declare function drawGazeOverlay(t: Translate, ctx: Ctx, width: number, height: number, view: GazeView, { face }?: GazeOverlayOptions): void;
|
|
64
|
+
export {};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// ui/gaze-overlay — HOW THE EYE CONTROL SHOWS ITSELF OVER THE GAME (ADR-0213 §6; issue #194).
|
|
3
|
+
//
|
|
4
|
+
// Five regions: four at the edges the eyes travel to, and the middle, where the child looks to measure the rest. A region says something
|
|
5
|
+
// only while the gaze is in it, so the text is always where the eyes already are:
|
|
6
|
+
// · a look that PREPARES (it did not come from the opposite side) says where to go now — up «go down!», right «go left!», and so on;
|
|
7
|
+
// · a look that came from the opposite side walks its cycle: «Loading...» (settling, and the cancel step) → the direction's Lucide arrow →
|
|
8
|
+
// the face button, as the Xbox letter and the PlayStation shape each inside a circle → the shoulder inside a square → round again;
|
|
9
|
+
// · the middle asks to be looked at, with the seconds left, while the rest is being measured.
|
|
10
|
+
// Text is 16 px on a 720×360 game region and grows with it. The regions are outlined, never hatched (ADR-0215: the 📷's eyes position);
|
|
11
|
+
// the eyes and brows are the landmark lines only — never the camera's picture (ADR-0212) — mirrored, so they move the way the child moves.
|
|
12
|
+
// What a region shows is decided by `whatRegionShows`, plain data; `drawGazeOverlay` only follows it. Places and colours: interface-log.
|
|
13
|
+
import { GAZE_GROUPS, CANCEL } from '../input/gaze-cycle.js';
|
|
14
|
+
/** Centre x, centre y, width, height — fractions of the game region. */
|
|
15
|
+
export const GAZE_REGIONS = {
|
|
16
|
+
up: [0.5, 0.1, 0.26, 0.18], right: [0.87, 0.5, 0.24, 0.24], down: [0.5, 0.9, 0.26, 0.18], left: [0.13, 0.5, 0.24, 0.24],
|
|
17
|
+
middle: [0.5, 0.5, 0.24, 0.26],
|
|
18
|
+
};
|
|
19
|
+
/** Each zone's face button: the Xbox letter and the PlayStation shape of the button on that side (ADR-0213 erratum: north is «Y»). */
|
|
20
|
+
export const FACE_BUTTON = {
|
|
21
|
+
up: ['Y', 'triangle'], right: ['B', 'circle'], down: ['A', 'cross'], left: ['X', 'square'],
|
|
22
|
+
};
|
|
23
|
+
export const SHOULDER = { up: 'R1', right: 'R2', down: 'L2', left: 'L1' };
|
|
24
|
+
/**
|
|
25
|
+
* Lucide `arrow-up`, `arrow-right`, `arrow-down`, `arrow-left`, 24×24 path data. Lucide's LICENSE lists these four as derived from Feather,
|
|
26
|
+
* so the notice they carry is Feather's MIT (Cole Bemis), not Lucide's ISC — credited in docs/CREDITS.md.
|
|
27
|
+
*/
|
|
28
|
+
export const LUCIDE_ARROWS = {
|
|
29
|
+
up: ['m5 12 7-7 7 7', 'M12 19V5'], right: ['M5 12h14', 'm12 5 7 7-7 7'], down: ['M12 5v14', 'm19 12-7 7-7-7'], left: ['m12 19-7-7 7-7', 'M19 12H5'],
|
|
30
|
+
};
|
|
31
|
+
const NOTHING = { kind: 'nothing' };
|
|
32
|
+
/**
|
|
33
|
+
* What a preview shows, by its place in the zone's group (`GAZE_GROUPS`): the direction, the face button, the shoulder. The
|
|
34
|
+
* ORDER is the group's, so a place the table has no row for — an item from another zone's group — shows nothing.
|
|
35
|
+
*/
|
|
36
|
+
const PREVIEW_SHOWS = [
|
|
37
|
+
() => ({ kind: 'arrow' }),
|
|
38
|
+
() => ({ kind: 'button' }),
|
|
39
|
+
(region) => ({ kind: 'shoulder', label: SHOULDER[region] }),
|
|
40
|
+
];
|
|
41
|
+
export function whatRegionShows(region, v) {
|
|
42
|
+
if (region === 'middle')
|
|
43
|
+
return v.restReady ? { kind: 'nothing' } : { kind: 'text', key: 'gaze.lookHere' };
|
|
44
|
+
if (region !== v.zone)
|
|
45
|
+
return { kind: 'nothing' };
|
|
46
|
+
if (!v.armed)
|
|
47
|
+
return v.preparing ? { kind: 'text', key: `gaze.prepare.${region}` } : { kind: 'nothing' };
|
|
48
|
+
if (!v.preview || v.preview.item === CANCEL)
|
|
49
|
+
return { kind: 'text', key: 'gaze.loading' };
|
|
50
|
+
const i = GAZE_GROUPS[region].indexOf(v.preview.item);
|
|
51
|
+
return PREVIEW_SHOWS[i]?.(region) ?? NOTHING;
|
|
52
|
+
}
|
|
53
|
+
/** 16 px on a 720×360 game region, in proportion to it, bounded by the tighter side. */
|
|
54
|
+
export const gazeFontPx = (width, height) => 16 * Math.min(width / 720, height / 360);
|
|
55
|
+
const FAINT = 'rgba(234,242,248,0.35)', PREPARE = '#ffd23f', ARMED = '#3ddc84', LINES = '#ffffff';
|
|
56
|
+
function shape(ctx, s, x, y, r) {
|
|
57
|
+
ctx.beginPath();
|
|
58
|
+
if (s === 'triangle') {
|
|
59
|
+
ctx.moveTo(x, y - r);
|
|
60
|
+
ctx.lineTo(x + r * 0.87, y + r * 0.5);
|
|
61
|
+
ctx.lineTo(x - r * 0.87, y + r * 0.5);
|
|
62
|
+
ctx.closePath();
|
|
63
|
+
}
|
|
64
|
+
else if (s === 'circle')
|
|
65
|
+
ctx.arc(x, y, r, 0, 2 * Math.PI);
|
|
66
|
+
else if (s === 'square')
|
|
67
|
+
ctx.rect(x - r * 0.75, y - r * 0.75, r * 1.5, r * 1.5);
|
|
68
|
+
else {
|
|
69
|
+
ctx.moveTo(x - r * 0.7, y - r * 0.7);
|
|
70
|
+
ctx.lineTo(x + r * 0.7, y + r * 0.7);
|
|
71
|
+
ctx.moveTo(x + r * 0.7, y - r * 0.7);
|
|
72
|
+
ctx.lineTo(x - r * 0.7, y + r * 0.7);
|
|
73
|
+
}
|
|
74
|
+
ctx.stroke();
|
|
75
|
+
}
|
|
76
|
+
/** Draws the five regions and the face's lines. is the root's translator (ADR-0232 D3): the regions' words are its keys. */
|
|
77
|
+
export function drawGazeOverlay(t, ctx, width, height, view, { face = null } = {}) {
|
|
78
|
+
ctx.clearRect(0, 0, width, height);
|
|
79
|
+
const f = gazeFontPx(width, height);
|
|
80
|
+
ctx.textAlign = 'center';
|
|
81
|
+
ctx.textBaseline = 'middle';
|
|
82
|
+
ctx.lineCap = 'round';
|
|
83
|
+
ctx.lineJoin = 'round';
|
|
84
|
+
for (const region of Object.keys(GAZE_REGIONS))
|
|
85
|
+
drawRegion(ctx, region, width, height, f, view, t);
|
|
86
|
+
if (face)
|
|
87
|
+
drawFaceLines(ctx, face, width, height, f);
|
|
88
|
+
}
|
|
89
|
+
/** One region: its outline — faint when it shows nothing, green when armed (never the middle), yellow otherwise — and what it shows. */
|
|
90
|
+
function drawRegion(ctx, region, width, height, f, view, say) {
|
|
91
|
+
const [fx, fy, fw, fh] = GAZE_REGIONS[region];
|
|
92
|
+
const w = fw * width, h = fh * height, cx = fx * width, cy = fy * height;
|
|
93
|
+
const shows = whatRegionShows(region, view);
|
|
94
|
+
const active = shows.kind !== 'nothing';
|
|
95
|
+
const colour = !active ? FAINT : view.armed && region !== 'middle' ? ARMED : PREPARE;
|
|
96
|
+
ctx.strokeStyle = colour;
|
|
97
|
+
ctx.lineWidth = active ? 3 : 1;
|
|
98
|
+
ctx.strokeRect(cx - w / 2, cy - h / 2, w, h);
|
|
99
|
+
ctx.fillStyle = colour;
|
|
100
|
+
ctx.lineWidth = Math.max(1.5, f / 8);
|
|
101
|
+
ctx.shadowColor = '#000';
|
|
102
|
+
ctx.shadowBlur = 4;
|
|
103
|
+
DRAW_SHOWS[shows.kind](ctx, { region, cx, cy, f }, shows, view, say);
|
|
104
|
+
ctx.shadowBlur = 0;
|
|
105
|
+
}
|
|
106
|
+
/** How each thing a region can show is drawn — one row per kind, so a new kind is a new row and a missing one does not compile. */
|
|
107
|
+
const DRAW_SHOWS = {
|
|
108
|
+
nothing: () => { },
|
|
109
|
+
// only the middle counts down, and its words step up to make room for the seconds
|
|
110
|
+
text: (ctx, { region, cx, cy, f }, shows, view, say) => {
|
|
111
|
+
const counting = region === 'middle' && view.restLeftMs !== undefined;
|
|
112
|
+
ctx.font = `bold ${f}px system-ui`;
|
|
113
|
+
ctx.fillText(say(shows.key), cx, counting ? cy - f * 0.7 : cy);
|
|
114
|
+
if (counting) {
|
|
115
|
+
ctx.font = `${f * 0.85}px system-ui`;
|
|
116
|
+
ctx.fillText(`${((view.restLeftMs ?? 0) / 1000).toFixed(1)} s`, cx, cy + f * 0.8);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
arrow: (ctx, { region, cx, cy, f }) => {
|
|
120
|
+
const side = f * 2.6;
|
|
121
|
+
ctx.save();
|
|
122
|
+
ctx.translate(cx - side / 2, cy - side / 2);
|
|
123
|
+
ctx.scale(side / 24, side / 24);
|
|
124
|
+
ctx.lineWidth = 2;
|
|
125
|
+
for (const d of LUCIDE_ARROWS[region])
|
|
126
|
+
ctx.stroke(new Path2D(d));
|
|
127
|
+
ctx.restore();
|
|
128
|
+
},
|
|
129
|
+
// the Xbox letter in one circle, the PlayStation shape in the other
|
|
130
|
+
button: (ctx, { region, cx, cy, f }) => {
|
|
131
|
+
const r = f * 1.15, dx = r * 1.35, [letter, s] = FACE_BUTTON[region];
|
|
132
|
+
ctx.beginPath();
|
|
133
|
+
ctx.arc(cx - dx, cy, r, 0, 2 * Math.PI);
|
|
134
|
+
ctx.stroke();
|
|
135
|
+
ctx.font = `bold ${f * 1.1}px system-ui`;
|
|
136
|
+
ctx.fillText(letter, cx - dx, cy + f * 0.05);
|
|
137
|
+
ctx.beginPath();
|
|
138
|
+
ctx.arc(cx + dx, cy, r, 0, 2 * Math.PI);
|
|
139
|
+
ctx.stroke();
|
|
140
|
+
shape(ctx, s, cx + dx, cy, r * 0.55);
|
|
141
|
+
},
|
|
142
|
+
shoulder: (ctx, { cx, cy, f }, shows) => {
|
|
143
|
+
const side = f * 2.4;
|
|
144
|
+
ctx.strokeRect(cx - side / 2, cy - side / 2, side, side);
|
|
145
|
+
ctx.font = `bold ${f * 1.05}px system-ui`;
|
|
146
|
+
ctx.fillText(shows.label, cx, cy + f * 0.05);
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
/** The eyes and brows from the landmarks, mirrored so they move the way the child moves; a line naming a missing landmark is skipped. */
|
|
150
|
+
function drawFaceLines(ctx, face, width, height, f) {
|
|
151
|
+
ctx.strokeStyle = LINES;
|
|
152
|
+
ctx.lineWidth = Math.max(2, f / 8);
|
|
153
|
+
ctx.shadowColor = '#000';
|
|
154
|
+
ctx.shadowBlur = 3;
|
|
155
|
+
for (const { start, end } of [...face.lines.eyes, ...face.lines.brows]) {
|
|
156
|
+
const a = face.landmarks[start], b = face.landmarks[end];
|
|
157
|
+
if (!a || !b)
|
|
158
|
+
continue;
|
|
159
|
+
ctx.beginPath();
|
|
160
|
+
ctx.moveTo((1 - a.x) * width, a.y * height);
|
|
161
|
+
ctx.lineTo((1 - b.x) * width, b.y * height);
|
|
162
|
+
ctx.stroke();
|
|
163
|
+
}
|
|
164
|
+
ctx.shadowBlur = 0;
|
|
165
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Translate } from '../core/i18n.js';
|
|
3
|
+
import type { VirtualController } from '../input/virtual-controller.js';
|
|
4
|
+
import { type HandTrackerLoad, type VisionDeps } from '../platform/vision.js';
|
|
5
|
+
import { type VisionLoopDeps } from '../platform/vision-loop.js';
|
|
6
|
+
import type { CameraFeed } from './eye-control.js';
|
|
7
|
+
import type { SwitchableControl } from './switchable-control.js';
|
|
8
|
+
export interface HandControlDeps {
|
|
9
|
+
/** Translates in the page's language — the root's translator (ADR-0232 D3). REQUIRED: text built from nowhere is a raw key. */
|
|
10
|
+
t: Translate;
|
|
11
|
+
readonly doc: Document;
|
|
12
|
+
readonly region: HTMLElement;
|
|
13
|
+
readonly base: string;
|
|
14
|
+
/** Whether a file is in the checked cache, handed to the tracker's loader (ADR-0232 D4: the root lends the cache). */
|
|
15
|
+
readonly hasFile: VisionDeps['hasFile'];
|
|
16
|
+
readonly loop: VisionLoopDeps;
|
|
17
|
+
readonly controller: VirtualController;
|
|
18
|
+
readonly say: (text: string) => void;
|
|
19
|
+
readonly alert: (text: string) => void;
|
|
20
|
+
readonly report: (line: string) => void;
|
|
21
|
+
readonly turnOff: () => void;
|
|
22
|
+
readonly openFeed: () => Promise<CameraFeed>;
|
|
23
|
+
readonly loadTracker?: (deps: VisionDeps) => Promise<HandTrackerLoad>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createHandControl(d: HandControlDeps): SwitchableControl;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// ui/hand-control — PLAYING WITH HAND GESTURES, PUT TOGETHER (ADR-0210, ADR-0206, ADR-0212 §2; issue #191).
|
|
3
|
+
//
|
|
4
|
+
// The camera and MediaPipe's Gesture Recognizer (platform/vision), the frame loop, the Dev's hands map (input/hand-map), the presses on the
|
|
5
|
+
// virtual controller with the source `gestos` (input/virtual-controller, ADR-0111), and the hands' lines over the game. The 📷 at its
|
|
6
|
+
// hands position drives it (ADR-0215): it reads the hand and draws its bones — never the camera's picture; any other position lets go.
|
|
7
|
+
// · No rest to measure: a gesture is a shape, not a movement from a rest, and presses once seen for 300 ms.
|
|
8
|
+
// · A frame with no hand lets go of every held action.
|
|
9
|
+
// · What cannot start is said, written once in `problems`, and puts the 📷 back to off.
|
|
10
|
+
import { gesturesSeen, createHandMapReader } from '../input/hand-map.js';
|
|
11
|
+
import { loadHandTracker } from '../platform/vision.js';
|
|
12
|
+
import { createVisionLoop } from '../platform/vision-loop.js';
|
|
13
|
+
import { gazeFontPx } from './gaze-overlay.js';
|
|
14
|
+
// 📌 THE SHAPE IS THE FAMILY'S (ADR-0221 step 7f): what this module returns is a SwitchableControl, not a fourth copy of it.
|
|
15
|
+
/** The hand's bones, mirrored so they move the way the child moves; a bone to a landmark the hand does not have is skipped. */
|
|
16
|
+
function drawBones(g, w, h, bones, hand) {
|
|
17
|
+
g.strokeStyle = '#ffffff';
|
|
18
|
+
g.lineWidth = Math.max(2, gazeFontPx(w, h) / 6);
|
|
19
|
+
g.shadowColor = '#000';
|
|
20
|
+
g.shadowBlur = 3;
|
|
21
|
+
for (const { start, end } of bones) {
|
|
22
|
+
const a = hand[start], b = hand[end];
|
|
23
|
+
if (!a || !b)
|
|
24
|
+
continue;
|
|
25
|
+
g.beginPath();
|
|
26
|
+
g.moveTo((1 - a.x) * w, a.y * h);
|
|
27
|
+
g.lineTo((1 - b.x) * w, b.y * h);
|
|
28
|
+
g.stroke();
|
|
29
|
+
}
|
|
30
|
+
g.shadowBlur = 0;
|
|
31
|
+
}
|
|
32
|
+
export function createHandControl(d) {
|
|
33
|
+
const { t } = d;
|
|
34
|
+
const loadTracker = d.loadTracker ?? loadHandTracker;
|
|
35
|
+
const said = new Set();
|
|
36
|
+
const once = (kind, line, spoken) => { if (!said.has(kind)) {
|
|
37
|
+
said.add(kind);
|
|
38
|
+
d.report(line);
|
|
39
|
+
} d.alert(spoken); };
|
|
40
|
+
let on = false, running = false, starting = null;
|
|
41
|
+
const current = () => on;
|
|
42
|
+
let tracker = null, feed = null, canvas = null;
|
|
43
|
+
let loop = null;
|
|
44
|
+
let read = createHandMapReader();
|
|
45
|
+
const held = new Set();
|
|
46
|
+
const releaseAll = () => { for (const a of held)
|
|
47
|
+
d.controller.release(a, 'gestos'); held.clear(); };
|
|
48
|
+
const frame = (ms) => {
|
|
49
|
+
if (!tracker || !feed || !canvas || !feed.ready())
|
|
50
|
+
return;
|
|
51
|
+
const det = tracker.detect(feed.frame, ms);
|
|
52
|
+
const hand = det?.landmarks?.[0];
|
|
53
|
+
const w = canvas.width = d.region.clientWidth, h = canvas.height = d.region.clientHeight;
|
|
54
|
+
const g = canvas.getContext('2d'); // setting the width above already cleared the layer
|
|
55
|
+
// a hand that leaves starts the reading over: one that flickers out for a frame must be held again when it comes back
|
|
56
|
+
if (!hand) {
|
|
57
|
+
releaseAll();
|
|
58
|
+
read = createHandMapReader();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// only the recognizer's TOP answer is a gesture; its «None» is a name the map does not know, and reads nothing
|
|
62
|
+
const names = (det?.gestures?.[0] ?? []).slice(0, 1).map((c) => c.categoryName);
|
|
63
|
+
holdExactly(new Set(read(ms, gesturesSeen(hand, names)).held));
|
|
64
|
+
drawBones(g, w, h, tracker.handLines, hand);
|
|
65
|
+
};
|
|
66
|
+
/** Hold exactly what the reading holds now: let go of what left it, press what joined it — once. */
|
|
67
|
+
const holdExactly = (now) => {
|
|
68
|
+
for (const a of held)
|
|
69
|
+
if (!now.has(a)) {
|
|
70
|
+
d.controller.release(a, 'gestos');
|
|
71
|
+
held.delete(a);
|
|
72
|
+
}
|
|
73
|
+
for (const a of now)
|
|
74
|
+
if (!held.has(a)) {
|
|
75
|
+
d.controller.press(a, 'gestos');
|
|
76
|
+
held.add(a);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const health = (hh, fps) => {
|
|
80
|
+
if (hh === 'stalled')
|
|
81
|
+
once('stalled', 'gesture control: a second without a camera frame — meanwhile the child\'s gestures command nothing; keep the tab in front and the camera free', t('sr.hands.stopped'));
|
|
82
|
+
if (hh === 'slow')
|
|
83
|
+
once('slow', `gesture control: ${fps} frames a second, under 8 — gestures are missed and the child may not be answered; close other heavy tabs or use a lighter device`, t('sr.hands.slow'));
|
|
84
|
+
};
|
|
85
|
+
const stop = () => {
|
|
86
|
+
loop?.stop();
|
|
87
|
+
loop = null;
|
|
88
|
+
releaseAll();
|
|
89
|
+
feed?.close();
|
|
90
|
+
feed = null;
|
|
91
|
+
tracker?.close();
|
|
92
|
+
tracker = null;
|
|
93
|
+
canvas?.remove();
|
|
94
|
+
canvas = null;
|
|
95
|
+
running = false;
|
|
96
|
+
};
|
|
97
|
+
const start = async () => {
|
|
98
|
+
const load = await loadTracker({ base: d.base, hasFile: d.hasFile });
|
|
99
|
+
if (!load.ok) {
|
|
100
|
+
once('files', `gesture control: ${load.missing.join(', ')} not on this device — the child cannot play with gestures; open the game once online so the install fetches them`, t('sr.hands.needsInternet'));
|
|
101
|
+
d.turnOff();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
feed = await d.openFeed();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
load.tracker.close();
|
|
109
|
+
once('camera', 'gesture control: the camera did not open — the child cannot play with gestures; allow the camera for this page, or plug one in', t('sr.hands.noCamera'));
|
|
110
|
+
d.turnOff();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
tracker = load.tracker;
|
|
114
|
+
canvas = d.doc.createElement('canvas');
|
|
115
|
+
canvas.className = 'hand-overlay';
|
|
116
|
+
canvas.setAttribute('aria-hidden', 'true');
|
|
117
|
+
Object.assign(canvas.style, { position: 'absolute', inset: '0', width: '100%', height: '100%', pointerEvents: 'none', zIndex: '5' });
|
|
118
|
+
d.region.appendChild(canvas);
|
|
119
|
+
read = createHandMapReader();
|
|
120
|
+
loop = createVisionLoop(d.loop, { onFrame: frame, onError: (e) => once('frame', `gesture control: a frame failed (${String(e)}) — the loop goes on, but a repeated failure means the child is not being read`, t('sr.hands.stopped')), onHealth: health });
|
|
121
|
+
running = true;
|
|
122
|
+
d.say(t('sr.hands.ready'));
|
|
123
|
+
loop.start();
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
async apply(next) {
|
|
127
|
+
on = next;
|
|
128
|
+
if (starting)
|
|
129
|
+
await starting;
|
|
130
|
+
if (!on) {
|
|
131
|
+
if (running)
|
|
132
|
+
stop();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (running)
|
|
136
|
+
return;
|
|
137
|
+
starting = start().finally(() => { starting = null; });
|
|
138
|
+
await starting;
|
|
139
|
+
if (!current() && running)
|
|
140
|
+
stop();
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import { type Action, type ActionPreset } from '../core/actions.js';
|
|
3
|
+
/** One line of the help table. `key` is `null` when this child's keyboard does not reach the position. */
|
|
4
|
+
export interface HelpRow {
|
|
5
|
+
readonly action: Action;
|
|
6
|
+
/** Already human-readable (`keyName`), or `null` — «this transport does not reach it» is information. */
|
|
7
|
+
readonly key: string | null;
|
|
8
|
+
/** The GAME's word. Never an identifier: a position without one produces no row at all. */
|
|
9
|
+
readonly word: string;
|
|
10
|
+
/** The game's own sentence for this position, when it declared one. */
|
|
11
|
+
readonly hint?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The help table for one seat.
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ WALKS `ACTIONS` AND NOT THE PRESET'S OWN KEYS, for the reason `presetActions` already carries: the
|
|
17
|
+
* canonical order is the one the child meets everywhere else — the remap screen, the pad wizard, the
|
|
18
|
+
* on-screen legend. A help screen ordered by whatever order the game happened to write its object in would
|
|
19
|
+
* teach a different order from every other surface.
|
|
20
|
+
*
|
|
21
|
+
* @param preset what this game declares — positions, words, hints.
|
|
22
|
+
* @param keysOf the codes bound to a position FOR THIS SEAT. `kbFor(seat)[action]`, so a child who remapped
|
|
23
|
+
* sees her own key. `null`/empty means the keyboard does not reach it.
|
|
24
|
+
* @param keyName code → readable label (`ui/settings-controls.keyName`), injected so this half stays pure.
|
|
25
|
+
*/
|
|
26
|
+
export declare function helpRows(preset: ActionPreset | null | undefined, keysOf: (a: Action) => readonly string[] | null | undefined, keyName: (code: string) => string): HelpRow[];
|
|
27
|
+
/** What the slide says where the keyboard reaches nothing. A KEY, not a sentence — the caller translates it. */
|
|
28
|
+
export declare const NO_KEY = "help.noKey";
|
|
29
|
+
/** What building the slide show needs from the document — injected, as the panel shell takes it. */
|
|
30
|
+
export interface SlideCtx {
|
|
31
|
+
readonly create: (tag: string) => HTMLElement;
|
|
32
|
+
}
|
|
33
|
+
/** The surface a «how to play» figure draws on, and the time in seconds since the slide showed (still under reduced motion). */
|
|
34
|
+
export interface HowToPlaySurface {
|
|
35
|
+
readonly ctx: CanvasRenderingContext2D;
|
|
36
|
+
readonly width: number;
|
|
37
|
+
readonly height: number;
|
|
38
|
+
readonly time: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* One «how to play» slide, declared by the cartridge (ADR-0195; issue #188): «O "Como jogar" é justamente algo a ser feito pelo
|
|
42
|
+
* cartucho.» The text is resolved at every showing, so it follows the language; the figure is drawn by the game on the engine's
|
|
43
|
+
* surface — art stays data the game draws, never an embedded picture — and may animate by the time it is given.
|
|
44
|
+
*/
|
|
45
|
+
export interface HowToPlaySlide {
|
|
46
|
+
readonly text: () => string;
|
|
47
|
+
readonly figure?: (surface: HowToPlaySurface) => void;
|
|
48
|
+
}
|
|
49
|
+
/** Why a `howToPlay` declaration is malformed; empty when well formed. Absent is well formed: the help shows the buttons alone. */
|
|
50
|
+
export declare function howToPlayProblems(slides: unknown): string[];
|
|
51
|
+
/** What the engine's frame loop gives an animated figure; injected, so the loop is the page's. */
|
|
52
|
+
export interface FigureClock {
|
|
53
|
+
readonly requestFrame: (cb: (ms: number) => void) => number;
|
|
54
|
+
readonly cancelFrame: (id: number) => void;
|
|
55
|
+
/** Reduced motion: the figure is drawn once, at time 0, and never again. */
|
|
56
|
+
readonly reduced: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Draws the shown slide's figure, and keeps drawing it while the slide show is in the document and the same slide is shown.
|
|
60
|
+
* Returns a stop. A figure that throws is a cartridge defect: it stops drawing and the text stays.
|
|
61
|
+
*/
|
|
62
|
+
export declare function animateFigure(el: HTMLElement, slide: HowToPlaySlide, clock: FigureClock): () => void;
|
|
63
|
+
/** Builds the slide show's frame: the stop, its two arrows, the slide and the dots. `showSlide` fills it. */
|
|
64
|
+
export declare function mountSlides(ctx: SlideCtx): HTMLElement;
|
|
65
|
+
/**
|
|
66
|
+
* Shows slide `i` (held at the ends, like every steps control: the last slide is a wall, not a way back to the first) and returns
|
|
67
|
+
* the index shown, and what a screen reader hears of it. A slide is a button row (`helpRows`) or a cartridge's «how to play» slide
|
|
68
|
+
* (ADR-0195), which the help puts first.
|
|
69
|
+
*/
|
|
70
|
+
export declare function showSlide(el: HTMLElement, rows: readonly (HelpRow | HowToPlaySlide)[], i: number, ctx: SlideCtx & {
|
|
71
|
+
readonly t: (k: string, p?: Record<string, string>) => string;
|
|
72
|
+
readonly title: string;
|
|
73
|
+
}): {
|
|
74
|
+
readonly index: number;
|
|
75
|
+
readonly spoken: string;
|
|
76
|
+
};
|