@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,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { KnownLocale } from '../../types';
|
|
3
|
+
import type { TestRatonUI } from './ui';
|
|
4
|
+
import { Icon } from 'astro-icon/components';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
ui?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { ui } = Astro.props;
|
|
12
|
+
const t = (ui ?? {}) as TestRatonUI;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<div id="tr-root" class="tr-wrapper">
|
|
16
|
+
|
|
17
|
+
<style is:global>
|
|
18
|
+
.tr-wrapper {
|
|
19
|
+
--tr-accent: #10b981;
|
|
20
|
+
--tr-accent-glow: rgba(16, 185, 129, 0.4);
|
|
21
|
+
--tr-surface: #fff;
|
|
22
|
+
--tr-surface-alt: #f1f5f9;
|
|
23
|
+
--tr-surface-dark: #020617;
|
|
24
|
+
--tr-border: #e2e8f0;
|
|
25
|
+
--tr-text: #0f172a;
|
|
26
|
+
--tr-text-muted: #64748b;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.theme-dark .tr-wrapper {
|
|
30
|
+
--tr-surface: #0f172a;
|
|
31
|
+
--tr-surface-alt: #1e293b;
|
|
32
|
+
--tr-surface-dark: #020617;
|
|
33
|
+
--tr-border: #334155;
|
|
34
|
+
--tr-text: #f1f5f9;
|
|
35
|
+
--tr-text-muted: #94a3b8;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
body.is-widget .tr-wrapper {
|
|
39
|
+
padding: 0;
|
|
40
|
+
}
|
|
41
|
+
</style>
|
|
42
|
+
|
|
43
|
+
<div class="tr-card">
|
|
44
|
+
<div class="tr-header">
|
|
45
|
+
<div class="tr-header-info">
|
|
46
|
+
<div class="tr-badge">
|
|
47
|
+
<Icon name="mdi:mouse" class="tr-badge-icon" />
|
|
48
|
+
{t.badge}
|
|
49
|
+
</div>
|
|
50
|
+
<h2 class="tr-title">{t.title}</h2>
|
|
51
|
+
<p class="tr-description">{t.description}</p>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div class="tr-stats">
|
|
55
|
+
<div class="tr-stat">
|
|
56
|
+
<div class="tr-stat-label">{t.labelAvg}</div>
|
|
57
|
+
<div class="tr-stat-value">
|
|
58
|
+
<span id="tr-avg">0</span>
|
|
59
|
+
<span class="tr-stat-unit">Hz</span>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="tr-stat">
|
|
63
|
+
<div class="tr-stat-label">{t.labelPeak}</div>
|
|
64
|
+
<div class="tr-stat-value">
|
|
65
|
+
<span id="tr-max">0</span>
|
|
66
|
+
<span class="tr-stat-unit">Hz</span>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div id="tr-area" class="tr-area">
|
|
73
|
+
<div id="tr-placeholder" class="tr-placeholder">{t.placeholder}</div>
|
|
74
|
+
<canvas id="tr-canvas" class="tr-canvas"></canvas>
|
|
75
|
+
<div id="tr-follower" class="tr-follower">0 Hz</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<style>
|
|
80
|
+
.tr-wrapper {
|
|
81
|
+
width: 100%;
|
|
82
|
+
max-width: 56rem;
|
|
83
|
+
margin: 0 auto;
|
|
84
|
+
color: var(--tr-text);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.tr-card {
|
|
88
|
+
background: var(--tr-surface);
|
|
89
|
+
border: 1px solid var(--tr-border);
|
|
90
|
+
border-radius: 1.5rem;
|
|
91
|
+
padding: 2rem;
|
|
92
|
+
box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.1);
|
|
93
|
+
display: flex;
|
|
94
|
+
flex-direction: column;
|
|
95
|
+
gap: 1.5rem;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.tr-header {
|
|
99
|
+
display: flex;
|
|
100
|
+
justify-content: space-between;
|
|
101
|
+
align-items: center;
|
|
102
|
+
gap: 1rem;
|
|
103
|
+
flex-wrap: wrap;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.tr-header-info {
|
|
107
|
+
display: flex;
|
|
108
|
+
flex-direction: column;
|
|
109
|
+
gap: 0.25rem;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.tr-badge {
|
|
113
|
+
display: inline-flex;
|
|
114
|
+
align-items: center;
|
|
115
|
+
gap: 0.5rem;
|
|
116
|
+
padding: 0.25rem 0.75rem;
|
|
117
|
+
border-radius: 9999px;
|
|
118
|
+
background: rgba(16, 185, 129, 0.1);
|
|
119
|
+
color: var(--tr-accent);
|
|
120
|
+
font-size: 0.75rem;
|
|
121
|
+
font-weight: 700;
|
|
122
|
+
text-transform: uppercase;
|
|
123
|
+
letter-spacing: 0.05em;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.tr-badge-icon {
|
|
127
|
+
width: 1rem;
|
|
128
|
+
height: 1rem;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.tr-title {
|
|
132
|
+
margin: 0;
|
|
133
|
+
font-size: 1.875rem;
|
|
134
|
+
font-weight: 900;
|
|
135
|
+
letter-spacing: -0.02em;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.tr-description {
|
|
139
|
+
margin: 0;
|
|
140
|
+
color: var(--tr-text-muted);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.tr-stats {
|
|
144
|
+
display: flex;
|
|
145
|
+
gap: 1rem;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.tr-stat {
|
|
149
|
+
background: var(--tr-surface-alt);
|
|
150
|
+
border-radius: 1rem;
|
|
151
|
+
padding: 1rem;
|
|
152
|
+
min-width: 7.5rem;
|
|
153
|
+
text-align: center;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.tr-stat-label {
|
|
157
|
+
font-size: 0.75rem;
|
|
158
|
+
font-weight: 700;
|
|
159
|
+
color: var(--tr-text-muted);
|
|
160
|
+
text-transform: uppercase;
|
|
161
|
+
letter-spacing: 0.05em;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.tr-stat-value {
|
|
165
|
+
display: flex;
|
|
166
|
+
align-items: baseline;
|
|
167
|
+
justify-content: center;
|
|
168
|
+
gap: 0.25rem;
|
|
169
|
+
font-size: 2.25rem;
|
|
170
|
+
font-weight: 900;
|
|
171
|
+
color: var(--tr-accent);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.tr-stat-unit {
|
|
175
|
+
font-size: 1rem;
|
|
176
|
+
color: var(--tr-text-muted);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.tr-area {
|
|
180
|
+
position: relative;
|
|
181
|
+
width: 100%;
|
|
182
|
+
height: 400px;
|
|
183
|
+
background: var(--tr-surface-alt);
|
|
184
|
+
border-radius: 1rem;
|
|
185
|
+
border: 2px dashed var(--tr-border);
|
|
186
|
+
overflow: hidden;
|
|
187
|
+
cursor: crosshair;
|
|
188
|
+
display: flex;
|
|
189
|
+
align-items: center;
|
|
190
|
+
justify-content: center;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.tr-placeholder {
|
|
194
|
+
color: var(--tr-border);
|
|
195
|
+
font-weight: 700;
|
|
196
|
+
font-size: 1.25rem;
|
|
197
|
+
pointer-events: none;
|
|
198
|
+
transition: opacity 200ms;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.tr-canvas {
|
|
202
|
+
position: absolute;
|
|
203
|
+
inset: 0;
|
|
204
|
+
width: 100%;
|
|
205
|
+
height: 100%;
|
|
206
|
+
opacity: 0.6;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.tr-follower {
|
|
210
|
+
position: absolute;
|
|
211
|
+
pointer-events: none;
|
|
212
|
+
background: var(--tr-accent);
|
|
213
|
+
color: #fff;
|
|
214
|
+
font-size: 0.75rem;
|
|
215
|
+
font-weight: 700;
|
|
216
|
+
padding: 0.25rem 0.5rem;
|
|
217
|
+
border-radius: 9999px;
|
|
218
|
+
box-shadow: 0 4px 10px var(--tr-accent-glow);
|
|
219
|
+
opacity: 0;
|
|
220
|
+
transition: opacity 75ms;
|
|
221
|
+
transform: translate(0, 0);
|
|
222
|
+
}
|
|
223
|
+
</style>
|
|
224
|
+
|
|
225
|
+
<script>
|
|
226
|
+
import { RatonManager } from './logic/RatonManager';
|
|
227
|
+
|
|
228
|
+
new RatonManager({
|
|
229
|
+
avg: document.getElementById('tr-avg'),
|
|
230
|
+
max: document.getElementById('tr-max'),
|
|
231
|
+
follower: document.getElementById('tr-follower'),
|
|
232
|
+
placeholder: document.getElementById('tr-placeholder'),
|
|
233
|
+
canvas: document.getElementById('tr-canvas') as HTMLCanvasElement | null,
|
|
234
|
+
area: document.getElementById('tr-area')
|
|
235
|
+
}, new URL('./worker/mouseWorker.ts', import.meta.url));
|
|
236
|
+
</script>
|
|
237
|
+
</div>
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { TestRatonUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'mouse-polling-rate-test';
|
|
6
|
+
const title = 'Online Mouse Polling Rate Test';
|
|
7
|
+
const description =
|
|
8
|
+
'Check the real Hz of your mouse. Verify if your gaming mouse works at 1000Hz or more with our professional tool.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'What is the Polling Rate of a mouse?',
|
|
13
|
+
answer:
|
|
14
|
+
'It is the frequency at which the mouse reports its position to the computer, measured in Hz. A polling rate of 1000Hz means the mouse sends data every 1 millisecond, providing much smoother movement.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Why does my test not reach 1000Hz constantly?',
|
|
18
|
+
answer:
|
|
19
|
+
'The browser can only measure polling rate when the mouse is moving. If you move it slowly or your CPU is very busy, the measurement may fluctuate. Move the mouse in fast circles to get the real maximum peak.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Is it better to have the highest polling rate possible?',
|
|
23
|
+
answer:
|
|
24
|
+
'Generally yes for gaming (1000Hz or more), as it reduces lag. However, extremely high rates (4000Hz or 8000Hz) consume a lot of CPU resources and not all games are optimized for them.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'How does the monitor refresh rate affect the mouse?',
|
|
28
|
+
answer:
|
|
29
|
+
'If you have a 144Hz or 240Hz monitor, a low polling rate (125Hz) will make the pointer look choppy. For high-frequency monitors, it is essential to use at least 500Hz or 1000Hz.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Prepare the test area',
|
|
36
|
+
text: 'Place the cursor inside the capture zone of the tool.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Move the mouse quickly',
|
|
40
|
+
text: 'Make fast, wide circular movements. The tool will calculate the intervals between each mousemove event sent by the hardware.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Observe the stability graph',
|
|
44
|
+
text: 'Check if the Hz line is constant or has sudden drops, which could indicate interference in wireless mice or CPU issues.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Analyze the response time',
|
|
48
|
+
text: 'Check the average Delay in milliseconds. A good gaming mouse should stay close to 1ms average latency.',
|
|
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<TestRatonUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Frequently Asked Questions',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'References',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'Gamepad Polling Rate — Logitech',
|
|
96
|
+
url: 'https://www.logitechg.com/en-us/innovation/delta-zero.html',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'USB HID Polling Rate — USB Implementers Forum',
|
|
100
|
+
url: 'https://www.usb.org/hid',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
howTo: howToData,
|
|
104
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
105
|
+
seo: [
|
|
106
|
+
{ type: 'title', text: 'Definitive Guide to Polling Rate', level: 2 },
|
|
107
|
+
{
|
|
108
|
+
type: 'paragraph',
|
|
109
|
+
html: 'When you physically move your mouse on the mousepad, that analog movement must be translated into digital signals your computer understands. The <strong>Polling Rate</strong> is the frequency at which the mouse "reports" its position to the PC. It is measured in Hertz (Hz).',
|
|
110
|
+
},
|
|
111
|
+
{ type: 'title', text: 'Polling Rate Levels and Their Uses', level: 3 },
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: '<strong>125 Hz</strong> — The mouse reports every 8 milliseconds. Fine for office use but feels choppy on 144Hz monitors. <strong>1000 Hz</strong> — The gaming gold standard: reports every 1 ms. Smooth movement with no perceptible delay. <strong>8000 Hz</strong> — Cutting-edge technology (Razer, Logitech). Reports every 0.125 ms but requires a powerful CPU.',
|
|
115
|
+
},
|
|
116
|
+
{ type: 'title', text: 'Why Do My Hz Fluctuate?', level: 3 },
|
|
117
|
+
{
|
|
118
|
+
type: 'paragraph',
|
|
119
|
+
html: 'Completely normal. Most modern mice have a dynamic polling rate to save power. If you move the mouse slowly, it sends fewer reports because there is less new data. Only fast, continuous movements push the sensor to its real maximum peak.',
|
|
120
|
+
},
|
|
121
|
+
{ type: 'title', text: 'Polling Rate vs DPI: The Big Confusion', level: 3 },
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: '<strong>DPI (Dots Per Inch)</strong> is sensitivity: how many pixels the cursor moves per inch of physical movement. <strong>Hz (Polling Rate)</strong> is update frequency: how smoothly and timely that movement is reported. Both parameters are independent and complementary.',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
ui: {
|
|
128
|
+
badge: 'Mouse Test',
|
|
129
|
+
title: 'Polling Rate Checker',
|
|
130
|
+
description: 'Move the mouse in fast circles to measure the Hz.',
|
|
131
|
+
labelAvg: 'Average',
|
|
132
|
+
labelPeak: 'Peak',
|
|
133
|
+
placeholder: 'Move the mouse here',
|
|
134
|
+
},
|
|
135
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { TestRatonUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'test-raton';
|
|
6
|
+
const title = 'Test de Polling Rate del Ratón Online';
|
|
7
|
+
const description =
|
|
8
|
+
'Comprueba los Hz reales de tu ratón. Verifica si tu mouse gaming funciona a 1000Hz o más con nuestra herramienta profesional.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '¿Qué es el Polling Rate de un ratón?',
|
|
13
|
+
answer:
|
|
14
|
+
'Es la frecuencia con la que el ratón informa de su posición al ordenador, medida en Hz. Un polling rate de 1000Hz significa que el ratón envía datos cada 1 milisegundo, proporcionando un movimiento mucho más fluido.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '¿Por qué mi test no llega a 1000Hz constantes?',
|
|
18
|
+
answer:
|
|
19
|
+
'El navegador solo puede medir el polling rate cuando el ratón está en movimiento. Si lo mueves despacio o tu CPU está muy ocupada, la medición puede fluctuar. Mueve el ratón en círculos rápidos para obtener el pico máximo real.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '¿Es mejor tener el polling rate más alto posible?',
|
|
23
|
+
answer:
|
|
24
|
+
'Generalmente sí para gaming (1000Hz o más), ya que reduce el lag. Sin embargo, tasas extremadamente altas (4000Hz o 8000Hz) consumen muchos recursos de CPU y no todos los juegos están optimizados para ello.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '¿Cómo afecta la tasa de refresco del monitor al ratón?',
|
|
28
|
+
answer:
|
|
29
|
+
'Si tienes un monitor de 144Hz o 240Hz, un polling rate bajo (125Hz) hará que el puntero se vea a saltos. Para monitores de alta frecuencia, es imprescindible usar al menos 500Hz o 1000Hz.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Preparar el área de test',
|
|
36
|
+
text: 'Sitúa el cursor dentro de la zona de captura de la herramienta.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Mover el ratón rápidamente',
|
|
40
|
+
text: 'Realiza movimientos circulares rápidos y amplios. La herramienta calculará los intervalos entre cada evento mousemove enviado por el hardware.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Observar el gráfico de estabilidad',
|
|
44
|
+
text: 'Revisa si la línea de Hz es constante o si tiene caídas bruscas, lo que podría indicar interferencias en ratones inalámbricos o problemas de CPU.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Analizar el tiempo de respuesta',
|
|
48
|
+
text: 'Verifica el Delay medio en milisegundos. Un buen ratón gaming debe mantenerse cerca de 1ms de latencia media.',
|
|
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<TestRatonUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Referencias',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'Gamepad Polling Rate — Logitech',
|
|
96
|
+
url: 'https://www.logitechg.com/en-us/innovation/delta-zero.html',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'USB HID Polling Rate — USB Implementers Forum',
|
|
100
|
+
url: 'https://www.usb.org/hid',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
howTo: howToData,
|
|
104
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
105
|
+
seo: [
|
|
106
|
+
{ type: 'title', text: 'Guía Definitiva sobre Polling Rate (tasa de sondeo)', level: 2 },
|
|
107
|
+
{
|
|
108
|
+
type: 'paragraph',
|
|
109
|
+
html: 'Cuando mueves tu ratón físico sobre la alfombrilla, ese movimiento analógico debe traducirse a señales digitales que tu ordenador entienda. El <strong>Polling Rate</strong> o Tasa de Sondeo es la frecuencia con la que el ratón "reporta" su posición al PC. Se mide en Hercios (Hz).',
|
|
110
|
+
},
|
|
111
|
+
{ type: 'title', text: 'Niveles de Polling Rate y sus usos', level: 3 },
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: '<strong>125 Hz</strong> — El ratón informa cada 8 milisegundos. Perfecto para uso de oficina, pero se nota a tirones en monitores de 144Hz. <strong>1000 Hz</strong> — El estándar de oro del gaming: informa cada 1 ms. Movimiento fluido y sin retraso perceptible. <strong>8000 Hz</strong> — Tecnología punta (Razer, Logitech). Informa cada 0.125 ms, pero requiere una CPU potente.',
|
|
115
|
+
},
|
|
116
|
+
{ type: 'title', text: '¿Por qué mis Hz fluctúan?', level: 3 },
|
|
117
|
+
{
|
|
118
|
+
type: 'paragraph',
|
|
119
|
+
html: 'Es completamente normal. La mayoría de ratones modernos tienen un polling rate dinámico para ahorrar energía. Si mueves el ratón despacio, enviará menos reportes porque hay menos datos nuevos. Solo cuando haces movimientos rápidos y continuos el sensor alcanza su pico máximo real.',
|
|
120
|
+
},
|
|
121
|
+
{ type: 'title', text: 'Polling Rate vs DPI: La gran confusión', level: 3 },
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: '<strong>DPI (Dots Per Inch)</strong> es la sensibilidad: cuántos píxeles se mueve el cursor por cada pulgada de movimiento físico. <strong>Hz (Polling Rate)</strong> es la frecuencia de actualización: con qué suavidad y actualidad se reporta ese movimiento. Puedes tener 16.000 DPI con 125 Hz y el movimiento será lento e impreciso. Los dos parámetros son independientes y complementarios.',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
ui: {
|
|
128
|
+
badge: 'Mouse Test',
|
|
129
|
+
title: 'Polling Rate Checker',
|
|
130
|
+
description: 'Mueve el ratón en círculos rápidos para medir los Hz.',
|
|
131
|
+
labelAvg: 'Promedio',
|
|
132
|
+
labelPeak: 'Pico',
|
|
133
|
+
placeholder: 'Mueve el ratón aquí',
|
|
134
|
+
},
|
|
135
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { TestRatonUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'test-taux-sondage-souris';
|
|
6
|
+
const title = 'Test du Taux de Sondage de la Souris en Ligne';
|
|
7
|
+
const description =
|
|
8
|
+
"Vérifiez les Hz réels de votre souris. Testez si votre souris gaming fonctionne à 1000Hz ou plus avec notre outil professionnel.";
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: "Qu'est-ce que le taux de sondage d'une souris ?",
|
|
13
|
+
answer:
|
|
14
|
+
"C'est la fréquence à laquelle la souris communique sa position à l'ordinateur, mesurée en Hz. Un taux de 1000Hz signifie que la souris envoie des données toutes les millisecondes, offrant un mouvement beaucoup plus fluide.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: "Pourquoi mon test n'atteint pas 1000Hz en continu ?",
|
|
18
|
+
answer:
|
|
19
|
+
"Le navigateur ne peut mesurer le taux de sondage que lorsque la souris est en mouvement. Si vous la déplacez lentement ou que votre CPU est très occupé, la mesure peut fluctuer. Faites des cercles rapides pour obtenir le vrai pic maximum.",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Est-il toujours préférable d\'avoir le taux de sondage le plus élevé possible ?',
|
|
23
|
+
answer:
|
|
24
|
+
"Généralement oui pour le gaming (1000Hz ou plus), car cela réduit la latence. Cependant, des taux extrêmement élevés (4000Hz ou 8000Hz) consomment beaucoup de ressources CPU et tous les jeux n'y sont pas optimisés.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: "Comment le taux de rafraîchissement du moniteur affecte-t-il la souris ?",
|
|
28
|
+
answer:
|
|
29
|
+
"Avec un moniteur 144Hz ou 240Hz, un faible taux de sondage (125Hz) donnera l'impression que le pointeur saccade. Pour les moniteurs haute fréquence, il est indispensable d'utiliser au moins 500Hz ou 1000Hz.",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Préparer la zone de test',
|
|
36
|
+
text: "Placez le curseur dans la zone de capture de l'outil.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Déplacer la souris rapidement',
|
|
40
|
+
text: "Effectuez des mouvements circulaires rapides et amples. L'outil calculera les intervalles entre chaque événement mousemove envoyé par le matériel.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Observer le graphique de stabilité',
|
|
44
|
+
text: "Vérifiez si la ligne de Hz est constante ou présente des chutes brusques, ce qui pourrait indiquer des interférences sur les souris sans fil ou des problèmes de CPU.",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Analyser le temps de réponse',
|
|
48
|
+
text: "Vérifiez le Délai moyen en millisecondes. Une bonne souris gaming doit se maintenir proche de 1ms de latence moyenne.",
|
|
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<TestRatonUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Questions Fréquentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Références',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'Gamepad Polling Rate — Logitech',
|
|
96
|
+
url: 'https://www.logitechg.com/en-us/innovation/delta-zero.html',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'USB HID Polling Rate — USB Implementers Forum',
|
|
100
|
+
url: 'https://www.usb.org/hid',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
howTo: howToData,
|
|
104
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
105
|
+
seo: [
|
|
106
|
+
{ type: 'title', text: 'Guide Complet sur le Taux de Sondage', level: 2 },
|
|
107
|
+
{
|
|
108
|
+
type: 'paragraph',
|
|
109
|
+
html: "Lorsque vous déplacez physiquement votre souris sur le tapis, ce mouvement analogique doit être converti en signaux numériques compréhensibles par votre ordinateur. Le <strong>Taux de Sondage</strong> (Polling Rate) est la fréquence à laquelle la souris envoie sa position au PC, mesurée en Hertz (Hz).",
|
|
110
|
+
},
|
|
111
|
+
{ type: 'title', text: 'Niveaux de Taux de Sondage et Leurs Usages', level: 3 },
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: "<strong>125 Hz</strong> — La souris communique toutes les 8 ms. Parfait pour un usage bureautique, mais saccadé sur un écran 144Hz. <strong>1000 Hz</strong> — L'étalon-or du gaming : communication toutes les 1 ms, mouvement fluide. <strong>8000 Hz</strong> — Technologie de pointe (Razer, Logitech), nécessite un processeur puissant.",
|
|
115
|
+
},
|
|
116
|
+
{ type: 'title', text: 'Pourquoi mes Hz fluctuent-ils ?', level: 3 },
|
|
117
|
+
{
|
|
118
|
+
type: 'paragraph',
|
|
119
|
+
html: "Tout à fait normal. La plupart des souris modernes ont un taux de sondage dynamique pour économiser l'énergie. En déplaçant lentement la souris, elle envoie moins de rapports car il y a moins de nouvelles données. Seuls des mouvements rapides et continus poussent le capteur à son vrai pic maximum.",
|
|
120
|
+
},
|
|
121
|
+
{ type: 'title', text: 'Taux de Sondage vs DPI : La Grande Confusion', level: 3 },
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: "<strong>DPI (Dots Per Inch)</strong> est la sensibilité : combien de pixels le curseur parcourt par pouce de déplacement physique. <strong>Hz (Taux de Sondage)</strong> est la fréquence de mise à jour : avec quelle fluidité et actualité ce mouvement est reporté. Les deux paramètres sont indépendants et complémentaires.",
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
ui: {
|
|
128
|
+
badge: 'Test Souris',
|
|
129
|
+
title: 'Polling Rate Checker',
|
|
130
|
+
description: 'Déplacez la souris en cercles rapides pour mesurer les Hz.',
|
|
131
|
+
labelAvg: 'Moyenne',
|
|
132
|
+
labelPeak: 'Pic',
|
|
133
|
+
placeholder: 'Déplacez la souris ici',
|
|
134
|
+
},
|
|
135
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { HardwareToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
|
|
3
|
+
import TestRatonComponent from './component.astro';
|
|
4
|
+
import TestRatonSEO from './seo.astro';
|
|
5
|
+
import TestRatonBibliography from './bibliography.astro';
|
|
6
|
+
|
|
7
|
+
import type { TestRatonUI } from './ui';
|
|
8
|
+
export type TestRatonLocaleContent = ToolLocaleContent<TestRatonUI>;
|
|
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 testRaton: HardwareToolEntry<TestRatonUI> = {
|
|
15
|
+
id: 'test-raton',
|
|
16
|
+
icons: {
|
|
17
|
+
bg: 'mdi:mouse-variant',
|
|
18
|
+
fg: 'mdi:mouse',
|
|
19
|
+
},
|
|
20
|
+
i18n: {
|
|
21
|
+
es: async () => es,
|
|
22
|
+
en: async () => en,
|
|
23
|
+
fr: async () => fr,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { TestRatonComponent, TestRatonSEO, TestRatonBibliography };
|
|
28
|
+
|
|
29
|
+
export const TEST_RATON_TOOL: ToolDefinition = {
|
|
30
|
+
entry: testRaton,
|
|
31
|
+
Component: TestRatonComponent,
|
|
32
|
+
SEOComponent: TestRatonSEO,
|
|
33
|
+
BibliographyComponent: TestRatonBibliography,
|
|
34
|
+
};
|