@jjlmoya/utils-converters 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/package.json +61 -0
  2. package/src/category/i18n/en.ts +90 -0
  3. package/src/category/i18n/es.ts +90 -0
  4. package/src/category/i18n/fr.ts +90 -0
  5. package/src/category/index.ts +39 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +152 -0
  9. package/src/data.ts +34 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +39 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +148 -0
  14. package/src/pages/[locale].astro +271 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/shared/ImageConverter.astro +237 -0
  17. package/src/shared/logic/converter.ts +167 -0
  18. package/src/shared/style.css +258 -0
  19. package/src/tests/faq_count.test.ts +10 -0
  20. package/src/tests/mocks/astro_mock.js +2 -0
  21. package/src/tests/seo_length.test.ts +22 -0
  22. package/src/tests/tool_validation.test.ts +17 -0
  23. package/src/tool/avifAJpg/bibliography.astro +14 -0
  24. package/src/tool/avifAJpg/component.astro +8 -0
  25. package/src/tool/avifAJpg/i18n/en.ts +123 -0
  26. package/src/tool/avifAJpg/i18n/es.ts +123 -0
  27. package/src/tool/avifAJpg/i18n/fr.ts +118 -0
  28. package/src/tool/avifAJpg/index.ts +29 -0
  29. package/src/tool/avifAJpg/seo.astro +14 -0
  30. package/src/tool/avifAPng/bibliography.astro +14 -0
  31. package/src/tool/avifAPng/component.astro +8 -0
  32. package/src/tool/avifAPng/i18n/en.ts +118 -0
  33. package/src/tool/avifAPng/i18n/es.ts +123 -0
  34. package/src/tool/avifAPng/i18n/fr.ts +118 -0
  35. package/src/tool/avifAPng/index.ts +29 -0
  36. package/src/tool/avifAPng/seo.astro +14 -0
  37. package/src/tool/avifAWebp/bibliography.astro +14 -0
  38. package/src/tool/avifAWebp/component.astro +8 -0
  39. package/src/tool/avifAWebp/i18n/en.ts +118 -0
  40. package/src/tool/avifAWebp/i18n/es.ts +123 -0
  41. package/src/tool/avifAWebp/i18n/fr.ts +118 -0
  42. package/src/tool/avifAWebp/index.ts +29 -0
  43. package/src/tool/avifAWebp/seo.astro +14 -0
  44. package/src/tool/bmpAJpg/bibliography.astro +14 -0
  45. package/src/tool/bmpAJpg/component.astro +8 -0
  46. package/src/tool/bmpAJpg/i18n/en.ts +123 -0
  47. package/src/tool/bmpAJpg/i18n/es.ts +123 -0
  48. package/src/tool/bmpAJpg/i18n/fr.ts +118 -0
  49. package/src/tool/bmpAJpg/index.ts +29 -0
  50. package/src/tool/bmpAJpg/seo.astro +14 -0
  51. package/src/tool/bmpAPng/bibliography.astro +14 -0
  52. package/src/tool/bmpAPng/component.astro +8 -0
  53. package/src/tool/bmpAPng/i18n/en.ts +123 -0
  54. package/src/tool/bmpAPng/i18n/es.ts +123 -0
  55. package/src/tool/bmpAPng/i18n/fr.ts +118 -0
  56. package/src/tool/bmpAPng/index.ts +29 -0
  57. package/src/tool/bmpAPng/seo.astro +14 -0
  58. package/src/tool/bmpAWebp/bibliography.astro +14 -0
  59. package/src/tool/bmpAWebp/component.astro +8 -0
  60. package/src/tool/bmpAWebp/i18n/en.ts +118 -0
  61. package/src/tool/bmpAWebp/i18n/es.ts +123 -0
  62. package/src/tool/bmpAWebp/i18n/fr.ts +118 -0
  63. package/src/tool/bmpAWebp/index.ts +29 -0
  64. package/src/tool/bmpAWebp/seo.astro +14 -0
  65. package/src/tool/gifAJpg/bibliography.astro +14 -0
  66. package/src/tool/gifAJpg/component.astro +8 -0
  67. package/src/tool/gifAJpg/i18n/en.ts +123 -0
  68. package/src/tool/gifAJpg/i18n/es.ts +123 -0
  69. package/src/tool/gifAJpg/i18n/fr.ts +118 -0
  70. package/src/tool/gifAJpg/index.ts +29 -0
  71. package/src/tool/gifAJpg/seo.astro +14 -0
  72. package/src/tool/gifAPng/bibliography.astro +14 -0
  73. package/src/tool/gifAPng/component.astro +8 -0
  74. package/src/tool/gifAPng/i18n/en.ts +123 -0
  75. package/src/tool/gifAPng/i18n/es.ts +123 -0
  76. package/src/tool/gifAPng/i18n/fr.ts +118 -0
  77. package/src/tool/gifAPng/index.ts +29 -0
  78. package/src/tool/gifAPng/seo.astro +14 -0
  79. package/src/tool/gifAWebp/bibliography.astro +14 -0
  80. package/src/tool/gifAWebp/component.astro +8 -0
  81. package/src/tool/gifAWebp/i18n/en.ts +123 -0
  82. package/src/tool/gifAWebp/i18n/es.ts +123 -0
  83. package/src/tool/gifAWebp/i18n/fr.ts +118 -0
  84. package/src/tool/gifAWebp/index.ts +29 -0
  85. package/src/tool/gifAWebp/seo.astro +14 -0
  86. package/src/tool/imagenBase64/bibliography.astro +14 -0
  87. package/src/tool/imagenBase64/component.astro +159 -0
  88. package/src/tool/imagenBase64/i18n/en.ts +137 -0
  89. package/src/tool/imagenBase64/i18n/es.ts +137 -0
  90. package/src/tool/imagenBase64/i18n/fr.ts +132 -0
  91. package/src/tool/imagenBase64/index.ts +43 -0
  92. package/src/tool/imagenBase64/seo.astro +14 -0
  93. package/src/tool/imagenBase64/style.css +299 -0
  94. package/src/tool/jpgAIco/bibliography.astro +14 -0
  95. package/src/tool/jpgAIco/component.astro +8 -0
  96. package/src/tool/jpgAIco/i18n/en.ts +123 -0
  97. package/src/tool/jpgAIco/i18n/es.ts +123 -0
  98. package/src/tool/jpgAIco/i18n/fr.ts +118 -0
  99. package/src/tool/jpgAIco/index.ts +29 -0
  100. package/src/tool/jpgAIco/seo.astro +14 -0
  101. package/src/tool/jpgAPng/bibliography.astro +14 -0
  102. package/src/tool/jpgAPng/component.astro +8 -0
  103. package/src/tool/jpgAPng/i18n/en.ts +128 -0
  104. package/src/tool/jpgAPng/i18n/es.ts +128 -0
  105. package/src/tool/jpgAPng/i18n/fr.ts +123 -0
  106. package/src/tool/jpgAPng/index.ts +29 -0
  107. package/src/tool/jpgAPng/seo.astro +14 -0
  108. package/src/tool/jpgAWebp/bibliography.astro +14 -0
  109. package/src/tool/jpgAWebp/component.astro +8 -0
  110. package/src/tool/jpgAWebp/i18n/en.ts +118 -0
  111. package/src/tool/jpgAWebp/i18n/es.ts +123 -0
  112. package/src/tool/jpgAWebp/i18n/fr.ts +118 -0
  113. package/src/tool/jpgAWebp/index.ts +29 -0
  114. package/src/tool/jpgAWebp/seo.astro +14 -0
  115. package/src/tool/pngAIco/bibliography.astro +14 -0
  116. package/src/tool/pngAIco/component.astro +8 -0
  117. package/src/tool/pngAIco/i18n/en.ts +123 -0
  118. package/src/tool/pngAIco/i18n/es.ts +123 -0
  119. package/src/tool/pngAIco/i18n/fr.ts +118 -0
  120. package/src/tool/pngAIco/index.ts +29 -0
  121. package/src/tool/pngAIco/seo.astro +14 -0
  122. package/src/tool/pngAJpg/bibliography.astro +14 -0
  123. package/src/tool/pngAJpg/component.astro +8 -0
  124. package/src/tool/pngAJpg/i18n/en.ts +133 -0
  125. package/src/tool/pngAJpg/i18n/es.ts +201 -0
  126. package/src/tool/pngAJpg/i18n/fr.ts +128 -0
  127. package/src/tool/pngAJpg/index.ts +29 -0
  128. package/src/tool/pngAJpg/seo.astro +14 -0
  129. package/src/tool/pngAWebp/bibliography.astro +14 -0
  130. package/src/tool/pngAWebp/component.astro +8 -0
  131. package/src/tool/pngAWebp/i18n/en.ts +127 -0
  132. package/src/tool/pngAWebp/i18n/es.ts +132 -0
  133. package/src/tool/pngAWebp/i18n/fr.ts +122 -0
  134. package/src/tool/pngAWebp/index.ts +29 -0
  135. package/src/tool/pngAWebp/seo.astro +14 -0
  136. package/src/tool/svgAJpg/bibliography.astro +14 -0
  137. package/src/tool/svgAJpg/component.astro +8 -0
  138. package/src/tool/svgAJpg/i18n/en.ts +118 -0
  139. package/src/tool/svgAJpg/i18n/es.ts +123 -0
  140. package/src/tool/svgAJpg/i18n/fr.ts +118 -0
  141. package/src/tool/svgAJpg/index.ts +29 -0
  142. package/src/tool/svgAJpg/seo.astro +14 -0
  143. package/src/tool/svgAPng/bibliography.astro +14 -0
  144. package/src/tool/svgAPng/component.astro +8 -0
  145. package/src/tool/svgAPng/i18n/en.ts +123 -0
  146. package/src/tool/svgAPng/i18n/es.ts +128 -0
  147. package/src/tool/svgAPng/i18n/fr.ts +118 -0
  148. package/src/tool/svgAPng/index.ts +29 -0
  149. package/src/tool/svgAPng/seo.astro +14 -0
  150. package/src/tool/webpAIco/bibliography.astro +14 -0
  151. package/src/tool/webpAIco/component.astro +8 -0
  152. package/src/tool/webpAIco/i18n/en.ts +123 -0
  153. package/src/tool/webpAIco/i18n/es.ts +123 -0
  154. package/src/tool/webpAIco/i18n/fr.ts +118 -0
  155. package/src/tool/webpAIco/index.ts +29 -0
  156. package/src/tool/webpAIco/seo.astro +14 -0
  157. package/src/tool/webpAJpg/bibliography.astro +14 -0
  158. package/src/tool/webpAJpg/component.astro +8 -0
  159. package/src/tool/webpAJpg/i18n/en.ts +122 -0
  160. package/src/tool/webpAJpg/i18n/es.ts +127 -0
  161. package/src/tool/webpAJpg/i18n/fr.ts +122 -0
  162. package/src/tool/webpAJpg/index.ts +29 -0
  163. package/src/tool/webpAJpg/seo.astro +14 -0
  164. package/src/tool/webpAPng/bibliography.astro +14 -0
  165. package/src/tool/webpAPng/component.astro +8 -0
  166. package/src/tool/webpAPng/i18n/en.ts +127 -0
  167. package/src/tool/webpAPng/i18n/es.ts +132 -0
  168. package/src/tool/webpAPng/i18n/fr.ts +122 -0
  169. package/src/tool/webpAPng/index.ts +29 -0
  170. package/src/tool/webpAPng/seo.astro +14 -0
  171. package/src/tools.ts +70 -0
  172. package/src/types.ts +69 -0
@@ -0,0 +1,123 @@
1
+ import type { WithContext, SoftwareApplication } from 'schema-dts';
2
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
3
+ import type { GifAPngLocaleContent } from '../index';
4
+
5
+ const slug = 'convertidor-gif-a-png';
6
+ const title = 'Convertir GIF a PNG Online | Extrae un fotograma estático sin pérdida';
7
+ const description =
8
+ 'Extrae el primer fotograma de tus GIF y conviértelo a PNG preservando transparencias. Sin servidor. Procesado local. Gratis.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Arrastra archivos GIF...',
12
+ convertText: 'Para convertirlos a PNG al instante',
13
+ selectFiles: 'Seleccionar archivos',
14
+ processedFiles: 'Archivos procesados',
15
+ downloadAll: 'Descargar Todo (.zip)',
16
+ pending: 'Pendiente',
17
+ bibliographyTitle: 'Referencias Bibliográficas',
18
+ faqTitle: 'Preguntas Frecuentes',
19
+ };
20
+
21
+ const faq: GifAPngLocaleContent['faq'] = [
22
+ {
23
+ question: '¿Por qué convertir un formato animado como GIF a un formato estático como PNG?',
24
+ answer:
25
+ 'Muchas redes sociales o avatares no admiten fotografías que cambian. Extraer el primer cuadro de un GIF complejo hacia un PNG de alta calidad soluciona las barreras y reduce pesos inservibles.',
26
+ },
27
+ {
28
+ question: '¿Se conservan las transparencias del viejo GIF en el PNG resultante?',
29
+ answer:
30
+ 'Sí, a diferencia del JPG, el formato PNG mantiene el canal alfa. Si el GIF tenía un fondo transparente, el PNG lo conservará con bordes nítidos.',
31
+ },
32
+ {
33
+ question: '¿Mantienes mis imágenes en los servidores un tiempo tras el procesamiento?',
34
+ answer:
35
+ 'Ningún servidor retiene tu GIF; toda la extracción es local debido al Canvas Web API. Es el procesador de tu PC quien decodifica de forma segura tu archivo sin contacto con red alguna.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAPngLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Acércanos la Animación',
42
+ text: 'Pasa los pesados archivos GIF en el recuadro de inserción.',
43
+ },
44
+ {
45
+ name: 'Foto Extraída Perfecta',
46
+ text: 'El sistema paralizará al origen exacto del movimiento, sacando la copia impecable en milisegundos.',
47
+ },
48
+ {
49
+ name: 'Guarda tu Estático',
50
+ text: 'Almacena masivamente en ZIP todo aquel volumen de avatares GIFs estáticos convertidos a PNG.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAPngLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'World Wide Web Consortium: PNG format',
57
+ url: 'https://www.w3.org/TR/png/',
58
+ },
59
+ {
60
+ name: 'CompuServe GIF Information',
61
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAPngLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Convertidor GIF a PNG Online Gratuito',
69
+ },
70
+ {
71
+ type: 'paragraph',
72
+ html:
73
+ 'Convertir GIF a PNG tiene una ventaja significativa sobre convertir a JPG: la preservación de la transparencia. El formato PNG, al igual que algunos GIFs, soporta el canal alfa. Si tu GIF tiene un fondo transparente, el PNG resultante lo conservará con total fidelidad. Esto es especialmente importante para logos, avatares, iconos y cualquier gráfico que se vaya a usar sobre fondos de diferentes colores.',
74
+ },
75
+ {
76
+ type: 'paragraph',
77
+ html:
78
+ 'Otra ventaja del PNG sobre el JPG para este tipo de conversión es la calidad sin pérdida. PNG utiliza compresión sin pérdida, lo que significa que la imagen extraída del GIF mantendrá todos sus detalles sin los artefactos de compresión que introduciría el formato JPG.',
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html:
83
+ 'La conversión se realiza íntegramente en el navegador. El GIF se carga en memoria, se renderiza el primer fotograma en un canvas HTML5 y se exporta como PNG. No se establece ninguna conexión de red durante todo el proceso.',
84
+ },
85
+ {
86
+ type: 'tip',
87
+ html:
88
+ 'Si tienes un GIF de avatar para Discord, Telegram u otras plataformas y necesitas la versión estática en PNG, este convertidor es la herramienta perfecta para obtenerla en segundos.',
89
+ },
90
+ {
91
+ type: 'paragraph',
92
+ html:
93
+ 'Un GIF animado de 500 KB puede producir un PNG del primer fotograma de entre 50 KB y 200 KB, dependiendo de la complejidad y colores de la imagen. Si tiene transparencias, el PNG las preservará perfectamente.',
94
+ },
95
+ {
96
+ type: 'paragraph',
97
+ html:
98
+ 'Convierte GIF a PNG preservando transparencias y sin pérdida de calidad. Extracción del primer fotograma de forma gratuita, privada y local en tu navegador.',
99
+ },
100
+ ];
101
+
102
+ const appSchema: WithContext<SoftwareApplication> = {
103
+ '@context': 'https://schema.org',
104
+ '@type': 'SoftwareApplication',
105
+ name: title,
106
+ description,
107
+ applicationCategory: 'UtilitiesApplication',
108
+ operatingSystem: 'Web',
109
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
110
+ inLanguage: 'es',
111
+ };
112
+
113
+ export const content: GifAPngLocaleContent = {
114
+ slug,
115
+ title,
116
+ description,
117
+ ui,
118
+ seo,
119
+ faq,
120
+ bibliography,
121
+ howTo,
122
+ schemas: [appSchema as any],
123
+ };
@@ -0,0 +1,118 @@
1
+ import type { WithContext, SoftwareApplication } from 'schema-dts';
2
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
3
+ import type { GifAPngLocaleContent } from '../index';
4
+
5
+ const slug = 'convertisseur-gif-en-png';
6
+ const title = 'Convertir GIF en PNG en Ligne | Extraire une Image Statique Sans Perte';
7
+ const description =
8
+ 'Extrayez la première image de vos GIF et convertissez en PNG en préservant la transparence. Sans serveur. Traitement local. Gratuit.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Faites glisser des fichiers GIF...',
12
+ convertText: 'Pour les convertir en PNG instantanément',
13
+ selectFiles: 'Sélectionner des fichiers',
14
+ processedFiles: 'Fichiers traités',
15
+ downloadAll: 'Tout télécharger (.zip)',
16
+ pending: 'En attente',
17
+ bibliographyTitle: 'Références Bibliographiques',
18
+ faqTitle: 'Questions Fréquentes',
19
+ };
20
+
21
+ const faq: GifAPngLocaleContent['faq'] = [
22
+ {
23
+ question: 'Pourquoi convertir un format animé comme GIF en un format statique comme PNG ?',
24
+ answer:
25
+ 'De nombreux réseaux sociaux ou avatars n\'acceptent pas les photographies changeantes. Extraire la première image d\'un GIF complexe vers un PNG de haute qualité résout les barrières de compatibilité et réduit le poids inutile des fichiers.',
26
+ },
27
+ {
28
+ question: 'Les transparences de l\'ancien GIF sont-elles conservées dans le PNG résultant ?',
29
+ answer:
30
+ 'Oui, contrairement au JPG, le format PNG maintient le canal alpha. Si le GIF avait un fond transparent, le PNG le conservera avec des bords nets.',
31
+ },
32
+ {
33
+ question: 'Conservez-vous mes images sur des serveurs après le traitement ?',
34
+ answer:
35
+ 'Aucun serveur ne retient votre GIF ; toute l\'extraction est locale grâce à l\'API Canvas Web. C\'est le processeur de votre PC qui décode en toute sécurité votre fichier sans aucun contact réseau.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAPngLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Apportez-nous l\'animation',
42
+ text: 'Déposez les fichiers GIF lourds dans la boîte d\'insertion.',
43
+ },
44
+ {
45
+ name: 'Photo extraite parfaite',
46
+ text: 'Le système se figera à l\'origine exacte du mouvement, produisant la copie impeccable en millisecondes.',
47
+ },
48
+ {
49
+ name: 'Sauvegardez votre image statique',
50
+ text: 'Stockez en vrac dans ZIP tous ces volumes d\'avatars GIF statiques convertis en PNG.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAPngLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'World Wide Web Consortium: Format PNG',
57
+ url: 'https://www.w3.org/TR/png/',
58
+ },
59
+ {
60
+ name: 'Information GIF CompuServe',
61
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAPngLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Convertisseur GIF vers PNG en Ligne Gratuit',
69
+ },
70
+ {
71
+ type: 'paragraph',
72
+ html:
73
+ 'Convertir GIF en PNG présente un avantage significatif par rapport à la conversion en JPG : la préservation de la transparence. Le PNG, comme certains GIF, supporte le canal alpha. Si votre GIF a un fond transparent, le PNG résultant le préservera avec une totale fidélité.',
74
+ },
75
+ {
76
+ type: 'paragraph',
77
+ html:
78
+ 'Un autre avantage du PNG sur le JPG pour ce type de conversion est la qualité sans perte. Le PNG utilise une compression sans perte, ce qui signifie que l\'image extraite du GIF conservera tous ses détails sans les artefacts de compression que le format JPG introduirait.',
79
+ },
80
+ {
81
+ type: 'tip',
82
+ html:
83
+ 'Si vous avez un avatar GIF animé pour Discord, Telegram ou d\'autres plateformes et avez besoin de la version PNG statique, ce convertisseur est l\'outil parfait pour l\'obtenir en quelques secondes.',
84
+ },
85
+ {
86
+ type: 'paragraph',
87
+ html:
88
+ 'Un GIF animé de 500 Ko peut produire un PNG de la première image entre 50 Ko et 200 Ko, selon la complexité et les couleurs de l\'image. S\'il a de la transparence, le PNG la préservera parfaitement.',
89
+ },
90
+ {
91
+ type: 'paragraph',
92
+ html:
93
+ 'Convertissez GIF en PNG en préservant la transparence et sans perte de qualité. Extraction de la première image gratuitement, en toute confidentialité et localement dans votre navigateur.',
94
+ },
95
+ ];
96
+
97
+ const appSchema: WithContext<SoftwareApplication> = {
98
+ '@context': 'https://schema.org',
99
+ '@type': 'SoftwareApplication',
100
+ name: title,
101
+ description,
102
+ applicationCategory: 'UtilitiesApplication',
103
+ operatingSystem: 'Web',
104
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
105
+ inLanguage: 'fr',
106
+ };
107
+
108
+ export const content: GifAPngLocaleContent = {
109
+ slug,
110
+ title,
111
+ description,
112
+ ui,
113
+ seo,
114
+ faq,
115
+ bibliography,
116
+ howTo,
117
+ schemas: [appSchema as any],
118
+ };
@@ -0,0 +1,29 @@
1
+ import type { ConvertersToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+ import type { ImageConverterUI } from '../../shared/ImageConverter.astro';
3
+ import GifAPngCalculator from './component.astro';
4
+ import GifAPngSEO from './seo.astro';
5
+ import GifAPngBibliography from './bibliography.astro';
6
+
7
+ export type GifAPngLocaleContent = ToolLocaleContent<ImageConverterUI>;
8
+
9
+ export const gifAPng: ConvertersToolEntry<ImageConverterUI> = {
10
+ id: 'gif-a-png',
11
+ icons: {
12
+ bg: 'mdi:file-image',
13
+ fg: 'mdi:file-export',
14
+ },
15
+ i18n: {
16
+ es: () => import('./i18n/es').then((m) => m.content),
17
+ en: () => import('./i18n/en').then((m) => m.content),
18
+ fr: () => import('./i18n/fr').then((m) => m.content),
19
+ },
20
+ };
21
+
22
+ export { GifAPngCalculator, GifAPngSEO, GifAPngBibliography };
23
+
24
+ export const GIF_A_PNG_TOOL: ToolDefinition = {
25
+ entry: gifAPng,
26
+ Component: GifAPngCalculator,
27
+ SEOComponent: GifAPngSEO,
28
+ BibliographyComponent: GifAPngBibliography,
29
+ };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { gifAPng } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await gifAPng.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { gifAWebp } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await gifAWebp.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} title={content.ui.bibliographyTitle} />}
@@ -0,0 +1,8 @@
1
+ ---
2
+ import SharedImageConverter from '../../shared/ImageConverter.astro';
3
+ import type { ImageConverterUI } from '../../shared/ImageConverter.astro';
4
+
5
+ interface Props { ui: ImageConverterUI }
6
+ const { ui } = Astro.props;
7
+ ---
8
+ <SharedImageConverter from="gif" to="webp" ui={ui} />
@@ -0,0 +1,123 @@
1
+ import type { WithContext, SoftwareApplication } from 'schema-dts';
2
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
3
+ import type { GifAWebpLocaleContent } from '../index';
4
+
5
+ const slug = 'gif-to-webp-converter';
6
+ const title = 'Convert GIF to Static WebP | Save File Weight Offline';
7
+ const description =
8
+ 'Convert animated GIFs to static WebP. Preserves transparency. No server. Processed locally in your browser. Free.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Drag GIF files...',
12
+ convertText: 'To convert them to WebP instantly',
13
+ selectFiles: 'Select files',
14
+ processedFiles: 'Processed files',
15
+ downloadAll: 'Download All (.zip)',
16
+ pending: 'Pending',
17
+ bibliographyTitle: 'Bibliographic References',
18
+ faqTitle: 'Frequently Asked Questions',
19
+ };
20
+
21
+ const faq: GifAWebpLocaleContent['faq'] = [
22
+ {
23
+ question: 'Why freeze an animated file to modern static WebP format?',
24
+ answer:
25
+ 'WebP is Google\'s compression standard; it is remarkably lightweight and retains transparency cleanly. Moving from GIF to WebP eliminates the heavy animation and achieves an abysmal gain in web speed.',
26
+ },
27
+ {
28
+ question: 'Will the original avatar remain transparent?',
29
+ answer:
30
+ 'Yes, unlike JPEG, the WebP container respects the complex Alpha channel. All its silhouettes will remain perfect as they were natively.',
31
+ },
32
+ {
33
+ question: 'Where will files be uploaded to?',
34
+ answer:
35
+ 'There is no upload. Processing is performed entirely by the browser\'s Javascript on your PC, with zero remote sending.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAWebpLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Launch an animated avalanche',
42
+ text: 'Move and drop dozens of memes to the delimited zone without remote connection.',
43
+ },
44
+ {
45
+ name: 'Witness the great invisible change',
46
+ text: 'Watch a progressive indicator change at each millisecond as the local canvas decoder generates the output.',
47
+ },
48
+ {
49
+ name: 'Compress or save your clean resulting arsenal',
50
+ text: 'Take the extracted files individually or press Download Zip to package everything.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAWebpLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'GIF89a Specification',
57
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
58
+ },
59
+ {
60
+ name: 'Google WebP Documentation',
61
+ url: 'https://developers.google.com/speed/webp',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAWebpLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Free Online GIF to WebP Converter',
69
+ },
70
+ {
71
+ type: 'paragraph',
72
+ html:
73
+ 'Converting GIF to WebP combines the best features of both formats. GIF can have transparency and multiple frames, while WebP can be static, lighter and with better quality. By extracting the first frame of the GIF and exporting it as WebP, you get a modern, ultra-lightweight image with full transparency support.',
74
+ },
75
+ {
76
+ type: 'paragraph',
77
+ html:
78
+ 'The WebP format offers superior compression both lossy and lossless. For images extracted from GIFs with few colors or large uniform areas, lossless WebP compression can produce extraordinarily small files while maintaining perfect quality.',
79
+ },
80
+ {
81
+ type: 'tip',
82
+ html:
83
+ 'Use GIF to WebP conversion to modernize your collection of animated avatars or stickers: you\'ll get ultra-compressed static images with perfect transparency, ideal for the web.',
84
+ },
85
+ {
86
+ type: 'paragraph',
87
+ html:
88
+ 'A 300 KB GIF can produce a static WebP of the first frame of just 15-50 KB if it has uniform areas and transparency. The size reduction can exceed 80%.',
89
+ },
90
+ {
91
+ type: 'paragraph',
92
+ html:
93
+ 'The entire conversion process happens locally in your browser. The GIF file is decoded in memory, the first frame is rendered on an HTML5 canvas and exported as WebP. No servers are involved, guaranteeing maximum privacy.',
94
+ },
95
+ {
96
+ type: 'paragraph',
97
+ html:
98
+ 'Convert GIF to static WebP for free and offline. Better compression than PNG and JPG, with transparency support. Processed locally without server contact.',
99
+ },
100
+ ];
101
+
102
+ const appSchema: WithContext<SoftwareApplication> = {
103
+ '@context': 'https://schema.org',
104
+ '@type': 'SoftwareApplication',
105
+ name: title,
106
+ description,
107
+ applicationCategory: 'UtilitiesApplication',
108
+ operatingSystem: 'Web',
109
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
110
+ inLanguage: 'en',
111
+ };
112
+
113
+ export const content: GifAWebpLocaleContent = {
114
+ slug,
115
+ title,
116
+ description,
117
+ ui,
118
+ seo,
119
+ faq,
120
+ bibliography,
121
+ howTo,
122
+ schemas: [appSchema as any],
123
+ };
@@ -0,0 +1,123 @@
1
+ import type { WithContext, SoftwareApplication } from 'schema-dts';
2
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
3
+ import type { GifAWebpLocaleContent } from '../index';
4
+
5
+ const slug = 'convertidor-gif-a-webp';
6
+ const title = 'Convertir GIF a WebP estático | Ahorra peso offline';
7
+ const description =
8
+ 'Convierte GIF animados a WebP estático. Conserva transparencias. Sin servidor. Procesado local en tu navegador. Gratis.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Arrastra archivos GIF...',
12
+ convertText: 'Para convertirlos a WebP al instante',
13
+ selectFiles: 'Seleccionar archivos',
14
+ processedFiles: 'Archivos procesados',
15
+ downloadAll: 'Descargar Todo (.zip)',
16
+ pending: 'Pendiente',
17
+ bibliographyTitle: 'Referencias Bibliográficas',
18
+ faqTitle: 'Preguntas Frecuentes',
19
+ };
20
+
21
+ const faq: GifAWebpLocaleContent['faq'] = [
22
+ {
23
+ question: '¿Por qué congelar un archivo movible al formato estático moderno WebP?',
24
+ answer:
25
+ 'El formato WebP es el estándar de compresión de Google; es asombrosamente ligero y retiene transparencias limpiamente. Pasar de GIF a WebP elimina la pesada animación y logra una ganancia abismal en velocidad web.',
26
+ },
27
+ {
28
+ question: '¿Seguirá siendo transparente el avatar originario?',
29
+ answer:
30
+ 'Sí, frente al JPEG, el contenedor WebP respeta el complejo canal Alpha. Todas sus siluetas quedarán perfectas tal como procedían de forma nativa.',
31
+ },
32
+ {
33
+ question: '¿A dónde subirán los archivos?',
34
+ answer:
35
+ 'No hay subida. El procesamiento lo realiza íntegramente el Javascript del navegador en tu PC, en cero envío remoto.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAWebpLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Lanza Un Aluvión Animado',
42
+ text: 'Mueve y suelta decenas de memes a la zona pautada demarcadora sin conexión remota.',
43
+ },
44
+ {
45
+ name: 'Contempla El Magno Cambio Invisible',
46
+ text: 'Percibe una placa progresiva que cambia al milisegundo al generar el decodificador local de lienzo.',
47
+ },
48
+ {
49
+ name: 'Comprime O Guarda Tu Arsenal Resultante Limpio',
50
+ text: 'Llévate individualmente los archivos extraídos o presiona Descargar Zip empaquetando todo.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAWebpLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'GIF89a Specification',
57
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
58
+ },
59
+ {
60
+ name: 'Google WebP Documentation',
61
+ url: 'https://developers.google.com/speed/webp',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAWebpLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Convertidor GIF a WebP Online Gratuito',
69
+ },
70
+ {
71
+ type: 'paragraph',
72
+ html:
73
+ 'Convertir GIF a WebP combina las mejores características de ambos formatos. El GIF puede tener transparencias y múltiples fotogramas, mientras que WebP puede ser estático, más ligero y con mejor calidad. Al extraer el primer fotograma del GIF y exportarlo como WebP, obtienes una imagen moderna, ultraligera y con soporte completo para transparencias.',
74
+ },
75
+ {
76
+ type: 'paragraph',
77
+ html:
78
+ 'El formato WebP ofrece compresión superior tanto con pérdida como sin pérdida. Para imágenes extraídas de GIFs con pocos colores o grandes áreas uniformes, la compresión WebP sin pérdida puede producir archivos extraordinariamente pequeños manteniendo una calidad perfecta.',
79
+ },
80
+ {
81
+ type: 'paragraph',
82
+ html:
83
+ 'Todo el proceso de conversión ocurre localmente en tu navegador. El archivo GIF se decodifica en memoria, se renderiza el primer fotograma en un canvas HTML5 y se exporta como WebP. No hay servidores involucrados, garantizando la máxima privacidad.',
84
+ },
85
+ {
86
+ type: 'tip',
87
+ html:
88
+ 'Usa la conversión GIF a WebP para modernizar tu colección de avatares o stickers animados: obtendrás imágenes estáticas ultra-comprimidas con transparencias perfectas, ideales para web.',
89
+ },
90
+ {
91
+ type: 'paragraph',
92
+ html:
93
+ 'Un GIF de 300 KB puede producir un WebP estático del primer fotograma de apenas 15-50 KB si tiene áreas uniformes y transparencias. La reducción de tamaño puede superar el 80%.',
94
+ },
95
+ {
96
+ type: 'paragraph',
97
+ html:
98
+ 'Convierte GIF a WebP estático gratis y offline. Mejor compresión que PNG y JPG, con soporte de transparencias. Procesado localmente sin contacto con servidores.',
99
+ },
100
+ ];
101
+
102
+ const appSchema: WithContext<SoftwareApplication> = {
103
+ '@context': 'https://schema.org',
104
+ '@type': 'SoftwareApplication',
105
+ name: title,
106
+ description,
107
+ applicationCategory: 'UtilitiesApplication',
108
+ operatingSystem: 'Web',
109
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
110
+ inLanguage: 'es',
111
+ };
112
+
113
+ export const content: GifAWebpLocaleContent = {
114
+ slug,
115
+ title,
116
+ description,
117
+ ui,
118
+ seo,
119
+ faq,
120
+ bibliography,
121
+ howTo,
122
+ schemas: [appSchema as any],
123
+ };
@@ -0,0 +1,118 @@
1
+ import type { WithContext, SoftwareApplication } from 'schema-dts';
2
+ import type { ImageConverterUI } from '../../../shared/ImageConverter.astro';
3
+ import type { GifAWebpLocaleContent } from '../index';
4
+
5
+ const slug = 'convertisseur-gif-en-webp';
6
+ const title = 'Convertir GIF en WebP Statique | Économisez du Poids Hors Ligne';
7
+ const description =
8
+ 'Convertissez des GIF animés en WebP statique. Préserve la transparence. Sans serveur. Traitement local dans votre navigateur. Gratuit.';
9
+
10
+ const ui: ImageConverterUI = {
11
+ dragText: 'Faites glisser des fichiers GIF...',
12
+ convertText: 'Pour les convertir en WebP instantanément',
13
+ selectFiles: 'Sélectionner des fichiers',
14
+ processedFiles: 'Fichiers traités',
15
+ downloadAll: 'Tout télécharger (.zip)',
16
+ pending: 'En attente',
17
+ bibliographyTitle: 'Références Bibliographiques',
18
+ faqTitle: 'Questions Fréquentes',
19
+ };
20
+
21
+ const faq: GifAWebpLocaleContent['faq'] = [
22
+ {
23
+ question: 'Pourquoi figer un fichier animé au format statique moderne WebP ?',
24
+ answer:
25
+ 'WebP est le standard de compression de Google ; il est remarquablement léger et conserve la transparence proprement. Passer de GIF à WebP élimine l\'animation lourde et réalise un gain abyssal en vitesse web.',
26
+ },
27
+ {
28
+ question: 'L\'avatar original restera-t-il transparent ?',
29
+ answer:
30
+ 'Oui, contrairement au JPEG, le conteneur WebP respecte le canal Alpha complexe. Toutes ses silhouettes resteront parfaites comme elles l\'étaient nativement.',
31
+ },
32
+ {
33
+ question: 'Où les fichiers seront-ils téléchargés ?',
34
+ answer:
35
+ 'Il n\'y a pas de téléchargement. Le traitement est effectué entièrement par le Javascript du navigateur sur votre PC, avec zéro envoi distant.',
36
+ },
37
+ ];
38
+
39
+ const howTo: GifAWebpLocaleContent['howTo'] = [
40
+ {
41
+ name: 'Lancez une avalanche animée',
42
+ text: 'Déplacez et déposez des dizaines de mèmes dans la zone délimitée sans connexion distante.',
43
+ },
44
+ {
45
+ name: 'Contemplez le grand changement invisible',
46
+ text: 'Regardez un indicateur progressif changer à chaque milliseconde pendant que le décodeur de canvas local génère la sortie.',
47
+ },
48
+ {
49
+ name: 'Compressez ou sauvegardez votre arsenal résultant propre',
50
+ text: 'Prenez les fichiers extraits individuellement ou appuyez sur Télécharger Zip pour tout emballer.',
51
+ },
52
+ ];
53
+
54
+ const bibliography: GifAWebpLocaleContent['bibliography'] = [
55
+ {
56
+ name: 'Spécification GIF89a',
57
+ url: 'https://www.w3.org/Graphics/GIF/spec-gif89a.txt',
58
+ },
59
+ {
60
+ name: 'Documentation Google WebP',
61
+ url: 'https://developers.google.com/speed/webp',
62
+ },
63
+ ];
64
+
65
+ const seo: GifAWebpLocaleContent['seo'] = [
66
+ {
67
+ type: 'title',
68
+ text: 'Convertisseur GIF vers WebP en Ligne Gratuit',
69
+ },
70
+ {
71
+ type: 'paragraph',
72
+ html:
73
+ 'Convertir GIF en WebP combine les meilleures caractéristiques des deux formats. Le GIF peut avoir de la transparence et plusieurs images, tandis que WebP peut être statique, plus léger et de meilleure qualité. En extrayant la première image du GIF et en l\'exportant en WebP, vous obtenez une image moderne, ultra-légère avec support complet de la transparence.',
74
+ },
75
+ {
76
+ type: 'paragraph',
77
+ html:
78
+ 'Le format WebP offre une compression supérieure avec et sans perte. Pour les images extraites de GIF avec peu de couleurs ou de grandes zones uniformes, la compression WebP sans perte peut produire des fichiers extraordinairement petits tout en maintenant une qualité parfaite.',
79
+ },
80
+ {
81
+ type: 'tip',
82
+ html:
83
+ 'Utilisez la conversion GIF vers WebP pour moderniser votre collection d\'avatars animés ou de stickers : vous obtiendrez des images statiques ultra-compressées avec une transparence parfaite, idéales pour le web.',
84
+ },
85
+ {
86
+ type: 'paragraph',
87
+ html:
88
+ 'Un GIF de 300 Ko peut produire un WebP statique de la première image de seulement 15-50 Ko s\'il a des zones uniformes et de la transparence. La réduction de taille peut dépasser 80%.',
89
+ },
90
+ {
91
+ type: 'paragraph',
92
+ html:
93
+ 'Convertissez GIF en WebP statique gratuitement et hors ligne. Meilleure compression que PNG et JPG, avec support de transparence. Traitement local sans contact avec les serveurs.',
94
+ },
95
+ ];
96
+
97
+ const appSchema: WithContext<SoftwareApplication> = {
98
+ '@context': 'https://schema.org',
99
+ '@type': 'SoftwareApplication',
100
+ name: title,
101
+ description,
102
+ applicationCategory: 'UtilitiesApplication',
103
+ operatingSystem: 'Web',
104
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
105
+ inLanguage: 'fr',
106
+ };
107
+
108
+ export const content: GifAWebpLocaleContent = {
109
+ slug,
110
+ title,
111
+ description,
112
+ ui,
113
+ seo,
114
+ faq,
115
+ bibliography,
116
+ howTo,
117
+ schemas: [appSchema as any],
118
+ };