@jjlmoya/utils-hardware 1.18.0 → 1.20.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 (62) 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 +2 -2
  6. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  7. package/src/tests/tool_validation.test.ts +2 -2
  8. package/src/tool/batteryHealthEstimator/component.astro +3 -3
  9. package/src/tool/gamepadTest/component.astro +4 -3
  10. package/src/tool/gamepadVibrationTester/component.astro +3 -3
  11. package/src/tool/keyboardTest/component.astro +6 -1
  12. package/src/tool/monitorGhostingTest/bibliography.astro +14 -0
  13. package/src/tool/monitorGhostingTest/bibliography.ts +20 -0
  14. package/src/tool/monitorGhostingTest/component.astro +156 -0
  15. package/src/tool/monitorGhostingTest/entry.ts +29 -0
  16. package/src/tool/monitorGhostingTest/i18n/de.ts +293 -0
  17. package/src/tool/monitorGhostingTest/i18n/en.ts +293 -0
  18. package/src/tool/monitorGhostingTest/i18n/es.ts +293 -0
  19. package/src/tool/monitorGhostingTest/i18n/fr.ts +293 -0
  20. package/src/tool/monitorGhostingTest/i18n/id.ts +293 -0
  21. package/src/tool/monitorGhostingTest/i18n/it.ts +293 -0
  22. package/src/tool/monitorGhostingTest/i18n/ja.ts +293 -0
  23. package/src/tool/monitorGhostingTest/i18n/ko.ts +293 -0
  24. package/src/tool/monitorGhostingTest/i18n/nl.ts +293 -0
  25. package/src/tool/monitorGhostingTest/i18n/pl.ts +293 -0
  26. package/src/tool/monitorGhostingTest/i18n/pt.ts +293 -0
  27. package/src/tool/monitorGhostingTest/i18n/ru.ts +293 -0
  28. package/src/tool/monitorGhostingTest/i18n/sv.ts +293 -0
  29. package/src/tool/monitorGhostingTest/i18n/tr.ts +293 -0
  30. package/src/tool/monitorGhostingTest/i18n/zh.ts +293 -0
  31. package/src/tool/monitorGhostingTest/index.ts +9 -0
  32. package/src/tool/monitorGhostingTest/logic.ts +195 -0
  33. package/src/tool/monitorGhostingTest/monitor-ghosting-test.css +546 -0
  34. package/src/tool/monitorGhostingTest/seo.astro +15 -0
  35. package/src/tool/monitorGhostingTest/ui.ts +30 -0
  36. package/src/tool/mouseDoubleClickTest/bibliography.astro +14 -0
  37. package/src/tool/mouseDoubleClickTest/bibliography.ts +16 -0
  38. package/src/tool/mouseDoubleClickTest/component.astro +135 -0
  39. package/src/tool/mouseDoubleClickTest/entry.ts +29 -0
  40. package/src/tool/mouseDoubleClickTest/i18n/de.ts +274 -0
  41. package/src/tool/mouseDoubleClickTest/i18n/en.ts +274 -0
  42. package/src/tool/mouseDoubleClickTest/i18n/es.ts +274 -0
  43. package/src/tool/mouseDoubleClickTest/i18n/fr.ts +274 -0
  44. package/src/tool/mouseDoubleClickTest/i18n/id.ts +285 -0
  45. package/src/tool/mouseDoubleClickTest/i18n/it.ts +274 -0
  46. package/src/tool/mouseDoubleClickTest/i18n/ja.ts +274 -0
  47. package/src/tool/mouseDoubleClickTest/i18n/ko.ts +274 -0
  48. package/src/tool/mouseDoubleClickTest/i18n/nl.ts +274 -0
  49. package/src/tool/mouseDoubleClickTest/i18n/pl.ts +274 -0
  50. package/src/tool/mouseDoubleClickTest/i18n/pt.ts +274 -0
  51. package/src/tool/mouseDoubleClickTest/i18n/ru.ts +274 -0
  52. package/src/tool/mouseDoubleClickTest/i18n/sv.ts +274 -0
  53. package/src/tool/mouseDoubleClickTest/i18n/tr.ts +274 -0
  54. package/src/tool/mouseDoubleClickTest/i18n/zh.ts +274 -0
  55. package/src/tool/mouseDoubleClickTest/index.ts +9 -0
  56. package/src/tool/mouseDoubleClickTest/logic.ts +258 -0
  57. package/src/tool/mouseDoubleClickTest/mouse-double-click-test.css +488 -0
  58. package/src/tool/mouseDoubleClickTest/seo.astro +15 -0
  59. package/src/tool/mouseDoubleClickTest/ui.ts +26 -0
  60. package/src/tool/mousePollingTest/logic/RatonManager.ts +6 -6
  61. package/src/tool/toneGenerator/component.astro +7 -7
  62. package/src/tools.ts +3 -2
@@ -0,0 +1,546 @@
1
+ .mgt-root {
2
+ --mgt-ink: #111827;
3
+ --mgt-muted: #667085;
4
+ --mgt-panel: #f8fafc;
5
+ --mgt-line: rgba(102, 112, 133, 0.18);
6
+ --mgt-line-strong: rgba(102, 112, 133, 0.32);
7
+ --mgt-blue: #2f86ff;
8
+ --mgt-green: #00a878;
9
+ --mgt-red: #e83f64;
10
+ --mgt-violet: #7c5cff;
11
+ --mgt-screen: #e9eef6;
12
+ --mgt-screen-grid: rgba(47, 134, 255, 0.08);
13
+ --mgt-object-ink: #fff;
14
+ --mgt-object-paper: #05070c;
15
+ --mgt-object-edge: rgba(255, 255, 255, 0.9);
16
+ --mgt-object-glow: rgba(255, 255, 255, 0.28);
17
+ --mgt-text-shadow:
18
+ -1px -1px 0 #020617,
19
+ 1px -1px 0 #020617,
20
+ -1px 1px 0 #020617,
21
+ 1px 1px 0 #020617,
22
+ 0 0 0.35rem rgba(2, 6, 23, 0.78);
23
+ --mgt-shadow: rgba(16, 24, 40, 0.18);
24
+ --mgt-duration: 2.5s;
25
+ --mgt-trail-opacity: 0.5;
26
+ --mgt-target-width: 6rem;
27
+ --mgt-target-height: 4.25rem;
28
+
29
+ width: 100%;
30
+ color: var(--mgt-ink);
31
+ }
32
+
33
+ .mgt-root *,
34
+ .mgt-root *::before,
35
+ .mgt-root *::after {
36
+ box-sizing: border-box;
37
+ }
38
+
39
+ .mgt-card {
40
+ width: min(100%, 64rem);
41
+ margin: 0 auto;
42
+ padding: 1.25rem;
43
+ border: 1px solid var(--mgt-line);
44
+ border-radius: 1.25rem;
45
+ background: var(--mgt-panel);
46
+ box-shadow: 0 24px 70px -42px var(--mgt-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.75);
47
+ overflow: hidden;
48
+ }
49
+
50
+ .mgt-stage {
51
+ display: grid;
52
+ gap: 1.2rem;
53
+ }
54
+
55
+ .mgt-monitor {
56
+ min-height: 22rem;
57
+ padding: 0.8rem;
58
+ border-radius: 0.8rem;
59
+ background: linear-gradient(145deg, #d7dee9, #f8fafc);
60
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.76), 0 1.5rem 3rem rgba(16, 24, 40, 0.14);
61
+ }
62
+
63
+ .mgt-monitor:fullscreen {
64
+ width: 100vw;
65
+ height: 100vh;
66
+ padding: 0;
67
+ border-radius: 0;
68
+ background: #000;
69
+ }
70
+
71
+ .mgt-monitor:fullscreen .mgt-screen {
72
+ min-height: 100vh;
73
+ border: 0;
74
+ border-radius: 0;
75
+ }
76
+
77
+ .mgt-screen {
78
+ height: 100%;
79
+ min-height: 20.5rem;
80
+ border: 1px solid var(--mgt-line-strong);
81
+ border-radius: 0.72rem;
82
+ background:
83
+ linear-gradient(var(--mgt-screen-grid) 1px, transparent 1px),
84
+ linear-gradient(90deg, var(--mgt-screen-grid) 1px, transparent 1px),
85
+ var(--mgt-screen);
86
+ background-size: 3.4rem 3.4rem, 3.4rem 3.4rem, auto;
87
+ position: relative;
88
+ overflow: hidden;
89
+ }
90
+
91
+ .mgt-root[data-background='dark'] {
92
+ --mgt-screen: #020617;
93
+ --mgt-screen-grid: rgba(255, 255, 255, 0.035);
94
+ --mgt-object-ink: #fff;
95
+ --mgt-object-paper: #05070c;
96
+ --mgt-object-edge: rgba(255, 255, 255, 0.9);
97
+ --mgt-object-glow: rgba(255, 255, 255, 0.24);
98
+ }
99
+
100
+ .mgt-root[data-background='light'] {
101
+ --mgt-screen: #fff;
102
+ --mgt-screen-grid: rgba(2, 6, 23, 0.025);
103
+ --mgt-object-ink: #020617;
104
+ --mgt-object-paper: #fff;
105
+ --mgt-object-edge: rgba(2, 6, 23, 0.9);
106
+ --mgt-object-glow: rgba(2, 6, 23, 0.18);
107
+ --mgt-text-shadow:
108
+ -1px -1px 0 #fff,
109
+ 1px -1px 0 #fff,
110
+ -1px 1px 0 #fff,
111
+ 1px 1px 0 #fff,
112
+ 0 0 0.35rem rgba(255, 255, 255, 0.82);
113
+ }
114
+
115
+ .mgt-root[data-background='grid'] {
116
+ --mgt-screen: #f8fbff;
117
+ --mgt-screen-grid: rgba(2, 6, 23, 0.16);
118
+ --mgt-object-ink: #020617;
119
+ --mgt-object-paper: #fff;
120
+ --mgt-object-edge: rgba(2, 6, 23, 0.9);
121
+ --mgt-object-glow: rgba(2, 6, 23, 0.2);
122
+ --mgt-text-shadow:
123
+ -1px -1px 0 #fff,
124
+ 1px -1px 0 #fff,
125
+ -1px 1px 0 #fff,
126
+ 1px 1px 0 #fff,
127
+ 0 0 0.35rem rgba(255, 255, 255, 0.82);
128
+ }
129
+
130
+ .mgt-ruler {
131
+ position: absolute;
132
+ inset: auto 1rem 1rem;
133
+ height: 1px;
134
+ background: repeating-linear-gradient(90deg, rgba(102, 112, 133, 0.4) 0 1px, transparent 1px 2rem);
135
+ }
136
+
137
+ .mgt-track {
138
+ position: absolute;
139
+ left: 8%;
140
+ right: 8%;
141
+ top: 44%;
142
+ height: 8rem;
143
+ transform: translateY(-50%);
144
+ }
145
+
146
+ .mgt-target-object,
147
+ .mgt-ghost {
148
+ position: absolute;
149
+ top: 50%;
150
+ left: 0;
151
+ width: var(--mgt-target-width);
152
+ height: var(--mgt-target-height);
153
+ transform: translateY(-50%);
154
+ animation: mgt-travel var(--mgt-duration) linear infinite;
155
+ }
156
+
157
+ .mgt-ghost {
158
+ --mgt-ghost-offset: -1rem;
159
+
160
+ border-radius: 0.6rem;
161
+ background:
162
+ linear-gradient(90deg, rgba(47, 134, 255, 0), rgba(47, 134, 255, 0.24) 18%, rgba(20, 214, 155, 0.16) 52%, rgba(124, 92, 255, 0));
163
+ filter: blur(0.18rem);
164
+ opacity: calc(var(--mgt-trail-opacity) * 0.56);
165
+ transform: translate(var(--mgt-ghost-offset), -50%);
166
+ }
167
+
168
+ .ghost-1 {
169
+ --mgt-ghost-offset: -0.75rem;
170
+
171
+ opacity: calc(var(--mgt-trail-opacity) * 0.46);
172
+ }
173
+
174
+ .ghost-2 {
175
+ --mgt-ghost-offset: -1.55rem;
176
+
177
+ opacity: calc(var(--mgt-trail-opacity) * 0.35);
178
+ }
179
+
180
+ .ghost-3 {
181
+ --mgt-ghost-offset: -2.45rem;
182
+
183
+ opacity: calc(var(--mgt-trail-opacity) * 0.25);
184
+ }
185
+
186
+ .ghost-4 {
187
+ --mgt-ghost-offset: -3.45rem;
188
+
189
+ opacity: calc(var(--mgt-trail-opacity) * 0.17);
190
+ }
191
+
192
+ .ghost-5 {
193
+ --mgt-ghost-offset: -4.55rem;
194
+
195
+ opacity: calc(var(--mgt-trail-opacity) * 0.1);
196
+ }
197
+
198
+ .mgt-target-object {
199
+ display: grid;
200
+ grid-template-columns: 1fr;
201
+ align-items: stretch;
202
+ overflow: hidden;
203
+ border: 1px solid rgba(148, 163, 184, 0.5);
204
+ border-radius: 0.6rem;
205
+ background: var(--mgt-object-paper);
206
+ box-shadow: 0 0 0 1px var(--mgt-object-edge), 0 0 1.7rem var(--mgt-object-glow);
207
+ z-index: 2;
208
+ }
209
+
210
+ .mgt-bars {
211
+ background:
212
+ linear-gradient(90deg, var(--mgt-red) 0 0.18rem, transparent 0.18rem),
213
+ repeating-linear-gradient(90deg, var(--mgt-object-ink) 0 0.22rem, var(--mgt-object-paper) 0.22rem 0.44rem);
214
+ background-size: 100% 100%, auto, auto;
215
+ }
216
+
217
+ .mgt-word {
218
+ display: none;
219
+ place-items: center;
220
+ padding: 0 0.15rem;
221
+ color: var(--mgt-object-ink);
222
+ font-size: 2.15rem;
223
+ font-weight: 950;
224
+ letter-spacing: 0;
225
+ line-height: 1;
226
+ text-shadow: var(--mgt-text-shadow);
227
+ }
228
+
229
+ .mgt-ufo {
230
+ display: none;
231
+ position: relative;
232
+ grid-column: 1 / -1;
233
+ place-items: center;
234
+ }
235
+
236
+ .mgt-ufo-dome {
237
+ position: absolute;
238
+ top: 0.1rem;
239
+ width: 2.7rem;
240
+ height: 1.25rem;
241
+ border: 1px solid rgba(47, 134, 255, 0.38);
242
+ border-radius: 999rem 999rem 0.45rem 0.45rem;
243
+ background: radial-gradient(circle at 38% 28%, #fff 0 0.28rem, transparent 0.3rem), linear-gradient(145deg, #e9fbff, #7fc8ff);
244
+ box-shadow: inset 0 -0.2rem 0 rgba(47, 134, 255, 0.14);
245
+ }
246
+
247
+ .mgt-ufo-body {
248
+ position: absolute;
249
+ bottom: 0.32rem;
250
+ width: 6.35rem;
251
+ height: 1.45rem;
252
+ border-radius: 999rem;
253
+ background:
254
+ radial-gradient(circle at 24% 50%, #bfffe9 0 0.18rem, transparent 0.2rem),
255
+ radial-gradient(circle at 50% 50%, #bfffe9 0 0.18rem, transparent 0.2rem),
256
+ radial-gradient(circle at 76% 50%, #bfffe9 0 0.18rem, transparent 0.2rem),
257
+ linear-gradient(90deg, #1d4ed8, var(--mgt-blue) 48%, var(--mgt-violet));
258
+ box-shadow: 0 0 1.35rem rgba(47, 134, 255, 0.42);
259
+ }
260
+
261
+ .mgt-ufo-light {
262
+ position: absolute;
263
+ bottom: 0;
264
+ width: 0.65rem;
265
+ height: 0.65rem;
266
+ border-radius: 50%;
267
+ background: #cafff0;
268
+ box-shadow: 0 0 0.9rem rgba(20, 214, 155, 0.88);
269
+ }
270
+
271
+ .mgt-root[data-pattern='text'] .mgt-target-object {
272
+ --mgt-target-width: 8.75rem;
273
+ --mgt-target-height: 3.1rem;
274
+
275
+ grid-template-columns: 1fr;
276
+ overflow: visible;
277
+ border: 0;
278
+ background: transparent;
279
+ box-shadow: none;
280
+ }
281
+
282
+ .mgt-root[data-pattern='text'] .mgt-bars {
283
+ display: none;
284
+ }
285
+
286
+ .mgt-root[data-pattern='text'] .mgt-word {
287
+ display: grid;
288
+ font-size: 1.35rem;
289
+ }
290
+
291
+ .mgt-root[data-pattern='ufo'] .mgt-target-object {
292
+ --mgt-target-width: 6.5rem;
293
+ --mgt-target-height: 3rem;
294
+
295
+ display: grid;
296
+ place-items: center;
297
+ border: 0;
298
+ background: transparent;
299
+ box-shadow: none;
300
+ }
301
+
302
+ .mgt-root[data-pattern='ufo'] .mgt-bars,
303
+ .mgt-root[data-pattern='ufo'] .mgt-word {
304
+ display: none;
305
+ }
306
+
307
+ .mgt-root[data-pattern='ufo'] .mgt-ufo {
308
+ display: grid;
309
+ }
310
+
311
+ .mgt-pursuit {
312
+ position: absolute;
313
+ inset: 0;
314
+ pointer-events: none;
315
+ background: linear-gradient(90deg, transparent, rgba(232, 63, 100, 0.08), transparent);
316
+ animation: mgt-pursuit var(--mgt-duration) linear infinite;
317
+ }
318
+
319
+ .mgt-root[data-pursuit='off'] .mgt-pursuit {
320
+ display: none;
321
+ }
322
+
323
+ .mgt-root[data-paused='true'] .mgt-target-object,
324
+ .mgt-root[data-paused='true'] .mgt-ghost,
325
+ .mgt-root[data-paused='true'] .mgt-pursuit {
326
+ animation-play-state: paused;
327
+ }
328
+
329
+ .mgt-screen-actions {
330
+ position: absolute;
331
+ right: 0.9rem;
332
+ bottom: 0.9rem;
333
+ display: flex;
334
+ gap: 0.5rem;
335
+ z-index: 4;
336
+ }
337
+
338
+ .mgt-screen-actions button {
339
+ border: 1px solid rgba(255, 255, 255, 0.24);
340
+ border-radius: 0.45rem;
341
+ padding: 0.5rem 0.75rem;
342
+ background: rgba(17, 24, 39, 0.76);
343
+ color: #fff;
344
+ font-size: 0.74rem;
345
+ font-weight: 900;
346
+ cursor: pointer;
347
+ }
348
+
349
+ @keyframes mgt-travel {
350
+ from { left: 0; }
351
+ to { left: calc(100% - var(--mgt-target-width)); }
352
+ }
353
+
354
+ @keyframes mgt-pursuit {
355
+ from { transform: translateX(-100%); }
356
+ to { transform: translateX(100%); }
357
+ }
358
+
359
+ .mgt-panel {
360
+ display: grid;
361
+ gap: 1rem;
362
+ }
363
+
364
+ .mgt-readout,
365
+ .mgt-control,
366
+ .mgt-select,
367
+ .mgt-toggle,
368
+ .mgt-metrics {
369
+ padding-bottom: 1rem;
370
+ border-bottom: 1px solid var(--mgt-line);
371
+ }
372
+
373
+ .mgt-readout {
374
+ display: grid;
375
+ gap: 0.2rem;
376
+ }
377
+
378
+ .mgt-readout span,
379
+ .mgt-control span,
380
+ .mgt-select span,
381
+ .mgt-metrics span,
382
+ .mgt-toggle b {
383
+ color: var(--mgt-muted);
384
+ font-size: 0.72rem;
385
+ font-weight: 900;
386
+ text-transform: uppercase;
387
+ }
388
+
389
+ .mgt-readout strong {
390
+ color: var(--mgt-violet);
391
+ font-size: clamp(2.4rem, 6vw, 3.2rem);
392
+ font-weight: 950;
393
+ line-height: 0.95;
394
+ }
395
+
396
+ .mgt-readout small,
397
+ .mgt-toggle small,
398
+ .mgt-instructions {
399
+ color: var(--mgt-muted);
400
+ font-size: 0.78rem;
401
+ font-weight: 800;
402
+ }
403
+
404
+ .mgt-control,
405
+ .mgt-select {
406
+ display: grid;
407
+ grid-template-columns: 1fr auto;
408
+ gap: 0.65rem;
409
+ align-items: center;
410
+ }
411
+
412
+ .mgt-control input {
413
+ grid-column: 1 / -1;
414
+ width: 100%;
415
+ accent-color: var(--mgt-blue);
416
+ }
417
+
418
+ .mgt-control b {
419
+ color: var(--mgt-blue);
420
+ font-size: 0.82rem;
421
+ }
422
+
423
+ .mgt-select select {
424
+ padding: 0.45rem 0.7rem;
425
+ border: 1px solid var(--mgt-line-strong);
426
+ border-radius: 0.45rem;
427
+ background: transparent;
428
+ color: var(--mgt-ink);
429
+ font-weight: 800;
430
+ }
431
+
432
+ .mgt-toggle {
433
+ display: flex;
434
+ align-items: center;
435
+ justify-content: space-between;
436
+ gap: 1rem;
437
+ }
438
+
439
+ .mgt-toggle span {
440
+ display: grid;
441
+ gap: 0.25rem;
442
+ }
443
+
444
+ .mgt-toggle input {
445
+ width: 2.8rem;
446
+ height: 1.45rem;
447
+ accent-color: var(--mgt-blue);
448
+ }
449
+
450
+ .mgt-metrics {
451
+ display: grid;
452
+ grid-template-columns: repeat(3, minmax(0, 1fr));
453
+ gap: 1rem;
454
+ }
455
+
456
+ .mgt-metrics div {
457
+ display: grid;
458
+ gap: 0.45rem;
459
+ }
460
+
461
+ .mgt-metrics strong {
462
+ color: var(--mgt-ink);
463
+ font-size: 1rem;
464
+ }
465
+
466
+ .mgt-instructions {
467
+ margin: 0;
468
+ line-height: 1.45;
469
+ }
470
+
471
+ .mgt-reset {
472
+ width: fit-content;
473
+ border: 1px solid var(--mgt-line-strong);
474
+ border-radius: 0.45rem;
475
+ padding: 0.52rem 1rem;
476
+ background: transparent;
477
+ color: var(--mgt-muted);
478
+ font-size: 0.78rem;
479
+ font-weight: 900;
480
+ cursor: pointer;
481
+ }
482
+
483
+ .mgt-reset:hover {
484
+ border-color: var(--mgt-blue);
485
+ color: var(--mgt-blue);
486
+ }
487
+
488
+ .theme-dark .mgt-root {
489
+ --mgt-ink: #f5f7fb;
490
+ --mgt-muted: #8f97a8;
491
+ --mgt-panel: #11151c;
492
+ --mgt-line: rgba(145, 154, 174, 0.2);
493
+ --mgt-line-strong: rgba(145, 154, 174, 0.34);
494
+ --mgt-green: #14d69b;
495
+ --mgt-red: #ff3f6d;
496
+ --mgt-violet: #9c7bff;
497
+ --mgt-screen: #101621;
498
+ --mgt-screen-grid: rgba(47, 134, 255, 0.035);
499
+ --mgt-shadow: rgba(0, 0, 0, 0.5);
500
+ }
501
+
502
+ .theme-dark .mgt-card {
503
+ box-shadow: 0 24px 80px -42px var(--mgt-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.035);
504
+ }
505
+
506
+ .theme-dark .mgt-monitor {
507
+ background: linear-gradient(145deg, #151b26, #0f141d);
508
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05), 0 1.5rem 3rem rgba(0, 0, 0, 0.32);
509
+ }
510
+
511
+ @media (min-width: 820px) {
512
+ .mgt-stage {
513
+ grid-template-columns: minmax(0, 1.55fr) minmax(18rem, 0.78fr);
514
+ align-items: stretch;
515
+ }
516
+
517
+ .mgt-monitor {
518
+ min-height: 29rem;
519
+ }
520
+
521
+ .mgt-screen {
522
+ min-height: 27.4rem;
523
+ }
524
+ }
525
+
526
+ @media (max-width: 560px) {
527
+ .mgt-card {
528
+ padding: 1rem;
529
+ }
530
+
531
+ .mgt-monitor {
532
+ min-height: 17rem;
533
+ }
534
+
535
+ .mgt-screen {
536
+ min-height: 15.4rem;
537
+ }
538
+
539
+ .mgt-metrics {
540
+ grid-template-columns: 1fr;
541
+ }
542
+ }
543
+
544
+ body.is-widget .mgt-card {
545
+ width: 100%;
546
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { monitorGhostingTest } 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 monitorGhostingTest.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,30 @@
1
+ export interface MonitorGhostingTestUI extends Record<string, string> {
2
+ badge: string;
3
+ speedLabel: string;
4
+ pixelsPerSecondUnit: string;
5
+ pixelUnit: string;
6
+ millisecondUnit: string;
7
+ trailLabel: string;
8
+ backgroundLabel: string;
9
+ backgroundDark: string;
10
+ backgroundLight: string;
11
+ backgroundGrid: string;
12
+ patternLabel: string;
13
+ patternBars: string;
14
+ patternText: string;
15
+ patternUfo: string;
16
+ pursuitLabel: string;
17
+ pursuitOn: string;
18
+ pursuitOff: string;
19
+ fullscreen: string;
20
+ exitFullscreen: string;
21
+ pause: string;
22
+ resume: string;
23
+ targetText: string;
24
+ estimatedBlur: string;
25
+ frameStep: string;
26
+ persistence: string;
27
+ sampleCount: string;
28
+ instructions: string;
29
+ reset: string;
30
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { mouseDoubleClickTest } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await mouseDoubleClickTest.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,16 @@
1
+ import type { BibliographyEntry } from '../../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'UI Events: click and dblclick event definitions',
6
+ url: 'https://www.w3.org/TR/uievents/',
7
+ },
8
+ {
9
+ name: 'MDN Web Docs: Element click event',
10
+ url: 'https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event',
11
+ },
12
+ {
13
+ name: 'MDN Web Docs: performance.now()',
14
+ url: 'https://developer.mozilla.org/en-US/docs/Web/API/Performance/now',
15
+ },
16
+ ];