@jjlmoya/utils-hardware 1.11.0 → 1.13.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 (32) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/entries.ts +23 -0
  4. package/src/tool/batteryHealthEstimator/component.astro +2 -369
  5. package/src/tool/batteryHealthEstimator/entry.ts +30 -0
  6. package/src/tool/batteryHealthEstimator/index.ts +2 -32
  7. package/src/tool/batteryHealthEstimator/lithium-battery-health-calculator.css +275 -0
  8. package/src/tool/deadPixelTest/component.astro +2 -445
  9. package/src/tool/deadPixelTest/dead-pixel-tester.css +400 -0
  10. package/src/tool/deadPixelTest/entry.ts +30 -0
  11. package/src/tool/deadPixelTest/index.ts +2 -32
  12. package/src/tool/gamepadTest/component.astro +2 -973
  13. package/src/tool/gamepadTest/entry.ts +30 -0
  14. package/src/tool/gamepadTest/gamepad-test.css +882 -0
  15. package/src/tool/gamepadTest/index.ts +2 -32
  16. package/src/tool/gamepadVibrationTester/component.astro +2 -404
  17. package/src/tool/gamepadVibrationTester/entry.ts +30 -0
  18. package/src/tool/gamepadVibrationTester/gamepad-vibration-tester.css +280 -0
  19. package/src/tool/gamepadVibrationTester/index.ts +2 -32
  20. package/src/tool/keyboardTest/component.astro +2 -333
  21. package/src/tool/keyboardTest/entry.ts +30 -0
  22. package/src/tool/keyboardTest/index.ts +2 -32
  23. package/src/tool/keyboardTest/keyboard-test.css +283 -0
  24. package/src/tool/mousePollingTest/component.astro +2 -172
  25. package/src/tool/mousePollingTest/entry.ts +30 -0
  26. package/src/tool/mousePollingTest/index.ts +2 -32
  27. package/src/tool/mousePollingTest/mouse-polling-rate-test.css +143 -0
  28. package/src/tool/toneGenerator/component.astro +2 -330
  29. package/src/tool/toneGenerator/entry.ts +30 -0
  30. package/src/tool/toneGenerator/index.ts +2 -32
  31. package/src/tool/toneGenerator/tone-frequency-generator.css +265 -0
  32. package/src/tools.ts +1 -1
@@ -0,0 +1,275 @@
1
+ .bh-wrapper {
2
+ width: 100%;
3
+ color: var(--bh-text);
4
+ }
5
+
6
+ .bh-grid {
7
+ display: grid;
8
+ grid-template-columns: 1fr 2fr;
9
+ gap: 2rem;
10
+ align-items: start;
11
+ }
12
+
13
+ @media (max-width: 768px) {
14
+ .bh-grid {
15
+ grid-template-columns: 1fr;
16
+ }
17
+ }
18
+
19
+ .bh-left {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: 1.25rem;
23
+ }
24
+
25
+ .bh-params-panel {
26
+ background: var(--bh-surface);
27
+ border: 1px solid var(--bh-border);
28
+ border-radius: 1.5rem;
29
+ padding: 2rem;
30
+ }
31
+
32
+ .bh-params-title {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 0.5rem;
36
+ font-size: 1rem;
37
+ font-weight: 800;
38
+ margin: 0 0 2rem;
39
+ }
40
+
41
+ .bh-params-icon {
42
+ width: 1.25rem;
43
+ height: 1.25rem;
44
+ color: var(--bh-accent);
45
+ }
46
+
47
+ .bh-sliders {
48
+ display: flex;
49
+ flex-direction: column;
50
+ gap: 2rem;
51
+ }
52
+
53
+ .bh-slider-group {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: 0.75rem;
57
+ }
58
+
59
+ .bh-slider-header {
60
+ display: flex;
61
+ justify-content: space-between;
62
+ align-items: center;
63
+ }
64
+
65
+ .bh-slider-label {
66
+ font-size: 0.7rem;
67
+ font-weight: 800;
68
+ text-transform: uppercase;
69
+ letter-spacing: 0.1em;
70
+ color: var(--bh-text-muted);
71
+ }
72
+
73
+ .bh-slider-val {
74
+ font-size: 0.875rem;
75
+ font-weight: 700;
76
+ color: var(--bh-accent);
77
+ }
78
+
79
+ .bh-slider {
80
+ -webkit-appearance: none;
81
+ appearance: none;
82
+ width: 100%;
83
+ height: 6px;
84
+ background: var(--bh-border);
85
+ border-radius: 3px;
86
+ outline: none;
87
+ accent-color: var(--bh-accent);
88
+ }
89
+
90
+ .bh-slider::-webkit-slider-thumb {
91
+ -webkit-appearance: none;
92
+ appearance: none;
93
+ width: 18px;
94
+ height: 18px;
95
+ background: var(--bh-accent);
96
+ border-radius: 50%;
97
+ cursor: pointer;
98
+ border: 4px solid var(--bh-surface);
99
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
100
+ }
101
+
102
+ .bh-slider-hint {
103
+ font-size: 0.625rem;
104
+ color: var(--bh-text-faint);
105
+ font-style: italic;
106
+ margin: 0;
107
+ }
108
+
109
+ .bh-status-card {
110
+ padding: 1.25rem;
111
+ border-radius: 1rem;
112
+ border: 1px solid var(--bh-border);
113
+ display: flex;
114
+ flex-direction: column;
115
+ gap: 0.75rem;
116
+ transition: background 400ms, border-color 400ms, color 400ms;
117
+ }
118
+
119
+ .bh-status-text {
120
+ font-size: 0.8rem;
121
+ font-weight: 800;
122
+ text-transform: uppercase;
123
+ letter-spacing: 0.05em;
124
+ }
125
+
126
+ .bh-recs {
127
+ display: flex;
128
+ flex-direction: column;
129
+ gap: 0.5rem;
130
+ }
131
+
132
+ .bh-right {
133
+ display: flex;
134
+ flex-direction: column;
135
+ gap: 1.5rem;
136
+ }
137
+
138
+ .bh-ring-wrap {
139
+ background: var(--bh-surface);
140
+ border: 1px solid var(--bh-border);
141
+ border-radius: 1.5rem;
142
+ padding: 2rem;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ min-height: 340px;
147
+ position: relative;
148
+ overflow: hidden;
149
+ }
150
+
151
+ .bh-ring-glow {
152
+ position: absolute;
153
+ inset: 0;
154
+ background: radial-gradient(circle at 50% 50%, rgba(16, 185, 129, 0.05), transparent);
155
+ pointer-events: none;
156
+ }
157
+
158
+ .bh-ring-container {
159
+ position: relative;
160
+ width: 220px;
161
+ height: 220px;
162
+ }
163
+
164
+ .bh-ring-svg {
165
+ width: 100%;
166
+ height: 100%;
167
+ transform: rotate(-90deg);
168
+ }
169
+
170
+ .bh-ring-track {
171
+ color: var(--bh-border);
172
+ stroke: currentcolor;
173
+ }
174
+
175
+ .bh-ring-progress {
176
+ color: var(--bh-accent);
177
+ stroke: currentcolor;
178
+ transition: stroke-dashoffset 1s ease-out, stroke 500ms ease;
179
+ }
180
+
181
+ .bh-ring-overlay {
182
+ position: absolute;
183
+ inset: 0;
184
+ display: flex;
185
+ flex-direction: column;
186
+ align-items: center;
187
+ justify-content: center;
188
+ text-align: center;
189
+ }
190
+
191
+ .bh-ring-label {
192
+ font-size: 0.6rem;
193
+ font-weight: 900;
194
+ text-transform: uppercase;
195
+ letter-spacing: 0.2em;
196
+ color: var(--bh-text-faint);
197
+ margin-bottom: 0.25rem;
198
+ }
199
+
200
+ .bh-ring-value {
201
+ display: flex;
202
+ align-items: flex-end;
203
+ gap: 0.25rem;
204
+ line-height: 1;
205
+ }
206
+
207
+ #bh-soh {
208
+ font-size: 4rem;
209
+ font-weight: 900;
210
+ color: var(--bh-text);
211
+ }
212
+
213
+ .bh-ring-pct {
214
+ font-size: 1.5rem;
215
+ font-weight: 900;
216
+ color: var(--bh-text-muted);
217
+ margin-bottom: 0.25rem;
218
+ }
219
+
220
+ .bh-ring-years {
221
+ margin-top: 1rem;
222
+ padding: 0.375rem 1rem;
223
+ border-radius: 9999px;
224
+ background: var(--bh-surface-alt);
225
+ border: 1px solid var(--bh-border);
226
+ font-size: 0.65rem;
227
+ font-weight: 900;
228
+ text-transform: uppercase;
229
+ letter-spacing: 0.1em;
230
+ color: var(--bh-text-muted);
231
+ }
232
+
233
+ .bh-indicators {
234
+ display: grid;
235
+ grid-template-columns: repeat(3, 1fr);
236
+ gap: 0.75rem;
237
+ }
238
+
239
+ .bh-indicator {
240
+ background: var(--bh-surface);
241
+ border: 1px solid var(--bh-border);
242
+ border-radius: 1rem;
243
+ padding: 1rem;
244
+ }
245
+
246
+ .bh-indicator-title {
247
+ display: block;
248
+ font-size: 0.6rem;
249
+ font-weight: 900;
250
+ text-transform: uppercase;
251
+ letter-spacing: 0.1em;
252
+ color: var(--bh-text-faint);
253
+ margin-bottom: 0.5rem;
254
+ }
255
+
256
+ .bh-indicator-row {
257
+ display: flex;
258
+ align-items: center;
259
+ gap: 0.5rem;
260
+ }
261
+
262
+ .bh-dot {
263
+ width: 0.75rem;
264
+ height: 0.75rem;
265
+ border-radius: 9999px;
266
+ background: var(--bh-accent);
267
+ flex-shrink: 0;
268
+ transition: background 300ms;
269
+ }
270
+
271
+ .bh-indicator-label {
272
+ font-size: 0.8rem;
273
+ font-weight: 700;
274
+ color: var(--bh-text);
275
+ }
@@ -12,48 +12,7 @@ const t = (ui ?? {}) as PixelesPantallaUI;
12
12
  ---
13
13
 
14
14
  <div class="pt-root" data-badge={t.badge} data-title={t.title} data-description={t.description} data-btn-start-test={t.btnStartTest} data-btn-start-fix={t.btnStartFix} data-kbd-fullscreen={t.kbdFullscreen} data-kbd-fullscreen-label={t.kbdFullscreenLabel} data-kbd-space={t.kbdSpace} data-kbd-space-label={t.kbdSpaceLabel} data-kbd-esc={t.kbdEsc} data-kbd-esc-label={t.kbdEscLabel} data-color-black={t.colorBlack} data-color-white={t.colorWhite} data-color-red={t.colorRed} data-color-green={t.colorGreen} data-color-blue={t.colorBlue} data-btn-toggle-fixer={t.btnToggleFixer} data-btn-exit={t.btnExit}>
15
- <style is:global>
16
- .pt-root {
17
- --pt-accent: #4f46e5;
18
- --pt-accent-hover: #4338ca;
19
- --pt-accent-bg: #e0e7ff;
20
- --pt-accent-text: #4338ca;
21
- --pt-surface: #fff;
22
- --pt-surface-alt: #f8fafc;
23
- --pt-border: #e2e8f0;
24
- --pt-text: #0f172a;
25
- --pt-text-muted: #64748b;
26
- --pt-kbd-bg: #f1f5f9;
27
- --pt-monitor-body: #1e293b;
28
- --pt-monitor-screen: #020617;
29
- --pt-shadow: rgba(0, 0, 0, 0.1);
30
- }
31
-
32
- .theme-dark .pt-root {
33
- --pt-surface: #0f172a;
34
- --pt-surface-alt: #1e293b;
35
- --pt-border: #334155;
36
- --pt-text: #f1f5f9;
37
- --pt-text-muted: #94a3b8;
38
- --pt-kbd-bg: #1e293b;
39
- --pt-accent-bg: rgba(79, 70, 229, 0.3);
40
- --pt-accent-text: #a5b4fc;
41
- --pt-monitor-body: #334155;
42
- --pt-monitor-screen: #1e293b;
43
- }
44
-
45
- body.is-widget .pt-root {
46
- padding: 0;
47
- }
48
-
49
- body.is-widget .pt-dashboard {
50
- background: transparent;
51
- box-shadow: none;
52
- border: none;
53
- padding: 1rem;
54
- }
55
- </style>
56
-
15
+
57
16
  <div class="pt-wrapper">
58
17
  <div class="pt-dashboard" id="dashboard">
59
18
  <div class="pt-grid">
@@ -157,409 +116,7 @@ const t = (ui ?? {}) as PixelesPantallaUI;
157
116
  </div>
158
117
  </div>
159
118
 
160
- <style>
161
- .pt-wrapper {
162
- width: 100%;
163
- max-width: 80rem;
164
- margin: 0 auto;
165
- padding: 1rem;
166
- color: var(--pt-text);
167
- }
168
-
169
- .pt-dashboard {
170
- background: var(--pt-surface);
171
- border-radius: 1.5rem;
172
- padding: 2rem;
173
- box-shadow: 0 20px 25px -5px var(--pt-shadow);
174
- border: 1px solid var(--pt-border);
175
- transition: all 0.5s ease;
176
- }
177
-
178
- .pt-grid {
179
- display: grid;
180
- grid-template-columns: 1fr 1fr;
181
- gap: 3rem;
182
- align-items: center;
183
- }
184
-
185
- @media (max-width: 640px) {
186
- .pt-grid {
187
- grid-template-columns: 1fr;
188
- }
189
- }
190
-
191
- .pt-badge-container {
192
- margin-bottom: 1.5rem;
193
- }
194
-
195
- .pt-badge {
196
- display: inline-flex;
197
- align-items: center;
198
- gap: 0.5rem;
199
- padding: 0.25rem 0.75rem;
200
- border-radius: 9999px;
201
- background-color: var(--pt-accent-bg);
202
- color: var(--pt-accent-text);
203
- font-size: 0.75rem;
204
- font-weight: 700;
205
- letter-spacing: 0.05em;
206
- text-transform: uppercase;
207
- }
208
-
209
- .pt-badge-icon {
210
- width: 1rem;
211
- height: 1rem;
212
- }
213
-
214
- .pt-title {
215
- font-size: 2.25rem;
216
- font-weight: 900;
217
- letter-spacing: -0.02em;
218
- margin-bottom: 1rem;
219
- line-height: 1.2;
220
- }
221
-
222
- @media (min-width: 768px) {
223
- .pt-title {
224
- font-size: 3rem;
225
- }
226
- }
227
-
228
- .pt-description {
229
- font-size: 1.125rem;
230
- color: var(--pt-text-muted);
231
- line-height: 1.625;
232
- margin-bottom: 1.5rem;
233
- }
234
-
235
- .pt-buttons {
236
- display: flex;
237
- gap: 1rem;
238
- margin-bottom: 1.5rem;
239
- flex-wrap: wrap;
240
- }
241
-
242
- @media (max-width: 640px) {
243
- .pt-buttons {
244
- flex-direction: column;
245
- }
246
- }
247
-
248
- .pt-btn {
249
- flex: 1;
250
- display: flex;
251
- align-items: center;
252
- justify-content: center;
253
- gap: 0.75rem;
254
- padding: 1rem 2rem;
255
- border-radius: 0.75rem;
256
- font-weight: 700;
257
- border: none;
258
- cursor: pointer;
259
- transition: all 0.3s ease;
260
- min-width: auto;
261
- }
262
-
263
- .pt-btn-primary {
264
- background-color: var(--pt-accent);
265
- color: white;
266
- }
267
-
268
- .pt-btn-primary:hover {
269
- background-color: var(--pt-accent-hover);
270
- box-shadow: 0 10px 15px -3px rgba(79, 70, 229, 0.3);
271
- }
272
-
273
- .pt-btn-secondary {
274
- background-color: var(--pt-surface-alt);
275
- color: var(--pt-text);
276
- border: 2px solid var(--pt-border);
277
- }
278
-
279
- .pt-btn-secondary:hover {
280
- border-color: #10b981;
281
- color: #059669;
282
- }
283
-
284
- .pt-btn-icon {
285
- width: 1.5rem;
286
- height: 1.5rem;
287
- }
288
-
289
- .pt-shortcuts {
290
- display: flex;
291
- align-items: center;
292
- gap: 1rem;
293
- font-size: 0.75rem;
294
- color: var(--pt-text-muted);
295
- flex-wrap: wrap;
296
- }
297
-
298
- .pt-shortcut {
299
- display: flex;
300
- align-items: center;
301
- gap: 0.25rem;
302
- }
303
-
304
- .pt-kbd {
305
- background-color: var(--pt-kbd-bg);
306
- padding: 0.125rem 0.375rem;
307
- border-radius: 0.25rem;
308
- border: 1px solid var(--pt-border);
309
- font-size: 0.75rem;
310
- }
311
-
312
- .pt-monitor-wrapper {
313
- position: relative;
314
- display: flex;
315
- justify-content: center;
316
- align-items: center;
317
- cursor: pointer;
318
- min-height: 250px;
319
- }
320
-
321
- .pt-monitor {
322
- position: relative;
323
- aspect-ratio: 16 / 9;
324
- width: 100%;
325
- max-width: 500px;
326
- background: var(--pt-monitor-body);
327
- border-radius: 1rem;
328
- border: 4px solid var(--pt-monitor-body);
329
- box-shadow: 0 25px 50px -12px var(--pt-shadow);
330
- display: flex;
331
- align-items: center;
332
- justify-content: center;
333
- overflow: hidden;
334
- }
335
-
336
- .pt-monitor-screen-wrapper {
337
- position: relative;
338
- width: 100%;
339
- height: 100%;
340
- display: flex;
341
- border-radius: 0.5rem;
342
- overflow: hidden;
343
- }
344
-
345
- .pt-monitor-shine {
346
- position: absolute;
347
- inset: 0;
348
- background: linear-gradient(to top right, rgba(255, 255, 255, 0.05), transparent);
349
- pointer-events: none;
350
- z-index: 10;
351
- border-radius: 0.5rem;
352
- }
353
-
354
- .pt-monitor-screen {
355
- width: 100%;
356
- height: 100%;
357
- display: flex;
358
- transition: background-color 0.5s ease;
359
- background-color: #000;
360
- }
361
-
362
- .pt-monitor-section {
363
- flex: 1;
364
- opacity: 0.9;
365
- }
366
-
367
- .pt-fixer-preview {
368
- position: absolute;
369
- width: 3rem;
370
- height: 3rem;
371
- background: white;
372
- animation: pulse-glow 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
373
- box-shadow: 0 0 20px rgba(255, 255, 255, 0.5);
374
- z-index: 20;
375
- display: none;
376
- }
377
-
378
- @keyframes pulse-glow {
379
- 0%,
380
- 100% {
381
- opacity: 1;
382
- }
383
- 50% {
384
- opacity: 0.7;
385
- }
386
- }
387
-
388
- .pt-monitor-stand {
389
- position: absolute;
390
- bottom: -1rem;
391
- left: 50%;
392
- transform: translateX(-50%);
393
- width: 6rem;
394
- height: 3rem;
395
- background: var(--pt-monitor-body);
396
- border-radius: 0 0 0.75rem 0.75rem;
397
- z-index: -1;
398
- }
399
-
400
- .pt-monitor-base {
401
- position: absolute;
402
- bottom: -1.25rem;
403
- left: 50%;
404
- transform: translateX(-50%);
405
- width: 12rem;
406
- height: 1rem;
407
- background: var(--pt-monitor-screen);
408
- border-radius: 9999px;
409
- margin-top: -1.25rem;
410
- }
411
-
412
- :global(.pt-overlay-hidden) {
413
- position: fixed;
414
- inset: 0;
415
- z-index: 50;
416
- background-color: black;
417
- cursor: none;
418
- display: none;
419
- }
420
-
421
- :global(.pt-overlay-active) {
422
- display: flex;
423
- }
424
-
425
- .pt-overlay-bg {
426
- position: absolute;
427
- inset: 0;
428
- background-color: black;
429
- transition: background-color 0s;
430
- }
431
-
432
- .pt-fixer-box {
433
- position: fixed;
434
- inset: 0;
435
- z-index: 55;
436
- background-color: white;
437
- cursor: none;
438
- overflow: hidden;
439
- display: none;
440
- }
441
-
442
- :global(.theme-dark) .pt-fixer-box {
443
- background-color: var(--pt-surface);
444
- }
445
-
446
- .pt-fixer-box:not(.pt-fixer-hidden) {
447
- display: flex;
448
- }
449
-
450
- .pt-fixer-hidden {
451
- display: none;
452
- }
453
-
454
- .pt-noise-canvas {
455
- position: absolute;
456
- inset: 0;
457
- width: 100%;
458
- height: 100%;
459
- }
460
-
461
- .pt-close-fixer {
462
- position: absolute;
463
- top: 0.5rem;
464
- right: 0.5rem;
465
- padding: 0.5rem;
466
- opacity: 0;
467
- transition: opacity 0.3s ease;
468
- background: rgba(0, 0, 0, 0.5);
469
- color: white;
470
- border: none;
471
- cursor: pointer;
472
- z-index: 60;
473
- display: flex;
474
- align-items: center;
475
- justify-content: center;
476
- }
477
-
478
- .pt-fixer-box:hover .pt-close-fixer {
479
- opacity: 1;
480
- }
481
-
482
- .pt-close-fixer svg {
483
- width: 1rem;
484
- height: 1rem;
485
- }
486
-
487
- .pt-controls {
488
- position: absolute;
489
- bottom: 3rem;
490
- left: 50%;
491
- transform: translateX(-50%);
492
- background: rgba(15, 23, 42, 0.8);
493
- backdrop-filter: blur(0.5rem);
494
- border: 1px solid rgba(255, 255, 255, 0.1);
495
- padding: 1rem;
496
- border-radius: 1rem;
497
- display: flex;
498
- align-items: center;
499
- gap: 1rem;
500
- transition: opacity 0.3s ease;
501
- opacity: 0;
502
- pointer-events: none;
503
- }
504
-
505
- :global(.pt-controls-visible) {
506
- opacity: 1;
507
- pointer-events: auto;
508
- }
509
-
510
- .pt-color-buttons {
511
- display: flex;
512
- gap: 0.5rem;
513
- }
514
-
515
- .pt-color-btn {
516
- width: 2.5rem;
517
- height: 2.5rem;
518
- border-radius: 9999px;
519
- border: 2px solid rgba(255, 255, 255, 0.2);
520
- cursor: pointer;
521
- transition: all 0.3s ease;
522
- }
523
-
524
- .pt-color-btn:hover {
525
- transform: scale(1.1);
526
- box-shadow: 0 0 15px rgba(255, 255, 255, 0.3);
527
- }
528
-
529
- .pt-divider {
530
- width: 1px;
531
- height: 2rem;
532
- background-color: rgba(255, 255, 255, 0.2);
533
- }
534
-
535
- .pt-control-btn {
536
- padding: 0.5rem;
537
- border-radius: 0.5rem;
538
- background: transparent;
539
- color: white;
540
- border: none;
541
- cursor: pointer;
542
- transition: all 0.3s ease;
543
- display: flex;
544
- align-items: center;
545
- justify-content: center;
546
- }
547
-
548
- .pt-control-btn:hover {
549
- color: #4ade80;
550
- background: rgba(255, 255, 255, 0.1);
551
- }
552
-
553
- .pt-control-btn-exit:hover {
554
- color: #ef4444;
555
- }
556
-
557
- .pt-control-btn svg {
558
- width: 1.5rem;
559
- height: 1.5rem;
560
- }
561
- </style>
562
-
119
+
563
120
  <script>
564
121
  const els = {
565
122
  btnStart: document.getElementById('btn-start-test'),