@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,133 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ReadabilityCalculatorUI } from '../ui';
4
+
5
+ const slug = 'calculadora-legibilidad-visual-wcag-apca';
6
+ const title = 'Calculadora de Legibilidad Visual WCAG y APCA';
7
+ const description = 'Comprueba el contraste real de tus dise\u00f1os con APCA (WCAG 3.0). Analiza c\u00f3mo influye el grosor de la fuente y el tama\u00f1o en la lectura real. De ratios simples a legibilidad perceptual.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: '\u00bfQu\u00e9 es APCA y por qu\u00e9 es diferente a WCAG 2.1?',
12
+ answer: 'APCA es el Algoritmo de Contraste Perceptual Avanzado desarrollado para WCAG 3.0. A diferencia del antiguo ratio simple, APCA utiliza modelos matem\u00e1ticos que imitan c\u00f3mo el cerebro humano percibe el contraste, teniendo en cuenta la polaridad (fondo claro vs. oscuro) y el tama\u00f1o/grosor de las fuentes.',
13
+ },
14
+ {
15
+ question: '\u00bfQu\u00e9 significa el valor Lc?',
16
+ answer: 'Lc (Lightness Contrast) es el valor de contraste que genera APCA. Un valor de 100 representa un contraste m\u00e1ximo ideal, mientras que valores inferiores a 60 empiezan a ser cr\u00edticos para textos de lectura continua. Es una escala de magnitud absoluta de la percepci\u00f3n.',
17
+ },
18
+ {
19
+ question: '\u00bfC\u00f3mo influye el grosor de la fuente en la legibilidad?',
20
+ answer: 'Las fuentes delgadas (Thin/Light) requieren un contraste mucho mayor para ser legibles. APCA penaliza las fuentes de poco peso, indicando que un dise\u00f1o que pasa WCAG con una fuente de 100 de grosor puede ser ilegible en la pr\u00e1ctica.',
21
+ },
22
+ {
23
+ question: '\u00bfEs esta calculadora privada?',
24
+ answer: 'S\u00ed, todos los c\u00e1lculos se realizan localmente en tu navegador. Los colores y configuraciones que analices nunca se env\u00edan a ning\u00fan servidor, garantizando total privacidad en tus proyectos de dise\u00f1o.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'Elegir Colores', text: 'Usa los selectores de color para definir el color del texto y el color de fondo de tu dise\u00f1o.' },
30
+ { name: 'Ajustar Tipograf\u00eda', text: 'Mueve los sliders de tama\u00f1o y grosor de fuente para simular tu tipograf\u00eda real.' },
31
+ { name: 'Leer los Resultados', text: 'Consulta el ratio WCAG 2.1 y el valor Lc de APCA para saber si tu dise\u00f1o es accesible.' },
32
+ { name: 'Ver Recomendaciones', text: 'Revisa las recomendaciones APCA espec\u00edficas para texto de lectura, texto peque\u00f1o y elementos UI.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((s, i) => ({ '@type': 'HowToStep', position: i + 1, name: s.name, text: s.text })),
51
+ };
52
+
53
+ const appSchema: WithContext<SoftwareApplication> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'SoftwareApplication',
56
+ name: title,
57
+ description,
58
+ applicationCategory: 'UtilityApplication',
59
+ operatingSystem: 'All',
60
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
61
+ inLanguage: 'es',
62
+ };
63
+
64
+ const ui: ReadabilityCalculatorUI = {
65
+ labelColors: 'Colores Base',
66
+ labelText: 'Texto',
67
+ labelBg: 'Fondo',
68
+ labelTypo: 'Tipograf\u00eda',
69
+ labelFontSize: 'Tama\u00f1o de Fuente',
70
+ labelFontWeight: 'Grosor (Weight)',
71
+ labelCompare: 'Comparativa de Contraste',
72
+ labelPreview: 'Vista Previa Perceptual',
73
+ labelApcaRecs: 'Recomendaciones APCA',
74
+ labelBody: 'Texto de Lectura (Body)',
75
+ labelSmall: 'Texto Peque\u00f1o / Caption',
76
+ labelUi: 'UI / Botones',
77
+ statusYes: 'S\u00ed',
78
+ statusNo: 'No',
79
+ wcagAAA: 'Pasa AAA',
80
+ wcagAA: 'Pasa AA',
81
+ wcagLarge: 'Solo Texto Grande',
82
+ wcagFail: 'No Pasa',
83
+ apcaExcellent: 'Excelente',
84
+ apcaGood: 'Bueno',
85
+ apcaMinimal: 'M\u00ednimo',
86
+ apcaPoor: 'Pobre',
87
+ previewText: 'La legibilidad visual no es solo matem\u00e1tica. Es c\u00f3mo luz y sombra interact\u00faan con tus ojos.',
88
+ wcagRatioLabel: 'Ratio WCAG 2.1',
89
+ apcaLcLabel: 'APCA Lc (WCAG 3)',
90
+ };
91
+
92
+ export const content: ToolLocaleContent<ReadabilityCalculatorUI> = {
93
+ slug,
94
+ title,
95
+ description,
96
+ ui,
97
+ faqTitle: 'Preguntas Frecuentes',
98
+ faq: faqData,
99
+ bibliographyTitle: 'Recursos sobre Contraste y APCA',
100
+ bibliography: [
101
+ { name: 'W3C: Draft de WCAG 3.0 (Silver)', url: 'https://www.w3.org/WAI/standards-guidelines/wcag/wcag3-intro/' },
102
+ { name: 'Myndex: Gu\u00eda de Referencia APCA', url: 'https://apcaw3.myndex.com/' },
103
+ { name: 'MDN: Accesibilidad y Contraste de Color', url: 'https://developer.mozilla.org/es/docs/Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast' },
104
+ ],
105
+ howTo: howToData,
106
+ schemas: [faqSchema, howToSchema, appSchema],
107
+ seo: [
108
+ { type: 'title', text: 'Calculadora de Legibilidad Visual (WCAG vs APCA)', level: 2 },
109
+ {
110
+ type: 'paragraph',
111
+ html: 'Comprende c\u00f3mo tus colores y tipograf\u00eda afectan la lectura real con el nuevo est\u00e1ndar de accesibilidad perceptual. WCAG 2.1 usa una f\u00f3rmula matem\u00e1tica simple de 2008. <strong>APCA</strong> es el nuevo modelo propuesto para <strong>WCAG 3.0</strong> que imita la percepci\u00f3n humana.',
112
+ },
113
+ { type: 'title', text: 'Puntos Clave de APCA', level: 3 },
114
+ {
115
+ type: 'list',
116
+ items: [
117
+ '<strong>Polaridad:</strong> Entiende que el modo oscuro (Dark Mode) se percibe distinto al modo claro.',
118
+ '<strong>Grosor de Fuente:</strong> Asigna niveles de contraste (Lc) espec\u00edficos seg\u00fan el peso de la tipograf\u00eda.',
119
+ '<strong>Linealidad:</strong> Corrige las imprecisiones matem\u00e1ticas de la luminancia relativa de 2008.',
120
+ ],
121
+ },
122
+ { type: 'title', text: 'Niveles APCA Recomendados', level: 3 },
123
+ {
124
+ type: 'list',
125
+ items: [
126
+ '<strong>Lc 90+:</strong> Ideal para texto muy peque\u00f1o o de poco peso.',
127
+ '<strong>Lc 75:</strong> El est\u00e1ndar para texto de lectura principal (Body).',
128
+ '<strong>Lc 60:</strong> M\u00ednimo para contenido legible de tama\u00f1o medio.',
129
+ '<strong>Lc 45:</strong> M\u00ednimo para elementos grandes o decorativos.',
130
+ ],
131
+ },
132
+ ],
133
+ };
@@ -0,0 +1,133 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ReadabilityCalculatorUI } from '../ui';
4
+
5
+ const slug = 'calculateur-lisibilite-visuelle-wcag-apca';
6
+ const title = 'Calculateur de Lisibilit\u00e9 Visuelle WCAG et APCA';
7
+ const description = 'V\u00e9rifiez le contraste r\u00e9el de vos designs avec APCA (WCAG 3.0). Analysez l\'influence de la graisse et de la taille de la police sur la lisibilit\u00e9 perceptuelle.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Qu\'est-ce qu\'APCA et pourquoi est-il diff\u00e9rent de WCAG 2.1?',
12
+ answer: 'APCA est l\'Algorithme de Contraste Perceptuel Avanc\u00e9 d\u00e9velopp\u00e9 pour WCAG 3.0. Contrairement \u00e0 l\'ancien ratio simple, APCA utilise des mod\u00e8les math\u00e9matiques imitant la perception humaine du contraste, en tenant compte de la polarit\u00e9 et de la taille/graisse des polices.',
13
+ },
14
+ {
15
+ question: 'Que signifie la valeur Lc?',
16
+ answer: 'Lc (Lightness Contrast) est la valeur de contraste g\u00e9n\u00e9r\u00e9e par APCA. Une valeur de 100 repr\u00e9sente un contraste maximum id\u00e9al, tandis que des valeurs inf\u00e9rieures \u00e0 60 deviennent critiques pour les textes de lecture continue.',
17
+ },
18
+ {
19
+ question: 'Comment la graisse de la police influence-t-elle la lisibilit\u00e9?',
20
+ answer: 'Les polices fines (Thin/Light) n\u00e9cessitent un contraste bien plus \u00e9lev\u00e9 pour \u00eatre lisibles. APCA p\u00e9nalise les polices de faible poids, indiquant qu\'un design validant WCAG avec une police de graisse 100 peut \u00eatre illisible en pratique.',
21
+ },
22
+ {
23
+ question: 'Ce calculateur est-il priv\u00e9?',
24
+ answer: 'Oui, tous les calculs sont effectu\u00e9s localement dans votre navigateur. Les couleurs et configurations analys\u00e9es ne sont jamais envoy\u00e9es \u00e0 un serveur, garantissant une confidentialit\u00e9 totale.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'Choisir les Couleurs', text: 'Utilisez les s\u00e9lecteurs de couleur pour d\u00e9finir la couleur du texte et la couleur de fond de votre design.' },
30
+ { name: 'Ajuster la Typographie', text: 'D\u00e9placez les curseurs de taille et de graisse pour simuler votre typographie r\u00e9elle.' },
31
+ { name: 'Lire les R\u00e9sultats', text: 'Consultez le ratio WCAG 2.1 et la valeur Lc APCA pour savoir si votre design est accessible.' },
32
+ { name: 'Voir les Recommandations', text: 'V\u00e9rifiez les recommandations APCA sp\u00e9cifiques pour le texte de lecture, le texte petit et les \u00e9l\u00e9ments UI.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((s, i) => ({ '@type': 'HowToStep', position: i + 1, name: s.name, text: s.text })),
51
+ };
52
+
53
+ const appSchema: WithContext<SoftwareApplication> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'SoftwareApplication',
56
+ name: title,
57
+ description,
58
+ applicationCategory: 'UtilityApplication',
59
+ operatingSystem: 'All',
60
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
61
+ inLanguage: 'fr',
62
+ };
63
+
64
+ const ui: ReadabilityCalculatorUI = {
65
+ labelColors: 'Couleurs de Base',
66
+ labelText: 'Texte',
67
+ labelBg: 'Fond',
68
+ labelTypo: 'Typographie',
69
+ labelFontSize: 'Taille de Police',
70
+ labelFontWeight: 'Graisse (Weight)',
71
+ labelCompare: 'Comparaison de Contraste',
72
+ labelPreview: 'Aper\u00e7u Perceptuel',
73
+ labelApcaRecs: 'Recommandations APCA',
74
+ labelBody: 'Texte de Lecture (Body)',
75
+ labelSmall: 'Texte Petit / Caption',
76
+ labelUi: 'UI / Boutons',
77
+ statusYes: 'Oui',
78
+ statusNo: 'Non',
79
+ wcagAAA: 'Passe AAA',
80
+ wcagAA: 'Passe AA',
81
+ wcagLarge: 'Grands Textes Seulement',
82
+ wcagFail: '\u00c9choue',
83
+ apcaExcellent: 'Excellent',
84
+ apcaGood: 'Bon',
85
+ apcaMinimal: 'Minimal',
86
+ apcaPoor: 'Faible',
87
+ previewText: 'La lisibilit\u00e9 visuelle n\'est pas seulement des math\u00e9matiques. C\'est comment lumi\u00e8re et ombre interagissent avec vos yeux.',
88
+ wcagRatioLabel: 'Ratio WCAG 2.1',
89
+ apcaLcLabel: 'APCA Lc (WCAG 3)',
90
+ };
91
+
92
+ export const content: ToolLocaleContent<ReadabilityCalculatorUI> = {
93
+ slug,
94
+ title,
95
+ description,
96
+ ui,
97
+ faqTitle: 'Questions Fr\u00e9quentes',
98
+ faq: faqData,
99
+ bibliographyTitle: 'Ressources sur le Contraste et APCA',
100
+ bibliography: [
101
+ { name: 'W3C: Brouillon WCAG 3.0 (Silver)', url: 'https://www.w3.org/WAI/standards-guidelines/wcag/wcag3-intro/' },
102
+ { name: 'Myndex: Guide de R\u00e9f\u00e9rence APCA', url: 'https://apcaw3.myndex.com/' },
103
+ { name: 'MDN: Accessibilit\u00e9 et Contraste des Couleurs', url: 'https://developer.mozilla.org/fr/docs/Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast' },
104
+ ],
105
+ howTo: howToData,
106
+ schemas: [faqSchema, howToSchema, appSchema],
107
+ seo: [
108
+ { type: 'title', text: 'Calculateur de Lisibilit\u00e9 Visuelle (WCAG vs APCA)', level: 2 },
109
+ {
110
+ type: 'paragraph',
111
+ html: 'Comprenez comment vos couleurs et typographie affectent la lecture r\u00e9elle avec le nouveau standard d\'accessibilit\u00e9 perceptuelle. WCAG 2.1 utilise une formule math\u00e9matique simple de 2008. <strong>APCA</strong> est le nouveau mod\u00e8le propos\u00e9 pour <strong>WCAG 3.0</strong> qui imite la perception humaine.',
112
+ },
113
+ { type: 'title', text: 'Points Cl\u00e9s d\'APCA', level: 3 },
114
+ {
115
+ type: 'list',
116
+ items: [
117
+ '<strong>Polarit\u00e9:</strong> Comprend que le mode sombre (Dark Mode) est per\u00e7u diff\u00e9remment du mode clair.',
118
+ '<strong>Graisse de Police:</strong> Attribue des niveaux de contraste (Lc) sp\u00e9cifiques selon le poids typographique.',
119
+ '<strong>Lin\u00e9arit\u00e9:</strong> Corrige les impr\u00e9cisions math\u00e9matiques du mod\u00e8le de luminance relative de 2008.',
120
+ ],
121
+ },
122
+ { type: 'title', text: 'Niveaux APCA Recommand\u00e9s', level: 3 },
123
+ {
124
+ type: 'list',
125
+ items: [
126
+ '<strong>Lc 90+:</strong> Id\u00e9al pour les textes tr\u00e8s petits ou de faible graisse.',
127
+ '<strong>Lc 75:</strong> Le standard pour le texte de lecture principal (Body).',
128
+ '<strong>Lc 60:</strong> Minimum pour un contenu lisible de taille moyenne.',
129
+ '<strong>Lc 45:</strong> Minimum pour les \u00e9l\u00e9ments larges ou d\u00e9coratifs.',
130
+ ],
131
+ },
132
+ ],
133
+ };
@@ -0,0 +1,33 @@
1
+ import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+ import ReadabilityCalculatorComponent from './component.astro';
3
+ import ReadabilityCalculatorSEO from './seo.astro';
4
+ import ReadabilityCalculatorBibliography from './bibliography.astro';
5
+ import type { ReadabilityCalculatorUI } from './ui';
6
+
7
+ export type ReadabilityCalculatorLocaleContent = ToolLocaleContent<ReadabilityCalculatorUI>;
8
+
9
+ import { content as es } from './i18n/es';
10
+ import { content as en } from './i18n/en';
11
+ import { content as fr } from './i18n/fr';
12
+
13
+ export const readabilityCalculator: DeveloperToolEntry<ReadabilityCalculatorUI> = {
14
+ id: 'readability-calculator',
15
+ icons: {
16
+ bg: 'mdi:eye-check',
17
+ fg: 'mdi:contrast-circle',
18
+ },
19
+ i18n: {
20
+ es: async () => es,
21
+ en: async () => en,
22
+ fr: async () => fr,
23
+ },
24
+ };
25
+
26
+ export { ReadabilityCalculatorComponent, ReadabilityCalculatorSEO, ReadabilityCalculatorBibliography };
27
+
28
+ export const READABILITY_CALCULATOR_TOOL: ToolDefinition = {
29
+ entry: readabilityCalculator,
30
+ Component: ReadabilityCalculatorComponent,
31
+ SEOComponent: ReadabilityCalculatorSEO,
32
+ BibliographyComponent: ReadabilityCalculatorBibliography,
33
+ };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { readabilityCalculator } 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 readabilityCalculator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,27 @@
1
+ export interface ReadabilityCalculatorUI extends Record<string, string> {
2
+ labelColors: string;
3
+ labelText: string;
4
+ labelBg: string;
5
+ labelTypo: string;
6
+ labelFontSize: string;
7
+ labelFontWeight: string;
8
+ labelCompare: string;
9
+ labelPreview: string;
10
+ labelApcaRecs: string;
11
+ labelBody: string;
12
+ labelSmall: string;
13
+ labelUi: string;
14
+ statusYes: string;
15
+ statusNo: string;
16
+ wcagAAA: string;
17
+ wcagAA: string;
18
+ wcagLarge: string;
19
+ wcagFail: string;
20
+ apcaExcellent: string;
21
+ apcaGood: string;
22
+ apcaMinimal: string;
23
+ apcaPoor: string;
24
+ previewText: string;
25
+ wcagRatioLabel: string;
26
+ apcaLcLabel: string;
27
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { svgSanitizer } 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 svgSanitizer.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}