@jjlmoya/utils-developer 1.2.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 (228) hide show
  1. package/package.json +64 -0
  2. package/src/category/i18n/en.ts +34 -0
  3. package/src/category/i18n/es.ts +34 -0
  4. package/src/category/i18n/fr.ts +34 -0
  5. package/src/category/index.ts +31 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +78 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +251 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/css_specificity_logic.test.ts +39 -0
  17. package/src/tests/faq_count.test.ts +19 -0
  18. package/src/tests/locale_completeness.test.ts +42 -0
  19. package/src/tests/mocks/astro_mock.js +2 -0
  20. package/src/tests/no_h1_in_components.test.ts +48 -0
  21. package/src/tests/schemas_fulfillment.test.ts +23 -0
  22. package/src/tests/seo_length.test.ts +22 -0
  23. package/src/tests/title_quality.test.ts +55 -0
  24. package/src/tests/tool_validation.test.ts +17 -0
  25. package/src/tool/aspectRatio/bibliography.astro +14 -0
  26. package/src/tool/aspectRatio/component.astro +468 -0
  27. package/src/tool/aspectRatio/i18n/en.ts +177 -0
  28. package/src/tool/aspectRatio/i18n/es.ts +177 -0
  29. package/src/tool/aspectRatio/i18n/fr.ts +177 -0
  30. package/src/tool/aspectRatio/index.ts +34 -0
  31. package/src/tool/aspectRatio/seo.astro +14 -0
  32. package/src/tool/aspectRatio/ui.ts +12 -0
  33. package/src/tool/calculadoraTiempoDatos/bibliography.astro +14 -0
  34. package/src/tool/calculadoraTiempoDatos/component.astro +829 -0
  35. package/src/tool/calculadoraTiempoDatos/i18n/en.ts +150 -0
  36. package/src/tool/calculadoraTiempoDatos/i18n/es.ts +163 -0
  37. package/src/tool/calculadoraTiempoDatos/i18n/fr.ts +150 -0
  38. package/src/tool/calculadoraTiempoDatos/index.ts +33 -0
  39. package/src/tool/calculadoraTiempoDatos/seo.astro +14 -0
  40. package/src/tool/calculadoraTiempoDatos/ui.ts +24 -0
  41. package/src/tool/colorConverter/bibliography.astro +14 -0
  42. package/src/tool/colorConverter/component.astro +504 -0
  43. package/src/tool/colorConverter/i18n/en.ts +126 -0
  44. package/src/tool/colorConverter/i18n/es.ts +126 -0
  45. package/src/tool/colorConverter/i18n/fr.ts +126 -0
  46. package/src/tool/colorConverter/index.ts +33 -0
  47. package/src/tool/colorConverter/seo.astro +14 -0
  48. package/src/tool/colorConverter/ui.ts +16 -0
  49. package/src/tool/conversorExcelCsvHtml/bibliography.astro +14 -0
  50. package/src/tool/conversorExcelCsvHtml/component.astro +595 -0
  51. package/src/tool/conversorExcelCsvHtml/i18n/en.ts +129 -0
  52. package/src/tool/conversorExcelCsvHtml/i18n/es.ts +129 -0
  53. package/src/tool/conversorExcelCsvHtml/i18n/fr.ts +129 -0
  54. package/src/tool/conversorExcelCsvHtml/index.ts +33 -0
  55. package/src/tool/conversorExcelCsvHtml/seo.astro +14 -0
  56. package/src/tool/conversorExcelCsvHtml/ui.ts +14 -0
  57. package/src/tool/cronGenerator/bibliography.astro +14 -0
  58. package/src/tool/cronGenerator/component.astro +667 -0
  59. package/src/tool/cronGenerator/i18n/en.ts +191 -0
  60. package/src/tool/cronGenerator/i18n/es.ts +191 -0
  61. package/src/tool/cronGenerator/i18n/fr.ts +191 -0
  62. package/src/tool/cronGenerator/index.ts +34 -0
  63. package/src/tool/cronGenerator/seo.astro +14 -0
  64. package/src/tool/cronGenerator/ui.ts +45 -0
  65. package/src/tool/cssSpecificityCalculator/bibliography.astro +14 -0
  66. package/src/tool/cssSpecificityCalculator/component.astro +292 -0
  67. package/src/tool/cssSpecificityCalculator/i18n/en.ts +168 -0
  68. package/src/tool/cssSpecificityCalculator/i18n/es.ts +168 -0
  69. package/src/tool/cssSpecificityCalculator/i18n/fr.ts +168 -0
  70. package/src/tool/cssSpecificityCalculator/index.ts +34 -0
  71. package/src/tool/cssSpecificityCalculator/logic.ts +100 -0
  72. package/src/tool/cssSpecificityCalculator/seo.astro +14 -0
  73. package/src/tool/cssSpecificityCalculator/ui-controller.ts +57 -0
  74. package/src/tool/cssSpecificityCalculator/ui.ts +11 -0
  75. package/src/tool/cssToInlineConverter/bibliography.astro +14 -0
  76. package/src/tool/cssToInlineConverter/component.astro +308 -0
  77. package/src/tool/cssToInlineConverter/i18n/en.ts +160 -0
  78. package/src/tool/cssToInlineConverter/i18n/es.ts +160 -0
  79. package/src/tool/cssToInlineConverter/i18n/fr.ts +160 -0
  80. package/src/tool/cssToInlineConverter/index.ts +34 -0
  81. package/src/tool/cssToInlineConverter/seo.astro +14 -0
  82. package/src/tool/cssToInlineConverter/ui.ts +12 -0
  83. package/src/tool/duplicateCssRemover/bibliography.astro +14 -0
  84. package/src/tool/duplicateCssRemover/component.astro +353 -0
  85. package/src/tool/duplicateCssRemover/i18n/en.ts +167 -0
  86. package/src/tool/duplicateCssRemover/i18n/es.ts +167 -0
  87. package/src/tool/duplicateCssRemover/i18n/fr.ts +167 -0
  88. package/src/tool/duplicateCssRemover/index.ts +34 -0
  89. package/src/tool/duplicateCssRemover/seo.astro +14 -0
  90. package/src/tool/duplicateCssRemover/ui.ts +12 -0
  91. package/src/tool/generadorSecurityTxt/bibliography.astro +14 -0
  92. package/src/tool/generadorSecurityTxt/component.astro +473 -0
  93. package/src/tool/generadorSecurityTxt/i18n/en.ts +173 -0
  94. package/src/tool/generadorSecurityTxt/i18n/es.ts +173 -0
  95. package/src/tool/generadorSecurityTxt/i18n/fr.ts +173 -0
  96. package/src/tool/generadorSecurityTxt/index.ts +33 -0
  97. package/src/tool/generadorSecurityTxt/seo.astro +14 -0
  98. package/src/tool/generadorSecurityTxt/ui.ts +27 -0
  99. package/src/tool/hashGenerator/bibliography.astro +14 -0
  100. package/src/tool/hashGenerator/component.astro +367 -0
  101. package/src/tool/hashGenerator/i18n/en.ts +118 -0
  102. package/src/tool/hashGenerator/i18n/es.ts +118 -0
  103. package/src/tool/hashGenerator/i18n/fr.ts +118 -0
  104. package/src/tool/hashGenerator/index.ts +33 -0
  105. package/src/tool/hashGenerator/md5.ts +138 -0
  106. package/src/tool/hashGenerator/seo.astro +14 -0
  107. package/src/tool/hashGenerator/ui.ts +11 -0
  108. package/src/tool/inspectorCertificadosSsl/bibliography.astro +14 -0
  109. package/src/tool/inspectorCertificadosSsl/component.astro +580 -0
  110. package/src/tool/inspectorCertificadosSsl/i18n/en.ts +214 -0
  111. package/src/tool/inspectorCertificadosSsl/i18n/es.ts +214 -0
  112. package/src/tool/inspectorCertificadosSsl/i18n/fr.ts +214 -0
  113. package/src/tool/inspectorCertificadosSsl/index.ts +33 -0
  114. package/src/tool/inspectorCertificadosSsl/seo.astro +14 -0
  115. package/src/tool/inspectorCertificadosSsl/ui.ts +29 -0
  116. package/src/tool/jsonFormatter/bibliography.astro +14 -0
  117. package/src/tool/jsonFormatter/component.astro +590 -0
  118. package/src/tool/jsonFormatter/i18n/en.ts +156 -0
  119. package/src/tool/jsonFormatter/i18n/es.ts +156 -0
  120. package/src/tool/jsonFormatter/i18n/fr.ts +156 -0
  121. package/src/tool/jsonFormatter/index.ts +34 -0
  122. package/src/tool/jsonFormatter/seo.astro +14 -0
  123. package/src/tool/jsonFormatter/ui.ts +15 -0
  124. package/src/tool/keycode/bibliography.astro +14 -0
  125. package/src/tool/keycode/component.astro +540 -0
  126. package/src/tool/keycode/i18n/en.ts +160 -0
  127. package/src/tool/keycode/i18n/es.ts +160 -0
  128. package/src/tool/keycode/i18n/fr.ts +160 -0
  129. package/src/tool/keycode/index.ts +34 -0
  130. package/src/tool/keycode/seo.astro +14 -0
  131. package/src/tool/keycode/ui.ts +10 -0
  132. package/src/tool/llmCostCalculator/bibliography.astro +14 -0
  133. package/src/tool/llmCostCalculator/component.astro +488 -0
  134. package/src/tool/llmCostCalculator/data.ts +99 -0
  135. package/src/tool/llmCostCalculator/i18n/en.ts +165 -0
  136. package/src/tool/llmCostCalculator/i18n/es.ts +165 -0
  137. package/src/tool/llmCostCalculator/i18n/fr.ts +165 -0
  138. package/src/tool/llmCostCalculator/index.ts +34 -0
  139. package/src/tool/llmCostCalculator/seo.astro +14 -0
  140. package/src/tool/llmCostCalculator/ui.ts +11 -0
  141. package/src/tool/mobileMockupGenerator/app.ts +614 -0
  142. package/src/tool/mobileMockupGenerator/bibliography.astro +14 -0
  143. package/src/tool/mobileMockupGenerator/component.astro +1044 -0
  144. package/src/tool/mobileMockupGenerator/constants.ts +48 -0
  145. package/src/tool/mobileMockupGenerator/i18n/en.ts +121 -0
  146. package/src/tool/mobileMockupGenerator/i18n/es.ts +121 -0
  147. package/src/tool/mobileMockupGenerator/i18n/fr.ts +121 -0
  148. package/src/tool/mobileMockupGenerator/index.ts +33 -0
  149. package/src/tool/mobileMockupGenerator/rendering.ts +189 -0
  150. package/src/tool/mobileMockupGenerator/seo.astro +14 -0
  151. package/src/tool/mobileMockupGenerator/store.ts +145 -0
  152. package/src/tool/mobileMockupGenerator/types.ts +41 -0
  153. package/src/tool/mobileMockupGenerator/ui.ts +48 -0
  154. package/src/tool/musicalTypography/bibliography.astro +14 -0
  155. package/src/tool/musicalTypography/component.astro +480 -0
  156. package/src/tool/musicalTypography/i18n/en.ts +179 -0
  157. package/src/tool/musicalTypography/i18n/es.ts +179 -0
  158. package/src/tool/musicalTypography/i18n/fr.ts +179 -0
  159. package/src/tool/musicalTypography/index.ts +33 -0
  160. package/src/tool/musicalTypography/seo.astro +14 -0
  161. package/src/tool/musicalTypography/ui.ts +25 -0
  162. package/src/tool/placeholderGenerator/bibliography.astro +14 -0
  163. package/src/tool/placeholderGenerator/component.astro +499 -0
  164. package/src/tool/placeholderGenerator/i18n/en.ts +176 -0
  165. package/src/tool/placeholderGenerator/i18n/es.ts +176 -0
  166. package/src/tool/placeholderGenerator/i18n/fr.ts +176 -0
  167. package/src/tool/placeholderGenerator/index.ts +34 -0
  168. package/src/tool/placeholderGenerator/seo.astro +14 -0
  169. package/src/tool/placeholderGenerator/ui.ts +14 -0
  170. package/src/tool/promptLibrary/bibliography.astro +14 -0
  171. package/src/tool/promptLibrary/component.astro +1131 -0
  172. package/src/tool/promptLibrary/controller.ts +49 -0
  173. package/src/tool/promptLibrary/i18n/en.ts +131 -0
  174. package/src/tool/promptLibrary/i18n/es.ts +131 -0
  175. package/src/tool/promptLibrary/i18n/fr.ts +126 -0
  176. package/src/tool/promptLibrary/index.ts +33 -0
  177. package/src/tool/promptLibrary/seo.astro +14 -0
  178. package/src/tool/promptLibrary/ui.ts +29 -0
  179. package/src/tool/readabilityCalculator/bibliography.astro +14 -0
  180. package/src/tool/readabilityCalculator/component.astro +534 -0
  181. package/src/tool/readabilityCalculator/i18n/en.ts +133 -0
  182. package/src/tool/readabilityCalculator/i18n/es.ts +133 -0
  183. package/src/tool/readabilityCalculator/i18n/fr.ts +133 -0
  184. package/src/tool/readabilityCalculator/index.ts +33 -0
  185. package/src/tool/readabilityCalculator/seo.astro +14 -0
  186. package/src/tool/readabilityCalculator/ui.ts +27 -0
  187. package/src/tool/svgSanitizer/bibliography.astro +14 -0
  188. package/src/tool/svgSanitizer/component.astro +554 -0
  189. package/src/tool/svgSanitizer/i18n/en.ts +125 -0
  190. package/src/tool/svgSanitizer/i18n/es.ts +125 -0
  191. package/src/tool/svgSanitizer/i18n/fr.ts +125 -0
  192. package/src/tool/svgSanitizer/index.ts +33 -0
  193. package/src/tool/svgSanitizer/seo.astro +14 -0
  194. package/src/tool/svgSanitizer/ui.ts +18 -0
  195. package/src/tool/svgToCss/bibliography.astro +14 -0
  196. package/src/tool/svgToCss/component.astro +381 -0
  197. package/src/tool/svgToCss/i18n/en.ts +174 -0
  198. package/src/tool/svgToCss/i18n/es.ts +174 -0
  199. package/src/tool/svgToCss/i18n/fr.ts +174 -0
  200. package/src/tool/svgToCss/index.ts +34 -0
  201. package/src/tool/svgToCss/seo.astro +14 -0
  202. package/src/tool/svgToCss/ui.ts +13 -0
  203. package/src/tool/urlCleaner/bibliography.astro +14 -0
  204. package/src/tool/urlCleaner/component.astro +458 -0
  205. package/src/tool/urlCleaner/i18n/en.ts +116 -0
  206. package/src/tool/urlCleaner/i18n/es.ts +116 -0
  207. package/src/tool/urlCleaner/i18n/fr.ts +116 -0
  208. package/src/tool/urlCleaner/index.ts +33 -0
  209. package/src/tool/urlCleaner/seo.astro +14 -0
  210. package/src/tool/urlCleaner/ui.ts +12 -0
  211. package/src/tool/urlEncoderDecoder/bibliography.astro +14 -0
  212. package/src/tool/urlEncoderDecoder/component.astro +291 -0
  213. package/src/tool/urlEncoderDecoder/i18n/en.ts +162 -0
  214. package/src/tool/urlEncoderDecoder/i18n/es.ts +162 -0
  215. package/src/tool/urlEncoderDecoder/i18n/fr.ts +162 -0
  216. package/src/tool/urlEncoderDecoder/index.ts +34 -0
  217. package/src/tool/urlEncoderDecoder/seo.astro +14 -0
  218. package/src/tool/urlEncoderDecoder/ui.ts +11 -0
  219. package/src/tool/utmGenerator/bibliography.astro +14 -0
  220. package/src/tool/utmGenerator/component.astro +270 -0
  221. package/src/tool/utmGenerator/i18n/en.ts +117 -0
  222. package/src/tool/utmGenerator/i18n/es.ts +117 -0
  223. package/src/tool/utmGenerator/i18n/fr.ts +117 -0
  224. package/src/tool/utmGenerator/index.ts +33 -0
  225. package/src/tool/utmGenerator/seo.astro +14 -0
  226. package/src/tool/utmGenerator/ui.ts +13 -0
  227. package/src/tools.ts +27 -0
  228. package/src/types.ts +72 -0
@@ -0,0 +1,174 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { SvgToCssUI } from '../ui';
4
+
5
+ const slug = 'convertidor-svg-css';
6
+ const title = 'Convertidor de SVG a CSS y Data URI. Optimización Web';
7
+ const description =
8
+ 'Transforma tus iconos y vectores SVG en código CSS (Background o Mask) o Data URI comprimido. Optimiza el rendimiento de tu web eliminando peticiones HTTP externas.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '¿Es mejor usar Data URI o un archivo .svg externo?',
13
+ answer:
14
+ 'Depende del uso. Los Data URIs eliminan peticiones HTTP (ideal para iconos pequeños), pero aumentan el tamaño del CSS. Para ilustraciones grandes o ricas en detalles, es preferible un archivo externo.',
15
+ },
16
+ {
17
+ question: '¿Cómo cambio el color de un SVG incrustado en CSS?',
18
+ answer:
19
+ "La mejor forma es mediante 'mask-image'. Al definir el SVG como una máscara, puedes usar 'background-color' para cambiar su color dinámicamente, incluso en estados :hover.",
20
+ },
21
+ {
22
+ question: '¿Qué navegadores soportan las Máscaras CSS?',
23
+ answer:
24
+ 'Todos los navegadores modernos (Chrome, Firefox, Safari, Edge) tienen soporte completo. Para navegadores antiguos se suelen usar prefijos -webkit-.',
25
+ },
26
+ {
27
+ question: '¿Afecta el uso de Data URIs al SEO?',
28
+ answer:
29
+ 'Sí, de forma positiva. Al reducir el número de peticiones necesarias para renderizar la página, mejora el tiempo de carga (LCP) y la puntuación en Core Web Vitals.',
30
+ },
31
+ {
32
+ question: '¿Puedo usarlo en frameworks como React o Tailwind?',
33
+ answer:
34
+ '¡Por supuesto! Puedes copiar el código generado y usarlo en tus archivos .css o incluso como valores arbitrarios en Tailwind CSS.',
35
+ },
36
+ ];
37
+
38
+ const howToData = [
39
+ {
40
+ name: 'Pegar el SVG',
41
+ text: 'Copia el código fuente de tu archivo SVG y pégalo en el área de texto de la izquierda.',
42
+ },
43
+ {
44
+ name: 'Elegir el tipo de salida',
45
+ text: 'Selecciona entre Background Image (para fondos estáticos), CSS Mask (para iconos con color dinámico) o Solo Data URI (para uso directo).',
46
+ },
47
+ {
48
+ name: 'Copiar el resultado',
49
+ text: 'Haz clic en "Copiar" para llevar el código CSS generado a tu portapapeles.',
50
+ },
51
+ {
52
+ name: 'Aplicar en tu proyecto',
53
+ text: 'Pega el código en tu hoja de estilos o componente CSS. Para Masks, añade también background-color para definir el color del icono.',
54
+ },
55
+ ];
56
+
57
+ const faqSchema: WithContext<FAQPage> = {
58
+ '@context': 'https://schema.org',
59
+ '@type': 'FAQPage',
60
+ mainEntity: faqData.map((item) => ({
61
+ '@type': 'Question',
62
+ name: item.question,
63
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
64
+ })),
65
+ };
66
+
67
+ const howToSchema: WithContext<HowToThing> = {
68
+ '@context': 'https://schema.org',
69
+ '@type': 'HowTo',
70
+ name: title,
71
+ description,
72
+ step: howToData.map((step, i) => ({
73
+ '@type': 'HowToStep',
74
+ position: i + 1,
75
+ name: step.name,
76
+ text: step.text,
77
+ })),
78
+ };
79
+
80
+ const appSchema: WithContext<SoftwareApplication> = {
81
+ '@context': 'https://schema.org',
82
+ '@type': 'SoftwareApplication',
83
+ name: title,
84
+ description,
85
+ applicationCategory: 'UtilityApplication',
86
+ operatingSystem: 'All',
87
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
88
+ inLanguage: 'es',
89
+ };
90
+
91
+ const ui: SvgToCssUI = {
92
+ labelPasteTitle: 'Pegar SVG',
93
+ labelInputArea: 'Código Fuente SVG',
94
+ labelPreviewOriginal: 'Vista Previa Original',
95
+ labelResultTitle: 'Resultado CSS',
96
+ labelPreviewApplied: 'Resultado Aplicado',
97
+ tabBackground: 'Background Image',
98
+ tabMask: 'CSS Mask / Webkit',
99
+ tabUri: 'Solo Data URI',
100
+ btnCopy: 'Copiar',
101
+ btnCopied: '¡Copiado!',
102
+ placeholder: '<svg xmlns="http://www.w3.org/2000/svg" ...',
103
+ };
104
+
105
+ export const content: ToolLocaleContent<SvgToCssUI> = {
106
+ slug,
107
+ title,
108
+ description,
109
+ ui,
110
+ faqTitle: 'Preguntas Frecuentes',
111
+ faq: faqData,
112
+ bibliographyTitle: 'Referencias y Documentación',
113
+ bibliography: [
114
+ {
115
+ name: 'CSS-Tricks: Using SVG as Background',
116
+ url: 'https://css-tricks.com/using-svg/',
117
+ },
118
+ {
119
+ name: 'MDN Web Docs: mask-image',
120
+ url: 'https://developer.mozilla.org/es/docs/Web/CSS/mask-image',
121
+ },
122
+ {
123
+ name: 'MDN Web Docs: background-image',
124
+ url: 'https://developer.mozilla.org/es/docs/Web/CSS/background-image',
125
+ },
126
+ {
127
+ name: 'W3C: CSS Masking Module Level 1',
128
+ url: 'https://www.w3.org/TR/css-masking-1/',
129
+ },
130
+ ],
131
+ howTo: howToData,
132
+ schemas: [faqSchema, howToSchema, appSchema],
133
+ seo: [
134
+ {
135
+ type: 'title',
136
+ text: '¿Por qué convertir SVG a CSS Data URI?',
137
+ level: 2,
138
+ },
139
+ {
140
+ type: 'paragraph',
141
+ html: 'En el desarrollo web moderno, optimizar el rendimiento y la carga de recursos es fundamental. Insertar iconos directamente en el CSS mediante <strong>Data URIs</strong> elimina peticiones HTTP innecesarias, lo que reduce la latencia y mejora el tiempo hasta que la página es interactiva (TTI).',
142
+ },
143
+ {
144
+ type: 'paragraph',
145
+ html: 'Esta herramienta transforma el código vectorial <code>&lt;svg&gt;</code> en una cadena de texto codificada que el navegador puede interpretar como una imagen de fondo o una máscara de recorte, manteniendo la escalabilidad infinita y la nitidez característica de los vectores.',
146
+ },
147
+ {
148
+ type: 'title',
149
+ text: 'Beneficios Técnicos Principales',
150
+ level: 3,
151
+ },
152
+ {
153
+ type: 'list',
154
+ items: [
155
+ '<strong>Cero Peticiones HTTP:</strong> Al integrar el gráfico en tus archivos <code>.css</code>, el navegador no necesita descargar archivos externos adicionales.',
156
+ '<strong>Personalización vía CSS Mask:</strong> Usando la técnica de <code>mask-image</code>, puedes cambiar el color de un icono vectorial complejo simplemente usando <code>background-color</code>.',
157
+ '<strong>Renderizado Inmediato:</strong> Evitas el parpadeo de contenido (FOUC) ya que los recursos visuales críticos están disponibles tan pronto como se descarga la hoja de estilos.',
158
+ ],
159
+ },
160
+ {
161
+ type: 'title',
162
+ text: 'Máscaras CSS (CSS Masks) vs Backgrounds',
163
+ level: 3,
164
+ },
165
+ {
166
+ type: 'paragraph',
167
+ html: 'Mucha gente usa simplemente <code>background-image</code> para incrustar vectores, pero esto tiene una limitación: no puedes cambiar el color del SVG dinámicamente desde CSS.',
168
+ },
169
+ {
170
+ type: 'paragraph',
171
+ html: 'Nuestra utilidad soporta la generación de código para <strong>Máscaras CSS</strong>. Al aplicar un <code>mask-image</code> con el Data URI generado, el icono actúa como un estencil, permitiendo que el <code>background-color</code> del elemento defina el color final del icono. Es la forma más profesional y flexible de gestionar iconos en Astro, Next.js o cualquier framework moderno.',
172
+ },
173
+ ],
174
+ };
@@ -0,0 +1,174 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { SvgToCssUI } from '../ui';
4
+
5
+ const slug = 'convertisseur-svg-css';
6
+ const title = 'Convertisseur SVG vers CSS et Data URI. Optimisation Web';
7
+ const description =
8
+ "Transformez vos icônes et vecteurs SVG en code CSS (Background ou Mask) ou Data URI compressé. Optimisez les performances de votre site en éliminant les requêtes HTTP externes.";
9
+
10
+ const faqData = [
11
+ {
12
+ question: "Vaut-il mieux utiliser un Data URI ou un fichier .svg externe ?",
13
+ answer:
14
+ "Cela dépend de l'usage. Les Data URIs éliminent les requêtes HTTP (idéal pour les petites icônes), mais augmentent la taille du CSS. Pour les illustrations grandes ou riches en détails, un fichier externe est préférable.",
15
+ },
16
+ {
17
+ question: "Comment changer la couleur d'un SVG intégré en CSS ?",
18
+ answer:
19
+ "La meilleure façon est via 'mask-image'. En définissant le SVG comme un masque, vous pouvez utiliser 'background-color' pour changer sa couleur dynamiquement, même dans les états :hover.",
20
+ },
21
+ {
22
+ question: 'Quels navigateurs supportent les masques CSS ?',
23
+ answer:
24
+ 'Tous les navigateurs modernes (Chrome, Firefox, Safari, Edge) ont un support complet. Pour les navigateurs plus anciens, les préfixes -webkit- sont couramment utilisés.',
25
+ },
26
+ {
27
+ question: "L'utilisation de Data URIs affecte-t-elle le SEO ?",
28
+ answer:
29
+ "Oui, positivement. En réduisant le nombre de requêtes nécessaires au rendu de la page, cela améliore le temps de chargement (LCP) et les scores Core Web Vitals.",
30
+ },
31
+ {
32
+ question: "Puis-je l'utiliser dans des frameworks comme React ou Tailwind ?",
33
+ answer:
34
+ "Absolument ! Vous pouvez copier le code généré et l'utiliser dans vos fichiers .css ou même comme valeurs arbitraires dans Tailwind CSS.",
35
+ },
36
+ ];
37
+
38
+ const howToData = [
39
+ {
40
+ name: 'Coller le SVG',
41
+ text: 'Copiez le code source de votre fichier SVG et collez-le dans la zone de texte à gauche.',
42
+ },
43
+ {
44
+ name: "Choisir le type de sortie",
45
+ text: "Sélectionnez entre Background Image (pour les fonds statiques), CSS Mask (pour les icônes avec couleur dynamique) ou Data URI uniquement (pour utilisation directe).",
46
+ },
47
+ {
48
+ name: 'Copier le résultat',
49
+ text: 'Cliquez sur "Copier" pour transférer le code CSS généré dans votre presse-papiers.',
50
+ },
51
+ {
52
+ name: 'Appliquer dans votre projet',
53
+ text: 'Collez le code dans votre feuille de styles ou composant CSS. Pour les masques, ajoutez également background-color pour définir la couleur de l\'icône.',
54
+ },
55
+ ];
56
+
57
+ const faqSchema: WithContext<FAQPage> = {
58
+ '@context': 'https://schema.org',
59
+ '@type': 'FAQPage',
60
+ mainEntity: faqData.map((item) => ({
61
+ '@type': 'Question',
62
+ name: item.question,
63
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
64
+ })),
65
+ };
66
+
67
+ const howToSchema: WithContext<HowToThing> = {
68
+ '@context': 'https://schema.org',
69
+ '@type': 'HowTo',
70
+ name: title,
71
+ description,
72
+ step: howToData.map((step, i) => ({
73
+ '@type': 'HowToStep',
74
+ position: i + 1,
75
+ name: step.name,
76
+ text: step.text,
77
+ })),
78
+ };
79
+
80
+ const appSchema: WithContext<SoftwareApplication> = {
81
+ '@context': 'https://schema.org',
82
+ '@type': 'SoftwareApplication',
83
+ name: title,
84
+ description,
85
+ applicationCategory: 'UtilityApplication',
86
+ operatingSystem: 'All',
87
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
88
+ inLanguage: 'fr',
89
+ };
90
+
91
+ const ui: SvgToCssUI = {
92
+ labelPasteTitle: 'Coller le SVG',
93
+ labelInputArea: 'Code Source SVG',
94
+ labelPreviewOriginal: 'Aperçu Original',
95
+ labelResultTitle: 'Résultat CSS',
96
+ labelPreviewApplied: 'Résultat Appliqué',
97
+ tabBackground: 'Background Image',
98
+ tabMask: 'CSS Mask / Webkit',
99
+ tabUri: 'Data URI uniquement',
100
+ btnCopy: 'Copier',
101
+ btnCopied: 'Copié !',
102
+ placeholder: '<svg xmlns="http://www.w3.org/2000/svg" ...',
103
+ };
104
+
105
+ export const content: ToolLocaleContent<SvgToCssUI> = {
106
+ slug,
107
+ title,
108
+ description,
109
+ ui,
110
+ faqTitle: 'Questions Fréquentes',
111
+ faq: faqData,
112
+ bibliographyTitle: 'Références et Documentation',
113
+ bibliography: [
114
+ {
115
+ name: 'CSS-Tricks: Using SVG as Background',
116
+ url: 'https://css-tricks.com/using-svg/',
117
+ },
118
+ {
119
+ name: 'MDN Web Docs: mask-image',
120
+ url: 'https://developer.mozilla.org/fr/docs/Web/CSS/mask-image',
121
+ },
122
+ {
123
+ name: 'MDN Web Docs: background-image',
124
+ url: 'https://developer.mozilla.org/fr/docs/Web/CSS/background-image',
125
+ },
126
+ {
127
+ name: 'W3C: CSS Masking Module Level 1',
128
+ url: 'https://www.w3.org/TR/css-masking-1/',
129
+ },
130
+ ],
131
+ howTo: howToData,
132
+ schemas: [faqSchema, howToSchema, appSchema],
133
+ seo: [
134
+ {
135
+ type: 'title',
136
+ text: 'Pourquoi convertir un SVG en CSS Data URI ?',
137
+ level: 2,
138
+ },
139
+ {
140
+ type: 'paragraph',
141
+ html: "Dans le développement web moderne, optimiser les performances et le chargement des ressources est fondamental. Intégrer des icônes directement dans le CSS via des <strong>Data URIs</strong> élimine les requêtes HTTP inutiles, réduisant la latence et améliorant le Time to Interactive (TTI).",
142
+ },
143
+ {
144
+ type: 'paragraph',
145
+ html: "Cet outil transforme le code vectoriel <code>&lt;svg&gt;</code> en une chaîne de texte encodée que le navigateur peut interpréter comme une image de fond ou un masque de découpe, en conservant la scalabilité infinie et la netteté caractéristique des vecteurs.",
146
+ },
147
+ {
148
+ type: 'title',
149
+ text: 'Principaux Avantages Techniques',
150
+ level: 3,
151
+ },
152
+ {
153
+ type: 'list',
154
+ items: [
155
+ "<strong>Zéro Requête HTTP :</strong> En intégrant le graphique dans vos fichiers <code>.css</code>, le navigateur n'a pas besoin de télécharger de fichiers externes supplémentaires.",
156
+ "<strong>Personnalisation via CSS Mask :</strong> Grâce à la technique <code>mask-image</code>, vous pouvez changer la couleur d'une icône vectorielle complexe simplement en utilisant <code>background-color</code>.",
157
+ "<strong>Rendu Immédiat :</strong> Vous évitez le scintillement de contenu (FOUC) car les ressources visuelles critiques sont disponibles dès que la feuille de styles est téléchargée.",
158
+ ],
159
+ },
160
+ {
161
+ type: 'title',
162
+ text: 'Masques CSS vs Backgrounds',
163
+ level: 3,
164
+ },
165
+ {
166
+ type: 'paragraph',
167
+ html: "Beaucoup de développeurs utilisent simplement <code>background-image</code> pour intégrer des vecteurs, mais cela a une limitation : vous ne pouvez pas changer la couleur du SVG dynamiquement depuis le CSS.",
168
+ },
169
+ {
170
+ type: 'paragraph',
171
+ html: "Notre utilitaire supporte la génération de code pour les <strong>Masques CSS</strong>. En appliquant un <code>mask-image</code> avec le Data URI généré, l'icône agit comme un pochoir, permettant au <code>background-color</code> de l'élément de définir la couleur finale de l'icône. C'est la façon la plus professionnelle et flexible de gérer les icônes dans Astro, Next.js ou n'importe quel framework moderne.",
172
+ },
173
+ ],
174
+ };
@@ -0,0 +1,34 @@
1
+ import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+ import SvgToCssComponent from './component.astro';
3
+ import SvgToCssSEO from './seo.astro';
4
+ import SvgToCssBibliography from './bibliography.astro';
5
+
6
+ import type { SvgToCssUI } from './ui';
7
+
8
+ export type SvgToCssLocaleContent = ToolLocaleContent<SvgToCssUI>;
9
+
10
+ import { content as es } from './i18n/es';
11
+ import { content as en } from './i18n/en';
12
+ import { content as fr } from './i18n/fr';
13
+
14
+ export const svgToCss: DeveloperToolEntry<SvgToCssUI> = {
15
+ id: 'svg-to-css',
16
+ icons: {
17
+ bg: 'mdi:svg',
18
+ fg: 'mdi:code-braces',
19
+ },
20
+ i18n: {
21
+ es: async () => es,
22
+ en: async () => en,
23
+ fr: async () => fr,
24
+ },
25
+ };
26
+
27
+ export { SvgToCssComponent, SvgToCssSEO, SvgToCssBibliography };
28
+
29
+ export const SVG_TO_CSS_TOOL: ToolDefinition = {
30
+ entry: svgToCss,
31
+ Component: SvgToCssComponent,
32
+ SEOComponent: SvgToCssSEO,
33
+ BibliographyComponent: SvgToCssBibliography,
34
+ };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { svgToCss } 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 svgToCss.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,13 @@
1
+ export interface SvgToCssUI extends Record<string, string> {
2
+ labelPasteTitle: string;
3
+ labelInputArea: string;
4
+ labelPreviewOriginal: string;
5
+ labelResultTitle: string;
6
+ labelPreviewApplied: string;
7
+ tabBackground: string;
8
+ tabMask: string;
9
+ tabUri: string;
10
+ btnCopy: string;
11
+ btnCopied: string;
12
+ placeholder: string;
13
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { urlCleaner } 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 urlCleaner.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}