diff --git a/package-lock.json b/package-lock.json
index 9fdab58..d447ed2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
"fabricjs-react": "^2.0.0",
"file-saver": "^2.0.5",
"flowbite-react": "^0.10.2",
+ "framer-motion": "^11.11.1",
"i18next": "^23.15.2",
"i18next-browser-languagedetector": "^8.0.0",
"i18next-http-backend": "^2.6.2",
@@ -73,6 +74,7 @@
"typescript-eslint": "^8.8.0",
"vite": "^5.4.8",
"vite-plugin-compression": "^0.5.1",
+ "vite-plugin-minify": "^2.0.0",
"vite-plugin-sitemap": "^0.7.1",
"vite-plugin-tailwind-purgecss": "^0.3.3"
}
@@ -3822,6 +3824,17 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
@@ -4574,6 +4587,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/html-minifier-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-7.0.2.tgz",
+ "integrity": "sha512-mm2HqV22l8lFQh4r2oSsOEVea+m0qqxEmwpc9kC1p/XzmjLWrReR9D/GRs8Pex2NX/imyEH9c5IU/7tMBQCHOA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
@@ -5829,6 +5849,17 @@
"node": ">=6"
}
},
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -5983,6 +6014,19 @@
"integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
"license": "MIT"
},
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -6675,6 +6719,17 @@
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -7830,6 +7885,31 @@
"url": "https://github.com/sponsors/rawify"
}
},
+ "node_modules/framer-motion": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.1.tgz",
+ "integrity": "sha512-Ucr9eHSrk0d+l6vyl9fvq6omh/PAWHjS+PlczpsoUdhJo1TuF3ULWJNuAMnpWQ1dGyPOyoUVuYlUKjE/s8dyCA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -8361,6 +8441,38 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/html-minifier-terser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
+ "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "~5.3.2",
+ "commander": "^10.0.0",
+ "entities": "^4.4.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.15.1"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/html-minifier-terser/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
@@ -11563,6 +11675,16 @@
"loose-envify": "cli.js"
}
},
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -11835,6 +11957,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
@@ -12218,6 +12351,17 @@
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"license": "BlueOak-1.0.0"
},
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -12276,6 +12420,17 @@
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -13843,6 +13998,16 @@
}
}
},
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -14737,6 +14902,43 @@
"license": "ISC",
"optional": true
},
+ "node_modules/terser": {
+ "version": "5.34.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz",
+ "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/terser/node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -15354,6 +15556,20 @@
"node": ">=8"
}
},
+ "node_modules/vite-plugin-minify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-minify/-/vite-plugin-minify-2.0.0.tgz",
+ "integrity": "sha512-xQWdXCip/CH3c5a0fftJtvpodOIZqp3gwfuSpGtik/W1YmZKe8WMTJrxvrjgrQ1NcP4EuqmiMCUaz8+If1CPMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^7.0.2",
+ "html-minifier-terser": "^7.2.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.4.0"
+ }
+ },
"node_modules/vite-plugin-sitemap": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/vite-plugin-sitemap/-/vite-plugin-sitemap-0.7.1.tgz",
diff --git a/package.json b/package.json
index c465a5f..bb46212 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"fabricjs-react": "^2.0.0",
"file-saver": "^2.0.5",
"flowbite-react": "^0.10.2",
+ "framer-motion": "^11.11.1",
"i18next": "^23.15.2",
"i18next-browser-languagedetector": "^8.0.0",
"i18next-http-backend": "^2.6.2",
@@ -77,6 +78,7 @@
"typescript-eslint": "^8.8.0",
"vite": "^5.4.8",
"vite-plugin-compression": "^0.5.1",
+ "vite-plugin-minify": "^2.0.0",
"vite-plugin-sitemap": "^0.7.1",
"vite-plugin-tailwind-purgecss": "^0.3.3"
},
diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json
index 274bc0d..7670034 100644
--- a/public/locales/en/translation.json
+++ b/public/locales/en/translation.json
@@ -1,90 +1,95 @@
{
- "menu": {
- "home": "Home",
- "about": "About this app",
- "faq": "FAQ"
- },
- "title": "stegg",
- "description": {
- "intro": "This is a full-stack React application written in Typescript.",
- "howitworks": "How it works:",
- "paragraph1": "This app takes the text input from Encrypt field and writes it to the metadata of a newly created PNG file that is generated from the Canvas. The canvas image depicts the message as binary data: nodes that are filled represent 1's and nodes that are outlined represent 0's. If someone was patient enough, they could translate the message back to text just by interpreting the image as unicode values. That's why there is a
Click to upload or drag and drop to extract message
PNG format only
" - }, - "downloadimagebutton": { - "tooltip": { - "title": "Download image", - "hint": "Enter a message before saving to disk" + "title": "stegg", + "description": { + "intro": "This is a full-stack React application written in Typescript.", + "howitworks": "How it works:", + "paragraph1": "This app takes the text input from Encrypt field and writes it to the metadata of a newly created PNG file that is generated from the Canvas. The canvas image depicts the message as binary data: nodes that are filled represent 1's and nodes that are outlined represent 0's. If someone was patient enough, they could translate the message back to text just by interpreting the image as unicode values. That's why there is aClick to upload or drag and drop to extract message
PNG format only
" + }, + "downloadimagebutton": { + "tooltip": { + "title": "Download image", + "hint": "Enter a message before saving to disk" + }, + "label": "Download" + }, + "nodesize": { + "label": "Node size" + }, + "password": { + "hint": "Enter a secret key", + "enable": "Enable encryption", + "tooltip": { + "content": "Enable AES 128-bit encryption" + } }, - "tooltip": { - "posttofeed": "Post image to the feed", - "entermessage": "Please enter a message and password before posting" + "post": { + "posted": "Posted" }, - "label": "Post" - }, - "feed": { - "title": "Public steggs", - "loadmore": "Load more" - }, - "footer": { - "rights": "All rights reserved", - "license": "Released under the" - }, - "instructions": "Instructions", - "how-it-works": "How it works" -} \ No newline at end of file + "postimagebutton": { + "toast": { + "processing": "Processing image...", + "embedding": "Embedding metadata...", + "size": "Determining the size of the image...", + "presignedpayload": "Getting presigned post payload...", + "uploading": "Uploading to S3 bucket...", + "createimage": "Creating binary feed image...", + "createimagepost": "Creating binary image post...", + "publishing": "Binary image post created.", + "success": "Image uploaded successfully!", + "noencryption": "Encryption disabled. Only encrypted messages can be posted.", + "nocanvasorinput": "No image to upload." + }, + "tooltip": { + "posttofeed": "Post image to the feed", + "entermessage": "Please enter a message and password before posting" + }, + "label": "Post" + }, + "feed": { + "title": "Public steggs", + "loadmore": "Load more" + }, + "footer": { + "rights": "All rights reserved", + "license": "Released under the" + }, + "instructions": "Instructions", + "how-it-works": "How it works", + "make-something": "make something", + "acknowledgements": { + "title": "Acknowledgements", + "paragraph1": "This app would not have been possible without the following open source projects and libraries:" + } +} diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 1b688b9..088f56e 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,90 +1,95 @@ { - "menu": { - "home": "Inicio", - "about": "Acerca de esta app", - "faq": "Preguntas frecuentes" - }, - "title": "stegg", - "description": { - "intro": "Esta es una aplicación full-stack de React escrita en Typescript.", - "howitworks": "Cómo funciona:", - "paragraph1": "Esta aplicación toma el texto ingresado en el campo Cifrar y lo escribe en los metadatos de un archivo PNG recién creado, generado a partir del Canvas. La imagen del canvas representa el mensaje como datos binarios: los nodos rellenos representan 1's y los nodos delineados representan 0's. Si alguien tuviera suficiente paciencia, podría traducir el mensaje de nuevo a texto simplemente interpretando la imagen como valores unicode. Es por eso que hay unHaz clic para subir o arrastra y suelta para extraer el mensaje
Solo formato PNG
" - }, - "downloadimagebutton": { - "tooltip": { - "title": "Descargar imagen", - "hint": "Ingresa un mensaje antes de guardar en el disco" + "title": "stegg", + "description": { + "intro": "Esta es una aplicación full-stack de React escrita en Typescript.", + "howitworks": "Cómo funciona:", + "paragraph1": "Esta aplicación toma el texto ingresado en el campo Cifrar y lo escribe en los metadatos de un archivo PNG recién creado, generado a partir del Canvas. La imagen del canvas representa el mensaje como datos binarios: los nodos rellenos representan 1's y los nodos delineados representan 0's. Si alguien tuviera suficiente paciencia, podría traducir el mensaje de nuevo a texto simplemente interpretando la imagen como valores unicode. Es por eso que hay unHaz clic para subir o arrastra y suelta para extraer el mensaje
Solo formato PNG
" + }, + "downloadimagebutton": { + "tooltip": { + "title": "Descargar imagen", + "hint": "Ingresa un mensaje antes de guardar en el disco" + }, + "label": "Descargar" + }, + "nodesize": { + "label": "Tamaño del nodo" + }, + "password": { + "hint": "Introduce una clave secreta", + "enable": "Habilitar cifrado", + "tooltip": { + "content": "Habilitar cifrado AES de 128 bits" + } }, - "tooltip": { - "posttofeed": "Publicar imagen en el feed", - "entermessage": "Por favor, ingresa un mensaje y una contraseña antes de publicar" + "post": { + "posted": "Publicado" }, - "label": "Publicar" - }, - "feed": { - "title": "Stegg públicos", - "loadmore": "Cargar más" - }, - "footer": { - "rights": "Todos los derechos reservados", - "license": "Publicado bajo la" - }, - "instructions": "Instrucciones", - "how-it-works": "Cómo functiona" -} \ No newline at end of file + "postimagebutton": { + "toast": { + "processing": "Procesando imagen...", + "embedding": "Incorporando metadatos...", + "size": "Determinando el tamaño de la imagen...", + "presignedpayload": "Obteniendo la carga útil del post firmado...", + "uploading": "Subiendo al bucket S3...", + "createimage": "Creando imagen binaria del feed...", + "createimagepost": "Creando post de imagen binaria...", + "publishing": "Post de imagen binaria creado.", + "success": "¡Imagen subida con éxito!", + "noencryption": "Cifrado deshabilitado. Solo los mensajes cifrados pueden ser publicados.", + "nocanvasorinput": "No hay imagen para subir." + }, + "tooltip": { + "posttofeed": "Publicar imagen en el feed", + "entermessage": "Por favor, ingresa un mensaje y una contraseña antes de publicar" + }, + "label": "Publicar" + }, + "feed": { + "title": "Stegg públicos", + "loadmore": "Cargar más" + }, + "footer": { + "rights": "Todos los derechos reservados", + "license": "Publicado bajo la" + }, + "instructions": "Instrucciones", + "how-it-works": "Cómo functiona", + "make-something": "crear algo", + "acknowledgements": { + "title": "Agradecimientos", + "paragraph1": "Esta aplicación no habría sido posible sin las siguientes bibliotecas y proyectos de código abierto:" + } +} diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index d8c3d80..8fd01eb 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -1,90 +1,95 @@ { - "menu": { - "home": "Accueil", - "about": "À propos de cette app", - "faq": "FAQ" - }, - "title": "stegg", - "description": { - "intro": "Ceci est une application full-stack React écrite en Typescript.", - "howitworks": "Comment ça fonctionne :", - "paragraph1": "Cette application prend le texte saisi dans le champ Chiffrer et l'écrit dans les métadonnées d'un fichier PNG nouvellement créé, généré à partir de la Canvas. L'image du canvas représente le message sous forme de données binaires : les nœuds remplis représentent des 1 et les nœuds délimités représentent des 0. Si quelqu'un était assez patient, il pourrait traduire le message en texte simplement en interprétant l'image comme des valeurs unicode. C'est pourquoi il y a unCliquez pour télécharger ou glissez-déposez pour extraire le message
Format PNG uniquement
" - }, - "downloadimagebutton": { - "tooltip": { - "title": "Télécharger l'image", - "hint": "Entrez un message avant de sauvegarder sur le disque" + "title": "stegg", + "description": { + "intro": "Ceci est une application full-stack React écrite en Typescript.", + "howitworks": "Comment ça fonctionne :", + "paragraph1": "Cette application prend le texte saisi dans le champ Chiffrer et l'écrit dans les métadonnées d'un fichier PNG nouvellement créé, généré à partir de la Canvas. L'image du canvas représente le message sous forme de données binaires : les nœuds remplis représentent des 1 et les nœuds délimités représentent des 0. Si quelqu'un était assez patient, il pourrait traduire le message en texte simplement en interprétant l'image comme des valeurs unicode. C'est pourquoi il y a unCliquez pour télécharger ou glissez-déposez pour extraire le message
Format PNG uniquement
" + }, + "downloadimagebutton": { + "tooltip": { + "title": "Télécharger l'image", + "hint": "Entrez un message avant de sauvegarder sur le disque" + }, + "label": "Télécharger" + }, + "nodesize": { + "label": "Taille du nœud" + }, + "password": { + "hint": "Entrez une clé secrète", + "enable": "Activer le chiffrement", + "tooltip": { + "content": "Activer le chiffrement AES 128 bits" + } }, - "tooltip": { - "posttofeed": "Poster l'image sur le feed", - "entermessage": "Veuillez entrer un message et un mot de passe avant de poster" + "post": { + "posted": "Posté" }, - "label": "Poster" - }, - "feed": { - "title": "Stegg publiques ", - "loadmore": "Charger plus" - }, - "footer": { - "rights": "Tous droits réservés", - "license": "Publié sous la" - }, - "instructions": "Instructions", - "how-it-works": "Comment ça marche" -} \ No newline at end of file + "postimagebutton": { + "toast": { + "processing": "Traitement de l'image...", + "embedding": "Incorporation des métadonnées...", + "size": "Détermination de la taille de l'image...", + "presignedpayload": "Récupération de la charge utile de post signé...", + "uploading": "Téléchargement dans le bucket S3...", + "createimage": "Création de l'image binaire du feed...", + "createimagepost": "Création du post d'image binaire...", + "publishing": "Post d'image binaire créé.", + "success": "Image téléchargée avec succès !", + "noencryption": "Chiffrement désactivé. Seuls les messages chiffrés peuvent être postés.", + "nocanvasorinput": "Aucune image à télécharger." + }, + "tooltip": { + "posttofeed": "Poster l'image sur le feed", + "entermessage": "Veuillez entrer un message et un mot de passe avant de poster" + }, + "label": "Poster" + }, + "feed": { + "title": "Stegg publiques ", + "loadmore": "Charger plus" + }, + "footer": { + "rights": "Tous droits réservés", + "license": "Publié sous la" + }, + "instructions": "Instructions", + "how-it-works": "Comment ça marche", + "make-something": "créer quelque chose", + "acknowledgements": { + "title": "Remerciements", + "paragraph1": "Cette application n'aurait pas été possible sans les projets et bibliothèques open source suivants:" + } +} diff --git a/src/components/Menu.tsx b/src/components/Menu.tsx index 3ff8700..1e49fdf 100644 --- a/src/components/Menu.tsx +++ b/src/components/Menu.tsx @@ -141,12 +141,12 @@ const Menu: React.FC = () => { g g -make something
+{t('make-something')}
diff --git a/src/index.css b/src/index.css index 7ed058d..ae7725d 100644 --- a/src/index.css +++ b/src/index.css @@ -1,75 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + :root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - --toastify-color-light: #fff; - --toastify-color-dark: #1D293B; - --toastify-color-info: #aaddcc; - --toastify-color-success: #aabb99; - --toastify-color-warning: #ff8866; - --toastify-color-error: #ccaabb; - --toastify-color-transparent: rgba(255, 255, 255, 0.7); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + --toastify-color-light: #fff; + --toastify-color-dark: #1d293b; + --toastify-color-info: #aaddcc; + --toastify-color-success: #aabb99; + --toastify-color-warning: #ff8866; + --toastify-color-error: #ccaabb; + --toastify-color-transparent: rgba(255, 255, 255, 0.7); - --toastify-icon-color-info: var(--toastify-color-info); - --toastify-icon-color-success: var(--toastify-color-success); - --toastify-icon-color-warning: var(--toastify-color-warning); - --toastify-icon-color-error: var(--toastify-color-error); - --toastify-toast-border-radius: 10px; - --toastify-toast-border-width: 1px; - --toastify-toast-border-color: #fff; + --toastify-icon-color-info: var(--toastify-color-info); + --toastify-icon-color-success: var(--toastify-color-success); + --toastify-icon-color-warning: var(--toastify-color-warning); + --toastify-icon-color-error: var(--toastify-color-error); + --toastify-toast-border-radius: 10px; + --toastify-toast-border-width: 1px; + --toastify-toast-border-color: #fff; } body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; } @layer components { - input[type=range] { - @apply appearance-none bg-transparent; - } - - input[type=range]::-webkit-slider-runnable-track { - @apply bg-seablue/25 rounded-full; - } + input[type="range"] { + @apply appearance-none bg-transparent; + } - input[type=range]::-moz-range-track { - @apply bg-seablue/25 rounded-full; - } + input[type="range"]::-webkit-slider-runnable-track { + @apply rounded-full bg-seablue/25; + } - input[type=range]::-ms-track { - @apply bg-seablue/25 rounded-full; - } + input[type="range"]::-moz-range-track { + @apply rounded-full bg-seablue/25; + } - input[type="range"]::-moz-range-progress { - @apply bg-seablue/25 rounded-full; - } + input[type="range"]::-ms-track { + @apply rounded-full bg-seablue/25; + } - input[type="range"]::-moz-range-thumb { - @apply w-4 h-4 bg-seablue rounded-full; - } + input[type="range"]::-moz-range-progress { + @apply rounded-full bg-seablue/25; + } - input[type="range"]::-webkit-slider-thumb { - @apply w-4 h-4 bg-seablue rounded-full; - } + input[type="range"]::-moz-range-thumb { + @apply h-4 w-4 rounded-full bg-seablue; + } + input[type="range"]::-webkit-slider-thumb { + @apply h-4 w-4 rounded-full bg-seablue; + } } .Toastify__toast { - border: 2px solid #99aabb; + border: 2px solid #99aabb; } -@tailwind base; -@tailwind components; -@tailwind utilities; \ No newline at end of file +#content-wrapper { + overflow: hidden; +} diff --git a/src/main.tsx b/src/main.tsx index 3e2213d..b1f843f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -74,8 +74,6 @@ const client = new ApolloClient({ cache }); -const publicUrl = import.meta.env.VITE_PUBLIC_URL; -console.log("publicUrl", publicUrl); createRoot(document.getElementById('root')!).render({t('description.intro')}
+{t('description.howitworks')}
+ {t('acknowledgements.paragraph1')} +
++
+
+ {JSON.stringify(dependencies, null, 2)}
+
+
+
+ Click on the "How it Works" tab to see how to use the image generator.