@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,96 +1,108 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
2
|
import type { ControlledPlayer } from '../core/entity.js';
|
|
3
3
|
import type { Action } from '../core/actions.js';
|
|
4
|
-
import { type
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
4
|
+
import { type TransportName, type InputState } from './transport-in-use.js';
|
|
5
|
+
/** The actions one pad holds this frame. Mutated IN PLACE by `input/gamepad`'s `pollPads`. */
|
|
6
|
+
type PadState = Record<string, boolean>;
|
|
7
|
+
type HeldPlayer = Pick<ControlledPlayer, 'ctrl' | 'pad'>;
|
|
8
|
+
/** ONE ROOT'S INPUT STATE — what `createInputState()` returns and what `Engine.input` is. */
|
|
9
|
+
export interface LiveInput {
|
|
10
|
+
/** Physical keys held NOW (KeyboardEvent.code). */
|
|
11
|
+
readonly keys: Set<string>;
|
|
12
|
+
/**
|
|
13
|
+
* THE SOURCE OF EACH HELD KEY — code → the device that produced it (ADR-0109).
|
|
14
|
+
*
|
|
15
|
+
* ⚠️ THIS MAP EXISTS BECAUSE `keys` ERASES THE SOURCE AT THE DOOR (issue #114): it is a set of CODES, and several
|
|
16
|
+
* transports hold keys in it — the keyboard, and the virtual controller for a position the eyes, the face, the hands
|
|
17
|
+
* or the voice pressed — so by the time `held()` answers there is no telling WHO pressed. The pad keeps its own
|
|
18
|
+
* identity only because it goes through `padCur` instead of the set.
|
|
19
|
+
*
|
|
20
|
+
* ⚠️ THE TWO ARE WRITTEN IN ONE PLACE (`markKey`/`releaseKey` and their siblings), because they are two structures and
|
|
21
|
+
* may drift apart.
|
|
22
|
+
*
|
|
23
|
+
* 📌 A code with NO entry here is not a data error — it is a key nobody signed, and every real key from the keyboard
|
|
24
|
+
* is one: an event the child produced carries no stamp. `sourceOf` returns `undefined` and whoever asks decides.
|
|
25
|
+
*/
|
|
26
|
+
readonly keySource: Map<string, TransportName>;
|
|
27
|
+
/**
|
|
28
|
+
* A key WAS PRESSED, and who pressed it is known. The only place that writes both.
|
|
29
|
+
*
|
|
30
|
+
* ⚠️ BOTH TOGETHER OR NEITHER: while they are two structures they can drift apart, and a drift here is silent — the
|
|
31
|
+
* game keeps moving and only the latch goes wrong. Whoever writes, writes through here.
|
|
32
|
+
*/
|
|
33
|
+
markKey(code: string, origin: TransportName): void;
|
|
34
|
+
/**
|
|
35
|
+
* The key was pressed and WHO pressed it is NOT KNOWN. The narrow door, and it is narrow on purpose.
|
|
36
|
+
*
|
|
37
|
+
* ⚠️ A FUNCTION WITH ANOTHER NAME AND NOT AN OPTIONAL SECOND PARAMETER: `markKey(code)` with the source left out is what
|
|
38
|
+
* gets written without thinking; `markKeyWithoutSource(code)` is what gets written after thinking, when the answer is
|
|
39
|
+
* "I don't know". The name is what shows in review.
|
|
40
|
+
*
|
|
41
|
+
* ⚠️ AND THE `delete` IS THE HALF THAT MATTERS: without it, a key pressed again by an unknown source INHERITED the
|
|
42
|
+
* source of the time before, and the latch kept answering "eyes" to an edge that is no longer theirs.
|
|
43
|
+
*/
|
|
44
|
+
markKeyWithoutSource(code: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* The key was pressed and the CALLER MAY NOT KNOW by whom — it picks the right one of the two doors above. The union
|
|
47
|
+
* is demanded EXPLICITLY: whoever knows who pressed keeps calling `markKey`; this one is for whoever receives the
|
|
48
|
+
* answer from someone else (the root's virtual controller, `input/keydown`) and cannot pretend to have it.
|
|
49
|
+
*/
|
|
50
|
+
markKeyFrom(code: string, source: TransportName | undefined): void;
|
|
51
|
+
/** The other half. Lets go in both, for the same reason. */
|
|
52
|
+
releaseKey(code: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Lets go of EVERYTHING — both structures, or the map is left describing keys nobody holds any more. The window's
|
|
55
|
+
* `blur` does NOT use this: see `letGoOfTheKeyboard`.
|
|
56
|
+
*/
|
|
57
|
+
releaseAllKeys(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Hands `release` every key THE KEYBOARD holds — the ones the window's `blur` owes a keyup. ⚠️ ONLY THE KEYBOARD'S: a
|
|
60
|
+
* key with no source or the keyboard's own stamp. A camera or voice press does not depend on the window's focus, and
|
|
61
|
+
* letting go of it would take a held position from whoever cannot press it again quickly. It hands out codes and does
|
|
62
|
+
* not release them itself: the release has to travel the road a real keyup travels, which belongs to the root.
|
|
63
|
+
*/
|
|
64
|
+
letGoOfTheKeyboard(release: (code: string) => void): void;
|
|
65
|
+
/**
|
|
66
|
+
* Who produced this key? `undefined` when it is not known. ⚠️ NOT A DEFAULT: a `'teclado'` default would read an
|
|
67
|
+
* unsigned key from an unknown producer as the keyboard, and the latch would turn off for whoever plays by gaze.
|
|
68
|
+
*/
|
|
69
|
+
sourceOf(code: string): TransportName | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* THIS PLAYER'S TRANSPORT STATE (ADR-0109 · ADR-0113). Never `undefined`: whoever never produced an edge is at the
|
|
72
|
+
* DEFAULT — a player who has not touched anything yet really is on the keyboard with nothing assisted.
|
|
73
|
+
*/
|
|
74
|
+
inputOf(player: number): InputState;
|
|
75
|
+
/**
|
|
76
|
+
* AN EDGE FROM THIS PLAYER ARRIVED, with its source. ⚠️ An edge from an assisted transport does NOT enable it — that
|
|
77
|
+
* rule lives in `afterEdge` with its reason: a webcam false positive would lock latching on for everyone.
|
|
78
|
+
*/
|
|
79
|
+
playerEdge(player: number, origin: TransportName): void;
|
|
80
|
+
/** Enabling the assisted transports is an EXPLICIT ACT (ADR-0109 rule 4), and so it has its own door. */
|
|
81
|
+
enableAssistedFor(player: number): void;
|
|
82
|
+
disableAssistedFor(player: number): void;
|
|
83
|
+
/**
|
|
84
|
+
* ⚠️ FORGETTING IS A SEPARATE DOOR, AND LETTING GO OF KEYS DOES NOT CALL IT. The child did not change devices by
|
|
85
|
+
* changing tabs; it exists for the end of a MATCH, where the question is asked again.
|
|
86
|
+
*/
|
|
87
|
+
forgetInputs(): void;
|
|
88
|
+
/** Gamepad: the actions each pad (by index) holds this frame. The pad↔player assignment lives in `p.pad`. */
|
|
89
|
+
readonly padCur: Record<number, PadState>;
|
|
90
|
+
/** The previous frame's actions per pad — the edge is measured against it. */
|
|
91
|
+
readonly padPrevAct: Record<number, PadState>;
|
|
92
|
+
/** The previous frame's START per pad. */
|
|
93
|
+
readonly padPrevStart: Record<number, boolean>;
|
|
94
|
+
/**
|
|
95
|
+
* Is the player holding the action? keyboard (some code in the pl.ctrl scheme) OR the assigned pad (pl.pad).
|
|
96
|
+
* ⚠️ `?? []` and not a raw `pl.ctrl[act]`: since issue #118 a position the keyboard DOES NOT REACH is a declared
|
|
97
|
+
* `null`. Holding it is `false`, and the pad is asked right after: whoever has a pad reaches what their keyboard does not.
|
|
98
|
+
*/
|
|
99
|
+
held(pl: HeldPlayer, act: Action): boolean;
|
|
100
|
+
}
|
|
80
101
|
/**
|
|
81
|
-
*
|
|
102
|
+
* BUILDS ONE ROOT'S INPUT STATE. Nothing is shared between two calls: that is the point (ADR-0232 D4, ADR-0142).
|
|
82
103
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* quem joga por olhar perderia a alternância no meio da partida sem nada o dizer. Existe para o fim de uma
|
|
86
|
-
* PARTIDA, onde a pergunta se põe de novo.
|
|
104
|
+
* ⚠️ THE CONTAINERS ARE CONSTANTS AND ARE MUTATED IN PLACE, as they were: the root, `input/keydown` and `input/gamepad`
|
|
105
|
+
* receive them once, and reassigning one would leave every reader holding the old object.
|
|
87
106
|
*/
|
|
88
|
-
export declare function
|
|
89
|
-
type PadState = Record<string, boolean>;
|
|
90
|
-
export declare const padCur: Record<number, PadState>;
|
|
91
|
-
export declare const padPrevAct: Record<number, PadState>;
|
|
92
|
-
export declare const padPrevStart: Record<number, boolean>;
|
|
93
|
-
export declare const PAD_DEAD = 0.5;
|
|
94
|
-
type HeldPlayer = Pick<ControlledPlayer, 'ctrl' | 'pad'>;
|
|
95
|
-
export declare const held: (pl: HeldPlayer, act: Action) => boolean;
|
|
107
|
+
export declare function createInputState(): LiveInput;
|
|
96
108
|
export {};
|
package/dist-pkg/input/state.js
CHANGED
|
@@ -1,139 +1,59 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
// ⚠️ O cabeçalho deste módulo dizia «ZERO deps», e ele já tinha DUAS de tipo (`ControlledPlayer`, `Action`) —
|
|
7
|
-
// a frase queria dizer «nada em tempo de execução», que continua verdade: os três imports são `type` e
|
|
8
|
-
// desaparecem no build. A terceira entra pela mesma razão que as outras duas: o vocabulário mora com quem
|
|
9
|
-
// tem as REGRAS sobre ele (`input/transporte-em-uso`), e repeti-lo aqui seria a segunda cópia de uma união.
|
|
10
|
-
import { PADRAO, aposAresta, habilitarAssistida, desabilitarAssistida, } from './transporte-em-uso.js';
|
|
11
|
-
export const keys = new Set();
|
|
2
|
+
// The two above are type-only and vanish in the build. This one is not, and enters for the reason the vocabulary lives
|
|
3
|
+
// where it does: with whoever has the RULES about it (`input/transport-in-use`, a leaf) — repeating it here would be a
|
|
4
|
+
// second copy of a union.
|
|
5
|
+
import { DEFAULT_INPUT_STATE, afterEdge, enableAssisted, disableAssisted, } from './transport-in-use.js';
|
|
12
6
|
/**
|
|
13
|
-
*
|
|
7
|
+
* BUILDS ONE ROOT'S INPUT STATE. Nothing is shared between two calls: that is the point (ADR-0232 D4, ADR-0142).
|
|
14
8
|
*
|
|
15
|
-
* ⚠️
|
|
16
|
-
*
|
|
17
|
-
* `heldKeys.add(codeFor(act))`) e a webcam despacha `KeyboardEvent` sintético, então quando o `held()`
|
|
18
|
-
* responde já não há como saber QUEM carregou. O único transporte que sobrevivia identificável era o
|
|
19
|
-
* gamepad, e só porque passa por `padCur` em vez do conjunto.
|
|
20
|
-
*
|
|
21
|
-
* ⚠️ CAMPO NOVO AO LADO DO VELHO, sincronizado num ponto só (`marcarTecla`/`soltarTecla`), com os leitores a
|
|
22
|
-
* migrar um a um — é a forma que este repositório já usou no `p.visual` ao lado do `p.viz` (#104), e a razão
|
|
23
|
-
* é a mesma: uma troca de uma vez não tem estado verde onde parar, e isto é a espinha da entrada.
|
|
24
|
-
*
|
|
25
|
-
* 📌 Um código SEM entrada aqui não é um erro de dados — é uma tecla que entrou por um escritor que ainda não
|
|
26
|
-
* migrou. `origemDe` devolve `undefined` e quem pergunta decide; ver a nota lá.
|
|
27
|
-
*/
|
|
28
|
-
export const origemDaTecla = new Map();
|
|
29
|
-
/**
|
|
30
|
-
* Uma tecla FOI SEGURADA, e sabe-se por quem. É o único sítio que escreve nos dois.
|
|
31
|
-
*
|
|
32
|
-
* ⚠️ OS DOIS JUNTOS OU NENHUM: enquanto forem duas estruturas, elas podem divergir, e uma divergência aqui é
|
|
33
|
-
* silenciosa — o jogo continua a andar e só a alternância fica errada. Por isso não há `keys.add` público
|
|
34
|
-
* neste módulo: quem escreve, escreve por aqui.
|
|
35
|
-
*/
|
|
36
|
-
export function marcarTecla(code, origem) {
|
|
37
|
-
keys.add(code);
|
|
38
|
-
origemDaTecla.set(code, origem);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* A tecla foi segurada e NÃO SE SABE por quem. A porta estreita, e ela é estreita de propósito.
|
|
42
|
-
*
|
|
43
|
-
* ⚠️ POR QUE UMA FUNÇÃO COM OUTRO NOME E NÃO UM SEGUNDO PARÂMETRO OPCIONAL. `marcarTecla(code)` com a origem
|
|
44
|
-
* omitida é o que se escreve quando não se pensou; `marcarTeclaSemOrigem(code)` é o que se escreve quando se
|
|
45
|
-
* pensou e a resposta é «não sei». O tipo não distingue as duas, mas o nome distingue — e é o nome que
|
|
46
|
-
* aparece na revisão. Um parâmetro esquecido não se lê; uma função assim chamada lê-se de longe.
|
|
47
|
-
*
|
|
48
|
-
* ⚠️ E O `delete` É A METADE QUE IMPORTA, não o `add`. Sem ele, uma tecla premida de novo por uma fonte
|
|
49
|
-
* desconhecida HERDAVA a origem da vez anterior: a criança joga por olhar, larga a tecla, um script de fora
|
|
50
|
-
* despacha o mesmo código, e a alternância continua a responder «olhos» a uma aresta que já não é dela. Um
|
|
51
|
-
* mapa que guarda a resposta certa de ontem é pior do que um que não guarda nada.
|
|
52
|
-
*
|
|
53
|
-
* 📌 Hoje há UM chamador — o `input/keydown`, para o evento sintético que ninguém assinou. Depois desta
|
|
54
|
-
* migração nada nesta engine produz um; quem produz é código de consumidor, e é para ele que esta porta fica
|
|
55
|
-
* aberta. Fechá-la faria a tecla dele simplesmente não funcionar, o que é uma quebra pior do que não saber.
|
|
56
|
-
*/
|
|
57
|
-
export function marcarTeclaSemOrigem(code) {
|
|
58
|
-
keys.add(code);
|
|
59
|
-
origemDaTecla.delete(code);
|
|
60
|
-
}
|
|
61
|
-
/** A outra metade. Solta nos dois, pela mesma razão. */
|
|
62
|
-
export function soltarTecla(code) {
|
|
63
|
-
keys.delete(code);
|
|
64
|
-
origemDaTecla.delete(code);
|
|
65
|
-
}
|
|
66
|
-
/** Solta TUDO — o `blur` da janela. Os dois, ou o mapa fica a descrever teclas que já ninguém segura. */
|
|
67
|
-
export function soltarTodas() {
|
|
68
|
-
keys.clear();
|
|
69
|
-
origemDaTecla.clear();
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Quem produziu esta tecla? `undefined` quando não se sabe.
|
|
73
|
-
*
|
|
74
|
-
* ⚠️ `undefined` E NÃO UM PADRÃO. Um padrão `'teclado'` faria a erasão voltar por outra porta: uma tecla do
|
|
75
|
-
* toque que entrasse por um escritor não migrado seria lida como teclado, a alternância desligava-se, e nada
|
|
76
|
-
* o diria. Não saber é uma resposta; fingir que se sabe não é.
|
|
77
|
-
*/
|
|
78
|
-
export function origemDe(code) {
|
|
79
|
-
return origemDaTecla.get(code);
|
|
80
|
-
}
|
|
81
|
-
// ===================== O TRANSPORTE EM USO, POR JOGADOR (ADR-0109 · ADR-0113) =====================
|
|
82
|
-
//
|
|
83
|
-
// ⚠️ AQUI E NÃO NO `PlayerBase`, e a escolha é medida. O autómato responde «que aparelho está a produzir as
|
|
84
|
-
// arestas deste jogador» — isso é estado de ENTRADA, e a entrada já guarda estado por jogador neste módulo
|
|
85
|
-
// exactamente com esta forma: o `padCur` logo abaixo é um `Record<number, …>`. Pô-lo no `PlayerBase` faria
|
|
86
|
-
// dele parte do CONTRATO, e trezentos cartuchos passariam a declarar um campo sobre o qual não decidem nada.
|
|
87
|
-
//
|
|
88
|
-
// 📌 O que o jogador CARREGA é a alternância resolvida (`toggleMove`), que é o que a física lê. Este mapa é
|
|
89
|
-
// o que está a montante dela: com ele e com o `input/latch-store`, a resposta do ADR-0113 fica completa.
|
|
90
|
-
const entradaPorJogador = {};
|
|
91
|
-
/**
|
|
92
|
-
* O ESTADO DA ENTRADA DESTE JOGADOR. Nunca `undefined`: quem nunca produziu uma aresta está no PADRÃO.
|
|
93
|
-
*
|
|
94
|
-
* ⚠️ `PADRAO` E NÃO `undefined`, pela mesma razão que o `origemDe` faz o contrário: ali «não sei» é uma
|
|
95
|
-
* resposta honesta sobre uma tecla que já existe; aqui a pergunta é sobre um JOGADOR, e um jogador que
|
|
96
|
-
* ainda não tocou em nada está mesmo no teclado sem assistida — que é o que `PADRAO` diz.
|
|
97
|
-
*/
|
|
98
|
-
export function entradaDe(jogador) {
|
|
99
|
-
return entradaPorJogador[jogador] ?? PADRAO;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* UMA ARESTA DESTE JOGADOR CHEGOU, com a sua origem.
|
|
103
|
-
*
|
|
104
|
-
* 📌 O `aposAresta` devolve o MESMO objecto quando nada muda, então guardar de volta não aloca por quadro.
|
|
105
|
-
* ⚠️ E uma aresta de um transporte assistido NÃO o habilita — essa regra vive no `aposAresta` e a razão
|
|
106
|
-
* está lá: um falso positivo da webcam trancaria a alternância de toda a gente sem ninguém ter pedido.
|
|
107
|
-
*/
|
|
108
|
-
export function arestaDoJogador(jogador, origem) {
|
|
109
|
-
entradaPorJogador[jogador] = aposAresta(entradaDe(jogador), origem);
|
|
110
|
-
}
|
|
111
|
-
/** Habilitar a assistida é um ACTO EXPLÍCITO (ADR-0109 regra 4), e por isso tem porta própria. */
|
|
112
|
-
export function habilitarAssistidaDe(jogador) {
|
|
113
|
-
entradaPorJogador[jogador] = habilitarAssistida(entradaDe(jogador));
|
|
114
|
-
}
|
|
115
|
-
export function desabilitarAssistidaDe(jogador) {
|
|
116
|
-
entradaPorJogador[jogador] = desabilitarAssistida(entradaDe(jogador));
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* ⚠️ ESQUECER É UMA PORTA SEPARADA, E O `soltarTodas` NÃO A CHAMA — de propósito.
|
|
120
|
-
*
|
|
121
|
-
* O `blur` da janela solta as teclas porque elas deixaram mesmo de estar premidas. Mas a criança não trocou
|
|
122
|
-
* de aparelho por mudar de separador: zerar o transporte em uso ali devolveria toda a gente ao teclado, e
|
|
123
|
-
* quem joga por olhar perderia a alternância no meio da partida sem nada o dizer. Existe para o fim de uma
|
|
124
|
-
* PARTIDA, onde a pergunta se põe de novo.
|
|
9
|
+
* ⚠️ THE CONTAINERS ARE CONSTANTS AND ARE MUTATED IN PLACE, as they were: the root, `input/keydown` and `input/gamepad`
|
|
10
|
+
* receive them once, and reassigning one would leave every reader holding the old object.
|
|
125
11
|
*/
|
|
126
|
-
export function
|
|
127
|
-
|
|
128
|
-
|
|
12
|
+
export function createInputState() {
|
|
13
|
+
const keys = new Set();
|
|
14
|
+
const keySource = new Map();
|
|
15
|
+
// ⚠️ HERE AND NOT ON `PlayerBase`: the automaton answers "which device is producing this player's edges" — INPUT
|
|
16
|
+
// state, kept per player in exactly the shape `padCur` has. On `PlayerBase` every cartridge would have to declare a
|
|
17
|
+
// field it decides nothing about.
|
|
18
|
+
const inputByPlayer = {};
|
|
19
|
+
const padCur = {};
|
|
20
|
+
const padPrevAct = {};
|
|
21
|
+
const padPrevStart = {};
|
|
22
|
+
function markKey(code, origin) {
|
|
23
|
+
keys.add(code);
|
|
24
|
+
keySource.set(code, origin);
|
|
25
|
+
}
|
|
26
|
+
function markKeyWithoutSource(code) {
|
|
27
|
+
keys.add(code);
|
|
28
|
+
keySource.delete(code);
|
|
29
|
+
}
|
|
30
|
+
function inputOf(player) {
|
|
31
|
+
return inputByPlayer[player] ?? DEFAULT_INPUT_STATE;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
keys, keySource, padCur, padPrevAct, padPrevStart,
|
|
35
|
+
markKey, markKeyWithoutSource,
|
|
36
|
+
markKeyFrom(code, source) { if (source)
|
|
37
|
+
markKey(code, source);
|
|
38
|
+
else
|
|
39
|
+
markKeyWithoutSource(code); },
|
|
40
|
+
releaseKey(code) { keys.delete(code); keySource.delete(code); },
|
|
41
|
+
releaseAllKeys() { keys.clear(); keySource.clear(); },
|
|
42
|
+
letGoOfTheKeyboard(release) {
|
|
43
|
+
for (const code of [...keys]) {
|
|
44
|
+
const source = keySource.get(code);
|
|
45
|
+
if (!source || source === 'teclado')
|
|
46
|
+
release(code);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
sourceOf: (code) => keySource.get(code),
|
|
50
|
+
inputOf,
|
|
51
|
+
// 📌 `afterEdge` returns the SAME object when nothing changes, so storing it back allocates nothing per frame.
|
|
52
|
+
playerEdge(player, origin) { inputByPlayer[player] = afterEdge(inputOf(player), origin); },
|
|
53
|
+
enableAssistedFor(player) { inputByPlayer[player] = enableAssisted(inputOf(player)); },
|
|
54
|
+
disableAssistedFor(player) { inputByPlayer[player] = disableAssisted(inputOf(player)); },
|
|
55
|
+
forgetInputs() { for (const k of Object.keys(inputByPlayer))
|
|
56
|
+
delete inputByPlayer[Number(k)]; },
|
|
57
|
+
held: (pl, act) => (pl.ctrl[act] ?? []).some((k) => keys.has(k)) || (pl.pad >= 0 && !!padCur[pl.pad]?.[act]),
|
|
58
|
+
};
|
|
129
59
|
}
|
|
130
|
-
export const padCur = {};
|
|
131
|
-
export const padPrevAct = {};
|
|
132
|
-
export const padPrevStart = {};
|
|
133
|
-
export const PAD_DEAD = 0.5; // zona morta = primeira METADE do curso do analógico (ergonomia — José 2026-07-02)
|
|
134
|
-
// Jogador está segurando a ação? teclado (algum code do esquema pl.ctrl) OU o gamepad associado (pl.pad).
|
|
135
|
-
// ⚠️ `?? []` e não `pl.ctrl[act]` cru: desde a issue #118 uma posição que o teclado NÃO ALCANÇA é um `null`
|
|
136
|
-
// declarado — num teclado partido por quatro não há lugar físico para ombros e gatilhos. Segurar uma ação
|
|
137
|
-
// que o teclado não alcança é `false`, e o gamepad continua a ser perguntado logo a seguir: quem tem pad
|
|
138
|
-
// alcança o que o teclado dele não alcança, que é o ponto de haver dois transportes.
|
|
139
|
-
export const held = (pl, act) => (pl.ctrl[act] ?? []).some((k) => keys.has(k)) || (pl.pad >= 0 && !!padCur[pl.pad]?.[act]);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Action } from '../core/actions.js';
|
|
3
|
+
/** The safe item: taking it commands nothing. Same word the gaze cycle uses, and the same job. */
|
|
4
|
+
export declare const SCAN_CANCEL = "cancel";
|
|
5
|
+
/** What a scan offers: the items it was given — positions in play, a menu's steps in a menu — and «cancel» in front. */
|
|
6
|
+
export type ScanItem<T extends string = Action> = T | typeof SCAN_CANCEL;
|
|
7
|
+
export interface SwitchScanOptions {
|
|
8
|
+
/** How long each item is offered. 1 s is the gaze cycle's step, which the Dev ran for a day (ADR-0213). */
|
|
9
|
+
readonly stepMs?: number;
|
|
10
|
+
/** How long the taken action stays pressed, so a game and a menu see a normal press and release. */
|
|
11
|
+
readonly pulseMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const SWITCH_SCAN_DEFAULTS: {
|
|
14
|
+
readonly stepMs: 1000;
|
|
15
|
+
readonly pulseMs: 400;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* THE ENGINE'S OWN DOORS, and whether each has something behind it (ADR-0218 §3). A door with nothing behind it is not offered:
|
|
19
|
+
* a cycle never stops on a position that does nothing (ADR-0155).
|
|
20
|
+
*/
|
|
21
|
+
export interface ScanDoors {
|
|
22
|
+
/** The card SELECT opens is mounted. */
|
|
23
|
+
readonly menus: boolean;
|
|
24
|
+
/** The quick pause START opens has its bar — the menu the scan steps there, and «back» is how it is left. */
|
|
25
|
+
readonly quickPause: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* What the scan offers IN PLAY after «cancel»: the game's named positions, then the doors in the order ADR-0218 §3 names them —
|
|
29
|
+
* the menus (SELECT), then the quick pause (START). Taking a door presses it on the virtual controller, which hands it to the
|
|
30
|
+
* engine as its keys are.
|
|
31
|
+
*/
|
|
32
|
+
export declare function playScanList(game: readonly Action[], doors: ScanDoors): readonly Action[];
|
|
33
|
+
export interface ScanFrame {
|
|
34
|
+
/** Her switch went down on this frame. Whatever sends it — a key, a touch, a gesture, a word. */
|
|
35
|
+
readonly press?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface ScanOutput<T extends string = Action> {
|
|
38
|
+
/** The item being pressed, for `pulseMs` after it was taken. */
|
|
39
|
+
readonly pressed: T | null;
|
|
40
|
+
/** The item taken on THIS frame — what a caller turns into a press. */
|
|
41
|
+
readonly commanded: T | null;
|
|
42
|
+
/** What is being offered right now, and where it sits in the list. Never `null`: something is always showing. */
|
|
43
|
+
readonly showing: {
|
|
44
|
+
readonly item: ScanItem<T>;
|
|
45
|
+
readonly index: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface SwitchScan<T extends string = Action> {
|
|
49
|
+
(nowMs: number, frame?: ScanFrame): ScanOutput<T>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The scanner. `actions` is what is offered now — in play this game's declared positions and the engine's own doors, in a menu
|
|
53
|
+
* that menu's steps — and `cancel` is put in front of them.
|
|
54
|
+
*
|
|
55
|
+
* ⚠️ An empty list is not an error: a game that declared nothing leaves a scan of one item, `cancel`, and a press takes nothing.
|
|
56
|
+
* The alternative — offering the whole controller to a game that reads none of it — is the dead button ADR-0106 §5 refuses, and
|
|
57
|
+
* here it would cost a child a full pass of fourteen items to reach the one thing that works.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createSwitchScan<T extends string = Action>(actions: readonly T[], options?: SwitchScanOptions): SwitchScan<T>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// input/switch-scan — PLAYING WITH ONE BUTTON: the machine offers, the child takes (ADR-0218, issue #201).
|
|
3
|
+
//
|
|
4
|
+
// The Dev, 2026-09-21: «vamos ciclar entre controle padrão > teclas de aderência > jogar com um botão só». This module is the
|
|
5
|
+
// third position, and it answers a different question from the second one. Sticky keys are about HOW LONG a press lasts — the
|
|
6
|
+
// child taps instead of holding, and still has to reach every position. This is about HOW MANY inputs exist in the world: with
|
|
7
|
+
// one switch, fourteen positions cannot be reached at all, so the controller stops being fourteen places and becomes one place
|
|
8
|
+
// plus TIME. It is scanning, the technique switch access has used since long before this engine.
|
|
9
|
+
//
|
|
10
|
+
// 🎯 THE FIRST ITEM IS «CANCEL», AND IT IS ALSO THE PROTECTION. A press that lands by accident has to be able to mean nothing;
|
|
11
|
+
// and because the scan RESTARTS on cancel after every press, a hand that bounces twice takes cancel the second time. That is why
|
|
12
|
+
// there is no dead time here: the restart already is one, and it costs the child nothing to explain.
|
|
13
|
+
//
|
|
14
|
+
// ⚠️ This module knows nothing about keys, switches or pixels. It is given a list and a clock, and it says what is showing and
|
|
15
|
+
// what a press just took — the same division that let `input/gaze-cycle` be tested without a camera.
|
|
16
|
+
//
|
|
17
|
+
// MUTATIONS CHECKED: `tests/switch-scan.node.test.js`.
|
|
18
|
+
/** The safe item: taking it commands nothing. Same word the gaze cycle uses, and the same job. */
|
|
19
|
+
export const SCAN_CANCEL = 'cancel';
|
|
20
|
+
export const SWITCH_SCAN_DEFAULTS = { stepMs: 1000, pulseMs: 400 };
|
|
21
|
+
/**
|
|
22
|
+
* What the scan offers IN PLAY after «cancel»: the game's named positions, then the doors in the order ADR-0218 §3 names them —
|
|
23
|
+
* the menus (SELECT), then the quick pause (START). Taking a door presses it on the virtual controller, which hands it to the
|
|
24
|
+
* engine as its keys are.
|
|
25
|
+
*/
|
|
26
|
+
export function playScanList(game, doors) {
|
|
27
|
+
const list = [...game];
|
|
28
|
+
if (doors.menus)
|
|
29
|
+
list.push('select');
|
|
30
|
+
if (doors.quickPause)
|
|
31
|
+
list.push('start');
|
|
32
|
+
return list;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The scanner. `actions` is what is offered now — in play this game's declared positions and the engine's own doors, in a menu
|
|
36
|
+
* that menu's steps — and `cancel` is put in front of them.
|
|
37
|
+
*
|
|
38
|
+
* ⚠️ An empty list is not an error: a game that declared nothing leaves a scan of one item, `cancel`, and a press takes nothing.
|
|
39
|
+
* The alternative — offering the whole controller to a game that reads none of it — is the dead button ADR-0106 §5 refuses, and
|
|
40
|
+
* here it would cost a child a full pass of fourteen items to reach the one thing that works.
|
|
41
|
+
*/
|
|
42
|
+
export function createSwitchScan(actions, options = {}) {
|
|
43
|
+
const o = { ...SWITCH_SCAN_DEFAULTS, ...options };
|
|
44
|
+
const items = [SCAN_CANCEL, ...actions];
|
|
45
|
+
let startedAt = null;
|
|
46
|
+
let pressed = null, pressedAt = 0;
|
|
47
|
+
return (now, frame = {}) => {
|
|
48
|
+
startedAt ??= now;
|
|
49
|
+
const stepMs = Math.max(1, o.stepMs);
|
|
50
|
+
const index = items.length < 2 ? 0 : Math.floor((now - startedAt) / stepMs) % items.length;
|
|
51
|
+
let commanded = null;
|
|
52
|
+
if (frame.press) {
|
|
53
|
+
const item = items[index];
|
|
54
|
+
if (item !== SCAN_CANCEL) {
|
|
55
|
+
commanded = item;
|
|
56
|
+
pressed = item;
|
|
57
|
+
pressedAt = now;
|
|
58
|
+
}
|
|
59
|
+
// 📌 EVERY PRESS RESTARTS THE PASS, taken or not: the next thing offered is «cancel», never the neighbour of what she just
|
|
60
|
+
// took. Without it a second bounce of the same hand would take the item beside the one she chose.
|
|
61
|
+
startedAt = now;
|
|
62
|
+
}
|
|
63
|
+
if (pressed && now - pressedAt >= o.pulseMs)
|
|
64
|
+
pressed = null;
|
|
65
|
+
return { pressed, commanded, showing: { item: items[index], index } };
|
|
66
|
+
};
|
|
67
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { TransportName } from './transport-in-use.js';
|
|
3
|
+
/**
|
|
4
|
+
* The property hung on the event.
|
|
5
|
+
*
|
|
6
|
+
* 📌 Prefixed and ugly on purpose: it is an expando on an object that is not ours, and a short name could collide with
|
|
7
|
+
* another library's without anything saying so.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SOURCE_KEY = "__vpOrigem";
|
|
10
|
+
/**
|
|
11
|
+
* The minimum this module reads from a key event — STRUCTURAL, so a real `KeyboardEvent` and a test double both serve.
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ `isTrusted` is OPTIONAL, and its absence is not `false` by accident: a double that does not declare it is saying "I
|
|
14
|
+
* asserted nothing about this", and the right answer to that is `undefined`, not the keyboard. The same rule as
|
|
15
|
+
* `input/state`'s `sourceOf`, one layer up.
|
|
16
|
+
*/
|
|
17
|
+
export interface KeyEventLike {
|
|
18
|
+
readonly isTrusted?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* DECLARES that this event came from that device. Returns the event itself, so the dispatch fits on one line.
|
|
22
|
+
*
|
|
23
|
+
* ⚠️ Stamp it BEFORE dispatching. After `dispatchEvent` the listeners have already run, and the stamp would reach an
|
|
24
|
+
* event nobody reads any more.
|
|
25
|
+
*/
|
|
26
|
+
export declare function stampSource<T extends object>(ev: T, source: TransportName): T;
|
|
27
|
+
/**
|
|
28
|
+
* WHO PRODUCED THIS EVENT? `undefined` when it is not known.
|
|
29
|
+
*
|
|
30
|
+
* The whole rule, in three lines and in this order:
|
|
31
|
+
*
|
|
32
|
+
* 1. **A valid stamp wins.** An explicit declaration always beats an inference — inverting it would make a REAL event
|
|
33
|
+
* someone remapped (a pedal, a sip-and-puff switch that emits real keys) read as the keyboard, erasing exactly the
|
|
34
|
+
* information whoever stamped it took the trouble to put there.
|
|
35
|
+
* 2. **No stamp but trusted → `'teclado'`.** That is what `isTrusted` means: the browser saw the person press. It is the
|
|
36
|
+
* one inference this module makes, and it makes it on the property that cannot be forged.
|
|
37
|
+
* 3. **No stamp and not trusted → `undefined`.** A synthetic event nobody signed. Nothing in this engine produces one;
|
|
38
|
+
* code from outside does, and code from outside did not declare. ⚠️ Returning the keyboard here would be the erasure
|
|
39
|
+
* coming back another way, the defect the whole of ADR-0109 exists to close — and worse than the original, because
|
|
40
|
+
* it would have the shape of an answer.
|
|
41
|
+
*/
|
|
42
|
+
export declare function sourceOfEvent(ev: KeyEventLike): TransportName | undefined;
|