@jjlmoya/utils-hardware 1.1.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 (85) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +107 -0
  3. package/src/category/i18n/es.ts +107 -0
  4. package/src/category/i18n/fr.ts +107 -0
  5. package/src/category/index.ts +18 -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 +26 -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/schemas_fulfillment.test.ts +23 -0
  21. package/src/tests/seo_length.test.ts +23 -0
  22. package/src/tests/title_quality.test.ts +55 -0
  23. package/src/tests/tool_validation.test.ts +17 -0
  24. package/src/tool/batteryHealthEstimator/bibliography.astro +14 -0
  25. package/src/tool/batteryHealthEstimator/component.astro +606 -0
  26. package/src/tool/batteryHealthEstimator/i18n/en.ts +158 -0
  27. package/src/tool/batteryHealthEstimator/i18n/es.ts +158 -0
  28. package/src/tool/batteryHealthEstimator/i18n/fr.ts +158 -0
  29. package/src/tool/batteryHealthEstimator/index.ts +34 -0
  30. package/src/tool/batteryHealthEstimator/seo.astro +14 -0
  31. package/src/tool/batteryHealthEstimator/ui.ts +31 -0
  32. package/src/tool/deadPixelTest/bibliography.astro +31 -0
  33. package/src/tool/deadPixelTest/component.astro +717 -0
  34. package/src/tool/deadPixelTest/i18n/en.ts +218 -0
  35. package/src/tool/deadPixelTest/i18n/es.ts +218 -0
  36. package/src/tool/deadPixelTest/i18n/fr.ts +218 -0
  37. package/src/tool/deadPixelTest/index.ts +34 -0
  38. package/src/tool/deadPixelTest/seo.astro +14 -0
  39. package/src/tool/deadPixelTest/ui.ts +20 -0
  40. package/src/tool/gamepadTest/bibliography.astro +30 -0
  41. package/src/tool/gamepadTest/component.astro +1419 -0
  42. package/src/tool/gamepadTest/i18n/en.ts +186 -0
  43. package/src/tool/gamepadTest/i18n/es.ts +186 -0
  44. package/src/tool/gamepadTest/i18n/fr.ts +186 -0
  45. package/src/tool/gamepadTest/index.ts +34 -0
  46. package/src/tool/gamepadTest/seo.astro +14 -0
  47. package/src/tool/gamepadTest/ui.ts +57 -0
  48. package/src/tool/gamepadVibrationTester/bibliography.astro +14 -0
  49. package/src/tool/gamepadVibrationTester/component.astro +694 -0
  50. package/src/tool/gamepadVibrationTester/i18n/en.ts +155 -0
  51. package/src/tool/gamepadVibrationTester/i18n/es.ts +155 -0
  52. package/src/tool/gamepadVibrationTester/i18n/fr.ts +150 -0
  53. package/src/tool/gamepadVibrationTester/index.ts +34 -0
  54. package/src/tool/gamepadVibrationTester/seo.astro +14 -0
  55. package/src/tool/gamepadVibrationTester/ui.ts +28 -0
  56. package/src/tool/keyboardTest/bibliography.astro +30 -0
  57. package/src/tool/keyboardTest/component.astro +601 -0
  58. package/src/tool/keyboardTest/i18n/en.ts +146 -0
  59. package/src/tool/keyboardTest/i18n/es.ts +146 -0
  60. package/src/tool/keyboardTest/i18n/fr.ts +146 -0
  61. package/src/tool/keyboardTest/index.ts +34 -0
  62. package/src/tool/keyboardTest/seo.astro +14 -0
  63. package/src/tool/keyboardTest/ui.ts +8 -0
  64. package/src/tool/mousePollingTest/bibliography.astro +14 -0
  65. package/src/tool/mousePollingTest/component.astro +237 -0
  66. package/src/tool/mousePollingTest/i18n/en.ts +135 -0
  67. package/src/tool/mousePollingTest/i18n/es.ts +135 -0
  68. package/src/tool/mousePollingTest/i18n/fr.ts +135 -0
  69. package/src/tool/mousePollingTest/index.ts +34 -0
  70. package/src/tool/mousePollingTest/logic/MovingAverage.ts +20 -0
  71. package/src/tool/mousePollingTest/logic/RatonManager.ts +97 -0
  72. package/src/tool/mousePollingTest/logic/StatisticalFilter.ts +48 -0
  73. package/src/tool/mousePollingTest/seo.astro +14 -0
  74. package/src/tool/mousePollingTest/ui.ts +8 -0
  75. package/src/tool/mousePollingTest/worker/mouseWorker.ts +50 -0
  76. package/src/tool/toneGenerator/bibliography.astro +14 -0
  77. package/src/tool/toneGenerator/component.astro +571 -0
  78. package/src/tool/toneGenerator/i18n/en.ts +146 -0
  79. package/src/tool/toneGenerator/i18n/es.ts +146 -0
  80. package/src/tool/toneGenerator/i18n/fr.ts +146 -0
  81. package/src/tool/toneGenerator/index.ts +34 -0
  82. package/src/tool/toneGenerator/seo.astro +14 -0
  83. package/src/tool/toneGenerator/ui.ts +19 -0
  84. package/src/tools.ts +10 -0
  85. package/src/types.ts +72 -0
@@ -0,0 +1,146 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ToneGeneratorUI } from '../ui';
4
+
5
+ const slug = 'generador-tonos';
6
+ const title = 'Generador de Tonos y Frecuencias Online';
7
+ const description =
8
+ 'Genera ondas sinusoidales, cuadradas, triangulares y de sierra. Prueba tus altavoces, auriculares o subwoofer con frecuencias de 20Hz a 20kHz.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '¿Para qué sirve generar frecuencias específicas?',
13
+ answer:
14
+ 'Sirve para probar la respuesta de frecuencia de altavoces y auriculares, detectar vibraciones extrañas en muebles (resonancia), encontrar agujeros en tu audición o incluso para calmar el tinnitus mediante terapia de muesca.',
15
+ },
16
+ {
17
+ question: '¿Qué es una onda sinusoidal frente a una onda cuadrada?',
18
+ answer:
19
+ 'La onda sinusoidal es un tono puro sin armónicos (suave). La onda cuadrada es rica en armónicos impares y tiene un sonido mucho más agresivo o digital. La triangular es un punto intermedio, útil para síntesis de audio.',
20
+ },
21
+ {
22
+ question: '¿Puedo dañar mis altavoces con esta herramienta?',
23
+ answer:
24
+ 'Sí, si usas volúmenes muy altos en frecuencias extremas (especialmente graves por debajo de 30Hz o agudos por encima de 15kHz). Empieza siempre con el volumen del sistema bajo y súbelo gradualmente.',
25
+ },
26
+ {
27
+ question: '¿Cuál es el rango de audición humano?',
28
+ answer:
29
+ 'Teóricamente de 20Hz a 20,000Hz (20kHz). Sin embargo, con la edad es normal perder la capacidad de oír por encima de los 15kHz. Este test puede ayudarte a verificar tu límite superior personal.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Seleccionar el tipo de onda',
36
+ text: 'Elige entre Sinusoidal (pura), Cuadrada, Triangular o Diente de Sierra según el tipo de prueba que quieras realizar.',
37
+ },
38
+ {
39
+ name: 'Ajustar la frecuencia',
40
+ text: 'Mueve el control deslizante para navegar por el espectro audible. Usa los atajos de 60Hz, 440Hz o 1kHz para acceder rápidamente a frecuencias de referencia.',
41
+ },
42
+ {
43
+ name: 'Controlar el volumen',
44
+ text: 'Asegúrate de que el volumen de tus altavoces sea bajo antes de pulsar Play. Puedes ajustar la ganancia directamente desde la herramienta.',
45
+ },
46
+ {
47
+ name: 'Analizar la respuesta',
48
+ text: 'Escucha posibles distorsiones o momentos en los que el sonido desaparece. Esto te indicará los límites físicos de tu hardware de audio.',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowTo> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step, i) => ({
68
+ '@type': 'HowToStep',
69
+ position: i + 1,
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
83
+ inLanguage: 'es',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<ToneGeneratorUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Preguntas Frecuentes',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Referencias',
93
+ bibliography: [
94
+ {
95
+ name: 'MDN Web Docs — Web Audio API',
96
+ url: 'https://developer.mozilla.org/es/docs/Web/API/Web_Audio_API',
97
+ },
98
+ {
99
+ name: 'ISO 226:2023 — Curvas de igual sonoridad',
100
+ url: 'https://www.iso.org/standard/83117.html',
101
+ },
102
+ ],
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ { type: 'title', text: 'Todo sobre Frecuencias y Ondas de Sonido', level: 2 },
107
+ {
108
+ type: 'paragraph',
109
+ html: 'El sonido es física pura en movimiento. Esta herramienta te permite manipular ondas sonoras en tiempo real, desde los graves más profundos que puedes sentir en el pecho hasta los agudos ultrasónicos que solo perciben los animales.',
110
+ },
111
+ { type: 'title', text: 'Rango Auditivo Humano y Presbiacusia', level: 3 },
112
+ {
113
+ type: 'paragraph',
114
+ html: 'El oído humano sano percibe entre <strong>20Hz y 20kHz</strong>. Con la edad, el límite superior cae: la mayoría de adultos mayores de 50 años no superan los 12kHz. El tono de 17.4kHz, conocido como "el tono mosquito", es un test clásico que solo suelen superar los adolescentes.',
115
+ },
116
+ { type: 'title', text: 'Tipos de Ondas y sus Usos', level: 3 },
117
+ {
118
+ type: 'paragraph',
119
+ html: '<strong>Sinusoidal:</strong> tono puro sin armónicos, usado en tests auditivos médicos y calibración de instrumentos. <strong>Cuadrada:</strong> rica en armónicos impares, suena como consolas retro de 8-bits. <strong>Diente de sierra:</strong> contiene todos los armónicos, base de los sintetizadores de música electrónica. <strong>Triangular:</strong> punto medio entre sinusoidal y cuadrada, más suave que la cuadrada pero con más contenido armónico que la senoidal.',
120
+ },
121
+ { type: 'title', text: 'Test de Altavoces y Limpieza por Vibración', level: 3 },
122
+ {
123
+ type: 'paragraph',
124
+ html: 'Una onda de baja frecuencia (generalmente <strong>165Hz</strong>) a volumen máximo con forma cuadrada o de sierra fuerza al diafragma del altavoz a vibrar violentamente, expulsando mecánicamente las gotas de agua atrapadas en la rejilla. No reproduzcas frecuencias extremadamente agudas a máximo volumen durante mucho tiempo: aunque no las oigas, la energía puede dañar los tweeters de tu equipo.',
125
+ },
126
+ ],
127
+ ui: {
128
+ badge: 'Generador de Audio',
129
+ title: 'Generador de Tonos',
130
+ description: 'Crea frecuencias puras para test de audio.',
131
+ freqLabel: 'Frecuencia',
132
+ preset60: '60Hz',
133
+ preset440: '440Hz',
134
+ preset1k: '1kHz',
135
+ rangeMin: '20Hz (Subgrave)',
136
+ rangeMax: '20kHz (Ultrasonido)',
137
+ waveLabel: 'Forma de Onda',
138
+ waveSine: 'Sinusoidal',
139
+ waveSquare: 'Cuadrada',
140
+ waveSawtooth: 'Diente de Sierra',
141
+ waveTriangle: 'Triangular',
142
+ volLabel: 'Volumen',
143
+ btnPlay: 'REPRODUCIR TONO',
144
+ btnStop: 'DETENER',
145
+ },
146
+ };
@@ -0,0 +1,146 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ToneGeneratorUI } from '../ui';
4
+
5
+ const slug = 'generateur-de-frequences';
6
+ const title = 'Générateur de Tons et Fréquences en Ligne';
7
+ const description =
8
+ 'Générez des ondes sinusoïdales, carrées, triangulaires et en dents de scie. Testez vos haut-parleurs, écouteurs ou caisson de basses avec des fréquences de 20Hz à 20kHz.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'À quoi sert un générateur de fréquences ?',
13
+ answer:
14
+ "Il sert à tester la réponse en fréquence des haut-parleurs et des écouteurs, à détecter des résonances indésirables dans les meubles, à trouver des lacunes dans votre audition ou même à aider à calmer les acouphènes par thérapie par encoche.",
15
+ },
16
+ {
17
+ question: "Qu'est-ce qu'une onde sinusoïdale par rapport à une onde carrée ?",
18
+ answer:
19
+ "L'onde sinusoïdale est un ton pur sans harmoniques (douce et ronde). L'onde carrée est riche en harmoniques impaires et sonne beaucoup plus agressive ou digitale. L'onde triangulaire se situe entre les deux, utile pour la synthèse audio.",
20
+ },
21
+ {
22
+ question: 'Puis-je endommager mes haut-parleurs avec cet outil ?',
23
+ answer:
24
+ "Oui, si vous utilisez des volumes très élevés à des fréquences extrêmes (surtout les graves en dessous de 30Hz ou les aigus au-dessus de 15kHz). Commencez toujours avec un volume système bas et augmentez progressivement.",
25
+ },
26
+ {
27
+ question: "Quelle est la plage d'audition humaine ?",
28
+ answer:
29
+ "Théoriquement de 20Hz à 20 000Hz (20kHz). Cependant, avec l'âge, il est normal de perdre la capacité d'entendre au-dessus de 15kHz. Ce test peut vous aider à vérifier votre limite personnelle.",
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: "Sélectionner le type d'onde",
36
+ text: 'Choisissez entre Sinusoïdale (pure), Carrée, Triangulaire ou Dent de scie selon le type de test que vous souhaitez effectuer.',
37
+ },
38
+ {
39
+ name: 'Ajuster la fréquence',
40
+ text: 'Déplacez le curseur pour naviguer dans le spectre audible. Utilisez les raccourcis 60Hz, 440Hz ou 1kHz pour accéder rapidement aux fréquences de référence.',
41
+ },
42
+ {
43
+ name: 'Contrôler le volume',
44
+ text: "Assurez-vous que le volume de vos haut-parleurs est bas avant d'appuyer sur Lecture. Vous pouvez ajuster le gain directement depuis l'outil.",
45
+ },
46
+ {
47
+ name: 'Analyser la réponse',
48
+ text: "Écoutez d'éventuelles distorsions ou moments où le son disparaît. Cela vous indiquera les limites physiques de votre matériel audio.",
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowTo> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step, i) => ({
68
+ '@type': 'HowToStep',
69
+ position: i + 1,
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
83
+ inLanguage: 'fr',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<ToneGeneratorUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Questions Fréquentes',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Références',
93
+ bibliography: [
94
+ {
95
+ name: 'MDN Web Docs — Web Audio API',
96
+ url: 'https://developer.mozilla.org/fr/docs/Web/API/Web_Audio_API',
97
+ },
98
+ {
99
+ name: 'ISO 226:2023 — Courbes isophoniques',
100
+ url: 'https://www.iso.org/standard/83117.html',
101
+ },
102
+ ],
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ { type: 'title', text: 'Tout sur les Fréquences et les Ondes Sonores', level: 2 },
107
+ {
108
+ type: 'paragraph',
109
+ html: "Le son est de la physique pure en mouvement. Cet outil vous permet de manipuler des ondes sonores en temps réel, des graves les plus profonds que vous pouvez ressentir dans votre poitrine aux aigus ultrasoniques que seuls les animaux perçoivent.",
110
+ },
111
+ { type: 'title', text: 'Plage Auditive Humaine et Presbyacousie', level: 3 },
112
+ {
113
+ type: 'paragraph',
114
+ html: "Une oreille humaine saine perçoit entre <strong>20Hz et 20kHz</strong>. Avec l'âge, la limite supérieure baisse : la plupart des adultes de plus de 50 ans ne peuvent pas entendre au-dessus de 12kHz. Le ton à 17,4kHz, connu comme le « ton moustique », est un test classique que seuls les adolescents peuvent généralement franchir.",
115
+ },
116
+ { type: 'title', text: 'Types d\'ondes et leurs utilisations', level: 3 },
117
+ {
118
+ type: 'paragraph',
119
+ html: "<strong>Sinusoïdale :</strong> ton pur sans harmoniques, utilisé dans les tests auditifs médicaux et la calibration d'instruments. <strong>Carrée :</strong> riche en harmoniques impaires, sonne comme les consoles rétro 8-bits. <strong>Dent de scie :</strong> contient toutes les harmoniques, base des synthétiseurs de musique électronique. <strong>Triangulaire :</strong> point médian entre sinusoïdale et carrée — plus douce que la carrée mais avec plus de contenu harmonique que la sinusoïdale.",
120
+ },
121
+ { type: 'title', text: 'Test de haut-parleurs et nettoyage par vibration', level: 3 },
122
+ {
123
+ type: 'paragraph',
124
+ html: "Une onde de basse fréquence (généralement <strong>165Hz</strong>) à volume maximum avec une forme carrée ou en dents de scie force le diaphragme du haut-parleur à vibrer violemment, expulsant mécaniquement les gouttes d'eau piégées dans la grille. Ne reproduisez pas des fréquences extrêmement aiguës à volume maximum pendant longtemps : même si vous ne les entendez pas, l'énergie peut endommager les tweeters de votre équipement.",
125
+ },
126
+ ],
127
+ ui: {
128
+ badge: 'Générateur Audio',
129
+ title: 'Générateur de Fréquences',
130
+ description: 'Créez des fréquences pures pour les tests audio.',
131
+ freqLabel: 'Fréquence',
132
+ preset60: '60Hz',
133
+ preset440: '440Hz',
134
+ preset1k: '1kHz',
135
+ rangeMin: '20Hz (Sub-grave)',
136
+ rangeMax: '20kHz (Ultrason)',
137
+ waveLabel: "Forme d'onde",
138
+ waveSine: 'Sinusoïdale',
139
+ waveSquare: 'Carrée',
140
+ waveSawtooth: 'Dent de scie',
141
+ waveTriangle: 'Triangulaire',
142
+ volLabel: 'Volume',
143
+ btnPlay: 'LIRE LE TON',
144
+ btnStop: 'ARRÊTER',
145
+ },
146
+ };
@@ -0,0 +1,34 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+
3
+ import ToneGeneratorComponent from './component.astro';
4
+ import ToneGeneratorSEO from './seo.astro';
5
+ import ToneGeneratorBibliography from './bibliography.astro';
6
+
7
+ import type { ToneGeneratorUI } from './ui';
8
+ export type ToneGeneratorLocaleContent = ToolLocaleContent<ToneGeneratorUI>;
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 toneGenerator: HardwareToolEntry<ToneGeneratorUI> = {
15
+ id: 'generador-tonos',
16
+ icons: {
17
+ bg: 'mdi:sine-wave',
18
+ fg: 'mdi:waveform',
19
+ },
20
+ i18n: {
21
+ es: async () => es,
22
+ en: async () => en,
23
+ fr: async () => fr,
24
+ },
25
+ };
26
+
27
+ export { ToneGeneratorComponent, ToneGeneratorSEO, ToneGeneratorBibliography };
28
+
29
+ export const TONE_GENERATOR_TOOL: ToolDefinition = {
30
+ entry: toneGenerator,
31
+ Component: ToneGeneratorComponent,
32
+ SEOComponent: ToneGeneratorSEO,
33
+ BibliographyComponent: ToneGeneratorBibliography,
34
+ };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { toneGenerator } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await toneGenerator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,19 @@
1
+ export interface ToneGeneratorUI extends Record<string, string> {
2
+ badge: string;
3
+ title: string;
4
+ description: string;
5
+ freqLabel: string;
6
+ preset60: string;
7
+ preset440: string;
8
+ preset1k: string;
9
+ rangeMin: string;
10
+ rangeMax: string;
11
+ waveLabel: string;
12
+ waveSine: string;
13
+ waveSquare: string;
14
+ waveSawtooth: string;
15
+ waveTriangle: string;
16
+ volLabel: string;
17
+ btnPlay: string;
18
+ btnStop: string;
19
+ }
package/src/tools.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { ToolDefinition } from './types';
2
+ import { PIXELES_PANTALLA_TOOL } from './tool/deadPixelTest/index';
3
+ import { TEST_TECLADO_TOOL } from './tool/keyboardTest/index';
4
+ import { TEST_MANDO_TOOL } from './tool/gamepadTest/index';
5
+ import { PROBADOR_VIBRACION_MANDO_TOOL } from './tool/gamepadVibrationTester/index';
6
+ import { TEST_RATON_TOOL } from './tool/mousePollingTest/index';
7
+ import { ESTIMADOR_SALUD_BATERIA_TOOL } from './tool/batteryHealthEstimator/index';
8
+ import { TONE_GENERATOR_TOOL } from './tool/toneGenerator/index';
9
+
10
+ export const ALL_TOOLS: ToolDefinition[] = [PIXELES_PANTALLA_TOOL, TEST_TECLADO_TOOL, TEST_MANDO_TOOL, PROBADOR_VIBRACION_MANDO_TOOL, TEST_RATON_TOOL, ESTIMADOR_SALUD_BATERIA_TOOL, TONE_GENERATOR_TOOL];
package/src/types.ts ADDED
@@ -0,0 +1,72 @@
1
+ import type { SEOSection } from '@jjlmoya/utils-shared';
2
+ import type { WithContext, Thing } from 'schema-dts';
3
+
4
+ export type { SEOSection };
5
+
6
+ export type KnownLocale =
7
+ | 'ar' | 'da' | 'de' | 'en' | 'es' | 'fi'
8
+ | 'fr' | 'it' | 'ja' | 'ko' | 'nb' | 'nl'
9
+ | 'pl' | 'pt' | 'ru' | 'sv' | 'tr' | 'zh';
10
+
11
+ export interface FAQItem {
12
+ question: string;
13
+ answer: string;
14
+ }
15
+
16
+ export interface BibliographyEntry {
17
+ name: string;
18
+ url: string;
19
+ }
20
+
21
+ export interface HowToStep {
22
+ name: string;
23
+ text: string;
24
+ }
25
+
26
+ export interface ToolLocaleContent<TUI extends Record<string, string> = Record<string, string>> {
27
+ slug: string;
28
+ title: string;
29
+ description: string;
30
+ ui: TUI;
31
+ seo: SEOSection[];
32
+ faqTitle?: string;
33
+ faq: FAQItem[];
34
+ bibliographyTitle?: string;
35
+ bibliography: BibliographyEntry[];
36
+ howTo: HowToStep[];
37
+ schemas: WithContext<Thing>[];
38
+ }
39
+
40
+ export interface CategoryLocaleContent {
41
+ slug: string;
42
+ title: string;
43
+ description: string;
44
+ seo: SEOSection[];
45
+ }
46
+
47
+ export type LocaleLoader<T> = () => Promise<T>;
48
+
49
+ export type LocaleMap<T> = Partial<Record<KnownLocale, LocaleLoader<T>>>;
50
+
51
+ export interface HardwareToolEntry<TUI extends Record<string, string> = Record<string, string>> {
52
+ id: string;
53
+ icons: {
54
+ bg: string;
55
+ fg: string;
56
+ };
57
+ i18n: LocaleMap<ToolLocaleContent<TUI>>;
58
+ }
59
+
60
+ export interface HardwareCategoryEntry {
61
+ icon: string;
62
+ tools: HardwareToolEntry[];
63
+ i18n: LocaleMap<CategoryLocaleContent>;
64
+ }
65
+
66
+ export interface ToolDefinition {
67
+ entry: HardwareToolEntry;
68
+ Component: unknown;
69
+ SEOComponent: unknown;
70
+ BibliographyComponent: unknown;
71
+ }
72
+