@the-inclusionist/engine 9.0.0 → 11.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 +120 -78
- package/app/css/style.css +761 -377
- 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-licences/NOTICE.txt +166 -0
- package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
- package/app/public/vendor/fonts.css +36 -84
- package/dist-pkg/boot/create-game.d.ts +499 -219
- package/dist-pkg/boot/create-game.js +3944 -562
- package/dist-pkg/core/a11y-sr.d.ts +25 -3
- package/dist-pkg/core/a11y-sr.js +38 -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 +125 -0
- package/dist-pkg/core/accommodations.js +195 -0
- package/dist-pkg/core/actions.d.ts +108 -55
- package/dist-pkg/core/actions.js +122 -71
- 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 +142 -164
- package/dist-pkg/core/contract.js +222 -208
- 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 +71 -60
- package/dist-pkg/core/i18n.js +186 -200
- 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/session-clock.d.ts +23 -0
- package/dist-pkg/core/session-clock.js +37 -0
- 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 +324 -223
- package/dist-pkg/i18n/es.js +323 -223
- package/dist-pkg/i18n/pt.js +348 -226
- 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 +195 -145
- package/dist-pkg/input/gamepad.js +383 -556
- 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/key-default.d.ts +30 -0
- package/dist-pkg/input/key-default.js +60 -0
- package/dist-pkg/input/keyboard-runtime.d.ts +15 -21
- package/dist-pkg/input/keyboard-runtime.js +23 -27
- package/dist-pkg/input/keyboard.d.ts +68 -63
- package/dist-pkg/input/keyboard.js +83 -105
- package/dist-pkg/input/keydown.d.ts +123 -137
- package/dist-pkg/input/keydown.js +284 -289
- package/dist-pkg/input/latch-edge.d.ts +33 -21
- package/dist-pkg/input/latch-edge.js +34 -35
- package/dist-pkg/input/latch-scope.d.ts +51 -50
- package/dist-pkg/input/latch-scope.js +61 -82
- package/dist-pkg/input/latch-store.d.ts +26 -30
- package/dist-pkg/input/latch-store.js +42 -50
- package/dist-pkg/input/latch-sync.d.ts +29 -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 +169 -0
- package/dist-pkg/input/pad-wizard.d.ts +99 -0
- package/dist-pkg/input/pad-wizard.js +256 -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 +59 -0
- package/dist-pkg/input/switch-scan.js +67 -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 -116
- package/dist-pkg/input/touch-bindings.js +158 -173
- package/dist-pkg/input/touch.d.ts +147 -72
- package/dist-pkg/input/touch.js +362 -126
- 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 +90 -117
- package/dist-pkg/input/transports.js +104 -106
- package/dist-pkg/input/virtual-controller.d.ts +82 -0
- package/dist-pkg/input/virtual-controller.js +69 -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 +59 -0
- package/dist-pkg/input/voice-map.js +123 -0
- package/dist-pkg/platform/audio-ambient.d.ts +13 -2
- package/dist-pkg/platform/audio-ambient.js +14 -14
- 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 +31 -39
- package/dist-pkg/platform/audio-sonar.d.ts +49 -152
- package/dist-pkg/platform/audio-sonar.js +124 -302
- package/dist-pkg/platform/audio.d.ts +62 -19
- package/dist-pkg/platform/audio.js +193 -168
- package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
- package/dist-pkg/platform/choose-by-voice.js +157 -0
- package/dist-pkg/platform/flash-sampler.d.ts +19 -0
- package/dist-pkg/platform/flash-sampler.js +79 -0
- package/dist-pkg/platform/font-library.d.ts +77 -0
- package/dist-pkg/platform/font-library.js +98 -0
- package/dist-pkg/platform/font-library.json +721 -0
- package/dist-pkg/platform/heavy-catalogue.d.ts +77 -0
- package/dist-pkg/platform/heavy-catalogue.js +256 -0
- package/dist-pkg/platform/heavy-mirror.d.ts +20 -0
- package/dist-pkg/platform/heavy-mirror.js +73 -0
- package/dist-pkg/platform/heavy.d.ts +136 -0
- package/dist-pkg/platform/heavy.js +324 -0
- package/dist-pkg/platform/interruptible-speech.d.ts +23 -16
- package/dist-pkg/platform/interruptible-speech.js +77 -54
- 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 +90 -0
- package/dist-pkg/platform/locale-host.d.ts +14 -0
- package/dist-pkg/platform/locale-host.js +45 -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 +64 -0
- package/dist-pkg/platform/reading-in-worker.js +125 -0
- package/dist-pkg/platform/reading-model.d.ts +94 -0
- package/dist-pkg/platform/reading-model.js +272 -0
- package/dist-pkg/platform/reading-runtime.d.ts +24 -0
- package/dist-pkg/platform/reading-runtime.js +164 -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 +80 -0
- package/dist-pkg/platform/reading.js +136 -0
- package/dist-pkg/platform/speech-recognition.d.ts +60 -0
- package/dist-pkg/platform/speech-recognition.js +104 -0
- package/dist-pkg/platform/speech.d.ts +23 -1
- package/dist-pkg/platform/speech.js +29 -18
- 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 +85 -39
- package/dist-pkg/platform/tts.js +447 -127
- 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 +40 -0
- package/dist-pkg/platform/voice-listener.js +88 -0
- package/dist-pkg/platform/voice-plan.d.ts +15 -98
- package/dist-pkg/platform/voice-plan.js +56 -143
- package/dist-pkg/platform/vosk-runtime.d.ts +96 -0
- package/dist-pkg/platform/vosk-runtime.js +151 -0
- package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
- package/dist-pkg/platform/vosk-vocabulary.js +178 -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 +48 -12
- package/dist-pkg/render/crt.js +78 -80
- package/dist-pkg/render/cvd-matrices.d.ts +22 -18
- package/dist-pkg/render/cvd-matrices.js +37 -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 +67 -56
- package/dist-pkg/render/high-contrast.js +226 -217
- 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 +89 -86
- package/dist-pkg/render/viz-axes.js +128 -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 +45 -0
- package/dist-pkg/ui/aac-sets.js +41 -0
- package/dist-pkg/ui/audio-choices.d.ts +68 -0
- package/dist-pkg/ui/audio-choices.js +98 -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 +53 -0
- package/dist-pkg/ui/camera-control.js +48 -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/declared-words.d.ts +21 -0
- package/dist-pkg/ui/declared-words.js +66 -0
- 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 +94 -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 +157 -68
- package/dist-pkg/ui/fonts.js +305 -115
- package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
- package/dist-pkg/ui/footer-scroll-driver.js +201 -0
- package/dist-pkg/ui/footer-scroll.d.ts +38 -0
- package/dist-pkg/ui/footer-scroll.js +55 -0
- package/dist-pkg/ui/game-options.d.ts +47 -0
- package/dist-pkg/ui/game-options.js +158 -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 +87 -0
- package/dist-pkg/ui/help-panel.js +242 -0
- package/dist-pkg/ui/hud-bands.d.ts +62 -0
- package/dist-pkg/ui/hud-bands.js +146 -0
- package/dist-pkg/ui/hud-row.d.ts +34 -0
- package/dist-pkg/ui/hud-row.js +80 -0
- package/dist-pkg/ui/hud.d.ts +73 -73
- 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/layout.d.ts +103 -28
- package/dist-pkg/ui/layout.js +117 -99
- package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
- package/dist-pkg/ui/libras-avatar-clip.js +86 -0
- package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
- package/dist-pkg/ui/libras-avatar-load.js +134 -0
- package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
- package/dist-pkg/ui/libras-avatar-plan.js +211 -0
- package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
- package/dist-pkg/ui/libras-avatar-player.js +226 -0
- package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
- package/dist-pkg/ui/libras-avatar-stage.js +208 -0
- package/dist-pkg/ui/libras-glosses.d.ts +28 -0
- package/dist-pkg/ui/libras-glosses.js +161 -0
- 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 +61 -0
- package/dist-pkg/ui/menu-intent.js +88 -0
- package/dist-pkg/ui/menu-items.d.ts +20 -0
- package/dist-pkg/ui/menu-items.js +51 -0
- package/dist-pkg/ui/menu-nav.d.ts +98 -92
- package/dist-pkg/ui/menu-nav.js +398 -286
- 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 +150 -0
- package/dist-pkg/ui/panel-widgets.js +294 -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 +261 -347
- package/dist-pkg/ui/pause-icons.js +671 -601
- 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 +50 -0
- package/dist-pkg/ui/screen-text.d.ts +25 -0
- package/dist-pkg/ui/screen-text.js +152 -0
- package/dist-pkg/ui/session-clock.d.ts +32 -0
- package/dist-pkg/ui/session-clock.js +67 -0
- package/dist-pkg/ui/settings-aac.d.ts +70 -0
- package/dist-pkg/ui/settings-aac.js +208 -0
- package/dist-pkg/ui/settings-audio.d.ts +97 -114
- package/dist-pkg/ui/settings-audio.js +493 -425
- package/dist-pkg/ui/settings-controls.d.ts +53 -96
- 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 +192 -0
- package/dist-pkg/ui/settings-mobility.js +332 -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 +58 -45
- package/dist-pkg/ui/settings-panel.js +189 -94
- package/dist-pkg/ui/settings-typo.d.ts +29 -78
- package/dist-pkg/ui/settings-typo.js +158 -129
- 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 +112 -135
- package/dist-pkg/ui/shell.js +148 -217
- 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 +3 -12
- package/dist-pkg/ui/title.js +49 -18
- package/dist-pkg/ui/top-band.d.ts +26 -0
- package/dist-pkg/ui/top-band.js +96 -0
- package/dist-pkg/ui/typo-choices.d.ts +71 -0
- package/dist-pkg/ui/typo-choices.js +85 -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 +77 -10
- package/dist-pkg/ui/vlibras.js +130 -81
- package/dist-pkg/ui/voice-control.d.ts +68 -0
- package/dist-pkg/ui/voice-control.js +276 -0
- package/dist-pkg/ui/voice-settings.d.ts +95 -0
- package/dist-pkg/ui/voice-settings.js +352 -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 +300 -44
- package/docs/LICENSES.md +189 -145
- package/package.json +51 -27
- package/scripts/check-cartridge.mjs +78 -0
- package/scripts/game-build.d.mts +25 -0
- package/scripts/game-build.mjs +144 -0
- package/scripts/heavy-into-the-delivery.mjs +388 -0
- package/scripts/libras-avatar.json +680 -0
- package/scripts/libras-avatar.mjs +246 -0
- package/scripts/libras-glosses/gloss.py +95 -0
- package/scripts/libras-glosses/pyproject.toml +32 -0
- package/scripts/libras-glosses/uv.lock +781 -0
- package/scripts/libras-glosses.mjs +351 -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/OFL-1.1.txt +86 -0
- package/scripts/licences/UFL-1.0.txt +96 -0
- package/scripts/licences/fonts.mjs +389 -0
- package/scripts/licences/third-party.mjs +301 -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/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
- package/app/public/vendor/fonts/inter-400.woff2 +0 -0
- package/app/public/vendor/fonts/inter-700.woff2 +0 -0
- package/app/public/vendor/fonts/lato-400.woff2 +0 -0
- package/app/public/vendor/fonts/lato-700.woff2 +0 -0
- package/app/public/vendor/fonts/literata-400.woff2 +0 -0
- package/app/public/vendor/fonts/literata-700.woff2 +0 -0
- package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
- package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
- package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
- package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
- package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
- package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
- package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
- package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
- package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
- package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
- package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
- package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
- package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
- package/app/public/vendor/fonts/ufmag-400.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/guide-intensity.d.ts +0 -40
- package/dist-pkg/platform/guide-intensity.js +0 -73
- 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/latch-refusal.d.ts +0 -32
- package/dist-pkg/ui/latch-refusal.js +0 -60
- package/dist-pkg/ui/map-hub.d.ts +0 -56
- package/dist-pkg/ui/map-hub.js +0 -138
- package/dist-pkg/ui/settings-caa.d.ts +0 -45
- package/dist-pkg/ui/settings-caa.js +0 -137
- package/dist-pkg/ui/settings-motor.d.ts +0 -175
- package/dist-pkg/ui/settings-motor.js +0 -342
- package/dist-pkg/ui/webcam.d.ts +0 -7
- package/dist-pkg/ui/webcam.js +0 -93
|
@@ -1,116 +1,51 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// from the thin DOM-touching render()/handleCaptureKeydown(). DI via initSettingsControls(ctx): `$` (DOM
|
|
5
|
-
// selector), `srSay`/`srAlert`, `store` (save/reset persistence), the live `kb` value + `setKB` setter, and the
|
|
6
|
-
// shared per-player helpers (`kbFor`/`getNumPlayers`/`applyControls`/`assignControls`) that game.js also uses
|
|
7
|
-
// elsewhere (gamepad binding, HUD, other settings panels) and therefore stay there, injected. Overlay open/close
|
|
8
|
-
// plumbing (#options hidden toggle, focus management, Escape-closes-dialog) and the pad-button-design select are
|
|
9
|
-
// shared/unrelated infra and stay in game.js. `openHelp()` (pause-menu help screen) reuses `keyName`, which is
|
|
10
|
-
// exported here instead of duplicated.
|
|
11
|
-
//
|
|
12
|
-
// ⚠️ ELE TAMBÉM LIA O `ACT_LABEL`, E DEIXOU DE LER EM 2026-09-07. A tela de ajuda do cartucho passou a montar
|
|
13
|
-
// as linhas do preset dele (`acoesDoJogo`), que é quem sabe quantas posições este jogo usa e como elas se
|
|
14
|
-
// chamam. Com isso o `ACT_LABEL` ficou sem UM leitor sequer — conferido com `git grep` nos dois repositórios,
|
|
15
|
-
// e o que resta dele são comentários e a própria declaração. Ver `docs/6-DevOps-SRE/Breaking-Changes.md`.
|
|
16
|
-
import { t } from '../core/i18n.js';
|
|
17
|
-
import { ACTIONS, isAction } from '../core/actions.js';
|
|
2
|
+
import { isAction } from '../core/actions.js';
|
|
3
|
+
import { keyName, keyUsedByOther, actionAlreadyBound } from './control-choices.js';
|
|
18
4
|
import { markChanged } from './changed-mark.js';
|
|
5
|
+
import { controlRow } from './panel-widgets.js';
|
|
19
6
|
// ---------------------------------------------------------------------------------------------
|
|
20
7
|
// Pure logic (no `document`, testable in node)
|
|
21
8
|
// ---------------------------------------------------------------------------------------------
|
|
22
9
|
/**
|
|
23
|
-
*
|
|
10
|
+
* The platformer's eight positions, tied to the i18n keys of ITS words.
|
|
24
11
|
*
|
|
25
|
-
* ⚠️
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* que lista posição ↔ tecla). O `openHelp()` que o cabeçalho original citava não morreu — mudou de
|
|
30
|
-
* repositório com o cartucho (#111) e continua a ler daqui.
|
|
12
|
+
* ⚠️ DECLARED DEBT: the words of ONE game inside an engine module. Nothing in `app/js` reads it — the engine's help
|
|
13
|
+
* panel (`ui/help-panel`) and this remap panel ask the game for its words through `gameActions()`, because the engine
|
|
14
|
+
* knows a position exists and only the game knows what it is called (ADR-0086). It stays published only for a consumer
|
|
15
|
+
* that has not migrated; removing it is a change to published surface.
|
|
31
16
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* palavras de UM jogo dentro do motor. Esse uso saiu. O que resta é um consumidor para quem a tabela está
|
|
35
|
-
* certa — porque ele É o jogo de plataforma.
|
|
36
|
-
*
|
|
37
|
-
* ⚠️ REMOVÊ-LA NÃO É LIMPEZA, É MIGRAÇÃO. O cartucho já tem `acoesDoJogo()` (`main.ts:122`), derivado do
|
|
38
|
-
* preset dele; a tela de ajuda passar a usá-lo é edição de lá, e só depois disso é que isto pode sair daqui.
|
|
39
|
-
* Enquanto não sair, quem escrever código NOVO na engine pede a palavra ao jogo por `ctx.acoesDoJogo()` — a
|
|
40
|
-
* engine sabe que a posição existe, só o jogo sabe como ela se chama (ADR-0086).
|
|
41
|
-
*
|
|
42
|
-
* Guarda CHAVES e não texto porque uma `const` de módulo é avaliada uma vez no import, e o `dict` do
|
|
43
|
-
* `core/i18n` é um `let` que o `setLocale` reatribui — texto capturado aqui congelaria o idioma no boot.
|
|
17
|
+
* It holds KEYS and not text because a module `const` is evaluated once, on import, and `core/i18n`'s dictionary is
|
|
18
|
+
* reassigned by `setLocale` — text captured here would freeze the language at boot.
|
|
44
19
|
*/
|
|
45
20
|
export const ACT_LABEL = {
|
|
46
21
|
left: 'act.left', right: 'act.right', up: 'act.up', down: 'act.down',
|
|
47
22
|
action1: 'act.run', action2: 'act.jump', action4: 'act.swap', action3: 'act.especial',
|
|
48
23
|
};
|
|
24
|
+
/** The id of a position's button. It comes from the action's ABSTRACT name, unique by construction (`core/actions`). */
|
|
25
|
+
export const ctrlControlId = (action) => `ctrl-act-${action}`;
|
|
49
26
|
/**
|
|
50
|
-
*
|
|
51
|
-
* aconteceu: ela ainda diz quais são as palavras DESTE jogo — `act.run`, `act.jump` — dentro de um módulo de
|
|
52
|
-
* engine. Continua exportada porque `openHelp()` (a tela de ajuda do menu de pausa) ainda a lê, e mover as
|
|
53
|
-
* duas coisas no mesmo commit misturaria dois assuntos.
|
|
54
|
-
*
|
|
55
|
-
* O que MUDOU é quem manda: a lista de linhas e as palavras vêm agora de `ctx.acoesDoJogo()`, e esta tabela é
|
|
56
|
-
* só o que sobra para o consumidor que ainda não migrou. Quando `openHelp` perguntar ao jogo, ela sai.
|
|
57
|
-
*/
|
|
58
|
-
/** Physical key code -> short readable label. Only 'Space' has a word to translate; the rest are glyphs and
|
|
59
|
-
* bare letters, identical in every language (that is why this is a chain of replaces and not a table). */
|
|
60
|
-
export function keyName(code) {
|
|
61
|
-
return String(code)
|
|
62
|
-
.replace('Arrow', '↔')
|
|
63
|
-
.replace('Key', '')
|
|
64
|
-
.replace('Space', t('key.space'))
|
|
65
|
-
.replace('ShiftLeft', 'Shift')
|
|
66
|
-
.replace('ShiftRight', 'Shift');
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Which OTHER player already owns `code`, among `schemes` (one entry per player, same order as player index) —
|
|
70
|
-
* or -1 if free. `mapRef` (the scheme currently being edited) is excluded by reference, mirroring the original
|
|
71
|
-
* `keyUsedByOther(code, mapRef)` closing over `kbFor`/numPlayers in game.js. Built over a Map (code -> owner
|
|
72
|
-
* index) so a scheme with many bound keys doesn't cost a full re-scan per lookup.
|
|
73
|
-
*/
|
|
74
|
-
export function keyUsedByOther(code, mapRef, schemes) {
|
|
75
|
-
const owners = new Map();
|
|
76
|
-
schemes.forEach((m, i) => {
|
|
77
|
-
if (m === mapRef)
|
|
78
|
-
return;
|
|
79
|
-
for (const a of ACTIONS)
|
|
80
|
-
for (const c of m[a] || [])
|
|
81
|
-
if (!owners.has(c))
|
|
82
|
-
owners.set(c, i);
|
|
83
|
-
});
|
|
84
|
-
return owners.get(code) ?? -1;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Qual OUTRA ação DO MESMO esquema já tem `code` — ou `null` se nenhuma.
|
|
88
|
-
*
|
|
89
|
-
* ⚠️ O IRMÃO QUE FALTAVA AO `keyUsedByOther`, E A FALTA ERA INVISÍVEL NUM JOGO DE UM JOGADOR (#126). Aquele
|
|
90
|
-
* exclui o esquema em edição **por referência**; com um jogador só, `schemesFor()` devolve exatamente esse
|
|
91
|
-
* esquema, então a guarda varre uma lista vazia e **nunca pode disparar**. A criança que põe `W` numa ação
|
|
92
|
-
* nova continua com `W` na antiga, e passa o jogo inteiro com as duas a disparar juntas.
|
|
93
|
-
*
|
|
94
|
-
* ⚠️ E O DEFEITO É O PIOR FEITIO POSSÍVEL, escrito no cabeçalho do `input/default-bindings` desde sempre:
|
|
95
|
-
* «as duas ações disparam juntas, e a criança vê uma ação dupla intermitente que ninguém consegue reproduzir
|
|
96
|
-
* de propósito». Numa tela que ela abriu **porque** não conseguia usar os controles padrão.
|
|
27
|
+
* THE BUTTON'S FACE: the current keys, one `<kbd>` each.
|
|
97
28
|
*
|
|
98
|
-
* ⚠️
|
|
99
|
-
*
|
|
29
|
+
* ⚠️ With no key the button would have an empty face — a 44 px target with nothing to say —, so the change word comes
|
|
30
|
+
* back, which is where it still means something: there is no key to show, there is one to set.
|
|
100
31
|
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
32
|
+
* 📌 Through the DOM API and not a string: `keyName` returns a code's READABLE name, which may be translated tomorrow —
|
|
33
|
+
* translated text interpolated into markup is the door issue #106 closed.
|
|
103
34
|
*/
|
|
104
|
-
export function
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
35
|
+
export function drawKeys(t, button, codes) {
|
|
36
|
+
button.textContent = '';
|
|
37
|
+
if (!codes.length) {
|
|
38
|
+
button.textContent = t('ctrl.change');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
for (const code of codes) {
|
|
42
|
+
const key = button.ownerDocument.createElement('kbd');
|
|
43
|
+
key.textContent = keyName(t, code);
|
|
44
|
+
button.appendChild(key);
|
|
110
45
|
}
|
|
111
|
-
return null;
|
|
112
46
|
}
|
|
113
47
|
export function initSettingsControls(ctx) {
|
|
48
|
+
const { t } = ctx;
|
|
114
49
|
let kb = ctx.kb;
|
|
115
50
|
let capture = null;
|
|
116
51
|
let lastPlayer = 0;
|
|
@@ -119,25 +54,69 @@ export function initSettingsControls(ctx) {
|
|
|
119
54
|
return Array.from({ length: n }, (_, i) => ctx.kbFor(i));
|
|
120
55
|
}
|
|
121
56
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
57
|
+
* HOW THIS GAME CALLS this position, or `null` if it does not name it. One place, because several points need it and
|
|
58
|
+
* each fetching it on its own is how one of them reads the wrong table (#125).
|
|
124
59
|
*
|
|
125
|
-
* 🔴
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
60
|
+
* 🔴 NO FALLBACK TO THE ABSTRACT ID. ADR-0074 says so in so many words: the name the CHILD reads and hears is always
|
|
61
|
+
* the game's word, never `action1`, and an abstract name reaching a person is a defect. With the engine's DEFAULT
|
|
62
|
+
* scheme binding eight positions and a quiz naming three, a fallback would have the screen reader say a key already
|
|
63
|
+
* belongs to `action2` — precisely to the child who has no other channel.
|
|
129
64
|
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
|
|
65
|
+
* 📌 It is the same answer `core/actions.labellerFrom` gives: `null`, and the caller decides — an absence becomes one
|
|
66
|
+
* step less, never a mute step.
|
|
67
|
+
*/
|
|
68
|
+
function gameWordFor(a) {
|
|
69
|
+
return ctx.gameActions().find((x) => x.action === a)?.label ?? null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* THE LINE THAT SAYS WHOSE CONTROLLER THIS IS — «editing your controller, mode N players». There are no
|
|
73
|
+
* tabs for the other players: each child edits only their own, and only the mode changes the sentence.
|
|
133
74
|
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* custou dezasseis vezes; agora são uma.
|
|
75
|
+
* ⚠️ The sentence is split at the `{modo}` marker BEFORE substitution, so the mode can sit in a `<strong>`
|
|
76
|
+
* without the dictionary carrying markup (the `i18n-sem-markup` gate forbids that, rightly: a dictionary
|
|
77
|
+
* string that becomes markup is where a translation turns into code). It left raw Portuguese in #125.
|
|
138
78
|
*/
|
|
139
|
-
function
|
|
140
|
-
|
|
79
|
+
function drawModeLine(n) {
|
|
80
|
+
const tabs = ctx.$('#ctrl-players');
|
|
81
|
+
if (!tabs)
|
|
82
|
+
return;
|
|
83
|
+
tabs.hidden = false;
|
|
84
|
+
// The skeleton by `innerHTML` carries no outside data; the TEXT goes in by `textContent`.
|
|
85
|
+
tabs.innerHTML = '<span class="opt-hint" style="width:100%;margin:0">'
|
|
86
|
+
+ '<span data-modo="pre"></span><strong data-modo="v"></strong><span data-modo="pos"></span></span>';
|
|
87
|
+
const [before, after] = t('ctrl.editingYours').split('{modo}');
|
|
88
|
+
const setText = (sel, txt) => {
|
|
89
|
+
const part = tabs.querySelector(sel);
|
|
90
|
+
if (part)
|
|
91
|
+
part.textContent = txt;
|
|
92
|
+
};
|
|
93
|
+
setText('[data-modo="pre"]', before ?? '');
|
|
94
|
+
setText('[data-modo="v"]', n === 1 ? t('ctrl.mode.one') : t('ctrl.mode.many', { n }));
|
|
95
|
+
setText('[data-modo="pos"]', after ?? '');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* THE «LEFT THE DEFAULT» MARK (ADR-0029), on every row whose keys differ from this seat's factory scheme.
|
|
99
|
+
* It is missed most in this menu, whose whole reason to exist is changing things: without it a child who
|
|
100
|
+
* remapped heard the action names and nothing said where they had changed something.
|
|
101
|
+
*
|
|
102
|
+
* ⚠️ The default comes from the host (`ctx.defaultSchemeFor`), like `kbFor`: which scheme a player count uses is
|
|
103
|
+
* theirs, and a second copy here would drift. And never `resetKB` to read it — it is DESTRUCTIVE
|
|
104
|
+
* (`input/keyboard.resetKB` removes the stored scheme first), so calling it per render would erase the
|
|
105
|
+
* child's remapping.
|
|
106
|
+
*
|
|
107
|
+
* 📌 It compares the LIST OF CODES, not object identity: re-binding the SAME key is not a change, and a child
|
|
108
|
+
* who tries something and goes back cannot be left with the mark lit for good.
|
|
109
|
+
*/
|
|
110
|
+
function markWhatLeftTheDefault(list, player) {
|
|
111
|
+
const factory = ctx.defaultSchemeFor(player);
|
|
112
|
+
const now = ctx.kbFor(player);
|
|
113
|
+
const sameKeys = (a, b) => (a ?? []).length === (b ?? []).length && (a ?? []).every((k, i) => k === (b ?? [])[i]);
|
|
114
|
+
for (const row of list.querySelectorAll('.ctrl-row')) {
|
|
115
|
+
const act = row.querySelector('button[data-act]')?.dataset.act;
|
|
116
|
+
if (!act || !isAction(act))
|
|
117
|
+
continue;
|
|
118
|
+
markChanged(t, row, !sameKeys(now[act], factory[act]));
|
|
119
|
+
}
|
|
141
120
|
}
|
|
142
121
|
function render(selPlayer) {
|
|
143
122
|
const el = ctx.$('#ctrl-list');
|
|
@@ -146,112 +125,61 @@ export function initSettingsControls(ctx) {
|
|
|
146
125
|
const n = ctx.getNumPlayers();
|
|
147
126
|
const player = selPlayer >= n ? 0 : selPlayer;
|
|
148
127
|
lastPlayer = player;
|
|
149
|
-
|
|
150
|
-
//
|
|
151
|
-
// ⚠️ ESTA FRASE ESTAVA EM PORTUGUÊS CRU DENTRO DO MOTOR (#125), inteira, com o `<strong>` e o plural à
|
|
152
|
-
// mão. Vai pelo `t()` agora — e o realce sobrevive porque o molde é PARTIDO no marcador `{modo}` antes
|
|
153
|
-
// da substituição, em vez de o dicionário carregar markup (que o gate `i18n-sem-markup` proíbe, e com
|
|
154
|
-
// razão: string de dicionário que vira markup é a porta por onde uma tradução passa a ser código).
|
|
155
|
-
const tabs = ctx.$('#ctrl-players');
|
|
156
|
-
if (tabs) {
|
|
157
|
-
tabs.hidden = false;
|
|
158
|
-
// O esqueleto por `innerHTML` — ele não tem dado nenhum de fora; o TEXTO entra por `textContent`, que
|
|
159
|
-
// é o mesmo idioma que o `.ctrl-nome` abaixo já usa.
|
|
160
|
-
tabs.innerHTML = '<span class="opt-hint" style="width:100%;margin:0">'
|
|
161
|
-
+ '<span data-modo="pre"></span><strong data-modo="v"></strong><span data-modo="pos"></span></span>';
|
|
162
|
-
const [antes, depois] = t('ctrl.editingYours').split('{modo}');
|
|
163
|
-
const posto = (sel, txt) => {
|
|
164
|
-
const el2 = tabs.querySelector(sel);
|
|
165
|
-
if (el2)
|
|
166
|
-
el2.textContent = txt;
|
|
167
|
-
};
|
|
168
|
-
posto('[data-modo="pre"]', antes ?? '');
|
|
169
|
-
posto('[data-modo="v"]', n === 1 ? t('ctrl.mode.one') : t('ctrl.mode.many', { n }));
|
|
170
|
-
posto('[data-modo="pos"]', depois ?? '');
|
|
171
|
-
}
|
|
128
|
+
drawModeLine(n);
|
|
172
129
|
const map = ctx.kbFor(player);
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
// `core/actions`. É separação que o ADR-0086 fez, e é ela que torna um dos dois seguro e o outro não.
|
|
177
|
-
el.innerHTML = ctx.acoesDoJogo().map(({ acao: a }) => `<div class="ctrl-row"><span><b class="ctrl-nome"></b>: ${(map[a] || []).map(keyName).map((k) => `<kbd>${k}</kbd>`).join(' ')}</span>` +
|
|
178
|
-
`<button class="mode-btn" data-act="${a}" type="button">${t('ctrl.change')}</button></div>`).join('');
|
|
179
|
-
// As palavras do jogo, por API do DOM — que escapa por construção. A ordem casa porque é a mesma lista.
|
|
180
|
-
//
|
|
181
|
-
// ⚠️ O `aria-label` DESCEU PARA CÁ, E É A CORREÇÃO DA #125. Ele era montado no template acima a partir do
|
|
182
|
-
// `ACT_LABEL`, que ficou a ser a tabela do JOGO DE PLATAFORMA quando a #106 mudou o rótulo visível para o
|
|
183
|
-
// `acoesDoJogo()`. Medido no `game-soccer`: **«Alterar tecla de undefined do Jogador 1» em seis de doze
|
|
184
|
-
// botões**, enquanto uma criança que vê lia «Conter» na mesma linha. E um `aria-label` SOBREPÕE-SE ao
|
|
185
|
-
// texto visível, então quem depende do leitor de tela ouvia a palavra errada nos outros seis — que é pior
|
|
186
|
-
// do que não ter `aria-label` nenhum, e invisível de dentro da engine, porque a plataforma é o único
|
|
187
|
-
// consumidor para o qual a tabela está certa.
|
|
188
|
-
//
|
|
189
|
-
// ⚠️ E DESCEU POR `setAttribute` E NÃO PARA O TEMPLATE, de propósito: o `rotulo` é TEXTO DO JOGO. Metê-lo
|
|
190
|
-
// num `aria-label="…"` dentro de um template literal seria interpolar texto de fora em markup — o mesmo
|
|
191
|
-
// motivo pelo qual o `.ctrl-nome` já entrava por `textContent`.
|
|
192
|
-
{
|
|
193
|
-
const linhas = el.querySelectorAll('.ctrl-row');
|
|
194
|
-
const palavras = ctx.acoesDoJogo();
|
|
195
|
-
for (let i = 0; i < linhas.length && i < palavras.length; i++) {
|
|
196
|
-
const nome = linhas[i].querySelector('.ctrl-nome');
|
|
197
|
-
if (nome)
|
|
198
|
-
nome.textContent = palavras[i].rotulo;
|
|
199
|
-
const botao = linhas[i].querySelector('button[data-act]');
|
|
200
|
-
if (botao)
|
|
201
|
-
botao.setAttribute('aria-label', t('ctrl.changeKeyAria', { acao: palavras[i].rotulo, n: player + 1 }));
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* A MARCA DE «SAIU DO PADRÃO» (ADR-0029), e este era o ÚLTIMO menu sem ela.
|
|
206
|
-
*
|
|
207
|
-
* ⚠️ E É O MENU ONDE ELA MAIS FALTAVA, porque é o único cuja razão de existir é mexer: uma criança que
|
|
208
|
-
* remapeou as teclas percorria a lista, ouvia os nomes das acções, e nada lhe dizia onde ela própria tinha
|
|
209
|
-
* alterado. Os três canais do ADR-0029 — cor, forma (anéis) e NOME — passam a valer aqui.
|
|
130
|
+
/*
|
|
131
|
+
* 🎯 THE ROWS COME FROM THE KIT (ADR-0129), and the button's face is the current key — the Dev, asked whether the
|
|
132
|
+
* change word was worth keeping: «Não vale, vamos de B».
|
|
210
133
|
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
134
|
+
* 🔴 AND THE REASON IS NOT TASTE, IT IS A COLLISION: `fillExplain` acts on any row with a short `<strong>` label by
|
|
135
|
+
* keeping only that label in the `<span>`, so keys placed inside the label's `<span>` would be wiped and the key text
|
|
136
|
+
* sent to the footer as if it were an explanation. The keys go INSIDE the control, the same answer `mountSteps`
|
|
137
|
+
* gives to a label plus a live value.
|
|
214
138
|
*
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
* 📌 COMPARA-SE A LISTA DE CÓDIGOS, não a identidade do objecto: reatribuir a MESMA tecla não é uma
|
|
220
|
-
* mudança, e uma criança que experimenta e volta atrás não pode ficar com a marca acesa para sempre.
|
|
139
|
+
* ⚠️ The game's word goes in through `textContent` (`controlRow` writes `label` that way) and the accessible name by
|
|
140
|
+
* `setAttribute` (`ariaLabel`), the two fixes issues #106 and #125 paid for: `label` is GAME TEXT this tree does not
|
|
141
|
+
* review, and a wrong `aria-label` OVERRIDES the visible text.
|
|
221
142
|
*/
|
|
222
|
-
{
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
143
|
+
const panelCtx = { find: (sel) => ctx.$(sel), create: (tag) => el.ownerDocument.createElement(tag) };
|
|
144
|
+
el.textContent = '';
|
|
145
|
+
for (const { action: a, label: label } of ctx.gameActions()) {
|
|
146
|
+
const { row: row, control: control } = controlRow(panelCtx, {
|
|
147
|
+
id: ctrlControlId(a),
|
|
148
|
+
label: label,
|
|
149
|
+
shape: 'button',
|
|
150
|
+
ariaLabel: t('ctrl.changeKeyAria', { acao: label, n: player + 1 }),
|
|
151
|
+
});
|
|
152
|
+
// `data-act` stays, and the difference from `label` is the reason: `a` is the position's ABSTRACT name, which the
|
|
153
|
+
// engine enumerates in `core/actions`, and `label` is the GAME's word (ADR-0086).
|
|
154
|
+
control.dataset.act = a;
|
|
155
|
+
drawKeys(t, control, map[a] ?? []);
|
|
156
|
+
el.appendChild(row);
|
|
232
157
|
}
|
|
158
|
+
markWhatLeftTheDefault(el, player);
|
|
233
159
|
el.querySelectorAll('button[data-act]').forEach((b) => {
|
|
234
160
|
b.addEventListener('click', () => {
|
|
235
|
-
// ⚠️ `isAction`
|
|
236
|
-
//
|
|
237
|
-
//
|
|
161
|
+
// ⚠️ `isAction` AND NOT JUST `if (!act)`: the value comes from a DOM attribute, and the scheme accepts only the
|
|
162
|
+
// fourteen positions (#118). A capture started on an invented position would store a key under a name no
|
|
163
|
+
// transport reads — the child would press the new key and nothing would happen.
|
|
238
164
|
const act = b.dataset.act;
|
|
239
165
|
if (!act || !isAction(act))
|
|
240
166
|
return;
|
|
241
|
-
// ⚠️
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
const
|
|
246
|
-
if (!
|
|
167
|
+
// ⚠️ NO WORD, NO QUESTION — `labellerFrom`'s rule, applied where it is visible: if the game does not use it,
|
|
168
|
+
// there is nothing to map. The rows all come from `gameActions()`, so this does not happen today — and that
|
|
169
|
+
// guarantee is written rather than assumed, because whoever breaks it tomorrow wakes an announcement with no
|
|
170
|
+
// subject.
|
|
171
|
+
const word = gameWordFor(act);
|
|
172
|
+
if (!word)
|
|
247
173
|
return;
|
|
248
|
-
capture = { action: act, mapRef: map
|
|
249
|
-
b.textContent = t('ctrl.pressing'); //
|
|
250
|
-
ctx.srAlert(t('sr.ctrl.pressNewKey', { acao:
|
|
174
|
+
capture = { action: act, mapRef: map };
|
|
175
|
+
b.textContent = t('ctrl.pressing'); // from the dictionary, never raw text inside the engine (#125)
|
|
176
|
+
ctx.srAlert(t('sr.ctrl.pressNewKey', { acao: word, n: player + 1 }));
|
|
251
177
|
});
|
|
252
178
|
});
|
|
253
|
-
//
|
|
254
|
-
|
|
179
|
+
// The prose goes back to the footer after the rows are rebuilt (CLAUDE.md §4, #109).
|
|
180
|
+
// ⚠️ ON THE CARD THAT HOLDS THE LIST, not a fixed `#options`: the engine mounts this panel with another id (`#ctrl`,
|
|
181
|
+
// ADR-0151), and the footer of a panel that is not open is not this child's.
|
|
182
|
+
ctx.fillExplain?.(el.closest('.overlay__card'));
|
|
255
183
|
}
|
|
256
184
|
function isCapturing() {
|
|
257
185
|
return capture !== null;
|
|
@@ -272,23 +200,23 @@ export function initSettingsControls(ctx) {
|
|
|
272
200
|
if (other >= 0) {
|
|
273
201
|
ctx.srAlert(t('sr.ctrl.keyTaken', { n: other + 1 }));
|
|
274
202
|
e.preventDefault();
|
|
275
|
-
return true; //
|
|
203
|
+
return true; // does not bind: keeps capturing
|
|
276
204
|
}
|
|
277
|
-
//
|
|
278
|
-
//
|
|
279
|
-
//
|
|
280
|
-
//
|
|
281
|
-
const
|
|
282
|
-
if (
|
|
283
|
-
// ⚠️ `
|
|
284
|
-
//
|
|
285
|
-
//
|
|
286
|
-
const
|
|
287
|
-
ctx.srAlert(
|
|
288
|
-
? t('sr.ctrl.keyTakenHere', { acao:
|
|
205
|
+
// THE SAME guard, inside the scheme itself (#126). It refuses instead of MOVING, and the choice has a reason: moving
|
|
206
|
+
// would leave the old action with an empty list — which `bindingProblems` classifies as a problem, and which the
|
|
207
|
+
// child would discover mid-game, with no announcement, as an action that stopped existing. Refusing costs two steps
|
|
208
|
+
// (free the old one, bind the new one) and loses nothing on the way.
|
|
209
|
+
const here = actionAlreadyBound(e.code, capture.mapRef, capture.action);
|
|
210
|
+
if (here) {
|
|
211
|
+
// ⚠️ `here` COMES FROM THE SCHEME, and the scheme binds positions the game may not name. With no word, the sentence
|
|
212
|
+
// says the truth that MATTERS (the key is taken here) instead of the internal name: silence would be the twin
|
|
213
|
+
// defect, and saying `action2` would be the defect.
|
|
214
|
+
const word = gameWordFor(here);
|
|
215
|
+
ctx.srAlert(word
|
|
216
|
+
? t('sr.ctrl.keyTakenHere', { acao: word })
|
|
289
217
|
: t('sr.ctrl.keyTakenHereUnnamed'));
|
|
290
218
|
e.preventDefault();
|
|
291
|
-
return true; //
|
|
219
|
+
return true; // does not bind: keeps capturing
|
|
292
220
|
}
|
|
293
221
|
capture.mapRef[capture.action] = [e.code];
|
|
294
222
|
ctx.store.saveKB(kb);
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
2
|
import { type VizMode } from '../render/viz-modes.js';
|
|
3
|
+
import type { Audio } from '../platform/audio.js';
|
|
4
|
+
import type { Translate } from '../core/i18n.js';
|
|
3
5
|
/**
|
|
4
|
-
*
|
|
6
|
+
* The slice of the catalogue THIS panel shows: only what SIMULATES a disability.
|
|
5
7
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* The catalogue's `kind` does not tell simulating from correcting, so a filter by `kind` brings the colour-blindness
|
|
9
|
+
* corrections into a menu about feeling what a disability is like — a colour-blind child would have to enter it to find
|
|
10
|
+
* the correction for their own condition, beside the button that simulates it for someone who does not have it. Two
|
|
11
|
+
* opposite audiences in one list.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* (aqui, no main.js e uma derivada morta), todas respondendo pelo `kind`, todas errando junto.
|
|
13
|
+
* The Dev decided (#60): the corrections live in visual accessibility, and this list is cut by `simulatesDisability`,
|
|
14
|
+
* which answers the right question.
|
|
14
15
|
*/
|
|
15
16
|
export declare const EMPATHY_VIZ_MODES: VizMode[];
|
|
16
17
|
/** On/off label shared by every toggle button in this panel (hearing, one-button, wheelchair). */
|
|
17
18
|
export interface EmpathySettingsCtx {
|
|
19
|
+
/** Translates in the page's language — the root's translator (ADR-0232 D3). REQUIRED: text built from nowhere is a raw key. */
|
|
20
|
+
t: Translate;
|
|
18
21
|
/** ui/dom.ts querySelector shortcut. */
|
|
19
22
|
$<T extends Element = Element>(sel: string): T | null;
|
|
20
23
|
/** core/a11y-sr.ts screen-reader announcer. */
|
|
@@ -23,46 +26,52 @@ export interface EmpathySettingsCtx {
|
|
|
23
26
|
store: {
|
|
24
27
|
getBool(key: string, fallback?: boolean): boolean;
|
|
25
28
|
};
|
|
26
|
-
/** Renders one viz-mode radio list (+ per-player tabs); shared with settings-visual
|
|
29
|
+
/** Renders one viz-mode radio list (+ per-player tabs); shared with settings-visual. */
|
|
27
30
|
renderVizGroup(listSel: string, tabsSel: string, modes: VizMode[]): void;
|
|
28
|
-
/** Reflects #opt-onebtn/#opt-wheelchair;
|
|
29
|
-
|
|
31
|
+
/** Reflects #opt-onebtn/#opt-wheelchair; the host also calls it from its setOneButton/setWheelchair bodies. */
|
|
32
|
+
reflectMobilityEmpathy(): void;
|
|
30
33
|
/** Reflects the #opt-visual/#opt-empathy summary buttons; shared across every viz-mode change in the game. */
|
|
31
34
|
reflectVizButtons(): void;
|
|
32
|
-
/** Brings an overlay to front + fills its footer explanations; shared by every
|
|
35
|
+
/** Brings an overlay to front + fills its footer explanations; shared by every settings panel. */
|
|
33
36
|
frontOverlay(el: HTMLElement | null): void;
|
|
34
37
|
/**
|
|
35
|
-
*
|
|
38
|
+
* Moves the rows' prose to the footer (`ui/settings-panel` → `fillExplain`). Called on EVERY render.
|
|
36
39
|
*
|
|
37
|
-
* ⚠️
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
40
|
+
* ⚠️ AND HERE THE REBUILD IS NOT VISIBLE IN THE FILE. This panel has no `innerHTML` at all: the list is rebuilt by
|
|
41
|
+
* the injected `renderVizGroup`, whose implementation (`render/viz-setters`) sets `el.innerHTML` and returns NEW
|
|
42
|
+
* `.ctrl-row`s, with the `.opt-hint` back inside and without the `data-explain-done` that makes `fillExplain`
|
|
43
|
+
* idempotent.
|
|
41
44
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
+
* That happens on every click on a simulation and every use of the hearing-loss button — the worst possible case,
|
|
46
|
+
* because the child who just switched on the total-blindness simulation has a black screen and depends on the
|
|
47
|
+
* `aria-live` footer to know where they are.
|
|
45
48
|
*
|
|
46
|
-
*
|
|
49
|
+
* Optional (`?.`) as in the siblings: a consumer that does not inject it still draws the panel.
|
|
47
50
|
*/
|
|
48
51
|
fillExplain?: (card: HTMLElement | null) => void;
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
52
|
+
/** Returns focus to whoever opened the dialog (ui/settings-panel `restoreFocus`). Injected, not a fixed `#opt-*`:
|
|
53
|
+
* that id does not exist in the document, so closing would leave focus on `<body>`. */
|
|
51
54
|
restoreFocus?: (id: string) => boolean;
|
|
52
|
-
/**
|
|
55
|
+
/**
|
|
56
|
+
* THE ROOT'S SOUND, narrowed to the hearing-loss simulation (ADR-0232 D4): `hearingLoss` read live for the button and the
|
|
57
|
+
* mark, and `setHearingLossGraph` to restore the stored simulation at boot. REQUIRED: the graph lives in the root's `Audio`,
|
|
58
|
+
* and there is no page-wide one to fall back on. Pass the `Audio` itself — a copied `hearingLoss` would freeze the button.
|
|
59
|
+
*/
|
|
60
|
+
hearing: Pick<Audio, 'hearingLoss' | 'setHearingLossGraph'>;
|
|
61
|
+
/** Persists + applies the audio graph change (and announces); the body is the host's. */
|
|
53
62
|
setHearingLoss(on: boolean): void;
|
|
54
|
-
/** Persists + applies one-button-only play (and announces); body
|
|
63
|
+
/** Persists + applies one-button-only play (and announces); the body is the host's. */
|
|
55
64
|
setOneButton(on: boolean): void;
|
|
56
|
-
/** Persists +
|
|
65
|
+
/** Persists + applies wheelchair mode (and announces); the body is the host's. */
|
|
57
66
|
setWheelchair(on: boolean): void;
|
|
58
|
-
/** Live reads of
|
|
67
|
+
/** Live reads of the host's oneButton/wheelchair booleans. */
|
|
59
68
|
getOneButton(): boolean;
|
|
60
69
|
getWheelchair(): boolean;
|
|
61
|
-
/**
|
|
70
|
+
/** Live players (core/state `players`), only to know WHICH visual mode each one is using now. */
|
|
62
71
|
getPlayers(): readonly {
|
|
63
72
|
viz: string;
|
|
64
73
|
}[];
|
|
65
|
-
/**
|
|
74
|
+
/** The same setPlayerViz as the visual panel and the contrast shortcut; used here only by the reset. */
|
|
66
75
|
setPlayerViz(i: number, mode: string): void;
|
|
67
76
|
}
|
|
68
77
|
export interface EmpathySettingsApi {
|
|
@@ -73,5 +82,5 @@ export interface EmpathySettingsApi {
|
|
|
73
82
|
/** Closes the #empathy overlay and returns focus to #opt-empathy. */
|
|
74
83
|
close(): void;
|
|
75
84
|
}
|
|
76
|
-
/** Wires the empathy panel's DOM (buttons + boot restore) and returns render/open/close for
|
|
85
|
+
/** Wires the empathy panel's DOM (buttons + boot restore) and returns render/open/close for the host to call. */
|
|
77
86
|
export declare function initSettingsEmpathy(ctx: EmpathySettingsCtx): EmpathySettingsApi;
|