@jjlmoya/utils-hardware 1.14.0 → 1.16.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 +1 -1
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/pages/[locale]/[slug].astro +28 -12
- package/src/tests/locale_completeness.test.ts +6 -20
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/batteryHealthEstimator/bibliography.ts +13 -0
- package/src/tool/batteryHealthEstimator/i18n/de.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/en.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/es.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/fr.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/id.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/it.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/ja.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/ko.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/nl.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/pl.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/pt.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/ru.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/sv.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/tr.ts +2 -12
- package/src/tool/batteryHealthEstimator/i18n/zh.ts +2 -12
- package/src/tool/batteryHealthEstimator/lithium-battery-health-calculator.css +90 -3
- package/src/tool/batteryHealthEstimator/seo.astro +3 -2
- package/src/tool/deadPixelTest/bibliography.ts +13 -0
- package/src/tool/deadPixelTest/dead-pixel-tester.css +33 -6
- package/src/tool/deadPixelTest/i18n/de.ts +2 -12
- package/src/tool/deadPixelTest/i18n/en.ts +2 -12
- package/src/tool/deadPixelTest/i18n/es.ts +2 -12
- package/src/tool/deadPixelTest/i18n/fr.ts +2 -12
- package/src/tool/deadPixelTest/i18n/id.ts +2 -12
- package/src/tool/deadPixelTest/i18n/it.ts +2 -12
- package/src/tool/deadPixelTest/i18n/ja.ts +2 -12
- package/src/tool/deadPixelTest/i18n/ko.ts +2 -12
- package/src/tool/deadPixelTest/i18n/nl.ts +2 -12
- package/src/tool/deadPixelTest/i18n/pl.ts +2 -12
- package/src/tool/deadPixelTest/i18n/pt.ts +2 -12
- package/src/tool/deadPixelTest/i18n/ru.ts +2 -12
- package/src/tool/deadPixelTest/i18n/sv.ts +2 -12
- package/src/tool/deadPixelTest/i18n/tr.ts +2 -12
- package/src/tool/deadPixelTest/i18n/zh.ts +2 -12
- package/src/tool/deadPixelTest/seo.astro +3 -2
- package/src/tool/gamepadTest/bibliography.ts +12 -0
- package/src/tool/gamepadTest/gamepad-test.css +88 -3
- package/src/tool/gamepadTest/i18n/de.ts +2 -12
- package/src/tool/gamepadTest/i18n/en.ts +2 -12
- package/src/tool/gamepadTest/i18n/es.ts +2 -12
- package/src/tool/gamepadTest/i18n/fr.ts +2 -12
- package/src/tool/gamepadTest/i18n/id.ts +2 -12
- package/src/tool/gamepadTest/i18n/it.ts +2 -12
- package/src/tool/gamepadTest/i18n/ja.ts +2 -12
- package/src/tool/gamepadTest/i18n/ko.ts +2 -12
- package/src/tool/gamepadTest/i18n/nl.ts +2 -12
- package/src/tool/gamepadTest/i18n/pl.ts +2 -12
- package/src/tool/gamepadTest/i18n/pt.ts +2 -12
- package/src/tool/gamepadTest/i18n/ru.ts +2 -12
- package/src/tool/gamepadTest/i18n/sv.ts +2 -12
- package/src/tool/gamepadTest/i18n/tr.ts +2 -12
- package/src/tool/gamepadTest/i18n/zh.ts +2 -12
- package/src/tool/gamepadTest/seo.astro +3 -2
- package/src/tool/gamepadVibrationTester/bibliography.ts +13 -0
- package/src/tool/gamepadVibrationTester/gamepad-vibration-tester.css +124 -4
- package/src/tool/gamepadVibrationTester/i18n/de.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/en.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/es.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/fr.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/id.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/it.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/ja.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/ko.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/nl.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/pl.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/pt.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/ru.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/sv.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/tr.ts +2 -12
- package/src/tool/gamepadVibrationTester/i18n/zh.ts +2 -12
- package/src/tool/gamepadVibrationTester/seo.astro +3 -2
- package/src/tool/keyboardTest/bibliography.ts +13 -0
- package/src/tool/keyboardTest/i18n/de.ts +2 -12
- package/src/tool/keyboardTest/i18n/en.ts +2 -12
- package/src/tool/keyboardTest/i18n/es.ts +2 -12
- package/src/tool/keyboardTest/i18n/fr.ts +2 -12
- package/src/tool/keyboardTest/i18n/id.ts +2 -12
- package/src/tool/keyboardTest/i18n/it.ts +2 -12
- package/src/tool/keyboardTest/i18n/ja.ts +2 -12
- package/src/tool/keyboardTest/i18n/ko.ts +2 -12
- package/src/tool/keyboardTest/i18n/nl.ts +2 -12
- package/src/tool/keyboardTest/i18n/pl.ts +2 -12
- package/src/tool/keyboardTest/i18n/pt.ts +2 -12
- package/src/tool/keyboardTest/i18n/ru.ts +2 -12
- package/src/tool/keyboardTest/i18n/sv.ts +2 -12
- package/src/tool/keyboardTest/i18n/tr.ts +2 -12
- package/src/tool/keyboardTest/i18n/zh.ts +2 -12
- package/src/tool/keyboardTest/keyboard-test.css +46 -3
- package/src/tool/keyboardTest/seo.astro +3 -2
- package/src/tool/mousePollingTest/bibliography.ts +13 -0
- package/src/tool/mousePollingTest/i18n/de.ts +2 -12
- package/src/tool/mousePollingTest/i18n/en.ts +2 -12
- package/src/tool/mousePollingTest/i18n/es.ts +2 -12
- package/src/tool/mousePollingTest/i18n/fr.ts +2 -12
- package/src/tool/mousePollingTest/i18n/id.ts +2 -12
- package/src/tool/mousePollingTest/i18n/it.ts +2 -12
- package/src/tool/mousePollingTest/i18n/ja.ts +2 -12
- package/src/tool/mousePollingTest/i18n/ko.ts +2 -12
- package/src/tool/mousePollingTest/i18n/nl.ts +2 -12
- package/src/tool/mousePollingTest/i18n/pl.ts +2 -12
- package/src/tool/mousePollingTest/i18n/pt.ts +2 -12
- package/src/tool/mousePollingTest/i18n/ru.ts +2 -12
- package/src/tool/mousePollingTest/i18n/sv.ts +2 -12
- package/src/tool/mousePollingTest/i18n/tr.ts +2 -12
- package/src/tool/mousePollingTest/i18n/zh.ts +2 -12
- package/src/tool/mousePollingTest/mouse-polling-rate-test.css +27 -5
- package/src/tool/mousePollingTest/seo.astro +3 -2
- package/src/tool/refreshRateDetector/bibliography.astro +14 -0
- package/src/tool/refreshRateDetector/bibliography.ts +20 -0
- package/src/tool/refreshRateDetector/component.astro +206 -0
- package/src/tool/refreshRateDetector/entry.ts +29 -0
- package/src/tool/refreshRateDetector/i18n/de.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/en.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/es.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/fr.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/id.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/it.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/ja.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/ko.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/nl.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/pl.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/pt.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/ru.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/sv.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/tr.ts +196 -0
- package/src/tool/refreshRateDetector/i18n/zh.ts +196 -0
- package/src/tool/refreshRateDetector/index.ts +11 -0
- package/src/tool/refreshRateDetector/monitor-refresh-rate-detector.css +342 -0
- package/src/tool/refreshRateDetector/seo.astro +15 -0
- package/src/tool/refreshRateDetector/ui.ts +24 -0
- package/src/tool/toneGenerator/bibliography.ts +13 -0
- package/src/tool/toneGenerator/i18n/de.ts +2 -12
- package/src/tool/toneGenerator/i18n/en.ts +2 -12
- package/src/tool/toneGenerator/i18n/es.ts +2 -12
- package/src/tool/toneGenerator/i18n/fr.ts +2 -12
- package/src/tool/toneGenerator/i18n/id.ts +2 -12
- package/src/tool/toneGenerator/i18n/it.ts +2 -12
- package/src/tool/toneGenerator/i18n/ja.ts +2 -12
- package/src/tool/toneGenerator/i18n/ko.ts +2 -12
- package/src/tool/toneGenerator/i18n/nl.ts +2 -12
- package/src/tool/toneGenerator/i18n/pl.ts +2 -12
- package/src/tool/toneGenerator/i18n/pt.ts +2 -12
- package/src/tool/toneGenerator/i18n/ru.ts +2 -12
- package/src/tool/toneGenerator/i18n/sv.ts +2 -12
- package/src/tool/toneGenerator/i18n/tr.ts +2 -12
- package/src/tool/toneGenerator/i18n/zh.ts +2 -12
- package/src/tool/toneGenerator/seo.astro +3 -2
- package/src/tool/toneGenerator/tone-frequency-generator.css +25 -3
- package/src/tools.ts +2 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'test-taux-sondage-souris';
|
|
6
7
|
const title = 'Test du Taux de Sondage de la Souris en Ligne';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Questions Fréquentes',
|
|
91
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Guide Complet sur le Taux de Sondage', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'tes-mouse-polling-rate-online';
|
|
6
7
|
const title = 'Tes Mouse Polling Rate Online';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Pertanyaan yang Sering Diajukan',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Referensi',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Panduan Definitif tentang Polling Rate', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'test-polling-rate-mouse-online';
|
|
6
7
|
const title = 'Test Polling Rate Mouse Online';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Domande Frequenti',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Riferimenti',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Guida definitiva alla Polling Rate', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'mouse-polling-rate-test';
|
|
6
7
|
const title = 'オンライン・マウス・ポーリングレートテスト';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'よくある質問',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'リファレンス',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'ポーリングレート完全ガイド', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'mouse-polling-rate-test';
|
|
6
7
|
const title = '온라인 마우스 폴링 레이트 테스트';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: '자주 묻는 질문',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: '참조',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: '폴링 레이트에 대한 결정적 가이드', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'muis-polling-rate-test-online';
|
|
6
7
|
const title = 'Online Muis Polling Rate Test';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Veelgestelde Vragen',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Referenties',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Definitieve Gids voor Polling Rate', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'test-polling-rate-myszki-online';
|
|
6
7
|
const title = 'Online Test Polling Rate Myszki';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Często Zadawane Pytania',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Referencje',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Definitywny Przewodnik po Polling Rate', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'teste-polling-rate-rato-online';
|
|
6
7
|
const title = 'Teste de Polling Rate de Rato Online';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Perguntas Frequentes',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Referências',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Guia Definitivo do Polling Rate', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'test-polling-rate-myshi-online';
|
|
6
7
|
const title = 'Онлайн тест частоты опроса мыши';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Часто задаваемые вопросы',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Ссылки',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Полное руководство по частоте опроса мыши', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'mus-polling-rate-test-online';
|
|
6
7
|
const title = 'Online Mus Polling Rate Test';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Vanliga frågor',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Referenser',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Den definitiva guiden till Polling Rate', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'fare-polling-hizi-testi-online';
|
|
6
7
|
const title = 'Çevrimiçi Fare Polling Rate Testi';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: 'Sıkça Sorulan Sorular',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: 'Referanslar',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: 'Polling Rate Hakkında Kesin Kılavuz', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
2
|
import type { ToolLocaleContent } from '../../../types';
|
|
3
3
|
import type { TestRatonUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
4
5
|
|
|
5
6
|
const slug = 'mouse-polling-rate-test';
|
|
6
7
|
const title = '在线鼠标回报率测试';
|
|
@@ -87,21 +88,10 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
87
88
|
slug,
|
|
88
89
|
title,
|
|
89
90
|
description,
|
|
90
|
-
faqTitle: '常见问题',
|
|
91
91
|
faq: faqData,
|
|
92
|
-
bibliographyTitle: '参考资料',
|
|
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
92
|
howTo: howToData,
|
|
104
93
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
bibliography,
|
|
105
95
|
seo: [
|
|
106
96
|
{ type: 'title', text: '鼠标回报率权威指南', level: 2 },
|
|
107
97
|
{
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
.tr-wrapper {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
--tr-accent: #10b981;
|
|
3
|
+
--tr-accent-glow: rgba(16, 185, 129, 0.4);
|
|
4
|
+
--tr-surface: #fff;
|
|
5
|
+
--tr-surface-alt: #f1f5f9;
|
|
6
|
+
--tr-surface-dark: #020617;
|
|
7
|
+
--tr-border: #e2e8f0;
|
|
8
|
+
--tr-text: #0f172a;
|
|
9
|
+
--tr-text-muted: #64748b;
|
|
10
|
+
|
|
11
|
+
width: 100%;
|
|
12
|
+
max-width: 56rem;
|
|
13
|
+
margin: 0 auto;
|
|
14
|
+
color: var(--tr-text);
|
|
6
15
|
}
|
|
7
16
|
|
|
8
17
|
.tr-card {
|
|
@@ -140,4 +149,17 @@
|
|
|
140
149
|
opacity: 0;
|
|
141
150
|
transition: opacity 75ms;
|
|
142
151
|
transform: translate(0, 0);
|
|
143
|
-
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.theme-dark .tr-wrapper {
|
|
155
|
+
--tr-surface: #0f172a;
|
|
156
|
+
--tr-surface-alt: #1e293b;
|
|
157
|
+
--tr-surface-dark: #020617;
|
|
158
|
+
--tr-border: #334155;
|
|
159
|
+
--tr-text: #f1f5f9;
|
|
160
|
+
--tr-text-muted: #94a3b8;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
body.is-widget .tr-wrapper {
|
|
164
|
+
padding: 0;
|
|
165
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
-
import type { KnownLocale } from '../../types';
|
|
4
3
|
import { testRaton } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
5
|
|
|
6
6
|
interface Props {
|
|
7
7
|
locale?: KnownLocale;
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await testRaton.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import type { KnownLocale } from '../../types';
|
|
4
|
+
import { refreshRateDetector } from './index';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await refreshRateDetector.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'VESA DisplayPort Standard - Monitor Refresh Rates',
|
|
6
|
+
url: 'https://www.vesa.org/standards/',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'HDMI Specification - Refresh Rate Support',
|
|
10
|
+
url: 'https://www.hdmi.org/spec21Sub1',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'MDN - requestAnimationFrame API',
|
|
14
|
+
url: 'https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'Screen Refresh Rate - Performance Best Practices',
|
|
18
|
+
url: 'https://web.dev/animations-guide/',
|
|
19
|
+
},
|
|
20
|
+
];
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { KnownLocale } from '../../types';
|
|
3
|
+
import type { RefreshRateDetectorUI } from './ui';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
locale?: KnownLocale;
|
|
7
|
+
ui?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { ui } = Astro.props;
|
|
11
|
+
const t = (ui ?? {}) as RefreshRateDetectorUI;
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<div id="rrd-root" class="rrd-wrapper" data-config={JSON.stringify({
|
|
15
|
+
currentHz: t.currentHz,
|
|
16
|
+
averageHz: t.averageHz,
|
|
17
|
+
maxHz: t.maxHz,
|
|
18
|
+
minHz: t.minHz,
|
|
19
|
+
})}>
|
|
20
|
+
<div class="rrd-container">
|
|
21
|
+
<div class="rrd-card">
|
|
22
|
+
<div class="rrd-layout">
|
|
23
|
+
<div class="rrd-left">
|
|
24
|
+
<div class="rrd-metrics">
|
|
25
|
+
<div class="rrd-metric-item">
|
|
26
|
+
<div class="rrd-metric-label">{t.currentHz}</div>
|
|
27
|
+
<div class="rrd-metric-value" id="current-hz">—</div>
|
|
28
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="rrd-metric-item">
|
|
31
|
+
<div class="rrd-metric-label">{t.averageHz}</div>
|
|
32
|
+
<div class="rrd-metric-value" id="average-hz">—</div>
|
|
33
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="rrd-metric-item">
|
|
36
|
+
<div class="rrd-metric-label">{t.maxHz}</div>
|
|
37
|
+
<div class="rrd-metric-value" id="max-hz">—</div>
|
|
38
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="rrd-metric-item">
|
|
41
|
+
<div class="rrd-metric-label">{t.minHz}</div>
|
|
42
|
+
<div class="rrd-metric-value" id="min-hz">—</div>
|
|
43
|
+
<div class="rrd-metric-unit">Hz</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div class="rrd-mode-selector">
|
|
48
|
+
<button id="mode-fast" class="rrd-mode-btn selected" data-mode="fast" data-duration="3000">
|
|
49
|
+
{t.modeFast}
|
|
50
|
+
</button>
|
|
51
|
+
<button id="mode-stable" class="rrd-mode-btn" data-mode="stable" data-duration="10000">
|
|
52
|
+
{t.modeStable}
|
|
53
|
+
</button>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div class="rrd-right">
|
|
58
|
+
<div class="rrd-monitor">
|
|
59
|
+
<div class="rrd-monitor-bezel">
|
|
60
|
+
<div class="rrd-monitor-screen">
|
|
61
|
+
<div class="rrd-monitor-content">
|
|
62
|
+
<div class="rrd-hz-display" id="hz-display">—</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="rrd-monitor-stand"></div>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<link rel="stylesheet" href="./monitor-refresh-rate-detector.css" />
|
|
75
|
+
|
|
76
|
+
<script>
|
|
77
|
+
interface State {
|
|
78
|
+
mode: 'fast' | 'stable';
|
|
79
|
+
duration: number;
|
|
80
|
+
frameTimestamps: number[];
|
|
81
|
+
startTime: number;
|
|
82
|
+
maxHz: number;
|
|
83
|
+
minHz: number;
|
|
84
|
+
averageHz: number;
|
|
85
|
+
currentHz: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const state: State = {
|
|
89
|
+
mode: 'fast',
|
|
90
|
+
duration: 3000,
|
|
91
|
+
frameTimestamps: [],
|
|
92
|
+
startTime: 0,
|
|
93
|
+
maxHz: 0,
|
|
94
|
+
minHz: Infinity,
|
|
95
|
+
averageHz: 0,
|
|
96
|
+
currentHz: 0,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const elements = {
|
|
100
|
+
currentHz: document.getElementById('current-hz'),
|
|
101
|
+
averageHz: document.getElementById('average-hz'),
|
|
102
|
+
maxHz: document.getElementById('max-hz'),
|
|
103
|
+
minHz: document.getElementById('min-hz'),
|
|
104
|
+
hzDisplay: document.getElementById('hz-display'),
|
|
105
|
+
modeFast: document.getElementById('mode-fast'),
|
|
106
|
+
modeStable: document.getElementById('mode-stable'),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
function getFrameDeltas(timestamps: number[]): number[] {
|
|
110
|
+
const deltas: number[] = [];
|
|
111
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
112
|
+
const prev = timestamps[i - 1];
|
|
113
|
+
const curr = timestamps[i];
|
|
114
|
+
if (prev !== undefined && curr !== undefined) {
|
|
115
|
+
deltas.push(curr - prev);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return deltas;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function filterOutliers(deltas: number[]): number[] {
|
|
122
|
+
if (deltas.length === 0) return deltas;
|
|
123
|
+
const sorted = [...deltas].sort((a, b) => a - b);
|
|
124
|
+
const q1Index = Math.floor(sorted.length * 0.25);
|
|
125
|
+
const q3Index = Math.floor(sorted.length * 0.75);
|
|
126
|
+
const q1 = sorted[q1Index] ?? 0;
|
|
127
|
+
const q3 = sorted[q3Index] ?? 0;
|
|
128
|
+
const iqr = q3 - q1;
|
|
129
|
+
return deltas.filter(d => d >= q1 - 1.5 * iqr && d <= q3 + 1.5 * iqr);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function calculateHz(timestamps: number[]): number {
|
|
133
|
+
if (timestamps.length < 2) return 0;
|
|
134
|
+
const deltas = getFrameDeltas(timestamps);
|
|
135
|
+
if (deltas.length === 0) return 0;
|
|
136
|
+
const filtered = filterOutliers(deltas);
|
|
137
|
+
if (filtered.length === 0) return 0;
|
|
138
|
+
const avgDelta = filtered.reduce((a, b) => a + b) / filtered.length;
|
|
139
|
+
return avgDelta > 0 ? Math.round(1000 / avgDelta * 10) / 10 : 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function updateMetrics(): void {
|
|
143
|
+
if (state.frameTimestamps.length < 2) return;
|
|
144
|
+
const warmupTime = state.startTime + 500;
|
|
145
|
+
const warmedUpTimestamps = state.frameTimestamps.filter(t => t >= warmupTime);
|
|
146
|
+
if (warmedUpTimestamps.length < 2) return;
|
|
147
|
+
|
|
148
|
+
const recentHz = calculateHz(warmedUpTimestamps.slice(-60));
|
|
149
|
+
state.currentHz = recentHz;
|
|
150
|
+
|
|
151
|
+
const allHz: number[] = [];
|
|
152
|
+
for (let i = 1; i < warmedUpTimestamps.length; i++) {
|
|
153
|
+
const prev = warmedUpTimestamps[i - 1];
|
|
154
|
+
const curr = warmedUpTimestamps[i];
|
|
155
|
+
if (prev !== undefined && curr !== undefined) {
|
|
156
|
+
allHz.push(1000 / (curr - prev));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (allHz.length > 0) {
|
|
161
|
+
state.maxHz = Math.max(...allHz);
|
|
162
|
+
state.minHz = Math.min(...allHz);
|
|
163
|
+
state.averageHz = allHz.reduce((a, b) => a + b) / allHz.length;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
elements.currentHz!.textContent = state.currentHz.toFixed(1);
|
|
167
|
+
elements.averageHz!.textContent = state.averageHz.toFixed(1);
|
|
168
|
+
elements.maxHz!.textContent = state.maxHz.toFixed(1);
|
|
169
|
+
elements.minHz!.textContent = state.minHz.toFixed(1);
|
|
170
|
+
elements.hzDisplay!.textContent = state.currentHz.toFixed(0);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function measureFrame() {
|
|
174
|
+
state.frameTimestamps.push(performance.now());
|
|
175
|
+
updateMetrics();
|
|
176
|
+
requestAnimationFrame(measureFrame);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function restartMeasurement() {
|
|
180
|
+
state.frameTimestamps = [];
|
|
181
|
+
state.startTime = performance.now();
|
|
182
|
+
state.maxHz = 0;
|
|
183
|
+
state.minHz = Infinity;
|
|
184
|
+
state.averageHz = 0;
|
|
185
|
+
state.currentHz = 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
elements.modeFast?.addEventListener('click', () => {
|
|
189
|
+
state.mode = 'fast';
|
|
190
|
+
state.duration = 3000;
|
|
191
|
+
elements.modeFast!.classList.add('selected');
|
|
192
|
+
elements.modeStable!.classList.remove('selected');
|
|
193
|
+
restartMeasurement();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
elements.modeStable?.addEventListener('click', () => {
|
|
197
|
+
state.mode = 'stable';
|
|
198
|
+
state.duration = 10000;
|
|
199
|
+
elements.modeStable!.classList.add('selected');
|
|
200
|
+
elements.modeFast!.classList.remove('selected');
|
|
201
|
+
restartMeasurement();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
restartMeasurement();
|
|
205
|
+
requestAnimationFrame(measureFrame);
|
|
206
|
+
</script>
|