@jjlmoya/utils-developer 1.30.0 → 1.31.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 (140) hide show
  1. package/package.json +70 -70
  2. package/src/category/seo.astro +1 -1
  3. package/src/components/PreviewNavSidebar.astro +1 -1
  4. package/src/components/PreviewToolbar.astro +1 -1
  5. package/src/data.ts +1 -1
  6. package/src/env.d.ts +1 -1
  7. package/src/layouts/PreviewLayout.astro +1 -1
  8. package/src/pages/[locale]/[slug].astro +162 -162
  9. package/src/pages/index.astro +1 -1
  10. package/src/tests/entry_contract.test.ts +8 -2
  11. package/src/tests/faq_count.test.ts +1 -1
  12. package/src/tests/i18n_coverage.test.ts +2 -6
  13. package/src/tests/inverted_punctuation.test.ts +113 -113
  14. package/src/tests/mocks/astro_mock.js +1 -1
  15. package/src/tests/no_h1_in_components.test.ts +1 -1
  16. package/src/tests/promote_this_website_i18n.test.ts +33 -0
  17. package/src/tests/slug_language_code_format.test.ts +25 -25
  18. package/src/tests/slug_uniqueness.test.ts +86 -86
  19. package/src/tests/tool_validation.test.ts +15 -15
  20. package/src/tool/aspectRatio/i18n/de.ts +164 -164
  21. package/src/tool/aspectRatio/i18n/ja.ts +1 -1
  22. package/src/tool/aspectRatio/i18n/ko.ts +1 -1
  23. package/src/tool/aspectRatio/i18n/pl.ts +164 -164
  24. package/src/tool/aspectRatio/i18n/ru.ts +164 -164
  25. package/src/tool/aspectRatio/i18n/zh.ts +165 -165
  26. package/src/tool/aspectRatio/seo.astro +15 -15
  27. package/src/tool/calculadoraTiempoDatos/i18n/de.ts +143 -143
  28. package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +1 -1
  29. package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +1 -1
  30. package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +143 -143
  31. package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +144 -144
  32. package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +143 -143
  33. package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +144 -144
  34. package/src/tool/calculadoraTiempoDatos/seo.astro +15 -15
  35. package/src/tool/colorConverter/i18n/de.ts +120 -120
  36. package/src/tool/colorConverter/i18n/ja.ts +1 -1
  37. package/src/tool/colorConverter/i18n/ko.ts +1 -1
  38. package/src/tool/colorConverter/i18n/ru.ts +120 -120
  39. package/src/tool/colorConverter/i18n/zh.ts +1 -1
  40. package/src/tool/colorConverter/seo.astro +15 -15
  41. package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +1 -1
  42. package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +1 -1
  43. package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +124 -124
  44. package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +124 -124
  45. package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +125 -125
  46. package/src/tool/conversorExcelCsvHtml/seo.astro +15 -15
  47. package/src/tool/cronGenerator/i18n/ja.ts +1 -1
  48. package/src/tool/cronGenerator/i18n/ko.ts +1 -1
  49. package/src/tool/cronGenerator/i18n/zh.ts +183 -183
  50. package/src/tool/cronGenerator/seo.astro +15 -15
  51. package/src/tool/cssSpecificityCalculator/i18n/ja.ts +1 -1
  52. package/src/tool/cssSpecificityCalculator/i18n/ko.ts +1 -1
  53. package/src/tool/cssSpecificityCalculator/i18n/zh.ts +1 -1
  54. package/src/tool/cssSpecificityCalculator/seo.astro +15 -15
  55. package/src/tool/cssToInlineConverter/i18n/ja.ts +1 -1
  56. package/src/tool/cssToInlineConverter/i18n/ko.ts +1 -1
  57. package/src/tool/cssToInlineConverter/i18n/zh.ts +1 -1
  58. package/src/tool/cssToInlineConverter/seo.astro +15 -15
  59. package/src/tool/duplicateCssRemover/i18n/ja.ts +1 -1
  60. package/src/tool/duplicateCssRemover/i18n/ko.ts +1 -1
  61. package/src/tool/duplicateCssRemover/i18n/zh.ts +1 -1
  62. package/src/tool/duplicateCssRemover/seo.astro +15 -15
  63. package/src/tool/generadorSecurityTxt/i18n/ja.ts +1 -1
  64. package/src/tool/generadorSecurityTxt/i18n/ko.ts +1 -1
  65. package/src/tool/generadorSecurityTxt/i18n/zh.ts +1 -1
  66. package/src/tool/generadorSecurityTxt/seo.astro +15 -15
  67. package/src/tool/hashGenerator/i18n/ja.ts +1 -1
  68. package/src/tool/hashGenerator/i18n/ko.ts +1 -1
  69. package/src/tool/hashGenerator/seo.astro +15 -15
  70. package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +1 -1
  71. package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +1 -1
  72. package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +1 -1
  73. package/src/tool/inspectorCertificadosSsl/seo.astro +15 -15
  74. package/src/tool/jsonFormatter/seo.astro +15 -15
  75. package/src/tool/jwtDecoder/i18n/es.ts +248 -248
  76. package/src/tool/jwtDecoder/i18n/fr.ts +248 -248
  77. package/src/tool/jwtDecoder/i18n/tr.ts +248 -248
  78. package/src/tool/keycode/seo.astro +15 -15
  79. package/src/tool/llmCostCalculator/i18n/fr.ts +149 -149
  80. package/src/tool/llmCostCalculator/i18n/ja.ts +1 -1
  81. package/src/tool/llmCostCalculator/i18n/ko.ts +1 -1
  82. package/src/tool/llmCostCalculator/seo.astro +15 -15
  83. package/src/tool/mobileMockupGenerator/i18n/ja.ts +1 -1
  84. package/src/tool/mobileMockupGenerator/i18n/ko.ts +1 -1
  85. package/src/tool/mobileMockupGenerator/i18n/zh.ts +1 -1
  86. package/src/tool/mobileMockupGenerator/seo.astro +15 -15
  87. package/src/tool/musicalTypography/i18n/ja.ts +1 -1
  88. package/src/tool/musicalTypography/i18n/ko.ts +1 -1
  89. package/src/tool/musicalTypography/i18n/zh.ts +1 -1
  90. package/src/tool/musicalTypography/seo.astro +15 -15
  91. package/src/tool/placeholderGenerator/i18n/ja.ts +1 -1
  92. package/src/tool/placeholderGenerator/i18n/ko.ts +1 -1
  93. package/src/tool/placeholderGenerator/i18n/zh.ts +1 -1
  94. package/src/tool/placeholderGenerator/seo.astro +15 -15
  95. package/src/tool/promoteThisWebsite/entry.ts +13 -0
  96. package/src/tool/promoteThisWebsite/i18n/de.ts +95 -0
  97. package/src/tool/promoteThisWebsite/i18n/fr.ts +95 -0
  98. package/src/tool/promoteThisWebsite/i18n/id.ts +95 -0
  99. package/src/tool/promoteThisWebsite/i18n/it.ts +95 -0
  100. package/src/tool/promoteThisWebsite/i18n/ja.ts +95 -0
  101. package/src/tool/promoteThisWebsite/i18n/ko.ts +95 -0
  102. package/src/tool/promoteThisWebsite/i18n/nl.ts +95 -0
  103. package/src/tool/promoteThisWebsite/i18n/pl.ts +95 -0
  104. package/src/tool/promoteThisWebsite/i18n/pt.ts +95 -0
  105. package/src/tool/promoteThisWebsite/i18n/ru.ts +95 -0
  106. package/src/tool/promoteThisWebsite/i18n/sv.ts +95 -0
  107. package/src/tool/promoteThisWebsite/i18n/tr.ts +95 -0
  108. package/src/tool/promoteThisWebsite/i18n/zh.ts +95 -0
  109. package/src/tool/promptLibrary/i18n/ja.ts +1 -1
  110. package/src/tool/promptLibrary/i18n/ko.ts +1 -1
  111. package/src/tool/promptLibrary/i18n/zh.ts +1 -1
  112. package/src/tool/promptLibrary/seo.astro +15 -15
  113. package/src/tool/readabilityCalculator/i18n/ja.ts +1 -1
  114. package/src/tool/readabilityCalculator/i18n/ko.ts +1 -1
  115. package/src/tool/readabilityCalculator/i18n/zh.ts +1 -1
  116. package/src/tool/readabilityCalculator/seo.astro +15 -15
  117. package/src/tool/serpPixelSimulator/entry.ts +30 -30
  118. package/src/tool/serpPixelSimulator/i18n/en.ts +211 -211
  119. package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -214
  120. package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -214
  121. package/src/tool/serpPixelSimulator/logic.ts +18 -18
  122. package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +195 -195
  123. package/src/tool/svgSanitizer/i18n/ja.ts +1 -1
  124. package/src/tool/svgSanitizer/i18n/ko.ts +1 -1
  125. package/src/tool/svgSanitizer/seo.astro +15 -15
  126. package/src/tool/svgToCss/i18n/ja.ts +1 -1
  127. package/src/tool/svgToCss/i18n/ko.ts +1 -1
  128. package/src/tool/svgToCss/seo.astro +15 -15
  129. package/src/tool/urlCleaner/i18n/ja.ts +1 -1
  130. package/src/tool/urlCleaner/i18n/ko.ts +1 -1
  131. package/src/tool/urlCleaner/i18n/zh.ts +1 -1
  132. package/src/tool/urlCleaner/seo.astro +15 -15
  133. package/src/tool/urlEncoderDecoder/i18n/es.ts +146 -146
  134. package/src/tool/urlEncoderDecoder/i18n/ko.ts +1 -1
  135. package/src/tool/urlEncoderDecoder/seo.astro +15 -15
  136. package/src/tool/utmGenerator/i18n/ja.ts +1 -1
  137. package/src/tool/utmGenerator/i18n/ko.ts +1 -1
  138. package/src/tool/utmGenerator/i18n/zh.ts +1 -1
  139. package/src/tool/utmGenerator/seo.astro +15 -15
  140. package/src/types.ts +1 -1
@@ -1,150 +1,150 @@
1
1
  import { bibliography } from '../bibliography';
2
- import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
3
- import type { ToolLocaleContent } from '../../../types';
4
- import type { UrlEncoderDecoderUI } from '../ui';
5
-
6
- const slug = 'codificador-decodificador-url';
7
- const title = 'Codificador y Decodificador de URLs Online';
8
- const description =
9
- 'Convierte caracteres especiales de cualquier enlace a formato seguro (Percent-Encoding) o devuélvelos a su estado original legible al instante de forma local.';
10
-
11
- const faqData = [
12
- {
13
- question: '¿Qué caracteres se codifican en una URL?',
14
- answer:
15
- 'Se codifican todos los caracteres no permitidos en el estándar ASCII para URLs: espacios, tildes, ñ, símbolos como &, =, +, #, ?, /, entre otros. Por ejemplo, un espacio se convierte en %20 y la ñ en %C3%B1.',
16
- },
17
- {
18
- question: '¿Cuál es la diferencia entre encodeURI y encodeURIComponent?',
19
- answer:
20
- 'encodeURI codifica una URL completa y deja intactos los caracteres reservados como / y ?. encodeURIComponent codifica todos los caracteres especiales incluyendo los reservados, siendo ideal para codificar valores individuales de parámetros de consulta.',
21
- },
22
- {
23
- question: '¿Por qué mi URL tiene %20 en lugar de espacios?',
24
- answer:
25
- 'El protocolo HTTP no permite espacios en las URLs. El %20 es la representación en Percent-Encoding del espacio en blanco según el estándar ASCII. Algunos sistemas usan el signo + como alternativa, pero %20 es el más universal y seguro.',
26
- },
27
- {
28
- question: '¿Es seguro usar esta herramienta con URLs privadas?',
29
- answer:
30
- 'Sí, completamente seguro. Todo el procesamiento ocurre en tu navegador mediante JavaScript nativo (encodeURIComponent/decodeURIComponent). Ninguna de tus URLs o parámetros se envían a ningún servidor externo.',
31
- },
32
- ];
33
-
34
- const howToData = [
35
- {
36
- name: 'Pegar el texto crudo',
37
- text: 'Escribe o pega tu URL o cadena de texto en el campo superior "Texto Crudo (Legible)".',
38
- },
39
- {
40
- name: 'Codificar o decodificar',
41
- text: 'Haz clic en "Codificar URL" para convertir el texto a formato seguro Percent-Encoding, o en "Decodificar" para revertir una URL codificada a su forma legible.',
42
- },
43
- {
44
- name: 'Copiar el resultado',
45
- text: 'Usa el botón "Copiar" del campo correspondiente para llevar el resultado a tu portapapeles.',
46
- },
47
- ];
48
-
49
- const faqSchema: WithContext<FAQPage> = {
50
- '@context': 'https://schema.org',
51
- '@type': 'FAQPage',
52
- mainEntity: faqData.map((item) => ({
53
- '@type': 'Question',
54
- name: item.question,
55
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
56
- })),
57
- };
58
-
59
- const howToSchema: WithContext<HowToThing> = {
60
- '@context': 'https://schema.org',
61
- '@type': 'HowTo',
62
- name: title,
63
- description,
64
- step: howToData.map((step, i) => ({
65
- '@type': 'HowToStep',
66
- position: i + 1,
67
- name: step.name,
68
- text: step.text,
69
- })),
70
- };
71
-
72
- const appSchema: WithContext<SoftwareApplication> = {
73
- '@context': 'https://schema.org',
74
- '@type': 'SoftwareApplication',
75
- name: title,
76
- description,
77
- applicationCategory: 'UtilityApplication',
78
- operatingSystem: 'All',
79
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
80
- inLanguage: 'es',
81
- };
82
-
83
- const ui: UrlEncoderDecoderUI = {
84
- labelRaw: 'Texto Crudo (Legible)',
85
- labelEncoded: 'URL Formateada (Encoded)',
86
- btnClear: 'Limpiar',
87
- btnCopy: 'Copiar',
88
- btnCopied: '¡Copiado!',
89
- btnEncode: 'Codificar URL',
90
- btnDecode: 'Decodificar',
91
- placeholderRaw: 'https://ejemplo.com/busqueda?q=zapatos de tacón rojo&talla=38',
92
- placeholderEncoded: 'https%3A%2F%2Fejemplo.com%2Fbusqueda%3Fq%3Dzapatos%20de%20tac%C3%B3n%20rojo%26talla%3D38',
93
- };
94
-
95
- export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
96
- slug,
97
- title,
98
- description,
99
- ui,
100
- faqTitle: 'Preguntas Frecuentes',
101
- faq: faqData,
2
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
3
+ import type { ToolLocaleContent } from '../../../types';
4
+ import type { UrlEncoderDecoderUI } from '../ui';
5
+
6
+ const slug = 'codificador-decodificador-url';
7
+ const title = 'Codificador y Decodificador de URLs Online';
8
+ const description =
9
+ 'Convierte caracteres especiales de cualquier enlace a formato seguro (Percent-Encoding) o devuélvelos a su estado original legible al instante de forma local.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: '¿Qué caracteres se codifican en una URL?',
14
+ answer:
15
+ 'Se codifican todos los caracteres no permitidos en el estándar ASCII para URLs: espacios, tildes, ñ, símbolos como &, =, +, #, ?, /, entre otros. Por ejemplo, un espacio se convierte en %20 y la ñ en %C3%B1.',
16
+ },
17
+ {
18
+ question: '¿Cuál es la diferencia entre encodeURI y encodeURIComponent?',
19
+ answer:
20
+ 'encodeURI codifica una URL completa y deja intactos los caracteres reservados como / y ?. encodeURIComponent codifica todos los caracteres especiales incluyendo los reservados, siendo ideal para codificar valores individuales de parámetros de consulta.',
21
+ },
22
+ {
23
+ question: '¿Por qué mi URL tiene %20 en lugar de espacios?',
24
+ answer:
25
+ 'El protocolo HTTP no permite espacios en las URLs. El %20 es la representación en Percent-Encoding del espacio en blanco según el estándar ASCII. Algunos sistemas usan el signo + como alternativa, pero %20 es el más universal y seguro.',
26
+ },
27
+ {
28
+ question: '¿Es seguro usar esta herramienta con URLs privadas?',
29
+ answer:
30
+ 'Sí, completamente seguro. Todo el procesamiento ocurre en tu navegador mediante JavaScript nativo (encodeURIComponent/decodeURIComponent). Ninguna de tus URLs o parámetros se envían a ningún servidor externo.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Pegar el texto crudo',
37
+ text: 'Escribe o pega tu URL o cadena de texto en el campo superior "Texto Crudo (Legible)".',
38
+ },
39
+ {
40
+ name: 'Codificar o decodificar',
41
+ text: 'Haz clic en "Codificar URL" para convertir el texto a formato seguro Percent-Encoding, o en "Decodificar" para revertir una URL codificada a su forma legible.',
42
+ },
43
+ {
44
+ name: 'Copiar el resultado',
45
+ text: 'Usa el botón "Copiar" del campo correspondiente para llevar el resultado a tu portapapeles.',
46
+ },
47
+ ];
48
+
49
+ const faqSchema: WithContext<FAQPage> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'FAQPage',
52
+ mainEntity: faqData.map((item) => ({
53
+ '@type': 'Question',
54
+ name: item.question,
55
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
56
+ })),
57
+ };
58
+
59
+ const howToSchema: WithContext<HowToThing> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'HowTo',
62
+ name: title,
63
+ description,
64
+ step: howToData.map((step, i) => ({
65
+ '@type': 'HowToStep',
66
+ position: i + 1,
67
+ name: step.name,
68
+ text: step.text,
69
+ })),
70
+ };
71
+
72
+ const appSchema: WithContext<SoftwareApplication> = {
73
+ '@context': 'https://schema.org',
74
+ '@type': 'SoftwareApplication',
75
+ name: title,
76
+ description,
77
+ applicationCategory: 'UtilityApplication',
78
+ operatingSystem: 'All',
79
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
80
+ inLanguage: 'es',
81
+ };
82
+
83
+ const ui: UrlEncoderDecoderUI = {
84
+ labelRaw: 'Texto Crudo (Legible)',
85
+ labelEncoded: 'URL Formateada (Encoded)',
86
+ btnClear: 'Limpiar',
87
+ btnCopy: 'Copiar',
88
+ btnCopied: '¡Copiado!',
89
+ btnEncode: 'Codificar URL',
90
+ btnDecode: 'Decodificar',
91
+ placeholderRaw: 'https://ejemplo.com/busqueda?q=zapatos de tacón rojo&talla=38',
92
+ placeholderEncoded: 'https%3A%2F%2Fejemplo.com%2Fbusqueda%3Fq%3Dzapatos%20de%20tac%C3%B3n%20rojo%26talla%3D38',
93
+ };
94
+
95
+ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
96
+ slug,
97
+ title,
98
+ description,
99
+ ui,
100
+ faqTitle: 'Preguntas Frecuentes',
101
+ faq: faqData,
102
102
  bibliographyTitle: 'Referencias y Documentación',
103
103
  bibliography,
104
- howTo: howToData,
105
- schemas: [faqSchema, howToSchema, appSchema],
106
- seo: [
107
- {
108
- type: 'title',
109
- text: '¿Qué es la Codificación de una URL?',
110
- level: 2,
111
- },
112
- {
113
- type: 'paragraph',
114
- html: 'Al navegar por internet o enviar peticiones a servidores, es común pensar en una URL (Uniform Resource Locator) como simplemente una "dirección web". Sin embargo, el protocolo de internet dicta que las URLs solo pueden transmitirse utilizando un conjunto muy restringido de caracteres <strong>ASCII estándar</strong>.',
115
- },
116
- {
117
- type: 'paragraph',
118
- html: '¿Qué ocurre si la URL contiene un espacio, tildes, o parámetros especiales como símbolos de más (<code>+</code>) o de igual (<code>=</code>)? Para evitar que los sistemas colapsen intentando leer caracteres ilegales, estos deben ser traducidos a su forma segura compatible utilizando <strong>Percent-Encoding</strong> (Codificación porcentual).',
119
- },
120
- {
121
- type: 'title',
122
- text: 'Cómo funciona el Percent-Encoding',
123
- level: 3,
124
- },
125
- {
126
- type: 'paragraph',
127
- html: 'Cuando utilizas esta herramienta, el algoritmo toma cualquier carácter "inseguro" (como un espacio en blanco o una letra acentuada como la ñ) y lo sustituye por un signo de porcentaje <code>%</code> seguido de dos dígitos hexadecimales correspondientes a su valor en el estándar UTF-8.',
128
- },
129
- {
130
- type: 'list',
131
- items: [
132
- '<strong>Ejemplo Básico:</strong> Un simple espacio en blanco será sustituido por su equivalente seguro: <code>%20</code>.',
133
- '<strong>Soporte Extendido:</strong> Una letra <code>á</code> se transformará en <code>%C3%A1</code>, y la <code>ñ</code> en <code>%C3%B1</code>.',
134
- ],
135
- },
136
- {
137
- type: 'title',
138
- text: 'La importancia en APIs y Consultas GET',
139
- level: 3,
140
- },
141
- {
142
- type: 'paragraph',
143
- html: 'Cuando desarrollas integraciones, un error típico consiste en pasar una cadena cruda a los parámetros de una URL. Si insertas <code>camisa&azul</code> de forma pura a tu backend (<code>/buscar?q=camisa&azul</code>), el servidor interpretará que <code>azul</code> es un nuevo parámetro, rompiendo toda la lógica del código.',
144
- },
145
- {
146
- type: 'paragraph',
104
+ howTo: howToData,
105
+ schemas: [faqSchema, howToSchema, appSchema],
106
+ seo: [
107
+ {
108
+ type: 'title',
109
+ text: '¿Qué es la Codificación de una URL?',
110
+ level: 2,
111
+ },
112
+ {
113
+ type: 'paragraph',
114
+ html: 'Al navegar por internet o enviar peticiones a servidores, es común pensar en una URL (Uniform Resource Locator) como simplemente una "dirección web". Sin embargo, el protocolo de internet dicta que las URLs solo pueden transmitirse utilizando un conjunto muy restringido de caracteres <strong>ASCII estándar</strong>.',
115
+ },
116
+ {
117
+ type: 'paragraph',
118
+ html: '¿Qué ocurre si la URL contiene un espacio, tildes, o parámetros especiales como símbolos de más (<code>+</code>) o de igual (<code>=</code>)? Para evitar que los sistemas colapsen intentando leer caracteres ilegales, estos deben ser traducidos a su forma segura compatible utilizando <strong>Percent-Encoding</strong> (Codificación porcentual).',
119
+ },
120
+ {
121
+ type: 'title',
122
+ text: 'Cómo funciona el Percent-Encoding',
123
+ level: 3,
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'Cuando utilizas esta herramienta, el algoritmo toma cualquier carácter "inseguro" (como un espacio en blanco o una letra acentuada como la ñ) y lo sustituye por un signo de porcentaje <code>%</code> seguido de dos dígitos hexadecimales correspondientes a su valor en el estándar UTF-8.',
128
+ },
129
+ {
130
+ type: 'list',
131
+ items: [
132
+ '<strong>Ejemplo Básico:</strong> Un simple espacio en blanco será sustituido por su equivalente seguro: <code>%20</code>.',
133
+ '<strong>Soporte Extendido:</strong> Una letra <code>á</code> se transformará en <code>%C3%A1</code>, y la <code>ñ</code> en <code>%C3%B1</code>.',
134
+ ],
135
+ },
136
+ {
137
+ type: 'title',
138
+ text: 'La importancia en APIs y Consultas GET',
139
+ level: 3,
140
+ },
141
+ {
142
+ type: 'paragraph',
143
+ html: 'Cuando desarrollas integraciones, un error típico consiste en pasar una cadena cruda a los parámetros de una URL. Si insertas <code>camisa&azul</code> de forma pura a tu backend (<code>/buscar?q=camisa&azul</code>), el servidor interpretará que <code>azul</code> es un nuevo parámetro, rompiendo toda la lógica del código.',
144
+ },
145
+ {
146
+ type: 'paragraph',
147
147
  html: 'Esta herramienta realiza los cálculos directamente en tu navegador local. Ninguna de tus cadenas URL necesita enviarse a servidores de terceros, lo que ayuda a mantener privados tus tokens y parámetros analíticos.',
148
- },
149
- ],
150
- };
148
+ },
149
+ ],
150
+ };
@@ -148,4 +148,4 @@ export const content: ToolLocaleContent<UrlEncoderDecoderUI> = {
148
148
  },
149
149
  ],
150
150
  };
151
-
151
+
@@ -1,15 +1,15 @@
1
- ---
2
- import { SEORenderer } from '@jjlmoya/utils-shared';
3
- import { urlEncoderDecoder } 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 urlEncoderDecoder.i18n[locale]?.();
12
- if (!content) return null;
13
- ---
14
-
15
- {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { urlEncoderDecoder } 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 urlEncoderDecoder.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -113,4 +113,4 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
113
113
  },
114
114
  ],
115
115
  };
116
-
116
+
@@ -113,4 +113,4 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
113
113
  },
114
114
  ],
115
115
  };
116
-
116
+
@@ -113,4 +113,4 @@ export const content: ToolLocaleContent<UtmGeneratorUI> = {
113
113
  },
114
114
  ],
115
115
  };
116
-
116
+
@@ -1,15 +1,15 @@
1
- ---
2
- import { SEORenderer } from '@jjlmoya/utils-shared';
3
- import { utmGenerator } 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 utmGenerator.i18n[locale]?.();
12
- if (!content) return null;
13
- ---
14
-
15
- {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { utmGenerator } 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 utmGenerator.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
package/src/types.ts CHANGED
@@ -68,4 +68,4 @@ export interface ToolDefinition {
68
68
  SEOComponent: unknown;
69
69
  BibliographyComponent: unknown;
70
70
  }
71
-
71
+