@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,183 +1,118 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/storage.ts —
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
2
|
+
// platform/storage.ts — the single persistence layer, as a FACTORY: `createStorage(backend)` wraps the browser object it is
|
|
3
|
+
// given (ADR-0232 point 2). The composition root builds the one store of a page from what the HOST lends it, and every
|
|
4
|
+
// module that persists receives that store through its ctx or deps (issue #207).
|
|
5
|
+
//
|
|
6
|
+
// Exception-proof: `localStorage` THROWS on file:// and in some browsers' private mode, and that used to bring the whole
|
|
7
|
+
// boot down (hence every access is try/catch). Centralised here: one place to change the strategy (namespacing,
|
|
8
|
+
// IndexedDB…) without hunting dozens of call sites.
|
|
9
|
+
/**
|
|
10
|
+
* THE STORE, built around the backend it is GIVEN (ADR-0232). `null` is a host with no storage at all: every read gives its
|
|
11
|
+
* fallback and every write reports `false` — the same answer a throwing `localStorage` gives, so the two cannot differ.
|
|
12
|
+
*
|
|
13
|
+
* 📌 CLOSURES AND NOT METHODS ON `this`: `loadLocale({ ...store, ...hooks })` spreads the store into another object, and a
|
|
14
|
+
* method that read `this` would lose its backend in the spread.
|
|
15
|
+
*/
|
|
16
|
+
export function createStorage(backend) {
|
|
17
|
+
function get(key, fallback = null) {
|
|
18
|
+
try {
|
|
19
|
+
const v = backend ? backend.getItem(key) : null;
|
|
20
|
+
return v == null ? fallback : v;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
22
25
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
try {
|
|
37
|
-
const s = get(key, null);
|
|
38
|
-
return s == null ? fallback : JSON.parse(s);
|
|
26
|
+
const set = (key, value) => {
|
|
27
|
+
if (!backend)
|
|
28
|
+
return false;
|
|
29
|
+
try {
|
|
30
|
+
backend.setItem(key, String(value));
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const remove = (key) => { try {
|
|
38
|
+
backend?.removeItem(key);
|
|
39
39
|
}
|
|
40
|
-
catch {
|
|
41
|
-
|
|
40
|
+
catch { /* noop */ } };
|
|
41
|
+
const getJSON = (key, fallback = null) => {
|
|
42
|
+
try {
|
|
43
|
+
const s = get(key, null);
|
|
44
|
+
return s == null ? fallback : JSON.parse(s);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return fallback;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
function getWithLegacy(newKey, legacyKey, fallback = null) {
|
|
51
|
+
const v = get(newKey, null);
|
|
52
|
+
if (v !== null)
|
|
53
|
+
return v;
|
|
54
|
+
const inherited = get(legacyKey, null);
|
|
55
|
+
return inherited !== null ? inherited : fallback;
|
|
42
56
|
}
|
|
57
|
+
return {
|
|
58
|
+
get, set, remove, getJSON, getWithLegacy,
|
|
59
|
+
getBool: (key, fallback = false) => { const v = get(key, null); return v == null ? fallback : v === '1'; },
|
|
60
|
+
setBool: (key, on) => { set(key, on ? '1' : '0'); },
|
|
61
|
+
getNum: (key, fallback = 0) => {
|
|
62
|
+
const v = get(key, null);
|
|
63
|
+
const n = v == null ? NaN : parseFloat(v);
|
|
64
|
+
return isFinite(n) ? n : fallback;
|
|
65
|
+
},
|
|
66
|
+
setJSON: (key, obj) => { try {
|
|
67
|
+
set(key, JSON.stringify(obj));
|
|
68
|
+
}
|
|
69
|
+
catch { /* noop */ } },
|
|
70
|
+
getJsonWithLegacy: (newKey, legacyKey, fallback = null) => {
|
|
71
|
+
const v = getJSON(newKey, null);
|
|
72
|
+
if (v !== null)
|
|
73
|
+
return v;
|
|
74
|
+
const inherited = getJSON(legacyKey, null);
|
|
75
|
+
return inherited !== null ? inherited : fallback;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
43
78
|
}
|
|
44
|
-
|
|
45
|
-
|
|
79
|
+
/**
|
|
80
|
+
* A backend kept in memory, seeded with `entries` — for a host with no storage worth writing to, and for a test: a file that
|
|
81
|
+
* builds its own cannot inherit another file's keys nor race it for them (ADR-0232 driver D4, the browser suite's F9).
|
|
82
|
+
*/
|
|
83
|
+
export function memoryBackend(entries = []) {
|
|
84
|
+
const kept = new Map(entries);
|
|
85
|
+
return {
|
|
86
|
+
getItem: (key) => kept.get(key) ?? null,
|
|
87
|
+
setItem: (key, value) => { kept.set(key, String(value)); },
|
|
88
|
+
removeItem: (key) => { kept.delete(key); },
|
|
89
|
+
};
|
|
46
90
|
}
|
|
47
|
-
|
|
48
|
-
/* ===================== os DOIS escopos (save com namespace, ADR-0027 passo 7) ===================== */
|
|
91
|
+
/* ===================== the TWO scopes (namespaced saves, ADR-0027 step 7) ===================== */
|
|
49
92
|
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
93
|
+
// The obvious namespacing — a per-game prefix on EVERYTHING — would be a serious accessibility defect, and it is worth
|
|
94
|
+
// saying why before saying what was done.
|
|
52
95
|
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
// é justamente quem tem menos margem para refazê-los. (O número que estava aqui era 35, do plano que morreu
|
|
57
|
-
// em 2026-08-28; o catálogo do MVP são 300+ jogos, o que só torna o argumento mais forte.)
|
|
96
|
+
// A blind child sets up blind mode, the cane, the voice, the narration speed. A colour-blind child picks the correction.
|
|
97
|
+
// A dyslexic child picks the font. If every game had its own namespace, they would have to REDO all of that in every
|
|
98
|
+
// game — and whoever depends most on the settings is exactly whoever has the least margin to redo them.
|
|
58
99
|
//
|
|
59
|
-
//
|
|
100
|
+
// So there are TWO scopes, and the line between them is not technical, it is about whom the thing belongs to:
|
|
60
101
|
//
|
|
61
|
-
// ·
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
// demonstração. Dois jogos com um "nível 3" não são o mesmo nível 3.
|
|
102
|
+
// · SHARED (`incl_*`) — what belongs to the CHILD: accessibility, typography, language, voice, controls, touch. It
|
|
103
|
+
// follows them from game to game, on purpose: a second game reading the font chosen in the first is RIGHT.
|
|
104
|
+
// · THE GAME'S (`incl.<game>.*`) — what belongs to THIS play-through: activity, level, scenery, the demo recording.
|
|
105
|
+
// Two games with a "level 3" do not have the same level 3.
|
|
66
106
|
//
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
107
|
+
// THE READ INHERITS FROM THE OLD KEY and the write goes to the new one only (`getWithLegacy`). No migration step, because
|
|
108
|
+
// a scheduled migration would arrive after the reads. And the old key stays where it is: it is the child's data, not mine
|
|
109
|
+
// to delete, and keeping it is what makes a way back possible.
|
|
70
110
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* no mesmo perfil de navegador colidiam em `activity`, `quizlevel`, `cenario`, `tabsel`, `fracnot` e em toda
|
|
76
|
-
* gravação `attract_*`. Um sobrescrevia o progresso do outro sem erro nenhum.
|
|
77
|
-
*
|
|
78
|
-
* ⚠️ E O ID NÃO VEM DA DECLARAÇÃO, que era o desenho óbvio. Ele não pode: `game/state` lê o armazenamento no
|
|
79
|
-
* IMPORT, e o import corre antes de qualquer `createGame()`. Um id vindo da declaração chegaria depois de as
|
|
80
|
-
* três chaves já terem sido resolvidas — contra vazio, e em silêncio. Quem sabe o próprio id é o JOGO, que o
|
|
81
|
-
* passa como constante sua; o ADR-0080 proíbe a ENGINE de o saber, não o jogo.
|
|
111
|
+
* THE KEYS OUTSIDE EVERY ENGINE SCOPE (study item E2): not the child's `incl_*` (and the older `inclusionist.*`), not a
|
|
112
|
+
* game's `incl.<game>.*`. 📏 Measured: pinball stores `pinball:*`. ⚠️ A game's data stored in the CHILD's scope
|
|
113
|
+
* (chess's `incl_chess_*`) is not seen: the engine's own `incl_` keys are not one closed list, so that question would
|
|
114
|
+
* accuse the engine.
|
|
82
115
|
*/
|
|
83
|
-
export function
|
|
84
|
-
|
|
85
|
-
const v = get(nova, null);
|
|
86
|
-
if (v !== null)
|
|
87
|
-
return v;
|
|
88
|
-
const antigo = get(legada, null);
|
|
89
|
-
return antigo !== null ? antigo : fallback;
|
|
90
|
-
}
|
|
91
|
-
/** O par de `getComLegado` para valor em JSON — a herança tem de valer para os dois formatos, senão metade
|
|
92
|
-
* das chaves migra e a outra metade some, que é o pior dos dois mundos. */
|
|
93
|
-
export function getJSONComLegado(nova, legada, fallback = null) {
|
|
94
|
-
const v = getJSON(nova, null);
|
|
95
|
-
if (v !== null)
|
|
96
|
-
return v;
|
|
97
|
-
const antigo = getJSON(legada, null);
|
|
98
|
-
return antigo !== null ? antigo : fallback;
|
|
116
|
+
export function keysOutsideScopes(storedKeys) {
|
|
117
|
+
return [...storedKeys].filter((k) => !k.startsWith('incl_') && !k.startsWith('inclusionist.') && !k.startsWith('incl.'));
|
|
99
118
|
}
|
|
100
|
-
// Registro das chaves conhecidas (documentação em UM lugar; a fonte de verdade ainda é o uso). Vai sendo
|
|
101
|
-
// completado à medida que os lotes migram. Chaves com {i}/{cen}/{id} são parametrizadas por jogador/cenário/controle.
|
|
102
|
-
export const KEYS = {
|
|
103
|
-
// empatia motora/auditiva
|
|
104
|
-
onebtn: 'incl_onebtn', wheelchair: 'incl_wheelchair', modocego: 'incl_modocego', caneDiv: 'incl_cane_div',
|
|
105
|
-
hearingloss: 'incl_hearingloss',
|
|
106
|
-
// atividade / quiz / cenário — ESCOPO DO JOGO (ver os dois escopos acima). `*Legado` é o nome antigo, de
|
|
107
|
-
// onde a leitura herda uma vez; a escrita vai só para o novo.
|
|
108
|
-
//
|
|
109
|
-
// ⚠️ SÃO FUNÇÕES DO ID DO JOGO, e as da criança são strings. A diferença de FORMA é o que impede o engano:
|
|
110
|
-
// não há como prefixar por engano uma preferência da criança, porque ela não tem onde receber o id — e não
|
|
111
|
-
// há como esquecer de escopar uma chave da partida, porque sem o argumento não compila. A regra que antes
|
|
112
|
-
// vivia só num comentário passou a viver no tipo.
|
|
113
|
-
activity: (jogo) => kJogo(jogo, 'activity'), activityLegado: 'incl_activity',
|
|
114
|
-
quizlevel: (jogo) => kJogo(jogo, 'quizlevel'), quizlevelLegado: 'incl_quizlevel',
|
|
115
|
-
cenario: (jogo) => kJogo(jogo, 'cenario'), cenarioLegado: 'incl_cenario',
|
|
116
|
-
tabsel: (jogo) => kJogo(jogo, 'tabsel'), tabselLegado: 'incl_tabsel',
|
|
117
|
-
fracnot: (jogo) => kJogo(jogo, 'fracnot'), fracnotLegado: 'incl_fracnot',
|
|
118
|
-
// visual / contraste / cor
|
|
119
|
-
viz: 'incl_viz', lq: 'incl_lq', cbsafe: 'incl_cbsafe', ownercolors: 'incl_ownercolors',
|
|
120
|
-
outfg: 'incl_outfg', outbg: 'incl_outbg', hcrole: 'incl_hcrole', juice: 'incl_juice', crt: 'incl_crt2',
|
|
121
|
-
crtLegacy: 'incl_crt', // formato antigo (booleano); crt.ts migra p/ incl_crt2 na 1ª leitura (fresh)
|
|
122
|
-
// áudio / voz / i18n
|
|
123
|
-
ttsEngine: 'incl_tts_engine', ttsVoice: 'incl_tts_voice', lang: 'incl_lang', // audiocat_{k}
|
|
124
|
-
// comunicação / legendas (ADR-0028: todo menu persiste)
|
|
125
|
-
letterCase: 'incl_lettercase', captions: 'incl_captions',
|
|
126
|
-
// ⚠️ O NÍVEL TEA (calmo / silencioso) PASSOU A PERSISTIR EM 2026-09-07, e antes não persistia: era um
|
|
127
|
-
// `let calmMode = 0` em `ui/pause-icons`, com o comentário «deliberately NOT persisted — verbatim: game.js
|
|
128
|
-
// never wrote it to storage». O «verbatim» é a chave — foi PRESERVADO na extração do monólito, não
|
|
129
|
-
// decidido. O custo era da criança que mais precisa dele: quem usa o modo silencioso voltava a pô-lo a
|
|
130
|
-
// cada sessão, e é para quem o barulho inesperado custa mais. O ADR-0028 diz que todo menu persiste.
|
|
131
|
-
tea: 'incl_tea',
|
|
132
|
-
menuIndex: 'incl_menuindex', // "6 de 10" no fim do anuncio de item (ADR-0044, item 3)
|
|
133
|
-
// tipografia / controles / toque
|
|
134
|
-
fontKey: 'incl_font_k', padDesign: 'incl_paddesign', padDir: 'incl_paddir', touchmap: 'incl_touchmap',
|
|
135
|
-
padBtnMm: 'incl_padbtnmm', padGapMm: 'incl_padgapmm', padStickMm: 'incl_padstickmm',
|
|
136
|
-
padTravelMm: 'incl_padtravelmm', padDpadMm: 'incl_paddpadmm',
|
|
137
|
-
// movimento reduzido (objeto inteiro num JSON so) + a chave antiga de alternar-movimento, que
|
|
138
|
-
// loadPlayerA11y ainda le uma vez para migrar quem vinha da versao anterior
|
|
139
|
-
reducedMotion: 'inclusionist.reducedmotion.v1', toggleMoveLegacy: 'inclusionist.togglemove',
|
|
140
|
-
// POR JOGADOR — parametrizadas pelo indice da tela. Eram sufixos '_p'+i montados a mao em varios
|
|
141
|
-
// pontos do game.js; virar funcao aqui e o que impede que um deles escreva num nome torto.
|
|
142
|
-
/**
|
|
143
|
-
* @deprecated ⚠️ A CHAVE LEGADA do modo visual — UM valor, do tempo em que só cabia um (issue #104).
|
|
144
|
-
*
|
|
145
|
-
* Continua a ser LIDA, e é isso que impede a criança de perder o que já escolheu; continua a ser ESCRITA
|
|
146
|
-
* enquanto os controles ainda escreverem um valor de cada vez, porque um leitor antigo (o cartucho na
|
|
147
|
-
* versão publicada) faz `if (v && VIZ_BY_KEY[v])` e rejeitaria um JSON — escrever a forma nova AQUI
|
|
148
|
-
* apagaria o ajuste dela em silêncio, que é exactamente o defeito que a migração existe para não cometer.
|
|
149
|
-
*/
|
|
150
|
-
vizP: (i) => 'incl_viz_p' + i,
|
|
151
|
-
/**
|
|
152
|
-
* O ESTADO VISUAL de dois eixos, em JSON (ADR-0076, issue #104).
|
|
153
|
-
*
|
|
154
|
-
* ⚠️ CHAVE NOVA AO LADO DA VELHA, e não a mesma chave com conteúdo novo. É o mesmo desenho que o campo
|
|
155
|
-
* `visual` usa ao lado do `viz`: as duas formas coexistem enquanto houver leitores das duas, cada um lê a
|
|
156
|
-
* que entende, e a velha só morre quando não sobrar quem a leia. `migrarVisual` aceita as duas, então o
|
|
157
|
-
* recuo — chave nova ausente, chave velha presente — devolve exactamente o que a criança escolheu.
|
|
158
|
-
*/
|
|
159
|
-
visualP: (i) => 'incl_visual_p' + i,
|
|
160
|
-
sinkP: (i) => 'incl_sink_p' + i,
|
|
161
|
-
easyP: (i) => 'incl_easy_p' + i,
|
|
162
|
-
/**
|
|
163
|
-
* ⚠️ AS DUAS DE BAIXO SÃO AS CHAVES LEGADAS desde 2026-09-08 (ADR-0104 §C, issue #114). Continuam a ser
|
|
164
|
-
* LIDAS — é o ajuste da criança, e a herança dele é o que a impede de o perder — e não voltam a ser
|
|
165
|
-
* escritas. O que se escreve é a chave COM TRANSPORTE, porque a alternância é do APARELHO e não da pessoa:
|
|
166
|
-
* ligá-la no controle de tela, onde ninguém segura um botão virtual com conforto, ligava-a também no
|
|
167
|
-
* teclado, onde segurar uma tecla é exactamente o que a criança sabe fazer.
|
|
168
|
-
*
|
|
169
|
-
* ⚠️ E A CHAVE NOVA NÃO MORA AQUI, de propósito. Ela é `chaveDaAlternancia`, em `input/latch-scope` — este
|
|
170
|
-
* ficheiro é módulo-FOLHA e `platform/` não importa de `input/`, que é a camada acima. Montá-la aqui
|
|
171
|
-
* exigiria ou uma aresta ao contrário ou uma segunda cópia do nome, e a segunda cópia é exactamente o que
|
|
172
|
-
* o comentário do bloco acima existe para impedir. O dono do nome é quem conhece a regra do transporte.
|
|
173
|
-
*/
|
|
174
|
-
toggleMoveP: (i) => 'incl_togglemove_p' + i,
|
|
175
|
-
toggleRunP: (i) => 'incl_togglerun_p' + i, // alternância do botão de CORRER (irmã da de movimento)
|
|
176
|
-
rmWalkP: (i) => 'incl_rmWalk_p' + i,
|
|
177
|
-
rmBreathP: (i) => 'incl_rmBreath_p' + i,
|
|
178
|
-
rmFlavorP: (i) => 'incl_rmFlavor_p' + i,
|
|
179
|
-
// demo/attract: uma gravação por cenário (fn em vez de string — chave parametrizada). ESCOPO DO JOGO: a
|
|
180
|
-
// gravação é de uma fase DESTE jogo e não faz sentido nenhum em outro.
|
|
181
|
-
attract: (jogo, cen) => kJogo(jogo, 'attract_' + cen),
|
|
182
|
-
attractLegado: (cen) => 'incl_attract_' + cen,
|
|
183
|
-
};
|
|
@@ -1,33 +1,51 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
2
|
+
import type { Store } from './storage.js';
|
|
3
|
+
import type { Translator } from '../core/i18n.js';
|
|
4
|
+
import { type NeuralVoice } from './voice-plan.js';
|
|
5
|
+
import { type LoadKokoro } from './kokoro.js';
|
|
6
|
+
import type { SpeechPort } from './speech.js';
|
|
7
|
+
export type { LoadKokoro };
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* A PART OF A SPOKEN TEXT (ADR-0243 §1). Without `language` it is FRAME, read by the interface's voice; with a BCP-47 `language`
|
|
10
|
+
* it is CONTENT, read by a voice of that language and never by a voice of another one (§2) — an English word in a Portuguese
|
|
11
|
+
* activity is read by an English voice. A game already keeps the frame in keys and the content in `{params}`; this says which is which.
|
|
10
12
|
*/
|
|
11
|
-
export interface
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
export interface SpokenPart {
|
|
14
|
+
readonly text: string;
|
|
15
|
+
readonly language?: string;
|
|
16
|
+
}
|
|
17
|
+
/** What narration speaks: a text in the interface's language, or parts spoken in order, each in its own language. */
|
|
18
|
+
export type SpokenText = string | readonly SpokenPart[];
|
|
19
|
+
/** How a narration meets the one being spoken. Absent: it cuts it, as every narration always has. */
|
|
20
|
+
export interface NarrateOptions {
|
|
21
|
+
/**
|
|
22
|
+
* THE PLAYER WHO ASKED, and then the narration takes turns with the other players' (ADR-0234, errata 2026-09-26 — the Dev: «em
|
|
23
|
+
* fila, não junto ao mesmo tempo com outro sonar em andamento», and «outro jogador não corta, mas um jogador corta a si
|
|
24
|
+
* mesmo»). Behind another player's narration still being spoken it waits, and is spoken when that one and each one waiting
|
|
25
|
+
* before it are over; a player's newer narration cuts that player's own being spoken, and replaces that player's own
|
|
26
|
+
* waiting, in its place in the line. The sonar's readings are spoken so. A narration that names no player still cuts
|
|
27
|
+
* whatever is being spoken, and ends the ones waiting too.
|
|
28
|
+
*/
|
|
29
|
+
readonly seat?: number;
|
|
15
30
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
progress?: (p: {
|
|
21
|
-
loaded: number;
|
|
22
|
-
total: number;
|
|
23
|
-
}) => void;
|
|
24
|
-
logger?: (...a: unknown[]) => void;
|
|
25
|
-
}) => Promise<SessaoNeural>;
|
|
26
|
-
};
|
|
31
|
+
/** `finished` is called once the utterance is over, however it ends: what lets parts be spoken in order. */
|
|
32
|
+
interface TtsEngine {
|
|
33
|
+
id: string;
|
|
34
|
+
speak: (text: string, finished?: () => void) => void;
|
|
27
35
|
}
|
|
28
|
-
/** A PORTA (ADR-0094). Uma linha do lado do jogo: `() => import('@mintplex-labs/piper-tts-web')`. */
|
|
29
|
-
export type CarregarVozNeural = () => Promise<ModuloNeural>;
|
|
30
36
|
export interface TtsCtx {
|
|
37
|
+
/**
|
|
38
|
+
* Where the chosen engine and voice are kept: the page's store, built by the root (ADR-0232, issue #207). Required — a
|
|
39
|
+
* voice choice read from nowhere would speak with the first voice of the list at every visit, and the child who picked
|
|
40
|
+
* one would lose it in silence.
|
|
41
|
+
*/
|
|
42
|
+
store: Pick<Store, 'get' | 'set'>;
|
|
43
|
+
/**
|
|
44
|
+
* The root's translator, narrowed to what narration needs (ADR-0232 D3): `t` for what it announces, and `bcp47()` — the
|
|
45
|
+
* PAGE's language tag, read at every utterance and every voice list — because narration speaks the language of now.
|
|
46
|
+
* REQUIRED: a voice that did not know the page's language would read English words with Portuguese phonetics.
|
|
47
|
+
*/
|
|
48
|
+
translator: Pick<Translator, 't' | 'bcp47'>;
|
|
31
49
|
srSay: (t: string) => void;
|
|
32
50
|
srAlert: (t: string) => void;
|
|
33
51
|
ensureAC: () => AudioContext | null;
|
|
@@ -39,19 +57,40 @@ export interface TtsCtx {
|
|
|
39
57
|
on: boolean;
|
|
40
58
|
}> | null;
|
|
41
59
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
60
|
+
* DOES THIS GAME SPEAK WITH A NEURAL VOICE (ADR-0216 §3)? The game's answer, not a loader: absent, no Kokoro voice is listed, the
|
|
61
|
+
* browser's voice speaks, and the delivery carries neither the model nor the runtime.
|
|
62
|
+
*/
|
|
63
|
+
neuralVoice?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* How that voice is built (ADR-0216 §1 and §5). REQUIRED (ADR-0232 D4): the root's loader reads the delivery with the host's
|
|
66
|
+
* `fetch` and WebAssembly — `import('platform/kokoro-runtime')` at the FIRST neural utterance and not before, so a game that never
|
|
67
|
+
* speaks neurally never loads a byte of espeak-ng or the ONNX runtime. A game under `createGame` never passes this — it says
|
|
68
|
+
* `uses: { neuralVoice: true }` and the engine does the rest; a case hands in a module without a wasm engine.
|
|
69
|
+
*/
|
|
70
|
+
loadKokoro: LoadKokoro;
|
|
71
|
+
/** The child's speech rate, words a minute (ADR-0183 §1). Absent = each voice at its own rate. */
|
|
72
|
+
getSpeechPpm?: () => number;
|
|
73
|
+
/**
|
|
74
|
+
* Makes the element a neural utterance plays through: the root's `<audio>`, in its document. REQUIRED (ADR-0232 D4). An element,
|
|
75
|
+
* not an `AudioBufferSourceNode`: only a media element changes speed without changing pitch.
|
|
76
|
+
*/
|
|
77
|
+
createAudio: () => HTMLAudioElement;
|
|
78
|
+
/** The browser's speech (`platform/speech`'s port), lent by the root from `host.win`. REQUIRED (ADR-0232 D4). */
|
|
79
|
+
speech: SpeechPort;
|
|
80
|
+
/** The clock a browser utterance and a neural load are timed with: the root's `performance.now`. REQUIRED (ADR-0232 D4). */
|
|
81
|
+
now: () => number;
|
|
82
|
+
/**
|
|
83
|
+
* Where a line of `problems` goes (ADR-0169): the root's list. Written once per language a part asked for and the device has no
|
|
84
|
+
* voice for (ADR-0243 §3). Absent, nothing is reported — a `tts` built outside a root has no `problems` to write to.
|
|
50
85
|
*/
|
|
51
|
-
|
|
86
|
+
report?: (line: string) => void;
|
|
52
87
|
}
|
|
53
88
|
export interface Tts {
|
|
54
|
-
|
|
89
|
+
/**
|
|
90
|
+
* The entry point, gated by the mixer: a text in the interface's language, or parts in order (ADR-0243 §1). It cuts what is
|
|
91
|
+
* being spoken, unless `how` names the player who asked — then it takes turns with the other players' (the sonar, ADR-0234).
|
|
92
|
+
*/
|
|
93
|
+
narrate: (text: SpokenText, how?: NarrateOptions) => void;
|
|
55
94
|
ttsSpeak: (text: string) => boolean;
|
|
56
95
|
loadTTS: () => void;
|
|
57
96
|
speakWebSpeech: (text: string) => boolean;
|
|
@@ -64,11 +103,18 @@ export interface Tts {
|
|
|
64
103
|
readonly failed: boolean;
|
|
65
104
|
readonly narrateCount: number;
|
|
66
105
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
106
|
+
* DOES THIS GAME ASK FOR A NEURAL ENGINE? (ADR-0216 §3) The audio panel asks before offering it: an option that cannot
|
|
107
|
+
* work is worse than one option fewer — whoever picks it waits for a download that never starts, and whoever navigates
|
|
108
|
+
* by ear has no way to see that it did not start.
|
|
70
109
|
*/
|
|
71
|
-
readonly
|
|
110
|
+
readonly neuralAvailable: boolean;
|
|
111
|
+
/** The voices of the current language the child may pick (ADR-0185); empty locks the speech rows and the bar's button. */
|
|
112
|
+
voices: () => readonly NeuralVoice[];
|
|
113
|
+
/** Where the loaded Kokoro voice runs: WebGPU when its test synthesis was speech, else WASM; null before one loads. */
|
|
114
|
+
readonly kokoroDevice: 'webgpu' | 'wasm' | null;
|
|
115
|
+
/** The voice in use: the stored choice when it speaks the language, else the language's first voice, else none. */
|
|
116
|
+
currentVoice: () => NeuralVoice | null;
|
|
117
|
+
/** Stores the choice. A voice that does not speak the current language is refused (`false`). */
|
|
118
|
+
setVoice: (id: string) => boolean;
|
|
72
119
|
}
|
|
73
120
|
export declare function createTts(ctx: TtsCtx): Tts;
|
|
74
|
-
export {};
|