@the-inclusionist/engine 6.36.1
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/LICENSE +661 -0
- package/README.md +107 -0
- package/app/css/style.css +622 -0
- package/app/public/vendor/fonts/andika-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/andika-400.woff2 +0 -0
- package/app/public/vendor/fonts/andika-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/andika-700.woff2 +0 -0
- package/app/public/vendor/fonts/atkinson-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/atkinson-400.woff2 +0 -0
- package/app/public/vendor/fonts/atkinson-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/atkinson-700.woff2 +0 -0
- package/app/public/vendor/fonts/atkinson-mono-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/atkinson-mono-400.woff2 +0 -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/greatvibes-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/lexend-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/lexend-400.woff2 +0 -0
- package/app/public/vendor/fonts/lexend-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/lexend-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/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/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/ufcook-700.woff2 +0 -0
- package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
- package/app/public/vendor/fonts.css +88 -0
- package/dist-pkg/boot/create-game.d.ts +159 -0
- package/dist-pkg/boot/create-game.js +266 -0
- package/dist-pkg/core/a11y-sr.d.ts +4 -0
- package/dist-pkg/core/a11y-sr.js +20 -0
- package/dist-pkg/core/actions.d.ts +100 -0
- package/dist-pkg/core/actions.js +149 -0
- package/dist-pkg/core/anel.d.ts +17 -0
- package/dist-pkg/core/anel.js +31 -0
- package/dist-pkg/core/collision.d.ts +21 -0
- package/dist-pkg/core/collision.js +62 -0
- package/dist-pkg/core/constants.d.ts +84 -0
- package/dist-pkg/core/constants.js +64 -0
- package/dist-pkg/core/contract.d.ts +227 -0
- package/dist-pkg/core/contract.js +184 -0
- package/dist-pkg/core/dom-query.d.ts +9 -0
- package/dist-pkg/core/dom-query.js +25 -0
- package/dist-pkg/core/entity.d.ts +150 -0
- package/dist-pkg/core/entity.js +38 -0
- package/dist-pkg/core/escape-html.d.ts +16 -0
- package/dist-pkg/core/escape-html.js +32 -0
- package/dist-pkg/core/i18n.d.ts +71 -0
- package/dist-pkg/core/i18n.js +236 -0
- package/dist-pkg/core/layers.d.ts +39 -0
- package/dist-pkg/core/layers.js +71 -0
- package/dist-pkg/core/letter-grid.d.ts +55 -0
- package/dist-pkg/core/letter-grid.js +116 -0
- package/dist-pkg/core/loop.d.ts +17 -0
- package/dist-pkg/core/loop.js +36 -0
- package/dist-pkg/core/password.d.ts +34 -0
- package/dist-pkg/core/password.js +205 -0
- package/dist-pkg/core/rng.d.ts +20 -0
- package/dist-pkg/core/rng.js +61 -0
- package/dist-pkg/core/rotulo-acessivel.d.ts +17 -0
- package/dist-pkg/core/rotulo-acessivel.js +41 -0
- package/dist-pkg/core/run-state.d.ts +115 -0
- package/dist-pkg/core/run-state.js +40 -0
- package/dist-pkg/core/scenes.d.ts +68 -0
- package/dist-pkg/core/scenes.js +64 -0
- package/dist-pkg/core/screens.d.ts +16 -0
- package/dist-pkg/core/screens.js +28 -0
- package/dist-pkg/core/state.d.ts +138 -0
- package/dist-pkg/core/state.js +290 -0
- package/dist-pkg/core/tiles.d.ts +12 -0
- package/dist-pkg/core/tiles.js +61 -0
- package/dist-pkg/core/world.d.ts +4 -0
- package/dist-pkg/core/world.js +58 -0
- package/dist-pkg/educational/activities-registry.d.ts +47 -0
- package/dist-pkg/educational/activities-registry.js +95 -0
- package/dist-pkg/i18n/en.d.ts +3 -0
- package/dist-pkg/i18n/en.js +560 -0
- package/dist-pkg/i18n/es.d.ts +3 -0
- package/dist-pkg/i18n/es.js +558 -0
- package/dist-pkg/i18n/pt.d.ts +3 -0
- package/dist-pkg/i18n/pt.js +618 -0
- package/dist-pkg/input/default-bindings.d.ts +24 -0
- package/dist-pkg/input/default-bindings.js +122 -0
- package/dist-pkg/input/devices.d.ts +15 -0
- package/dist-pkg/input/devices.js +31 -0
- package/dist-pkg/input/edges.d.ts +58 -0
- package/dist-pkg/input/edges.js +49 -0
- package/dist-pkg/input/gamepad.d.ts +203 -0
- package/dist-pkg/input/gamepad.js +531 -0
- package/dist-pkg/input/keyboard-runtime.d.ts +61 -0
- package/dist-pkg/input/keyboard-runtime.js +83 -0
- package/dist-pkg/input/keyboard.d.ts +45 -0
- package/dist-pkg/input/keyboard.js +80 -0
- package/dist-pkg/input/keydown.d.ts +270 -0
- package/dist-pkg/input/keydown.js +381 -0
- package/dist-pkg/input/latch.d.ts +30 -0
- package/dist-pkg/input/latch.js +63 -0
- package/dist-pkg/input/pointer-space.d.ts +40 -0
- package/dist-pkg/input/pointer-space.js +51 -0
- package/dist-pkg/input/state.d.ts +11 -0
- package/dist-pkg/input/state.js +12 -0
- package/dist-pkg/input/touch-bindings.d.ts +210 -0
- package/dist-pkg/input/touch-bindings.js +365 -0
- package/dist-pkg/input/touch.d.ts +173 -0
- package/dist-pkg/input/touch.js +314 -0
- package/dist-pkg/input/transports.d.ts +90 -0
- package/dist-pkg/input/transports.js +96 -0
- package/dist-pkg/input/vocabulary-migration.d.ts +58 -0
- package/dist-pkg/input/vocabulary-migration.js +125 -0
- package/dist-pkg/platform/audio-ambient.d.ts +27 -0
- package/dist-pkg/platform/audio-ambient.js +89 -0
- package/dist-pkg/platform/audio-earcons.d.ts +24 -0
- package/dist-pkg/platform/audio-earcons.js +62 -0
- package/dist-pkg/platform/audio-jingles.d.ts +17 -0
- package/dist-pkg/platform/audio-jingles.js +54 -0
- package/dist-pkg/platform/audio-mixer.d.ts +14 -0
- package/dist-pkg/platform/audio-mixer.js +62 -0
- package/dist-pkg/platform/audio-nav.d.ts +51 -0
- package/dist-pkg/platform/audio-nav.js +99 -0
- package/dist-pkg/platform/audio-sonar.d.ts +71 -0
- package/dist-pkg/platform/audio-sonar.js +173 -0
- package/dist-pkg/platform/audio.d.ts +32 -0
- package/dist-pkg/platform/audio.js +191 -0
- package/dist-pkg/platform/interruptible-speech.d.ts +19 -0
- package/dist-pkg/platform/interruptible-speech.js +79 -0
- package/dist-pkg/platform/speech.d.ts +2 -0
- package/dist-pkg/platform/speech.js +35 -0
- package/dist-pkg/platform/storage.d.ts +87 -0
- package/dist-pkg/platform/storage.js +148 -0
- package/dist-pkg/platform/tts.d.ts +33 -0
- package/dist-pkg/platform/tts.js +142 -0
- package/dist-pkg/render/camera.d.ts +58 -0
- package/dist-pkg/render/camera.js +105 -0
- package/dist-pkg/render/canvas.d.ts +13 -0
- package/dist-pkg/render/canvas.js +26 -0
- package/dist-pkg/render/cenario-data.d.ts +127 -0
- package/dist-pkg/render/cenario-data.js +145 -0
- package/dist-pkg/render/city-tex.d.ts +63 -0
- package/dist-pkg/render/city-tex.js +228 -0
- package/dist-pkg/render/city-tiles.d.ts +11 -0
- package/dist-pkg/render/city-tiles.js +140 -0
- package/dist-pkg/render/crt.d.ts +19 -0
- package/dist-pkg/render/crt.js +92 -0
- package/dist-pkg/render/cvd-matrices.d.ts +35 -0
- package/dist-pkg/render/cvd-matrices.js +91 -0
- package/dist-pkg/render/draw.d.ts +149 -0
- package/dist-pkg/render/draw.js +221 -0
- package/dist-pkg/render/fx.d.ts +63 -0
- package/dist-pkg/render/fx.js +123 -0
- package/dist-pkg/render/hc-role-data.d.ts +14 -0
- package/dist-pkg/render/hc-role-data.js +24 -0
- package/dist-pkg/render/high-contrast.d.ts +109 -0
- package/dist-pkg/render/high-contrast.js +254 -0
- package/dist-pkg/render/lq-filter.d.ts +37 -0
- package/dist-pkg/render/lq-filter.js +94 -0
- package/dist-pkg/render/minimap.d.ts +11 -0
- package/dist-pkg/render/minimap.js +94 -0
- package/dist-pkg/render/parallax.d.ts +85 -0
- package/dist-pkg/render/parallax.js +158 -0
- package/dist-pkg/render/player-anim.d.ts +71 -0
- package/dist-pkg/render/player-anim.js +152 -0
- package/dist-pkg/render/port.d.ts +143 -0
- package/dist-pkg/render/port.js +29 -0
- package/dist-pkg/render/recycling-tex.d.ts +48 -0
- package/dist-pkg/render/recycling-tex.js +164 -0
- package/dist-pkg/render/scene-city.d.ts +77 -0
- package/dist-pkg/render/scene-city.js +181 -0
- package/dist-pkg/render/scene-parallax.d.ts +72 -0
- package/dist-pkg/render/scene-parallax.js +426 -0
- package/dist-pkg/render/scene-sky.d.ts +126 -0
- package/dist-pkg/render/scene-sky.js +295 -0
- package/dist-pkg/render/screen-pipeline.d.ts +134 -0
- package/dist-pkg/render/screen-pipeline.js +177 -0
- package/dist-pkg/render/set-cenario.d.ts +54 -0
- package/dist-pkg/render/set-cenario.js +103 -0
- package/dist-pkg/render/sprite-fx.d.ts +3 -0
- package/dist-pkg/render/sprite-fx.js +40 -0
- package/dist-pkg/render/textures.d.ts +75 -0
- package/dist-pkg/render/textures.js +240 -0
- package/dist-pkg/render/title-scene.d.ts +46 -0
- package/dist-pkg/render/title-scene.js +75 -0
- package/dist-pkg/render/viewports.d.ts +52 -0
- package/dist-pkg/render/viewports.js +185 -0
- package/dist-pkg/render/viz-axes.d.ts +98 -0
- package/dist-pkg/render/viz-axes.js +184 -0
- package/dist-pkg/render/viz-modes.d.ts +61 -0
- package/dist-pkg/render/viz-modes.js +74 -0
- package/dist-pkg/render/viz-setters.d.ts +130 -0
- package/dist-pkg/render/viz-setters.js +244 -0
- package/dist-pkg/render/weather.d.ts +96 -0
- package/dist-pkg/render/weather.js +171 -0
- package/dist-pkg/render/wheelchair-sprites.d.ts +24 -0
- package/dist-pkg/render/wheelchair-sprites.js +63 -0
- package/dist-pkg/render/world-tex.d.ts +18 -0
- package/dist-pkg/render/world-tex.js +87 -0
- package/dist-pkg/ui/activities-menu.d.ts +258 -0
- package/dist-pkg/ui/activities-menu.js +648 -0
- package/dist-pkg/ui/caa-sets.d.ts +39 -0
- package/dist-pkg/ui/caa-sets.js +65 -0
- package/dist-pkg/ui/changed-mark.d.ts +15 -0
- package/dist-pkg/ui/changed-mark.js +96 -0
- package/dist-pkg/ui/debug-panel.d.ts +67 -0
- package/dist-pkg/ui/debug-panel.js +173 -0
- package/dist-pkg/ui/dom.d.ts +24 -0
- package/dist-pkg/ui/dom.js +47 -0
- package/dist-pkg/ui/focus-trap.d.ts +71 -0
- package/dist-pkg/ui/focus-trap.js +99 -0
- package/dist-pkg/ui/fonts.d.ts +41 -0
- package/dist-pkg/ui/fonts.js +59 -0
- package/dist-pkg/ui/hud.d.ts +137 -0
- package/dist-pkg/ui/hud.js +229 -0
- package/dist-pkg/ui/item-announcement.d.ts +19 -0
- package/dist-pkg/ui/item-announcement.js +36 -0
- package/dist-pkg/ui/layout.d.ts +6 -0
- package/dist-pkg/ui/layout.js +54 -0
- package/dist-pkg/ui/loop-crash.d.ts +19 -0
- package/dist-pkg/ui/loop-crash.js +60 -0
- package/dist-pkg/ui/map-hub.d.ts +56 -0
- package/dist-pkg/ui/map-hub.js +138 -0
- package/dist-pkg/ui/menu-nav.d.ts +141 -0
- package/dist-pkg/ui/menu-nav.js +390 -0
- package/dist-pkg/ui/pause-icons.d.ts +327 -0
- package/dist-pkg/ui/pause-icons.js +620 -0
- package/dist-pkg/ui/reach-notice.d.ts +34 -0
- package/dist-pkg/ui/reach-notice.js +71 -0
- package/dist-pkg/ui/settings-audio.d.ts +139 -0
- package/dist-pkg/ui/settings-audio.js +544 -0
- package/dist-pkg/ui/settings-caa.d.ts +45 -0
- package/dist-pkg/ui/settings-caa.js +137 -0
- package/dist-pkg/ui/settings-controls.d.ts +100 -0
- package/dist-pkg/ui/settings-controls.js +152 -0
- package/dist-pkg/ui/settings-empathy.d.ts +62 -0
- package/dist-pkg/ui/settings-empathy.js +137 -0
- package/dist-pkg/ui/settings-motion.d.ts +95 -0
- package/dist-pkg/ui/settings-motion.js +282 -0
- package/dist-pkg/ui/settings-motor.d.ts +77 -0
- package/dist-pkg/ui/settings-motor.js +215 -0
- package/dist-pkg/ui/settings-panel.d.ts +76 -0
- package/dist-pkg/ui/settings-panel.js +187 -0
- package/dist-pkg/ui/settings-typo.d.ts +74 -0
- package/dist-pkg/ui/settings-typo.js +150 -0
- package/dist-pkg/ui/settings-visual.d.ts +111 -0
- package/dist-pkg/ui/settings-visual.js +252 -0
- package/dist-pkg/ui/shell.d.ts +239 -0
- package/dist-pkg/ui/shell.js +430 -0
- package/dist-pkg/ui/title.d.ts +36 -0
- package/dist-pkg/ui/title.js +60 -0
- package/dist-pkg/ui/vlibras.d.ts +11 -0
- package/dist-pkg/ui/vlibras.js +87 -0
- package/dist-pkg/ui/webcam.d.ts +7 -0
- package/dist-pkg/ui/webcam.js +88 -0
- package/docs/CREDITS.md +64 -0
- package/docs/LICENSES.md +132 -0
- package/package.json +115 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// ui/webcam.ts — JOGAR COM OS OLHOS (acessibilidade motora): controle por olhar via WebGazer (webcam). Estágio 4,
|
|
3
|
+
// Tier 1. WebGazer entra lazy (script do CDN no 1º uso; vendorizar p/ offline é futuro). onGaze mapeia o olhar
|
|
4
|
+
// para teclas SINTÉTICAS (olhar esq/dir = andar A/D; olhar p/ cima = pular Espaço) → reusa o input do teclado.
|
|
5
|
+
// O botão (#opt-eyes) fica no game.js (usa toggleBtn); aqui a lógica. Deps: ui/dom ($) + core/a11y-sr (srSay/srAlert).
|
|
6
|
+
import { t } from '../core/i18n.js';
|
|
7
|
+
import { $ } from './dom.js';
|
|
8
|
+
import { srAlert } from '../core/a11y-sr.js';
|
|
9
|
+
import { emFracao } from '../input/pointer-space.js'; // #105: um lugar so converte um ponto de tela
|
|
10
|
+
const wg = () => window.webgazer;
|
|
11
|
+
export let eyeMode = false; // ligado pelo botão; onGaze só age com ele ligado
|
|
12
|
+
export function setEyeMode(on) { eyeMode = on; }
|
|
13
|
+
const _eyeKeys = { left: false, right: false, up: false };
|
|
14
|
+
// Dispara keydown/keyup SINTÉTICO só na TRANSIÇÃO (evita repetir). code = tecla física (KeyA/KeyD/Space).
|
|
15
|
+
function eyeSet(k, on, code) {
|
|
16
|
+
if (_eyeKeys[k] === on)
|
|
17
|
+
return;
|
|
18
|
+
_eyeKeys[k] = on;
|
|
19
|
+
const ev = new KeyboardEvent(on ? 'keydown' : 'keyup', { code, bubbles: true });
|
|
20
|
+
window.dispatchEvent(ev);
|
|
21
|
+
document.dispatchEvent(ev);
|
|
22
|
+
}
|
|
23
|
+
// Recebe o ponto do olhar (px de tela), normaliza dentro do #game-region e vira direção. Exportado p/ teste.
|
|
24
|
+
//
|
|
25
|
+
// ⚠️ AQUI MORA METADE DA ISSUE #105, e vale estar escrito onde acontece: este handler recebe uma POSIÇÃO
|
|
26
|
+
// CONTÍNUA e deita-a fora em três limiares, emitindo teclas sintéticas. É a mesma coisa que os direcionais de
|
|
27
|
+
// toque fazem — e é por isso que a issue conclui que o ponteiro não é fundação nova, é a fundação que o olhar
|
|
28
|
+
// já precisava e nunca teve. Enquanto o ponto morre aqui, uma atividade de desenho não tem como usar o olhar.
|
|
29
|
+
//
|
|
30
|
+
// A conta em si passou a vir de `input/pointer-space`: um lugar só converte um ponto de tela, que é o
|
|
31
|
+
// primeiro item da `definition of done` da #105. O que este ficheiro FAZ com o ponto continua igual.
|
|
32
|
+
export function onGaze(data) {
|
|
33
|
+
const d = data;
|
|
34
|
+
if (!d || !eyeMode)
|
|
35
|
+
return;
|
|
36
|
+
const gr = $('#game-region');
|
|
37
|
+
if (!gr)
|
|
38
|
+
return;
|
|
39
|
+
const r = gr.getBoundingClientRect();
|
|
40
|
+
if (!r.width)
|
|
41
|
+
return;
|
|
42
|
+
const { fx, fy } = emFracao(d.x, d.y, r);
|
|
43
|
+
eyeSet('left', fx < 0.4, 'KeyA');
|
|
44
|
+
eyeSet('right', fx > 0.6, 'KeyD');
|
|
45
|
+
eyeSet('up', fy < 0.28, 'Space'); // esq/dir = andar; alto = pular
|
|
46
|
+
}
|
|
47
|
+
export function startEyeControl() {
|
|
48
|
+
try {
|
|
49
|
+
const g = wg();
|
|
50
|
+
if (!g) {
|
|
51
|
+
srAlert(t('sr.eyes.loadFailed'));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
g.setRegression('ridge').setGazeListener(onGaze).begin();
|
|
55
|
+
try {
|
|
56
|
+
g.showVideoPreview(true).showPredictionPoints(true);
|
|
57
|
+
}
|
|
58
|
+
catch (e) { /* noop */ }
|
|
59
|
+
srAlert(t('sr.eyes.calibrate'));
|
|
60
|
+
}
|
|
61
|
+
catch (e) { /* noop */ }
|
|
62
|
+
}
|
|
63
|
+
export function stopEyeControl() {
|
|
64
|
+
try {
|
|
65
|
+
const g = wg();
|
|
66
|
+
if (g)
|
|
67
|
+
g.end();
|
|
68
|
+
}
|
|
69
|
+
catch (e) { /* noop */ }
|
|
70
|
+
eyeSet('left', false, 'KeyA');
|
|
71
|
+
eyeSet('right', false, 'KeyD');
|
|
72
|
+
eyeSet('up', false, 'Space');
|
|
73
|
+
}
|
|
74
|
+
// Carrega o WebGazer (uma vez) do CDN e chama cb ao terminar. Precisa de internet no 1º uso.
|
|
75
|
+
export function loadWebGazer(cb) {
|
|
76
|
+
if (wg()) {
|
|
77
|
+
if (cb)
|
|
78
|
+
cb();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const s = document.createElement('script');
|
|
82
|
+
s.src = 'https://webgazer.cs.brown.edu/webgazer.js';
|
|
83
|
+
s.async = true;
|
|
84
|
+
s.onload = () => { if (cb)
|
|
85
|
+
cb(); };
|
|
86
|
+
s.onerror = () => srAlert(t('sr.eyes.needsInternet'));
|
|
87
|
+
document.head.appendChild(s);
|
|
88
|
+
}
|
package/docs/CREDITS.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Créditos e atribuições de terceiros
|
|
2
|
+
|
|
3
|
+
O código de **The Inclusionist** é AGPL-3.0-or-later. Partes de terceiros abaixo mantêm suas próprias licenças.
|
|
4
|
+
|
|
5
|
+
## Clarity — Adam Brooks (dissimulate) — MIT
|
|
6
|
+
|
|
7
|
+
As **mecânicas de plataforma** partiram do projeto **Clarity**, de Adam Brooks (dissimulate), sob licença
|
|
8
|
+
**MIT**. O **mapa** (`app/assets/levels/clarity.map.txt`, batizado em homenagem) foi **fortemente adaptado** do
|
|
9
|
+
nível do Clarity — com modificações cirúrgicas de layout e mudança de significado de vários tiles — não é uma
|
|
10
|
+
cópia, mas uma obra derivada. A atribuição abaixo cobre a porção de origem.
|
|
11
|
+
|
|
12
|
+
- Código: https://github.com/dissimulate/Clarity
|
|
13
|
+
- Jogável: https://codepen.io/dissimulate/pen/AGYEby
|
|
14
|
+
|
|
15
|
+
Texto da licença MIT (aplicável às porções derivadas do Clarity):
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
MIT License
|
|
19
|
+
|
|
20
|
+
Copyright (c) Adam Brooks (dissimulate)
|
|
21
|
+
|
|
22
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
23
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
24
|
+
in the Software without restriction, including without limitation the rights
|
|
25
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
26
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
27
|
+
furnished to do so, subject to the following conditions:
|
|
28
|
+
|
|
29
|
+
The above copyright notice and this permission notice shall be included in all
|
|
30
|
+
copies or substantial portions of the Software.
|
|
31
|
+
|
|
32
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
33
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
34
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
35
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
36
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
37
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
38
|
+
SOFTWARE.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
> Nota: confirmar o ano/linha exata de copyright no `LICENSE` do repositório do Clarity e alinhar aqui antes de
|
|
42
|
+
> qualquer distribuição formal. MIT é compatível com AGPL-3.0 (as porções MIT mantêm seu aviso; o todo é AGPL-3.0).
|
|
43
|
+
|
|
44
|
+
## Voz neural (TTS) — Next-gen Kaldi, Piper, eSpeak NG
|
|
45
|
+
|
|
46
|
+
A narração por voz roda **inteiramente no navegador/offline** graças ao trabalho excepcional de:
|
|
47
|
+
|
|
48
|
+
- **[sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx)** (projeto **Next-gen Kaldi / k2-fsa**, **Apache-2.0**) — o motor
|
|
49
|
+
de inferência TTS em WebAssembly. Um agradecimento especial a **Fangjun Kuang** ([@csukuangfj](https://github.com/csukuangfj)),
|
|
50
|
+
engenheiro-líder do Next-gen Kaldi (sherpa-onnx, k2, icefall, kaldi-native-fbank; coautor de trabalhos como
|
|
51
|
+
[ZipVoice](https://github.com/k2-fsa/ZipVoice)), que **empacotou as vozes Piper no formato ONNX/sherpa** (repositórios
|
|
52
|
+
`vits-piper-*`) — inclusive **portando a `dii` de pt-PT para pt-BR** — tornando este uso possível. Obrigado.
|
|
53
|
+
- **[Piper](https://github.com/rhasspy/piper)** (Michael Hansen / rhasspy, **MIT**) — o sistema TTS VITS por trás das vozes.
|
|
54
|
+
- **[eSpeak NG](https://github.com/espeak-ng/espeak-ng)** (**GPL-3.0**) — a fonemização (`espeak-ng-data`) usada pelas vozes.
|
|
55
|
+
- **Vozes pt-BR** (`faber`, `jeff`, `miro`, `cadu`) e pt-PT (`dii`) — treinadas pela comunidade Piper a partir de datasets
|
|
56
|
+
de locutores; a licença de cada voz está no `MODEL_CARD` do respectivo pacote e deve ser confirmada por voz antes de
|
|
57
|
+
distribuição formal.
|
|
58
|
+
**O que o jogo de fato embarca hoje é uma voz:** `pt_BR-faber-medium`. As demais permanecem no repositório como
|
|
59
|
+
material de laboratório (`docs/research/sherpa-wasm/`) e continuam creditadas por isso — crédito acompanha o que
|
|
60
|
+
está no repositório, e não apenas o que é distribuído no pacote. O roster de entrega decidido é `en_US`, `pt_BR` e
|
|
61
|
+
`es_MX` (ADR-0065, que supersede o ADR-0022).
|
|
62
|
+
|
|
63
|
+
> Os pesos das vozes são **baixados uma vez** (de um host público) e rodam **100% localmente** depois — nenhum áudio de
|
|
64
|
+
> criança sai do dispositivo. Ver `docs/2-Architecture/adr/ADR-0065-three-neural-voices-owned-by-the-engine-and-cached-on-first-use.yaml`.
|
package/docs/LICENSES.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# O que governa o quê
|
|
2
|
+
|
|
3
|
+
Este projeto tem **duas licenças e um terceiro regime**, e confundi-los seria afirmar direito que não se
|
|
4
|
+
tem. Este ficheiro diz apenas **qual regra alcança qual coisa**. As atribuições estão em
|
|
5
|
+
[`CREDITS.md`](CREDITS.md); as razões, nos registros citados em cada linha.
|
|
6
|
+
|
|
7
|
+
| o quê | regime | onde se decide |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| **Código** | **AGPL-3.0-or-later** | ADR-0064 · texto integral em [`../LICENSE`](../LICENSE) |
|
|
10
|
+
| **Arte própria** | **NÃO é FOSS** — direito autoral do autor, uso restrito | ADR-0010 pilar 10 · `research/LICENCAS-GERACAO-IMAGEM.md` |
|
|
11
|
+
| **Conteúdo de terceiros** | a licença que o autor escolheu, preservada | requerimento, pedido `g` |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1 · O código é AGPL-3.0-or-later
|
|
16
|
+
|
|
17
|
+
Todo programa deste repositório. O `-or-later` é deliberado.
|
|
18
|
+
|
|
19
|
+
**Por que AGPL e não GPL:** a GPL obriga quem **conveia**, e rodar serviço não é conveiar — a seção 0 da
|
|
20
|
+
própria GPL separa `propagate` de `convey`. Um fornecedor que pegasse este código, melhorasse e hospedasse
|
|
21
|
+
a sala de aula como serviço **não deveria a fonte a ninguém**. A seção 13 da AGPL fecha exatamente isso, e é
|
|
22
|
+
o argumento que o requerimento faz ao Município na alínea `e`. Ver **ADR-0064**.
|
|
23
|
+
|
|
24
|
+
⚠️ **Titularidade patrimonial: o MUNICÍPIO, não o desenvolvedor.** Software produzido no exercício das
|
|
25
|
+
funções pertence ao empregador (Lei nº 9.609/1998, art. 4º), e é por isso que a publicação sob AGPL é
|
|
26
|
+
objeto de **pedido** no requerimento — ato do Poder Executivo — e não decisão de quem escreveu o código.
|
|
27
|
+
|
|
28
|
+
⚠️ **E é AQUI que essa titularidade fica dita, não no nome do pacote.** O escopo era `@pm-monte` para
|
|
29
|
+
carregar esse fato (ADR-0036); passou a ser **`@the-inclusionist`** (**ADR-0071**), porque nome é lido por
|
|
30
|
+
quem não vai abrir o repositório, e um escopo com o nome da Prefeitura publicado por servidor **antes do
|
|
31
|
+
ato** é reivindicação pública de nome alheio. A regra é a mesma do **ADR-0066 §2**: a posse se declara
|
|
32
|
+
DENTRO — neste ficheiro, na `LICENSE` e nos registros —, onde lê quem pretende usar.
|
|
33
|
+
|
|
34
|
+
## 2 · A arte NÃO é AGPL, e isso é decisão, não omissão
|
|
35
|
+
|
|
36
|
+
Programa é o que a **Lei nº 9.609/1998** define. **Arte segue a Lei nº 9.610/1998** e pertence a quem a fez.
|
|
37
|
+
Estender a AGPL à arte daria mais do que a lei pede **e** disporia de direito alheio.
|
|
38
|
+
|
|
39
|
+
⚠️ **E há uma razão de produto, não só jurídica:** o requisito é que os personagens **não** sejam de uso
|
|
40
|
+
livre — não aparecerem em produto adulto, por exemplo. Isso é **incompatível com FOSS por construção**:
|
|
41
|
+
licença livre não pode restringir campo de uso (liberdade 0; critério 6 da OSI, "sem discriminação de área
|
|
42
|
+
de atuação"). Não existe arte simultaneamente livre e de uso restrito. A escolha foi feita com o
|
|
43
|
+
trade-off escrito: **código FOSS + arte não-FOSS**.
|
|
44
|
+
|
|
45
|
+
**A proteção é uma pilha de três, do mais forte ao mais fraco** (`research/LICENCAS-GERACAO-IMAGEM.md`):
|
|
46
|
+
|
|
47
|
+
1. **Marca registrada** dos personagens — nome e design-assinatura. É o esteio, porque barra uso que cause
|
|
48
|
+
confusão ou diluição **independentemente de copyright**. Seletiva: nem todo personagem é registrado.
|
|
49
|
+
2. **Licença de arte própria**, não-FOSS, sobre os dados de arte e os algoritmos de composição.
|
|
50
|
+
3. **Autoria humana no algoritmo procedural** — quanto mais o humano cria, seleciona e modifica (em vez de
|
|
51
|
+
apenas pedir a um gerador), mais forte o copyright, e mais exequível a licença (2).
|
|
52
|
+
|
|
53
|
+
⚠️ **E a ressalva que ordena a pilha:** arte derivada de IA **pode ser incopyrightável** — o US Copyright
|
|
54
|
+
Office já o disse —, o que pode tornar a licença (2) **inexequível sozinha**. Por isso a marca é
|
|
55
|
+
indispensável, e não um reforço opcional. Escrito aqui porque é o ponto em que a proteção falha em
|
|
56
|
+
silêncio se ninguém souber.
|
|
57
|
+
|
|
58
|
+
## 3 · Conteúdo de terceiros mantém a licença de quem o fez
|
|
59
|
+
|
|
60
|
+
Nem tudo aqui é nosso, e o que não é **não muda de licença por estar neste repositório**. É o que o pedido
|
|
61
|
+
`g` do requerimento pede que conste dos autos: a relação nominal desses elementos e de suas licenças.
|
|
62
|
+
|
|
63
|
+
- **Código de terceiros** — Clarity (MIT), sherpa-onnx (Apache-2.0), Piper (MIT), eSpeak NG (GPL-3.0).
|
|
64
|
+
Detalhe e atribuição em [`CREDITS.md`](CREDITS.md).
|
|
65
|
+
- **Vozes** — licença por voz, no `MODEL_CARD` de cada pacote. **A confirmar por voz antes de distribuição
|
|
66
|
+
formal** — está assim no `CREDITS.md` e continua verdade.
|
|
67
|
+
- **Pictogramas** — a camada é decidida pela **LICENÇA e por mais nada** (**ADR-0028**): Mulberry,
|
|
68
|
+
Blissymbolics e Tawasol sob CC BY-SA são embutíveis; ARASAAC é **baixado, nunca redistribuído**; Sclera,
|
|
69
|
+
PCS, SymbolStix e Widgit aparecem no menu como **indisponíveis, aguardando negociação**.
|
|
70
|
+
⚠️ E o **SA** alcança o que nós alterarmos: um pictograma reajustado à paleta de alto contraste
|
|
71
|
+
(ADR-0011) ou à grade de pixels continua CC BY-SA.
|
|
72
|
+
- **Tipografias** — roster e restrições no **ADR-0012**. ⚠️ Ronde e as alternativas OPTIFrench-Script e
|
|
73
|
+
Merveille são **gratuitas só para uso pessoal e NÃO podem ser empacotadas**: oferece-se download, e a
|
|
74
|
+
opção fica desabilitada quando nenhuma está presente.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 4 · Inventário da arte — por enquanto, só a do PixelLab
|
|
79
|
+
|
|
80
|
+
O ADR-0066 §3 põe este inventário entre as condições para qualquer repositório virar público, e o §2 desta
|
|
81
|
+
página dizia que ele ainda não existia. Existe agora, **com o alcance que o Dev deu: apenas a arte gerada
|
|
82
|
+
no PixelLab.**
|
|
83
|
+
|
|
84
|
+
### O que foi gerado, e onde está registrado
|
|
85
|
+
|
|
86
|
+
**100 gerações**, de 2026-06-01 em diante, com data, ferramenta, custo estimado e **o prompt de cada uma**:
|
|
87
|
+
[`research/auditoria-creditos-pixellab.csv`](research/auditoria-creditos-pixellab.csv). O prompt está lá de
|
|
88
|
+
propósito — é o que permite a alguém de fora refazer a pergunta *"de onde veio esta imagem?"* sem depender da
|
|
89
|
+
memória de ninguém.
|
|
90
|
+
|
|
91
|
+
### O regime, e a restrição que viaja junto
|
|
92
|
+
|
|
93
|
+
Conforme a pesquisa de licenças (`research/LICENCAS-GERACAO-IMAGEM.md`), o PixelLab.ai é o gerador com os
|
|
94
|
+
termos mais limpos do levantamento: **a titularidade da imagem é de quem gerou**, o uso comercial é
|
|
95
|
+
permitido — *"usar, modificar e distribuir … para qualquer fim"* —, e **não há exigência de atribuição**.
|
|
96
|
+
|
|
97
|
+
⚠️ **E há UMA restrição, que não é nossa e por isso não podemos dispensá-la: as imagens não podem ser usadas
|
|
98
|
+
para TREINAR MODELO.** Isso importa aqui por dois motivos concretos:
|
|
99
|
+
|
|
100
|
+
1. A arte deste projeto **não é FOSS** (§2), então a licença de arte própria é nossa para escrever — e ela
|
|
101
|
+
tem de **carregar esta restrição adiante**, ou concederíamos a terceiros mais do que recebemos.
|
|
102
|
+
2. O alvo declarado é **arte procedural semântica** (`plano-arte-procedural.md`): imagem semântica + paletas.
|
|
103
|
+
Se algum dia essa geração passar por um modelo treinado nos próprios assets, esta linha é a que diz que
|
|
104
|
+
não pode.
|
|
105
|
+
|
|
106
|
+
### O que este inventário NÃO cobre, e por quê
|
|
107
|
+
|
|
108
|
+
**ARTE PRÓPRIA NÃO EXISTE.** Não é que esteja fora do inventário — não há nenhuma para inventariar, e é por
|
|
109
|
+
isso que esta seção cobre só o PixelLab.
|
|
110
|
+
|
|
111
|
+
O Dev passa a produzi-la **depois de o Município aceitar o arranjo inteiro**: o código sob **AGPL-3.0** e a
|
|
112
|
+
arte sob **licença CC adequada**. Enquanto essa aceitação não estiver documentada, não há arte própria e
|
|
113
|
+
não há o que licenciar.
|
|
114
|
+
|
|
115
|
+
⚠️ **E arte não vai para AGPL — vai para CC.** A AGPL é licença de PROGRAMA (Lei 9.609); arte é obra da Lei
|
|
116
|
+
9.610 e o instrumento usual dela é o Creative Commons. Está escrito aqui porque a versão anterior deste
|
|
117
|
+
parágrafo levantava, como se fosse dúvida em aberto, a hipótese de a arte própria virar AGPL. Não era
|
|
118
|
+
dúvida: era erro, sobre uma coisa que ainda não existe.
|
|
119
|
+
|
|
120
|
+
**Qual CC** é escolha para quando houver arte a licenciar, e não antes. O §2 desta página fica de pé como
|
|
121
|
+
está: ele descreve o regime da arte que EXISTE hoje.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## O que este ficheiro NÃO faz
|
|
126
|
+
|
|
127
|
+
- **Não é parecer jurídico.** É a declaração de escopo que um leitor precisa para não assumir que a AGPL da
|
|
128
|
+
raiz alcança tudo. Onde há dúvida de propriedade intelectual, a fonte é a Procuradoria — que o requerimento
|
|
129
|
+
aciona no pedido `c`.
|
|
130
|
+
- **Não substitui o `CREDITS.md`**, que é onde mora a atribuição. Fato duplicado apodrece.
|
|
131
|
+
- **Não lista a arte própria peça a peça** — e agora isso é ALCANCE e não omissão: o §4 inventaria a
|
|
132
|
+
arte do PixelLab e diz, na mesma seção, por que a arte própria ainda não entrou.
|
package/package.json
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@the-inclusionist/engine",
|
|
3
|
+
"version": "6.36.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Accessibility-first (WCAG 2.2 + GAG) engine for educational 2D pixel-art games, built with PixiJS. Screen reader, sonar, high contrast by role, colour-vision filters, remappable input as intent, i18n and offline PWA — the parts every game inherits (ADR-0035, ADR-0036).",
|
|
6
|
+
"comment:exports": [
|
|
7
|
+
"The import surface, and it is a DECISION rather than whatever a relative path can reach (ADR-0036).",
|
|
8
|
+
"`.` is boot/create-game: the composition entry a consumer calls. The layer subpaths are open because",
|
|
9
|
+
"the single `game-api` module that will replace them does not exist yet — it is Task 12 of the demos",
|
|
10
|
+
"Phase 1. What is ALREADY closed is the important half: `app/js/game/**` is unreachable from outside,",
|
|
11
|
+
"so a consumer cannot accidentally depend on The Inclusionist while depending on the engine.",
|
|
12
|
+
"THE DEBT THIS FIELD DECLARED IS PAID (2026-09-05, ADR-0072 §4). It used to point at raw `.ts` and said",
|
|
13
|
+
"`a build step and a types condition are owed at the moment this package is first published`. That is",
|
|
14
|
+
"this moment: the targets are now the `tsc` output in `dist-pkg/` (see tsconfig.pkg.json), each with a",
|
|
15
|
+
"`types` condition beside it.",
|
|
16
|
+
"SUBPATHS CARRY THE `.js` EXTENSION on purpose — `core/i18n.js`, not `core/i18n`. It is the ESM-correct",
|
|
17
|
+
"form and it is the one every module in this repository already writes internally, so a consumer's",
|
|
18
|
+
"import line looks exactly like ours. Extensionless is NOT offered: supporting both needs two patterns",
|
|
19
|
+
"per layer, and two spellings of one import is how two halves of a codebase drift.",
|
|
20
|
+
"`./style.css` and `./assets/*` exist because the borrowed panels REQUIRE them and nothing said so — a",
|
|
21
|
+
"consumer that installed this package got dialogs with no styling and a typography menu offering 18",
|
|
22
|
+
"fonts that 404. Copy `assets/vendor/` into your own `public/` at build time: `fonts.css` addresses the",
|
|
23
|
+
"faces by RELATIVE url, so the folder travels whole or not at all."
|
|
24
|
+
],
|
|
25
|
+
"exports": {
|
|
26
|
+
".": { "types": "./dist-pkg/boot/create-game.d.ts", "default": "./dist-pkg/boot/create-game.js" },
|
|
27
|
+
"./core/*.js": { "types": "./dist-pkg/core/*.d.ts", "default": "./dist-pkg/core/*.js" },
|
|
28
|
+
"./input/*.js": { "types": "./dist-pkg/input/*.d.ts", "default": "./dist-pkg/input/*.js" },
|
|
29
|
+
"./render/*.js": { "types": "./dist-pkg/render/*.d.ts", "default": "./dist-pkg/render/*.js" },
|
|
30
|
+
"./platform/*.js": { "types": "./dist-pkg/platform/*.d.ts", "default": "./dist-pkg/platform/*.js" },
|
|
31
|
+
"./ui/*.js": { "types": "./dist-pkg/ui/*.d.ts", "default": "./dist-pkg/ui/*.js" },
|
|
32
|
+
"./educational/*.js": { "types": "./dist-pkg/educational/*.d.ts", "default": "./dist-pkg/educational/*.js" },
|
|
33
|
+
"./style.css": "./app/css/style.css",
|
|
34
|
+
"./assets/*": "./app/public/*",
|
|
35
|
+
"./package.json": "./package.json"
|
|
36
|
+
},
|
|
37
|
+
"types": "./dist-pkg/boot/create-game.d.ts",
|
|
38
|
+
"comment:build-scripts": [
|
|
39
|
+
"`dist-pkg/` é GERADO e NÃO versionado (como `dist/`), e o `exports` aponta para dentro dele — então num",
|
|
40
|
+
"clone limpo o pacote existe e não resolve nada. Daí DOIS ganchos, que cobrem entradas diferentes:",
|
|
41
|
+
"`prepare` roda no `npm install` da própria pasta e no `npm ci` da CI; `prepack` roda antes de empacotar.",
|
|
42
|
+
"⚠️ E o consumidor que mais depende disto hoje não é o registro: `the-inclusionist/hartwig-zdog-chess`",
|
|
43
|
+
"consome esta engine por `file:../SP-the-inclusionist-tracer`, ou seja, lê ESTA pasta ao vivo."
|
|
44
|
+
],
|
|
45
|
+
"sideEffects": ["*.css"],
|
|
46
|
+
"license": "AGPL-3.0-or-later",
|
|
47
|
+
"comment:ownership": [
|
|
48
|
+
"ADR-0071 §2 said the ownership claim does NOT live in the package NAME, and that nothing would enter",
|
|
49
|
+
"the metadata until something was published. Publication is now being prepared, so the sentence takes",
|
|
50
|
+
"the home that record chose for it: `LICENSE` and `docs/LICENSES.md` ship inside the tarball (see",
|
|
51
|
+
"`files`). Patrimonial owner: the Municipio, under Lei no 9.609/1998 art. 4. Publication is a PEDIDO,",
|
|
52
|
+
"not the developer's decision."
|
|
53
|
+
],
|
|
54
|
+
"repository": { "type": "git", "url": "git+https://github.com/the-inclusionist/the-inclusionist-engine.git" },
|
|
55
|
+
"publishConfig": { "access": "public" },
|
|
56
|
+
"files": [
|
|
57
|
+
"dist-pkg",
|
|
58
|
+
"app/css/style.css",
|
|
59
|
+
"app/public/vendor",
|
|
60
|
+
"LICENSE",
|
|
61
|
+
"README.md",
|
|
62
|
+
"docs/LICENSES.md",
|
|
63
|
+
"docs/CREDITS.md"
|
|
64
|
+
],
|
|
65
|
+
"comment:peerDependencies": [
|
|
66
|
+
"PixiJS is a PEER, not a dependency. Measured on the emitted package (2026-09-05): exactly TWO shipped",
|
|
67
|
+
"modules import it — `render/canvas` and `render/minimap` — plus their two `.d.ts`. A consumer that",
|
|
68
|
+
"bundled a second copy would have two renderers disagreeing about who owns the canvas, and ADR-0035's",
|
|
69
|
+
"`render/port` exists so the rest of the engine never names PixiJS at all. It stays in devDependencies",
|
|
70
|
+
"too, because this repository is also an APP that has to build itself."
|
|
71
|
+
],
|
|
72
|
+
"peerDependencies": {
|
|
73
|
+
"pixi.js": "7.4.2"
|
|
74
|
+
},
|
|
75
|
+
"engines": {
|
|
76
|
+
"node": ">=24"
|
|
77
|
+
},
|
|
78
|
+
"scripts": {
|
|
79
|
+
"dev": "vite",
|
|
80
|
+
"build": "vite build",
|
|
81
|
+
"build:pkg": "tsc -p tsconfig.pkg.json && node scripts/stamp-license.mjs dist-pkg",
|
|
82
|
+
"prepare": "npm run build:pkg",
|
|
83
|
+
"prepack": "npm run build:pkg",
|
|
84
|
+
"preview": "vite preview",
|
|
85
|
+
"typecheck": "tsc --noEmit",
|
|
86
|
+
"validate": "npm run typecheck && vitest run && npm run build:pkg && vite build",
|
|
87
|
+
"test": "vitest run",
|
|
88
|
+
"test:watch": "vitest",
|
|
89
|
+
"test:node": "vitest run --project node",
|
|
90
|
+
"test:browser": "vitest run --project browser",
|
|
91
|
+
"check:precache": "node scripts/check-precache.mjs",
|
|
92
|
+
"test:a11y": "node scripts/axe-check.mjs",
|
|
93
|
+
"release": "release-it"
|
|
94
|
+
},
|
|
95
|
+
"devDependencies": {
|
|
96
|
+
"@axe-core/playwright": "^4.10.0",
|
|
97
|
+
"@mintplex-labs/piper-tts-web": "^1.0.4",
|
|
98
|
+
"@release-it/conventional-changelog": "^11.0.1",
|
|
99
|
+
"@types/node": "^22.0.0",
|
|
100
|
+
"@vitest/browser": "^4.0.0",
|
|
101
|
+
"@vitest/browser-playwright": "^4.0.0",
|
|
102
|
+
"pixi.js": "7.4.2",
|
|
103
|
+
"playwright": "^1.49.0",
|
|
104
|
+
"release-it": "^20.2.1",
|
|
105
|
+
"typescript": "^5.7.0",
|
|
106
|
+
"vite": "^8.0.0",
|
|
107
|
+
"vite-plugin-pwa": "^1.3.0",
|
|
108
|
+
"vitest": "^4.0.0"
|
|
109
|
+
},
|
|
110
|
+
"overrides": {
|
|
111
|
+
"vite-plugin-pwa": {
|
|
112
|
+
"vite": "$vite"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|