@jjlmoya/utils-hardware 1.24.0 → 1.26.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 (79) hide show
  1. package/package.json +2 -1
  2. package/src/category/index.ts +4 -1
  3. package/src/entries.ts +10 -1
  4. package/src/index.ts +3 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/keyboardChatterTest/bibliography.astro +15 -0
  8. package/src/tool/keyboardChatterTest/bibliography.ts +20 -0
  9. package/src/tool/keyboardChatterTest/component.astro +353 -0
  10. package/src/tool/keyboardChatterTest/entry.ts +30 -0
  11. package/src/tool/keyboardChatterTest/i18n/de.ts +232 -0
  12. package/src/tool/keyboardChatterTest/i18n/en.ts +232 -0
  13. package/src/tool/keyboardChatterTest/i18n/es.ts +232 -0
  14. package/src/tool/keyboardChatterTest/i18n/fr.ts +232 -0
  15. package/src/tool/keyboardChatterTest/i18n/id.ts +232 -0
  16. package/src/tool/keyboardChatterTest/i18n/it.ts +232 -0
  17. package/src/tool/keyboardChatterTest/i18n/ja.ts +232 -0
  18. package/src/tool/keyboardChatterTest/i18n/ko.ts +232 -0
  19. package/src/tool/keyboardChatterTest/i18n/nl.ts +232 -0
  20. package/src/tool/keyboardChatterTest/i18n/pl.ts +232 -0
  21. package/src/tool/keyboardChatterTest/i18n/pt.ts +232 -0
  22. package/src/tool/keyboardChatterTest/i18n/ru.ts +232 -0
  23. package/src/tool/keyboardChatterTest/i18n/sv.ts +232 -0
  24. package/src/tool/keyboardChatterTest/i18n/tr.ts +232 -0
  25. package/src/tool/keyboardChatterTest/i18n/zh.ts +232 -0
  26. package/src/tool/keyboardChatterTest/index.ts +12 -0
  27. package/src/tool/keyboardChatterTest/keyboard-chatter-test.css +512 -0
  28. package/src/tool/keyboardChatterTest/logic.ts +23 -0
  29. package/src/tool/keyboardChatterTest/seo.astro +16 -0
  30. package/src/tool/keyboardChatterTest/ui.ts +34 -0
  31. package/src/tool/webBluetoothBleScanner/bibliography.astro +14 -0
  32. package/src/tool/webBluetoothBleScanner/bibliography.ts +16 -0
  33. package/src/tool/webBluetoothBleScanner/component.astro +339 -0
  34. package/src/tool/webBluetoothBleScanner/entry.ts +29 -0
  35. package/src/tool/webBluetoothBleScanner/i18n/de.ts +233 -0
  36. package/src/tool/webBluetoothBleScanner/i18n/en.ts +233 -0
  37. package/src/tool/webBluetoothBleScanner/i18n/es.ts +233 -0
  38. package/src/tool/webBluetoothBleScanner/i18n/fr.ts +233 -0
  39. package/src/tool/webBluetoothBleScanner/i18n/id.ts +233 -0
  40. package/src/tool/webBluetoothBleScanner/i18n/it.ts +233 -0
  41. package/src/tool/webBluetoothBleScanner/i18n/ja.ts +233 -0
  42. package/src/tool/webBluetoothBleScanner/i18n/ko.ts +233 -0
  43. package/src/tool/webBluetoothBleScanner/i18n/nl.ts +233 -0
  44. package/src/tool/webBluetoothBleScanner/i18n/pl.ts +233 -0
  45. package/src/tool/webBluetoothBleScanner/i18n/pt.ts +233 -0
  46. package/src/tool/webBluetoothBleScanner/i18n/ru.ts +233 -0
  47. package/src/tool/webBluetoothBleScanner/i18n/sv.ts +233 -0
  48. package/src/tool/webBluetoothBleScanner/i18n/tr.ts +233 -0
  49. package/src/tool/webBluetoothBleScanner/i18n/zh.ts +233 -0
  50. package/src/tool/webBluetoothBleScanner/index.ts +11 -0
  51. package/src/tool/webBluetoothBleScanner/logic.ts +79 -0
  52. package/src/tool/webBluetoothBleScanner/seo.astro +15 -0
  53. package/src/tool/webBluetoothBleScanner/ui.ts +41 -0
  54. package/src/tool/webBluetoothBleScanner/web-bluetooth-ble-scanner.css +406 -0
  55. package/src/tool/webUsbSerialMonitor/bibliography.astro +15 -0
  56. package/src/tool/webUsbSerialMonitor/bibliography.ts +18 -0
  57. package/src/tool/webUsbSerialMonitor/component.astro +356 -0
  58. package/src/tool/webUsbSerialMonitor/entry.ts +30 -0
  59. package/src/tool/webUsbSerialMonitor/i18n/de.ts +241 -0
  60. package/src/tool/webUsbSerialMonitor/i18n/en.ts +241 -0
  61. package/src/tool/webUsbSerialMonitor/i18n/es.ts +241 -0
  62. package/src/tool/webUsbSerialMonitor/i18n/fr.ts +241 -0
  63. package/src/tool/webUsbSerialMonitor/i18n/id.ts +241 -0
  64. package/src/tool/webUsbSerialMonitor/i18n/it.ts +241 -0
  65. package/src/tool/webUsbSerialMonitor/i18n/ja.ts +241 -0
  66. package/src/tool/webUsbSerialMonitor/i18n/ko.ts +241 -0
  67. package/src/tool/webUsbSerialMonitor/i18n/nl.ts +241 -0
  68. package/src/tool/webUsbSerialMonitor/i18n/pl.ts +241 -0
  69. package/src/tool/webUsbSerialMonitor/i18n/pt.ts +241 -0
  70. package/src/tool/webUsbSerialMonitor/i18n/ru.ts +241 -0
  71. package/src/tool/webUsbSerialMonitor/i18n/sv.ts +241 -0
  72. package/src/tool/webUsbSerialMonitor/i18n/tr.ts +241 -0
  73. package/src/tool/webUsbSerialMonitor/i18n/zh.ts +241 -0
  74. package/src/tool/webUsbSerialMonitor/index.ts +12 -0
  75. package/src/tool/webUsbSerialMonitor/logic.ts +44 -0
  76. package/src/tool/webUsbSerialMonitor/seo.astro +16 -0
  77. package/src/tool/webUsbSerialMonitor/ui.ts +51 -0
  78. package/src/tool/webUsbSerialMonitor/web-usb-serial-monitor.css +415 -0
  79. package/src/tools.ts +4 -1
@@ -0,0 +1,415 @@
1
+ .wsm-root {
2
+ --wsm-ink: #172018;
3
+ --wsm-muted: #5c6b60;
4
+ --wsm-panel: #fbfdf8;
5
+ --wsm-raised: #fff;
6
+ --wsm-soft: #eef6e8;
7
+ --wsm-line: #bfcfba;
8
+ --wsm-green: #217a4b;
9
+ --wsm-teal: #09747a;
10
+ --wsm-amber: #c58516;
11
+ --wsm-red: #bc4638;
12
+ --wsm-terminal: #101610;
13
+ --wsm-terminal-2: #172216;
14
+ --wsm-terminal-text: #d8ffcf;
15
+
16
+ color: var(--wsm-ink);
17
+ }
18
+
19
+ .theme-dark .wsm-root {
20
+ --wsm-ink: #f3f8f0;
21
+ --wsm-muted: #a7b9a7;
22
+ --wsm-panel: #101511;
23
+ --wsm-raised: #171e18;
24
+ --wsm-soft: #202c20;
25
+ --wsm-line: #38503a;
26
+ --wsm-green: #72e09a;
27
+ --wsm-teal: #5ad4d1;
28
+ --wsm-amber: #f4c768;
29
+ --wsm-red: #ff897a;
30
+ --wsm-terminal: #050805;
31
+ --wsm-terminal-2: #0d140c;
32
+ --wsm-terminal-text: #d8ffcf;
33
+ }
34
+
35
+ .wsm-shell {
36
+ display: grid;
37
+ grid-template-areas:
38
+ "device"
39
+ "controls"
40
+ "terminal";
41
+ gap: 0.7rem;
42
+ width: 100%;
43
+ padding: 0.65rem;
44
+ border: 1px solid var(--wsm-line);
45
+ border-radius: 8px;
46
+ background:
47
+ linear-gradient(135deg, color-mix(in srgb, var(--wsm-green) 18%, transparent), transparent 34%),
48
+ linear-gradient(315deg, color-mix(in srgb, var(--wsm-teal) 12%, transparent), transparent 42%),
49
+ var(--wsm-panel);
50
+ }
51
+
52
+ .wsm-device {
53
+ grid-area: device;
54
+ display: grid;
55
+ grid-template-columns: auto minmax(0, 1fr);
56
+ gap: 0.75rem;
57
+ align-items: center;
58
+ min-height: 5.8rem;
59
+ padding: 0.8rem;
60
+ border: 1px solid var(--wsm-line);
61
+ border-radius: 8px;
62
+ background:
63
+ repeating-linear-gradient(90deg, transparent 0 1.1rem, color-mix(in srgb, var(--wsm-line) 25%, transparent) 1.1rem 1.16rem),
64
+ var(--wsm-raised);
65
+ }
66
+
67
+ .wsm-device-icon {
68
+ display: grid;
69
+ place-items: center;
70
+ width: 4.2rem;
71
+ aspect-ratio: 1;
72
+ border-radius: 8px;
73
+ background: linear-gradient(135deg, var(--wsm-green), var(--wsm-teal));
74
+ color: #fff;
75
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
76
+ }
77
+
78
+ .wsm-device-icon svg {
79
+ width: 2.25rem;
80
+ height: 2.25rem;
81
+ }
82
+
83
+ .wsm-device span,
84
+ .wsm-dials label span,
85
+ .wsm-metrics dt,
86
+ .wsm-terminal-head span {
87
+ color: var(--wsm-muted);
88
+ font-size: 0.68rem;
89
+ font-weight: 950;
90
+ text-transform: uppercase;
91
+ }
92
+
93
+ .wsm-device strong {
94
+ display: block;
95
+ min-width: 0;
96
+ margin-top: 0.1rem;
97
+ font-size: clamp(1.3rem, 4vw, 2rem);
98
+ font-weight: 950;
99
+ line-height: 1;
100
+ overflow-wrap: anywhere;
101
+ }
102
+
103
+ .wsm-device small {
104
+ display: block;
105
+ margin-top: 0.3rem;
106
+ color: var(--wsm-muted);
107
+ font-size: 0.78rem;
108
+ font-weight: 800;
109
+ overflow-wrap: anywhere;
110
+ }
111
+
112
+ .wsm-controls {
113
+ grid-area: controls;
114
+ display: grid;
115
+ gap: 0.6rem;
116
+ }
117
+
118
+ .wsm-status,
119
+ .wsm-privacy,
120
+ .wsm-metrics div,
121
+ .wsm-dials label {
122
+ border: 1px solid var(--wsm-line);
123
+ border-radius: 8px;
124
+ background: var(--wsm-raised);
125
+ }
126
+
127
+ .wsm-status {
128
+ display: grid;
129
+ grid-template-columns: auto minmax(0, 1fr);
130
+ align-items: center;
131
+ min-height: 3.15rem;
132
+ gap: 0.55rem;
133
+ padding: 0.7rem;
134
+ }
135
+
136
+ .wsm-status span {
137
+ width: 0.72rem;
138
+ aspect-ratio: 1;
139
+ border-radius: 50%;
140
+ background: var(--wsm-muted);
141
+ box-shadow: 0 0 0 0.28rem color-mix(in srgb, var(--wsm-muted) 18%, transparent);
142
+ }
143
+
144
+ .wsm-status span[data-state="busy"] { background: var(--wsm-teal); }
145
+ .wsm-status span[data-state="ok"] { background: var(--wsm-green); }
146
+ .wsm-status span[data-state="warn"] { background: var(--wsm-amber); }
147
+ .wsm-status span[data-state="error"] { background: var(--wsm-red); }
148
+
149
+ .wsm-status strong,
150
+ .wsm-connect {
151
+ font-weight: 950;
152
+ }
153
+
154
+ .wsm-dials {
155
+ display: grid;
156
+ grid-template-columns: minmax(0, 1fr) auto;
157
+ gap: 0.55rem;
158
+ }
159
+
160
+ .wsm-dials label {
161
+ display: grid;
162
+ gap: 0.35rem;
163
+ min-width: 0;
164
+ padding: 0.65rem;
165
+ }
166
+
167
+ .wsm-dials select {
168
+ width: 100%;
169
+ min-height: 2.1rem;
170
+ border: 1px solid color-mix(in srgb, var(--wsm-line) 70%, transparent);
171
+ border-radius: 6px;
172
+ background: var(--wsm-soft);
173
+ color: var(--wsm-ink);
174
+ font: inherit;
175
+ font-weight: 950;
176
+ padding: 0 0.45rem;
177
+ }
178
+
179
+ .theme-dark .wsm-dials select,
180
+ .theme-dark .wsm-dials select option {
181
+ background: #202c20;
182
+ color: #f3f8f0;
183
+ }
184
+
185
+ .wsm-check {
186
+ align-content: center;
187
+ grid-template-columns: auto auto;
188
+ align-items: center;
189
+ }
190
+
191
+ .wsm-check input {
192
+ accent-color: var(--wsm-green);
193
+ }
194
+
195
+ .wsm-presets {
196
+ display: grid;
197
+ grid-template-columns: repeat(3, minmax(0, 1fr));
198
+ gap: 0.45rem;
199
+ }
200
+
201
+ .wsm-presets button,
202
+ .wsm-terminal-head button,
203
+ .wsm-terminal form button {
204
+ min-height: 2.45rem;
205
+ border: 1px solid var(--wsm-line);
206
+ border-radius: 8px;
207
+ background: var(--wsm-soft);
208
+ color: var(--wsm-ink);
209
+ font: inherit;
210
+ font-size: 0.78rem;
211
+ font-weight: 950;
212
+ cursor: pointer;
213
+ }
214
+
215
+ .wsm-presets button:hover,
216
+ .wsm-terminal-head button:hover,
217
+ .wsm-terminal form button:hover {
218
+ filter: brightness(1.05);
219
+ }
220
+
221
+ .wsm-connect {
222
+ display: inline-grid;
223
+ grid-template-columns: auto minmax(0, auto);
224
+ place-content: center;
225
+ align-items: center;
226
+ gap: 0.55rem;
227
+ min-height: 4rem;
228
+ border: 0;
229
+ border-radius: 8px;
230
+ background:
231
+ linear-gradient(135deg, color-mix(in srgb, #fff 18%, transparent), transparent),
232
+ linear-gradient(135deg, var(--wsm-green), var(--wsm-teal));
233
+ color: #fff;
234
+ font: inherit;
235
+ cursor: pointer;
236
+ box-shadow: 0 0.9rem 1.7rem color-mix(in srgb, var(--wsm-green) 22%, transparent);
237
+ }
238
+
239
+ .wsm-connect svg {
240
+ width: 1.35rem;
241
+ height: 1.35rem;
242
+ }
243
+
244
+ .wsm-privacy {
245
+ display: grid;
246
+ grid-template-columns: auto minmax(0, 1fr);
247
+ gap: 0.65rem;
248
+ padding: 0.75rem;
249
+ background: color-mix(in srgb, var(--wsm-green) 10%, var(--wsm-raised));
250
+ }
251
+
252
+ .wsm-privacy svg {
253
+ width: 1.25rem;
254
+ height: 1.25rem;
255
+ color: var(--wsm-green);
256
+ }
257
+
258
+ .wsm-privacy span {
259
+ display: grid;
260
+ gap: 0.18rem;
261
+ min-width: 0;
262
+ }
263
+
264
+ .wsm-privacy small {
265
+ color: var(--wsm-muted);
266
+ font-size: 0.78rem;
267
+ font-weight: 750;
268
+ line-height: 1.35;
269
+ }
270
+
271
+ .wsm-metrics {
272
+ display: grid;
273
+ grid-template-columns: repeat(3, minmax(0, 1fr));
274
+ gap: 0.5rem;
275
+ margin: 0;
276
+ }
277
+
278
+ .wsm-metrics div {
279
+ display: grid;
280
+ gap: 0.2rem;
281
+ min-width: 0;
282
+ padding: 0.65rem;
283
+ }
284
+
285
+ .wsm-metrics dd {
286
+ min-width: 0;
287
+ margin: 0;
288
+ font-size: 0.92rem;
289
+ font-weight: 950;
290
+ overflow-wrap: anywhere;
291
+ }
292
+
293
+ .wsm-terminal {
294
+ grid-area: terminal;
295
+ display: grid;
296
+ gap: 0.55rem;
297
+ min-height: 25rem;
298
+ padding: 0.65rem;
299
+ border: 1px solid color-mix(in srgb, var(--wsm-green) 45%, transparent);
300
+ border-radius: 8px;
301
+ background:
302
+ radial-gradient(circle at 18% 0%, color-mix(in srgb, var(--wsm-green) 18%, transparent), transparent 34%),
303
+ linear-gradient(180deg, var(--wsm-terminal-2), var(--wsm-terminal));
304
+ color: var(--wsm-terminal-text);
305
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.04);
306
+ }
307
+
308
+ .wsm-terminal-head {
309
+ display: grid;
310
+ grid-template-columns: minmax(0, 1fr) auto;
311
+ align-items: center;
312
+ gap: 0.55rem;
313
+ }
314
+
315
+ .wsm-terminal-head span {
316
+ color: color-mix(in srgb, var(--wsm-terminal-text) 72%, transparent);
317
+ letter-spacing: 0;
318
+ }
319
+
320
+ .wsm-terminal-head div {
321
+ display: flex;
322
+ flex-wrap: wrap;
323
+ justify-content: flex-end;
324
+ gap: 0.35rem;
325
+ }
326
+
327
+ .wsm-terminal-head button,
328
+ .wsm-terminal form button {
329
+ border-color: color-mix(in srgb, var(--wsm-terminal-text) 22%, transparent);
330
+ background: color-mix(in srgb, var(--wsm-terminal-text) 10%, transparent);
331
+ color: var(--wsm-terminal-text);
332
+ }
333
+
334
+ .wsm-terminal pre {
335
+ min-height: 17rem;
336
+ max-height: 31rem;
337
+ margin: 0;
338
+ padding: 0.85rem;
339
+ border: 1px solid color-mix(in srgb, var(--wsm-terminal-text) 18%, transparent);
340
+ border-radius: 8px;
341
+ background:
342
+ repeating-linear-gradient(180deg, transparent 0 1.72rem, rgba(255, 255, 255, 0.025) 1.72rem 1.78rem),
343
+ rgba(0, 0, 0, 0.16);
344
+ color: var(--wsm-terminal-text);
345
+ font-size: 0.86rem;
346
+ line-height: 1.45;
347
+ overflow: auto;
348
+ white-space: pre-wrap;
349
+ overflow-wrap: anywhere;
350
+ }
351
+
352
+ .wsm-terminal form {
353
+ display: grid;
354
+ grid-template-columns: minmax(0, 1fr) auto;
355
+ gap: 0.45rem;
356
+ }
357
+
358
+ .wsm-terminal input {
359
+ min-width: 0;
360
+ min-height: 2.9rem;
361
+ border: 1px solid color-mix(in srgb, var(--wsm-terminal-text) 20%, transparent);
362
+ border-radius: 8px;
363
+ background: rgba(0, 0, 0, 0.22);
364
+ color: var(--wsm-terminal-text);
365
+ font: inherit;
366
+ padding: 0 0.75rem;
367
+ }
368
+
369
+ .wsm-terminal input::placeholder {
370
+ color: color-mix(in srgb, var(--wsm-terminal-text) 52%, transparent);
371
+ }
372
+
373
+ @media (min-width: 920px) {
374
+ .wsm-shell {
375
+ grid-template-areas:
376
+ "device terminal"
377
+ "controls terminal";
378
+ grid-template-columns: minmax(20rem, 0.7fr) minmax(0, 1.3fr);
379
+ align-items: start;
380
+ }
381
+
382
+ .wsm-terminal {
383
+ min-height: 36rem;
384
+ }
385
+
386
+ .wsm-terminal pre {
387
+ min-height: 27rem;
388
+ }
389
+ }
390
+
391
+ @media (max-width: 560px) {
392
+ .wsm-shell {
393
+ padding: 0.5rem;
394
+ }
395
+
396
+ .wsm-device {
397
+ grid-template-columns: 1fr;
398
+ }
399
+
400
+ .wsm-device-icon {
401
+ width: 3.5rem;
402
+ }
403
+
404
+ .wsm-dials,
405
+ .wsm-metrics,
406
+ .wsm-terminal-head,
407
+ .wsm-terminal form {
408
+ grid-template-columns: 1fr;
409
+ }
410
+
411
+ .wsm-presets {
412
+ grid-template-columns: 1fr;
413
+ }
414
+ }
415
+
package/src/tools.ts CHANGED
@@ -14,5 +14,8 @@ import { MOUSE_SCROLL_TEST_TOOL } from './tool/mouseScrollTest/index';
14
14
  import { MONITOR_GHOSTING_TEST_TOOL } from './tool/monitorGhostingTest/index';
15
15
  import { UPS_RUNTIME_CALCULATOR_TOOL } from './tool/upsRuntimeCalculator/index';
16
16
  import { STEREO_AUDIO_TEST_TOOL } from './tool/stereoAudioTest/index';
17
+ import { WEB_BLUETOOTH_BLE_SCANNER_TOOL } from './tool/webBluetoothBleScanner/index';
18
+ import { KEYBOARD_CHATTER_TEST_TOOL } from './tool/keyboardChatterTest/index';
19
+ import { WEB_USB_SERIAL_MONITOR_TOOL } from './tool/webUsbSerialMonitor/index';
17
20
 
18
- export const ALL_TOOLS: ToolDefinition[] = [PIXELES_PANTALLA_TOOL, TEST_TECLADO_TOOL, TEST_MANDO_TOOL, PROBADOR_VIBRACION_MANDO_TOOL, TEST_RATON_TOOL, MOUSE_DOUBLE_CLICK_TEST_TOOL, MOUSE_SCROLL_TEST_TOOL, ESTIMADOR_SALUD_BATERIA_TOOL, TONE_GENERATOR_TOOL, REFRESH_RATE_DETECTOR_TOOL, MONITOR_GHOSTING_TEST_TOOL, SPECTRUM_CANVAS_TOOL, UPS_RUNTIME_CALCULATOR_TOOL, STEREO_AUDIO_TEST_TOOL];
21
+ export const ALL_TOOLS: ToolDefinition[] = [PIXELES_PANTALLA_TOOL, TEST_TECLADO_TOOL, KEYBOARD_CHATTER_TEST_TOOL, TEST_MANDO_TOOL, PROBADOR_VIBRACION_MANDO_TOOL, TEST_RATON_TOOL, MOUSE_DOUBLE_CLICK_TEST_TOOL, MOUSE_SCROLL_TEST_TOOL, ESTIMADOR_SALUD_BATERIA_TOOL, TONE_GENERATOR_TOOL, REFRESH_RATE_DETECTOR_TOOL, MONITOR_GHOSTING_TEST_TOOL, SPECTRUM_CANVAS_TOOL, UPS_RUNTIME_CALCULATOR_TOOL, STEREO_AUDIO_TEST_TOOL, WEB_BLUETOOTH_BLE_SCANNER_TOOL, WEB_USB_SERIAL_MONITOR_TOOL];