@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 { TestTecladoUI } from '../ui';
4
+
5
+ const slug = 'keyboard-test';
6
+ const title = 'Online Keyboard Test & Ghosting Detector';
7
+ const description = 'Check if your keyboard suffers from Ghosting or Key Jamming. Real-time key visualizer and N-Key Rollover counter.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'What is Ghosting on a keyboard?',
12
+ answer: 'It\'s a defect that occurs when you press multiple keys at once and the computer doesn\'t register some of them. It\'s due to limitations in the keyboard\'s internal electrical matrix that cannot process certain combinations.',
13
+ },
14
+ {
15
+ question: 'What does N-Key Rollover (NKRO) mean?',
16
+ answer: 'NKRO means the keyboard can register as many keys as you can press simultaneously without failure. It\'s a premium feature, common in high-end mechanical and gaming keyboards.',
17
+ },
18
+ {
19
+ question: 'Why does my keyboard fail when I press 3 keys at once?',
20
+ answer: 'Most cheap office keyboards have a 2 or 3-key rollover. This is sufficient for typing but insufficient for intensive gaming or complex shortcuts.',
21
+ },
22
+ {
23
+ question: 'How can I fix a key that doesn\'t respond?',
24
+ answer: 'If the test doesn\'t detect the keypress, it could be dirt under the switch, electrical contact failure, or a damaged cable. Try cleaning the keyboard with compressed air before giving up.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ {
30
+ name: 'Focus the visualizer',
31
+ text: 'Click anywhere on the page to ensure the browser has focus and can capture hardware keypresses.',
32
+ },
33
+ {
34
+ name: 'Run the response test',
35
+ text: 'Press each key on your keyboard one by one. The corresponding key on screen will light up green if it works correctly.',
36
+ },
37
+ {
38
+ name: 'Check for ghosting',
39
+ text: 'Press common gaming keys (W, A, S, D, Space, Shift) all at once to see if they lock or all light up.',
40
+ },
41
+ {
42
+ name: 'Verify maximum rollover',
43
+ text: 'Try pressing as many keys as you can with both hands and watch the maximum simultaneous keypress counter.',
44
+ },
45
+ ];
46
+
47
+ const faqSchema: WithContext<FAQPage> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'FAQPage',
50
+ mainEntity: faqData.map((item) => ({
51
+ '@type': 'Question',
52
+ name: item.question,
53
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
54
+ })),
55
+ };
56
+
57
+ const howToSchema: WithContext<HowTo> = {
58
+ '@context': 'https://schema.org',
59
+ '@type': 'HowTo',
60
+ name: title,
61
+ description,
62
+ step: howToData.map((step, i) => ({
63
+ '@type': 'HowToStep',
64
+ position: i + 1,
65
+ name: step.name,
66
+ text: step.text,
67
+ })),
68
+ };
69
+
70
+ const appSchema: WithContext<SoftwareApplication> = {
71
+ '@context': 'https://schema.org',
72
+ '@type': 'SoftwareApplication',
73
+ name: title,
74
+ description,
75
+ applicationCategory: 'UtilityApplication',
76
+ operatingSystem: 'All',
77
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
78
+ inLanguage: 'en',
79
+ };
80
+
81
+ export const content: ToolLocaleContent<TestTecladoUI> = {
82
+ slug,
83
+ title,
84
+ description,
85
+ faqTitle: 'Frequently Asked Questions',
86
+ faq: faqData,
87
+ bibliographyTitle: 'Technical References',
88
+ bibliography: [
89
+ {
90
+ name: 'USB Keyboard/Keypad Page - HID Usage Tables',
91
+ url: 'https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf',
92
+ },
93
+ {
94
+ name: 'Mechanical vs Membrane Keyboards - Technical Deep Dive',
95
+ url: 'https://deskthority.net/wiki/Rollover',
96
+ },
97
+ ],
98
+ howTo: howToData,
99
+ schemas: [faqSchema, howToSchema, appSchema],
100
+ seo: [
101
+ {
102
+ type: 'title',
103
+ text: 'Online Keyboard Test: Detect Ghosting and N-Key Rollover',
104
+ level: 2,
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: 'An interactive tool for keyboard diagnostics. Check if your peripheral suffers from ghosting, jamming, or rollover limitations. Visually clear with support for all keyboard types.',
109
+ },
110
+ {
111
+ type: 'title',
112
+ text: 'What is Ghosting?',
113
+ level: 3,
114
+ },
115
+ {
116
+ type: 'paragraph',
117
+ html: 'Ghosting occurs when you press a specific combination of keys and the keyboard registers a phantom keypress you didn\'t make. This is due to limitations in the internal circuit matrix.',
118
+ },
119
+ {
120
+ type: 'title',
121
+ text: 'N-Key Rollover and Maximum Rollover',
122
+ level: 3,
123
+ },
124
+ {
125
+ type: 'paragraph',
126
+ html: '<strong>NKRO (N-Key Rollover):</strong> Allows registering all pressed keys simultaneously. <strong>6KRO:</strong> Old USB standard limit. <strong>2-3KRO:</strong> Common on cheap keyboards, sufficient for typing.',
127
+ },
128
+ {
129
+ type: 'title',
130
+ text: 'Mechanical vs Membrane Keyboards',
131
+ level: 3,
132
+ },
133
+ {
134
+ type: 'paragraph',
135
+ html: 'Mechanical keyboards have individual switches with isolated diodes, eliminating ghosting. Membrane keyboards share conductor traces, causing failures in simultaneous combinations.',
136
+ },
137
+ ],
138
+ ui: {
139
+ badge: 'Input Test',
140
+ title: 'Keyboard Test and Ghosting Detector',
141
+ description: 'Verify N-Key Rollover and detect failed keys.',
142
+ simultaneousLabel: 'Simultaneous',
143
+ eventLogLabel: 'Event Log',
144
+ resetBtn: 'Reset',
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 { TestTecladoUI } from '../ui';
4
+
5
+ const slug = 'test-teclado';
6
+ const title = 'Test de Teclado y Ghosting Online';
7
+ const description = 'Comprueba si tu teclado sufre de Ghosting o Key Jamming. Visualizador de teclas en tiempo real y contador N-Key Rollover.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: '¿Qué es el Ghosting en un teclado?',
12
+ answer: 'Es un defecto que ocurre cuando pulsas varias teclas a la vez y el ordenador no registra alguna de ellas. Se debe a limitaciones en la matriz eléctrica interna del teclado que no puede procesar ciertas combinaciones.',
13
+ },
14
+ {
15
+ question: '¿Qué significa N-Key Rollover (NKRO)?',
16
+ answer: 'NKRO significa que el teclado puede registrar tantas teclas como puedas pulsar simultáneamente sin fallar. Es una característica premium, común en teclados mecánicos de alta gama y gaming.',
17
+ },
18
+ {
19
+ question: '¿Por qué mi teclado falla al pulsar 3 teclas a la vez?',
20
+ answer: 'La mayoría de teclados de oficina baratos tienen un rollover de 2 o 3 teclas (2-Key Rollover). Esto es suficiente para escribir, pero insuficiente para gaming intensivo o atajos complejos.',
21
+ },
22
+ {
23
+ question: '¿Cómo puedo arreglar una tecla que no responde?',
24
+ answer: 'Si el test no detecta la pulsación, puede ser por suciedad bajo el switch, un fallo en el contacto eléctrico o el cable dañado. Intenta limpiar el teclado con aire comprimido antes de darlo por perdido.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ {
30
+ name: 'Enfocar el visualizador',
31
+ text: 'Haz clic en cualquier parte de la página para asegurar que el navegador tenga el foco y pueda capturar las pulsaciones de hardware.',
32
+ },
33
+ {
34
+ name: 'Realizar el test de respuesta',
35
+ text: 'Presiona cada tecla del teclado una por una. La tecla correspondiente en pantalla se iluminará en verde si funciona correctamente.',
36
+ },
37
+ {
38
+ name: 'Comprobar el ghosting',
39
+ text: 'Pulsa varias teclas comunes de gaming (W, A, S, D, Espacio, Shift) a la vez para ver si se bloquean o si todas se iluminan.',
40
+ },
41
+ {
42
+ name: 'Verificar el rollover máximo',
43
+ text: 'Intenta pulsar tantas teclas como puedas con ambas manos y observa el contador de máxima pulsación simultánea.',
44
+ },
45
+ ];
46
+
47
+ const faqSchema: WithContext<FAQPage> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'FAQPage',
50
+ mainEntity: faqData.map((item) => ({
51
+ '@type': 'Question',
52
+ name: item.question,
53
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
54
+ })),
55
+ };
56
+
57
+ const howToSchema: WithContext<HowTo> = {
58
+ '@context': 'https://schema.org',
59
+ '@type': 'HowTo',
60
+ name: title,
61
+ description,
62
+ step: howToData.map((step, i) => ({
63
+ '@type': 'HowToStep',
64
+ position: i + 1,
65
+ name: step.name,
66
+ text: step.text,
67
+ })),
68
+ };
69
+
70
+ const appSchema: WithContext<SoftwareApplication> = {
71
+ '@context': 'https://schema.org',
72
+ '@type': 'SoftwareApplication',
73
+ name: title,
74
+ description,
75
+ applicationCategory: 'UtilityApplication',
76
+ operatingSystem: 'All',
77
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
78
+ inLanguage: 'es',
79
+ };
80
+
81
+ export const content: ToolLocaleContent<TestTecladoUI> = {
82
+ slug,
83
+ title,
84
+ description,
85
+ faqTitle: 'Preguntas Frecuentes',
86
+ faq: faqData,
87
+ bibliographyTitle: 'Referencias Técnicas',
88
+ bibliography: [
89
+ {
90
+ name: 'USB Keyboard/Keypad Page - HID Usage Tables',
91
+ url: 'https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf',
92
+ },
93
+ {
94
+ name: 'Mechanical vs Membrane Keyboards - Technical Deep Dive',
95
+ url: 'https://deskthority.net/wiki/Rollover',
96
+ },
97
+ ],
98
+ howTo: howToData,
99
+ schemas: [faqSchema, howToSchema, appSchema],
100
+ seo: [
101
+ {
102
+ type: 'title',
103
+ text: 'Test de Teclado Online: Detecta Ghosting y N-Key Rollover',
104
+ level: 2,
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: 'Una herramienta interactiva para diagnóstico de teclados. Verifica si tu periférico sufre de ghosting, jamming o limitaciones de rollover. Visualmente clara con soporte para todos los tipos de teclado.',
109
+ },
110
+ {
111
+ type: 'title',
112
+ text: '¿Qué es el Ghosting?',
113
+ level: 3,
114
+ },
115
+ {
116
+ type: 'paragraph',
117
+ html: 'El ghosting ocurre cuando pulsas una combinación específica de teclas y el teclado registra una pulsación fantasma que no realizaste. Esto se debe a limitaciones en la matriz de circuitos internos.',
118
+ },
119
+ {
120
+ type: 'title',
121
+ text: 'N-Key Rollover y Rollover Máximo',
122
+ level: 3,
123
+ },
124
+ {
125
+ type: 'paragraph',
126
+ html: '<strong>NKRO (N-Key Rollover):</strong> Permite registrar todas las teclas pulsadas simultáneamente. <strong>6KRO:</strong> Límite del estándar USB antiguo. <strong>2-3KRO:</strong> Común en teclados baratos, suficiente para escribir.',
127
+ },
128
+ {
129
+ type: 'title',
130
+ text: 'Teclados Mecánicos vs Membrana',
131
+ level: 3,
132
+ },
133
+ {
134
+ type: 'paragraph',
135
+ html: 'Los teclados mecánicos tienen switches individuales con diodos aislados, eliminando ghosting. Los de membrana comparten pistas conductoras, causando fallos en combinaciones simultáneas.',
136
+ },
137
+ ],
138
+ ui: {
139
+ badge: 'Input Test',
140
+ title: 'Test de Teclado y Ghosting',
141
+ description: 'Verifica el N-Key Rollover y detecta teclas fallidas.',
142
+ simultaneousLabel: 'Simultáneas',
143
+ eventLogLabel: 'Log de Eventos',
144
+ resetBtn: 'Reiniciar',
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 { TestTecladoUI } from '../ui';
4
+
5
+ const slug = 'test-clavier';
6
+ const title = 'Test de Clavier et Détecteur de Ghosting';
7
+ const description = 'Vérifiez si votre clavier souffre de ghosting ou de blocage de touches. Visualiseur de touches en temps réel et compteur N-Key Rollover.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Qu\'est-ce que le ghosting sur un clavier?',
12
+ answer: 'C\'est un défaut qui se produit lorsque vous appuyez sur plusieurs touches à la fois et que l\'ordinateur n\'en enregistre pas certaines. Cela est dû aux limitations de la matrice électrique interne du clavier qui ne peut pas traiter certaines combinaisons.',
13
+ },
14
+ {
15
+ question: 'Qu\'est-ce que N-Key Rollover (NKRO)?',
16
+ answer: 'NKRO signifie que le clavier peut enregistrer autant de touches que vous pouvez en appuyer simultanément sans défaillance. C\'est une fonction premium, courante sur les claviers mécaniques haut de gamme et gaming.',
17
+ },
18
+ {
19
+ question: 'Pourquoi mon clavier échoue-t-il quand j\'appuie sur 3 touches à la fois?',
20
+ answer: 'La plupart des claviers de bureau bon marché ont un rollover de 2 ou 3 touches. Cela est suffisant pour taper, mais insuffisant pour les jeux intensifs ou les raccourcis complexes.',
21
+ },
22
+ {
23
+ question: 'Comment puis-je réparer une touche qui ne répond pas?',
24
+ answer: 'Si le test ne détecte pas la frappe, cela pourrait être de la saleté sous le switch, une défaillance du contact électrique ou un câble endommagé. Essayez de nettoyer le clavier avec de l\'air comprimé avant de l\'abandonner.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ {
30
+ name: 'Mettre le visualiseur au point',
31
+ text: 'Cliquez n\'importe où sur la page pour vous assurer que le navigateur a le focus et peut capturer les frappes matérielles.',
32
+ },
33
+ {
34
+ name: 'Effectuer le test de réponse',
35
+ text: 'Appuyez sur chaque touche du clavier une par une. La touche correspondante à l\'écran s\'illuminera en vert si elle fonctionne correctement.',
36
+ },
37
+ {
38
+ name: 'Vérifier le ghosting',
39
+ text: 'Appuyez sur plusieurs touches communes du gaming (Z, Q, S, D, Espace, Maj) à la fois pour voir si elles se bloquent ou si elles s\'illuminent toutes.',
40
+ },
41
+ {
42
+ name: 'Vérifier le rollover maximal',
43
+ text: 'Essayez d\'appuyer sur autant de touches que possible avec les deux mains et observez le compteur de frappe simultanée maximale.',
44
+ },
45
+ ];
46
+
47
+ const faqSchema: WithContext<FAQPage> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'FAQPage',
50
+ mainEntity: faqData.map((item) => ({
51
+ '@type': 'Question',
52
+ name: item.question,
53
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
54
+ })),
55
+ };
56
+
57
+ const howToSchema: WithContext<HowTo> = {
58
+ '@context': 'https://schema.org',
59
+ '@type': 'HowTo',
60
+ name: title,
61
+ description,
62
+ step: howToData.map((step, i) => ({
63
+ '@type': 'HowToStep',
64
+ position: i + 1,
65
+ name: step.name,
66
+ text: step.text,
67
+ })),
68
+ };
69
+
70
+ const appSchema: WithContext<SoftwareApplication> = {
71
+ '@context': 'https://schema.org',
72
+ '@type': 'SoftwareApplication',
73
+ name: title,
74
+ description,
75
+ applicationCategory: 'UtilityApplication',
76
+ operatingSystem: 'All',
77
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
78
+ inLanguage: 'fr',
79
+ };
80
+
81
+ export const content: ToolLocaleContent<TestTecladoUI> = {
82
+ slug,
83
+ title,
84
+ description,
85
+ faqTitle: 'Questions Fréquemment Posées',
86
+ faq: faqData,
87
+ bibliographyTitle: 'Références Techniques',
88
+ bibliography: [
89
+ {
90
+ name: 'USB Keyboard/Keypad Page - HID Usage Tables',
91
+ url: 'https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf',
92
+ },
93
+ {
94
+ name: 'Mechanical vs Membrane Keyboards - Technical Deep Dive',
95
+ url: 'https://deskthority.net/wiki/Rollover',
96
+ },
97
+ ],
98
+ howTo: howToData,
99
+ schemas: [faqSchema, howToSchema, appSchema],
100
+ seo: [
101
+ {
102
+ type: 'title',
103
+ text: 'Test de Clavier en Ligne: Détectez le Ghosting et N-Key Rollover',
104
+ level: 2,
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: 'Un outil interactif pour le diagnostic du clavier. Vérifiez si votre périphérique souffre de ghosting, blocage ou limitations de rollover. Visuellement clair avec support pour tous les types de clavier.',
109
+ },
110
+ {
111
+ type: 'title',
112
+ text: 'Qu\'est-ce que le Ghosting?',
113
+ level: 3,
114
+ },
115
+ {
116
+ type: 'paragraph',
117
+ html: 'Le ghosting se produit lorsque vous appuyez sur une combinaison spécifique de touches et que le clavier enregistre une frappe fantôme que vous n\'avez pas faite. Ceci est dû aux limitations de la matrice de circuits interne.',
118
+ },
119
+ {
120
+ type: 'title',
121
+ text: 'N-Key Rollover et Rollover Maximal',
122
+ level: 3,
123
+ },
124
+ {
125
+ type: 'paragraph',
126
+ html: '<strong>NKRO (N-Key Rollover):</strong> Permet d\'enregistrer toutes les touches appuyées simultanément. <strong>6KRO:</strong> Limite de l\'ancienne norme USB. <strong>2-3KRO:</strong> Courant sur les claviers bon marché, suffisant pour taper.',
127
+ },
128
+ {
129
+ type: 'title',
130
+ text: 'Claviers Mécaniques vs Membrane',
131
+ level: 3,
132
+ },
133
+ {
134
+ type: 'paragraph',
135
+ html: 'Les claviers mécaniques ont des switches individuels avec des diodes isolées, éliminant le ghosting. Les claviers à membrane partagent des pistes conductrices, causant des défaillances dans les combinaisons simultanées.',
136
+ },
137
+ ],
138
+ ui: {
139
+ badge: 'Test d\'Entrée',
140
+ title: 'Test de Clavier et Détecteur de Ghosting',
141
+ description: 'Vérifiez le N-Key Rollover et détectez les touches défaillantes.',
142
+ simultaneousLabel: 'Simultanées',
143
+ eventLogLabel: 'Journal des Événements',
144
+ resetBtn: 'Réinitialiser',
145
+ },
146
+ };
@@ -0,0 +1,34 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+
3
+ import TestTecladoComponent from './component.astro';
4
+ import TestTecladoSEO from './seo.astro';
5
+ import TestTecladoBibliography from './bibliography.astro';
6
+
7
+ import type { TestTecladoUI } from './ui';
8
+ export type TestTecladoLocaleContent = ToolLocaleContent<TestTecladoUI>;
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 testTeclado: HardwareToolEntry<TestTecladoUI> = {
15
+ id: 'test-teclado',
16
+ icons: {
17
+ bg: 'mdi:keyboard-variant',
18
+ fg: 'mdi:keyboard-settings',
19
+ },
20
+ i18n: {
21
+ es: async () => es,
22
+ en: async () => en,
23
+ fr: async () => fr,
24
+ },
25
+ };
26
+
27
+ export { TestTecladoComponent, TestTecladoSEO, TestTecladoBibliography };
28
+
29
+ export const TEST_TECLADO_TOOL: ToolDefinition = {
30
+ entry: testTeclado,
31
+ Component: TestTecladoComponent,
32
+ SEOComponent: TestTecladoSEO,
33
+ BibliographyComponent: TestTecladoBibliography,
34
+ };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { testTeclado } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await testTeclado.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,8 @@
1
+ export interface TestTecladoUI extends Record<string, string> {
2
+ badge: string;
3
+ title: string;
4
+ description: string;
5
+ simultaneousLabel: string;
6
+ eventLogLabel: string;
7
+ resetBtn: string;
8
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { testRaton } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await testRaton.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}