@jjlmoya/utils-audiovisual 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 (120) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +198 -0
  3. package/src/category/i18n/es.ts +198 -0
  4. package/src/category/i18n/fr.ts +198 -0
  5. package/src/category/index.ts +17 -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 +4 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +32 -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/faq_count.test.ts +19 -0
  17. package/src/tests/locale_completeness.test.ts +42 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +48 -0
  20. package/src/tests/seo_length.test.ts +22 -0
  21. package/src/tests/tool_validation.test.ts +17 -0
  22. package/src/tool/chromaticLens/bibliography.astro +17 -0
  23. package/src/tool/chromaticLens/component.astro +178 -0
  24. package/src/tool/chromaticLens/i18n/en.ts +246 -0
  25. package/src/tool/chromaticLens/i18n/es.ts +244 -0
  26. package/src/tool/chromaticLens/i18n/fr.ts +244 -0
  27. package/src/tool/chromaticLens/index.ts +43 -0
  28. package/src/tool/chromaticLens/logic.ts +87 -0
  29. package/src/tool/chromaticLens/seo.astro +15 -0
  30. package/src/tool/chromaticLens/style.css +308 -0
  31. package/src/tool/chromaticLens/ui.ts +109 -0
  32. package/src/tool/collageMaker/bibliography.astro +17 -0
  33. package/src/tool/collageMaker/component.astro +302 -0
  34. package/src/tool/collageMaker/i18n/en.ts +233 -0
  35. package/src/tool/collageMaker/i18n/es.ts +231 -0
  36. package/src/tool/collageMaker/i18n/fr.ts +231 -0
  37. package/src/tool/collageMaker/index.ts +51 -0
  38. package/src/tool/collageMaker/logic.ts +134 -0
  39. package/src/tool/collageMaker/seo.astro +15 -0
  40. package/src/tool/collageMaker/style.css +386 -0
  41. package/src/tool/exifCleaner/bibliography.astro +18 -0
  42. package/src/tool/exifCleaner/component.astro +162 -0
  43. package/src/tool/exifCleaner/i18n/en.ts +277 -0
  44. package/src/tool/exifCleaner/i18n/es.ts +277 -0
  45. package/src/tool/exifCleaner/i18n/fr.ts +277 -0
  46. package/src/tool/exifCleaner/index.ts +57 -0
  47. package/src/tool/exifCleaner/logic.ts +135 -0
  48. package/src/tool/exifCleaner/seo.astro +18 -0
  49. package/src/tool/exifCleaner/style.css +289 -0
  50. package/src/tool/exifCleaner/ui.ts +117 -0
  51. package/src/tool/imageCompressor/bibliography.astro +17 -0
  52. package/src/tool/imageCompressor/component.astro +262 -0
  53. package/src/tool/imageCompressor/i18n/en.ts +232 -0
  54. package/src/tool/imageCompressor/i18n/es.ts +230 -0
  55. package/src/tool/imageCompressor/i18n/fr.ts +230 -0
  56. package/src/tool/imageCompressor/index.ts +50 -0
  57. package/src/tool/imageCompressor/logic.ts +79 -0
  58. package/src/tool/imageCompressor/seo.astro +15 -0
  59. package/src/tool/imageCompressor/style.css +503 -0
  60. package/src/tool/printQualityCalculator/bibliography.astro +18 -0
  61. package/src/tool/printQualityCalculator/component.astro +318 -0
  62. package/src/tool/printQualityCalculator/i18n/en.ts +247 -0
  63. package/src/tool/printQualityCalculator/i18n/es.ts +245 -0
  64. package/src/tool/printQualityCalculator/i18n/fr.ts +245 -0
  65. package/src/tool/printQualityCalculator/index.ts +56 -0
  66. package/src/tool/printQualityCalculator/logic.ts +53 -0
  67. package/src/tool/printQualityCalculator/seo.astro +18 -0
  68. package/src/tool/printQualityCalculator/style.css +491 -0
  69. package/src/tool/printQualityCalculator/ui.ts +122 -0
  70. package/src/tool/privacyBlur/bibliography.astro +17 -0
  71. package/src/tool/privacyBlur/component.astro +230 -0
  72. package/src/tool/privacyBlur/i18n/en.ts +238 -0
  73. package/src/tool/privacyBlur/i18n/es.ts +236 -0
  74. package/src/tool/privacyBlur/i18n/fr.ts +236 -0
  75. package/src/tool/privacyBlur/index.ts +49 -0
  76. package/src/tool/privacyBlur/logic.ts +249 -0
  77. package/src/tool/privacyBlur/seo.astro +15 -0
  78. package/src/tool/privacyBlur/style.css +332 -0
  79. package/src/tool/privacyBlur/ui.ts +124 -0
  80. package/src/tool/subtitleSync/bibliography.astro +17 -0
  81. package/src/tool/subtitleSync/component.astro +187 -0
  82. package/src/tool/subtitleSync/i18n/en.ts +241 -0
  83. package/src/tool/subtitleSync/i18n/es.ts +241 -0
  84. package/src/tool/subtitleSync/i18n/fr.ts +241 -0
  85. package/src/tool/subtitleSync/index.ts +49 -0
  86. package/src/tool/subtitleSync/logic.ts +91 -0
  87. package/src/tool/subtitleSync/seo.astro +15 -0
  88. package/src/tool/subtitleSync/style.css +325 -0
  89. package/src/tool/subtitleSync/ui.ts +152 -0
  90. package/src/tool/timelapseCalculator/bibliography.astro +15 -0
  91. package/src/tool/timelapseCalculator/component.astro +148 -0
  92. package/src/tool/timelapseCalculator/i18n/en.ts +169 -0
  93. package/src/tool/timelapseCalculator/i18n/es.ts +169 -0
  94. package/src/tool/timelapseCalculator/i18n/fr.ts +169 -0
  95. package/src/tool/timelapseCalculator/index.ts +52 -0
  96. package/src/tool/timelapseCalculator/logic.ts +46 -0
  97. package/src/tool/timelapseCalculator/seo.astro +18 -0
  98. package/src/tool/timelapseCalculator/style.css +285 -0
  99. package/src/tool/tvDistance/bibliography.astro +17 -0
  100. package/src/tool/tvDistance/component.astro +178 -0
  101. package/src/tool/tvDistance/i18n/en.ts +223 -0
  102. package/src/tool/tvDistance/i18n/es.ts +223 -0
  103. package/src/tool/tvDistance/i18n/fr.ts +223 -0
  104. package/src/tool/tvDistance/index.ts +49 -0
  105. package/src/tool/tvDistance/logic.ts +47 -0
  106. package/src/tool/tvDistance/seo.astro +15 -0
  107. package/src/tool/tvDistance/style.css +435 -0
  108. package/src/tool/tvDistance/ui.ts +66 -0
  109. package/src/tool/videoFrameExtractor/bibliography.astro +17 -0
  110. package/src/tool/videoFrameExtractor/component.astro +285 -0
  111. package/src/tool/videoFrameExtractor/i18n/en.ts +235 -0
  112. package/src/tool/videoFrameExtractor/i18n/es.ts +235 -0
  113. package/src/tool/videoFrameExtractor/i18n/fr.ts +235 -0
  114. package/src/tool/videoFrameExtractor/index.ts +53 -0
  115. package/src/tool/videoFrameExtractor/logic.ts +49 -0
  116. package/src/tool/videoFrameExtractor/seo.astro +15 -0
  117. package/src/tool/videoFrameExtractor/style.css +426 -0
  118. package/src/tool/videoFrameExtractor/ui.ts +179 -0
  119. package/src/tools.ts +25 -0
  120. package/src/types.ts +72 -0
@@ -0,0 +1,223 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { TvDistanceUI, TvDistanceLocaleContent } from '../index';
3
+
4
+ const slug = 'distancia-tv';
5
+ const title = 'Calculadora de Distancia TV - Pantalla Óptima THX y 4K';
6
+ const description = 'Calcula la distancia ideal para ver tu televisor según su tamaño y resolución. Optimiza tu Home Cinema con los estándares THX y SMPTE.';
7
+
8
+ const ui: TvDistanceUI = {
9
+ specTitle: "Especificaciones",
10
+ diagonalLabel: "Tamaño Diagonal",
11
+ resolutionLabel: "Resolución",
12
+ thxRecommendation: "Recomendación THX",
13
+ thxDescription: "THX recomienda una distancia que cubra un ángulo de visión de 40 grados para una experiencia cinematográfica inmersiva.",
14
+ simulationBadge: "Simulación en Tiempo Real",
15
+ tvWidthLabel: "cm de ancho",
16
+ userLocationLabel: "Tu Ubicación",
17
+ minLimitLabel: "Límite Mínimo",
18
+ optimalLimitLabel: "Distancia Óptima",
19
+ maxLimitLabel: "Límite Máximo",
20
+ unitMeters: "m",
21
+ unitCm: "cm"
22
+ };
23
+
24
+ const faq: TvDistanceLocaleContent['faq'] = [
25
+ {
26
+ question: "¿Por qué importa la resolución al calcular la distancia?",
27
+ answer: "A mayor resolución (como 4K u 8K), los píxeles son más pequeños. Esto permite sentarse más cerca sin percibir la rejilla de píxeles, aumentando la inmersión sin perder nitidez.",
28
+ },
29
+ {
30
+ question: "¿Qué es el ángulo de visión de 40 grados?",
31
+ answer: "Es el estándar recomendado por THX para que la pantalla ocupe gran parte de tu visión periférica, similar a la experiencia de una sala de cine profesional.",
32
+ },
33
+ {
34
+ question: "¿Puedo sentarme más lejos de lo recomendado?",
35
+ answer: "Sí, pero perderás el beneficio de las altas resoluciones. Si te sientas muy lejos de una TV 4K, tu ojo no podrá distinguir los detalles extra y la verás como si fuera 1080p.",
36
+ },
37
+ ];
38
+
39
+ const howTo: TvDistanceLocaleContent['howTo'] = [
40
+ {
41
+ name: "Indica las pulgadas",
42
+ text: "Mueve el deslizador hasta seleccionar el tamaño de tu televisor actual o el que piensas comprar.",
43
+ },
44
+ {
45
+ name: "Selecciona la resolución",
46
+ text: "Elige entre 1080p, 4K u 8K para ajustar los límites de agudeza visual.",
47
+ },
48
+ {
49
+ name: "Visualiza la simulación",
50
+ text: "Observa en el diagrama cómo cambia la relación de tamaño entre tú y la pantalla.",
51
+ },
52
+ {
53
+ name: "Ajusta tu sofá",
54
+ text: "Coloca tu asiento dentro del rango de 'Distancia Óptima' para maximizar la inmersión cinematográfica.",
55
+ },
56
+ ];
57
+
58
+ const bibliography: TvDistanceLocaleContent['bibliography'] = [
59
+ {
60
+ name: "THX - HDTV Set Up Guide",
61
+ url: "https://www.thx.com/questions/what-is-the-best-viewing-distance-for-my-tv/",
62
+ },
63
+ {
64
+ name: "SMPTE - Documentación de Estándares",
65
+ url: "https://www.smpte.org/",
66
+ },
67
+ ];
68
+
69
+ const seo: TvDistanceLocaleContent['seo'] = [
70
+ {
71
+ type: 'summary',
72
+ title: 'Distancia Óptima para TV según Resolución y Tamaño',
73
+ items: [
74
+ 'Estándares THX (40°) para experiencia cinematográfica inmersiva',
75
+ 'Cálculos para 1080p, 4K y 8K con máxima precisión',
76
+ 'Simulación visual en tiempo real de tu configuración',
77
+ 'Evita fatiga ocular y maximiza la inmersión del contenido'
78
+ ]
79
+ },
80
+ { type: 'title', text: 'Ciencia de la Inmersión: Distancia Óptima para TV', level: 2 },
81
+ { type: 'paragraph', html: 'No se trata solo de comodidad, sino de fisiología visual humana. El ojo tiene un límite de agudeza resolución; si te sientas demasiado lejos de una pantalla 4K, estás desperdiciando dinero en píxeles que tu visión no puede aprovechar. Y si te sientas demasiado cerca, causa fatiga ocular.' },
82
+
83
+ { type: 'stats', items: [
84
+ { value: '40°', label: 'Ángulo THX Ideal', icon: 'mdi:eye' },
85
+ { value: '100%', label: 'Píxeles Aprovechados', icon: 'mdi:video-high-definition' },
86
+ { value: 'Cero', label: 'Fatiga Visual', icon: 'mdi:heart-pulse' }
87
+ ], columns: 3 },
88
+
89
+ { type: 'title', text: 'Dos Estándares Profesionales: THX vs SMPTE', level: 3 },
90
+ { type: 'paragraph', html: 'Existen dos autoridades principales en la industria audiovisual que definen cómo optimizar tu experiencia de visualización:' },
91
+ { type: 'comparative', items: [
92
+ {
93
+ title: 'Estándar THX',
94
+ description: 'Ángulo de visión de 40° - Más inmersivo',
95
+ icon: 'mdi:filmstrip',
96
+ points: [
97
+ 'Pantalla ocupa mayor parte de tu visión periférica',
98
+ 'Experiencia cinematográfica inmersiva',
99
+ 'Ideal para películas de acción, deportes en vivo',
100
+ 'Requiere más espacio en la sala'
101
+ ],
102
+ highlight: true
103
+ },
104
+ {
105
+ title: 'Estándar SMPTE',
106
+ description: 'Ángulo de visión de 30° - Más relajado',
107
+ icon: 'mdi:television',
108
+ points: [
109
+ 'Distancia más cómoda para sentarse',
110
+ 'Recomendación profesional conservadora',
111
+ 'Ideal para contenido variado (noticias, series)',
112
+ 'Mejor para salas más pequeñas'
113
+ ]
114
+ }
115
+ ], columns: 2 },
116
+
117
+ { type: 'title', text: 'Cómo la Resolución Cambia la Ecuación', level: 3 },
118
+ { type: 'table', headers: ['Resolución', 'Tamaño TV de 55"', 'Distancia Mínima (sin píxeles visibles)', 'Distancia Óptima THX'], rows: [
119
+ ['1080p (Full HD)', '55 pulgadas', '2.0 m', '2.3 m'],
120
+ ['4K (Ultra HD)', '55 pulgadas', '1.2 m', '1.5 m'],
121
+ ['8K', '55 pulgadas', '0.8 m', '1.0 m']
122
+ ] },
123
+
124
+ { type: 'paragraph', html: 'Como ves, la resolución más alta permite sentarse más cerca sin percibir la estructura de píxeles. Una TV 4K puede apreciarse desde 1.2 metros de distancia; un 1080p necesita al menos 2 metros.' },
125
+
126
+ { type: 'card', title: 'El Límite de la Agudeza Visual Humana', html: 'El ojo humano tiene una capacidad límite de resolución (agudeza visual). A partir de cierta distancia, no puedes distinguir más detalles aunque la pantalla tenga 8K. Nuestros cálculos te posicionan exactamente en la "zona óptima" donde aprovechas el 100% de los píxeles sin gastar energía ocular innecesaria.' },
127
+
128
+ { type: 'diagnostic', variant: 'info', title: 'Fatiga Ocular y Distancia', icon: 'mdi:information', badge: 'Salud Visual', html: 'Estar demasiado cerca causa fatiga porque tus ojos necesitan acomodarse constantemente a ángulos extremos. Estar demasiado lejos causa esfuerzo para distinguir detalles. Nuestra calculadora te posiciona en el "sweet spot" donde la pantalla llena tu visión natural (40° para THX) sin causar estrés ocular.' },
129
+
130
+ { type: 'proscons', items: [
131
+ {
132
+ pro: 'THX 40° crea inmersión cinematográfica verdadera - como una sala de cine profesional',
133
+ con: 'Requiere más espacio disponible en la sala'
134
+ },
135
+ {
136
+ pro: '4K permite sentarse más cerca que 1080p - útil en espacios pequeños',
137
+ con: 'Debes estar a distancia mínima para aprovechar los píxeles extra'
138
+ },
139
+ {
140
+ pro: 'Evita fatiga ocular posicionándote correctamente desde el inicio',
141
+ con: 'La mayoría de salas caseras NO siguen estos estándares (por eso la fatiga)'
142
+ },
143
+ {
144
+ pro: 'Puedes validar si tu TV actual está bien posicionada',
145
+ con: 'Si está mal, requiere mover muebles (no es cuestión de software)'
146
+ }
147
+ ], proTitle: 'Ventajas', conTitle: 'Limitaciones' },
148
+
149
+ { type: 'glossary', items: [
150
+ {
151
+ term: 'Ángulo de Visión (en grados)',
152
+ definition: 'Ángulo visual que abarca la pantalla desde tu posición. 40° = muy inmersivo (periférica cubierta); 20° = contenido de fondo (no inmersivo).'
153
+ },
154
+ {
155
+ term: 'THX (Tomlinson Holman Experiment)',
156
+ definition: 'Certificación de calidad audiovisual creada por Lucasfilm. Define estándares para cines, home theater y equipos de audio. 40° es su recomendación principal.'
157
+ },
158
+ {
159
+ term: 'SMPTE (Society of Motion Picture Technical Engineers)',
160
+ definition: 'Organización de estándares técnicos para cine y vídeo. Recomienda 30° como distancia profesional conservadora.'
161
+ },
162
+ {
163
+ term: 'Agudeza Visual Humana',
164
+ definition: 'Capacidad del ojo para distinguir detalles finos. Un píxel individual es imperceptible pasada cierta distancia (depende de resolución).'
165
+ },
166
+ {
167
+ term: '4K (Ultra HD)',
168
+ definition: 'Resolución de ~3840x2160 píxeles. 4 veces más píxeles que 1080p. Permite acercarse más sin percibir la estructura de píxeles.'
169
+ }
170
+ ] },
171
+
172
+ { type: 'message', title: 'Optimización Profesional de Salas Audiovisuales', ariaLabel: 'Información sobre estándares de configuración de TV', html: 'Los cines profesionales gastan millones asegurando que la distancia, ángulo e iluminación sean perfectos. Nuestra calculadora te trae esos mismos principios a tu casa. No es lujo: es una inversión en comodidad visual y aprovechamiento máximo de tu equipo.' },
173
+
174
+ { type: 'title', text: 'Configura tu Home Cinema Profesionalmente', level: 3 },
175
+ { type: 'paragraph', html: 'La distancia es TAN importante como el tamaño de pantalla y la resolución. Sigue estos estándares para transformar tu salón en una auténtica sala cinematográfica. Verás películas, series y contenido deportivo con la inmersión para la que fueron diseñados.' }
176
+ ];
177
+
178
+ const faqSchema: WithContext<FAQPage> = {
179
+ '@context': 'https://schema.org',
180
+ '@type': 'FAQPage',
181
+ mainEntity: faq.map((item) => ({
182
+ '@type': 'Question',
183
+ name: item.question,
184
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
185
+ })),
186
+ };
187
+
188
+ const howToSchema: WithContext<HowTo> = {
189
+ '@context': 'https://schema.org',
190
+ '@type': 'HowTo',
191
+ name: title,
192
+ description,
193
+ step: howTo.map((step) => ({
194
+ '@type': 'HowToStep',
195
+ name: step.name,
196
+ text: step.text,
197
+ })),
198
+ };
199
+
200
+ const appSchema: WithContext<SoftwareApplication> = {
201
+ '@context': 'https://schema.org',
202
+ '@type': 'SoftwareApplication',
203
+ name: title,
204
+ description,
205
+ applicationCategory: 'UtilitiesApplication',
206
+ operatingSystem: 'Web',
207
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
208
+ inLanguage: 'es',
209
+ };
210
+
211
+ export const content: TvDistanceLocaleContent = {
212
+ slug,
213
+ title,
214
+ description,
215
+ ui,
216
+ seo,
217
+ faq,
218
+ faqTitle: 'Preguntas frecuentes sobre distancia de TV',
219
+ bibliography,
220
+ bibliographyTitle: 'Estándares profesionales de configuración TV',
221
+ howTo,
222
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
223
+ };
@@ -0,0 +1,223 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { TvDistanceUI, TvDistanceLocaleContent } from '../index';
3
+
4
+ const slug = 'calculatrice-distance-tv-ecran-optimal-thx-4k';
5
+ const title = 'Calculatrice de Distance TV - Écran Optimal THX et 4K';
6
+ const description = 'Calculez la distance idéale pour regarder votre téléviseur en fonction de sa taille et de sa résolution. Optimisez votre Home Cinéma avec les standards THX et SMPTE.';
7
+
8
+ const ui: TvDistanceUI = {
9
+ specTitle: "Spécifications",
10
+ diagonalLabel: "Taille diagonale",
11
+ resolutionLabel: "Résolution",
12
+ thxRecommendation: "Recommandation THX",
13
+ thxDescription: "THX recommande une distance couvrant un angle de vision de 40 degrés pour une expérience cinématographique immersive.",
14
+ simulationBadge: "Simulation en temps réel",
15
+ tvWidthLabel: "cm de large",
16
+ userLocationLabel: "Votre emplacement",
17
+ minLimitLabel: "Limite minimale",
18
+ optimalLimitLabel: "Distance optimale",
19
+ maxLimitLabel: "Limite maximale",
20
+ unitMeters: "m",
21
+ unitCm: "cm"
22
+ };
23
+
24
+ const faq: TvDistanceLocaleContent['faq'] = [
25
+ {
26
+ question: "Pourquoi la résolution est-elle importante pour le calcul de la distance ?",
27
+ answer: "À des résolutions plus élevées (comme 4K ou 8K), les pixels sont plus petits. Cela vous permet de vous asseoir plus près sans percevoir la grille de pixels.",
28
+ },
29
+ {
30
+ question: "Qu'est-ce que l'angle de vision de 40 degrés ?",
31
+ answer: "C'est la norme recommandée par THX pour que l'écran occupe une grande partie de votre vision périphérique, comme dans un cinéma professionnel.",
32
+ },
33
+ {
34
+ question: "Puis-je m'asseoir plus loin que recommandé ?",
35
+ answer: "Oui, mais vous perdrez le bénéfice des hautes résolutions. Si vous êtes trop loin d'un téléviseur 4K, votre œil ne pourra pas distinguer les détails supplémentaires.",
36
+ },
37
+ ];
38
+
39
+ const howTo: TvDistanceLocaleContent['howTo'] = [
40
+ {
41
+ name: "Indiquez les pouces",
42
+ text: "Déplacez le curseur pour sélectionner la taille de votre téléviseur actuel ou de celui que vous prévoyez d'acheter.",
43
+ },
44
+ {
45
+ name: "Sélectionnez la résolution",
46
+ text: "Choisissez entre 1080p, 4K ou 8K pour ajuster les limites d'acuité visuelle.",
47
+ },
48
+ {
49
+ name: "Visualisez la simulation",
50
+ text: "Observez sur le schéma comment la relation de taille entre vous et l'écran change.",
51
+ },
52
+ {
53
+ name: "Ajustez votre canapé",
54
+ text: "Placez votre siège dans la plage de 'Distance optimale' pour maximiser l'immersion cinématographique.",
55
+ },
56
+ ];
57
+
58
+ const bibliography: TvDistanceLocaleContent['bibliography'] = [
59
+ {
60
+ name: "THX - HDTV Set Up Guide",
61
+ url: "https://www.thx.com/questions/what-is-the-best-viewing-distance-for-my-tv/",
62
+ },
63
+ {
64
+ name: "SMPTE - Documentation des normes",
65
+ url: "https://www.smpte.org/",
66
+ },
67
+ ];
68
+
69
+ const seo: TvDistanceLocaleContent['seo'] = [
70
+ {
71
+ type: 'summary',
72
+ title: 'Distance TV Optimale par Résolution et Taille',
73
+ items: [
74
+ 'Normes THX (40°) pour une expérience cinématographique immersive',
75
+ 'Calculs pour 1080p, 4K et 8K avec une précision maximale',
76
+ 'Simulation visuelle en temps réel de votre configuration',
77
+ 'Évitez la fatigue oculaire et maximisez l\'immersion'
78
+ ]
79
+ },
80
+ { type: 'title', text: 'Science de l\'Immersion : Distance TV Optimale', level: 2 },
81
+ { type: 'paragraph', html: 'Il ne s\'agit pas seulement de confort, mais de physiologie visuelle humaine. L\'œil a une limite d\'acuité de résolution ; si vous êtes trop loin d\'un écran 4K, vous gaspillez des pixels que votre vision ne peut exploiter.' },
82
+
83
+ { type: 'stats', items: [
84
+ { value: '40°', label: 'Angle THX Idéal', icon: 'mdi:eye' },
85
+ { value: '100%', label: 'Pixels Exploités', icon: 'mdi:video-high-definition' },
86
+ { value: 'Zéro', label: 'Fatigue Visuelle', icon: 'mdi:heart-pulse' }
87
+ ], columns: 3 },
88
+
89
+ { type: 'title', text: 'Deux Normes Professionnelles : THX vs SMPTE', level: 3 },
90
+ { type: 'paragraph', html: 'Il existe deux autorités principales dans l\'industrie audiovisuelle qui définissent comment optimiser votre expérience :' },
91
+ { type: 'comparative', items: [
92
+ {
93
+ title: 'Norme THX',
94
+ description: 'Angle de vision de 40° - Plus immersif',
95
+ icon: 'mdi:filmstrip',
96
+ points: [
97
+ 'L\'écran occupe une plus grande part de votre vision périphérique',
98
+ 'Expérience cinématographique immersive',
99
+ 'Idéal pour les films d\'action et le sport',
100
+ 'Nécessite plus d\'espace dans la pièce'
101
+ ],
102
+ highlight: true
103
+ },
104
+ {
105
+ title: 'Norme SMPTE',
106
+ description: 'Angle de vision de 30° - Plus détendu',
107
+ icon: 'mdi:television',
108
+ points: [
109
+ 'Distance d\'assise plus confortable',
110
+ 'Recommandation professionnelle conservatrice',
111
+ 'Idéal pour des contenus variés (infos, séries)',
112
+ 'Mieux pour les petites pièces'
113
+ ]
114
+ }
115
+ ], columns: 2 },
116
+
117
+ { type: 'title', text: 'Comment la Résolution Change l\'Équation', level: 3 },
118
+ { type: 'table', headers: ['Résolution', 'Taille TV 55"', 'Distance Min. (sans pixels visibles)', 'Distance Optimale THX'], rows: [
119
+ ['1080p (Full HD)', '55 pouces', '2,0 m', '2,3 m'],
120
+ ['4K (Ultra HD)', '55 pouces', '1,2 m', '1,5 m'],
121
+ ['8K', '55 pouces', '0,8 m', '1,0 m']
122
+ ] },
123
+
124
+ { type: 'paragraph', html: 'Comme vous le voyez, une résolution plus élevée permet de s\'asseoir plus près sans percevoir la structure des pixels.' },
125
+
126
+ { type: 'card', title: 'La Limite de l\'Acuité Visuelle Humaine', html: 'L\'œil humain a une limite de résolution. Au-delà d\'une certaine distance, vous ne pouvez plus distinguer de détails, même si l\'écran est en 8K. Nos calculs vous positionnent exactement dans la "zone optimale".' },
127
+
128
+ { type: 'diagnostic', variant: 'info', title: 'Fatigue Oculaire et Distance', icon: 'mdi:information', badge: 'Santé Visuelle', html: 'Être trop près cause de la fatigue car vos yeux doivent constamment s\'adapter à des angles extrêmes. Notre calculatrice vous place au point idéal.' },
129
+
130
+ { type: 'proscons', items: [
131
+ {
132
+ pro: 'Le THX 40° crée une véritable immersion - comme dans une salle professionnelle',
133
+ con: 'Nécessite plus d\'espace dans la pièce'
134
+ },
135
+ {
136
+ pro: 'Le 4K permet de s\'asseoir plus près - utile dans les petits espaces',
137
+ con: 'Vous devez être à distance minimale pour profiter des pixels'
138
+ },
139
+ {
140
+ pro: 'Évitez la fatigue oculaire en vous positionnant correctement dès le départ',
141
+ con: 'La plupart des salons ne suivent pas ces normes'
142
+ },
143
+ {
144
+ pro: 'Vous pouvez valider si votre TV actuelle est bien placée',
145
+ con: 'Si c\'est faux, il faut déplacer les meubles'
146
+ }
147
+ ], proTitle: 'Avantages', conTitle: 'Limitations' },
148
+
149
+ { type: 'glossary', items: [
150
+ {
151
+ term: 'Angle de Vision',
152
+ definition: 'Angle visuel que couvre l\'écran depuis votre position. 40° = très immersif.'
153
+ },
154
+ {
155
+ term: 'THX',
156
+ definition: 'Certification qualité créée par Lucasfilm. 40° est sa recommandation principale.'
157
+ },
158
+ {
159
+ term: 'SMPTE (Society of Motion Picture Technical Engineers)',
160
+ definition: 'Organisation de normes techniques pour le cinéma et la vidéo. Recommande 30° comme distance professionnelle conservatrice.'
161
+ },
162
+ {
163
+ term: 'Acuité Visuelle Humaine',
164
+ definition: 'Capacité de l\'œil à distinguer les détails fins.'
165
+ },
166
+ {
167
+ term: '4K (Ultra HD)',
168
+ definition: 'Résolution de ~3840x2160 pixels. Permet de se rapprocher sans voir les pixels.'
169
+ }
170
+ ] },
171
+
172
+ { type: 'message', title: 'Optimisation Professionnelle', ariaLabel: 'Informations sur l\'installation TV', html: 'Les cinémas professionnels dépensent des millions pour l\'angle et la distance. Notre outil apporte ces principes chez vous pour un confort maximal.' },
173
+
174
+ { type: 'title', text: 'Installez votre Home Cinéma en Professionnel', level: 3 },
175
+ { type: 'paragraph', html: 'La distance est TOUT AUSSI importante que la taille de l\'écran. Suivez ces normes pour transformer votre salon en salle de cinéma.' }
176
+ ];
177
+
178
+ const faqSchema: WithContext<FAQPage> = {
179
+ '@context': 'https://schema.org',
180
+ '@type': 'FAQPage',
181
+ mainEntity: faq.map((item) => ({
182
+ '@type': 'Question',
183
+ name: item.question,
184
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
185
+ })),
186
+ };
187
+
188
+ const howToSchema: WithContext<HowTo> = {
189
+ '@context': 'https://schema.org',
190
+ '@type': 'HowTo',
191
+ name: title,
192
+ description,
193
+ step: howTo.map((step) => ({
194
+ '@type': 'HowToStep',
195
+ name: step.name,
196
+ text: step.text,
197
+ })),
198
+ };
199
+
200
+ const appSchema: WithContext<SoftwareApplication> = {
201
+ '@context': 'https://schema.org',
202
+ '@type': 'SoftwareApplication',
203
+ name: title,
204
+ description,
205
+ applicationCategory: 'UtilitiesApplication',
206
+ operatingSystem: 'Web',
207
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
208
+ inLanguage: 'fr',
209
+ };
210
+
211
+ export const content: TvDistanceLocaleContent = {
212
+ slug,
213
+ title,
214
+ description,
215
+ ui,
216
+ seo,
217
+ faq,
218
+ faqTitle: 'Foire Aux Questions sur la Distance de Visionnage TV',
219
+ bibliography,
220
+ bibliographyTitle: 'Normes Professionnelles pour la Configuration de Téléviseur',
221
+ howTo,
222
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
223
+ };
@@ -0,0 +1,49 @@
1
+ import type { AudiovisualToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+ import TvDistance from './component.astro';
3
+ import TvDistanceSEO from './seo.astro';
4
+ import TvDistanceBibliography from './bibliography.astro';
5
+
6
+ export interface TvDistanceUI {
7
+ specTitle: string;
8
+ diagonalLabel: string;
9
+ resolutionLabel: string;
10
+ thxRecommendation: string;
11
+ thxDescription: string;
12
+ simulationBadge: string;
13
+ tvWidthLabel: string;
14
+ userLocationLabel: string;
15
+ minLimitLabel: string;
16
+ optimalLimitLabel: string;
17
+ maxLimitLabel: string;
18
+ unitMeters: string;
19
+ unitCm: string;
20
+ [key: string]: string;
21
+ }
22
+
23
+ export type TvDistanceLocaleContent = ToolLocaleContent<TvDistanceUI>;
24
+
25
+ import { content as es } from './i18n/es';
26
+ import { content as en } from './i18n/en';
27
+ import { content as fr } from './i18n/fr';
28
+
29
+ export const tvDistance: AudiovisualToolEntry<TvDistanceUI> = {
30
+ id: 'distancia-tv',
31
+ icons: {
32
+ bg: 'mdi:television',
33
+ fg: 'mdi:ruler',
34
+ },
35
+ i18n: {
36
+ es: async () => es as unknown as TvDistanceLocaleContent,
37
+ en: async () => en as unknown as TvDistanceLocaleContent,
38
+ fr: async () => fr as unknown as TvDistanceLocaleContent,
39
+ },
40
+ };
41
+
42
+ export { TvDistance, TvDistanceSEO, TvDistanceBibliography };
43
+
44
+ export const TV_DISTANCE_TOOL: ToolDefinition = {
45
+ entry: tvDistance as unknown as AudiovisualToolEntry,
46
+ Component: TvDistance,
47
+ SEOComponent: TvDistanceSEO,
48
+ BibliographyComponent: TvDistanceBibliography,
49
+ };
@@ -0,0 +1,47 @@
1
+ export interface TVSpecs {
2
+ diagonalInches: number;
3
+ resolution: "1080p" | "4k" | "8k";
4
+ aspectRatio: number;
5
+ }
6
+
7
+ export interface ViewingDistance {
8
+ optimal: number;
9
+ min: number;
10
+ max: number;
11
+ }
12
+
13
+ export function getDimensionsFromDiagonal(
14
+ diagonalInches: number,
15
+ aspectRatio: number = 16 / 9
16
+ ): { width: number; height: number } {
17
+ const diagonalCm = diagonalInches * 2.54;
18
+ const angle = Math.atan(1 / aspectRatio);
19
+ const height = diagonalCm * Math.sin(angle);
20
+ const width = diagonalCm * Math.cos(angle);
21
+ return { width, height };
22
+ }
23
+
24
+ export function getDistanceByAngle(widthCm: number, fieldOfViewDegrees: number): number {
25
+ const fovRadians = (fieldOfViewDegrees * Math.PI) / 180;
26
+ return widthCm / (2 * Math.tan(fovRadians / 2));
27
+ }
28
+
29
+ export function calculateViewingDistance(specs: TVSpecs): ViewingDistance {
30
+ const { width: widthCm } = getDimensionsFromDiagonal(specs.diagonalInches);
31
+
32
+ const thxDistance = getDistanceByAngle(widthCm, 40) / 100;
33
+ const smpteDistance = getDistanceByAngle(widthCm, 30) / 100;
34
+
35
+ let visualAcuityMultiplier = 1;
36
+ if (specs.resolution === "4k") visualAcuityMultiplier = 1.5;
37
+ if (specs.resolution === "8k") visualAcuityMultiplier = 2.5;
38
+ if (specs.resolution === "1080p") visualAcuityMultiplier = 1.0;
39
+
40
+ const resAdjustedOptimal = thxDistance / (visualAcuityMultiplier * 0.8 + 0.2);
41
+
42
+ return {
43
+ optimal: resAdjustedOptimal,
44
+ min: resAdjustedOptimal * 0.8,
45
+ max: smpteDistance,
46
+ };
47
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { tvDistance } 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 tvDistance.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ <SEORenderer content={{ locale, sections: content.seo || [] }} />