@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.
- package/package.json +60 -0
- package/src/category/i18n/en.ts +107 -0
- package/src/category/i18n/es.ts +107 -0
- package/src/category/i18n/fr.ts +107 -0
- package/src/category/index.ts +18 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +26 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +23 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/batteryHealthEstimator/bibliography.astro +14 -0
- package/src/tool/batteryHealthEstimator/component.astro +606 -0
- package/src/tool/batteryHealthEstimator/i18n/en.ts +158 -0
- package/src/tool/batteryHealthEstimator/i18n/es.ts +158 -0
- package/src/tool/batteryHealthEstimator/i18n/fr.ts +158 -0
- package/src/tool/batteryHealthEstimator/index.ts +34 -0
- package/src/tool/batteryHealthEstimator/seo.astro +14 -0
- package/src/tool/batteryHealthEstimator/ui.ts +31 -0
- package/src/tool/deadPixelTest/bibliography.astro +31 -0
- package/src/tool/deadPixelTest/component.astro +717 -0
- package/src/tool/deadPixelTest/i18n/en.ts +218 -0
- package/src/tool/deadPixelTest/i18n/es.ts +218 -0
- package/src/tool/deadPixelTest/i18n/fr.ts +218 -0
- package/src/tool/deadPixelTest/index.ts +34 -0
- package/src/tool/deadPixelTest/seo.astro +14 -0
- package/src/tool/deadPixelTest/ui.ts +20 -0
- package/src/tool/gamepadTest/bibliography.astro +30 -0
- package/src/tool/gamepadTest/component.astro +1419 -0
- package/src/tool/gamepadTest/i18n/en.ts +186 -0
- package/src/tool/gamepadTest/i18n/es.ts +186 -0
- package/src/tool/gamepadTest/i18n/fr.ts +186 -0
- package/src/tool/gamepadTest/index.ts +34 -0
- package/src/tool/gamepadTest/seo.astro +14 -0
- package/src/tool/gamepadTest/ui.ts +57 -0
- package/src/tool/gamepadVibrationTester/bibliography.astro +14 -0
- package/src/tool/gamepadVibrationTester/component.astro +694 -0
- package/src/tool/gamepadVibrationTester/i18n/en.ts +155 -0
- package/src/tool/gamepadVibrationTester/i18n/es.ts +155 -0
- package/src/tool/gamepadVibrationTester/i18n/fr.ts +150 -0
- package/src/tool/gamepadVibrationTester/index.ts +34 -0
- package/src/tool/gamepadVibrationTester/seo.astro +14 -0
- package/src/tool/gamepadVibrationTester/ui.ts +28 -0
- package/src/tool/keyboardTest/bibliography.astro +30 -0
- package/src/tool/keyboardTest/component.astro +601 -0
- package/src/tool/keyboardTest/i18n/en.ts +146 -0
- package/src/tool/keyboardTest/i18n/es.ts +146 -0
- package/src/tool/keyboardTest/i18n/fr.ts +146 -0
- package/src/tool/keyboardTest/index.ts +34 -0
- package/src/tool/keyboardTest/seo.astro +14 -0
- package/src/tool/keyboardTest/ui.ts +8 -0
- package/src/tool/mousePollingTest/bibliography.astro +14 -0
- package/src/tool/mousePollingTest/component.astro +237 -0
- package/src/tool/mousePollingTest/i18n/en.ts +135 -0
- package/src/tool/mousePollingTest/i18n/es.ts +135 -0
- package/src/tool/mousePollingTest/i18n/fr.ts +135 -0
- package/src/tool/mousePollingTest/index.ts +34 -0
- package/src/tool/mousePollingTest/logic/MovingAverage.ts +20 -0
- package/src/tool/mousePollingTest/logic/RatonManager.ts +97 -0
- package/src/tool/mousePollingTest/logic/StatisticalFilter.ts +48 -0
- package/src/tool/mousePollingTest/seo.astro +14 -0
- package/src/tool/mousePollingTest/ui.ts +8 -0
- package/src/tool/mousePollingTest/worker/mouseWorker.ts +50 -0
- package/src/tool/toneGenerator/bibliography.astro +14 -0
- package/src/tool/toneGenerator/component.astro +571 -0
- package/src/tool/toneGenerator/i18n/en.ts +146 -0
- package/src/tool/toneGenerator/i18n/es.ts +146 -0
- package/src/tool/toneGenerator/i18n/fr.ts +146 -0
- package/src/tool/toneGenerator/index.ts +34 -0
- package/src/tool/toneGenerator/seo.astro +14 -0
- package/src/tool/toneGenerator/ui.ts +19 -0
- package/src/tools.ts +10 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { ProbadorVibracionMandoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'gamepad-vibration-tester';
|
|
6
|
+
const title = 'Online Gamepad Vibration Tester';
|
|
7
|
+
const description =
|
|
8
|
+
'Test the haptic motors and Dual-Rumble vibration of your gamepad in the browser. Supports Xbox, DualShock, DualSense and generic controllers.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'What do I need to test my gamepad online?',
|
|
13
|
+
answer:
|
|
14
|
+
'Just connect your gamepad to the computer or mobile device via USB cable or pair it via Bluetooth. Once linked, press any button to be detected.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Does it work with any gamepad model?',
|
|
18
|
+
answer:
|
|
19
|
+
'Most modern gamepads from well-known brands (like PlayStation or Xbox) are compatible if your device and operating system support it.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'The right side of my gamepad vibrates less than the left, is that normal?',
|
|
23
|
+
answer:
|
|
24
|
+
'Yes, completely normal. Gamepads usually have an asymmetric design where one side handles strong, deep vibrations and the other handles fast, subtle vibrations.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Does running these tests drain a lot of battery?',
|
|
28
|
+
answer:
|
|
29
|
+
'Vibration is one of the most energy-consuming functions in a wireless gamepad. Running continuous, long tests will drain the battery faster than usual.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Connect and turn on your gamepad',
|
|
36
|
+
text: 'Link your gamepad to your PC, Mac or mobile via USB cable or Bluetooth.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Press a button on the gamepad',
|
|
40
|
+
text: 'Browsers require you to press at least one button for the gamepad to be detected and start web communication.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Adjust the vibration motors',
|
|
44
|
+
text: 'Configure the power of the Strong Motor (Low) and Fine Motor (High) independently.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Run the patterns',
|
|
48
|
+
text: 'Press one of the presets or manually configure the parameters and send the signal to feel each component.',
|
|
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: 'en',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<ProbadorVibracionMandoUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Frequently Asked Questions',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'References',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'How haptic vibration works — HobbyConsolas',
|
|
96
|
+
url: 'https://www.hobbyconsolas.com/reportajes/como-funciona-vibracion-haptica-mando-dualsense-ps5-757673',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Gamepad API — W3C',
|
|
100
|
+
url: 'https://w3c.github.io/gamepad/',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
howTo: howToData,
|
|
104
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
105
|
+
seo: [
|
|
106
|
+
{ type: 'title', text: 'How to audit your gaming gamepad vibration', level: 2 },
|
|
107
|
+
{
|
|
108
|
+
type: 'paragraph',
|
|
109
|
+
html: 'Haptic feedback is one of the most immersive elements of gaming hardware. When a motor fails, the first symptoms are usually abnormal buzzing or asymmetric vibrations. Diagnosing them early prevents major failures.',
|
|
110
|
+
},
|
|
111
|
+
{ type: 'title', text: 'Why run the vibration test?', level: 3 },
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: 'When buying a second-hand gamepad, after updating drivers or after a drop, testing the haptic motors helps distinguish real hardware failures from software issues. Compatible with Xbox, PlayStation 4, PlayStation 5 (DualSense), Nintendo Switch Pro and generic USB gamepads.',
|
|
115
|
+
},
|
|
116
|
+
{ type: 'title', text: 'Dual-Rumble vs. Linear Actuator Architecture', level: 3 },
|
|
117
|
+
{
|
|
118
|
+
type: 'paragraph',
|
|
119
|
+
html: 'Classic gamepads (Xbox, DualShock) use two asymmetric micro-motors: the left one generates deep, rumbling vibrations; the right one produces fast, high-pitched buzzing. Advanced devices like the DualSense use linear actuators that simulate textures and resistance.',
|
|
120
|
+
},
|
|
121
|
+
{ type: 'title', text: 'Symptom-based diagnostic guide', level: 3 },
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: 'Activate each motor independently at 100%. If both sound the same, the gamepad may be a replica with a single motor. If one does not respond, check the connection before opening the chassis. Test fractional intensities: quality motors respond gradually, not like an on/off switch.',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
ui: {
|
|
128
|
+
badge: 'Vibration Test',
|
|
129
|
+
title: 'Gamepad Vibration Tester',
|
|
130
|
+
description: 'Direct control over the Dual-Rumble motor of your gamepad.',
|
|
131
|
+
deviceDisconnected: 'Gamepad Disconnected',
|
|
132
|
+
deviceDisconnectedSub: 'Press a button on your gamepad to start',
|
|
133
|
+
deviceFallback: 'Gamepad Connected',
|
|
134
|
+
deviceConnectedSub: 'Stable connection. Ready to test.',
|
|
135
|
+
noSupportWarning: "No Dual-Rumble support detected in your browser. Using basic generic vibration.",
|
|
136
|
+
tabPresets: 'Top Presets',
|
|
137
|
+
tabCustom: 'Pure Precision',
|
|
138
|
+
presetHeavyTitle: 'Hammer Strike',
|
|
139
|
+
presetHeavyDesc: 'Heavy motor at max for 300ms. Simulates a strong hit.',
|
|
140
|
+
presetLightTitle: 'Bee Buzz',
|
|
141
|
+
presetLightDesc: 'Right motor only. Ideal for detecting unusual buzzing.',
|
|
142
|
+
presetHeartbeatTitle: 'Racing Heart',
|
|
143
|
+
presetHeartbeatDesc: 'Subtle consecutive pulses. Perfect for checking inertial retention.',
|
|
144
|
+
presetSongTitle: 'Coin Rhythm',
|
|
145
|
+
presetSongDesc: 'Simulates consecutive coin sounds. Short and tactile.',
|
|
146
|
+
presetRockYouTitle: 'Rock You!',
|
|
147
|
+
presetRockYouDesc: "Queen's classic in your hands: boom, boom, clap!",
|
|
148
|
+
presetEarthquakeTitle: 'Maximum Earthquake!',
|
|
149
|
+
presetEarthquakeDesc: 'Both motors at 100% explosive force. VERY intense.',
|
|
150
|
+
customStrongLabel: 'Strong Force (Left)',
|
|
151
|
+
customWeakLabel: 'Weak Force (Right)',
|
|
152
|
+
customDurationLabel: 'Pulse Duration',
|
|
153
|
+
btnSendSignal: 'SEND SIGNAL NOW',
|
|
154
|
+
},
|
|
155
|
+
};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { ProbadorVibracionMandoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'probador-vibracion-mando';
|
|
6
|
+
const title = 'Probador de Vibración de Mando Online';
|
|
7
|
+
const description =
|
|
8
|
+
'Verifica el funcionamiento de los motores hápticos y vibración (Dual-Rumble) de tu mando en el navegador. Soporta Xbox, DualShock, DualSense y genéricos.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '¿Qué necesito para probar mi mando en la web?',
|
|
13
|
+
answer:
|
|
14
|
+
'Solo necesitas conectar tu mando al ordenador o móvil mediante un cable USB o emparejarlo por Bluetooth. Una vez enlazado, pulsa cualquier botón para que sea detectado.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '¿Funciona con cualquier modelo de mando?',
|
|
18
|
+
answer:
|
|
19
|
+
'La mayoría de mandos modernos de marcas reconocidas (como los de PlayStation o Xbox) son compatibles si tu dispositivo y sistema operativo lo permiten.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'El lado derecho de mi mando vibra menos que el izquierdo, ¿es normal?',
|
|
23
|
+
answer:
|
|
24
|
+
'Sí, es completamente normal. Los mandos suelen tener un diseño asimétrico donde un lado se encarga de las vibraciones fuertes y profundas, y el otro de las vibraciones rápidas y sutiles.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '¿Gasta mucha batería realizar estas pruebas?',
|
|
28
|
+
answer:
|
|
29
|
+
'La vibración es una de las funciones que más energía consume en un mando inalámbrico. Realizar pruebas continuas y largas agotará la batería más rápido de lo habitual.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Conecta y enciende tu mando',
|
|
36
|
+
text: 'Enlaza tu mando al PC, Mac o móvil por cable USB o vía Bluetooth.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Pulsa un botón del Gamepad',
|
|
40
|
+
text: 'Los navegadores requieren que pulses al menos un botón para que el mando se detecte y empiece la comunicación web.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Ajusta los motores de vibración',
|
|
44
|
+
text: 'Configura la potencia del Motor Fuerte (Grave) y del Motor Fino (Agudo) de forma independiente.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Ejecuta los patrones',
|
|
48
|
+
text: 'Pulsa uno de los presets o configura manualmente los parámetros y envía la señal para sentir cada componente.',
|
|
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<ProbadorVibracionMandoUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Referencias',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'Cómo funciona la vibración háptica — HobbyConsolas',
|
|
96
|
+
url: 'https://www.hobbyconsolas.com/reportajes/como-funciona-vibracion-haptica-mando-dualsense-ps5-757673',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Gamepad API — W3C',
|
|
100
|
+
url: 'https://w3c.github.io/gamepad/',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
howTo: howToData,
|
|
104
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
105
|
+
seo: [
|
|
106
|
+
{ type: 'title', text: 'Cómo auditar la vibración de tu mando gaming', level: 2 },
|
|
107
|
+
{
|
|
108
|
+
type: 'paragraph',
|
|
109
|
+
html: 'La respuesta háptica es uno de los elementos más envolventes del hardware gaming. Cuando el motor falla, los primeros síntomas suelen ser zumbidos anormales o vibraciones asimétricas. Diagnosticarlos a tiempo previene averías mayores.',
|
|
110
|
+
},
|
|
111
|
+
{ type: 'title', text: '¿Por qué es importante hacer el test de vibración?', level: 3 },
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: 'Al comprar un mando de segunda mano, al actualizar drivers o tras una caída, auditar los motores hápticos permite distinguir fallos físicos reales de problemas de software. Compatible con Xbox, PlayStation 4, PlayStation 5 (DualSense), Nintendo Switch Pro y mandos USB genéricos.',
|
|
115
|
+
},
|
|
116
|
+
{ type: 'title', text: 'Arquitectura Dual-Rumble vs. Actuadores Lineales', level: 3 },
|
|
117
|
+
{
|
|
118
|
+
type: 'paragraph',
|
|
119
|
+
html: 'Los mandos clásicos (Xbox, DualShock) usan dos micromotores asimétricos: el izquierdo genera vibraciones graves y profundas; el derecho produce zumbidos agudos y rápidos. Los dispositivos avanzados como el DualSense usan actuadores lineales que simulan texturas y resistencia.',
|
|
120
|
+
},
|
|
121
|
+
{ type: 'title', text: 'Guía de diagnóstico por síntomas', level: 3 },
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: 'Activa cada motor de forma independiente al 100%. Si ambos suenan igual, el mando puede ser una réplica con un único motor. Si uno no responde, revisa la conexión antes de abrir el chasis. Prueba intensidades fraccionadas: los motores de calidad responden de forma gradual, no como un interruptor on/off.',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
ui: {
|
|
128
|
+
badge: 'Test de Vibración',
|
|
129
|
+
title: 'Probador de Vibración de Mando',
|
|
130
|
+
description: 'Control directo sobre el motor Dual-Rumble de tu gamepad.',
|
|
131
|
+
deviceDisconnected: 'Mando Desconectado',
|
|
132
|
+
deviceDisconnectedSub: 'Toca un botón en tu mando para comenzar',
|
|
133
|
+
deviceFallback: 'Gamepad Enlazado',
|
|
134
|
+
deviceConnectedSub: 'Conexión estable. Listo para testear.',
|
|
135
|
+
noSupportWarning: "No detectamos soporte para Dual-Rumble en tu navegador. Usaremos la vibración básica genérica.",
|
|
136
|
+
tabPresets: 'Presets Top',
|
|
137
|
+
tabCustom: 'Precisión Pura',
|
|
138
|
+
presetHeavyTitle: 'Golpe de Martillo',
|
|
139
|
+
presetHeavyDesc: 'Motor pesado 300ms al máximo. Simula un golpe fuerte.',
|
|
140
|
+
presetLightTitle: 'Zumbido de Abeja',
|
|
141
|
+
presetLightDesc: 'Solo motor derecho activo. Ideal para detectar zumbidos extraños.',
|
|
142
|
+
presetHeartbeatTitle: 'Corazón a Mil',
|
|
143
|
+
presetHeartbeatDesc: 'Palpitaciones sutiles consecutivas. Perfecto para ver retenciones inerciales.',
|
|
144
|
+
presetSongTitle: 'Ritmo Moneda',
|
|
145
|
+
presetSongDesc: 'Simula el ruido de monedas consecutivas. Corto y táctil.',
|
|
146
|
+
presetRockYouTitle: 'Rock You!',
|
|
147
|
+
presetRockYouDesc: "El clásico de Queen en tus manos: pum, pum, ¡clap!",
|
|
148
|
+
presetEarthquakeTitle: '¡Terremoto Máximo!',
|
|
149
|
+
presetEarthquakeDesc: 'Ambos motores al 100% de fuerza explosiva. MUY intenso.',
|
|
150
|
+
customStrongLabel: 'Fuerza Grave (Izquierda)',
|
|
151
|
+
customWeakLabel: 'Fuerza Aguda (Derecha)',
|
|
152
|
+
customDurationLabel: 'Duración del Pulso',
|
|
153
|
+
btnSendSignal: 'ENVIAR SEÑAL AHORA',
|
|
154
|
+
},
|
|
155
|
+
};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { ProbadorVibracionMandoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'testeur-vibration-manette';
|
|
6
|
+
const title = 'Testeur de Vibration de Manette en Ligne';
|
|
7
|
+
const description =
|
|
8
|
+
"Vérifiez le fonctionnement des moteurs haptiques et la vibration (Dual-Rumble) de votre manette dans le navigateur. Compatible Xbox, DualShock, DualSense et génériques.";
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: "Que faut-il pour tester ma manette en ligne ?",
|
|
13
|
+
answer:
|
|
14
|
+
"Il suffit de connecter votre manette à l'ordinateur ou au mobile via USB ou de la jumeler en Bluetooth. Une fois liée, appuyez sur n'importe quel bouton pour qu'elle soit détectée.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Fonctionne-t-il avec n\'importe quel modèle de manette ?',
|
|
18
|
+
answer:
|
|
19
|
+
"La plupart des manettes modernes de marques reconnues (comme PlayStation ou Xbox) sont compatibles si votre appareil et système d'exploitation le permettent.",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Le côté droit de ma manette vibre moins que le gauche, est-ce normal ?',
|
|
23
|
+
answer:
|
|
24
|
+
"Oui, c'est tout à fait normal. Les manettes ont généralement un design asymétrique où un côté gère les vibrations fortes et profondes, et l'autre les vibrations rapides et subtiles.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Ces tests consomment-ils beaucoup de batterie ?',
|
|
28
|
+
answer:
|
|
29
|
+
"La vibration est l'une des fonctions les plus énergivores d'une manette sans fil. Des tests continus et longs videront la batterie plus vite qu'habituellement.",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Connectez et allumez votre manette',
|
|
36
|
+
text: "Reliez votre manette au PC, Mac ou mobile via câble USB ou Bluetooth.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Appuyez sur un bouton de la manette',
|
|
40
|
+
text: "Les navigateurs exigent d'appuyer sur au moins un bouton pour que la manette soit détectée.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Ajustez les moteurs de vibration',
|
|
44
|
+
text: "Configurez la puissance du Moteur Fort (Grave) et du Moteur Fin (Aigu) indépendamment.",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Exécutez les patterns',
|
|
48
|
+
text: "Appuyez sur un des presets ou configurez manuellement les paramètres et envoyez le signal.",
|
|
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<ProbadorVibracionMandoUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Questions Fréquentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Références',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'Comment fonctionne la vibration haptique — HobbyConsolas',
|
|
96
|
+
url: 'https://www.hobbyconsolas.com/reportajes/como-funciona-vibracion-haptica-mando-dualsense-ps5-757673',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Gamepad API — W3C',
|
|
100
|
+
url: 'https://w3c.github.io/gamepad/',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
howTo: howToData,
|
|
104
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
105
|
+
seo: [
|
|
106
|
+
{ type: 'title', text: 'Comment auditer la vibration de votre manette gaming', level: 2 },
|
|
107
|
+
{
|
|
108
|
+
type: 'paragraph',
|
|
109
|
+
html: "Le retour haptique est l'un des éléments les plus immersifs du matériel gaming. Quand un moteur tombe en panne, les premiers symptômes sont des bourdonnements anormaux ou des vibrations asymétriques. Les diagnostiquer tôt prévient des pannes majeures.",
|
|
110
|
+
},
|
|
111
|
+
{ type: 'title', text: 'Pourquoi effectuer le test de vibration ?', level: 3 },
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: "Lors de l'achat d'une manette d'occasion, après une mise à jour des pilotes ou après une chute, tester les moteurs haptiques permet de distinguer les vraies pannes matérielles des problèmes logiciels. Compatible Xbox, PlayStation 4, PlayStation 5 (DualSense), Nintendo Switch Pro et manettes USB génériques.",
|
|
115
|
+
},
|
|
116
|
+
{ type: 'title', text: 'Architecture Dual-Rumble vs. Actionneurs Linéaires', level: 3 },
|
|
117
|
+
{
|
|
118
|
+
type: 'paragraph',
|
|
119
|
+
html: "Les manettes classiques (Xbox, DualShock) utilisent deux micromoteurs asymétriques : le gauche génère des vibrations graves et profondes ; le droit produit des bourdonnements aigus et rapides. Les appareils avancés comme le DualSense utilisent des actionneurs linéaires qui simulent textures et résistance.",
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
ui: {
|
|
123
|
+
badge: 'Test de Vibration',
|
|
124
|
+
title: 'Testeur de Vibration de Manette',
|
|
125
|
+
description: 'Contrôle direct sur le moteur Dual-Rumble de votre manette.',
|
|
126
|
+
deviceDisconnected: 'Manette Déconnectée',
|
|
127
|
+
deviceDisconnectedSub: 'Appuyez sur un bouton de votre manette pour commencer',
|
|
128
|
+
deviceFallback: 'Manette Connectée',
|
|
129
|
+
deviceConnectedSub: 'Connexion stable. Prêt à tester.',
|
|
130
|
+
noSupportWarning: "Pas de support Dual-Rumble détecté dans votre navigateur. Utilisation de la vibration générique de base.",
|
|
131
|
+
tabPresets: 'Presets Top',
|
|
132
|
+
tabCustom: 'Précision Pure',
|
|
133
|
+
presetHeavyTitle: 'Coup de Marteau',
|
|
134
|
+
presetHeavyDesc: 'Moteur lourd à fond pendant 300ms. Simule un coup fort.',
|
|
135
|
+
presetLightTitle: "Bourdonnement d'Abeille",
|
|
136
|
+
presetLightDesc: 'Moteur droit uniquement. Idéal pour détecter les bourdonnements anormaux.',
|
|
137
|
+
presetHeartbeatTitle: "Cœur qui s'emballe",
|
|
138
|
+
presetHeartbeatDesc: 'Pulsations subtiles consécutives. Parfait pour vérifier la rétention inertielle.',
|
|
139
|
+
presetSongTitle: 'Rythme Pièce',
|
|
140
|
+
presetSongDesc: 'Simule le son de pièces collectées. Court et tactile.',
|
|
141
|
+
presetRockYouTitle: 'Rock You!',
|
|
142
|
+
presetRockYouDesc: "Le classique de Queen dans vos mains : boum, boum, clap !",
|
|
143
|
+
presetEarthquakeTitle: 'Tremblement Maximal !',
|
|
144
|
+
presetEarthquakeDesc: 'Les deux moteurs à 100% de force explosive. TRÈS intense.',
|
|
145
|
+
customStrongLabel: 'Force Grave (Gauche)',
|
|
146
|
+
customWeakLabel: 'Force Aiguë (Droite)',
|
|
147
|
+
customDurationLabel: "Durée de l'Impulsion",
|
|
148
|
+
btnSendSignal: 'ENVOYER LE SIGNAL MAINTENANT',
|
|
149
|
+
},
|
|
150
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { HardwareToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
|
|
3
|
+
import ProbadorVibracionMandoComponent from './component.astro';
|
|
4
|
+
import ProbadorVibracionMandoSEO from './seo.astro';
|
|
5
|
+
import ProbadorVibracionMandoBibliography from './bibliography.astro';
|
|
6
|
+
|
|
7
|
+
import type { ProbadorVibracionMandoUI } from './ui';
|
|
8
|
+
export type ProbadorVibracionMandoLocaleContent = ToolLocaleContent<ProbadorVibracionMandoUI>;
|
|
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 probadorVibracionMando: HardwareToolEntry<ProbadorVibracionMandoUI> = {
|
|
15
|
+
id: 'probador-vibracion-mando',
|
|
16
|
+
icons: {
|
|
17
|
+
bg: 'mdi:vibrate',
|
|
18
|
+
fg: 'mdi:gamepad-variant',
|
|
19
|
+
},
|
|
20
|
+
i18n: {
|
|
21
|
+
es: async () => es,
|
|
22
|
+
en: async () => en,
|
|
23
|
+
fr: async () => fr,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { ProbadorVibracionMandoComponent, ProbadorVibracionMandoSEO, ProbadorVibracionMandoBibliography };
|
|
28
|
+
|
|
29
|
+
export const PROBADOR_VIBRACION_MANDO_TOOL: ToolDefinition = {
|
|
30
|
+
entry: probadorVibracionMando,
|
|
31
|
+
Component: ProbadorVibracionMandoComponent,
|
|
32
|
+
SEOComponent: ProbadorVibracionMandoSEO,
|
|
33
|
+
BibliographyComponent: ProbadorVibracionMandoBibliography,
|
|
34
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import type { KnownLocale } from '../../types';
|
|
4
|
+
import { probadorVibracionMando } from './index';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await probadorVibracionMando.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ProbadorVibracionMandoUI extends Record<string, string> {
|
|
2
|
+
badge: string;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
deviceDisconnected: string;
|
|
6
|
+
deviceDisconnectedSub: string;
|
|
7
|
+
deviceFallback: string;
|
|
8
|
+
deviceConnectedSub: string;
|
|
9
|
+
noSupportWarning: string;
|
|
10
|
+
tabPresets: string;
|
|
11
|
+
tabCustom: string;
|
|
12
|
+
presetHeavyTitle: string;
|
|
13
|
+
presetHeavyDesc: string;
|
|
14
|
+
presetLightTitle: string;
|
|
15
|
+
presetLightDesc: string;
|
|
16
|
+
presetHeartbeatTitle: string;
|
|
17
|
+
presetHeartbeatDesc: string;
|
|
18
|
+
presetSongTitle: string;
|
|
19
|
+
presetSongDesc: string;
|
|
20
|
+
presetRockYouTitle: string;
|
|
21
|
+
presetRockYouDesc: string;
|
|
22
|
+
presetEarthquakeTitle: string;
|
|
23
|
+
presetEarthquakeDesc: string;
|
|
24
|
+
customStrongLabel: string;
|
|
25
|
+
customWeakLabel: string;
|
|
26
|
+
customDurationLabel: string;
|
|
27
|
+
btnSendSignal: string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { KnownLocale } from '../../types';
|
|
3
|
+
import { testTeclado } from './index';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
locale?: KnownLocale;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const { locale = 'es' } = Astro.props;
|
|
10
|
+
const content = await testTeclado.i18n[locale]?.();
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
{
|
|
14
|
+
content && content.bibliography.length > 0 && (
|
|
15
|
+
<article class="prose prose-lg dark:prose-invert max-w-4xl mx-auto mt-20 px-6 font-sans">
|
|
16
|
+
<h2 class="text-3xl font-black dark:text-blue-100 mb-8 tracking-tight">
|
|
17
|
+
{content.bibliographyTitle}
|
|
18
|
+
</h2>
|
|
19
|
+
<ul>
|
|
20
|
+
{content.bibliography.map((item) => (
|
|
21
|
+
<li>
|
|
22
|
+
<a href={item.url} target="_blank" rel="noopener noreferrer">
|
|
23
|
+
{item.name}
|
|
24
|
+
</a>
|
|
25
|
+
</li>
|
|
26
|
+
))}
|
|
27
|
+
</ul>
|
|
28
|
+
</article>
|
|
29
|
+
)
|
|
30
|
+
}
|