@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,406 @@
1
+ .wbb-root {
2
+ --wbb-ink: #132034;
3
+ --wbb-muted: #64748b;
4
+ --wbb-panel: #fff;
5
+ --wbb-soft: #eff7ff;
6
+ --wbb-line: #cfe0f3;
7
+ --wbb-blue: #1267d8;
8
+ --wbb-cyan: #00a6b7;
9
+ --wbb-green: #14966f;
10
+ --wbb-warn: #b45309;
11
+ --wbb-error: #c2410c;
12
+ --wbb-shadow: rgb(19, 32, 52, 0.12);
13
+
14
+ color: var(--wbb-ink);
15
+ }
16
+
17
+ .theme-dark .wbb-root {
18
+ --wbb-ink: #f8fafc;
19
+ --wbb-muted: #a9b7ca;
20
+ --wbb-panel: #151b25;
21
+ --wbb-soft: #0d1520;
22
+ --wbb-line: #304055;
23
+ --wbb-blue: #68a6ff;
24
+ --wbb-cyan: #3dd9e8;
25
+ --wbb-green: #57d9ad;
26
+ --wbb-warn: #f6bd60;
27
+ --wbb-error: #fb8a5f;
28
+ --wbb-shadow: rgb(0, 0, 0, 0.32);
29
+ }
30
+
31
+ .wbb-shell {
32
+ display: grid;
33
+ gap: 0.75rem;
34
+ width: 100%;
35
+ padding: 0.75rem;
36
+ border: 1px solid var(--wbb-line);
37
+ border-radius: 8px;
38
+ background:
39
+ linear-gradient(135deg, color-mix(in srgb, var(--wbb-blue) 10%, transparent), transparent 42%),
40
+ var(--wbb-panel);
41
+ box-shadow: 0 1rem 2.6rem var(--wbb-shadow);
42
+ }
43
+
44
+ .wbb-radar {
45
+ position: relative;
46
+ display: grid;
47
+ place-items: center;
48
+ min-height: 17rem;
49
+ border: 1px solid var(--wbb-line);
50
+ border-radius: 8px;
51
+ background:
52
+ radial-gradient(circle at center, color-mix(in srgb, var(--wbb-cyan) 16%, transparent) 0 12%, transparent 13%),
53
+ repeating-radial-gradient(circle at center, transparent 0 2.2rem, var(--wbb-line) 2.25rem 2.32rem),
54
+ linear-gradient(180deg, var(--wbb-soft), var(--wbb-panel));
55
+ overflow: hidden;
56
+ }
57
+
58
+ .wbb-radar::before,
59
+ .wbb-radar::after {
60
+ position: absolute;
61
+ inset: 50% auto auto 50%;
62
+ width: 70%;
63
+ height: 0.16rem;
64
+ background: linear-gradient(90deg, transparent, var(--wbb-cyan));
65
+ content: "";
66
+ transform-origin: left center;
67
+ }
68
+
69
+ .wbb-radar::before {
70
+ animation: wbb-sweep 4s linear infinite;
71
+ }
72
+
73
+ .wbb-radar::after {
74
+ opacity: 0.28;
75
+ transform: rotate(90deg);
76
+ }
77
+
78
+ .wbb-radar span {
79
+ position: relative;
80
+ z-index: 2;
81
+ display: grid;
82
+ place-items: center;
83
+ width: 6.25rem;
84
+ aspect-ratio: 1;
85
+ border: 0.5rem solid var(--wbb-panel);
86
+ border-radius: 50%;
87
+ background: linear-gradient(135deg, var(--wbb-blue), var(--wbb-cyan));
88
+ box-shadow: 0 1rem 2rem var(--wbb-shadow);
89
+ }
90
+
91
+ .wbb-radar span svg {
92
+ width: 3.25rem;
93
+ height: 3.25rem;
94
+ color: #fff;
95
+ }
96
+
97
+ .wbb-radar i,
98
+ .wbb-radar b,
99
+ .wbb-radar em {
100
+ position: absolute;
101
+ width: 0.86rem;
102
+ aspect-ratio: 1;
103
+ border-radius: 50%;
104
+ background: var(--wbb-green);
105
+ box-shadow: 0 0 0 0.45rem color-mix(in srgb, var(--wbb-green) 18%, transparent);
106
+ }
107
+
108
+ .wbb-radar i {
109
+ left: 18%;
110
+ top: 28%;
111
+ }
112
+
113
+ .wbb-radar b {
114
+ right: 22%;
115
+ top: 20%;
116
+ }
117
+
118
+ .wbb-radar em {
119
+ right: 18%;
120
+ bottom: 24%;
121
+ }
122
+
123
+ .wbb-console {
124
+ display: grid;
125
+ gap: 0.7rem;
126
+ align-content: start;
127
+ }
128
+
129
+ .wbb-status,
130
+ .wbb-privacy,
131
+ .wbb-hint,
132
+ .wbb-card {
133
+ border: 1px solid var(--wbb-line);
134
+ border-radius: 8px;
135
+ background: var(--wbb-panel);
136
+ }
137
+
138
+ .wbb-status {
139
+ display: grid;
140
+ grid-template-columns: auto minmax(0, 1fr);
141
+ align-items: center;
142
+ gap: 0.55rem;
143
+ min-height: 3rem;
144
+ padding: 0.7rem;
145
+ }
146
+
147
+ .wbb-status span {
148
+ width: 0.72rem;
149
+ aspect-ratio: 1;
150
+ border-radius: 50%;
151
+ background: var(--wbb-muted);
152
+ box-shadow: 0 0 0 0.28rem color-mix(in srgb, var(--wbb-muted) 18%, transparent);
153
+ }
154
+
155
+ .wbb-status span[data-state="busy"] {
156
+ background: var(--wbb-blue);
157
+ }
158
+
159
+ .wbb-status span[data-state="ok"] {
160
+ background: var(--wbb-green);
161
+ }
162
+
163
+ .wbb-status span[data-state="warn"] {
164
+ background: var(--wbb-warn);
165
+ }
166
+
167
+ .wbb-status span[data-state="error"] {
168
+ background: var(--wbb-error);
169
+ }
170
+
171
+ .wbb-status strong {
172
+ min-width: 0;
173
+ font-size: 0.9rem;
174
+ font-weight: 900;
175
+ }
176
+
177
+ .wbb-scan {
178
+ display: inline-grid;
179
+ grid-template-columns: auto minmax(0, auto);
180
+ place-content: center;
181
+ align-items: center;
182
+ gap: 0.5rem;
183
+ min-height: 4rem;
184
+ width: 100%;
185
+ border: 0;
186
+ border-radius: 8px;
187
+ background: linear-gradient(135deg, var(--wbb-blue), var(--wbb-cyan));
188
+ color: #fff;
189
+ font: inherit;
190
+ font-size: 1rem;
191
+ font-weight: 950;
192
+ cursor: pointer;
193
+ box-shadow: 0 0.9rem 1.6rem color-mix(in srgb, var(--wbb-blue) 24%, transparent);
194
+ transition: transform 160ms ease, filter 160ms ease;
195
+ }
196
+
197
+ .wbb-scan svg {
198
+ width: 1.25rem;
199
+ height: 1.25rem;
200
+ }
201
+
202
+ .wbb-scan:hover {
203
+ transform: translateY(-1px);
204
+ }
205
+
206
+ .wbb-scan:disabled {
207
+ cursor: wait;
208
+ filter: saturate(0.65);
209
+ }
210
+
211
+ .wbb-privacy {
212
+ display: grid;
213
+ grid-template-columns: auto minmax(0, 1fr);
214
+ gap: 0.65rem;
215
+ padding: 0.8rem;
216
+ background: color-mix(in srgb, var(--wbb-green) 9%, var(--wbb-panel));
217
+ }
218
+
219
+ .wbb-privacy svg {
220
+ width: 1.35rem;
221
+ height: 1.35rem;
222
+ color: var(--wbb-green);
223
+ }
224
+
225
+ .wbb-privacy span {
226
+ display: grid;
227
+ gap: 0.18rem;
228
+ min-width: 0;
229
+ }
230
+
231
+ .wbb-privacy strong {
232
+ font-size: 0.86rem;
233
+ font-weight: 950;
234
+ }
235
+
236
+ .wbb-privacy small,
237
+ .wbb-hint,
238
+ .wbb-card p {
239
+ color: var(--wbb-muted);
240
+ font-size: 0.78rem;
241
+ font-weight: 750;
242
+ line-height: 1.35;
243
+ }
244
+
245
+ .wbb-device-list {
246
+ display: grid;
247
+ gap: 0.65rem;
248
+ }
249
+
250
+ .wbb-card {
251
+ display: grid;
252
+ gap: 0.7rem;
253
+ padding: 0.75rem;
254
+ }
255
+
256
+ .wbb-card-head {
257
+ display: grid;
258
+ gap: 0.18rem;
259
+ }
260
+
261
+ .wbb-card-head span,
262
+ .wbb-card dt {
263
+ color: var(--wbb-muted);
264
+ font-size: 0.68rem;
265
+ font-weight: 900;
266
+ text-transform: uppercase;
267
+ }
268
+
269
+ .wbb-card-head strong {
270
+ font-size: 1.15rem;
271
+ font-weight: 950;
272
+ line-height: 1.1;
273
+ }
274
+
275
+ .wbb-card dl {
276
+ display: grid;
277
+ gap: 0.45rem;
278
+ margin: 0;
279
+ }
280
+
281
+ .wbb-card dl div {
282
+ display: grid;
283
+ gap: 0.18rem;
284
+ min-width: 0;
285
+ padding: 0.55rem;
286
+ border-radius: 8px;
287
+ background: var(--wbb-soft);
288
+ }
289
+
290
+ .wbb-card dd {
291
+ min-width: 0;
292
+ margin: 0;
293
+ color: var(--wbb-ink);
294
+ font-weight: 850;
295
+ }
296
+
297
+ .wbb-card code {
298
+ display: block;
299
+ max-width: 100%;
300
+ color: inherit;
301
+ font-size: 0.72rem;
302
+ overflow-wrap: anywhere;
303
+ }
304
+
305
+ .wbb-card ul {
306
+ display: grid;
307
+ gap: 0.45rem;
308
+ margin: 0;
309
+ padding: 0;
310
+ list-style: none;
311
+ }
312
+
313
+ .wbb-card li {
314
+ display: grid;
315
+ gap: 0.2rem;
316
+ padding: 0.6rem;
317
+ border: 1px solid var(--wbb-line);
318
+ border-radius: 8px;
319
+ background: var(--wbb-soft);
320
+ }
321
+
322
+ .wbb-card li span {
323
+ font-size: 0.83rem;
324
+ font-weight: 950;
325
+ }
326
+
327
+ .wbb-card .wbb-empty {
328
+ color: var(--wbb-muted);
329
+ font-weight: 800;
330
+ }
331
+
332
+ .wbb-card p,
333
+ .wbb-hint {
334
+ margin: 0;
335
+ }
336
+
337
+ .wbb-card button {
338
+ min-height: 2.7rem;
339
+ border: 1px solid var(--wbb-line);
340
+ border-radius: 8px;
341
+ background: var(--wbb-ink);
342
+ color: var(--wbb-panel);
343
+ font: inherit;
344
+ font-weight: 900;
345
+ cursor: pointer;
346
+ }
347
+
348
+ .wbb-warning {
349
+ background: color-mix(in srgb, var(--wbb-warn) 10%, var(--wbb-panel));
350
+ }
351
+
352
+ .wbb-warning strong {
353
+ color: var(--wbb-warn);
354
+ }
355
+
356
+ .wbb-hint {
357
+ padding: 0.75rem;
358
+ background: var(--wbb-soft);
359
+ }
360
+
361
+ @keyframes wbb-sweep {
362
+ to {
363
+ transform: rotate(360deg);
364
+ }
365
+ }
366
+
367
+ @media (min-width: 860px) {
368
+ .wbb-shell {
369
+ grid-template-columns: minmax(0, 1.15fr) minmax(20rem, 0.85fr);
370
+ align-items: stretch;
371
+ }
372
+
373
+ .wbb-radar {
374
+ min-height: 28rem;
375
+ }
376
+
377
+ .wbb-card dl {
378
+ grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.8fr);
379
+ }
380
+ }
381
+
382
+ @media (max-width: 560px) {
383
+ .wbb-shell {
384
+ padding: 0.55rem;
385
+ }
386
+
387
+ .wbb-radar {
388
+ min-height: 13rem;
389
+ }
390
+
391
+ .wbb-radar span {
392
+ width: 5rem;
393
+ }
394
+
395
+ .wbb-scan {
396
+ min-height: 3.5rem;
397
+ }
398
+ }
399
+
400
+ @media (prefers-reduced-motion: reduce) {
401
+ .wbb-radar::before,
402
+ .wbb-scan {
403
+ animation: none;
404
+ transition: none;
405
+ }
406
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { webUsbSerialMonitor } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await webUsbSerialMonitor.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
15
+
@@ -0,0 +1,18 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'SparkFun - Serial Communication Basics',
6
+ url: 'https://learn.sparkfun.com/tutorials/serial-communication',
7
+ },
8
+ {
9
+ name: 'Arduino - Serial Reference and Guide',
10
+ url: 'https://docs.arduino.cc/language-reference/en/functions/communication/serial/',
11
+ },
12
+ {
13
+ name: 'Adafruit - Arduino Lesson 5: The Serial Monitor',
14
+ url: 'https://learn.adafruit.com/adafruit-arduino-lesson-5-the-serial-monitor',
15
+ },
16
+ ];
17
+
18
+