@jjlmoya/utils-hardware 1.28.0 → 1.30.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 (57) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +7 -1
  4. package/src/index.ts +2 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/tool_validation.test.ts +1 -1
  7. package/src/tool/mouseJitterAngleSnappingTest/bibliography.astro +14 -0
  8. package/src/tool/mouseJitterAngleSnappingTest/bibliography.ts +16 -0
  9. package/src/tool/mouseJitterAngleSnappingTest/component.astro +110 -0
  10. package/src/tool/mouseJitterAngleSnappingTest/entry.ts +29 -0
  11. package/src/tool/mouseJitterAngleSnappingTest/i18n/de.ts +289 -0
  12. package/src/tool/mouseJitterAngleSnappingTest/i18n/en.ts +289 -0
  13. package/src/tool/mouseJitterAngleSnappingTest/i18n/es.ts +289 -0
  14. package/src/tool/mouseJitterAngleSnappingTest/i18n/fr.ts +289 -0
  15. package/src/tool/mouseJitterAngleSnappingTest/i18n/id.ts +289 -0
  16. package/src/tool/mouseJitterAngleSnappingTest/i18n/it.ts +289 -0
  17. package/src/tool/mouseJitterAngleSnappingTest/i18n/ja.ts +289 -0
  18. package/src/tool/mouseJitterAngleSnappingTest/i18n/ko.ts +289 -0
  19. package/src/tool/mouseJitterAngleSnappingTest/i18n/nl.ts +289 -0
  20. package/src/tool/mouseJitterAngleSnappingTest/i18n/pl.ts +289 -0
  21. package/src/tool/mouseJitterAngleSnappingTest/i18n/pt.ts +289 -0
  22. package/src/tool/mouseJitterAngleSnappingTest/i18n/ru.ts +289 -0
  23. package/src/tool/mouseJitterAngleSnappingTest/i18n/sv.ts +289 -0
  24. package/src/tool/mouseJitterAngleSnappingTest/i18n/tr.ts +289 -0
  25. package/src/tool/mouseJitterAngleSnappingTest/i18n/zh.ts +289 -0
  26. package/src/tool/mouseJitterAngleSnappingTest/index.ts +9 -0
  27. package/src/tool/mouseJitterAngleSnappingTest/logic.ts +245 -0
  28. package/src/tool/mouseJitterAngleSnappingTest/model.ts +38 -0
  29. package/src/tool/mouseJitterAngleSnappingTest/mouse-jitter-angle-snapping-test.css +412 -0
  30. package/src/tool/mouseJitterAngleSnappingTest/render.ts +48 -0
  31. package/src/tool/mouseJitterAngleSnappingTest/seo.astro +15 -0
  32. package/src/tool/mouseJitterAngleSnappingTest/ui.ts +29 -0
  33. package/src/tool/subwooferCrossoverTest/bibliography.astro +14 -0
  34. package/src/tool/subwooferCrossoverTest/bibliography.ts +16 -0
  35. package/src/tool/subwooferCrossoverTest/component.astro +253 -0
  36. package/src/tool/subwooferCrossoverTest/entry.ts +29 -0
  37. package/src/tool/subwooferCrossoverTest/i18n/de.ts +188 -0
  38. package/src/tool/subwooferCrossoverTest/i18n/en.ts +188 -0
  39. package/src/tool/subwooferCrossoverTest/i18n/es.ts +188 -0
  40. package/src/tool/subwooferCrossoverTest/i18n/fr.ts +188 -0
  41. package/src/tool/subwooferCrossoverTest/i18n/id.ts +188 -0
  42. package/src/tool/subwooferCrossoverTest/i18n/it.ts +188 -0
  43. package/src/tool/subwooferCrossoverTest/i18n/ja.ts +188 -0
  44. package/src/tool/subwooferCrossoverTest/i18n/ko.ts +188 -0
  45. package/src/tool/subwooferCrossoverTest/i18n/nl.ts +188 -0
  46. package/src/tool/subwooferCrossoverTest/i18n/pl.ts +188 -0
  47. package/src/tool/subwooferCrossoverTest/i18n/pt.ts +188 -0
  48. package/src/tool/subwooferCrossoverTest/i18n/ru.ts +188 -0
  49. package/src/tool/subwooferCrossoverTest/i18n/sv.ts +188 -0
  50. package/src/tool/subwooferCrossoverTest/i18n/tr.ts +188 -0
  51. package/src/tool/subwooferCrossoverTest/i18n/zh.ts +188 -0
  52. package/src/tool/subwooferCrossoverTest/index.ts +11 -0
  53. package/src/tool/subwooferCrossoverTest/logic.ts +30 -0
  54. package/src/tool/subwooferCrossoverTest/seo.astro +15 -0
  55. package/src/tool/subwooferCrossoverTest/subwoofer-crossover-test.css +282 -0
  56. package/src/tool/subwooferCrossoverTest/ui.ts +20 -0
  57. package/src/tools.ts +3 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-hardware",
3
- "version": "1.28.0",
3
+ "version": "1.30.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -8,6 +8,7 @@ import { mouseDoubleClickTest } from '../tool/mouseDoubleClickTest/index';
8
8
  import { mouseScrollTest } from '../tool/mouseScrollTest/index';
9
9
  import { estimadorSaludBateria } from '../tool/batteryHealthEstimator/index';
10
10
  import { toneGenerator } from '../tool/toneGenerator/index';
11
+ import { subwooferCrossoverTest } from '../tool/subwooferCrossoverTest/index';
11
12
  import { refreshRateDetector } from '../tool/refreshRateDetector/index';
12
13
  import { monitorGhostingTest } from '../tool/monitorGhostingTest/index';
13
14
  import { spectrumCanvas } from '../tool/colorAccuracyTest/index';
@@ -18,10 +19,11 @@ import { keyboardChatterTest } from '../tool/keyboardChatterTest/index';
18
19
  import { webUsbSerialMonitor } from '../tool/webUsbSerialMonitor/index';
19
20
  import { usbPowerBudgetCalculator } from '../tool/usbPowerBudgetCalculator/index';
20
21
  import { mobileSensorTest } from '../tool/mobileSensorTest/index';
22
+ import { mouseJitterAngleSnappingTest } from '../tool/mouseJitterAngleSnappingTest/index';
21
23
 
22
24
  export const hardwareCategory: HardwareCategoryEntry = {
23
25
  icon: 'mdi:memory',
24
- tools: [pixelesPantalla, testTeclado, keyboardChatterTest, testMando, probadorVibracionMando, testRaton, mouseDoubleClickTest, mouseScrollTest, estimadorSaludBateria, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator, usbPowerBudgetCalculator, mobileSensorTest, stereoAudioTest, webBluetoothBleScanner, webUsbSerialMonitor],
26
+ tools: [pixelesPantalla, testTeclado, keyboardChatterTest, testMando, probadorVibracionMando, testRaton, mouseDoubleClickTest, mouseScrollTest, mouseJitterAngleSnappingTest, estimadorSaludBateria, toneGenerator, subwooferCrossoverTest, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator, usbPowerBudgetCalculator, mobileSensorTest, stereoAudioTest, webBluetoothBleScanner, webUsbSerialMonitor],
25
27
  i18n: {
26
28
  en: () => import('./i18n/en').then((m) => m.content),
27
29
  es: () => import('./i18n/es').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -16,6 +16,8 @@ export { mouseScrollTest } from './tool/mouseScrollTest/entry';
16
16
  export type { MouseScrollTestLocaleContent } from './tool/mouseScrollTest/entry';
17
17
  export { toneGenerator } from './tool/toneGenerator/entry';
18
18
  export type { ToneGeneratorLocaleContent } from './tool/toneGenerator/entry';
19
+ export { subwooferCrossoverTest } from './tool/subwooferCrossoverTest/entry';
20
+ export type { SubwooferCrossoverTestLocaleContent } from './tool/subwooferCrossoverTest/entry';
19
21
  export { refreshRateDetector } from './tool/refreshRateDetector/entry';
20
22
  export type { RefreshRateDetectorLocaleContent } from './tool/refreshRateDetector/entry';
21
23
  export { monitorGhostingTest } from './tool/monitorGhostingTest/entry';
@@ -36,6 +38,8 @@ export { usbPowerBudgetCalculator } from './tool/usbPowerBudgetCalculator/entry'
36
38
  export type { UsbPowerBudgetCalculatorLocaleContent } from './tool/usbPowerBudgetCalculator/entry';
37
39
  export { mobileSensorTest } from './tool/mobileSensorTest/entry';
38
40
  export type { MobileSensorTestLocaleContent } from './tool/mobileSensorTest/entry';
41
+ export { mouseJitterAngleSnappingTest } from './tool/mouseJitterAngleSnappingTest/entry';
42
+ export type { MouseJitterAngleSnappingTestLocaleContent } from './tool/mouseJitterAngleSnappingTest/entry';
39
43
  export { hardwareCategory } from './category';
40
44
  import { estimadorSaludBateria } from './tool/batteryHealthEstimator/entry';
41
45
  import { pixelesPantalla } from './tool/deadPixelTest/entry';
@@ -46,6 +50,7 @@ import { testRaton } from './tool/mousePollingTest/entry';
46
50
  import { mouseDoubleClickTest } from './tool/mouseDoubleClickTest/entry';
47
51
  import { mouseScrollTest } from './tool/mouseScrollTest/entry';
48
52
  import { toneGenerator } from './tool/toneGenerator/entry';
53
+ import { subwooferCrossoverTest } from './tool/subwooferCrossoverTest/entry';
49
54
  import { refreshRateDetector } from './tool/refreshRateDetector/entry';
50
55
  import { monitorGhostingTest } from './tool/monitorGhostingTest/entry';
51
56
  import { spectrumCanvas } from './tool/colorAccuracyTest/entry';
@@ -56,4 +61,5 @@ import { keyboardChatterTest } from './tool/keyboardChatterTest/entry';
56
61
  import { webUsbSerialMonitor } from './tool/webUsbSerialMonitor/entry';
57
62
  import { usbPowerBudgetCalculator } from './tool/usbPowerBudgetCalculator/entry';
58
63
  import { mobileSensorTest } from './tool/mobileSensorTest/entry';
59
- export const ALL_ENTRIES = [estimadorSaludBateria, pixelesPantalla, testMando, probadorVibracionMando, testTeclado, keyboardChatterTest, testRaton, mouseDoubleClickTest, mouseScrollTest, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator, usbPowerBudgetCalculator, mobileSensorTest, stereoAudioTest, webBluetoothBleScanner, webUsbSerialMonitor];
64
+ import { mouseJitterAngleSnappingTest } from './tool/mouseJitterAngleSnappingTest/entry';
65
+ export const ALL_ENTRIES = [estimadorSaludBateria, pixelesPantalla, testMando, probadorVibracionMando, testTeclado, keyboardChatterTest, testRaton, mouseDoubleClickTest, mouseScrollTest, mouseJitterAngleSnappingTest, toneGenerator, subwooferCrossoverTest, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator, usbPowerBudgetCalculator, mobileSensorTest, stereoAudioTest, webBluetoothBleScanner, webUsbSerialMonitor];
package/src/index.ts CHANGED
@@ -26,6 +26,7 @@ export { MOUSE_DOUBLE_CLICK_TEST_TOOL } from './tool/mouseDoubleClickTest/index'
26
26
  export { MOUSE_SCROLL_TEST_TOOL } from './tool/mouseScrollTest/index';
27
27
  export { ESTIMADOR_SALUD_BATERIA_TOOL } from './tool/batteryHealthEstimator/index';
28
28
  export { TONE_GENERATOR_TOOL } from './tool/toneGenerator/index';
29
+ export { SUBWOOFER_CROSSOVER_TEST_TOOL } from './tool/subwooferCrossoverTest/index';
29
30
  export { REFRESH_RATE_DETECTOR_TOOL } from './tool/refreshRateDetector/index';
30
31
  export { MONITOR_GHOSTING_TEST_TOOL } from './tool/monitorGhostingTest/index';
31
32
  export { SPECTRUM_CANVAS_TOOL } from './tool/colorAccuracyTest/index';
@@ -36,3 +37,4 @@ export { KEYBOARD_CHATTER_TEST_TOOL } from './tool/keyboardChatterTest/index';
36
37
  export { WEB_USB_SERIAL_MONITOR_TOOL } from './tool/webUsbSerialMonitor/index';
37
38
  export { USB_POWER_BUDGET_CALCULATOR_TOOL } from './tool/usbPowerBudgetCalculator/index';
38
39
  export { MOBILE_SENSOR_TEST_TOOL } from './tool/mobileSensorTest/index';
40
+ export { MOUSE_JITTER_ANGLE_SNAPPING_TEST_TOOL } from './tool/mouseJitterAngleSnappingTest/index';
@@ -22,7 +22,7 @@ describe('Locale Completeness Validation', () => {
22
22
  });
23
23
 
24
24
  it('all tools registered', () => {
25
- expect(ALL_TOOLS.length).toBe(19);
25
+ expect(ALL_TOOLS.length).toBe(21);
26
26
  });
27
27
  });
28
28
 
@@ -5,7 +5,7 @@ import { hardwareCategory } from '../data';
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
7
  it('should have all tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(19);
8
+ expect(ALL_TOOLS.length).toBe(21);
9
9
  });
10
10
 
11
11
  it('hardwareCategory should be defined', () => {
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { mouseJitterAngleSnappingTest } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await mouseJitterAngleSnappingTest.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: 'Mouse sensor angle snapping and prediction explained by Blur Busters',
6
+ url: 'https://blurbusters.com/faq/mouse-guide/',
7
+ },
8
+ {
9
+ name: 'Mouse acceleration, raw input, and pointer precision notes from PCGamingWiki',
10
+ url: 'https://www.pcgamingwiki.com/wiki/Glossary:Mouse_acceleration',
11
+ },
12
+ {
13
+ name: 'Human Interface Device pointer behavior and mouse input terminology',
14
+ url: 'https://en.wikipedia.org/wiki/Computer_mouse',
15
+ },
16
+ ];
@@ -0,0 +1,110 @@
1
+ ---
2
+ import type { KnownLocale } from '../../types';
3
+ import type { MouseJitterAngleSnappingTestUI } from './ui';
4
+ import { Icon } from 'astro-icon/components';
5
+ import './mouse-jitter-angle-snapping-test.css';
6
+
7
+ interface Props {
8
+ locale?: KnownLocale;
9
+ ui?: Record<string, unknown>;
10
+ }
11
+
12
+ const { ui } = Astro.props;
13
+ const t = (ui ?? {}) as MouseJitterAngleSnappingTestUI;
14
+ ---
15
+
16
+ <div class="mjas-root" id="mjas-root" data-config={JSON.stringify({
17
+ statusIdle: t.statusIdle,
18
+ statusHealthy: t.statusHealthy,
19
+ statusJitter: t.statusJitter,
20
+ statusSnapping: t.statusSnapping,
21
+ statusMixed: t.statusMixed,
22
+ emptyLog: t.emptyLog,
23
+ jitterEvent: t.jitterEvent,
24
+ snappingEvent: t.snappingEvent,
25
+ combinedEvent: t.combinedEvent,
26
+ cleanEvent: t.cleanEvent,
27
+ pxUnit: t.pxUnit,
28
+ percentUnit: t.percentUnit,
29
+ })}>
30
+ <section class="mjas-shell">
31
+ <div id="mjas-stage" class="mjas-stage" role="application" aria-label={t.canvasLabel}>
32
+ <canvas id="mjas-canvas" class="mjas-canvas"></canvas>
33
+ <div class="mjas-canvas-copy">
34
+ <span><Icon name="mdi:mouse-move-down" /> {t.badge}</span>
35
+ <strong>{t.pointerPrompt}</strong>
36
+ <small>{t.canvasHint}</small>
37
+ </div>
38
+ </div>
39
+
40
+ <aside class="mjas-console">
41
+ <div class="mjas-status">
42
+ <span>{t.samples}</span>
43
+ <strong id="mjas-samples">0</strong>
44
+ <small id="mjas-status" data-state="idle">{t.statusIdle}</small>
45
+ </div>
46
+
47
+ <div class="mjas-score-grid">
48
+ <div>
49
+ <span>{t.jitterScore}</span>
50
+ <strong id="mjas-jitter-score">0{t.percentUnit}</strong>
51
+ </div>
52
+ <div>
53
+ <span>{t.snappingScore}</span>
54
+ <strong id="mjas-snapping-score">0{t.percentUnit}</strong>
55
+ </div>
56
+ </div>
57
+
58
+ <div class="mjas-readouts">
59
+ <div>
60
+ <span>{t.straightness}</span>
61
+ <strong id="mjas-straightness">0{t.percentUnit}</strong>
62
+ </div>
63
+ <div>
64
+ <span>{t.rawDeviation}</span>
65
+ <strong id="mjas-deviation">0{t.pxUnit}</strong>
66
+ </div>
67
+ </div>
68
+
69
+ <label class="mjas-sensitivity">
70
+ <span>{t.sensitivity}</span>
71
+ <b><em>{t.low}</em><strong id="mjas-sensitivity-value">50</strong><em>{t.high}</em></b>
72
+ <input id="mjas-sensitivity" type="range" min="20" max="90" value="50" step="1" />
73
+ </label>
74
+
75
+ <div class="mjas-actions">
76
+ <button id="mjas-reset" type="button"><Icon name="mdi:restore" /> {t.reset}</button>
77
+ </div>
78
+
79
+ <p class="mjas-shift">{t.holdShift}</p>
80
+
81
+ <div class="mjas-log-head">{t.traceLog}</div>
82
+ <ol id="mjas-log" class="mjas-log"></ol>
83
+ </aside>
84
+ </section>
85
+ </div>
86
+
87
+ <script>
88
+ import { MouseJitterAngleSnappingTester } from './logic';
89
+
90
+ const root = document.getElementById('mjas-root');
91
+ const labels = JSON.parse(root?.dataset.config ?? '{}');
92
+
93
+ new MouseJitterAngleSnappingTester(
94
+ {
95
+ stage: document.getElementById('mjas-stage'),
96
+ canvas: document.getElementById('mjas-canvas') as HTMLCanvasElement | null,
97
+ samples: document.getElementById('mjas-samples'),
98
+ jitterScore: document.getElementById('mjas-jitter-score'),
99
+ snappingScore: document.getElementById('mjas-snapping-score'),
100
+ straightness: document.getElementById('mjas-straightness'),
101
+ deviation: document.getElementById('mjas-deviation'),
102
+ status: document.getElementById('mjas-status'),
103
+ sensitivity: document.getElementById('mjas-sensitivity') as HTMLInputElement | null,
104
+ sensitivityValue: document.getElementById('mjas-sensitivity-value'),
105
+ reset: document.getElementById('mjas-reset'),
106
+ log: document.getElementById('mjas-log'),
107
+ },
108
+ labels,
109
+ );
110
+ </script>
@@ -0,0 +1,29 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ import type { MouseJitterAngleSnappingTestUI } from './ui';
4
+ export type MouseJitterAngleSnappingTestLocaleContent = ToolLocaleContent<MouseJitterAngleSnappingTestUI>;
5
+
6
+ export const mouseJitterAngleSnappingTest: HardwareToolEntry<MouseJitterAngleSnappingTestUI> = {
7
+ id: 'mouse-jitter-angle-snapping-test',
8
+ icons: {
9
+ bg: 'mdi:mouse',
10
+ fg: 'mdi:vector-line',
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,289 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MouseJitterAngleSnappingTestUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'maus-jitter-winkelkorrektur-test';
7
+ const title = 'Maus Jitter und Winkelkorrektur Test';
8
+ const description =
9
+ 'Zeichne rohe Mausspuren online, um Sensor-Jitter, wackelige Verfolgung und Winkelkorrektur oder Vorhersage zu erkennen, die die Bewegung künstlich gerade macht.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Was ist Maus-Jitter?',
14
+ answer:
15
+ 'Maus-Jitter ist unerwünschtes Zittern oder verrauschtes Verhalten im Cursorpfad, selbst wenn sich die Hand gleichmäßig bewegt. Ursachen können ein verschmutztes Sensorfenster, eine schlechte Oberfläche, hohes Lift-Off-Verhalten, elektrisches Rauschen, drahtlose Instabilität oder ein Sensor sein, der bei der gewählten DPI-Stufe Probleme hat.',
16
+ },
17
+ {
18
+ question: 'Was ist Winkelkorrektur?',
19
+ answer:
20
+ 'Winkelkorrektur, manchmal auch Vorhersage genannt, ist eine Korrekturfunktion, bei der die Maus-Firmware versucht, leicht unvollkommene menschliche Bewegungen in geradere horizontale, vertikale oder diagonale Linien umzuwandeln. Manche Büroanwender mögen das, aber viele Gamer und Künstler bevorzugen rohe Bewegung ohne Vorhersage.',
21
+ },
22
+ {
23
+ question: 'Kann dieser Test beweisen, dass mein Maussensor defekt ist?',
24
+ answer:
25
+ 'Er kann den Sensor nicht elektrisch prüfen, aber er zeigt den Bewegungspfad, den dein Browser empfängt. Wenn wiederholte sanfte Bewegungen verrauschte Punkte, plötzliche Abweichungen oder unnatürlich gerade Segmente erzeugen, ist das Ergebnis ein nützlicher Hinweis zur Fehlerbehebung bei Maus, Oberfläche, DPI, Funkverbindung oder Firmware-Einstellungen.',
26
+ },
27
+ {
28
+ question: 'Wie sollte ich zeichnen, um das zuverlässigste Ergebnis zu erhalten?',
29
+ answer:
30
+ 'Zeichne langsame diagonale Linien, mittelschnelle Kurven und lange horizontale Striche. Wiederhole dieselbe Bewegung mehrmals. Jitter ist in langsamen, kontrollierten Linien leichter zu erkennen, während Winkelkorrektur leichter auffällt, wenn diagonale Bewegungen verdächtig gerade oder treppenförmig werden.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Sensor und Mauspad reinigen',
37
+ text: 'Entferne vor dem Test Staub oder Haare vom Sensorfenster und verwende ein stabiles Mauspad oder eine Schreibtischoberfläche.',
38
+ },
39
+ {
40
+ name: 'Langsame diagonale Linien zeichnen',
41
+ text: 'Halte die primäre Maustaste gedrückt und zeichne mehrere diagonale Striche. Ein roher Sensor sollte natürliche Handvariation zeigen, keine perfekt auf einen Winkel gezwungene Linie.',
42
+ },
43
+ {
44
+ name: 'Sanfte Kurven zeichnen',
45
+ text: 'Mache Kreise, S-Kurven und Bögen. Jitter erscheint als raue, verrauschte Punkte, die von der beabsichtigten Kurve abweichen.',
46
+ },
47
+ {
48
+ name: 'DPI- und Oberflächeneinstellungen vergleichen',
49
+ text: 'Wiederhole dieselbe Bewegung bei verschiedenen DPI-Stufen, Polling-Raten, Lift-Off-Einstellungen und Oberflächen, um herauszufinden, wann das Problem auftritt.',
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<MouseJitterAngleSnappingTestUI> = {
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-Jitter-Test Online: Sensorrauschen und Winkelkorrektur prüfen',
99
+ level: 2,
100
+ },
101
+ {
102
+ type: 'paragraph',
103
+ html: 'Ein guter Maussensor sollte deiner Hand folgen, ohne sichtbares Rauschen hinzuzufügen oder den Pfad heimlich zu korrigieren. Wenn der Sensor verschmutzt, die Oberfläche schwer zu verfolgen, der DPI-Wert zu hoch für die Hardware oder die Firmware wendet Vorhersage an, kann sich der Cursorpfad nicht mehr natürlich anfühlen. Dieser Maus-Jitter-Test lässt dich rohe Spuren zeichnen und die einzelnen Lesepunkte überprüfen, damit Sensorprobleme sichtbar statt vage werden.',
104
+ },
105
+ {
106
+ type: 'paragraph',
107
+ html: 'Die nützlichste Art zu testen ist einfach: Zeichne kontrollierte Linien und Kurven und betrachte dann die Form der Spur. Ein gesunder Rohsensor erzeugt einen Pfad, der deiner Bewegung mit kleinen menschlichen Unvollkommenheiten folgt. Ein verrauschter Sensor erzeugt raue Punkte, winzige Spitzen und ungleichmäßiges Wackeln. Eine Maus mit Winkelkorrektur oder Vorhersage kann diagonale oder horizontale Bewegungen unnatürlich gerade erscheinen lassen, als würde die Firmware deine Hand korrigieren.',
108
+ },
109
+ {
110
+ type: 'title',
111
+ text: 'Wie Maus-Jitter aussieht',
112
+ level: 3,
113
+ },
114
+ {
115
+ type: 'paragraph',
116
+ html: 'Maus-Jitter ist nicht dasselbe wie normales Händezittern. Jeder zeichnet leicht unvollkommene Linien. Jitter wird verdächtig, wenn die Punkte von der Bewegungsrichtung abweichen, obwohl sich deine Hand langsam und gleichmäßig bewegt. Er erscheint oft als unscharfer Rand um eine Linie, kleine seitliche Spitzen oder eine Spur, die kratzig statt glatt aussieht.',
117
+ },
118
+ {
119
+ type: 'table',
120
+ headers: ['Spurmuster', 'Wahrscheinliche Bedeutung', 'Als Nächstes versuchen'],
121
+ rows: [
122
+ ['Kleine zufällige Spitzen bei langsamen Linien', 'Sensorrauschen, Schmutz oder Oberflächenproblem', 'Sensorfenster reinigen und anderes Mauspad ausprobieren'],
123
+ ['Jitter nur bei hohem DPI', 'Sensor oder Firmware hat Probleme mit dieser Empfindlichkeit', 'Erneut bei 400, 800, 1600 und 3200 DPI testen'],
124
+ ['Raue Bewegung nur bei Funkbetrieb', 'Akku, Empfängerentfernung oder Störung', 'Empfänger näher platzieren und mit frischem Akku testen'],
125
+ ['Rauschen beim Anheben oder Kippen der Maus', 'Lift-Off-Distanz oder ungleichmäßiger Oberflächenkontakt', 'Maus flach halten und Lift-Off-Distanz wenn möglich verringern'],
126
+ ['Jitter auf einem Schreibtisch, aber nicht auf einem anderen', 'Oberflächentextur oder Reflektivitätsproblem', 'Mattes Mauspad für optische Sensoren verwenden'],
127
+ ],
128
+ },
129
+ {
130
+ type: 'title',
131
+ text: 'Wie Winkelkorrektur aussieht',
132
+ level: 3,
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: 'Winkelkorrektur unterscheidet sich von Jitter. Statt Rauschen hinzuzufügen, entfernt sie natürliche Variation. Wenn du eine diagonale Linie von Hand zeichnest, sollte ein Rohsensor winzige menschliche Abweichungen bewahren. Mit aktivierter Winkelkorrektur kann die Linie in eine perfekt gerade horizontale, vertikale oder diagonale Richtung einrasten. Dies kann das Zeichnen auf dem Desktop erleichtern, ist aber meist unerwünscht für kompetitives Zielen, Pixel-Art, Bildbearbeitung und jede Aufgabe, bei der der Cursor genau der Hand entsprechen soll.',
137
+ },
138
+ {
139
+ type: 'comparative',
140
+ items: [
141
+ {
142
+ title: 'Rohsensor Verhalten',
143
+ description: 'Die Spur folgt deiner Hand, einschließlich kleiner natürlicher Kurven und Korrekturen. Diagonale Linien sind nicht mathematisch perfekt, es sei denn, deine Bewegung war es.',
144
+ },
145
+ {
146
+ title: 'Winkelkorrektur Verhalten',
147
+ description: 'Die Spur sieht über lange Abschnitte verdächtig gerade aus, besonders in der Nähe üblicher Winkel wie horizontal, vertikal oder 45 Grad.',
148
+ },
149
+ {
150
+ title: 'Jitter Verhalten',
151
+ description: 'Die Spur wird verrauscht, unscharf oder spitz. Statt zu gerade zu sein, wirkt sie instabil und rau.',
152
+ },
153
+ ],
154
+ },
155
+ {
156
+ type: 'title',
157
+ text: 'So testest du deine Maus richtig',
158
+ level: 3,
159
+ },
160
+ {
161
+ type: 'list',
162
+ items: [
163
+ 'Beginne mit einem sauberen Sensorfenster und einem bewährten Mauspad',
164
+ 'Zeichne langsame diagonale Linien von Ecke zu Ecke und wiederhole dieselbe Bewegung mehrmals',
165
+ 'Zeichne Kreise und S-Kurven, um Jitter aufzudecken, der in geraden Linien nicht sichtbar ist',
166
+ 'Teste bei mehreren DPI-Stufen, da manche Sensoren bei sehr hoher Empfindlichkeit verrauschter werden',
167
+ 'Deaktiviere Herstellersoftware-Funktionen wie Winkelkorrektur, Vorhersage, Oberflächenabstimmung oder Beschleunigung, wenn möglich',
168
+ 'Vergleiche Kabel- und Funkmodus, wenn deine Maus beides unterstützt',
169
+ 'Vergleiche mit einer anderen Maus auf derselben Oberfläche, um Mausdefekte von Oberflächenproblemen zu trennen',
170
+ ],
171
+ },
172
+ {
173
+ type: 'title',
174
+ text: 'Die Bewertungen verstehen',
175
+ level: 3,
176
+ },
177
+ {
178
+ type: 'paragraph',
179
+ html: 'Das Tool zeigt einen Jitter-Wert, einen Winkelkorrektur-Wert, Geradheit, durchschnittliche Abweichung und die Anzahl der erfassten Proben. Diese Werte sollten am besten vergleichend verwendet werden. Zeichne dieselbe Linie mit derselben Handbewegung, nachdem du eine Variable geändert hast: DPI, Oberfläche, Platzierung des Funkempfängers oder Maus-Firmware-Einstellung. Wenn ein Wert nach dem Wechsel der Oberfläche oder der Reinigung des Sensors sinkt, hast du eine wahrscheinliche Ursache gefunden.',
180
+ },
181
+ {
182
+ type: 'table',
183
+ headers: ['Ergebnis', 'Was es nahelegt', 'Praktische Maßnahme'],
184
+ rows: [
185
+ ['Niedriger Jitter und niedrige Korrektur', 'Der Sensorpfad wirkt natürlich und stabil', 'Aktuelle Einstellungen beibehalten und als Referenz nutzen'],
186
+ ['Hoher Jitter, niedrige Korrektur', 'Die Maus verfolgt, aber der Pfad ist verrauscht', 'Sensor reinigen, Oberfläche wechseln, DPI senken und erneut testen'],
187
+ ['Niedriger Jitter, hohe Korrektur', 'Der Pfad könnte firmware-korrigiert sein', 'Nach Vorhersage- oder Winkelkorrektur-Einstellungen in der Maus-Software suchen'],
188
+ ['Hoher Jitter und hohe Korrektur', 'Die Spur ist instabil und möglicherweise überkorrigiert', 'Maus-Software-Profile zurücksetzen und ab Werkseinstellungen erneut testen'],
189
+ ['Werte ändern sich stark je nach Oberfläche', 'Dem Sensor gefällt eine Oberflächentextur oder Reflektivität nicht', 'Die Oberfläche mit der saubersten Spur verwenden'],
190
+ ],
191
+ },
192
+ {
193
+ type: 'title',
194
+ text: 'DPI, Polling-Rate und Maus-Jitter',
195
+ level: 3,
196
+ },
197
+ {
198
+ type: 'paragraph',
199
+ html: 'Hohe DPI bedeuten nicht automatisch bessere Verfolgung. Manche Mäuse funktionieren bei moderaten DPI sauber, zeigen aber bei sehr hohen DPI mehr sichtbares Rauschen, weil winzige Sensorfehler in größere Cursorbewegungen verstärkt werden. Die Polling-Rate kann ebenfalls das Gefühl der Spur verändern. Eine höhere Polling-Rate liefert häufigere Aktualisierungen, kann aber einen verschmutzten Sensor, eine schlechte Oberfläche oder Firmware-Vorhersage nicht beheben.',
200
+ },
201
+ {
202
+ type: 'paragraph',
203
+ html: 'Für einen fairen Vergleich halte deine Handbewegung ähnlich und ändere jeweils nur eine Einstellung. Zeichne zum Beispiel dieselbe diagonale Linie bei 800 DPI, 1600 DPI und 3200 DPI. Wenn die Spur nur beim höchsten Wert unscharf wird, kann die beste Lösung sein, den DPI zu senken und die Empfindlichkeit im Spiel anzupassen, statt die Maus zu ersetzen.',
204
+ },
205
+ {
206
+ type: 'title',
207
+ text: 'Häufige Ursachen für Maussensor-Jitter',
208
+ level: 3,
209
+ },
210
+ {
211
+ type: 'list',
212
+ items: [
213
+ 'Staub, Haare oder Fett in der Nähe des optischen Sensorfensters',
214
+ 'Glänzende, reflektierende, transparente oder unebene Oberflächen',
215
+ 'Sehr hohe DPI-Einstellungen, die kleine Sensorfehler verstärken',
216
+ 'Schwacher Akku oder Funkstörungen',
217
+ 'Empfänger weit von der Maus entfernt oder hinter einem Metall-PC-Gehäuse',
218
+ 'Firmware-Filter, Oberflächenkalibrierung oder Herstellersoftware-Profile',
219
+ 'Lift-Off-Distanz-Probleme, wenn die Maus gekippt oder schnell bewegt wird',
220
+ 'Eine abgenutzte oder beschädigte Sensorlinse nach intensiver Nutzung',
221
+ ],
222
+ },
223
+ {
224
+ type: 'title',
225
+ text: 'Warum es Gamer und Designer interessiert',
226
+ level: 3,
227
+ },
228
+ {
229
+ type: 'paragraph',
230
+ html: 'In Spielen kann Jitter Mikroanpassungen erschweren, weil das Fadenkreuz nicht genau dort zur Ruhe kommt, wo die Hand es beabsichtigt hat. Winkelkorrektur kann ebenso problematisch sein: Sie mag beim Zeichnen gerader Desktop-Linien helfen, kann aber auch kleine Zielkorrekturen verzerren und diagonales Tracking gefiltert wirken lassen. Für Designer, Illustratoren, CAD-Anwender und Bildbearbeiter kann Sensorkorrektur die Freihandbewegung weniger ehrlich und schwerer kontrollierbar machen.',
231
+ },
232
+ {
233
+ type: 'paragraph',
234
+ html: 'Eine Maus braucht keine perfekte Spur, um gut zu sein. Menschliche Bewegung ist von Natur aus unvollkommen. Die Warnsignale sind wiederholbar: Dieselbe Oberfläche erzeugt immer verrauschte Punkte, dieselbe DPI erzeugt immer Spitzen, oder dieselbe Maus macht Diagonalen immer verdächtig gerade, während eine andere Maus das nicht tut.',
235
+ },
236
+ {
237
+ type: 'title',
238
+ text: 'Bevor du eine neue Maus kaufst',
239
+ level: 3,
240
+ },
241
+ {
242
+ type: 'list',
243
+ items: [
244
+ 'Reinige das Sensorfenster vorsichtig bei ausgeschalteter Maus',
245
+ 'Probiere ein anderes Mauspad, vorzugsweise mattes Stoff- oder Hybrid-Gaming-Pad',
246
+ 'Senke den DPI und gleiche mit Software-Empfindlichkeit aus',
247
+ 'Deaktiviere Winkelkorrektur, Vorhersage, Zeigergenauigkeit und Beschleunigungsoptionen',
248
+ 'Bringe den Funkempfänger mit einem USB-Verlängerungskabel näher',
249
+ 'Aktualisiere oder setze das Maus-Firmware-Profil zurück, falls die Herstellersoftware es unterstützt',
250
+ 'Teste eine andere Maus am selben Computer und auf derselben Oberfläche zum Vergleich',
251
+ ],
252
+ },
253
+ {
254
+ type: 'diagnostic',
255
+ variant: 'info',
256
+ title: 'Die nützliche Diagnoseregel',
257
+ html: '<p>Eine einzelne seltsame Spur reicht nicht aus. Ein wiederholbares Muster ist entscheidend. Wenn Jitter oder Winkelkorrektur unter denselben Einstellungen immer wieder auftritt und dann verschwindet, wenn du den Sensor reinigst, die Oberfläche wechselst, den DPI senkst oder die Vorhersage deaktivierst, hast du die wahrscheinlichste Ursache gefunden.</p>',
258
+ },
259
+ ],
260
+ ui: {
261
+ badge: 'Rohe Sensorspur',
262
+ canvasLabel: 'Zeichenbereich für Maus-Jitter- und Winkelkorrektur-Test',
263
+ canvasHint: 'Zeichne langsame Diagonalen, Kreise und Kurven. Einzelne Sensorpunkte bleiben sichtbar, sodass unruhige Verfolgung leicht zu erkennen ist.',
264
+ pointerPrompt: 'Gedrückt halten und im Zeichenbereich zeichnen',
265
+ samples: 'Proben',
266
+ jitterScore: 'Jitter',
267
+ snappingScore: 'Korrektur',
268
+ straightness: 'Geradheit',
269
+ rawDeviation: 'Durchschn. Abweichung',
270
+ statusIdle: 'Zeichne im Feld, um rohe Mausbewegung zu erfassen',
271
+ statusHealthy: 'Spur wirkt natürlich und stabil in den letzten Proben',
272
+ statusJitter: 'Verrauschte Bewegung in der letzten Spur erkannt',
273
+ statusSnapping: 'Verdächtig gerade Bewegung erkannt',
274
+ statusMixed: 'Sowohl Jitter als auch mögliche Winkelkorrektur erscheinen in der Spur',
275
+ reset: 'Zurücksetzen',
276
+ holdShift: 'Tipp: Ändere immer nur eine Sache. DPI, Oberfläche, Funkmodus und Vorhersage-Einstellungen können die Spur verändern.',
277
+ sensitivity: 'Erkennungsempfindlichkeit',
278
+ low: 'stabil',
279
+ high: 'streng',
280
+ traceLog: 'Spurereignisse',
281
+ emptyLog: 'Zeichne einige kontrollierte Striche, um das Ereignisprotokoll zu starten.',
282
+ jitterEvent: 'Jitter',
283
+ snappingEvent: 'Winkelkorrektur',
284
+ combinedEvent: 'Jitter und Winkelkorrektur',
285
+ cleanEvent: 'saubere Spur',
286
+ pxUnit: 'px',
287
+ percentUnit: '%',
288
+ },
289
+ };