@jjlmoya/utils-hardware 1.17.0 → 1.19.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 (98) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +4 -4
  3. package/src/category/i18n/id.ts +3 -3
  4. package/src/category/i18n/it.ts +3 -3
  5. package/src/category/i18n/nl.ts +3 -3
  6. package/src/category/i18n/pl.ts +4 -4
  7. package/src/category/i18n/pt.ts +3 -3
  8. package/src/category/i18n/ru.ts +3 -3
  9. package/src/category/i18n/sv.ts +3 -3
  10. package/src/category/i18n/tr.ts +3 -3
  11. package/src/category/i18n/zh.ts +3 -3
  12. package/src/category/index.ts +2 -1
  13. package/src/entries.ts +4 -1
  14. package/src/index.ts +1 -0
  15. package/src/layouts/PreviewLayout.astro +1 -0
  16. package/src/tests/diacritics_density.test.ts +118 -0
  17. package/src/tests/inverted_punctuation.test.ts +84 -0
  18. package/src/tests/locale_completeness.test.ts +2 -2
  19. package/src/tests/no_en_dash.test.ts +70 -0
  20. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  21. package/src/tests/script_density.test.ts +94 -0
  22. package/src/tests/tool_validation.test.ts +2 -2
  23. package/src/tool/batteryHealthEstimator/component.astro +3 -3
  24. package/src/tool/batteryHealthEstimator/i18n/fr.ts +4 -4
  25. package/src/tool/batteryHealthEstimator/i18n/pl.ts +1 -1
  26. package/src/tool/colorAccuracyTest/color-accuracy-test.css +118 -5
  27. package/src/tool/colorAccuracyTest/i18n/de.ts +7 -7
  28. package/src/tool/colorAccuracyTest/i18n/en.ts +3 -3
  29. package/src/tool/colorAccuracyTest/i18n/es.ts +2 -2
  30. package/src/tool/colorAccuracyTest/i18n/fr.ts +9 -9
  31. package/src/tool/colorAccuracyTest/i18n/id.ts +3 -3
  32. package/src/tool/colorAccuracyTest/i18n/it.ts +3 -3
  33. package/src/tool/colorAccuracyTest/i18n/ja.ts +1 -1
  34. package/src/tool/colorAccuracyTest/i18n/ko.ts +2 -2
  35. package/src/tool/colorAccuracyTest/i18n/nl.ts +3 -3
  36. package/src/tool/colorAccuracyTest/i18n/pl.ts +5 -5
  37. package/src/tool/colorAccuracyTest/i18n/pt.ts +3 -3
  38. package/src/tool/colorAccuracyTest/i18n/ru.ts +15 -15
  39. package/src/tool/colorAccuracyTest/i18n/sv.ts +3 -3
  40. package/src/tool/colorAccuracyTest/i18n/tr.ts +2 -2
  41. package/src/tool/colorAccuracyTest/i18n/zh.ts +7 -7
  42. package/src/tool/deadPixelTest/i18n/ru.ts +6 -6
  43. package/src/tool/deadPixelTest/i18n/sv.ts +1 -1
  44. package/src/tool/deadPixelTest/i18n/zh.ts +5 -5
  45. package/src/tool/gamepadTest/component.astro +4 -3
  46. package/src/tool/gamepadTest/gamepad-test.css +171 -3
  47. package/src/tool/gamepadTest/i18n/es.ts +4 -4
  48. package/src/tool/gamepadTest/i18n/ru.ts +1 -1
  49. package/src/tool/gamepadTest/i18n/zh.ts +1 -1
  50. package/src/tool/gamepadVibrationTester/component.astro +3 -3
  51. package/src/tool/gamepadVibrationTester/i18n/es.ts +1 -1
  52. package/src/tool/gamepadVibrationTester/i18n/fr.ts +2 -2
  53. package/src/tool/keyboardTest/component.astro +6 -1
  54. package/src/tool/keyboardTest/keyboard-test.css +115 -2
  55. package/src/tool/mouseDoubleClickTest/bibliography.astro +14 -0
  56. package/src/tool/mouseDoubleClickTest/bibliography.ts +16 -0
  57. package/src/tool/mouseDoubleClickTest/component.astro +135 -0
  58. package/src/tool/mouseDoubleClickTest/entry.ts +29 -0
  59. package/src/tool/mouseDoubleClickTest/i18n/de.ts +274 -0
  60. package/src/tool/mouseDoubleClickTest/i18n/en.ts +274 -0
  61. package/src/tool/mouseDoubleClickTest/i18n/es.ts +274 -0
  62. package/src/tool/mouseDoubleClickTest/i18n/fr.ts +274 -0
  63. package/src/tool/mouseDoubleClickTest/i18n/id.ts +285 -0
  64. package/src/tool/mouseDoubleClickTest/i18n/it.ts +274 -0
  65. package/src/tool/mouseDoubleClickTest/i18n/ja.ts +274 -0
  66. package/src/tool/mouseDoubleClickTest/i18n/ko.ts +274 -0
  67. package/src/tool/mouseDoubleClickTest/i18n/nl.ts +274 -0
  68. package/src/tool/mouseDoubleClickTest/i18n/pl.ts +274 -0
  69. package/src/tool/mouseDoubleClickTest/i18n/pt.ts +274 -0
  70. package/src/tool/mouseDoubleClickTest/i18n/ru.ts +274 -0
  71. package/src/tool/mouseDoubleClickTest/i18n/sv.ts +274 -0
  72. package/src/tool/mouseDoubleClickTest/i18n/tr.ts +274 -0
  73. package/src/tool/mouseDoubleClickTest/i18n/zh.ts +274 -0
  74. package/src/tool/mouseDoubleClickTest/index.ts +9 -0
  75. package/src/tool/mouseDoubleClickTest/logic.ts +258 -0
  76. package/src/tool/mouseDoubleClickTest/mouse-double-click-test.css +488 -0
  77. package/src/tool/mouseDoubleClickTest/seo.astro +15 -0
  78. package/src/tool/mouseDoubleClickTest/ui.ts +26 -0
  79. package/src/tool/mousePollingTest/i18n/fr.ts +3 -3
  80. package/src/tool/mousePollingTest/i18n/pl.ts +1 -1
  81. package/src/tool/mousePollingTest/i18n/ru.ts +1 -1
  82. package/src/tool/mousePollingTest/i18n/zh.ts +1 -1
  83. package/src/tool/mousePollingTest/logic/RatonManager.ts +6 -6
  84. package/src/tool/refreshRateDetector/i18n/de.ts +3 -3
  85. package/src/tool/refreshRateDetector/i18n/en.ts +3 -3
  86. package/src/tool/refreshRateDetector/i18n/fr.ts +4 -4
  87. package/src/tool/refreshRateDetector/i18n/id.ts +3 -3
  88. package/src/tool/refreshRateDetector/i18n/pl.ts +2 -2
  89. package/src/tool/refreshRateDetector/i18n/pt.ts +3 -3
  90. package/src/tool/refreshRateDetector/i18n/sv.ts +3 -3
  91. package/src/tool/refreshRateDetector/i18n/tr.ts +2 -2
  92. package/src/tool/refreshRateDetector/i18n/zh.ts +2 -2
  93. package/src/tool/toneGenerator/component.astro +7 -7
  94. package/src/tool/toneGenerator/i18n/fr.ts +2 -2
  95. package/src/tool/toneGenerator/i18n/pl.ts +1 -1
  96. package/src/tool/toneGenerator/i18n/ru.ts +2 -2
  97. package/src/tool/toneGenerator/i18n/zh.ts +3 -3
  98. package/src/tools.ts +2 -2
@@ -16,7 +16,15 @@
16
16
  --tt-kb-bg: #e2e8f0;
17
17
 
18
18
  width: 100%;
19
+ max-width: 100%;
19
20
  color: var(--tt-text);
21
+ overflow-x: clip;
22
+ }
23
+
24
+ .tt-wrapper *,
25
+ .tt-wrapper *::before,
26
+ .tt-wrapper *::after {
27
+ box-sizing: border-box;
20
28
  }
21
29
 
22
30
  .theme-dark .tt-wrapper {
@@ -58,6 +66,8 @@ body.is-widget .tt-wrapper > div {
58
66
  padding: 2rem;
59
67
  box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
60
68
  border: 1px solid var(--tt-border);
69
+ max-width: 100%;
70
+ overflow: hidden;
61
71
  }
62
72
 
63
73
  .tt-header {
@@ -167,7 +177,7 @@ body.is-widget .tt-wrapper > div {
167
177
  .tt-keyboard-wrapper {
168
178
  position: relative;
169
179
  width: 100%;
170
- overflow-x: auto;
180
+ overflow: hidden;
171
181
  padding-bottom: 1rem;
172
182
  display: flex;
173
183
  justify-content: center;
@@ -181,7 +191,9 @@ body.is-widget .tt-wrapper > div {
181
191
  flex-direction: column;
182
192
  gap: 0.25rem;
183
193
  user-select: none;
194
+ width: 900px;
184
195
  min-width: 900px;
196
+ transform-origin: top center;
185
197
  }
186
198
 
187
199
  .tt-row {
@@ -323,4 +335,105 @@ body.is-widget .tt-wrapper > div {
323
335
  border-radius: 0.375rem;
324
336
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
325
337
  flex-shrink: 0;
326
- }
338
+ }
339
+
340
+ @media (max-width: 760px) {
341
+ .tt-container {
342
+ padding: 0;
343
+ }
344
+
345
+ body.is-widget .tt-wrapper > div {
346
+ padding: 0;
347
+ }
348
+
349
+ .tt-card {
350
+ border-radius: 0.875rem;
351
+ padding: 1rem;
352
+ }
353
+
354
+ .tt-header {
355
+ margin-bottom: 1rem;
356
+ }
357
+
358
+ .tt-title {
359
+ font-size: 1.5rem;
360
+ }
361
+
362
+ .tt-description {
363
+ font-size: 0.875rem;
364
+ }
365
+
366
+ .tt-stats {
367
+ display: grid;
368
+ grid-template-columns: 1fr auto;
369
+ width: 100%;
370
+ gap: 0.75rem;
371
+ }
372
+
373
+ .tt-stat-box {
374
+ min-width: 0;
375
+ padding: 0.75rem;
376
+ border-radius: 0.75rem;
377
+ }
378
+
379
+ .tt-stat-label {
380
+ font-size: 0.65rem;
381
+ }
382
+
383
+ .tt-stat-value {
384
+ font-size: 1.75rem;
385
+ }
386
+
387
+ .tt-reset-btn {
388
+ width: 3.5rem;
389
+ min-height: 100%;
390
+ border-radius: 0.75rem;
391
+ }
392
+
393
+ .tt-keyboard-wrapper {
394
+ --tt-keyboard-scale: 0.82;
395
+
396
+ min-height: calc(20rem * var(--tt-keyboard-scale));
397
+ padding-bottom: 0;
398
+ align-items: flex-start;
399
+ }
400
+
401
+ .tt-keyboard {
402
+ transform: scale(var(--tt-keyboard-scale));
403
+ margin-bottom: calc((20rem * var(--tt-keyboard-scale)) - 20rem);
404
+ }
405
+
406
+ .tt-event-log {
407
+ height: 2.25rem;
408
+ }
409
+ }
410
+
411
+ @media (max-width: 680px) {
412
+ .tt-keyboard-wrapper {
413
+ --tt-keyboard-scale: 0.72;
414
+ }
415
+ }
416
+
417
+ @media (max-width: 600px) {
418
+ .tt-keyboard-wrapper {
419
+ --tt-keyboard-scale: 0.62;
420
+ }
421
+ }
422
+
423
+ @media (max-width: 520px) {
424
+ .tt-keyboard-wrapper {
425
+ --tt-keyboard-scale: 0.52;
426
+ }
427
+ }
428
+
429
+ @media (max-width: 440px) {
430
+ .tt-keyboard-wrapper {
431
+ --tt-keyboard-scale: 0.42;
432
+ }
433
+ }
434
+
435
+ @media (max-width: 360px) {
436
+ .tt-keyboard-wrapper {
437
+ --tt-keyboard-scale: 0.36;
438
+ }
439
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { mouseDoubleClickTest } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await mouseDoubleClickTest.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,16 @@
1
+ import type { BibliographyEntry } from '../../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'UI Events: click and dblclick event definitions',
6
+ url: 'https://www.w3.org/TR/uievents/',
7
+ },
8
+ {
9
+ name: 'MDN Web Docs: Element click event',
10
+ url: 'https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event',
11
+ },
12
+ {
13
+ name: 'MDN Web Docs: performance.now()',
14
+ url: 'https://developer.mozilla.org/en-US/docs/Web/API/Performance/now',
15
+ },
16
+ ];
@@ -0,0 +1,135 @@
1
+ ---
2
+ import type { KnownLocale } from '../../types';
3
+ import type { MouseDoubleClickTestUI } 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 MouseDoubleClickTestUI;
13
+ ---
14
+
15
+ <div class="mdct-root" id="mdct-root" data-config={JSON.stringify({
16
+ statusIdle: t.statusIdle,
17
+ statusClean: t.statusClean,
18
+ statusWarning: t.statusWarning,
19
+ emptyLog: t.emptyLog,
20
+ leftButton: t.leftButton,
21
+ middleButton: t.middleButton,
22
+ rightButton: t.rightButton,
23
+ backButton: t.backButton,
24
+ forwardButton: t.forwardButton,
25
+ otherButton: t.otherButton,
26
+ thresholdUnit: t.thresholdUnit,
27
+ cleanEvent: t.cleanEvent,
28
+ suspiciousEvent: t.suspiciousEvent,
29
+ })}>
30
+ <section class="mdct-card">
31
+ <div class="mdct-stage">
32
+ <button id="mdct-target" class="mdct-target" type="button">
33
+ <span class="mdct-mouse" aria-hidden="true">
34
+ <span class="mdct-cable"></span>
35
+ <span class="mdct-button mdct-left" data-button="left" data-label={t.leftButton}></span>
36
+ <span class="mdct-button mdct-right" data-button="right" data-label={t.rightButton}></span>
37
+ <span class="mdct-button mdct-middle" data-button="middle" data-label={t.middleButton}></span>
38
+ <span class="mdct-button mdct-back" data-button="back" data-label={t.backButton}></span>
39
+ <span class="mdct-button mdct-forward" data-button="forward" data-label={t.forwardButton}></span>
40
+ <span class="mdct-palm"></span>
41
+ </span>
42
+ <span class="mdct-target-copy">
43
+ <span class="mdct-target-kicker">
44
+ <Icon name="mdi:mouse" class="mdct-target-icon" />
45
+ {t.badge}
46
+ </span>
47
+ <strong>{t.clickTarget}</strong>
48
+ <small>{t.clickTargetHint}</small>
49
+ </span>
50
+ </button>
51
+
52
+ <div class="mdct-dashboard">
53
+ <div class="mdct-readout">
54
+ <span>{t.healthScore}</span>
55
+ <strong id="mdct-score">100%</strong>
56
+ <small id="mdct-status" data-state="clean">{t.statusIdle}</small>
57
+ </div>
58
+
59
+ <div class="mdct-metrics">
60
+ <div class="mdct-metric mdct-metric-total">
61
+ <span>{t.totalClicks}</span>
62
+ <strong id="mdct-total">0</strong>
63
+ </div>
64
+ <div class="mdct-metric mdct-metric-alert">
65
+ <span>{t.suspiciousClicks}</span>
66
+ <strong id="mdct-suspicious">0</strong>
67
+ </div>
68
+ </div>
69
+
70
+ <label class="mdct-threshold">
71
+ <span>{t.thresholdLabel}</span>
72
+ <b><span id="mdct-threshold-value">80</span> {t.thresholdUnit}</b>
73
+ <input id="mdct-threshold" type="range" min="30" max="180" value="80" step="5" />
74
+ </label>
75
+
76
+ <div class="mdct-speed-row">
77
+ <div>
78
+ <span>{t.fastestGap}</span>
79
+ <strong id="mdct-fastest">--</strong>
80
+ </div>
81
+ <div>
82
+ <span>{t.lastGap}</span>
83
+ <strong id="mdct-last-gap">--</strong>
84
+ </div>
85
+ </div>
86
+
87
+ <div class="mdct-log-head">
88
+ <span>{t.logTitle}</span>
89
+ <button id="mdct-reset" class="mdct-reset" type="button">{t.reset}</button>
90
+ </div>
91
+ <ol id="mdct-log" class="mdct-log"></ol>
92
+ </div>
93
+ </div>
94
+ </section>
95
+ </div>
96
+
97
+ <script>
98
+ import { MouseDoubleClickTester } from './logic';
99
+
100
+ const root = document.getElementById('mdct-root');
101
+ const labels = JSON.parse(root?.dataset.config ?? '{}');
102
+ const buttons = root?.querySelectorAll<HTMLElement>('.mdct-button') ?? document.querySelectorAll<HTMLElement>('.mdct-button');
103
+
104
+ new MouseDoubleClickTester(
105
+ {
106
+ target: document.getElementById('mdct-target'),
107
+ total: document.getElementById('mdct-total'),
108
+ suspicious: document.getElementById('mdct-suspicious'),
109
+ fastest: document.getElementById('mdct-fastest'),
110
+ score: document.getElementById('mdct-score'),
111
+ status: document.getElementById('mdct-status'),
112
+ threshold: document.getElementById('mdct-threshold') as HTMLInputElement | null,
113
+ thresholdValue: document.getElementById('mdct-threshold-value'),
114
+ lastGap: document.getElementById('mdct-last-gap'),
115
+ log: document.getElementById('mdct-log'),
116
+ reset: document.getElementById('mdct-reset'),
117
+ buttons,
118
+ },
119
+ {
120
+ statusIdle: labels.statusIdle,
121
+ statusClean: labels.statusClean,
122
+ statusWarning: labels.statusWarning,
123
+ emptyLog: labels.emptyLog,
124
+ leftButton: labels.leftButton,
125
+ middleButton: labels.middleButton,
126
+ rightButton: labels.rightButton,
127
+ backButton: labels.backButton,
128
+ forwardButton: labels.forwardButton,
129
+ otherButton: labels.otherButton,
130
+ thresholdUnit: labels.thresholdUnit,
131
+ cleanEvent: labels.cleanEvent,
132
+ suspiciousEvent: labels.suspiciousEvent,
133
+ },
134
+ );
135
+ </script>
@@ -0,0 +1,29 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ import type { MouseDoubleClickTestUI } from './ui';
4
+ export type MouseDoubleClickTestLocaleContent = ToolLocaleContent<MouseDoubleClickTestUI>;
5
+
6
+ export const mouseDoubleClickTest: HardwareToolEntry<MouseDoubleClickTestUI> = {
7
+ id: 'mouse-double-click-test',
8
+ icons: {
9
+ bg: 'mdi:mouse',
10
+ fg: 'mdi:gesture-tap-button',
11
+ },
12
+ i18n: {
13
+ de: () => import('./i18n/de').then((m) => m.content),
14
+ en: () => import('./i18n/en').then((m) => m.content),
15
+ es: () => import('./i18n/es').then((m) => m.content),
16
+ fr: () => import('./i18n/fr').then((m) => m.content),
17
+ id: () => import('./i18n/id').then((m) => m.content),
18
+ it: () => import('./i18n/it').then((m) => m.content),
19
+ ja: () => import('./i18n/ja').then((m) => m.content),
20
+ ko: () => import('./i18n/ko').then((m) => m.content),
21
+ nl: () => import('./i18n/nl').then((m) => m.content),
22
+ pl: () => import('./i18n/pl').then((m) => m.content),
23
+ pt: () => import('./i18n/pt').then((m) => m.content),
24
+ ru: () => import('./i18n/ru').then((m) => m.content),
25
+ sv: () => import('./i18n/sv').then((m) => m.content),
26
+ tr: () => import('./i18n/tr').then((m) => m.content),
27
+ zh: () => import('./i18n/zh').then((m) => m.content),
28
+ },
29
+ };
@@ -0,0 +1,274 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MouseDoubleClickTestUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'maus-doppelklick-test';
7
+ const title = 'Maus Doppelklick Test';
8
+ const description =
9
+ 'Testen Sie jede Maustaste und erkennen Sie unerwünschte Doppelklicks, verschlissene Schalter und Kontaktprellen mit zeitgenauer Aufzeichnung pro Taste in Ihrem Browser.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Was ist ein Maus-Doppelklick-Problem?',
14
+ answer:
15
+ 'Ein Doppelklick-Problem tritt auf, wenn ein physischer Tastendruck als zwei Klicks gemeldet wird. Es kann die linke Taste, die rechte Taste, den Radklick oder die Seitentasten betreffen und wird meist durch Schalterverschleiß, Kontaktprellen, Firmware-Entprellungseinstellungen oder drahtlose Signalinstabilität verursacht.',
16
+ },
17
+ {
18
+ question: 'Welcher Abstand gilt als verdächtig?',
19
+ answer:
20
+ 'Sehr kurze Abstände zwischen Klicks sind verdächtig, da menschliche Doppelklicks normalerweise mehr Zeit benötigen. Dieses Tool startet mit einem Schwellenwert von 80 ms, den Sie je nach Maus und Teststil anpassen können.',
21
+ },
22
+ {
23
+ question: 'Kann ein Browser beweisen, dass der Schalter defekt ist?',
24
+ answer:
25
+ 'Ein Browser kann den elektrischen Schalter nicht direkt prüfen, aber er kann die Klickereignisse aufzeichnen, die Ihr Betriebssystem empfängt. Wiederholte verdächtige Abstände während eines Einzelklick-Tests sind starke Hinweise auf Prellen oder unerwünschtes Doppelklicken.',
26
+ },
27
+ {
28
+ question: 'Wie sollte ich richtig testen?',
29
+ answer:
30
+ 'Klicken Sie langsam und bewusst und zielen Sie auf einzelne Tastendrücke ab. Wenn der Verdächtig-Zähler auch dann steigt, wenn Sie nicht absichtlich doppelklicken, wiederholen Sie den Test an einem anderen USB-Anschluss, einem anderen Browser und wenn möglich an einem anderen Computer.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Erkennungsschwelle einstellen',
37
+ text: 'Beginnen Sie mit 80 ms. Senken Sie den Wert für eine strenge Prellungserkennung oder erhöhen Sie ihn, wenn Ihr Gerät etwas breitere versehentliche Abstände erzeugt.',
38
+ },
39
+ {
40
+ name: 'Wie ein normaler Einzelklick klicken',
41
+ text: 'Drücken Sie jede Maustaste einzeln über der Mausgrafik. Klicken Sie beim ersten Durchlauf nicht absichtlich doppelt.',
42
+ },
43
+ {
44
+ name: 'Verdächtig-Zähler beobachten',
45
+ text: 'Wenn während des Einfachklickens verdächtige Ereignisse auftreten, prüfen Sie, welche visuelle Taste hervorgehoben wurde, und vergleichen Sie dies mit den kompakten Ereignischips.',
46
+ },
47
+ {
48
+ name: 'Mit einem anderen Gerät vergleichen',
49
+ text: 'Eine gesunde Maus sollte bei gleichem Schwellenwert eine hohe Punktzahl behalten. Der Vergleich von Geräten hilft, Hardwarefehler von Softwareeinstellungen zu unterscheiden.',
50
+ },
51
+ ];
52
+
53
+ const faqSchema: WithContext<FAQPage> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'FAQPage',
56
+ mainEntity: faqData.map((item) => ({
57
+ '@type': 'Question',
58
+ name: item.question,
59
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
60
+ })),
61
+ };
62
+
63
+ const howToSchema: WithContext<HowTo> = {
64
+ '@context': 'https://schema.org',
65
+ '@type': 'HowTo',
66
+ name: title,
67
+ description,
68
+ step: howToData.map((step, i) => ({
69
+ '@type': 'HowToStep',
70
+ position: i + 1,
71
+ name: step.name,
72
+ text: step.text,
73
+ })),
74
+ };
75
+
76
+ const appSchema: WithContext<SoftwareApplication> = {
77
+ '@context': 'https://schema.org',
78
+ '@type': 'SoftwareApplication',
79
+ name: title,
80
+ description,
81
+ applicationCategory: 'UtilityApplication',
82
+ operatingSystem: 'All',
83
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
84
+ inLanguage: 'de',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<MouseDoubleClickTestUI> = {
88
+ slug,
89
+ title,
90
+ description,
91
+ faq: faqData,
92
+ howTo: howToData,
93
+ schemas: [faqSchema, howToSchema, appSchema],
94
+ bibliography,
95
+ seo: [
96
+ {
97
+ type: 'title',
98
+ text: 'Maus Doppelklick Test: Tastenprellen online diagnostizieren',
99
+ level: 2,
100
+ },
101
+ {
102
+ type: 'paragraph',
103
+ html: 'Eine Maus, die bei einmaligem Drücken doppelt klickt, ist nicht nur ärgerlich. Sie kann versehentlich Ordner öffnen, Drag-and-Drop-Aktionen abbrechen, in Spielen zwei Schüsse abfeuern, Browser-Tabs schließen oder Kontextmenüs erscheinen und verschwinden lassen, bevor Sie sie nutzen können. Dieser Online-Maus-Doppelklick-Test konzentriert sich auf das nützliche Diagnosesignal: <strong>den zeitlichen Abstand zwischen den von Ihrem Betriebssystem gemeldeten Tastenereignissen</strong>.',
104
+ },
105
+ {
106
+ type: 'paragraph',
107
+ html: 'Anders als ein einfacher Klick-Zähler verfolgt dieses Tool jede Taste unabhängig: linker Klick, rechter Klick, Radklick, Browser-Zurück und Browser-Vorwärts. Das ist wichtig, denn eine Maus kann eine defekte rechte Taste haben, während die linke noch funktioniert, oder eine abgenutzte Seitentaste, die erst nach Monaten des Gamings oder der Nutzung von Produktivitäts-Shortcuts Fehlauslösungen zeigt.',
108
+ },
109
+ {
110
+ type: 'title',
111
+ text: 'Was dieser Maustasten-Test misst',
112
+ level: 3,
113
+ },
114
+ {
115
+ type: 'paragraph',
116
+ html: 'Wenn Sie eine Maustaste drücken, empfängt der Browser ein Pointer-Ereignis mit dem Tastencode. Das Tool speichert den letzten Zeitstempel für dieselbe physische Taste und vergleicht ihn mit dem nächsten Druck derselben Taste. Ist der Abstand kürzer als Ihr gewählter Schwellenwert, wird das Ereignis als verdächtig markiert, da ein normaler beabsichtigter zweiter Klick in der Regel länger dauert.',
117
+ },
118
+ {
119
+ type: 'list',
120
+ items: [
121
+ 'Linke Taste: nützlich zur Erkennung versehentlicher Doppelklicks beim Öffnen von Dateien, Markieren von Text oder Verschieben von Fenstern',
122
+ 'Rechte Taste: nützlich, wenn Kontextmenüs flackern, doppelt erscheinen oder sofort schließen',
123
+ 'Radklick: nützlich bei Mäusen, bei denen der Mittelklick mehrere Tabs öffnet oder nach intensiver Nutzung ausfällt',
124
+ 'Zurück- und Vorwärtstasten: nützlich für Gaming-Mäuse und Produktivitätsmäuse mit Seitenschaltern',
125
+ 'Zeitmessung pro Taste: vermeidet, einen Linksklick mit einem Rechtsklick zu vermischen und als falschen Doppelklick zu werten',
126
+ ],
127
+ },
128
+ {
129
+ type: 'title',
130
+ text: 'Warum Mäuse anfangen doppelt zu klicken',
131
+ level: 3,
132
+ },
133
+ {
134
+ type: 'paragraph',
135
+ html: 'Die meisten Mäuse verwenden kleine mechanische Schalter unter jeder Taste. Wenn die Schaltkontakte schließen, kann das Metall für einen sehr kurzen Zeitraum elektrisch prellen, bevor es sich setzt. Die Maus-Firmware filtert dieses Rauschen normalerweise mit einer Entprell-Logik. Wenn der Schalter verschleißt, kann das Prellen länger, lauter oder inkonsistenter werden, sodass der Computer zwei Tastendrücke empfängt, obwohl Ihr Finger nur einen physischen Druck ausgeführt hat.',
136
+ },
137
+ {
138
+ type: 'paragraph',
139
+ html: 'Doppelklicken wird nicht immer durch dasselbe verursacht. Es kann mechanischer Schalterverschleiß, zu aggressiv eingestellte Firmware-Entprellung, Staub oder Oxidation im Schalter, drahtlose Paketinstabilität, Makro-Software, ein beschädigtes Kabel oder eine Betriebssystemeinstellung sein, die versehentliche Doppelklicks auffälliger macht.',
140
+ },
141
+ {
142
+ type: 'table',
143
+ headers: ['Symptom', 'Wahrscheinliche Ursache', 'Was zu testen ist'],
144
+ rows: [
145
+ ['Ein Klick öffnet Dateien, als wäre doppelt geklickt worden', 'Linkes Schalterprellen oder Verwechslung der Doppelklick-Geschwindigkeit im Betriebssystem', 'Linke Taste mit langsamen Einzeldrücken bei 80 ms testen'],
146
+ ['Rechtsklick-Menü flackert oder schließt sich', 'Rechtes Schalterprellen oder Software, die Kontextmenüs abfängt', 'Rechte Taste testen und Maus-Dienstprogramme vorübergehend deaktivieren'],
147
+ ['Mittelklick öffnet zwei Tabs', 'Radschalter-Verschleiß', 'Radklick mit bewussten Einzeldrücken testen'],
148
+ ['Zurück-Taste springt zwei Seiten zurück', 'Seitenschalter-Prellen oder Browser-Shortcut-Wiederholung', 'Zurück und Vorwärts separat testen'],
149
+ ['Tritt nur drahtlos auf', 'Drahtlose Interferenz, niedriger Akku oder Empfängerplatzierung', 'Kabelgebunden erneut testen oder Empfänger näher platzieren'],
150
+ ],
151
+ },
152
+ {
153
+ type: 'title',
154
+ text: 'Den richtigen Entprell-Schwellenwert wählen',
155
+ level: 3,
156
+ },
157
+ {
158
+ type: 'paragraph',
159
+ html: 'Der Schwellenwert ist der maximale Abstand, den dieses Tool noch als verdächtig betrachtet. Der Standardwert <strong>80 ms</strong> ist ein praktischer Mittelweg: streng genug, um viele unerwünschte doppelte Ereignisse zu erkennen, aber nicht so aggressiv, dass jeder normale absichtliche Doppelklick zu einem Hardwarefehler wird.',
160
+ },
161
+ {
162
+ type: 'table',
163
+ headers: ['Schwellenwert', 'Am besten geeignet für', 'Wie zu interpretieren'],
164
+ rows: [
165
+ ['30-50 ms', 'Strenge elektrische Prellungsprüfungen', 'Gut zur Bestätigung sehr schneller doppelter Ereignisse von einem verschlissenen Schalter'],
166
+ ['60-90 ms', 'Allgemeine Maus-Doppelklick-Diagnose', 'Bester Standardbereich für die meisten Gaming- und Büromäuse'],
167
+ ['100-140 ms', 'Intermittierende verschlissene Schalter', 'Nützlich, wenn die Maus gelegentlich breitere versehentliche Abstände erzeugt'],
168
+ ['150-180 ms', 'Stresstest und schwache Schalter', 'Vorsichtig verwenden, da schnelle absichtliche Doppelklicks in diesen Bereich fallen können'],
169
+ ],
170
+ },
171
+ {
172
+ type: 'title',
173
+ text: 'So führen Sie einen zuverlässigen Test durch',
174
+ level: 3,
175
+ },
176
+ {
177
+ type: 'paragraph',
178
+ html: 'Klicken Sie beim ersten Durchlauf nicht absichtlich doppelt. Drücken Sie jede Maustaste langsam und bewusst, eine Taste nach der anderen, während sich der Cursor über der Mausgrafik befindet. Ein gesunder Schalter sollte stabile Einzelereignisse erzeugen. Wenn der Verdächtig-Zähler bei langsamen Einzeldrücken steigt, wiederholen Sie denselben Tastentest mehrmals, um das Muster zu bestätigen.',
179
+ },
180
+ {
181
+ type: 'list',
182
+ items: [
183
+ 'Testen Sie die linke Taste mit 20 bis 30 langsamen Drücken, dann die rechte, dann das Rad, dann die Seitentasten',
184
+ 'Ziehen Sie die Maus nicht während des Prell-Tests, da Bewegung das Zeitergebnis beeinträchtigen kann',
185
+ 'Wenn eine Taste verdächtige Ereignisse zeigt, wiederholen Sie denselben Test nach dem Wechsel des USB-Anschlusses oder Browsers',
186
+ 'Testen Sie drahtlose Mäuse mit einer frischen Batterie und dem Empfänger nahe an der Maus',
187
+ 'Wenn nur eine Taste wiederholt ausfällt, liegt der Fehler wahrscheinlich an diesem spezifischen Schalter und nicht am gesamten Gerät',
188
+ ],
189
+ },
190
+ {
191
+ type: 'title',
192
+ text: 'Ergebnisse interpretieren',
193
+ level: 3,
194
+ },
195
+ {
196
+ type: 'table',
197
+ headers: ['Ergebnis', 'Bedeutung', 'Empfohlener nächster Schritt'],
198
+ rows: [
199
+ ['0 verdächtige Ereignisse nach vielen Drücken', 'Die getesteten Tasten erscheinen unter dem gewählten Schwellenwert gesund', 'Behalten Sie den Standardschwellenwert bei oder testen Sie später erneut, wenn Symptome zurückkehren'],
200
+ ['1 isoliertes verdächtiges Ereignis', 'Könnte ein echtes Prellen oder ein versehentlich schneller Druck sein', 'Dieselbe Taste langsam wiederholen, bevor Sie Schlüsse ziehen'],
201
+ ['Wiederholte verdächtige Ereignisse bei einer Taste', 'Starkes Anzeichen für Schalterprellen oder verschlissene Kontakte', 'An einem anderen Computer testen und das Ergebnis dokumentieren'],
202
+ ['Verdächtige Ereignisse bei jeder Taste', 'Könnte Software, Treiber, Makro-Dienstprogramm oder Browser-Umgebung sein', 'Maus-Software deaktivieren und erneut testen'],
203
+ ['Nur der drahtlose Modus schlägt fehl', 'Wahrscheinlich Akku, Empfängerplatzierung oder Interferenz', 'Kabelgebundenen Modus versuchen oder Empfänger näher platzieren'],
204
+ ],
205
+ },
206
+ {
207
+ type: 'paragraph',
208
+ html: 'Der Gesundheitswert ist eine schnelle Zusammenfassung, kein endgültiges Urteil. Der wichtigste Beweis ist <strong>welche Taste</strong> verdächtige Ereignisse erzeugt hat und ob sich das Muster wiederholt, wenn Sie genau diese Taste langsam drücken. Ein einzelnes schlechtes Ereignis während eines hastigen Tests ist weniger aussagekräftig als fünf verdächtige Rechtsklick-Ereignisse während bewusster Einzeldrücke.',
209
+ },
210
+ {
211
+ type: 'title',
212
+ text: 'Bevor Sie die Maus ersetzen',
213
+ level: 3,
214
+ },
215
+ {
216
+ type: 'list',
217
+ items: [
218
+ 'Prüfen Sie, ob Ihre Maus-Software eine Einstellung für die Entprellzeit hat, und testen Sie nach der Änderung erneut',
219
+ 'Deaktivieren Sie Makros, Rapid-Fire-Profile oder Tasten-Neubelegungen während der Diagnose',
220
+ 'Versuchen Sie einen anderen USB-Anschluss, insbesondere wenn Sie einen Hub oder Frontpanel-Anschluss verwenden',
221
+ 'Testen Sie drahtlose Mäuse mit dem Dongle an einem Verlängerungskabel nahe am Mauspad',
222
+ 'Vergleichen Sie mit einer anderen Maus am selben Computer, um Hardwarefehler von Softwareverhalten zu unterscheiden',
223
+ ],
224
+ },
225
+ {
226
+ type: 'title',
227
+ text: 'Reparatur, Garantie und Beweise',
228
+ level: 3,
229
+ },
230
+ {
231
+ type: 'paragraph',
232
+ html: 'Wenn der Fehler mechanisch ist, behebt eine Reinigung des Außengehäuses das Problem selten dauerhaft, da das Problem im Inneren der Schaltkontakte liegt. Einige Benutzer tauschen den Mikroschalter aus, aber das erfordert Löten und lohnt sich nicht für jede Maus. Wenn die Maus unter Garantie steht, sind wiederholte verdächtige Abstände bei derselben Taste nützliche Beweise, um das Problem dem Support zu erklären.',
233
+ },
234
+ {
235
+ type: 'paragraph',
236
+ html: 'Für Garantieansprüche zeichnen Sie eine kurze Bildschirmaufnahme auf, während Sie die defekte Taste langsam drücken. Stellen Sie sicher, dass die Ereignischips die Tastenbezeichnung und die verdächtige Zeit zeigen. Das ist klarer als "meine Maus klickt manchmal doppelt", da es die tatsächliche Taste und die ungefähre Zeit des unerwünschten doppelten Ereignisses demonstriert.',
237
+ },
238
+ {
239
+ type: 'title',
240
+ text: 'Einschränkungen eines browserbasierten Maus-Tests',
241
+ level: 3,
242
+ },
243
+ {
244
+ type: 'paragraph',
245
+ html: 'Dieser Test misst die Ereignisse, die den Browser erreichen. Er kann die elektrische Wellenform im Schalter nicht direkt prüfen und er kann nicht jeden Treiber, jedes Betriebssystem oder jedes Hersteller-Dienstprogramm umgehen. Das ist trotzdem nützlich: Wenn der Browser doppelte Ereignisse empfängt, können Ihre normalen Anwendungen sie ebenfalls empfangen. Für eine technische Validierung auf Ingenieursniveau liefern Hardware-Tools wie Oszilloskope oder Schaltertester tiefere Erkenntnisse, sind aber für die meisten Benutzerdiagnosen nicht erforderlich.',
246
+ },
247
+ ],
248
+ ui: {
249
+ badge: 'Schalter-Prell-Labor',
250
+ clickTarget: 'Tastenmatrix',
251
+ clickTargetHint: 'Links, rechts, Rad, zurück und vorwärts drücken',
252
+ totalClicks: 'Gesamt',
253
+ suspiciousClicks: 'Verdächtig',
254
+ fastestGap: 'Schnellster Abstand',
255
+ healthScore: 'Gesundheitswert',
256
+ thresholdLabel: 'Erkennungsschwelle',
257
+ thresholdUnit: 'ms',
258
+ cleanEvent: 'sauber',
259
+ suspiciousEvent: 'verdächtig',
260
+ reset: 'Zurücksetzen',
261
+ statusIdle: 'Drücken Sie jede Maustaste, um sie unabhängig zu testen',
262
+ statusClean: 'Kein verdächtiges Tastenprellen erkannt',
263
+ statusWarning: 'Verdächtiges Prellen an einer Maustaste erkannt',
264
+ lastGap: 'Letztes Ereignis',
265
+ logTitle: 'Letzte Tastenereignisse',
266
+ emptyLog: 'Drücken Sie eine beliebige Maustaste über dem Mauskörper.',
267
+ leftButton: 'Links',
268
+ middleButton: 'Rad',
269
+ rightButton: 'Rechts',
270
+ backButton: 'Zurück',
271
+ forwardButton: 'Vorwärts',
272
+ otherButton: 'Andere',
273
+ },
274
+ };