@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,177 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { AspectRatioUI } from '../ui';
4
+
5
+ const slug = 'calculadora-aspect-ratio';
6
+ const title = 'Calculadora de Aspect Ratio a Píxeles. Proporciones Online';
7
+ const description =
8
+ 'Calcula nuevas resoluciones de imagen, vídeo y diseño web y mantén la proporción exacta para no deformar gráficos. Soporta formatos 16:9, 4:3, 21:9 y customizados.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '¿Qué es el Aspect Ratio o relación de aspecto?',
13
+ answer:
14
+ 'El Aspect Ratio describe la relación geométrica entre la anchura y la altura de una imagen o pantalla. Se representa con dos números separados por dos puntos (ej. 16:9), indicando cómo varía la altura proporcionalmente en relación a la anchura.',
15
+ },
16
+ {
17
+ question: '¿Por qué es importante mantener las proporciones correctas?',
18
+ answer:
19
+ 'Ignorar el Aspect Ratio genera imágenes achatadas o estiradas, vídeos con letterboxing inesperado y componentes web que rompen su maquetación en diferentes tamaños de pantalla. Mantener proporciones correctas es clave para una visualización profesional.',
20
+ },
21
+ {
22
+ question: '¿Cómo calcular el alto a partir del ancho con un ratio dado?',
23
+ answer:
24
+ 'La fórmula es: Alto = Ancho × (Ratio Alto / Ratio Ancho). Por ejemplo, para un ancho de 1280px con ratio 16:9, el alto sería: 1280 × (9/16) = 720px.',
25
+ },
26
+ {
27
+ question: '¿Cuál es el Aspect Ratio estándar para vídeos en YouTube?',
28
+ answer:
29
+ '16:9 es el ratio estándar para YouTube y la mayoría de plataformas de vídeo modernas. Equivale a resoluciones como 1280×720 (HD), 1920×1080 (Full HD) o 3840×2160 (4K UHD).',
30
+ },
31
+ {
32
+ question: '¿Qué Aspect Ratio usan los vídeos verticales de redes sociales?',
33
+ answer:
34
+ '9:16, que es exactamente el inverso del formato panorámico. Es el ratio nativo de TikTok, Instagram Reels y YouTube Shorts, originado por el consumo de contenido en móvil con el dispositivo en vertical.',
35
+ },
36
+ ];
37
+
38
+ const howToData = [
39
+ {
40
+ name: 'Introducir el ratio original',
41
+ text: 'Escribe los valores de anchura y altura del ratio que quieres mantener (ej. 16 y 9 para formato panorámico) o selecciona uno de los presets.',
42
+ },
43
+ {
44
+ name: 'Ajustar el escalado',
45
+ text: 'Cambia el valor de ancho o de alto en la sección "Escala Real". La herramienta calculará automáticamente el valor opuesto para mantener la proporción.',
46
+ },
47
+ {
48
+ name: 'Verificar en la vista previa',
49
+ text: 'El panel de vista previa muestra la forma resultante a escala proporcional, con el ratio simplificado y la resolución calculada.',
50
+ },
51
+ {
52
+ name: 'Aplicar en tu proyecto',
53
+ text: 'Copia los valores calculados para usarlos en tu CSS (aspect-ratio: 16 / 9), en la exportación de vídeo o en la configuración de tu herramienta de diseño.',
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: AspectRatioUI = {
92
+ labelConfig: 'Configuración',
93
+ labelRatio: 'Ratio Original',
94
+ labelWidth: 'Ancho',
95
+ labelHeight: 'Alto',
96
+ labelScale: 'Escala Real',
97
+ labelPixelWidth: 'Píxeles (Ancho)',
98
+ labelPixelHeight: 'Píxeles (Alto)',
99
+ labelPreview: 'Vista Previa Proporcional',
100
+ labelStatus: 'Relación Perfecta',
101
+ labelOffline: '100% Offline Tool',
102
+ };
103
+
104
+ export const content: ToolLocaleContent<AspectRatioUI> = {
105
+ slug,
106
+ title,
107
+ description,
108
+ ui,
109
+ faqTitle: 'Preguntas Frecuentes',
110
+ faq: faqData,
111
+ bibliographyTitle: 'Referencias y Documentación',
112
+ bibliography: [
113
+ {
114
+ name: 'MDN Web Docs: aspect-ratio (CSS)',
115
+ url: 'https://developer.mozilla.org/es/docs/Web/CSS/aspect-ratio',
116
+ },
117
+ {
118
+ name: 'Wikipedia: Relación de aspecto',
119
+ url: 'https://es.wikipedia.org/wiki/Relaci%C3%B3n_de_aspecto',
120
+ },
121
+ {
122
+ name: 'W3C: CSS Box Sizing Level 4',
123
+ url: 'https://www.w3.org/TR/css-sizing-4/#aspect-ratio',
124
+ },
125
+ ],
126
+ howTo: howToData,
127
+ schemas: [faqSchema, howToSchema, appSchema],
128
+ seo: [
129
+ {
130
+ type: 'title',
131
+ text: '¿Qué es el Aspect Ratio (Relación de Aspecto)?',
132
+ level: 2,
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: 'En diseño gráfico, fotografía y desarrollo frontend, el <strong>Aspect Ratio</strong> o relación de aspecto describe la relación geométrica que existe entre la anchura y la altura de una imagen, pantalla o contenedor. Se representa típicamente con dos números separados por dos puntos (por ejemplo, <code>16:9</code>), indicando cómo aumenta proporcionalmente la altura en respuesta de su anchura.',
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Manejar mal las relaciones de aspecto es causa habitual de fotografías achatadas, vídeos con recortes imprevistos (letterboxing) o componentes web que rompen su maquetación al ser visualizados progresivamente desde el móvil hasta en monitores ultra anchos.',
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Ratios Comunes en la Industria',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Dependiendo de tu disciplina, lidiarás constantemente con un número limitado de proporciones estándar globales:',
150
+ },
151
+ {
152
+ type: 'list',
153
+ items: [
154
+ '<strong>16:9 (Panorámico):</strong> El formato dominante absoluto para monitores modernos, televisores, grabaciones en YouTube o resoluciones estándar de alta definición (como 1920×1080 o 4K).',
155
+ '<strong>9:16 (Vertical):</strong> Originado a causa del consumo de contenido móvil nativo (TikTok, Instagram Reels, YouTube Shorts). Exactamente el mismo ratio que los vídeos panorámicos, pero con la rotación física del dispositivo aplicada.',
156
+ '<strong>4:3 (Clásico / Vintage):</strong> Presente en televisiones y monitores antiguos o en modelos de cámaras fotográficas análogas y digitales especializadas. Su apariencia ligeramente cuadrada atrae la atención directa sobre el eje central compositivo.',
157
+ ],
158
+ },
159
+ {
160
+ type: 'title',
161
+ text: 'Desarrollo Web y la propiedad CSS aspect-ratio',
162
+ level: 3,
163
+ },
164
+ {
165
+ type: 'paragraph',
166
+ html: 'Antiguamente en CSS se dependía de complejos sistemas matemáticos usando un <strong>Padding Hack</strong> (como inyectar un <code>padding-top: 56.25%</code>) para reservar espacios dinámicos en los iframes de YouTube o imágenes de portada, con el fin de evitar un terrible Cumulative Layout Shift (CLS) en la carga de página.',
167
+ },
168
+ {
169
+ type: 'paragraph',
170
+ html: 'Actualmente todas las maquetaciones modernas aplican directamente propiedades como <code>aspect-ratio: 16 / 9;</code>, logrando un código semántico y permitiendo al navegador derivar automágicamente la medida faltante desde el ancho original definido vía Grid o Flexbox.',
171
+ },
172
+ {
173
+ type: 'paragraph',
174
+ html: 'Esta calculadora local de píxeles transfiere la potencia de diseño a un cálculo de escalado instantáneo que protegerá tus renders de desconfiguraciones catastróficas.',
175
+ },
176
+ ],
177
+ };
@@ -0,0 +1,177 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { AspectRatioUI } from '../ui';
4
+
5
+ const slug = 'calculateur-ratio-format';
6
+ const title = 'Calculateur de Ratio de Format en Pixels. Proportions en Ligne';
7
+ const description =
8
+ "Calculez de nouvelles résolutions d'image, de vidéo et de web design en conservant la proportion exacte pour ne pas déformer les graphiques. Prend en charge les formats 16:9, 4:3, 21:9 et personnalisés.";
9
+
10
+ const faqData = [
11
+ {
12
+ question: "Qu'est-ce que le Ratio de Format (Aspect Ratio) ?",
13
+ answer:
14
+ "Le Ratio de Format décrit la relation géométrique entre la largeur et la hauteur d'une image ou d'un écran. Il est représenté par deux chiffres séparés par deux points (ex. 16:9), indiquant comment la hauteur varie proportionnellement par rapport à la largeur.",
15
+ },
16
+ {
17
+ question: "Pourquoi est-il important de maintenir les bonnes proportions ?",
18
+ answer:
19
+ "Ignorer le Ratio de Format provoque des images écrasées ou étirées, un letterboxing inattendu dans les vidéos et des composants web qui cassent leur mise en page à différentes tailles d'écran. Maintenir les bonnes proportions est essentiel pour un affichage professionnel.",
20
+ },
21
+ {
22
+ question: "Comment calculer la hauteur à partir de la largeur avec un ratio donné ?",
23
+ answer:
24
+ "La formule est : Hauteur = Largeur × (Ratio Hauteur / Ratio Largeur). Par exemple, pour une largeur de 1280px avec un ratio 16:9, la hauteur serait : 1280 × (9/16) = 720px.",
25
+ },
26
+ {
27
+ question: "Quel est le Ratio de Format standard pour les vidéos YouTube ?",
28
+ answer:
29
+ "16:9 est le ratio standard pour YouTube et la plupart des plateformes vidéo modernes. Il correspond à des résolutions telles que 1280×720 (HD), 1920×1080 (Full HD) ou 3840×2160 (4K UHD).",
30
+ },
31
+ {
32
+ question: "Quel Ratio de Format utilisent les vidéos verticales des réseaux sociaux ?",
33
+ answer:
34
+ "9:16, qui est exactement l'inverse du format panoramique. C'est le ratio natif de TikTok, Instagram Reels et YouTube Shorts, né de la consommation de contenu sur téléphone en orientation verticale.",
35
+ },
36
+ ];
37
+
38
+ const howToData = [
39
+ {
40
+ name: "Saisir le ratio original",
41
+ text: "Entrez les valeurs de largeur et de hauteur du ratio que vous souhaitez conserver (ex. 16 et 9 pour le format panoramique) ou sélectionnez l'un des préréglages.",
42
+ },
43
+ {
44
+ name: "Ajuster l'échelle",
45
+ text: 'Modifiez la valeur de la largeur ou de la hauteur dans la section "Échelle Réelle". L\'outil calculera automatiquement la valeur opposée pour maintenir la proportion.',
46
+ },
47
+ {
48
+ name: "Vérifier l'aperçu",
49
+ text: "Le panneau d'aperçu affiche la forme résultante à échelle proportionnelle, avec le ratio simplifié et la résolution calculée.",
50
+ },
51
+ {
52
+ name: "Appliquer dans votre projet",
53
+ text: "Copiez les valeurs calculées pour les utiliser dans votre CSS (aspect-ratio: 16 / 9), dans l'export vidéo ou dans les paramètres de votre outil de design.",
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: AspectRatioUI = {
92
+ labelConfig: 'Configuration',
93
+ labelRatio: 'Ratio Original',
94
+ labelWidth: 'Largeur',
95
+ labelHeight: 'Hauteur',
96
+ labelScale: 'Échelle Réelle',
97
+ labelPixelWidth: 'Pixels (Largeur)',
98
+ labelPixelHeight: 'Pixels (Hauteur)',
99
+ labelPreview: 'Aperçu Proportionnel',
100
+ labelStatus: 'Proportion Parfaite',
101
+ labelOffline: '100% Outil Hors Ligne',
102
+ };
103
+
104
+ export const content: ToolLocaleContent<AspectRatioUI> = {
105
+ slug,
106
+ title,
107
+ description,
108
+ ui,
109
+ faqTitle: 'Questions Fréquentes',
110
+ faq: faqData,
111
+ bibliographyTitle: 'Références et Documentation',
112
+ bibliography: [
113
+ {
114
+ name: 'MDN Web Docs: aspect-ratio (CSS)',
115
+ url: 'https://developer.mozilla.org/fr/docs/Web/CSS/aspect-ratio',
116
+ },
117
+ {
118
+ name: 'Wikipedia: Format d\'image',
119
+ url: 'https://fr.wikipedia.org/wiki/Format_d%27image',
120
+ },
121
+ {
122
+ name: 'W3C: CSS Box Sizing Level 4',
123
+ url: 'https://www.w3.org/TR/css-sizing-4/#aspect-ratio',
124
+ },
125
+ ],
126
+ howTo: howToData,
127
+ schemas: [faqSchema, howToSchema, appSchema],
128
+ seo: [
129
+ {
130
+ type: 'title',
131
+ text: "Qu'est-ce que le Ratio de Format (Aspect Ratio) ?",
132
+ level: 2,
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: "En design graphique, photographie et développement frontend, l'<strong>Aspect Ratio</strong> ou ratio de format décrit la relation géométrique entre la largeur et la hauteur d'une image, d'un écran ou d'un conteneur. Il est représenté par deux chiffres séparés par deux points (ex. <code>16:9</code>), indiquant comment la hauteur augmente proportionnellement en fonction de la largeur.",
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: "Mal gérer les ratios de format est une cause habituelle de photographies écrasées, de vidéos avec des recadrages imprévus (letterboxing) ou de composants web qui cassent leur mise en page lors de l'affichage sur des écrans de différentes tailles.",
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Ratios Courants dans l\'Industrie',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Selon votre discipline, vous devrez constamment gérer un nombre limité de proportions standard mondiales :',
150
+ },
151
+ {
152
+ type: 'list',
153
+ items: [
154
+ '<strong>16:9 (Panoramique) :</strong> Le format dominant pour les moniteurs modernes, téléviseurs, enregistrements YouTube ou résolutions haute définition standard (comme 1920×1080 ou 4K).',
155
+ '<strong>9:16 (Vertical) :</strong> Né de la consommation de contenu mobile natif (TikTok, Instagram Reels, YouTube Shorts). Exactement le même ratio que les vidéos panoramiques, mais avec la rotation physique du dispositif appliquée.',
156
+ '<strong>4:3 (Classique / Vintage) :</strong> Présent dans les anciennes télévisions et moniteurs ou dans les appareils photo argentiques et numériques spécialisés. Son apparence légèrement carrée attire directement l\'attention sur l\'axe central compositionnel.',
157
+ ],
158
+ },
159
+ {
160
+ type: 'title',
161
+ text: 'Développement Web et la propriété CSS aspect-ratio',
162
+ level: 3,
163
+ },
164
+ {
165
+ type: 'paragraph',
166
+ html: "Autrefois en CSS, on dépendait de systèmes mathématiques complexes utilisant un <strong>Padding Hack</strong> (comme injecter un <code>padding-top: 56.25%</code>) pour réserver des espaces dynamiques dans les iframes YouTube ou les images de couverture, afin d'éviter un terrible Cumulative Layout Shift (CLS).",
167
+ },
168
+ {
169
+ type: 'paragraph',
170
+ html: "Aujourd'hui, toutes les mises en page modernes appliquent directement des propriétés comme <code>aspect-ratio: 16 / 9;</code>, obtenant un code sémantique et permettant au navigateur de dériver automatiquement la mesure manquante à partir de la largeur originale définie via Grid ou Flexbox.",
171
+ },
172
+ {
173
+ type: 'paragraph',
174
+ html: "Ce calculateur local de pixels transfère la puissance de design à un calcul de mise à l'échelle instantané qui protégera vos rendus des mauvaises configurations.",
175
+ },
176
+ ],
177
+ };
@@ -0,0 +1,34 @@
1
+ import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+ import AspectRatioComponent from './component.astro';
3
+ import AspectRatioSEO from './seo.astro';
4
+ import AspectRatioBibliography from './bibliography.astro';
5
+
6
+ import type { AspectRatioUI } from './ui';
7
+
8
+ export type AspectRatioLocaleContent = ToolLocaleContent<AspectRatioUI>;
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 aspectRatio: DeveloperToolEntry<AspectRatioUI> = {
15
+ id: 'aspect-ratio',
16
+ icons: {
17
+ bg: 'mdi:aspect-ratio',
18
+ fg: 'mdi:resize',
19
+ },
20
+ i18n: {
21
+ es: async () => es,
22
+ en: async () => en,
23
+ fr: async () => fr,
24
+ },
25
+ };
26
+
27
+ export { AspectRatioComponent, AspectRatioSEO, AspectRatioBibliography };
28
+
29
+ export const ASPECT_RATIO_TOOL: ToolDefinition = {
30
+ entry: aspectRatio,
31
+ Component: AspectRatioComponent,
32
+ SEOComponent: AspectRatioSEO,
33
+ BibliographyComponent: AspectRatioBibliography,
34
+ };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { aspectRatio } 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 aspectRatio.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,12 @@
1
+ export interface AspectRatioUI extends Record<string, string> {
2
+ labelConfig: string;
3
+ labelRatio: string;
4
+ labelWidth: string;
5
+ labelHeight: string;
6
+ labelScale: string;
7
+ labelPixelWidth: string;
8
+ labelPixelHeight: string;
9
+ labelPreview: string;
10
+ labelStatus: string;
11
+ labelOffline: string;
12
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { calculadoraTiempoDatos } 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 calculadoraTiempoDatos.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}