@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,232 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// ui/help-panel — WHICH BUTTON DOES WHAT, in this game, on this child's keyboard: a slide show, one slide per button.
|
|
3
|
+
//
|
|
4
|
+
// ========================= WHY THIS MODULE EXISTS =========================
|
|
5
|
+
// 🔴 MEASURED 2026-09-12: the pause card carries a `ajuda` item and NOTHING in the engine can action it, so
|
|
6
|
+
// `itemsThatAct` hides it in every game. The help screen that used to fill it — `openHelp()` — did not
|
|
7
|
+
// die: it LEFT WITH THE CARTRIDGE (#111) and now lives in `game-platformer/app/js/main.ts`. So each of the
|
|
8
|
+
// three hundred games would have to write its own, which is the arrangement ADR-0139 measured failing in five
|
|
9
|
+
// games of six.
|
|
10
|
+
//
|
|
11
|
+
// 🎯 AND THE ENGINE ALREADY HAS EVERY INGREDIENT, which is what makes this cheap rather than new:
|
|
12
|
+
// · WHICH positions this game uses, and the game's own WORD for each — `ActionPreset` (ADR-0085).
|
|
13
|
+
// · The sentence that explains one — the `hint` of that preset, a field declared, typed, documented and,
|
|
14
|
+
// until this module, never displayed anywhere.
|
|
15
|
+
// · WHICH KEY reaches it FOR THIS CHILD — `input/keyboard-runtime.kbFor(seat)`, i.e. her remap and not the
|
|
16
|
+
// factory default.
|
|
17
|
+
//
|
|
18
|
+
// ⚠️ THE ENGINE NEVER NAMES AN ACTION HERE, and that is the whole boundary (ADR-0074, ADR-0086). It knows a
|
|
19
|
+
// POSITION exists; only the game knows the word. A row whose word is missing is therefore ABSENT — never a
|
|
20
|
+
// row reading «action2», which is the defect `labellerFrom` returns `null` to prevent.
|
|
21
|
+
//
|
|
22
|
+
// 📌 AND THIS IS THE MIGRATION `ui/settings-controls.ACT_LABEL` HAS BEEN WAITING FOR. That table holds ONE
|
|
23
|
+
// game's words — `act.run`, `act.jump` — inside the engine, and its own header says it can only leave once
|
|
24
|
+
// the help screen asks the GAME instead. This module is a help screen that asks the game.
|
|
25
|
+
import { ACTIONS } from '../core/actions.js';
|
|
26
|
+
/**
|
|
27
|
+
* The help table for one seat.
|
|
28
|
+
*
|
|
29
|
+
* ⚠️ WALKS `ACTIONS` AND NOT THE PRESET'S OWN KEYS, for the reason `presetActions` already carries: the
|
|
30
|
+
* canonical order is the one the child meets everywhere else — the remap screen, the pad wizard, the
|
|
31
|
+
* on-screen legend. A help screen ordered by whatever order the game happened to write its object in would
|
|
32
|
+
* teach a different order from every other surface.
|
|
33
|
+
*
|
|
34
|
+
* @param preset what this game declares — positions, words, hints.
|
|
35
|
+
* @param keysOf the codes bound to a position FOR THIS SEAT. `kbFor(seat)[action]`, so a child who remapped
|
|
36
|
+
* sees her own key. `null`/empty means the keyboard does not reach it.
|
|
37
|
+
* @param keyName code → readable label (`ui/settings-controls.keyName`), injected so this half stays pure.
|
|
38
|
+
*/
|
|
39
|
+
export function helpRows(preset, keysOf, keyName) {
|
|
40
|
+
if (!preset)
|
|
41
|
+
return [];
|
|
42
|
+
const rows = [];
|
|
43
|
+
for (const action of ACTIONS) {
|
|
44
|
+
const word = preset[action];
|
|
45
|
+
// ⚠️ A BLANK LABEL IS THE SAME AS NO LABEL, and it is the case `presetProblems` already names: a row
|
|
46
|
+
// whose word is whitespace reads, to a screen reader, as a button with no name.
|
|
47
|
+
if (!word || !word.label.trim())
|
|
48
|
+
continue;
|
|
49
|
+
// 📌 THE FIRST CODE, and the rest are not lost — they are the same position, and a help screen that listed
|
|
50
|
+
// every alias would spend the child's attention on the keyboard instead of on the game. The remap screen
|
|
51
|
+
// is where all of them are visible, because THERE they are the subject.
|
|
52
|
+
const codes = keysOf(action);
|
|
53
|
+
const key = codes && codes.length ? keyName(codes[0]) : null;
|
|
54
|
+
rows.push({ action, key, word: word.label, ...(word.hint ? { hint: word.hint } : {}) });
|
|
55
|
+
}
|
|
56
|
+
return rows;
|
|
57
|
+
}
|
|
58
|
+
/** What the slide says where the keyboard reaches nothing. A KEY, not a sentence — the caller translates it. */
|
|
59
|
+
export const NO_KEY = 'help.noKey';
|
|
60
|
+
/** Why a `howToPlay` declaration is malformed; empty when well formed. Absent is well formed: the help shows the buttons alone. */
|
|
61
|
+
export function howToPlayProblems(slides) {
|
|
62
|
+
if (slides === undefined)
|
|
63
|
+
return [];
|
|
64
|
+
if (!Array.isArray(slides))
|
|
65
|
+
return ['howToPlay must be a list of slides'];
|
|
66
|
+
const out = [];
|
|
67
|
+
slides.forEach((s, i) => {
|
|
68
|
+
const at = `howToPlay[${i}]`;
|
|
69
|
+
if (!s || typeof s !== 'object') {
|
|
70
|
+
out.push(`${at} must be a slide`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (typeof s.text !== 'function')
|
|
74
|
+
out.push(`${at}.text must be a function returning the slide's text, in the page's language`);
|
|
75
|
+
if (s.figure !== undefined && typeof s.figure !== 'function')
|
|
76
|
+
out.push(`${at}.figure must be a function drawing on the surface it is given`);
|
|
77
|
+
});
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
const isFromGame = (s) => typeof s.text === 'function';
|
|
81
|
+
/**
|
|
82
|
+
* Draws the shown slide's figure, and keeps drawing it while the slide show is in the document and the same slide is shown.
|
|
83
|
+
* Returns a stop. A figure that throws is a cartridge defect: it stops drawing and the text stays.
|
|
84
|
+
*/
|
|
85
|
+
export function animateFigure(el, slide, clock) {
|
|
86
|
+
const screen = el.querySelector('.slide-figura');
|
|
87
|
+
const ctx = screen?.getContext('2d');
|
|
88
|
+
if (!screen || !ctx || !slide.figure)
|
|
89
|
+
return () => { };
|
|
90
|
+
const figureFn = slide.figure;
|
|
91
|
+
// the drawing surface is the size it is shown at, in CSS pixels, so a figure's coordinates are the ones the child sees
|
|
92
|
+
const screenBox = screen.getBoundingClientRect();
|
|
93
|
+
if (screenBox.width > 0 && screenBox.height > 0) {
|
|
94
|
+
screen.width = Math.round(screenBox.width);
|
|
95
|
+
screen.height = Math.round(screenBox.height);
|
|
96
|
+
}
|
|
97
|
+
let id = 0, still = false, start = -1;
|
|
98
|
+
const draw = (ms) => {
|
|
99
|
+
if (still || !el.isConnected)
|
|
100
|
+
return;
|
|
101
|
+
if (start < 0)
|
|
102
|
+
start = ms;
|
|
103
|
+
const time = clock.reduced ? 0 : (ms - start) / 1000;
|
|
104
|
+
ctx.clearRect(0, 0, screen.width, screen.height);
|
|
105
|
+
try {
|
|
106
|
+
figureFn({ ctx, width: screen.width, height: screen.height, time });
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
still = true;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!clock.reduced)
|
|
113
|
+
id = clock.requestFrame(draw);
|
|
114
|
+
};
|
|
115
|
+
draw(0);
|
|
116
|
+
return () => { still = true; clock.cancelFrame(id); };
|
|
117
|
+
}
|
|
118
|
+
/** Builds the slide show's frame: the stop, its two arrows, the slide and the dots. `showSlide` fills it. */
|
|
119
|
+
export function mountSlides(ctx) {
|
|
120
|
+
const el = ctx.create('div');
|
|
121
|
+
el.className = 'slides';
|
|
122
|
+
el.setAttribute('role', 'spinbutton');
|
|
123
|
+
el.setAttribute('tabindex', '0');
|
|
124
|
+
el.setAttribute('data-passos', '');
|
|
125
|
+
const arrow = (delta, glyph) => {
|
|
126
|
+
const s = ctx.create('span');
|
|
127
|
+
s.className = 'passo-seta';
|
|
128
|
+
s.setAttribute('data-passo', String(delta));
|
|
129
|
+
s.setAttribute('aria-hidden', 'true');
|
|
130
|
+
s.textContent = glyph;
|
|
131
|
+
s.addEventListener('click', () => el.dispatchEvent(new CustomEvent('passo', { detail: delta, bubbles: true })));
|
|
132
|
+
return s;
|
|
133
|
+
};
|
|
134
|
+
const slide = ctx.create('div');
|
|
135
|
+
slide.className = 'slide';
|
|
136
|
+
slide.setAttribute('aria-hidden', 'true'); // heard through the stop's value, once
|
|
137
|
+
const figureFn = ctx.create('canvas');
|
|
138
|
+
figureFn.className = 'slide-figura';
|
|
139
|
+
figureFn.hidden = true;
|
|
140
|
+
const keyGlyphOf = ctx.create('kbd');
|
|
141
|
+
keyGlyphOf.className = 'slide-tecla';
|
|
142
|
+
const word = ctx.create('p');
|
|
143
|
+
word.className = 'slide-palavra';
|
|
144
|
+
const text = ctx.create('p');
|
|
145
|
+
text.className = 'slide-texto';
|
|
146
|
+
const dots = ctx.create('div');
|
|
147
|
+
dots.className = 'slide-pontos';
|
|
148
|
+
for (const child of [figureFn, keyGlyphOf, word, text, dots])
|
|
149
|
+
slide.appendChild(child);
|
|
150
|
+
el.appendChild(arrow(-1, '◀'));
|
|
151
|
+
el.appendChild(slide);
|
|
152
|
+
el.appendChild(arrow(1, '▶'));
|
|
153
|
+
return el;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 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
|
|
157
|
+
* 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
|
|
158
|
+
* (ADR-0195), which the help puts first.
|
|
159
|
+
*/
|
|
160
|
+
export function showSlide(el, rows, i, ctx) {
|
|
161
|
+
const last = Math.max(0, rows.length - 1);
|
|
162
|
+
const shown = Math.max(0, Math.min(last, i));
|
|
163
|
+
const r = rows[shown];
|
|
164
|
+
const parts = slidePartsOf(el);
|
|
165
|
+
if (!r || !parts)
|
|
166
|
+
return { index: shown, spoken: '' };
|
|
167
|
+
drawDots(parts.dots, rows.length, shown, ctx);
|
|
168
|
+
const spokenText = isFromGame(r) ? showPlaySlide(parts, r) : showButtonSlide(parts, r, ctx.t);
|
|
169
|
+
el.setAttribute('aria-label', ctx.title);
|
|
170
|
+
el.setAttribute('aria-valuemin', '0');
|
|
171
|
+
el.setAttribute('aria-valuemax', String(last));
|
|
172
|
+
el.setAttribute('aria-valuenow', String(shown));
|
|
173
|
+
el.setAttribute('aria-valuetext', spokenText);
|
|
174
|
+
el.querySelector('[data-passo="-1"]')?.classList.toggle('no-limite', shown === 0);
|
|
175
|
+
el.querySelector('[data-passo="1"]')?.classList.toggle('no-limite', shown === last);
|
|
176
|
+
return { index: shown, spoken: spokenText };
|
|
177
|
+
}
|
|
178
|
+
function slidePartsOf(el) {
|
|
179
|
+
const slide = el.querySelector('.slide');
|
|
180
|
+
const figure = el.querySelector('.slide-figura');
|
|
181
|
+
const keyCap = el.querySelector('.slide-tecla');
|
|
182
|
+
const word = el.querySelector('.slide-palavra');
|
|
183
|
+
const text = el.querySelector('.slide-texto');
|
|
184
|
+
const dots = el.querySelector('.slide-pontos');
|
|
185
|
+
if (!slide || !figure || !keyCap || !word || !text || !dots)
|
|
186
|
+
return null;
|
|
187
|
+
return { slide, figure, keyCap, word, text, dots };
|
|
188
|
+
}
|
|
189
|
+
/** One dot per slide, the current one filled — the place without a number (ADR-0167). */
|
|
190
|
+
function drawDots(dots, count, current, ctx) {
|
|
191
|
+
while (dots.firstChild)
|
|
192
|
+
dots.removeChild(dots.firstChild);
|
|
193
|
+
Array.from({ length: count }, (_, n) => {
|
|
194
|
+
const dot = ctx.create('span');
|
|
195
|
+
dot.className = n === current ? 'slide-ponto is-on' : 'slide-ponto';
|
|
196
|
+
return dots.appendChild(dot);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/** What is heard, the parts joined — a sentence that already ends in a full stop is not given a second one. */
|
|
200
|
+
const joinParts = (parts) => parts.filter(Boolean).map((part) => part.replace(/[.!?…]+\s*$/, '')).join('. ');
|
|
201
|
+
/**
|
|
202
|
+
* A cartridge's «how to play» slide (ADR-0195): its text and, if it has one, its figure — no key cap, no word, and no action,
|
|
203
|
+
* whatever the slide before it was.
|
|
204
|
+
*/
|
|
205
|
+
function showPlaySlide(p, r) {
|
|
206
|
+
p.slide.setAttribute('data-kind', 'play');
|
|
207
|
+
p.slide.removeAttribute('data-act');
|
|
208
|
+
p.figure.hidden = !r.figure;
|
|
209
|
+
p.keyCap.hidden = true;
|
|
210
|
+
p.word.hidden = true;
|
|
211
|
+
const phrase = r.text();
|
|
212
|
+
p.text.textContent = phrase;
|
|
213
|
+
p.text.hidden = false;
|
|
214
|
+
return joinParts([phrase]);
|
|
215
|
+
}
|
|
216
|
+
/** A button's slide: the child's key (or that the keyboard does not reach it, marked), the game's word, and its sentence. */
|
|
217
|
+
function showButtonSlide(p, r, t) {
|
|
218
|
+
p.slide.setAttribute('data-kind', 'button');
|
|
219
|
+
p.slide.setAttribute('data-act', r.action);
|
|
220
|
+
p.figure.hidden = true;
|
|
221
|
+
p.keyCap.hidden = false;
|
|
222
|
+
p.word.hidden = false;
|
|
223
|
+
p.keyCap.textContent = r.key ?? t(NO_KEY);
|
|
224
|
+
if (r.key)
|
|
225
|
+
p.keyCap.removeAttribute('data-sem-tecla');
|
|
226
|
+
else
|
|
227
|
+
p.keyCap.setAttribute('data-sem-tecla', '1');
|
|
228
|
+
p.word.textContent = r.word;
|
|
229
|
+
p.text.textContent = r.hint ?? '';
|
|
230
|
+
p.text.hidden = !r.hint;
|
|
231
|
+
return joinParts([r.word, r.hint, r.key ? t('help.slide.tecla', { k: r.key }) : t(NO_KEY)]);
|
|
232
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Speakable } from '../core/contract.js';
|
|
3
|
+
import type { Translate } from '../core/i18n.js';
|
|
4
|
+
export type HudBand = 'identity' | 'mission' | 'power' | 'learning';
|
|
5
|
+
/**
|
|
6
|
+
* A skill's bar, as `educational/segment-bar.barOf` returns it — the same field names and values, so its `Bar` passes
|
|
7
|
+
* straight in. Written again here because `ui` does not import `educational` (ADR-0173).
|
|
8
|
+
*/
|
|
9
|
+
export interface HudBar {
|
|
10
|
+
readonly segmentos: readonly ('azul' | 'verde' | 'vermelho')[];
|
|
11
|
+
readonly cor: 'nenhuma' | 'laranja' | 'roxa';
|
|
12
|
+
}
|
|
13
|
+
export type HudNumber = {
|
|
14
|
+
readonly band: 'identity' | 'mission' | 'power';
|
|
15
|
+
/** What is counted, in the interface language («points», «balls»). */
|
|
16
|
+
readonly name: Speakable;
|
|
17
|
+
/** A count, or how many of how many, for seat `seat`. Read on every animation frame while mounted: keep it cheap. */
|
|
18
|
+
readonly value: (seat: number) => number | {
|
|
19
|
+
readonly have: number;
|
|
20
|
+
readonly need: number;
|
|
21
|
+
};
|
|
22
|
+
} | {
|
|
23
|
+
readonly band: 'learning';
|
|
24
|
+
/** The skill, in the interface language. */
|
|
25
|
+
readonly name: Speakable;
|
|
26
|
+
readonly value: (seat: number) => HudBar;
|
|
27
|
+
};
|
|
28
|
+
/** Why a `hud` declaration is malformed; empty when it is well formed. Absent is well formed: no HUD is mounted. */
|
|
29
|
+
export declare function hudNumbersProblems(numbers: unknown): string[];
|
|
30
|
+
export interface HudBandsMounted {
|
|
31
|
+
/** The top-left column: identity, then mission. */
|
|
32
|
+
readonly left: HTMLElement;
|
|
33
|
+
/** The top-right column: power (under the clock, when #94 builds it). */
|
|
34
|
+
readonly right: HTMLElement;
|
|
35
|
+
readonly learning: HTMLElement;
|
|
36
|
+
/** Rewrites what changed; `true` when a text at the top did, so the caller measures the room again. */
|
|
37
|
+
refresh(): boolean;
|
|
38
|
+
remove(): void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Mounts the two top columns and the footer bars in the game region, one element per declared number, and fills them. A
|
|
42
|
+
* column with no number is hidden. The learning band goes in BEFORE the screen footer when one exists, so the explanation band, drawn later on the
|
|
43
|
+
* same layer, covers it.
|
|
44
|
+
*/
|
|
45
|
+
export declare function mountHudBands(t: Translate, doc: Document, region: HTMLElement, numbers: readonly HudNumber[], seat?: number): HudBandsMounted;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
const HUD_BANDS = ['identity', 'mission', 'power', 'learning'];
|
|
3
|
+
/** ADR-0049 §5: three ten-segment bars are thirty lit elements; a fourth stops being a reading. */
|
|
4
|
+
const MAX_BARS = 3;
|
|
5
|
+
const SEGMENTS = 10;
|
|
6
|
+
/** Why a `hud` declaration is malformed; empty when it is well formed. Absent is well formed: no HUD is mounted. */
|
|
7
|
+
export function hudNumbersProblems(numbers) {
|
|
8
|
+
if (numbers === undefined)
|
|
9
|
+
return [];
|
|
10
|
+
if (!Array.isArray(numbers))
|
|
11
|
+
return ['hud must be a list of numbers'];
|
|
12
|
+
const out = [];
|
|
13
|
+
numbers.forEach((n, i) => {
|
|
14
|
+
if (!n || !HUD_BANDS.includes(n.band))
|
|
15
|
+
out.push(`hud[${i}].band must be one of ${HUD_BANDS.join(', ')}`);
|
|
16
|
+
if (!n || typeof n.name?.text !== 'string' || !n.name.text.trim())
|
|
17
|
+
out.push(`hud[${i}].name.text must say what is counted`);
|
|
18
|
+
if (!n || typeof n.value !== 'function')
|
|
19
|
+
out.push(`hud[${i}].value must be a function of the seat`);
|
|
20
|
+
});
|
|
21
|
+
const bars = numbers.filter((n) => n?.band === 'learning').length;
|
|
22
|
+
if (bars > MAX_BARS)
|
|
23
|
+
out.push(`hud declares ${bars} learning bars: at most ${MAX_BARS}, one per skill the adult enabled (ADR-0049 §5)`);
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** What the child reads, or hears on the bar: the frame in the dictionary, the name through a parameter (pillar 3). */
|
|
27
|
+
function numberText(t, n, seat) {
|
|
28
|
+
const v = n.value(seat);
|
|
29
|
+
return typeof v === 'number'
|
|
30
|
+
? t('hud.numero', { nome: n.name.text, valor: String(v) })
|
|
31
|
+
: t('hud.contador', { have: String(v.have), need: String(v.need), nome: n.name.text });
|
|
32
|
+
}
|
|
33
|
+
function barLabel(t, name, bar) {
|
|
34
|
+
const count = (c) => String(bar.segmentos.filter((s) => s === c).length);
|
|
35
|
+
const base = t('hud.barra', { nome: name, azuis: count('azul'), verdes: count('verde'), vermelhos: count('vermelho') });
|
|
36
|
+
return bar.cor === 'roxa' ? `${base}. ${t('hud.barra.sobe')}` : bar.cor === 'laranja' ? `${base}. ${t('hud.barra.desce')}` : base;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Mounts the two top columns and the footer bars in the game region, one element per declared number, and fills them. A
|
|
40
|
+
* column with no number is hidden. The learning band goes in BEFORE the screen footer when one exists, so the explanation band, drawn later on the
|
|
41
|
+
* same layer, covers it.
|
|
42
|
+
*/
|
|
43
|
+
export function mountHudBands(t, doc, region, numbers, seat = 0) {
|
|
44
|
+
const band = (cls, count) => {
|
|
45
|
+
const el = doc.createElement('div');
|
|
46
|
+
el.className = `hud-faixa ${cls}`;
|
|
47
|
+
el.hidden = count === 0;
|
|
48
|
+
return el;
|
|
49
|
+
};
|
|
50
|
+
const texts = numbers.filter((n) => n.band !== 'learning');
|
|
51
|
+
const bars = numbers.filter((n) => n.band === 'learning');
|
|
52
|
+
// the identity lines first and the mission under them, whatever order the game declared them in
|
|
53
|
+
const leftTexts = [...texts.filter((n) => n.band === 'identity'), ...texts.filter((n) => n.band === 'mission')];
|
|
54
|
+
const rightTexts = texts.filter((n) => n.band === 'power');
|
|
55
|
+
const left = band('hud-esquerda', leftTexts.length);
|
|
56
|
+
const right = band('hud-direita', rightTexts.length);
|
|
57
|
+
const learning = band('hud-aprendizagem', bars.length);
|
|
58
|
+
const lines = [...leftTexts, ...rightTexts].map((n) => {
|
|
59
|
+
const p = doc.createElement('p');
|
|
60
|
+
p.className = 'hud-numero';
|
|
61
|
+
p.dataset.band = n.band;
|
|
62
|
+
(n.band === 'power' ? right : left).appendChild(p);
|
|
63
|
+
return [n, p];
|
|
64
|
+
});
|
|
65
|
+
const bardivs = bars.map((n) => {
|
|
66
|
+
const div = doc.createElement('div');
|
|
67
|
+
div.className = 'hud-barra';
|
|
68
|
+
div.setAttribute('role', 'img');
|
|
69
|
+
for (let i = 0; i < SEGMENTS; i++)
|
|
70
|
+
div.appendChild(doc.createElement('span')).className = 'hud-seg';
|
|
71
|
+
learning.appendChild(div);
|
|
72
|
+
return [n, div];
|
|
73
|
+
});
|
|
74
|
+
region.appendChild(left);
|
|
75
|
+
region.appendChild(right);
|
|
76
|
+
region.insertBefore(learning, [...region.children].find((c) => c.classList.contains('rodape-da-tela')) ?? null);
|
|
77
|
+
function refresh() {
|
|
78
|
+
let changed = false;
|
|
79
|
+
for (const [n, p] of lines) {
|
|
80
|
+
const text = numberText(t, n, seat);
|
|
81
|
+
if (p.textContent !== text) {
|
|
82
|
+
p.textContent = text;
|
|
83
|
+
changed = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const [n, div] of bardivs) {
|
|
87
|
+
const bar = n.value(seat);
|
|
88
|
+
const shown = bar.segmentos.slice(-SEGMENTS);
|
|
89
|
+
const label = barLabel(t, n.name.text, { segmentos: shown, cor: bar.cor }); // in the key: a language change rewrites it
|
|
90
|
+
const key = `${bar.cor}:${shown.join(',')}:${label}`;
|
|
91
|
+
if (div.dataset.estado === key)
|
|
92
|
+
continue;
|
|
93
|
+
div.dataset.estado = key;
|
|
94
|
+
div.dataset.cor = bar.cor;
|
|
95
|
+
[...div.children].forEach((cell, i) => { cell.dataset.seg = shown[i] ?? 'vazio'; });
|
|
96
|
+
div.setAttribute('aria-label', label);
|
|
97
|
+
}
|
|
98
|
+
return changed;
|
|
99
|
+
}
|
|
100
|
+
refresh();
|
|
101
|
+
return {
|
|
102
|
+
left,
|
|
103
|
+
right,
|
|
104
|
+
learning,
|
|
105
|
+
refresh,
|
|
106
|
+
remove: () => { left.remove(); right.remove(); learning.remove(); },
|
|
107
|
+
};
|
|
108
|
+
}
|
package/dist-pkg/ui/hud.d.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
2
|
import type { PlayerView } from '../core/entity.js';
|
|
3
3
|
import type { Objective } from '../core/contract.js';
|
|
4
|
+
import type { Translate } from '../core/i18n.js';
|
|
4
5
|
import type { DomQuery } from '../core/dom-query.js';
|
|
5
6
|
/** Minimal DOM-selector shape (matches ui/dom.ts's `$`). */
|
|
6
7
|
export type { DomQuery } from '../core/dom-query.js';
|
|
7
|
-
/**
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
8
|
+
/** Only the player fields the HUD reads. Structural on purpose: the real `players[]` is `unknown[]` in core/state. */
|
|
9
|
+
/** What the HUD reads from the PLAYER: the active power and whether they quit. Progress comes from the `Objective`,
|
|
10
|
+
* not from here. */
|
|
10
11
|
export type HudPlayer = PlayerView<'activePower' | 'quit'>;
|
|
11
|
-
/**
|
|
12
|
+
/** Screen grid: 1 → 1×1, 2 → 2×1, 3-4 → 2×2 (the 3rd screen is centred on the bottom row). */
|
|
12
13
|
export { screenGrid } from '../core/screens.js';
|
|
13
14
|
export type { ScreenGrid } from '../core/screens.js';
|
|
14
|
-
/**
|
|
15
|
+
/** Screen `i`'s rectangle in CSS percentages, ready for `style.left/top/width/height`. */
|
|
15
16
|
export interface ScreenRect {
|
|
16
17
|
L: string;
|
|
17
18
|
T: string;
|
|
@@ -19,119 +20,121 @@ export interface ScreenRect {
|
|
|
19
20
|
H: string;
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* terceira é centralizada na linha de baixo, para casar com o posicionamento do render (configureRender).
|
|
23
|
+
* Position/size of screen `i` in a grid of `n` players; `n` is a parameter, so it is testable without state. Special
|
|
24
|
+
* case: with 3 screens, the third is centred on the bottom row, to match the renderer's positioning.
|
|
25
25
|
*/
|
|
26
26
|
export declare function screenRect(i: number, n: number): ScreenRect;
|
|
27
|
-
/**
|
|
27
|
+
/** How many screens the HUD mounts: at least one, even before `players[]` exists at boot. */
|
|
28
28
|
export declare function screenCount(n: number): number;
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
export declare const
|
|
29
|
+
/** The text a screen reader hears on the counter. The FRAME is the key; the objective's NAME passes through as a
|
|
30
|
+
* parameter — pillar 3's rule (ADR-0010), the same the curriculum follows. */
|
|
31
|
+
export declare const counterLabel: (t: Translate, o: Objective) => string;
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* The counter's markup (objective in the 1st column, power in the 2nd).
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* (campo 5 do contrato), sem saber se é moeda, palavra ou conta.
|
|
35
|
+
* The objective comes in WHOLE — name, how much you have, how much you need — and the icon by injection: the HUD shows
|
|
36
|
+
* what the game declared (field 5 of the contract), without knowing whether it is a coin, a word or a sum.
|
|
38
37
|
*
|
|
39
|
-
*
|
|
40
|
-
* era mudo para quem não vê a tela.
|
|
38
|
+
* The accessible name is set separately (`applyCounterLabel`), because the objective's name is outside data.
|
|
41
39
|
*/
|
|
42
|
-
export declare function vphudHtml(
|
|
40
|
+
export declare function vphudHtml(objective: Objective, icon: string): string;
|
|
43
41
|
/**
|
|
44
|
-
*
|
|
42
|
+
* PUTS THE NAME THE GAME DECLARED INTO THE SCREEN READER'S LABEL — by attribute, never by markup (issue #106).
|
|
45
43
|
*
|
|
46
|
-
* ⚠️
|
|
47
|
-
*
|
|
48
|
-
* contrato passou a existir (ADR-0030) e os jogos passaram a viver em REPOSITÓRIOS SEPARADOS, consumindo a
|
|
49
|
-
* engine como pacote (ADR-0083). O `name.text` do objetivo é texto de um jogo que esta árvore não revê.
|
|
44
|
+
* ⚠️ The games live in SEPARATE REPOSITORIES and consume the engine as a package (ADR-0083), so the objective's
|
|
45
|
+
* `name.text` is text from a game this tree does not review.
|
|
50
46
|
*
|
|
51
|
-
* ⚠️
|
|
52
|
-
*
|
|
53
|
-
*
|
|
47
|
+
* ⚠️ AND IT GOES INTO AN ATTRIBUTE, the worse of the two contexts: inside an element a quote is harmless; inside
|
|
48
|
+
* `aria-label="…"` it CLOSES the attribute and what follows becomes an attribute — an `onmouseover` without a single
|
|
49
|
+
* tag.
|
|
54
50
|
*
|
|
55
|
-
* `setAttribute`
|
|
56
|
-
*
|
|
51
|
+
* `setAttribute` escapes by construction, which is why the answer is building nodes and not escaping by hand: a
|
|
52
|
+
* forgotten escape leaves no trace; a forgotten `setAttribute` removes the label, and a case holds it.
|
|
57
53
|
*/
|
|
58
|
-
export declare function
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
export declare function applyCounterLabel(t: Translate, vphud: Element | null, objective: Objective): void;
|
|
55
|
+
/**
|
|
56
|
+
* The markup of the press-a-button-to-join badge (a screen created mid-game, still with no owner). `i` is 0-based.
|
|
57
|
+
*
|
|
58
|
+
* 🔴 FROM THE DICTIONARY, never raw text: it is the only sentence that tells the child who just got a screen HOW to join,
|
|
59
|
+
* and the badge is their whole screen at that instant, not a corner detail.
|
|
60
|
+
*
|
|
61
|
+
* 📌 ITS OWN KEY and not the existing `sr.player.pressToJoin`, although the two look alike: the screen reader's says to
|
|
62
|
+
* press a button, this one says WHICH — your own keyboard or a free controller —, because whoever reads it is looking
|
|
63
|
+
* at a screen with other people around and needs to know it is not just any keyboard. Merging them would erase that
|
|
64
|
+
* half of one of the two.
|
|
65
|
+
*/
|
|
66
|
+
export declare function waitBadgeHtml(t: Translate, i: number): string;
|
|
67
|
+
/** The HUD projection of ONE screen: everything updateGameHud() writes to the DOM, without touching the DOM. */
|
|
62
68
|
export interface HudRowView {
|
|
63
|
-
/**
|
|
69
|
+
/** The counter's text: how much the player has, as given (no formatting nor clamp). */
|
|
64
70
|
have: string;
|
|
65
|
-
/**
|
|
66
|
-
*
|
|
71
|
+
/** What the screen reader hears on the counter — rewritten with the number, otherwise it would keep saying the first
|
|
72
|
+
* frame's value the whole match. That is the defect a static `aria-label` would have. */
|
|
67
73
|
label: string;
|
|
68
|
-
/**
|
|
74
|
+
/** Short label of the active power, with the dash as the fallback for an unknown/absent power. */
|
|
69
75
|
power: string;
|
|
70
|
-
/** `hidden`
|
|
76
|
+
/** `hidden` of the quit badge: hidden while the player has NOT quit. */
|
|
71
77
|
quitHidden: boolean;
|
|
72
|
-
/** `style.visibility
|
|
78
|
+
/** The counter's `style.visibility`: whoever quit sees a black screen with the badge, no numbers. */
|
|
73
79
|
visibility: 'hidden' | 'visible';
|
|
74
80
|
}
|
|
75
81
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
82
|
+
* One player's HUD state, as a value. `powerShort` is injected by the host (the same function other game modules
|
|
83
|
+
* receive). A function and not a table: the text depends on the CURRENT language, and a table read at boot would stay
|
|
84
|
+
* frozen in it.
|
|
79
85
|
*/
|
|
80
|
-
export declare function hudRowView(p: HudPlayer, powerShort: (kind: string) => string,
|
|
86
|
+
export declare function hudRowView(t: Translate, p: HudPlayer, powerShort: (kind: string) => string, objective: Objective): HudRowView;
|
|
81
87
|
export interface HudCtx {
|
|
82
|
-
/**
|
|
83
|
-
|
|
84
|
-
|
|
88
|
+
/** Translates in the page's language — the root's translator (ADR-0232 D3). REQUIRED: text built from nowhere is a raw key. */
|
|
89
|
+
t: Translate;
|
|
90
|
+
/** How many players/screens. ROUND state (ADR-0038): it comes from the instance the root owns — a module `let` would
|
|
91
|
+
* be shared by any second game the same page loads. */
|
|
85
92
|
getNumPlayers: () => number;
|
|
86
|
-
/**
|
|
87
|
-
*
|
|
93
|
+
/** The players. ROUND state, for the same reason. `readonly unknown[]` because each consumer narrows to ITS slice —
|
|
94
|
+
* the real type is the game's, not the engine's (ADR-0033). */
|
|
88
95
|
getPlayers: () => readonly unknown[];
|
|
89
|
-
/**
|
|
96
|
+
/** DOM selector (ui/dom.ts's `$` shape), injected — the module never reaches `document` through a global. */
|
|
90
97
|
$: DomQuery;
|
|
91
98
|
/**
|
|
92
|
-
*
|
|
93
|
-
* (showPower) também o recebe — injetar evita a 2ª cópia da tabela.
|
|
99
|
+
* Short power labels shown on the HUD. Injected so the host keeps one table for every module that shows powers.
|
|
94
100
|
*/
|
|
95
101
|
powerShort: (kind: string) => string;
|
|
96
102
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* Era `hudTarget: number`, e antes disso `COIN_TARGET` por importação. Cada passo tirou uma coisa que o HUD
|
|
101
|
-
* sabia sobre o jogo: primeiro a dependência, agora o assunto.
|
|
103
|
+
* Player `i`'s OBJECTIVE — field 5 of the contract (`core/contract.Objective`): the name of what is collected, how
|
|
104
|
+
* much they have and how much they need. A FUNCTION and not a value, because `have` changes every frame.
|
|
102
105
|
*/
|
|
103
106
|
hudObjective: (playerIndex: number) => Objective;
|
|
104
|
-
/**
|
|
107
|
+
/** The counter's icon. It is the game's, like the name. */
|
|
105
108
|
hudIcon: string;
|
|
106
109
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
110
|
+
* Screen `i`'s pause panel. NOT this module's: it comes in by injection and the HUD only attaches the result inside
|
|
111
|
+
* the matching `.player-screen`.
|
|
109
112
|
*/
|
|
110
113
|
buildScreenPause: (i: number) => HTMLElement;
|
|
111
114
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
115
|
+
* Screen `i`'s accessibility QUICK BAR (ui/pause-icons `buildQuickBar`). Attached as a SIBLING of `.screen-exp`, not
|
|
116
|
+
* inside it: the bar is CONTROL, and empathy mode does not reach it (issue #82).
|
|
114
117
|
*/
|
|
115
118
|
buildQuickBar: (i: number) => HTMLElement;
|
|
116
119
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
+
* Called at the END of buildGameHud() with the freshly created pause panels, in screen order — the hook where the
|
|
121
|
+
* host keeps its references and runs what depends on them. Optional: without it the HUD mounts the same, it just
|
|
122
|
+
* tells nobody.
|
|
120
123
|
*/
|
|
121
124
|
onScreensBuilt?: (pausePanels: HTMLElement[]) => void;
|
|
122
|
-
/**
|
|
125
|
+
/** The freshly mounted quick bars, in screen order. The root keeps them for `getA11yBars`. */
|
|
123
126
|
onBarsBuilt?: (bars: HTMLElement[]) => void;
|
|
124
127
|
}
|
|
125
128
|
export interface HudApi {
|
|
126
|
-
/** (Re)
|
|
129
|
+
/** (Re)mounts `#game-hud`: one `.player-screen` per player, with HUD, quit badge and pause panel. */
|
|
127
130
|
buildGameHud: () => void;
|
|
128
|
-
/**
|
|
131
|
+
/** Rewrites the objective/power and the quit badge on every mounted screen. Called every frame. */
|
|
129
132
|
updateGameHud: () => void;
|
|
130
|
-
/**
|
|
133
|
+
/** Screen `i`'s `.player-screen` container (the multiplayer quiz and other per-player overlays hang here). */
|
|
131
134
|
getScreen: (i: number) => HTMLElement | null;
|
|
132
|
-
/**
|
|
135
|
+
/** Creates the `.vp-wait` badge on screen `i` (idempotent: does not duplicate if it already exists). */
|
|
133
136
|
showWaitingBadge: (i: number) => void;
|
|
134
|
-
/**
|
|
137
|
+
/** Removes the `.vp-wait` badge from screen `i` (the player joined). No-op if the screen or the badge does not exist. */
|
|
135
138
|
clearWaitingBadge: (i: number) => void;
|
|
136
139
|
}
|
|
137
140
|
export declare function initHud(ctx: HudCtx): HudApi;
|