@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,97 +1,39 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// ui/settings-visual — the
|
|
2
|
+
// ui/settings-visual — the visual accessibility overlay: high-contrast level, L→Q contrast enhancement,
|
|
3
3
|
// owner-colored items, CB-safe (Okabe-Ito) palette, color-blocking role colors, and the two outline selects
|
|
4
|
-
// (foreground/background).
|
|
5
|
-
// `setOutlineFg`/`setOutlineBg`/`setRoleColor`/`resetRoleColors` are INJECTED — they
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
// (
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
import { PADRAO as PADRAO_VISUAL } from '../render/viz-axes.js';
|
|
17
|
-
import { markChanged, markMenuChanged } from './changed-mark.js';
|
|
18
|
-
/** Contrast levels, in cycle order — mirrors game.js's HC_SEQ (also used there by the physical contrast-cycle button). */
|
|
19
|
-
export const CONTRAST_LEVELS = ['normal', 'hc-direto', 'hc-direto-45', 'hc-direto-7'];
|
|
20
|
-
/**
|
|
21
|
-
* TUDO que este menu escreve em `p.viz`: os 4 níveis de contraste MAIS as 3 correções de daltonismo, que
|
|
22
|
-
* mudaram de casa por decisão do Dev (#60). Elas moravam no Modo empatia, onde a criança daltônica precisava
|
|
23
|
-
* entrar no menu "sentir como é ter uma deficiência" para achar a correção da deficiência que ela tem.
|
|
24
|
-
*
|
|
25
|
-
* Os sete vivem num CONTROLE SÓ, e isso não é economia de espaço: `p.viz` guarda UM valor. Dois controles
|
|
26
|
-
* separados se sobrescreveriam em silêncio — a criança escolheria a correção, depois o contraste, e perderia
|
|
27
|
-
* a correção sem nada dizer que perdeu. Uma lista só conta a verdade sobre a exclusividade.
|
|
28
|
-
*/
|
|
29
|
-
export const VISUAL_MODES = [...CONTRAST_LEVELS, ...VIZ_CORRECTIONS.map((m) => m.key)];
|
|
30
|
-
const VISUAL_MODE_SET = new Set(VISUAL_MODES);
|
|
31
|
-
/** Short announcement labels — mirrors game.js's HC_LABEL. */
|
|
32
|
-
// Chaves i18n, não texto. Os dois extremos parecem números universais, mas '4,5:1' usa a vírgula decimal do
|
|
33
|
-
// pt-BR e vira '4.5:1' em inglês — e 'off' era uma palavra inglesa dentro de uma frase em português.
|
|
34
|
-
export const CONTRAST_LABELS = { normal: 'contrast.off', 'hc-direto': 'contrast.3', 'hc-direto-45': 'contrast.45', 'hc-direto-7': 'contrast.7' };
|
|
35
|
-
export const ROLE_KEYS = HC_ROLE_KEYS;
|
|
36
|
-
/** Readable labels for the color-blocking roles — mirrors game.js's ROLE_LBL. */
|
|
37
|
-
export const ROLE_LABELS = { hazard: 'perigo (lava)', climb: 'escalável (escada/trampolim)', water: 'água', gate: 'portão' };
|
|
38
|
-
// ---------- Pure logic (Right-BICEP/ZOMBIES-tested in node) ----------
|
|
39
|
-
/**
|
|
40
|
-
* `viz` quando ele é um modo DESTE menu (contraste ou correção), senão 'normal'.
|
|
4
|
+
// (foreground/background). The selected player and `setPlayerViz`/`setLq`/`setOwnerColors`/`setCbSafe`/
|
|
5
|
+
// `setOutlineFg`/`setOutlineBg`/`setRoleColor`/`resetRoleColors` are INJECTED — they reach texture caches and the
|
|
6
|
+
// world, which belong to the host. The player count and players come from the round the root owns.
|
|
7
|
+
import { mountSteps, updateSteps, nextStep, controlRow, labelRow } from './panel-widgets.js';
|
|
8
|
+
// The DEFAULT colours of the four roles, from render/hc-role-data (a leaf, no dependencies) — the same source
|
|
9
|
+
// render/high-contrast uses to repaint the tiles. Here they only say whether the child changed one.
|
|
10
|
+
import { HC_ROLE_DEF } from '../render/hc-role-data.js';
|
|
11
|
+
import { DEFAULTS } from '../core/setting-defaults.js';
|
|
12
|
+
/*
|
|
13
|
+
* 📌 THE PURE HALF LIVES IN `ui/visual-choices` (ADR-0221), and the SUITE pointed at the seam:
|
|
14
|
+
* `tests/settings-visual.node.test.js` imports exactly those names, and the node project mounts no document — so whoever
|
|
15
|
+
* wrote those cases had to know where this panel stops being a panel.
|
|
41
16
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
17
|
+
* ⚠️ NO ALIAS: a re-export would keep alive a published path nothing in here uses — surface with no consumer
|
|
18
|
+
* (issue #204).
|
|
44
19
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function contrastLabel(mode) {
|
|
50
|
-
return CONTRAST_LABELS[mode] ?? CONTRAST_LABELS.normal;
|
|
51
|
-
}
|
|
52
|
-
export function clamp01(t) {
|
|
53
|
-
return Math.max(0, Math.min(1, t));
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* i18n KEY of the L->Q slider label ('lq.off'/'lq.linear'/'lq.mixed'/'lq.quadratic'). The label belongs to the
|
|
57
|
-
* L->Q feature, so it lives with the filter that owns it (render/lq-filter) and is re-exported here under the
|
|
58
|
-
* name this overlay has always used. Two copies of one rule is one copy too many: only the owner may change
|
|
59
|
-
* what the levels mean. Callers resolve with `t()` — see the note on lqName about the `t` shadowing.
|
|
60
|
-
*/
|
|
61
|
-
export { lqName as lqLabel } from '../render/lq-filter.js';
|
|
62
|
-
/** t (0..1) -> slider percent (0..100, rounded) — mirrors `Math.round(lqT*100)`. */
|
|
63
|
-
export function lqPercent(t) {
|
|
64
|
-
return Math.round(clamp01(t) * 100);
|
|
65
|
-
}
|
|
66
|
-
/** slider percent (any number) -> clamped t (0..1) — mirrors `+lq.value/100` fed into setLq's clamp. */
|
|
67
|
-
export function lqFromPercent(pct) {
|
|
68
|
-
return clamp01(pct / 100);
|
|
69
|
-
}
|
|
70
|
-
/** Defensive clamp when the player count shrank — mirrors `if(selVizPlayer>=numPlayers)selVizPlayer=0`. */
|
|
71
|
-
export function clampSelectedPlayer(selected, playerCount) {
|
|
72
|
-
return selected >= playerCount ? 0 : selected;
|
|
73
|
-
}
|
|
74
|
-
/** [r,g,b] (0..255) -> '#rrggbb' — mirrors game.js's rgbHex. */
|
|
75
|
-
export function rgbToHex(rgb) {
|
|
76
|
-
return '#' + rgb.map((n) => n.toString(16).padStart(2, '0')).join('');
|
|
77
|
-
}
|
|
78
|
-
/** Shared on/off button label used by this panel's toggle buttons. */
|
|
79
|
-
export function onOffLabel(on) {
|
|
80
|
-
return toggleLabel(on);
|
|
81
|
-
}
|
|
20
|
+
import { ROLE_KEYS, ROLE_LABELS, LQ_STEPS, lqLabel, lqPosition, clampSelectedPlayer, rgbToHex, onOffLabel, resolveVisualMode, VISUAL_MODES, } from './visual-choices.js';
|
|
21
|
+
// The default of the TWO AXES (ADR-0076/#104). The mark asks the new model, not the p.viz mirror.
|
|
22
|
+
import { DEFAULT_VISUAL as PADRAO_VISUAL } from '../render/viz-axes.js';
|
|
23
|
+
import { markChanged, markMenuChanged } from './changed-mark.js';
|
|
82
24
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
25
|
+
* Reads `player[i].visual` defensively, without importing the player type — the same shape as `playerViz` below, for
|
|
26
|
+
* the same reason: `getPlayers()` returns `readonly unknown[]` because the real type is the GAME's (ADR-0033), and each
|
|
27
|
+
* consumer narrows to ITS slice.
|
|
86
28
|
*
|
|
87
|
-
* ⚠️
|
|
88
|
-
*
|
|
29
|
+
* ⚠️ With no player or no field, it returns the DEFAULT — the right answer to "did this child change anything?":
|
|
30
|
+
* whoever does not exist changed nothing. Inventing a value here would mark a menu nobody touched.
|
|
89
31
|
*/
|
|
90
32
|
function playerVisual(list, i) {
|
|
91
33
|
const v = list[i]?.visual;
|
|
92
34
|
return {
|
|
93
|
-
|
|
94
|
-
|
|
35
|
+
theme: typeof v?.tema === 'string' ? v.tema : PADRAO_VISUAL.tema,
|
|
36
|
+
correction: typeof v?.correcao === 'string' ? v.correcao : PADRAO_VISUAL.correcao,
|
|
95
37
|
};
|
|
96
38
|
}
|
|
97
39
|
/** Reads player[i].viz defensively (no player at that index -> 'normal'), without a Player type import. */
|
|
@@ -99,41 +41,189 @@ function playerViz(list, i) {
|
|
|
99
41
|
const p = list[i];
|
|
100
42
|
return typeof p?.viz === 'string' ? p.viz : 'normal';
|
|
101
43
|
}
|
|
102
|
-
|
|
44
|
+
const EVERY_ROW_OFFERED = { owner: true, roles: true };
|
|
45
|
+
/** The OWNER-COLOURED ITEMS row, already translated. A switch. */
|
|
46
|
+
function ownerRowSpec(t) {
|
|
47
|
+
return { id: 'opt-ownercolors', label: t('visual.dono'), hint: t('visual.dono.dica') };
|
|
48
|
+
}
|
|
49
|
+
/** The SAFE PALETTE (Okabe-Ito) row, already translated. */
|
|
50
|
+
function cbSafeRowSpec(t) {
|
|
51
|
+
return { id: 'opt-cbsafe', label: t('visual.cbsafe'), hint: t('visual.cbsafe.dica') };
|
|
52
|
+
}
|
|
103
53
|
/**
|
|
104
|
-
*
|
|
54
|
+
* Mounts this panel's inside ONCE. Called again, it RELABELS instead of rebuilding.
|
|
105
55
|
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* mal, esconder atrás de um clique é quase o mesmo que não ter movido. Voltam a ser linhas, e pelo mesmo
|
|
110
|
-
* renderizador que o painel de empatia usa — o que a criança já sabia procurar continua com a mesma cara.
|
|
56
|
+
* 🔴 Rebuilding costs more than duplicated markup: rebuilt on every render, the contrast boost's STEPS control would be
|
|
57
|
+
* a new element each time — a click on any other row would take the cursor off it —, and any node the root inserts
|
|
58
|
+
* into the list would be erased.
|
|
111
59
|
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
60
|
+
* ⚠️ Relabel and not rebuild, for the reason `labelRow` already states: listeners are wired at boot, and remaking the
|
|
61
|
+
* row would leave a control in the document with no listener — a dead button that looks alive (ADR-0106 §5).
|
|
114
62
|
*/
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
'
|
|
126
|
-
|
|
127
|
-
|
|
63
|
+
function mountVisualInside(t, ctx, list, offered = EVERY_ROW_OFFERED) {
|
|
64
|
+
/*
|
|
65
|
+
* 🔴 THE CONTRAST BOOST, IN STEPS AND WITH THE PROSE IN THE RIGHT PLACE (ADR-0151). The explanation lives in an
|
|
66
|
+
* `.opt-hint` from birth (`CLAUDE.md` §4), and THE LABEL GOES INSIDE THE STEPS — «◀ Realce de contraste: linear ▶»
|
|
67
|
+
* (ADR-0130 errata). `render` places the control, because it knows the current position.
|
|
68
|
+
*/
|
|
69
|
+
let enhanceRow = list.querySelector('.ctrl-row--passos');
|
|
70
|
+
if (!enhanceRow) {
|
|
71
|
+
enhanceRow = ctx.create('div');
|
|
72
|
+
enhanceRow.className = 'ctrl-row ctrl-row--passos';
|
|
73
|
+
const envelope = ctx.create('span');
|
|
74
|
+
const newHint = ctx.create('span');
|
|
75
|
+
newHint.className = 'opt-hint';
|
|
76
|
+
envelope.appendChild(newHint);
|
|
77
|
+
enhanceRow.appendChild(envelope);
|
|
78
|
+
const placeholder = ctx.create('span');
|
|
79
|
+
placeholder.setAttribute('data-passos-lugar', 'lq');
|
|
80
|
+
enhanceRow.appendChild(placeholder);
|
|
81
|
+
list.appendChild(enhanceRow);
|
|
82
|
+
}
|
|
83
|
+
const enhanceHint = enhanceRow.querySelector('.opt-hint');
|
|
84
|
+
if (enhanceHint)
|
|
85
|
+
enhanceHint.textContent = t('visual.lq.dica');
|
|
86
|
+
for (const spec of [...(offered.owner ? [ownerRowSpec(t)] : []), cbSafeRowSpec(t)]) {
|
|
87
|
+
const already = ctx.find('#' + spec.id)?.closest('.ctrl-row');
|
|
88
|
+
if (already)
|
|
89
|
+
labelRow(already, spec);
|
|
90
|
+
else
|
|
91
|
+
list.appendChild(controlRow(ctx, spec).row);
|
|
92
|
+
}
|
|
93
|
+
if (offered.roles)
|
|
94
|
+
mountRoleColoursRow(t, ctx, list);
|
|
128
95
|
}
|
|
129
|
-
/**
|
|
130
|
-
*
|
|
131
|
-
|
|
96
|
+
/**
|
|
97
|
+
* The FOUR ROLES row, and the only row of this panel the kit does not build.
|
|
98
|
+
*
|
|
99
|
+
* 📌 AND NOT FOR LACK OF ANOTHER SHAPE: `controlRow` builds one label, one hint and ONE control, and this row has FIVE —
|
|
100
|
+
* four colour swatches and the ↺ that resets them. Inventing a shape for it would give a second answer to the question
|
|
101
|
+
* of what a row is, which is exactly what the kit exists to prevent. It stays in nodes with the same discipline as the
|
|
102
|
+
* rest: mounted once, relabelled after.
|
|
103
|
+
*
|
|
104
|
+
* 📌 THE FRAME TRANSLATES, THE ROLE'S NAME PASSES THROUGH (`CLAUDE.md` §A FRONTEIRA): the frame is the engine's and goes
|
|
105
|
+
* through `t()`; the role's name is the word of the GAME mounting this panel, and the engine neither translates nor
|
|
106
|
+
* invents it — it passes through `{param}`, so the sentence stays true in a cartridge with other roles.
|
|
107
|
+
*/
|
|
108
|
+
function mountRoleColoursRow(t, ctx, list) {
|
|
109
|
+
let row = ctx.find('#opt-role-reset')?.closest('.ctrl-row') ?? null;
|
|
110
|
+
if (!row) {
|
|
111
|
+
row = ctx.create('div');
|
|
112
|
+
row.className = 'ctrl-row';
|
|
113
|
+
const envelope = ctx.create('span');
|
|
114
|
+
envelope.appendChild(ctx.create('strong'));
|
|
115
|
+
const newHint = ctx.create('span');
|
|
116
|
+
newHint.className = 'opt-hint';
|
|
117
|
+
envelope.appendChild(newHint);
|
|
118
|
+
row.appendChild(envelope);
|
|
119
|
+
const swatches = ctx.create('span');
|
|
120
|
+
swatches.style.cssText = 'display:flex;gap:.35rem;align-items:center';
|
|
121
|
+
for (const k of ROLE_KEYS) {
|
|
122
|
+
const swatch = ctx.create('input');
|
|
123
|
+
swatch.id = 'opt-role-' + k;
|
|
124
|
+
swatch.setAttribute('type', 'color');
|
|
125
|
+
swatch.style.cssText = 'inline-size:2.2em;block-size:1.8em;padding:0;border:1px solid #666;border-radius:4px;background:none';
|
|
126
|
+
swatches.appendChild(swatch);
|
|
127
|
+
}
|
|
128
|
+
const resetButton = ctx.create('button');
|
|
129
|
+
resetButton.id = 'opt-role-reset';
|
|
130
|
+
resetButton.className = 'mode-btn';
|
|
131
|
+
resetButton.setAttribute('type', 'button');
|
|
132
|
+
resetButton.textContent = '↺';
|
|
133
|
+
swatches.appendChild(resetButton);
|
|
134
|
+
row.appendChild(swatches);
|
|
135
|
+
list.appendChild(row);
|
|
136
|
+
}
|
|
137
|
+
const label = row.querySelector('strong');
|
|
138
|
+
if (label)
|
|
139
|
+
label.textContent = t('visual.papeis');
|
|
140
|
+
const hint = row.querySelector('.opt-hint');
|
|
141
|
+
if (hint)
|
|
142
|
+
hint.textContent = t('visual.papeis.dica');
|
|
143
|
+
for (const k of ROLE_KEYS) {
|
|
144
|
+
ctx.find('#opt-role-' + k)?.setAttribute('aria-label', t('visual.papel.cor', { papel: ROLE_LABELS[k] }));
|
|
145
|
+
}
|
|
146
|
+
ctx.find('#opt-role-reset')?.setAttribute('aria-label', t('visual.papel.repor'));
|
|
147
|
+
}
|
|
148
|
+
/** Are two role colours the same? Compared per component — `[0,0,0] === [0,0,0]` is `false` in JS, and that `false`
|
|
149
|
+
* would say "changed" for a colour nobody touched, sending the child to undo what they did not do. */
|
|
150
|
+
// 🎯 Not published: both its readers are here, a screen away.
|
|
151
|
+
function sameRgb(a, b) {
|
|
132
152
|
if (!a || !b)
|
|
133
153
|
return false;
|
|
134
154
|
return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
|
|
135
155
|
}
|
|
136
156
|
export function initSettingsVisual(ctx) {
|
|
157
|
+
const { t } = ctx;
|
|
158
|
+
/*
|
|
159
|
+
* 📌 THE KIT'S CTX COMES FROM THE LIST NODE ITSELF, not from a global `document` nor a new contract field.
|
|
160
|
+
* `ownerDocument` is the document that list LIVES in — exactly the document the rows must be born in —, so this
|
|
161
|
+
* module's global reach stays ZERO (ADR-0221) and `SettingsVisualCtx`, which is published surface, gains no required
|
|
162
|
+
* member (ADR-0172). The same shape as `ui/settings-aac`.
|
|
163
|
+
*/
|
|
164
|
+
const kitCtx = (list) => ({
|
|
165
|
+
find: (sel) => ctx.$(sel),
|
|
166
|
+
create: (tag) => list.ownerDocument.createElement(tag),
|
|
167
|
+
});
|
|
168
|
+
/** The boost's position is LOCAL to the control: the injected `setLq` may not return the new value in
|
|
169
|
+
* `getVisualSettings` until the next render, and rereading from there would move the position back. */
|
|
170
|
+
let enhanceStep = lqPosition(ctx.getVisualSettings().lq);
|
|
171
|
+
const enhanceSpec = () => ({ label: t('visual.lq'), values: LQ_STEPS.map((v) => t(lqLabel(v))), current: enhanceStep });
|
|
172
|
+
/** Listeners are wired ONCE. A second `addEventListener` on the same button gives two clicks per click. */
|
|
173
|
+
let wired = false;
|
|
174
|
+
function wireOnce(list) {
|
|
175
|
+
if (wired)
|
|
176
|
+
return;
|
|
177
|
+
wired = true;
|
|
178
|
+
const placeholder = ctx.$('[data-passos-lugar="lq"]');
|
|
179
|
+
if (placeholder) {
|
|
180
|
+
const stepper = mountSteps(kitCtx(list), enhanceSpec());
|
|
181
|
+
stepper.id = 'opt-lq';
|
|
182
|
+
placeholder.replaceWith(stepper);
|
|
183
|
+
stepper.addEventListener('passo', (ev) => {
|
|
184
|
+
const nextIndex = nextStep(enhanceStep, LQ_STEPS.length, ev.detail);
|
|
185
|
+
if (nextIndex === enhanceStep)
|
|
186
|
+
return; // at the end, a step that did not happen is not announced
|
|
187
|
+
enhanceStep = nextIndex;
|
|
188
|
+
ctx.setLq(LQ_STEPS[enhanceStep]);
|
|
189
|
+
updateSteps(stepper, enhanceSpec());
|
|
190
|
+
ctx.srSay(t('sr.visual.lq', { v: t(lqLabel(LQ_STEPS[enhanceStep])) }));
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
const oc = ctx.$('#opt-ownercolors');
|
|
194
|
+
if (oc)
|
|
195
|
+
oc.addEventListener('click', () => { ctx.setOwnerColors(!ctx.getVisualSettings().ownerColors); render(); });
|
|
196
|
+
const cb = ctx.$('#opt-cbsafe');
|
|
197
|
+
if (cb)
|
|
198
|
+
cb.addEventListener('click', () => { ctx.setCbSafe(!ctx.getVisualSettings().cbSafe); render(); });
|
|
199
|
+
for (const k of ROLE_KEYS) {
|
|
200
|
+
const inp = ctx.$('#opt-role-' + k);
|
|
201
|
+
if (inp)
|
|
202
|
+
inp.addEventListener('change', () => ctx.setRoleColor(k, inp.value));
|
|
203
|
+
}
|
|
204
|
+
const rr = ctx.$('#opt-role-reset');
|
|
205
|
+
if (rr)
|
|
206
|
+
rr.addEventListener('click', () => { ctx.resetRoleColors(); render(); });
|
|
207
|
+
}
|
|
208
|
+
/** What the controls SHOW — the state, written on every render. */
|
|
209
|
+
function reflectControls(s) {
|
|
210
|
+
for (const [sel, on] of [['#opt-ownercolors', s.ownerColors], ['#opt-cbsafe', s.cbSafe]]) {
|
|
211
|
+
const b = ctx.$(sel);
|
|
212
|
+
if (!b)
|
|
213
|
+
continue;
|
|
214
|
+
b.classList.toggle('is-on', on);
|
|
215
|
+
b.setAttribute('aria-pressed', String(on));
|
|
216
|
+
b.textContent = onOffLabel(t, on);
|
|
217
|
+
}
|
|
218
|
+
for (const k of ROLE_KEYS) {
|
|
219
|
+
const inp = ctx.$('#opt-role-' + k);
|
|
220
|
+
if (inp)
|
|
221
|
+
inp.value = rgbToHex(s.roleColors[k]);
|
|
222
|
+
}
|
|
223
|
+
const stepper = ctx.$('#opt-lq');
|
|
224
|
+
if (stepper)
|
|
225
|
+
updateSteps(stepper, enhanceSpec());
|
|
226
|
+
}
|
|
137
227
|
function reflectOutlines() {
|
|
138
228
|
const s = ctx.getVisualSettings();
|
|
139
229
|
const f = ctx.$('#opt-outline-fg');
|
|
@@ -161,119 +251,76 @@ export function initSettingsVisual(ctx) {
|
|
|
161
251
|
ctx.setSelectedPlayer(selected);
|
|
162
252
|
const contrastValue = resolveVisualMode(playerViz(ctx.getPlayers(), selected));
|
|
163
253
|
const settings = ctx.getVisualSettings();
|
|
164
|
-
// ⚠️ `
|
|
165
|
-
//
|
|
166
|
-
//
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (lq) {
|
|
173
|
-
// O parâmetro chamava-se `t` e passou a `amount`: `lqLabel` agora devolve uma chave que precisa de
|
|
174
|
-
// `t()` para virar texto, e o nome antigo sombreava justamente a função que faltava chamar aqui.
|
|
175
|
-
const reflect = (amount) => {
|
|
176
|
-
if (lqv)
|
|
177
|
-
lqv.textContent = t(lqLabel(amount));
|
|
178
|
-
};
|
|
179
|
-
lq.value = String(lqPercent(settings.lq));
|
|
180
|
-
reflect(settings.lq);
|
|
181
|
-
lq.addEventListener('input', () => {
|
|
182
|
-
const amount = lqFromPercent(Number(lq.value));
|
|
183
|
-
ctx.setLq(amount);
|
|
184
|
-
reflect(amount);
|
|
185
|
-
});
|
|
186
|
-
lq.addEventListener('change', () => {
|
|
187
|
-
ctx.srSay(t('sr.visual.lq', { v: t(lqLabel(lqFromPercent(Number(lq.value)))) }));
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
const oc = ctx.$('#opt-ownercolors');
|
|
191
|
-
if (oc)
|
|
192
|
-
oc.addEventListener('click', () => { ctx.setOwnerColors(!settings.ownerColors); render(); });
|
|
193
|
-
const cb = ctx.$('#opt-cbsafe');
|
|
194
|
-
if (cb)
|
|
195
|
-
cb.addEventListener('click', () => { ctx.setCbSafe(!settings.cbSafe); render(); });
|
|
196
|
-
for (const k of ROLE_KEYS) {
|
|
197
|
-
const inp = ctx.$('#opt-role-' + k);
|
|
198
|
-
if (inp)
|
|
199
|
-
inp.addEventListener('change', () => ctx.setRoleColor(k, inp.value));
|
|
200
|
-
}
|
|
201
|
-
const rr = ctx.$('#opt-role-reset');
|
|
202
|
-
if (rr)
|
|
203
|
-
rr.addEventListener('click', () => { ctx.resetRoleColors(); render(); });
|
|
254
|
+
// ⚠️ `renderVisualAxes` AND NOT `renderVizGroup` (#104): this panel has TWO controls, and `renderVizGroup` keeps
|
|
255
|
+
// serving the EMPATHY panel, whose simulation list really is exclusive. Changing that function's body instead of
|
|
256
|
+
// adding this one would put the two axes into the simulation list — the separation prevents it.
|
|
257
|
+
ctx.renderVisualAxes('#visual-modes', '#visual-players');
|
|
258
|
+
void contrastValue; // not read: `refreshMarks` compares through the new model, not this mirror
|
|
259
|
+
mountVisualInside(t, kitCtx(el), el, ctx.offer);
|
|
260
|
+
wireOnce(el);
|
|
261
|
+
reflectControls(settings);
|
|
204
262
|
reflectOutlines();
|
|
205
263
|
refreshMarks();
|
|
206
|
-
//
|
|
264
|
+
// The prose goes back to the footer after the rows are relabelled (CLAUDE.md §4, #109).
|
|
207
265
|
ctx.fillExplain?.(ctx.$('#visual .overlay__card'));
|
|
208
266
|
}
|
|
209
267
|
/**
|
|
210
|
-
*
|
|
268
|
+
* The left-the-default mark (ADR-0029). Each row against ITS default, and the menu's button on top.
|
|
211
269
|
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
* `resolveVisualMode` respondendo 'normal', que é a verdade sobre ESTE menu — aquele modo não saiu do
|
|
215
|
-
* padrão daqui, e é no menu de empatia que a marca precisa aparecer para levar a criança ao lugar certo.
|
|
270
|
+
* A SIMULATION switched on (empathy) does not mark THIS menu: its mark belongs to the empathy menu, and that is where it
|
|
271
|
+
* has to lead the child.
|
|
216
272
|
*/
|
|
217
273
|
function refreshMarks() {
|
|
218
274
|
const s = ctx.getVisualSettings();
|
|
219
275
|
/**
|
|
220
|
-
* 🔴
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
* padrão — que é o terceiro canal do ADR-0029 a perder informação: «a criança cega percorre o menu e OUVE,
|
|
224
|
-
* em ordem, o que saiu do padrão». Ouvir «mudado» sem saber de quê manda-a procurar em oito linhas.
|
|
276
|
+
* 🔴 THE MARK IS PER AXIS. `#visual-modes` holds TWO axes, and a mark on the container would stop saying WHICH one
|
|
277
|
+
* left the default — the third channel of ADR-0029 losing information: a blind child walks the menu and HEARS, in
|
|
278
|
+
* order, what left the default. Hearing "changed" without knowing what sends them searching through every row.
|
|
225
279
|
*
|
|
226
|
-
* ⚠️
|
|
227
|
-
* marcou `@deprecated` — um leitor que ficou para trás na migração.
|
|
280
|
+
* ⚠️ AND IT COMES FROM THE NEW MODEL, not from the deprecated `p.viz`.
|
|
228
281
|
*
|
|
229
|
-
* 📌
|
|
230
|
-
*
|
|
231
|
-
* menu de empatia e é lá que ela leva a criança. Antes isso dependia de o `resolveVisualMode` responder
|
|
232
|
-
* `normal`; agora a simulação vive noutro campo do `VisualState`, e perguntar pelo tema e pela correcção
|
|
233
|
-
* nunca a alcança.
|
|
282
|
+
* 📌 AND THE SIMULATION RULE IS STRUCTURAL: the simulation lives in another field of `VisualState`, so asking for the
|
|
283
|
+
* theme and the correction never reaches it.
|
|
234
284
|
*/
|
|
235
285
|
const visual = playerVisual(ctx.getPlayers(), ctx.getSelectedPlayer());
|
|
236
|
-
const
|
|
237
|
-
const
|
|
238
|
-
const
|
|
286
|
+
const themeChanged = visual.theme !== PADRAO_VISUAL.tema;
|
|
287
|
+
const correctionChanged = visual.correction !== PADRAO_VISUAL.correcao;
|
|
288
|
+
const rowOfCheckedAxis = (axis) => ctx.$(`#visual-modes button[data-eixo="${axis}"][aria-checked="true"]`)
|
|
239
289
|
?.closest('.ctrl-row') ?? null;
|
|
240
290
|
const lqOff = s.lq !== DEFAULTS.lq;
|
|
241
291
|
const owner = s.ownerColors !== DEFAULTS.ownerColors;
|
|
242
292
|
const cb = s.cbSafe !== DEFAULTS.cbSafe;
|
|
243
293
|
const fg = s.outlineFg !== DEFAULTS.hcOutlineFg;
|
|
244
294
|
const bg = s.outlineBg !== DEFAULTS.hcOutlineBg;
|
|
245
|
-
const
|
|
246
|
-
const
|
|
247
|
-
markChanged(
|
|
248
|
-
markChanged(
|
|
249
|
-
markChanged(
|
|
250
|
-
markChanged(
|
|
251
|
-
markChanged(
|
|
252
|
-
markChanged(
|
|
253
|
-
markChanged(
|
|
254
|
-
markChanged(
|
|
255
|
-
markMenuChanged(ctx.$('[data-act="visual"]'), [
|
|
295
|
+
const rolesChanged = ROLE_KEYS.some((k) => !sameRgb(s.roleColors[k], HC_ROLE_DEF[k]));
|
|
296
|
+
const rowOf = (sel) => ctx.$(sel)?.closest('.ctrl-row') ?? null;
|
|
297
|
+
markChanged(t, rowOfCheckedAxis('tema'), themeChanged);
|
|
298
|
+
markChanged(t, rowOfCheckedAxis('correcao'), correctionChanged);
|
|
299
|
+
markChanged(t, rowOf('#opt-lq'), lqOff);
|
|
300
|
+
markChanged(t, rowOf('#opt-ownercolors'), owner);
|
|
301
|
+
markChanged(t, rowOf('#opt-cbsafe'), cb);
|
|
302
|
+
markChanged(t, rowOf('#opt-outline-fg'), fg);
|
|
303
|
+
markChanged(t, rowOf('#opt-outline-bg'), bg);
|
|
304
|
+
markChanged(t, rowOf('#opt-role-reset'), rolesChanged);
|
|
305
|
+
markMenuChanged(t, ctx.$('[data-act="visual"]'), [themeChanged, correctionChanged, lqOff, owner, cb, fg, bg, rolesChanged]);
|
|
256
306
|
}
|
|
257
|
-
// ----
|
|
307
|
+
// ---- reset THIS menu's defaults (ADR-0028) ----
|
|
258
308
|
//
|
|
259
|
-
// `p.viz`
|
|
260
|
-
//
|
|
261
|
-
// ligada, este botão não tem nada a dizer sobre isso.
|
|
309
|
+
// `p.viz` is ONE field shared with the empathy menu, so the reset may only clear it when what is there is a mode of
|
|
310
|
+
// THIS menu. If the child has a low-vision or blindness simulation on, this button has nothing to say about it.
|
|
262
311
|
//
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
//
|
|
266
|
-
// o anúncio nomeia o modo visual entre o que voltou.
|
|
312
|
+
// The colour-blindness corrections ARE among what it clears: they live here (#60), and undoing them is legitimate
|
|
313
|
+
// because the child finds them again in the SAME selector they just used — a reset may only undo what it can also
|
|
314
|
+
// redo. That is why the announcement names the visual mode among what came back.
|
|
267
315
|
//
|
|
268
|
-
//
|
|
269
|
-
//
|
|
270
|
-
// visual). Puxá-las para cá agora responderia essa pergunta por acidente, num commit sobre outra coisa.
|
|
316
|
+
// The CAPTIONS switch (#opt-captions) stays out: this panel is not given its writer, and a reset that could not
|
|
317
|
+
// reach it would announce a default it did not restore.
|
|
271
318
|
const resetBtn = ctx.$('#visual-reset');
|
|
272
319
|
if (resetBtn)
|
|
273
320
|
resetBtn.addEventListener('click', () => {
|
|
274
321
|
ctx.getPlayers().forEach((_p, i) => {
|
|
275
322
|
const viz = playerViz(ctx.getPlayers(), i);
|
|
276
|
-
if (
|
|
323
|
+
if (VISUAL_MODES.includes(viz) && viz !== 'normal')
|
|
277
324
|
ctx.setPlayerViz(i, 'normal');
|
|
278
325
|
});
|
|
279
326
|
const s = ctx.getVisualSettings();
|