@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.
- package/package.json +1 -1
- package/src/category/i18n/de.ts +4 -4
- package/src/category/i18n/id.ts +3 -3
- package/src/category/i18n/it.ts +3 -3
- package/src/category/i18n/nl.ts +3 -3
- package/src/category/i18n/pl.ts +4 -4
- package/src/category/i18n/pt.ts +3 -3
- package/src/category/i18n/ru.ts +3 -3
- package/src/category/i18n/sv.ts +3 -3
- package/src/category/i18n/tr.ts +3 -3
- package/src/category/i18n/zh.ts +3 -3
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/layouts/PreviewLayout.astro +1 -0
- package/src/tests/diacritics_density.test.ts +118 -0
- package/src/tests/inverted_punctuation.test.ts +84 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/no_en_dash.test.ts +70 -0
- package/src/tests/pagespeed_best_practices.test.ts +198 -0
- package/src/tests/script_density.test.ts +94 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/batteryHealthEstimator/component.astro +3 -3
- package/src/tool/batteryHealthEstimator/i18n/fr.ts +4 -4
- package/src/tool/batteryHealthEstimator/i18n/pl.ts +1 -1
- package/src/tool/colorAccuracyTest/color-accuracy-test.css +118 -5
- package/src/tool/colorAccuracyTest/i18n/de.ts +7 -7
- package/src/tool/colorAccuracyTest/i18n/en.ts +3 -3
- package/src/tool/colorAccuracyTest/i18n/es.ts +2 -2
- package/src/tool/colorAccuracyTest/i18n/fr.ts +9 -9
- package/src/tool/colorAccuracyTest/i18n/id.ts +3 -3
- package/src/tool/colorAccuracyTest/i18n/it.ts +3 -3
- package/src/tool/colorAccuracyTest/i18n/ja.ts +1 -1
- package/src/tool/colorAccuracyTest/i18n/ko.ts +2 -2
- package/src/tool/colorAccuracyTest/i18n/nl.ts +3 -3
- package/src/tool/colorAccuracyTest/i18n/pl.ts +5 -5
- package/src/tool/colorAccuracyTest/i18n/pt.ts +3 -3
- package/src/tool/colorAccuracyTest/i18n/ru.ts +15 -15
- package/src/tool/colorAccuracyTest/i18n/sv.ts +3 -3
- package/src/tool/colorAccuracyTest/i18n/tr.ts +2 -2
- package/src/tool/colorAccuracyTest/i18n/zh.ts +7 -7
- package/src/tool/deadPixelTest/i18n/ru.ts +6 -6
- package/src/tool/deadPixelTest/i18n/sv.ts +1 -1
- package/src/tool/deadPixelTest/i18n/zh.ts +5 -5
- package/src/tool/gamepadTest/component.astro +4 -3
- package/src/tool/gamepadTest/gamepad-test.css +171 -3
- package/src/tool/gamepadTest/i18n/es.ts +4 -4
- package/src/tool/gamepadTest/i18n/ru.ts +1 -1
- package/src/tool/gamepadTest/i18n/zh.ts +1 -1
- package/src/tool/gamepadVibrationTester/component.astro +3 -3
- package/src/tool/gamepadVibrationTester/i18n/es.ts +1 -1
- package/src/tool/gamepadVibrationTester/i18n/fr.ts +2 -2
- package/src/tool/keyboardTest/component.astro +6 -1
- package/src/tool/keyboardTest/keyboard-test.css +115 -2
- package/src/tool/mouseDoubleClickTest/bibliography.astro +14 -0
- package/src/tool/mouseDoubleClickTest/bibliography.ts +16 -0
- package/src/tool/mouseDoubleClickTest/component.astro +135 -0
- package/src/tool/mouseDoubleClickTest/entry.ts +29 -0
- package/src/tool/mouseDoubleClickTest/i18n/de.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/en.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/es.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/fr.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/id.ts +285 -0
- package/src/tool/mouseDoubleClickTest/i18n/it.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/ja.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/ko.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/nl.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/pl.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/pt.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/ru.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/sv.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/tr.ts +274 -0
- package/src/tool/mouseDoubleClickTest/i18n/zh.ts +274 -0
- package/src/tool/mouseDoubleClickTest/index.ts +9 -0
- package/src/tool/mouseDoubleClickTest/logic.ts +258 -0
- package/src/tool/mouseDoubleClickTest/mouse-double-click-test.css +488 -0
- package/src/tool/mouseDoubleClickTest/seo.astro +15 -0
- package/src/tool/mouseDoubleClickTest/ui.ts +26 -0
- package/src/tool/mousePollingTest/i18n/fr.ts +3 -3
- package/src/tool/mousePollingTest/i18n/pl.ts +1 -1
- package/src/tool/mousePollingTest/i18n/ru.ts +1 -1
- package/src/tool/mousePollingTest/i18n/zh.ts +1 -1
- package/src/tool/mousePollingTest/logic/RatonManager.ts +6 -6
- package/src/tool/refreshRateDetector/i18n/de.ts +3 -3
- package/src/tool/refreshRateDetector/i18n/en.ts +3 -3
- package/src/tool/refreshRateDetector/i18n/fr.ts +4 -4
- package/src/tool/refreshRateDetector/i18n/id.ts +3 -3
- package/src/tool/refreshRateDetector/i18n/pl.ts +2 -2
- package/src/tool/refreshRateDetector/i18n/pt.ts +3 -3
- package/src/tool/refreshRateDetector/i18n/sv.ts +3 -3
- package/src/tool/refreshRateDetector/i18n/tr.ts +2 -2
- package/src/tool/refreshRateDetector/i18n/zh.ts +2 -2
- package/src/tool/toneGenerator/component.astro +7 -7
- package/src/tool/toneGenerator/i18n/fr.ts +2 -2
- package/src/tool/toneGenerator/i18n/pl.ts +1 -1
- package/src/tool/toneGenerator/i18n/ru.ts +2 -2
- package/src/tool/toneGenerator/i18n/zh.ts +3 -3
- package/src/tools.ts +2 -2
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
.mdct-root {
|
|
2
|
+
--mdct-ink: #111827;
|
|
3
|
+
--mdct-muted: #667085;
|
|
4
|
+
--mdct-panel: #f8fafc;
|
|
5
|
+
--mdct-line: rgba(102, 112, 133, 0.18);
|
|
6
|
+
--mdct-line-strong: rgba(102, 112, 133, 0.32);
|
|
7
|
+
--mdct-blue: #2f86ff;
|
|
8
|
+
--mdct-green: #00a878;
|
|
9
|
+
--mdct-red: #e83f64;
|
|
10
|
+
--mdct-violet: #7c5cff;
|
|
11
|
+
--mdct-mouse: #d9e0ea;
|
|
12
|
+
--mdct-mouse-hi: #f2f5f9;
|
|
13
|
+
--mdct-button-bg: rgba(17, 24, 39, 0.035);
|
|
14
|
+
--mdct-button-border: rgba(17, 24, 39, 0.09);
|
|
15
|
+
--mdct-grid: rgba(47, 134, 255, 0.065);
|
|
16
|
+
--mdct-target-text: rgba(17, 24, 39, 0.64);
|
|
17
|
+
--mdct-chip-bg: rgba(17, 24, 39, 0.025);
|
|
18
|
+
--mdct-card-highlight: rgba(255, 255, 255, 0.8);
|
|
19
|
+
--mdct-shadow: rgba(16, 24, 40, 0.18);
|
|
20
|
+
|
|
21
|
+
width: 100%;
|
|
22
|
+
color: var(--mdct-ink);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.mdct-root *,
|
|
26
|
+
.mdct-root *::before,
|
|
27
|
+
.mdct-root *::after {
|
|
28
|
+
box-sizing: border-box;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.mdct-card {
|
|
32
|
+
width: min(100%, 62rem);
|
|
33
|
+
margin: 0 auto;
|
|
34
|
+
padding: 1.35rem;
|
|
35
|
+
border: 1px solid var(--mdct-line);
|
|
36
|
+
border-radius: 1.25rem;
|
|
37
|
+
background: var(--mdct-panel);
|
|
38
|
+
box-shadow: 0 24px 70px -42px var(--mdct-shadow), inset 0 1px 0 var(--mdct-card-highlight);
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.mdct-stage {
|
|
43
|
+
display: grid;
|
|
44
|
+
grid-template-columns: 1fr;
|
|
45
|
+
gap: 1.25rem;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.mdct-target {
|
|
49
|
+
min-height: 22rem;
|
|
50
|
+
border: 0;
|
|
51
|
+
background:
|
|
52
|
+
radial-gradient(circle at 50% 44%, rgba(47, 134, 255, 0.09), transparent 12rem),
|
|
53
|
+
linear-gradient(var(--mdct-grid) 1px, transparent 1px),
|
|
54
|
+
linear-gradient(90deg, var(--mdct-grid) 1px, transparent 1px);
|
|
55
|
+
background-size: auto, 4rem 4rem, 4rem 4rem;
|
|
56
|
+
color: #fff;
|
|
57
|
+
cursor: crosshair;
|
|
58
|
+
display: grid;
|
|
59
|
+
align-content: center;
|
|
60
|
+
justify-items: center;
|
|
61
|
+
position: relative;
|
|
62
|
+
overflow: hidden;
|
|
63
|
+
touch-action: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.mdct-target[data-flash='clean'] {
|
|
67
|
+
background:
|
|
68
|
+
radial-gradient(circle at 50% 44%, rgba(20, 214, 155, 0.16), transparent 12rem),
|
|
69
|
+
linear-gradient(var(--mdct-grid) 1px, transparent 1px),
|
|
70
|
+
linear-gradient(90deg, var(--mdct-grid) 1px, transparent 1px);
|
|
71
|
+
background-size: auto, 4rem 4rem, 4rem 4rem;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.mdct-target[data-flash='warning'] {
|
|
75
|
+
background:
|
|
76
|
+
radial-gradient(circle at 50% 44%, rgba(255, 63, 109, 0.18), transparent 12rem),
|
|
77
|
+
linear-gradient(var(--mdct-grid) 1px, transparent 1px),
|
|
78
|
+
linear-gradient(90deg, var(--mdct-grid) 1px, transparent 1px);
|
|
79
|
+
background-size: auto, 4rem 4rem, 4rem 4rem;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.mdct-mouse {
|
|
83
|
+
width: min(72vw, 22rem);
|
|
84
|
+
aspect-ratio: 0.78;
|
|
85
|
+
position: relative;
|
|
86
|
+
display: block;
|
|
87
|
+
border-radius: 48% 48% 42% 42% / 31% 31% 56% 56%;
|
|
88
|
+
background:
|
|
89
|
+
linear-gradient(90deg, transparent calc(50% - 1px), rgba(17, 24, 39, 0.1) calc(50% - 1px), rgba(17, 24, 39, 0.1) calc(50% + 1px), transparent calc(50% + 1px)),
|
|
90
|
+
linear-gradient(145deg, var(--mdct-mouse-hi), var(--mdct-mouse));
|
|
91
|
+
box-shadow:
|
|
92
|
+
0 2rem 4rem rgba(16, 24, 40, 0.14),
|
|
93
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.72),
|
|
94
|
+
inset 0 -3rem 4rem rgba(102, 112, 133, 0.12);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.mdct-cable {
|
|
98
|
+
position: absolute;
|
|
99
|
+
left: 50%;
|
|
100
|
+
bottom: 99%;
|
|
101
|
+
width: 0.2rem;
|
|
102
|
+
height: 4.2rem;
|
|
103
|
+
background: linear-gradient(transparent, rgba(102, 112, 133, 0.28));
|
|
104
|
+
transform: translateX(-50%);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.mdct-button {
|
|
108
|
+
position: absolute;
|
|
109
|
+
display: grid;
|
|
110
|
+
place-items: center;
|
|
111
|
+
border: 1px solid var(--mdct-button-border);
|
|
112
|
+
background: var(--mdct-button-bg);
|
|
113
|
+
color: var(--mdct-muted);
|
|
114
|
+
transition: background 140ms ease, border-color 140ms ease, color 140ms ease, transform 140ms ease;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.mdct-button::before {
|
|
118
|
+
content: attr(data-label);
|
|
119
|
+
font-size: 0.62rem;
|
|
120
|
+
font-weight: 900;
|
|
121
|
+
text-transform: uppercase;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.mdct-button::after {
|
|
125
|
+
content: attr(data-count);
|
|
126
|
+
position: absolute;
|
|
127
|
+
right: 0.55rem;
|
|
128
|
+
bottom: 0.45rem;
|
|
129
|
+
color: var(--mdct-blue);
|
|
130
|
+
font-size: 0.82rem;
|
|
131
|
+
font-weight: 950;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.mdct-button[data-count='0']::after {
|
|
135
|
+
color: rgba(102, 112, 133, 0.32);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.mdct-button[data-flash='clean'] {
|
|
139
|
+
background: rgba(20, 214, 155, 0.18);
|
|
140
|
+
border-color: rgba(20, 214, 155, 0.42);
|
|
141
|
+
color: var(--mdct-green);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.mdct-button[data-flash='warning'],
|
|
145
|
+
.mdct-button[data-state='warning'] {
|
|
146
|
+
background: rgba(255, 63, 109, 0.16);
|
|
147
|
+
border-color: rgba(255, 63, 109, 0.42);
|
|
148
|
+
color: var(--mdct-red);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.mdct-left,
|
|
152
|
+
.mdct-right {
|
|
153
|
+
top: 1rem;
|
|
154
|
+
width: calc(50% - 0.75rem);
|
|
155
|
+
height: 34%;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.mdct-left {
|
|
159
|
+
left: 0.75rem;
|
|
160
|
+
border-radius: 7rem 0.8rem 0.7rem 1.4rem;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.mdct-right {
|
|
164
|
+
right: 0.75rem;
|
|
165
|
+
border-radius: 0.8rem 7rem 1.4rem 0.7rem;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.mdct-middle {
|
|
169
|
+
left: 50%;
|
|
170
|
+
top: 1.35rem;
|
|
171
|
+
width: 1.1rem;
|
|
172
|
+
height: 4.1rem;
|
|
173
|
+
border-radius: 999rem;
|
|
174
|
+
background: linear-gradient(var(--mdct-blue), var(--mdct-violet));
|
|
175
|
+
border-color: rgba(47, 134, 255, 0.45);
|
|
176
|
+
box-shadow: 0 0 1.3rem rgba(47, 134, 255, 0.28);
|
|
177
|
+
transform: translateX(-50%);
|
|
178
|
+
z-index: 2;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.mdct-middle::before {
|
|
182
|
+
writing-mode: vertical-rl;
|
|
183
|
+
font-size: 0.48rem;
|
|
184
|
+
color: white;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.mdct-middle::after {
|
|
188
|
+
right: 50%;
|
|
189
|
+
bottom: -1.35rem;
|
|
190
|
+
transform: translateX(50%);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.mdct-back,
|
|
194
|
+
.mdct-forward {
|
|
195
|
+
left: -0.42rem;
|
|
196
|
+
width: 3.2rem;
|
|
197
|
+
height: 2.35rem;
|
|
198
|
+
border-radius: 999rem;
|
|
199
|
+
background: rgba(47, 134, 255, 0.08);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.mdct-back {
|
|
203
|
+
top: 39%;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.mdct-forward {
|
|
207
|
+
top: 51%;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.mdct-palm {
|
|
211
|
+
position: absolute;
|
|
212
|
+
left: 18%;
|
|
213
|
+
right: 18%;
|
|
214
|
+
bottom: 13%;
|
|
215
|
+
height: 38%;
|
|
216
|
+
border-radius: 50%;
|
|
217
|
+
border: 1px solid rgba(102, 112, 133, 0.13);
|
|
218
|
+
background: radial-gradient(circle at 50% 10%, rgba(255, 255, 255, 0.28), transparent 62%);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.mdct-target-copy {
|
|
222
|
+
display: grid;
|
|
223
|
+
gap: 0.35rem;
|
|
224
|
+
margin-top: 1.1rem;
|
|
225
|
+
text-align: center;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.mdct-target-kicker {
|
|
229
|
+
display: inline-flex;
|
|
230
|
+
align-items: center;
|
|
231
|
+
justify-content: center;
|
|
232
|
+
gap: 0.4rem;
|
|
233
|
+
color: var(--mdct-muted);
|
|
234
|
+
font-size: 0.68rem;
|
|
235
|
+
font-weight: 900;
|
|
236
|
+
text-transform: uppercase;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.mdct-target-icon {
|
|
240
|
+
width: 0.95rem;
|
|
241
|
+
height: 0.95rem;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.mdct-target strong {
|
|
245
|
+
color: var(--mdct-ink);
|
|
246
|
+
font-size: 0.9rem;
|
|
247
|
+
font-weight: 950;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.mdct-target small {
|
|
251
|
+
color: var(--mdct-target-text);
|
|
252
|
+
font-size: 0.75rem;
|
|
253
|
+
font-weight: 800;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.mdct-dashboard {
|
|
257
|
+
display: grid;
|
|
258
|
+
align-content: start;
|
|
259
|
+
gap: 1rem;
|
|
260
|
+
min-width: 0;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.mdct-readout,
|
|
264
|
+
.mdct-metrics,
|
|
265
|
+
.mdct-threshold,
|
|
266
|
+
.mdct-speed-row {
|
|
267
|
+
padding-bottom: 1rem;
|
|
268
|
+
border-bottom: 1px solid var(--mdct-line);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.mdct-readout {
|
|
272
|
+
display: grid;
|
|
273
|
+
gap: 0.2rem;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.mdct-readout span,
|
|
277
|
+
.mdct-threshold span,
|
|
278
|
+
.mdct-speed-row span,
|
|
279
|
+
.mdct-log-head span,
|
|
280
|
+
.mdct-metric span {
|
|
281
|
+
color: var(--mdct-muted);
|
|
282
|
+
font-size: 0.72rem;
|
|
283
|
+
font-weight: 900;
|
|
284
|
+
text-transform: uppercase;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.mdct-readout strong {
|
|
288
|
+
color: var(--mdct-violet);
|
|
289
|
+
font-size: clamp(2.4rem, 6vw, 3.2rem);
|
|
290
|
+
font-weight: 950;
|
|
291
|
+
line-height: 0.95;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.mdct-readout small {
|
|
295
|
+
color: var(--mdct-green);
|
|
296
|
+
font-size: 0.78rem;
|
|
297
|
+
font-weight: 800;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.mdct-readout small[data-state='warning'] {
|
|
301
|
+
color: var(--mdct-red);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.mdct-metrics,
|
|
305
|
+
.mdct-speed-row {
|
|
306
|
+
display: grid;
|
|
307
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
308
|
+
gap: 1rem;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.mdct-metric,
|
|
312
|
+
.mdct-speed-row div {
|
|
313
|
+
display: grid;
|
|
314
|
+
gap: 0.45rem;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.mdct-metric strong {
|
|
318
|
+
font-size: 1.35rem;
|
|
319
|
+
line-height: 1;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.mdct-metric-total strong,
|
|
323
|
+
.mdct-threshold b {
|
|
324
|
+
color: var(--mdct-blue);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.mdct-metric-alert strong {
|
|
328
|
+
color: var(--mdct-red);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.mdct-threshold {
|
|
332
|
+
display: grid;
|
|
333
|
+
grid-template-columns: 1fr auto;
|
|
334
|
+
gap: 0.65rem;
|
|
335
|
+
align-items: center;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.mdct-threshold input {
|
|
339
|
+
grid-column: 1 / -1;
|
|
340
|
+
width: 100%;
|
|
341
|
+
accent-color: var(--mdct-blue);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.mdct-threshold b {
|
|
345
|
+
font-size: 0.82rem;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.mdct-speed-row strong {
|
|
349
|
+
color: var(--mdct-ink);
|
|
350
|
+
font-size: 1rem;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.mdct-log-head {
|
|
354
|
+
display: flex;
|
|
355
|
+
align-items: center;
|
|
356
|
+
justify-content: space-between;
|
|
357
|
+
gap: 0.5rem;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.mdct-reset {
|
|
361
|
+
border: 1px solid var(--mdct-line-strong);
|
|
362
|
+
border-radius: 0.45rem;
|
|
363
|
+
padding: 0.52rem 1rem;
|
|
364
|
+
background: transparent;
|
|
365
|
+
color: var(--mdct-muted);
|
|
366
|
+
font-size: 0.78rem;
|
|
367
|
+
font-weight: 900;
|
|
368
|
+
cursor: pointer;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.mdct-reset:hover {
|
|
372
|
+
border-color: var(--mdct-blue);
|
|
373
|
+
color: var(--mdct-blue);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.mdct-log {
|
|
377
|
+
list-style: none;
|
|
378
|
+
margin: 0;
|
|
379
|
+
padding: 0;
|
|
380
|
+
display: flex;
|
|
381
|
+
flex-wrap: wrap;
|
|
382
|
+
gap: 0.45rem;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.mdct-log-item,
|
|
386
|
+
.mdct-empty {
|
|
387
|
+
display: inline-flex;
|
|
388
|
+
align-items: center;
|
|
389
|
+
gap: 0.42rem;
|
|
390
|
+
min-height: 1.85rem;
|
|
391
|
+
padding: 0.35rem 0.55rem;
|
|
392
|
+
border: 1px solid var(--mdct-line);
|
|
393
|
+
border-radius: 999rem;
|
|
394
|
+
background: var(--mdct-chip-bg);
|
|
395
|
+
font-size: 0.72rem;
|
|
396
|
+
font-weight: 900;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.mdct-log-item.clean b {
|
|
400
|
+
color: var(--mdct-green);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.mdct-log-item.suspect b {
|
|
404
|
+
color: var(--mdct-red);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.mdct-log-item span,
|
|
408
|
+
.mdct-log-item em,
|
|
409
|
+
.mdct-empty {
|
|
410
|
+
color: var(--mdct-muted);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.mdct-log-item em {
|
|
414
|
+
font-style: normal;
|
|
415
|
+
opacity: 0.76;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
@media (min-width: 780px) {
|
|
419
|
+
.mdct-card {
|
|
420
|
+
padding: 1.4rem;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.mdct-stage {
|
|
424
|
+
grid-template-columns: minmax(0, 1.45fr) minmax(18rem, 0.72fr);
|
|
425
|
+
align-items: stretch;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.mdct-target {
|
|
429
|
+
min-height: 27rem;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
@media (max-width: 520px) {
|
|
434
|
+
.mdct-card {
|
|
435
|
+
padding: 1rem;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.mdct-target {
|
|
439
|
+
min-height: 22rem;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.mdct-mouse {
|
|
443
|
+
width: min(78vw, 18rem);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
body.is-widget .mdct-card {
|
|
448
|
+
width: 100%;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
.theme-dark .mdct-root {
|
|
452
|
+
--mdct-ink: #f5f7fb;
|
|
453
|
+
--mdct-muted: #8f97a8;
|
|
454
|
+
--mdct-panel: #11151c;
|
|
455
|
+
--mdct-line: rgba(145, 154, 174, 0.2);
|
|
456
|
+
--mdct-line-strong: rgba(145, 154, 174, 0.34);
|
|
457
|
+
--mdct-green: #14d69b;
|
|
458
|
+
--mdct-red: #ff3f6d;
|
|
459
|
+
--mdct-violet: #9c7bff;
|
|
460
|
+
--mdct-mouse: #1a202b;
|
|
461
|
+
--mdct-mouse-hi: #252c39;
|
|
462
|
+
--mdct-button-bg: rgba(255, 255, 255, 0.045);
|
|
463
|
+
--mdct-button-border: rgba(255, 255, 255, 0.08);
|
|
464
|
+
--mdct-grid: rgba(47, 134, 255, 0.035);
|
|
465
|
+
--mdct-target-text: rgba(245, 247, 251, 0.68);
|
|
466
|
+
--mdct-chip-bg: rgba(255, 255, 255, 0.025);
|
|
467
|
+
--mdct-card-highlight: rgba(255, 255, 255, 0.035);
|
|
468
|
+
--mdct-shadow: rgba(0, 0, 0, 0.5);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.theme-dark .mdct-mouse {
|
|
472
|
+
background:
|
|
473
|
+
linear-gradient(90deg, transparent calc(50% - 1px), rgba(255, 255, 255, 0.12) calc(50% - 1px), rgba(255, 255, 255, 0.12) calc(50% + 1px), transparent calc(50% + 1px)),
|
|
474
|
+
linear-gradient(145deg, var(--mdct-mouse-hi), var(--mdct-mouse));
|
|
475
|
+
box-shadow:
|
|
476
|
+
0 2rem 4rem rgba(0, 0, 0, 0.32),
|
|
477
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.11),
|
|
478
|
+
inset 0 -3rem 4rem rgba(0, 0, 0, 0.24);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
.theme-dark .mdct-cable {
|
|
482
|
+
background: linear-gradient(transparent, rgba(143, 151, 168, 0.32));
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.theme-dark .mdct-palm {
|
|
486
|
+
border-color: rgba(143, 151, 168, 0.11);
|
|
487
|
+
background: radial-gradient(circle at 50% 10%, rgba(255, 255, 255, 0.04), transparent 62%);
|
|
488
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { mouseDoubleClickTest } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const content = await mouseDoubleClickTest.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface MouseDoubleClickTestUI extends Record<string, string> {
|
|
2
|
+
badge: string;
|
|
3
|
+
clickTarget: string;
|
|
4
|
+
clickTargetHint: string;
|
|
5
|
+
totalClicks: string;
|
|
6
|
+
suspiciousClicks: string;
|
|
7
|
+
fastestGap: string;
|
|
8
|
+
healthScore: string;
|
|
9
|
+
thresholdLabel: string;
|
|
10
|
+
thresholdUnit: string;
|
|
11
|
+
cleanEvent: string;
|
|
12
|
+
suspiciousEvent: string;
|
|
13
|
+
reset: string;
|
|
14
|
+
statusIdle: string;
|
|
15
|
+
statusClean: string;
|
|
16
|
+
statusWarning: string;
|
|
17
|
+
lastGap: string;
|
|
18
|
+
logTitle: string;
|
|
19
|
+
emptyLog: string;
|
|
20
|
+
leftButton: string;
|
|
21
|
+
middleButton: string;
|
|
22
|
+
rightButton: string;
|
|
23
|
+
backButton: string;
|
|
24
|
+
forwardButton: string;
|
|
25
|
+
otherButton: string;
|
|
26
|
+
}
|
|
@@ -101,17 +101,17 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
101
101
|
{ type: 'title', text: 'Niveaux de Taux de Sondage et Leurs Usages', level: 3 },
|
|
102
102
|
{
|
|
103
103
|
type: 'paragraph',
|
|
104
|
-
html: "<strong>125 Hz</strong> -La souris communique toutes les 8 ms. Parfait pour un usage bureautique, mais saccadé sur un écran 144Hz. <strong>1000 Hz</strong> -L'étalon-or du gaming
|
|
104
|
+
html: "<strong>125 Hz</strong> -La souris communique toutes les 8 ms. Parfait pour un usage bureautique, mais saccadé sur un écran 144Hz. <strong>1000 Hz</strong> -L'étalon-or du gaming: communication toutes les 1 ms, mouvement fluide. <strong>8000 Hz</strong> -Technologie de pointe (Razer, Logitech), nécessite un processeur puissant.",
|
|
105
105
|
},
|
|
106
106
|
{ type: 'title', text: 'Pourquoi mes Hz fluctuent-ils ?', level: 3 },
|
|
107
107
|
{
|
|
108
108
|
type: 'paragraph',
|
|
109
109
|
html: "Tout à fait normal. La plupart des souris modernes ont un taux de sondage dynamique pour économiser l'énergie. En déplaçant lentement la souris, elle envoie moins de rapports car il y a moins de nouvelles données. Seuls des mouvements rapides et continus poussent le capteur à son vrai pic maximum.",
|
|
110
110
|
},
|
|
111
|
-
{ type: 'title', text: 'Taux de Sondage vs DPI
|
|
111
|
+
{ type: 'title', text: 'Taux de Sondage vs DPI: La Grande Confusion', level: 3 },
|
|
112
112
|
{
|
|
113
113
|
type: 'paragraph',
|
|
114
|
-
html: "<strong>DPI (Dots Per Inch)</strong> est la
|
|
114
|
+
html: "<strong>DPI (Dots Per Inch)</strong> est la sensibilité: combien de pixels le curseur parcourt par pouce de déplacement physique. <strong>Hz (Taux de Sondage)</strong> est la fréquence de mise à jour: avec quelle fluidité et actualité ce mouvement est reporté. Les deux paramètres sont indépendants et complémentaires.",
|
|
115
115
|
},
|
|
116
116
|
],
|
|
117
117
|
ui: {
|
|
@@ -96,7 +96,7 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
96
96
|
{ type: 'title', text: 'Definitywny Przewodnik po Polling Rate', level: 2 },
|
|
97
97
|
{
|
|
98
98
|
type: 'paragraph',
|
|
99
|
-
html: 'Gdy fizycznie poruszasz myszką po podkładce, ten analogowy ruch musi zostać przetłumaczony na sygnały cyfrowe zrozumiałe dla komputera. <strong>Polling Rate</strong> to częstotliwość, z jaką mysz
|
|
99
|
+
html: 'Gdy fizycznie poruszasz myszką po podkładce, ten analogowy ruch musi zostać przetłumaczony na sygnały cyfrowe zrozumiałe dla komputera. <strong>Polling Rate</strong> to częstotliwość, z jaką mysz "raportuje" swoją pozycję do PC. Mierzy się ją w Hercach (Hz).',
|
|
100
100
|
},
|
|
101
101
|
{ type: 'title', text: 'Poziomy Polling Rate i ich zastosowania', level: 3 },
|
|
102
102
|
{
|
|
@@ -96,7 +96,7 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
96
96
|
{ type: 'title', text: 'Полное руководство по частоте опроса мыши', level: 2 },
|
|
97
97
|
{
|
|
98
98
|
type: 'paragraph',
|
|
99
|
-
html: 'Когда вы физически перемещаете мышь по коврику, это аналоговое движение должно быть преобразовано в цифровые сигналы, которые понимает ваш компьютер. <strong>Polling Rate</strong> -это частота, с которой мышь
|
|
99
|
+
html: 'Когда вы физически перемещаете мышь по коврику, это аналоговое движение должно быть преобразовано в цифровые сигналы, которые понимает ваш компьютер. <strong>Polling Rate</strong> -это частота, с которой мышь "сообщает" свою позицию ПК. Она измеряется в Герцах (Гц).',
|
|
100
100
|
},
|
|
101
101
|
{ type: 'title', text: 'Уровни частоты опроса и их использование', level: 3 },
|
|
102
102
|
{
|
|
@@ -96,7 +96,7 @@ export const content: ToolLocaleContent<TestRatonUI> = {
|
|
|
96
96
|
{ type: 'title', text: '鼠标回报率权威指南', level: 2 },
|
|
97
97
|
{
|
|
98
98
|
type: 'paragraph',
|
|
99
|
-
html: '当您在鼠标垫上物理移动鼠标时,这种模拟运动必须转换为电脑理解的数字信号。<strong>回报率 (Polling Rate)</strong>
|
|
99
|
+
html: '当您在鼠标垫上物理移动鼠标时,这种模拟运动必须转换为电脑理解的数字信号。<strong>回报率 (Polling Rate)</strong> 是鼠标向电脑"报告"其位置的频率。它以赫兹 (Hz) 为单位。',
|
|
100
100
|
},
|
|
101
101
|
{ type: 'title', text: '回报率等级及其用途', level: 3 },
|
|
102
102
|
{
|
|
@@ -83,19 +83,19 @@ export class RatonManager {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
private updateUI(hz: number, avg: number): void {
|
|
86
|
-
const { max, avg: avgEl, placeholder } = this.el;
|
|
86
|
+
const { max, avg: avgEl, placeholder, area } = this.el;
|
|
87
|
+
const rect = area?.getBoundingClientRect();
|
|
87
88
|
if (max) max.textContent = Math.round(this.maxHz).toString();
|
|
88
89
|
if (avgEl) avgEl.textContent = Math.round(avg).toString();
|
|
89
90
|
if (placeholder) placeholder.style.opacity = '0';
|
|
90
|
-
this.updateFollower(hz);
|
|
91
|
+
this.updateFollower(hz, rect);
|
|
91
92
|
this.updateGraph();
|
|
92
93
|
}
|
|
93
94
|
|
|
94
|
-
private updateFollower(hz: number): void {
|
|
95
|
-
const { follower
|
|
96
|
-
if (!follower || !this.lastMouseEvent || !
|
|
95
|
+
private updateFollower(hz: number, rect: DOMRect | undefined): void {
|
|
96
|
+
const { follower } = this.el;
|
|
97
|
+
if (!follower || !this.lastMouseEvent || !rect) return;
|
|
97
98
|
follower.textContent = `${Math.round(hz)} Hz`;
|
|
98
|
-
const rect = area.getBoundingClientRect();
|
|
99
99
|
const x: number = this.lastMouseEvent.clientX - rect.left + 15;
|
|
100
100
|
const y: number = this.lastMouseEvent.clientY - rect.top + 15;
|
|
101
101
|
follower.style.transform = `translate(${x}px, ${y}px)`;
|
|
@@ -122,7 +122,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
|
122
122
|
{
|
|
123
123
|
type: 'list',
|
|
124
124
|
items: [
|
|
125
|
-
'Laden Sie diesen Detektor
|
|
125
|
+
'Laden Sie diesen Detektor - die Messung beginnt sofort',
|
|
126
126
|
'Wählen Sie zwischen dem schnellen (3s) oder dem stabilen (10s) Messmodus',
|
|
127
127
|
'Lesen Sie die Hz-Zahl Ihres Monitors auf der Tachometerskala ab',
|
|
128
128
|
'Vergleichen Sie sie mit Industriestandards (60, 75, 120, 144, 240, 360 Hz)',
|
|
@@ -152,7 +152,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
|
152
152
|
{
|
|
153
153
|
type: 'list',
|
|
154
154
|
items: [
|
|
155
|
-
'Prüfen Sie die HDMI/DisplayPort-Kabelverbindungen
|
|
155
|
+
'Prüfen Sie die HDMI/DisplayPort-Kabelverbindungen - lose Kabel reduzieren die Bandbreite',
|
|
156
156
|
'Aktualisieren Sie Ihre GPU-Treiber (NVIDIA, AMD, Intel)',
|
|
157
157
|
'Überprüfen Sie die Betriebssystem-Anzeigeeinstellungen, um sicherzustellen, dass eine hohe Bildwiederholfrequenz aktiviert ist',
|
|
158
158
|
'Probieren Sie verschiedene Kabel oder Anschlüsse an Ihrem Monitor aus',
|
|
@@ -166,7 +166,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
168
|
type: 'paragraph',
|
|
169
|
-
html: 'Dieses Tool verwendet die requestAnimationFrame-API des Browsers, die direkt mit dem Aktualisierungszyklus Ihres Monitors synchronisiert wird. Durch Messen der Zeit zwischen den Animationsframes berechnen wir Ihre exakte Bildwiederholfrequenz mit hoher Präzision
|
|
169
|
+
html: 'Dieses Tool verwendet die requestAnimationFrame-API des Browsers, die direkt mit dem Aktualisierungszyklus Ihres Monitors synchronisiert wird. Durch Messen der Zeit zwischen den Animationsframes berechnen wir Ihre exakte Bildwiederholfrequenz mit hoher Präzision - keine spezielle Hardware erforderlich.',
|
|
170
170
|
},
|
|
171
171
|
],
|
|
172
172
|
ui: {
|
|
@@ -122,7 +122,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
|
122
122
|
{
|
|
123
123
|
type: 'list',
|
|
124
124
|
items: [
|
|
125
|
-
'Load this detector
|
|
125
|
+
'Load this detector-measurement begins immediately',
|
|
126
126
|
'Choose between Fast (3s) or Stable (10s) measurement mode',
|
|
127
127
|
'Read your monitor\'s Hz from the speedometer dial',
|
|
128
128
|
'Compare against industry standards (60, 75, 120, 144, 240, 360Hz)',
|
|
@@ -152,7 +152,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
|
152
152
|
{
|
|
153
153
|
type: 'list',
|
|
154
154
|
items: [
|
|
155
|
-
'Check HDMI/DisplayPort cable connections
|
|
155
|
+
'Check HDMI/DisplayPort cable connections-loose cables reduce bandwidth',
|
|
156
156
|
'Update your GPU drivers (NVIDIA, AMD, Intel)',
|
|
157
157
|
'Check OS display settings to ensure high refresh rate is enabled',
|
|
158
158
|
'Try different cables or ports on your monitor',
|
|
@@ -166,7 +166,7 @@ export const content: ToolLocaleContent<RefreshRateDetectorUI> = {
|
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
168
|
type: 'paragraph',
|
|
169
|
-
html: 'This tool uses the browser\'s requestAnimationFrame API, which synchronizes directly with your monitor\'s refresh cycle. By measuring the time between animation frames, we calculate your exact refresh rate with high precision
|
|
169
|
+
html: 'This tool uses the browser\'s requestAnimationFrame API, which synchronizes directly with your monitor\'s refresh cycle. By measuring the time between animation frames, we calculate your exact refresh rate with high precision-no special hardware needed.',
|
|
170
170
|
},
|
|
171
171
|
],
|
|
172
172
|
ui: {
|