3 Commits

Author SHA1 Message Date
Jimi hackathon
83a0c96d95 removendo lib nao usada 2026-06-27 19:00:20 -03:00
Jimi hackathon
7895f41602 imlementacao traducao 2026-06-27 18:59:15 -03:00
Jimi hackathon
04dd5b2173 Add react-intl infrastructure 2026-06-27 17:44:37 -03:00
21 changed files with 177 additions and 943 deletions

8
app/lang/ht.json Normal file
View File

@@ -0,0 +1,8 @@
{
"atividades":
{
"aspirador": {
"nome": "Faz 1: Liy Dwat la"
}
}
}

8
app/lang/pt.json Normal file
View File

@@ -0,0 +1,8 @@
{
"atividades":
{
"aspirador": {
"nome": "Fase 1: A Linha Reta"
}
}
}

View File

@@ -80,7 +80,6 @@
"phaser": "^3.90.0", "phaser": "^3.90.0",
"phaser3-rex-plugins": "^1.80.16", "phaser3-rex-plugins": "^1.80.16",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react": "^19.2.0",
"react-confetti": "^6.4.0", "react-confetti": "^6.4.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"react-resizable-panels": "^3.0.6", "react-resizable-panels": "^3.0.6",

285
app/pnpm-lock.yaml generated
View File

@@ -40,7 +40,7 @@ importers:
version: 3.9.1 version: 3.9.1
'@uiw/react-codemirror': '@uiw/react-codemirror':
specifier: 4.25.9 specifier: 4.25.9
version: 4.25.9(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.0)(codemirror@6.0.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) version: 4.25.9(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.0)(codemirror@6.0.2)(react-dom@19.2.0)
acorn: acorn:
specifier: ^8.15.0 specifier: ^8.15.0
version: 8.15.0 version: 8.15.0
@@ -58,7 +58,7 @@ importers:
version: 0.546.0 version: 0.546.0
lucide-react: lucide-react:
specifier: ^0.546.0 specifier: ^0.546.0
version: 0.546.0(react@19.2.0) version: 0.546.0
phaser: phaser:
specifier: ^3.90.0 specifier: ^3.90.0
version: 3.90.0 version: 3.90.0
@@ -68,24 +68,21 @@ importers:
prop-types: prop-types:
specifier: ^15.8.1 specifier: ^15.8.1
version: 15.8.1 version: 15.8.1
react:
specifier: ^19.2.0
version: 19.2.0
react-confetti: react-confetti:
specifier: ^6.4.0 specifier: ^6.4.0
version: 6.4.0(react@19.2.0) version: 6.4.0
react-dom: react-dom:
specifier: ^19.2.0 specifier: ^19.2.0
version: 19.2.0(react@19.2.0) version: 19.2.0
react-resizable-panels: react-resizable-panels:
specifier: ^3.0.6 specifier: ^3.0.6
version: 3.0.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) version: 3.0.6(react-dom@19.2.0)
react-router-dom: react-router-dom:
specifier: ^7.9.4 specifier: ^7.9.4
version: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) version: 7.9.4(react-dom@19.2.0)
react-shepherd: react-shepherd:
specifier: ^6.1.9 specifier: ^6.1.9
version: 6.1.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) version: 6.1.9(react-dom@19.2.0)(typescript@5.9.3)
sentiment: sentiment:
specifier: ^5.0.2 specifier: ^5.0.2
version: 5.0.2 version: 5.0.2
@@ -107,7 +104,7 @@ importers:
version: 6.9.1 version: 6.9.1
'@testing-library/react': '@testing-library/react':
specifier: ^16.3.1 specifier: ^16.3.1
version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0)
'@testing-library/user-event': '@testing-library/user-event':
specifier: ^14.6.1 specifier: ^14.6.1
version: 14.6.1(@testing-library/dom@10.4.1) version: 14.6.1(@testing-library/dom@10.4.1)
@@ -229,18 +226,10 @@ packages:
'@asamuzakjp/nwsapi@2.3.9': '@asamuzakjp/nwsapi@2.3.9':
resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==}
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
'@babel/code-frame@7.29.0': '@babel/code-frame@7.29.0':
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/compat-data@7.28.4':
resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==}
engines: {node: '>=6.9.0'}
'@babel/compat-data@7.29.3': '@babel/compat-data@7.29.3':
resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -249,10 +238,6 @@ packages:
resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/generator@7.28.3':
resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
engines: {node: '>=6.9.0'}
'@babel/generator@7.29.1': '@babel/generator@7.29.1':
resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -261,10 +246,6 @@ packages:
resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/helper-compilation-targets@7.27.2':
resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-compilation-targets@7.28.6': '@babel/helper-compilation-targets@7.28.6':
resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -294,20 +275,10 @@ packages:
resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/helper-module-imports@7.27.1':
resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
engines: {node: '>=6.9.0'}
'@babel/helper-module-imports@7.28.6': '@babel/helper-module-imports@7.28.6':
resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/helper-module-transforms@7.28.3':
resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-module-transforms@7.28.6': '@babel/helper-module-transforms@7.28.6':
resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -769,18 +740,10 @@ packages:
resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/template@7.27.2':
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
engines: {node: '>=6.9.0'}
'@babel/template@7.28.6': '@babel/template@7.28.6':
resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/traverse@7.28.4':
resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==}
engines: {node: '>=6.9.0'}
'@babel/traverse@7.29.0': '@babel/traverse@7.29.0':
resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -1177,78 +1140,92 @@ packages:
resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-libvips-linux-arm@1.2.3': '@img/sharp-libvips-linux-arm@1.2.3':
resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-libvips-linux-ppc64@1.2.3': '@img/sharp-libvips-linux-ppc64@1.2.3':
resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-libvips-linux-s390x@1.2.3': '@img/sharp-libvips-linux-s390x@1.2.3':
resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-libvips-linux-x64@1.2.3': '@img/sharp-libvips-linux-x64@1.2.3':
resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-libvips-linuxmusl-arm64@1.2.3': '@img/sharp-libvips-linuxmusl-arm64@1.2.3':
resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@img/sharp-libvips-linuxmusl-x64@1.2.3': '@img/sharp-libvips-linuxmusl-x64@1.2.3':
resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@img/sharp-linux-arm64@0.34.4': '@img/sharp-linux-arm64@0.34.4':
resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-linux-arm@0.34.4': '@img/sharp-linux-arm@0.34.4':
resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-linux-ppc64@0.34.4': '@img/sharp-linux-ppc64@0.34.4':
resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-linux-s390x@0.34.4': '@img/sharp-linux-s390x@0.34.4':
resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-linux-x64@0.34.4': '@img/sharp-linux-x64@0.34.4':
resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@img/sharp-linuxmusl-arm64@0.34.4': '@img/sharp-linuxmusl-arm64@0.34.4':
resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@img/sharp-linuxmusl-x64@0.34.4': '@img/sharp-linuxmusl-x64@0.34.4':
resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@img/sharp-wasm32@0.34.4': '@img/sharp-wasm32@0.34.4':
resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==}
@@ -1462,121 +1439,145 @@ packages:
resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-gnueabihf@4.60.3': '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.52.5': '@rollup/rollup-linux-arm-musleabihf@4.52.5':
resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm-musleabihf@4.60.3': '@rollup/rollup-linux-arm-musleabihf@4.60.3':
resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.52.5': '@rollup/rollup-linux-arm64-gnu@4.52.5':
resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-gnu@4.60.3': '@rollup/rollup-linux-arm64-gnu@4.60.3':
resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.52.5': '@rollup/rollup-linux-arm64-musl@4.52.5':
resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-musl@4.60.3': '@rollup/rollup-linux-arm64-musl@4.60.3':
resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.52.5': '@rollup/rollup-linux-loong64-gnu@4.52.5':
resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-loong64-gnu@4.60.3': '@rollup/rollup-linux-loong64-gnu@4.60.3':
resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-loong64-musl@4.60.3': '@rollup/rollup-linux-loong64-musl@4.60.3':
resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-ppc64-gnu@4.52.5': '@rollup/rollup-linux-ppc64-gnu@4.52.5':
resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-ppc64-gnu@4.60.3': '@rollup/rollup-linux-ppc64-gnu@4.60.3':
resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-ppc64-musl@4.60.3': '@rollup/rollup-linux-ppc64-musl@4.60.3':
resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-riscv64-gnu@4.52.5': '@rollup/rollup-linux-riscv64-gnu@4.52.5':
resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.60.3': '@rollup/rollup-linux-riscv64-gnu@4.60.3':
resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.52.5': '@rollup/rollup-linux-riscv64-musl@4.52.5':
resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-riscv64-musl@4.60.3': '@rollup/rollup-linux-riscv64-musl@4.60.3':
resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.52.5': '@rollup/rollup-linux-s390x-gnu@4.52.5':
resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-s390x-gnu@4.60.3': '@rollup/rollup-linux-s390x-gnu@4.60.3':
resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.52.5': '@rollup/rollup-linux-x64-gnu@4.52.5':
resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.60.3': '@rollup/rollup-linux-x64-gnu@4.60.3':
resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.52.5': '@rollup/rollup-linux-x64-musl@4.52.5':
resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-x64-musl@4.60.3': '@rollup/rollup-linux-x64-musl@4.60.3':
resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-openbsd-x64@4.60.3': '@rollup/rollup-openbsd-x64@4.60.3':
resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==}
@@ -1687,15 +1688,19 @@ packages:
'@tsparticles/basic@3.9.1': '@tsparticles/basic@3.9.1':
resolution: {integrity: sha512-ijr2dHMx0IQHqhKW3qA8tfwrR2XYbbWYdaJMQuBo2CkwBVIhZ76U+H20Y492j/NXpd1FUnt2aC0l4CEVGVGdeQ==} resolution: {integrity: sha512-ijr2dHMx0IQHqhKW3qA8tfwrR2XYbbWYdaJMQuBo2CkwBVIhZ76U+H20Y492j/NXpd1FUnt2aC0l4CEVGVGdeQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/confetti@3.9.1': '@tsparticles/confetti@3.9.1':
resolution: {integrity: sha512-S0Q6iBqQvcCaOzmnddmh41RHeLwzSdkLq8hU3Ryokmb9eqoS9MQdYz2tjUHHdTap+YLPlp64SZ15sC4C9ulFbA==} resolution: {integrity: sha512-S0Q6iBqQvcCaOzmnddmh41RHeLwzSdkLq8hU3Ryokmb9eqoS9MQdYz2tjUHHdTap+YLPlp64SZ15sC4C9ulFbA==}
deprecated: Please update to version 4.1.1
'@tsparticles/engine@3.9.1': '@tsparticles/engine@3.9.1':
resolution: {integrity: sha512-DpdgAhWMZ3Eh2gyxik8FXS6BKZ8vyea+Eu5BC4epsahqTGY9V3JGGJcXC6lRJx6cPMAx1A0FaQAojPF3v6rkmQ==} resolution: {integrity: sha512-DpdgAhWMZ3Eh2gyxik8FXS6BKZ8vyea+Eu5BC4epsahqTGY9V3JGGJcXC6lRJx6cPMAx1A0FaQAojPF3v6rkmQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/move-base@3.9.1': '@tsparticles/move-base@3.9.1':
resolution: {integrity: sha512-X4huBS27d8srpxwOxliWPUt+NtCwY+8q/cx1DvQxyqmTA8VFCGpcHNwtqiN+9JicgzOvSuaORVqUgwlsc7h4pQ==} resolution: {integrity: sha512-X4huBS27d8srpxwOxliWPUt+NtCwY+8q/cx1DvQxyqmTA8VFCGpcHNwtqiN+9JicgzOvSuaORVqUgwlsc7h4pQ==}
deprecated: this package was deprecated in tsparticles v4, replaced by @tsparticles/plugin-move
'@tsparticles/plugin-emitters@3.9.1': '@tsparticles/plugin-emitters@3.9.1':
resolution: {integrity: sha512-h7opR8SoFWBmVHceDLJUerLENaPfkJSh2zQYvzmLj2L+V3VLS1QDgty+4QZVeZfqNROmgQw2eLFA5El1E0sqqw==} resolution: {integrity: sha512-h7opR8SoFWBmVHceDLJUerLENaPfkJSh2zQYvzmLj2L+V3VLS1QDgty+4QZVeZfqNROmgQw2eLFA5El1E0sqqw==}
@@ -1705,63 +1710,83 @@ packages:
'@tsparticles/plugin-hsl-color@3.9.1': '@tsparticles/plugin-hsl-color@3.9.1':
resolution: {integrity: sha512-jJd1iGgRwX6eeNjc1zUXiJivaqC5UE+SC2A3/NtHwwoQrkfxGWmRHOsVyLnOBRcCPgBp/FpdDe6DIDjCMO715w==} resolution: {integrity: sha512-jJd1iGgRwX6eeNjc1zUXiJivaqC5UE+SC2A3/NtHwwoQrkfxGWmRHOsVyLnOBRcCPgBp/FpdDe6DIDjCMO715w==}
deprecated: Please update to version 4.1.1
'@tsparticles/plugin-motion@3.9.1': '@tsparticles/plugin-motion@3.9.1':
resolution: {integrity: sha512-I/356NHCiMUgFzWjAHYKO7YvBqKtHSktIPgTRruqlruyrAcwzjkT55ZQ1K5EcJLWETkF1bfG2VpJBRu8ksf9mw==} resolution: {integrity: sha512-I/356NHCiMUgFzWjAHYKO7YvBqKtHSktIPgTRruqlruyrAcwzjkT55ZQ1K5EcJLWETkF1bfG2VpJBRu8ksf9mw==}
deprecated: Please update to version 4.1.1
'@tsparticles/plugin-rgb-color@3.9.1': '@tsparticles/plugin-rgb-color@3.9.1':
resolution: {integrity: sha512-SBxk7f1KBfXeTnnklbE2Hx4jBgh6I6HOtxb+Os1gTp0oaghZOkWcCD2dP4QbUu7fVNCMOcApPoMNC8RTFcy9wQ==} resolution: {integrity: sha512-SBxk7f1KBfXeTnnklbE2Hx4jBgh6I6HOtxb+Os1gTp0oaghZOkWcCD2dP4QbUu7fVNCMOcApPoMNC8RTFcy9wQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-cards@3.9.1': '@tsparticles/shape-cards@3.9.1':
resolution: {integrity: sha512-/tQtGh6xC3UmKU2WO7VM5RoAnsvFvPkXcCJJHAQ6AIyWUKVWBrVuewF0ZbJQlNhWCEW/aqE199LuDAewqYAQ5A==} resolution: {integrity: sha512-/tQtGh6xC3UmKU2WO7VM5RoAnsvFvPkXcCJJHAQ6AIyWUKVWBrVuewF0ZbJQlNhWCEW/aqE199LuDAewqYAQ5A==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-circle@3.9.1': '@tsparticles/shape-circle@3.9.1':
resolution: {integrity: sha512-DqZFLjbuhVn99WJ+A9ajz9YON72RtCcvubzq6qfjFmtwAK7frvQeb6iDTp6Ze9FUipluxVZWVRG4vWTxi2B+/g==} resolution: {integrity: sha512-DqZFLjbuhVn99WJ+A9ajz9YON72RtCcvubzq6qfjFmtwAK7frvQeb6iDTp6Ze9FUipluxVZWVRG4vWTxi2B+/g==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-emoji@3.9.1': '@tsparticles/shape-emoji@3.9.1':
resolution: {integrity: sha512-ifvY63usuT+hipgVHb8gelBHSeF6ryPnMxAAEC1RGHhhXfpSRWMtE6ybr+pSsYU52M3G9+TF84v91pSwNrb9ZQ==} resolution: {integrity: sha512-ifvY63usuT+hipgVHb8gelBHSeF6ryPnMxAAEC1RGHhhXfpSRWMtE6ybr+pSsYU52M3G9+TF84v91pSwNrb9ZQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-heart@3.9.1': '@tsparticles/shape-heart@3.9.1':
resolution: {integrity: sha512-h1aYiBVCUAJ14zyK792EuX0332Hus6OgYy/4dk6PhfgdFTQaHk+FzGJjw+jEB8vpxOYtWeysT9uoofPZeDrqBQ==} resolution: {integrity: sha512-h1aYiBVCUAJ14zyK792EuX0332Hus6OgYy/4dk6PhfgdFTQaHk+FzGJjw+jEB8vpxOYtWeysT9uoofPZeDrqBQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-image@3.9.1': '@tsparticles/shape-image@3.9.1':
resolution: {integrity: sha512-fCA5eme8VF3oX8yNVUA0l2SLDKuiZObkijb0z3Ky0qj1HUEVlAuEMhhNDNB9E2iELTrWEix9z7BFMePp2CC7AA==} resolution: {integrity: sha512-fCA5eme8VF3oX8yNVUA0l2SLDKuiZObkijb0z3Ky0qj1HUEVlAuEMhhNDNB9E2iELTrWEix9z7BFMePp2CC7AA==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-polygon@3.9.1': '@tsparticles/shape-polygon@3.9.1':
resolution: {integrity: sha512-dA77PgZdoLwxnliH6XQM/zF0r4jhT01pw5y7XTeTqws++hg4rTLV9255k6R6eUqKq0FPSW1/WBsBIl7q/MmrqQ==} resolution: {integrity: sha512-dA77PgZdoLwxnliH6XQM/zF0r4jhT01pw5y7XTeTqws++hg4rTLV9255k6R6eUqKq0FPSW1/WBsBIl7q/MmrqQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-square@3.9.1': '@tsparticles/shape-square@3.9.1':
resolution: {integrity: sha512-DKGkDnRyZrAm7T2ipqNezJahSWs6xd9O5LQLe5vjrYm1qGwrFxJiQaAdlb00UNrexz1/SA7bEoIg4XKaFa7qhQ==} resolution: {integrity: sha512-DKGkDnRyZrAm7T2ipqNezJahSWs6xd9O5LQLe5vjrYm1qGwrFxJiQaAdlb00UNrexz1/SA7bEoIg4XKaFa7qhQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/shape-star@3.9.1': '@tsparticles/shape-star@3.9.1':
resolution: {integrity: sha512-kdMJpi8cdeb6vGrZVSxTG0JIjCwIenggqk0EYeKAwtOGZFBgL7eHhF2F6uu1oq8cJAbXPujEoabnLsz6mW8XaA==} resolution: {integrity: sha512-kdMJpi8cdeb6vGrZVSxTG0JIjCwIenggqk0EYeKAwtOGZFBgL7eHhF2F6uu1oq8cJAbXPujEoabnLsz6mW8XaA==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-color@3.9.1': '@tsparticles/updater-color@3.9.1':
resolution: {integrity: sha512-XGWdscrgEMA8L5E7exsE0f8/2zHKIqnTrZymcyuFBw2DCB6BIV+5z6qaNStpxrhq3DbIxxhqqcybqeOo7+Alpg==} resolution: {integrity: sha512-XGWdscrgEMA8L5E7exsE0f8/2zHKIqnTrZymcyuFBw2DCB6BIV+5z6qaNStpxrhq3DbIxxhqqcybqeOo7+Alpg==}
deprecated: this package was deprecated in tsparticles v4, replaced by @tsparticles/updater-paint
'@tsparticles/updater-life@3.9.1': '@tsparticles/updater-life@3.9.1':
resolution: {integrity: sha512-Oi8aF2RIwMMsjssUkCB6t3PRpENHjdZf6cX92WNfAuqXtQphr3OMAkYFJFWkvyPFK22AVy3p/cFt6KE5zXxwAA==} resolution: {integrity: sha512-Oi8aF2RIwMMsjssUkCB6t3PRpENHjdZf6cX92WNfAuqXtQphr3OMAkYFJFWkvyPFK22AVy3p/cFt6KE5zXxwAA==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-opacity@3.9.1': '@tsparticles/updater-opacity@3.9.1':
resolution: {integrity: sha512-w778LQuRZJ+IoWzeRdrGykPYSSaTeWfBvLZ2XwYEkh/Ss961InOxZKIpcS6i5Kp/Zfw0fS1ZAuqeHwuj///Osw==} resolution: {integrity: sha512-w778LQuRZJ+IoWzeRdrGykPYSSaTeWfBvLZ2XwYEkh/Ss961InOxZKIpcS6i5Kp/Zfw0fS1ZAuqeHwuj///Osw==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-out-modes@3.9.1': '@tsparticles/updater-out-modes@3.9.1':
resolution: {integrity: sha512-cKQEkAwbru+hhKF+GTsfbOvuBbx2DSB25CxOdhtW2wRvDBoCnngNdLw91rs+0Cex4tgEeibkebrIKFDDE6kELg==} resolution: {integrity: sha512-cKQEkAwbru+hhKF+GTsfbOvuBbx2DSB25CxOdhtW2wRvDBoCnngNdLw91rs+0Cex4tgEeibkebrIKFDDE6kELg==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-roll@3.9.1': '@tsparticles/updater-roll@3.9.1':
resolution: {integrity: sha512-zl4JeM3gUBJ0uttmIsond3lrZ3f3AkItFeS0Lhj/7jiCKfUoRyyOMrcBk8R1AhW7lI+7ko1iBs3jhO0jnxz9vg==} resolution: {integrity: sha512-zl4JeM3gUBJ0uttmIsond3lrZ3f3AkItFeS0Lhj/7jiCKfUoRyyOMrcBk8R1AhW7lI+7ko1iBs3jhO0jnxz9vg==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-rotate@3.9.1': '@tsparticles/updater-rotate@3.9.1':
resolution: {integrity: sha512-9BfKaGfp28JN82MF2qs6Ae/lJr9EColMfMTHqSKljblwbpVDHte4umuwKl3VjbRt87WD9MGtla66NTUYl+WxuQ==} resolution: {integrity: sha512-9BfKaGfp28JN82MF2qs6Ae/lJr9EColMfMTHqSKljblwbpVDHte4umuwKl3VjbRt87WD9MGtla66NTUYl+WxuQ==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-size@3.9.1': '@tsparticles/updater-size@3.9.1':
resolution: {integrity: sha512-3NSVs0O2ApNKZXfd+y/zNhTXSFeG1Pw4peI8e6z/q5+XLbmue9oiEwoPy/tQLaark3oNj3JU7Q903ZijPyXSzw==} resolution: {integrity: sha512-3NSVs0O2ApNKZXfd+y/zNhTXSFeG1Pw4peI8e6z/q5+XLbmue9oiEwoPy/tQLaark3oNj3JU7Q903ZijPyXSzw==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-tilt@3.9.1': '@tsparticles/updater-tilt@3.9.1':
resolution: {integrity: sha512-PB2yaoyXRmSk4iIVgjtRrzOxXMK9mjeAQHIJGtT4faq46Z8cbIIEFgjTwqrUV8qOrNg/h4sm5NE/s0qsTYjp1Q==} resolution: {integrity: sha512-PB2yaoyXRmSk4iIVgjtRrzOxXMK9mjeAQHIJGtT4faq46Z8cbIIEFgjTwqrUV8qOrNg/h4sm5NE/s0qsTYjp1Q==}
deprecated: Please update to version 4.1.1
'@tsparticles/updater-wobble@3.9.1': '@tsparticles/updater-wobble@3.9.1':
resolution: {integrity: sha512-c99Ogy9q4QWO+zsDXol0UnpUwZiY2UucFb8ltuDv9AlbGUeprygoub8jhgT5pEDv+GdzWOJGSgq7rfgv9cHBrg==} resolution: {integrity: sha512-c99Ogy9q4QWO+zsDXol0UnpUwZiY2UucFb8ltuDv9AlbGUeprygoub8jhgT5pEDv+GdzWOJGSgq7rfgv9cHBrg==}
deprecated: Please update to version 4.1.1
'@types/aria-query@5.0.4': '@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
@@ -2894,6 +2919,7 @@ packages:
glob@10.4.5: glob@10.4.5:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true hasBin: true
glob@11.1.0: glob@11.1.0:
@@ -2904,7 +2930,7 @@ packages:
glob@7.2.3: glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
global-agent@3.0.0: global-agent@3.0.0:
resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==}
@@ -3365,24 +3391,28 @@ packages:
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.30.1: lightningcss-linux-arm64-musl@1.30.1:
resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.30.1: lightningcss-linux-x64-gnu@1.30.1:
resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.30.1: lightningcss-linux-x64-musl@1.30.1:
resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.30.1: lightningcss-win32-arm64-msvc@1.30.1:
resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
@@ -3962,10 +3992,6 @@ packages:
react-dom: ^18.2.0 react-dom: ^18.2.0
typescript: ^5.0.0 typescript: ^5.0.0
react@19.2.0:
resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==}
engines: {node: '>=0.10.0'}
read-binary-file-arch@1.0.6: read-binary-file-arch@1.0.6:
resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==}
hasBin: true hasBin: true
@@ -4736,6 +4762,7 @@ packages:
whatwg-encoding@3.1.1: whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
whatwg-mimetype@4.0.0: whatwg-mimetype@4.0.0:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
@@ -4967,33 +4994,25 @@ snapshots:
'@asamuzakjp/nwsapi@2.3.9': {} '@asamuzakjp/nwsapi@2.3.9': {}
'@babel/code-frame@7.27.1':
dependencies:
'@babel/helper-validator-identifier': 7.27.1
js-tokens: 4.0.0
picocolors: 1.1.1
'@babel/code-frame@7.29.0': '@babel/code-frame@7.29.0':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.28.5 '@babel/helper-validator-identifier': 7.28.5
js-tokens: 4.0.0 js-tokens: 4.0.0
picocolors: 1.1.1 picocolors: 1.1.1
'@babel/compat-data@7.28.4': {}
'@babel/compat-data@7.29.3': {} '@babel/compat-data@7.29.3': {}
'@babel/core@7.28.4': '@babel/core@7.28.4':
dependencies: dependencies:
'@babel/code-frame': 7.27.1 '@babel/code-frame': 7.29.0
'@babel/generator': 7.28.3 '@babel/generator': 7.29.1
'@babel/helper-compilation-targets': 7.27.2 '@babel/helper-compilation-targets': 7.28.6
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.4)
'@babel/helpers': 7.28.4 '@babel/helpers': 7.28.4
'@babel/parser': 7.28.4 '@babel/parser': 7.29.0
'@babel/template': 7.27.2 '@babel/template': 7.28.6
'@babel/traverse': 7.28.4 '@babel/traverse': 7.29.0
'@babel/types': 7.28.4 '@babel/types': 7.29.0
'@jridgewell/remapping': 2.3.5 '@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0 convert-source-map: 2.0.0
debug: 4.4.3 debug: 4.4.3
@@ -5003,14 +5022,6 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/generator@7.28.3':
dependencies:
'@babel/parser': 7.28.4
'@babel/types': 7.28.4
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0
'@babel/generator@7.29.1': '@babel/generator@7.29.1':
dependencies: dependencies:
'@babel/parser': 7.29.0 '@babel/parser': 7.29.0
@@ -5023,19 +5034,11 @@ snapshots:
dependencies: dependencies:
'@babel/types': 7.29.0 '@babel/types': 7.29.0
'@babel/helper-compilation-targets@7.27.2':
dependencies:
'@babel/compat-data': 7.28.4
'@babel/helper-validator-option': 7.27.1
browserslist: 4.26.3
lru-cache: 5.1.1
semver: 6.3.1
'@babel/helper-compilation-targets@7.28.6': '@babel/helper-compilation-targets@7.28.6':
dependencies: dependencies:
'@babel/compat-data': 7.29.3 '@babel/compat-data': 7.29.3
'@babel/helper-validator-option': 7.27.1 '@babel/helper-validator-option': 7.27.1
browserslist: 4.26.3 browserslist: 4.28.2
lru-cache: 5.1.1 lru-cache: 5.1.1
semver: 6.3.1 semver: 6.3.1
@@ -5079,13 +5082,6 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/helper-module-imports@7.27.1':
dependencies:
'@babel/traverse': 7.28.4
'@babel/types': 7.28.4
transitivePeerDependencies:
- supports-color
'@babel/helper-module-imports@7.28.6': '@babel/helper-module-imports@7.28.6':
dependencies: dependencies:
'@babel/traverse': 7.29.0 '@babel/traverse': 7.29.0
@@ -5093,15 +5089,6 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)':
dependencies:
'@babel/core': 7.28.4
'@babel/helper-module-imports': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
'@babel/traverse': 7.28.4
transitivePeerDependencies:
- supports-color
'@babel/helper-module-transforms@7.28.6(@babel/core@7.28.4)': '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.4)':
dependencies: dependencies:
'@babel/core': 7.28.4 '@babel/core': 7.28.4
@@ -5124,7 +5111,7 @@ snapshots:
'@babel/core': 7.28.4 '@babel/core': 7.28.4
'@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-annotate-as-pure': 7.27.3
'@babel/helper-wrap-function': 7.28.6 '@babel/helper-wrap-function': 7.28.6
'@babel/traverse': 7.28.4 '@babel/traverse': 7.29.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -5139,7 +5126,7 @@ snapshots:
'@babel/helper-skip-transparent-expression-wrappers@7.27.1': '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
dependencies: dependencies:
'@babel/traverse': 7.28.4 '@babel/traverse': 7.29.0
'@babel/types': 7.29.0 '@babel/types': 7.29.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -5162,8 +5149,8 @@ snapshots:
'@babel/helpers@7.28.4': '@babel/helpers@7.28.4':
dependencies: dependencies:
'@babel/template': 7.27.2 '@babel/template': 7.28.6
'@babel/types': 7.28.4 '@babel/types': 7.29.0
'@babel/parser@7.28.4': '@babel/parser@7.28.4':
dependencies: dependencies:
@@ -5364,7 +5351,7 @@ snapshots:
'@babel/core': 7.28.4 '@babel/core': 7.28.4
'@babel/helper-compilation-targets': 7.28.6 '@babel/helper-compilation-targets': 7.28.6
'@babel/helper-plugin-utils': 7.28.6 '@babel/helper-plugin-utils': 7.28.6
'@babel/traverse': 7.28.4 '@babel/traverse': 7.29.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -5391,7 +5378,7 @@ snapshots:
'@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)': '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)':
dependencies: dependencies:
'@babel/core': 7.28.4 '@babel/core': 7.28.4
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.4)
'@babel/helper-plugin-utils': 7.28.6 '@babel/helper-plugin-utils': 7.28.6
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -5417,7 +5404,7 @@ snapshots:
'@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)': '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)':
dependencies: dependencies:
'@babel/core': 7.28.4 '@babel/core': 7.28.4
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.4)
'@babel/helper-plugin-utils': 7.28.6 '@babel/helper-plugin-utils': 7.28.6
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -5665,30 +5652,12 @@ snapshots:
'@babel/runtime@7.28.4': {} '@babel/runtime@7.28.4': {}
'@babel/template@7.27.2':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/parser': 7.28.4
'@babel/types': 7.28.4
'@babel/template@7.28.6': '@babel/template@7.28.6':
dependencies: dependencies:
'@babel/code-frame': 7.29.0 '@babel/code-frame': 7.29.0
'@babel/parser': 7.29.0 '@babel/parser': 7.29.0
'@babel/types': 7.29.0 '@babel/types': 7.29.0
'@babel/traverse@7.28.4':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/generator': 7.28.3
'@babel/helper-globals': 7.28.0
'@babel/parser': 7.28.4
'@babel/template': 7.27.2
'@babel/types': 7.28.4
debug: 4.4.3
transitivePeerDependencies:
- supports-color
'@babel/traverse@7.29.0': '@babel/traverse@7.29.0':
dependencies: dependencies:
'@babel/code-frame': 7.29.0 '@babel/code-frame': 7.29.0
@@ -5865,7 +5834,7 @@ snapshots:
fs-extra: 10.1.0 fs-extra: 10.1.0
isbinaryfile: 4.0.10 isbinaryfile: 4.0.10
minimist: 1.2.8 minimist: 1.2.8
plist: 3.1.0 plist: 3.1.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -5888,7 +5857,7 @@ snapshots:
dir-compare: 4.2.0 dir-compare: 4.2.0
fs-extra: 11.3.4 fs-extra: 11.3.4
minimatch: 9.0.5 minimatch: 9.0.5
plist: 3.1.0 plist: 3.1.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -6238,7 +6207,7 @@ snapshots:
'@rollup/plugin-babel@6.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.60.3)': '@rollup/plugin-babel@6.1.0(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@4.60.3)':
dependencies: dependencies:
'@babel/core': 7.28.4 '@babel/core': 7.28.4
'@babel/helper-module-imports': 7.27.1 '@babel/helper-module-imports': 7.28.6
'@rollup/pluginutils': 5.3.0(rollup@4.60.3) '@rollup/pluginutils': 5.3.0(rollup@4.60.3)
optionalDependencies: optionalDependencies:
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
@@ -6252,7 +6221,7 @@ snapshots:
'@types/resolve': 1.20.2 '@types/resolve': 1.20.2
deepmerge: 4.3.1 deepmerge: 4.3.1
is-module: 1.0.0 is-module: 1.0.0
resolve: 1.22.10 resolve: 1.22.12
optionalDependencies: optionalDependencies:
rollup: 4.60.3 rollup: 4.60.3
@@ -6455,12 +6424,11 @@ snapshots:
picocolors: 1.1.1 picocolors: 1.1.1
redent: 3.0.0 redent: 3.0.0
'@testing-library/react@16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': '@testing-library/react@16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@testing-library/dom': 10.4.1 '@testing-library/dom': 10.4.1
react: 19.2.0 react-dom: 19.2.0
react-dom: 19.2.0(react@19.2.0)
optionalDependencies: optionalDependencies:
'@types/react': 19.2.2 '@types/react': 19.2.2
'@types/react-dom': 19.2.2(@types/react@19.2.2) '@types/react-dom': 19.2.2(@types/react@19.2.2)
@@ -6606,24 +6574,24 @@ snapshots:
'@types/babel__core@7.20.5': '@types/babel__core@7.20.5':
dependencies: dependencies:
'@babel/parser': 7.28.4 '@babel/parser': 7.29.0
'@babel/types': 7.28.4 '@babel/types': 7.29.0
'@types/babel__generator': 7.27.0 '@types/babel__generator': 7.27.0
'@types/babel__template': 7.4.4 '@types/babel__template': 7.4.4
'@types/babel__traverse': 7.28.0 '@types/babel__traverse': 7.28.0
'@types/babel__generator@7.27.0': '@types/babel__generator@7.27.0':
dependencies: dependencies:
'@babel/types': 7.28.4 '@babel/types': 7.29.0
'@types/babel__template@7.4.4': '@types/babel__template@7.4.4':
dependencies: dependencies:
'@babel/parser': 7.28.4 '@babel/parser': 7.29.0
'@babel/types': 7.28.4 '@babel/types': 7.29.0
'@types/babel__traverse@7.28.0': '@types/babel__traverse@7.28.0':
dependencies: dependencies:
'@babel/types': 7.28.4 '@babel/types': 7.29.0
'@types/cacheable-request@6.0.3': '@types/cacheable-request@6.0.3':
dependencies: dependencies:
@@ -6703,7 +6671,7 @@ snapshots:
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.0
'@uiw/react-codemirror@4.25.9(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.0)(codemirror@6.0.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': '@uiw/react-codemirror@4.25.9(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.0)(codemirror@6.0.2)(react-dom@19.2.0)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@codemirror/commands': 6.10.3 '@codemirror/commands': 6.10.3
@@ -6712,8 +6680,7 @@ snapshots:
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.0
'@uiw/codemirror-extensions-basic-setup': 4.25.9(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0) '@uiw/codemirror-extensions-basic-setup': 4.25.9(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)
codemirror: 6.0.2 codemirror: 6.0.2
react: 19.2.0 react-dom: 19.2.0
react-dom: 19.2.0(react@19.2.0)
transitivePeerDependencies: transitivePeerDependencies:
- '@codemirror/autocomplete' - '@codemirror/autocomplete'
- '@codemirror/language' - '@codemirror/language'
@@ -6807,8 +6774,7 @@ snapshots:
'@xmldom/xmldom@0.8.13': {} '@xmldom/xmldom@0.8.13': {}
'@xmldom/xmldom@0.9.10': '@xmldom/xmldom@0.9.10': {}
optional: true
'@zeit/schemas@2.36.0': {} '@zeit/schemas@2.36.0': {}
@@ -8561,9 +8527,7 @@ snapshots:
dependencies: dependencies:
yallist: 4.0.0 yallist: 4.0.0
lucide-react@0.546.0(react@19.2.0): lucide-react@0.546.0: {}
dependencies:
react: 19.2.0
lucide@0.546.0: {} lucide@0.546.0: {}
@@ -8867,7 +8831,6 @@ snapshots:
'@xmldom/xmldom': 0.9.10 '@xmldom/xmldom': 0.9.10
base64-js: 1.5.1 base64-js: 1.5.1
xmlbuilder: 15.1.1 xmlbuilder: 15.1.1
optional: true
possible-typed-array-names@1.1.0: {} possible-typed-array-names@1.1.0: {}
@@ -8974,14 +8937,12 @@ snapshots:
minimist: 1.2.8 minimist: 1.2.8
strip-json-comments: 2.0.1 strip-json-comments: 2.0.1
react-confetti@6.4.0(react@19.2.0): react-confetti@6.4.0:
dependencies: dependencies:
react: 19.2.0
tween-functions: 1.2.0 tween-functions: 1.2.0
react-dom@19.2.0(react@19.2.0): react-dom@19.2.0:
dependencies: dependencies:
react: 19.2.0
scheduler: 0.27.0 scheduler: 0.27.0
react-is@16.13.1: {} react-is@16.13.1: {}
@@ -8990,34 +8951,28 @@ snapshots:
react-refresh@0.17.0: {} react-refresh@0.17.0: {}
react-resizable-panels@3.0.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): react-resizable-panels@3.0.6(react-dom@19.2.0):
dependencies: dependencies:
react: 19.2.0 react-dom: 19.2.0
react-dom: 19.2.0(react@19.2.0)
react-router-dom@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): react-router-dom@7.9.4(react-dom@19.2.0):
dependencies: dependencies:
react: 19.2.0 react-dom: 19.2.0
react-dom: 19.2.0(react@19.2.0) react-router: 7.9.4(react-dom@19.2.0)
react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): react-router@7.9.4(react-dom@19.2.0):
dependencies: dependencies:
cookie: 1.0.2 cookie: 1.0.2
react: 19.2.0
set-cookie-parser: 2.7.1 set-cookie-parser: 2.7.1
optionalDependencies: optionalDependencies:
react-dom: 19.2.0(react@19.2.0) react-dom: 19.2.0
react-shepherd@6.1.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): react-shepherd@6.1.9(react-dom@19.2.0)(typescript@5.9.3):
dependencies: dependencies:
react: 19.2.0 react-dom: 19.2.0
react-dom: 19.2.0(react@19.2.0)
shepherd.js: 14.5.1 shepherd.js: 14.5.1
typescript: 5.9.3 typescript: 5.9.3
react@19.2.0: {}
read-binary-file-arch@1.0.6: read-binary-file-arch@1.0.6:
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3

View File

@@ -6,11 +6,13 @@
import { lazy, Suspense, useEffect } from "react"; import { lazy, Suspense, useEffect } from "react";
import { HashRouter as Router, Routes, Route, useLocation } from "react-router-dom"; import { HashRouter as Router, Routes, Route, useLocation } from "react-router-dom";
import { IntlProvider } from 'react-intl';
import "./App.css"; import "./App.css";
import HomePage from "./pages/HomePage/HomePage"; import HomePage from "./pages/HomePage/HomePage";
import LabPython from "./pages/LabPython/LabPython"; import LabPython from "./pages/LabPython/LabPython";
import ScrollToTop from "./components/ScrollToTop"; import ScrollToTop from "./components/ScrollToTop";
import { trackPageView } from "./services/plausible"; import { trackPageView } from "./services/plausible";
import { getLocalizedMessages } from "./services/localizedMessages";
const Playground = lazy(() => import("./pages/Playground/Playground")); const Playground = lazy(() => import("./pages/Playground/Playground"));
const About = lazy(() => import("./pages/About/About")); const About = lazy(() => import("./pages/About/About"));
@@ -116,10 +118,16 @@ function AppRoutes() {
} }
export default function App() { export default function App() {
const locale = 'ht';
const translatedMessages = getLocalizedMessages(locale);
// TODO: fazer botão
window.localStorage.setItem("locale", 'ht');
return ( return (
<Router> <Router>
<Suspense fallback={<LoadingFallback />}> <Suspense fallback={<LoadingFallback />}>
<IntlProvider messages={translatedMessages} locale={locale} defaultLocale="pt">
<AppRoutes /> <AppRoutes />
</IntlProvider>
</Suspense> </Suspense>
</Router> </Router>
); );

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

View File

@@ -42,7 +42,7 @@ export const gameConfig = {
// ========================================== // ==========================================
{ {
id: 1, id: 1,
nome: "Fase 1: A Linha Reta", nome: "$atividades.aspirador.nome",
descricao: "Use o bloco 'Enquanto houver sujeira' e o comando 'Mover' para ligá-lo.", descricao: "Use o bloco 'Enquanto houver sujeira' e o comando 'Mover' para ligá-lo.",
timeout: 10, timeout: 10,
maxBlocks: 3, maxBlocks: 3,

View File

@@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { translate } from "../../services/localizedMessages";
function obterDificuldade(dadosFase) { function obterDificuldade(dadosFase) {
// Usa a dificuldade da fase, se existir, senão calcula pelo número // Usa a dificuldade da fase, se existir, senão calcula pelo número
@@ -40,7 +41,7 @@ function GameFaseInfo({ phaseData = {}, phaseNumber }) {
{/* Título/Subtítulo */} {/* Título/Subtítulo */}
<div className="flex-1 min-w-0 px-3 lg:px-5"> <div className="flex-1 min-w-0 px-3 lg:px-5">
<h3 className="text-base lg:text-2xl font-semibold text-gray-800 truncate"> <h3 className="text-base lg:text-2xl font-semibold text-gray-800 truncate">
{phaseData.nome} {translate(phaseData.nome)}
</h3> </h3>
{phaseData.descricao && ( {phaseData.descricao && (
<p className="text-base lg:text-lg text-gray-600 leading-tight whitespace-pre-wrap mt-1 pr-12 lg:pr-0"> <p className="text-base lg:text-lg text-gray-600 leading-tight whitespace-pre-wrap mt-1 pr-12 lg:pr-0">

View File

@@ -4,8 +4,6 @@
* @module pages.HomePage.HomePage * @module pages.HomePage.HomePage
*/ */
import { useEffect } from "react";
import capicodaUrl from "@/vendor/capicoda/capicoda.js?url";
import Navbar from "../../components/Navbar"; import Navbar from "../../components/Navbar";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import Hero from "./Hero"; import Hero from "./Hero";
@@ -18,23 +16,6 @@ import StudentsMaterials from "./StudentsMaterials";
import TeachersMaterials from "./TeachersMaterials"; import TeachersMaterials from "./TeachersMaterials";
const HomePage = () => { const HomePage = () => {
// Mascote Capicoda: injetado apenas na página inicial. O widget é um script
// autocontido que se anexa ao body; na saída da home removemos o script e o
// nó raiz (#dcs-root) para não vazar para outras rotas.
useEffect(() => {
// Estamos dentro do próprio DECODA: o widget esconde os links "Acessar o DECODA".
window.CAPICODA_ON_DECODA = true;
const script = document.createElement("script");
script.src = capicodaUrl;
script.defer = true;
document.body.appendChild(script);
return () => {
script.remove();
const root = document.getElementById("dcs-root");
if (root) root.remove();
};
}, []);
return ( return (
<div className="min-h-screen"> <div className="min-h-screen">
{/* Navegação */} {/* Navegação */}

View File

@@ -0,0 +1,29 @@
import ht from "./../../lang/ht.json";
import pt from "./../../lang/pt.json";
export function getLocalizedMessages(locale) {
console.log('localized import json');
return {
ht,
pt
}[locale];
}
export function getUserLocale() {
return getLocalizedMessages(window.localStorage.getItem('locale') ?? 'pt');
}
const accessObject = (path, object) => {
return path.split('.').reduce((o, i) => o[i], object);
}
export function translate(message) {
if (message.match(/^\$/)) {
const result = accessObject(message.substr(1), getUserLocale());
if(result) {
return result;
} else {
console.error(`path ${message} not found on lang`);
}
}
return message;
}

View File

@@ -1,135 +0,0 @@
# Capicoda 🚩🦫
A **capivara comunista** do Núcleo de Tecnologia do MTST. Um widget de chat que
aparece na página do Núcleo, conversa com quem visita, identifica se a pessoa é
desenvolvedora e a direciona para **contribuir com o [DECODA](https://git.mtst.tec.br/educacao/decoda/)**.
Projeto do hackathon do Núcleo de Tecnologia do MTST.
---
## ✨ O que é
- Balão de chat no canto inferior direito de qualquer site.
- Conversa por **roteiro fixo** (botões) — sem IA, sem backend, sem build.
- Faz a triagem do visitante (**dev / aprendiz / curiosx**) e entrega o caminho
certo: repositório, como rodar localmente, como abrir um PR, ou como ajudar
sem programar.
- Um único arquivo: **`capicoda.js`** (CSS, SVG da capivara e diálogo embutidos).
---
## 🚀 Rodar o demo
Não precisa instalar nada. Na pasta do projeto:
```bash
python3 -m http.server 8000
```
Abra **http://localhost:8000/demo.html** e clique no balão da capivara.
> Também dá pra só abrir o `demo.html` direto no navegador (duplo clique).
---
## 🔌 Embutir em outro site
Copie `capicoda.js` para o site e adicione **uma linha** antes do `</body>`:
```html
<script src="capicoda.js" defer></script>
```
Pronto — o balão se injeta sozinho. Não conflita com o CSS da página (tudo é
prefixado com `dcs-` e isolado num `#dcs-root`).
---
## 💬 Editar a conversa
Toda a conversa vive no objeto **`TREE`** no topo do `capicoda.js`. Cada nó:
```js
nome_do_no: {
msg: "Texto do balão", // ou um array de balões em sequência
options: [
{ label: "Botão A", next: "outro_no" }, // navega para outro nó
{ label: "Abrir repo", url: URLS.repo }, // abre um link em nova aba
{ label: "Destaque", next: "x", primary: true } // botão em vermelho cheio
]
}
```
Os links reais ficam no objeto `URLS` (repo, página do DECODA, página do Núcleo).
### Mapa do roteiro
```
start ──┬─ Bora! ───────────────► qualifica
└─ O que é o DECODA? ───► oque_decoda ──► qualifica
qualifica ─┬─ Sou dev ──────► area ─┬─ Front/JS ──► cta_front
│ ├─ Back/DevOps ► cta_infra
│ └─ Full/outra ─► cta_geral
├─ Tô aprendendo ► aprendiz
└─ Só curiosx ───► curioso
cta_* ─┬─ Ver repositório (link)
├─ Como rodar localmente ► setup
├─ Como mandar um PR ─────► fluxo_pr
└─ Voltar ao início ──────► start
```
---
## 🦫 Poses da capivara (imagens)
O mascote é uma imagem grande (≈190px) que **substitui o botão** e **troca de pose**
conforme o estado da conversa. As 4 poses vivem embutidas como data URI (WebP) no
`capicoda.js`, então o widget continua autocontido (1 tag de script).
| Pose | Quando | Nós do diálogo |
|------|--------|----------------|
| `start` | acenando, no início | `start` |
| `prof` | explicando | `oque_decoda`, `setup`, `fluxo_pr` |
| `anot` | pedindo respostas | `qualifica`, `area` |
| `end` | encerrando | `cta_*`, `aprendiz`, `curioso` |
O mapa nó→pose é o objeto **`NODE_IMG`** no topo do `capicoda.js` (fácil de ajustar).
Todas as imagens têm o mesmo canvas (768×768), então a capivara não muda de tamanho
nem se desloca ao trocar de pose.
### Regenerar as imagens
As fontes são `app/src/assets/capicoda_{start,prof,anot,end}.jpeg`. Para remover o
fundo e reembutir no widget:
```bash
python3 scripts/build_images.py # requer Pillow
```
O script remove o fundo (flood-fill a partir das bordas), salva os PNGs transparentes
em `app/src/assets/capicoda_*.png` e reescreve o bloco `IMGS` entre os marcadores
`/* __IMAGES_START__ */ … /* __IMAGES_END__ */`. **Não edite o `IMGS` à mão.**
---
## 🎨 Identidade
Capivara marrom de boina verde com estrela vermelha. Paleta MTST (vermelho `#c1121f`).
Tom acolhedor e militante-bem-humorado. Fallback: SVG inline desenhado à mão, usado se
as imagens não carregarem.
---
## 🔮 Próximos passos (fora do escopo do hackathon)
- Modo IA opcional (Claude API) para conversa livre.
- Captura de contato de quem quer contribuir (onboarding → mutirão).
- Puxar "good first issues" dinamicamente da aba de Issues do repositório.
- Integração na página real do Núcleo e/ou sobre o app DECODA.
---
Desenvolvido com ✊ para o DECODA · Núcleo de Tecnologia do MTST

File diff suppressed because one or more lines are too long

View File

@@ -1,69 +0,0 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Capicoda — demo · Núcleo de Tecnologia do MTST</title>
<style>
:root { --vermelho: #c1121f; }
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
color: #1d1d1f; line-height: 1.6; background: #faf6f1;
}
header {
background: var(--vermelho); color: #fff; padding: 18px 24px;
display: flex; align-items: center; gap: 12px;
}
header .star { font-size: 26px; }
header h1 { font-size: 19px; font-weight: 700; }
.hero {
max-width: 760px; margin: 0 auto; padding: 64px 24px 40px; text-align: center;
}
.hero h2 { font-size: 38px; line-height: 1.2; margin-bottom: 16px; }
.hero h2 span { color: var(--vermelho); }
.hero p { font-size: 18px; color: #4a4a4a; max-width: 560px; margin: 0 auto; }
.grid {
max-width: 760px; margin: 0 auto; padding: 24px; display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px;
}
.card { background: #fff; border: 1px solid #eee; border-radius: 14px; padding: 20px; }
.card h3 { font-size: 16px; margin-bottom: 6px; }
.card p { font-size: 14px; color: #555; }
.hint {
max-width: 760px; margin: 12px auto 80px; padding: 16px 20px; border-radius: 12px;
background: #fff3cd; border: 1px solid #ffe69c; color: #664d03; font-size: 14px;
text-align: center;
}
footer { text-align: center; padding: 24px; color: #999; font-size: 13px; }
</style>
</head>
<body>
<header>
<span class="star">🚩</span>
<h1>Núcleo de Tecnologia · MTST</h1>
</header>
<section class="hero">
<h2>Aprenda a programar com o <span>DECODA</span></h2>
<p>Plataforma educacional do MTST: lógica de programação através de jogos
e blocos visuais. Tecnologia como ferramenta de transformação social.</p>
</section>
<section class="grid">
<div class="card"><h3>🎮 Jogos</h3><p>Atividades interativas para aprender programação na prática.</p></div>
<div class="card"><h3>🧩 Blocos visuais</h3><p>Programação arrastar-e-soltar com Blockly, sem decorar sintaxe.</p></div>
<div class="card"><h3>🆓 Livre e gratuito</h3><p>100% gratuito, sem cadastro, código aberto.</p></div>
</section>
<div class="hint">
👉 Página de demonstração. O balão da capivara <b>Capicoda</b> aparece no
canto inferior direito — clique pra conversar.
</div>
<footer>Demo do mascote Capicoda · hackathon do Núcleo de Tecnologia do MTST</footer>
<!-- É só isto que precisa ir na página real do Núcleo: -->
<script src="capicoda.js" defer></script>
</body>
</html>

View File

@@ -1,152 +0,0 @@
#!/usr/bin/env python3
"""
Capicoda — processamento das imagens do mascote.
Para cada pose (capicoda_<estado>.jpeg em app/src/assets):
1. Remove o fundo branco (flood-fill a partir das bordas sobre a máscara de
pixels claros — preserva os brancos INTERNOS, cercados pelo contorno escuro:
olhos, papel do caderno, brilho dos óculos).
2. Salva um PNG transparente em alta (canvas quadrado preservado — todas as
poses ficam do MESMO tamanho, então a capivara não "pula" ao trocar).
3. Gera uma versão reduzida (EMB x EMB), codifica em base64 (WebP se suportado,
senão PNG) e injeta o mapa `IMGS` no capicoda.js entre os marcadores
/* __IMAGES_START__ */ ... /* __IMAGES_END__ */.
Uso: python3 scripts/build_images.py
Requisitos: Pillow.
"""
import base64
import io
import os
import re
from collections import deque
from PIL import Image, features
HERE = os.path.dirname(os.path.abspath(__file__))
CAPICODA_DIR = os.path.normpath(os.path.join(HERE, ".."))
ASSETS = os.path.normpath(os.path.join(HERE, "..", "..", "..", "assets"))
CAPICODA_JS = os.path.join(CAPICODA_DIR, "capicoda.js")
STATES = ["start", "prof", "anot", "end"]
WORK = 768 # resolução de processamento/saída do PNG (quadrado, uniforme)
EMB = 384 # resolução embutida no JS
LIGHT = 190 # canal mínimo p/ considerar um pixel "claro" (fundo/sombra)
def remove_bg(img):
"""Torna transparente o fundo claro conectado às bordas."""
img = img.convert("RGBA").resize((WORK, WORK), Image.LANCZOS)
w, h = img.size
px = img.load()
# 1) máscara de pixels "claros" (fundo branco + sombra clara)
light = bytearray(w * h)
for y in range(h):
row = y * w
for x in range(w):
r, g, b, _ = px[x, y]
if r >= LIGHT and g >= LIGHT and b >= LIGHT:
light[row + x] = 1
# 2) BFS a partir dos pixels claros da borda -> só o fundo EXTERNO
visited = bytearray(w * h)
dq = deque()
def seed(x, y):
i = y * w + x
if light[i] and not visited[i]:
visited[i] = 1
dq.append((x, y))
for x in range(w):
seed(x, 0)
seed(x, h - 1)
for y in range(h):
seed(0, y)
seed(w - 1, y)
while dq:
x, y = dq.popleft()
if x > 0:
seed(x - 1, y)
if x < w - 1:
seed(x + 1, y)
if y > 0:
seed(x, y - 1)
if y < h - 1:
seed(x, y + 1)
# 3) zera o alpha do fundo externo
cleared = 0
for y in range(h):
row = y * w
for x in range(w):
if visited[row + x]:
r, g, b, _ = px[x, y]
px[x, y] = (r, g, b, 0)
cleared += 1
return img, cleared
def data_uri(img):
"""Reduz para EMB e devolve (data_uri, mime, n_bytes)."""
small = img.resize((EMB, EMB), Image.LANCZOS)
buf = io.BytesIO()
if features.check("webp"):
small.save(buf, format="WEBP", quality=90, method=6)
mime = "image/webp"
else:
small.save(buf, format="PNG", optimize=True)
mime = "image/png"
raw = buf.getvalue()
b64 = base64.b64encode(raw).decode("ascii")
return "data:%s;base64,%s" % (mime, b64), mime, len(raw)
def patch_js(uris):
with open(CAPICODA_JS, "r", encoding="utf-8") as f:
src = f.read()
lines = [' var IMGS = {']
for s in STATES:
lines.append(' %s: "%s",' % (s, uris[s]))
lines.append(' };')
block = "/* __IMAGES_START__ */\n" + "\n".join(lines) + "\n /* __IMAGES_END__ */"
new, n = re.subn(
r"/\* __IMAGES_START__ \*/.*?/\* __IMAGES_END__ \*/",
lambda _: block,
src,
flags=re.S,
)
if n != 1:
raise SystemExit("ERRO: marcadores __IMAGES_START/END__ não encontrados (n=%d)" % n)
with open(CAPICODA_JS, "w", encoding="utf-8") as f:
f.write(new)
def main():
uris = {}
total = 0
for s in STATES:
src = os.path.join(ASSETS, "capicoda_%s.jpeg" % s)
if not os.path.exists(src):
raise SystemExit("ERRO: não encontrei %s" % src)
img = Image.open(src)
out, cleared = remove_bg(img)
png_path = os.path.join(ASSETS, "capicoda_%s.png" % s)
out.save(png_path, format="PNG", optimize=True)
uri, mime, nbytes = data_uri(out)
uris[s] = uri
total += nbytes
print(" %-6s -> %s (fundo: %d px) | embutido %s %d KB"
% (s, os.path.basename(png_path), cleared, mime, nbytes // 1024))
patch_js(uris)
print("PNGs transparentes (%dx%d) em %s" % (WORK, WORK, ASSETS))
print("IMGS embutido no capicoda.js — total embutido: %d KB" % (total // 1024))
if __name__ == "__main__":
main()