@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
@@ -1,35 +1,5 @@
1
- import type { HardwareToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
-
4
- import type { TestMandoUI } from './ui';
5
- export type TestMandoLocaleContent = ToolLocaleContent<TestMandoUI>;
6
-
7
- export const testMando: HardwareToolEntry<TestMandoUI> = {
8
- id: 'test-mando',
9
- icons: {
10
- bg: 'mdi:gamepad-variant',
11
- fg: 'mdi:gamepad-circle',
12
- },
13
- i18n: {
14
- de: () => import('./i18n/de').then((m) => m.content),
15
- en: () => import('./i18n/en').then((m) => m.content),
16
- es: () => import('./i18n/es').then((m) => m.content),
17
- fr: () => import('./i18n/fr').then((m) => m.content),
18
- id: () => import('./i18n/id').then((m) => m.content),
19
- it: () => import('./i18n/it').then((m) => m.content),
20
- ja: () => import('./i18n/ja').then((m) => m.content),
21
- ko: () => import('./i18n/ko').then((m) => m.content),
22
- nl: () => import('./i18n/nl').then((m) => m.content),
23
- pl: () => import('./i18n/pl').then((m) => m.content),
24
- pt: () => import('./i18n/pt').then((m) => m.content),
25
- ru: () => import('./i18n/ru').then((m) => m.content),
26
- sv: () => import('./i18n/sv').then((m) => m.content),
27
- tr: () => import('./i18n/tr').then((m) => m.content),
28
- zh: () => import('./i18n/zh').then((m) => m.content),
29
- },
30
- };
31
-
32
-
1
+ import { testMando } from './entry';
2
+ export * from './entry';
33
3
  export const TEST_MANDO_TOOL: ToolDefinition = {
34
4
  entry: testMando,
35
5
  Component: () => import('./component.astro'),
@@ -15,127 +15,7 @@ const t = (ui ?? {}) as ProbadorVibracionMandoUI;
15
15
  <div id="pv-root" class="pv-wrapper"
16
16
  data-s={JSON.stringify({ f: t.deviceFallback, cs: t.deviceConnectedSub, d: t.deviceDisconnected, ds: t.deviceDisconnectedSub })}>
17
17
 
18
- <style is:global>
19
- .pv-status-header.pv-connected {
20
- background: rgba(16, 185, 129, 0.1);
21
- border-color: rgba(16, 185, 129, 0.2);
22
- box-shadow: inset 0 0 20px rgba(16, 185, 129, 0.1);
23
- }
24
-
25
- .pv-status-header.pv-connected .pv-status-avatar {
26
- background: #10b981;
27
- color: white;
28
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
29
- animation: pv-bounce-in 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
30
- }
31
-
32
- .pv-status-header.pv-connected .pv-indicator {
33
- background: #10b981;
34
- box-shadow: 0 0 10px rgba(16, 185, 129, 0.4);
35
- }
36
-
37
- .pv-tab-btn.pv-active {
38
- background: var(--pv-surface);
39
- color: var(--pv-accent);
40
- box-shadow: 0 4px 10px rgba(0, 0, 0, 0.07);
41
- }
42
-
43
- .pv-preset-card.pv-vibrating {
44
- animation: pv-card-shake 0.1s infinite;
45
- background: var(--pv-accent);
46
- color: white;
47
- border-color: var(--pv-accent);
48
- }
49
-
50
- .pv-preset-card.pv-vibrating .pv-preset-icon {
51
- color: white;
52
- background: rgba(255, 255, 255, 0.2);
53
- }
54
-
55
- .pv-preset-card.pv-vibrating .pv-preset-desc {
56
- color: rgba(255, 255, 255, 0.8);
57
- }
58
-
59
- .pv-warning.pv-visible {
60
- display: block;
61
- }
62
-
63
- .pv-wrapper {
64
- --pv-accent: #8b5cf6;
65
- --pv-accent-glow: rgba(139, 92, 246, 0.4);
66
- --pv-accent-secondary: #ec4899;
67
- --pv-surface: #fff;
68
- --pv-surface-alt: #f1f5f9;
69
- --pv-surface-hover: #e2e8f0;
70
- --pv-border: rgba(0, 0, 0, 0.08);
71
- --pv-text: #1e293b;
72
- --pv-text-muted: #64748b;
73
- --pv-danger: #ef4444;
74
- }
75
-
76
- .theme-dark .pv-wrapper {
77
- --pv-surface: #0f172a;
78
- --pv-surface-alt: rgba(30, 41, 59, 0.8);
79
- --pv-surface-hover: rgba(51, 65, 85, 0.8);
80
- --pv-border: rgba(255, 255, 255, 0.1);
81
- --pv-text: #f8fafc;
82
- --pv-text-muted: #94a3b8;
83
- }
84
-
85
- .theme-dark .pv-card {
86
- box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.5);
87
- }
88
-
89
- .theme-dark .pv-warning {
90
- background: rgba(245, 158, 11, 0.1);
91
- color: #fcd34d;
92
- }
93
-
94
- .pv-tab-pane {
95
- display: none;
96
- animation: pv-fade-up 300ms ease;
97
- }
98
-
99
- .pv-tab-pane.pv-active {
100
- display: flex;
101
- flex-direction: column;
102
- gap: 1.5rem;
103
- }
104
-
105
- @keyframes pv-bounce-in {
106
- 0% {
107
- transform: scale(0.5);
108
- opacity: 0;
109
- }
110
- 80% {
111
- transform: scale(1.1);
112
- }
113
- 100% {
114
- transform: scale(1);
115
- opacity: 1;
116
- }
117
- }
118
-
119
- @keyframes pv-card-shake {
120
- 0% { transform: translateX(0); }
121
- 25% { transform: translateX(-2px) rotate(-1deg); }
122
- 50% { transform: translateX(2px) rotate(1deg); }
123
- 75% { transform: translateX(-1px) rotate(-1deg); }
124
- 100% { transform: translateX(1px) rotate(1deg); }
125
- }
126
-
127
- @keyframes pv-fade-up {
128
- from {
129
- opacity: 0;
130
- transform: translateY(10px);
131
- }
132
- to {
133
- opacity: 1;
134
- transform: translateY(0);
135
- }
136
- }
137
- </style>
138
-
18
+
139
19
  <div class="pv-card">
140
20
 
141
21
  <div id="pv-status-head" class="pv-status-header">
@@ -265,289 +145,7 @@ const t = (ui ?? {}) as ProbadorVibracionMandoUI;
265
145
 
266
146
  </div>
267
147
 
268
- <style>
269
- .pv-wrapper {
270
- max-width: 650px;
271
- margin: 0 auto;
272
- color: var(--pv-text);
273
- }
274
-
275
- .pv-card {
276
- background: var(--pv-surface);
277
- border: 1px solid var(--pv-border);
278
- border-radius: 1.5rem;
279
- padding: 2rem;
280
- box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.1);
281
- display: flex;
282
- flex-direction: column;
283
- gap: 1.5rem;
284
- }
285
-
286
- .pv-status-header {
287
- display: flex;
288
- align-items: center;
289
- gap: 1.25rem;
290
- padding: 1.25rem;
291
- background: var(--pv-surface-alt);
292
- border-radius: 1rem;
293
- border: 1px solid var(--pv-border);
294
- transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1);
295
- }
296
-
297
- .pv-status-avatar {
298
- width: 3rem;
299
- height: 3rem;
300
- border-radius: 0.75rem;
301
- background: var(--pv-surface-hover);
302
- display: flex;
303
- align-items: center;
304
- justify-content: center;
305
- color: var(--pv-text-muted);
306
- flex-shrink: 0;
307
- transition: all 300ms;
308
- }
309
-
310
- .pv-status-icon {
311
- width: 1.75rem;
312
- height: 1.75rem;
313
- }
314
-
315
- .pv-status-info {
316
- flex: 1;
317
- min-width: 0;
318
- }
319
-
320
- .pv-dev-name {
321
- margin: 0;
322
- font-size: 1.1rem;
323
- font-weight: 800;
324
- white-space: nowrap;
325
- overflow: hidden;
326
- text-overflow: ellipsis;
327
- }
328
-
329
- .pv-dev-sub {
330
- margin: 0.25rem 0 0;
331
- font-size: 0.85rem;
332
- color: var(--pv-text-muted);
333
- }
334
-
335
- .pv-indicator {
336
- flex-shrink: 0;
337
- width: 0.75rem;
338
- height: 0.75rem;
339
- border-radius: 9999px;
340
- background: var(--pv-danger);
341
- box-shadow: 0 0 10px rgba(239, 68, 68, 0.4);
342
- transition: all 300ms;
343
- }
344
-
345
- .pv-warning {
346
- font-size: 0.85rem;
347
- color: #b45309;
348
- background: #fef3c7;
349
- padding: 0.75rem;
350
- border-radius: 0.5rem;
351
- border-left: 4px solid #f59e0b;
352
- display: none;
353
- }
354
-
355
- .pv-tabs-nav {
356
- display: flex;
357
- background: var(--pv-surface-alt);
358
- padding: 0.5rem;
359
- border-radius: 1rem;
360
- gap: 0.5rem;
361
- }
362
-
363
- .pv-tab-btn {
364
- flex: 1;
365
- display: flex;
366
- align-items: center;
367
- justify-content: center;
368
- gap: 0.5rem;
369
- padding: 0.75rem 1rem;
370
- border: none;
371
- background: transparent;
372
- color: var(--pv-text-muted);
373
- font-weight: 700;
374
- font-size: 0.9rem;
375
- border-radius: 0.75rem;
376
- cursor: pointer;
377
- transition: all 200ms;
378
- }
379
-
380
- .pv-tab-btn:hover {
381
- color: var(--pv-text);
382
- background: var(--pv-surface-hover);
383
- }
384
-
385
- .pv-tab-icon {
386
- width: 1.125rem;
387
- height: 1.125rem;
388
- }
389
-
390
- .pv-presets-grid {
391
- display: grid;
392
- grid-template-columns: repeat(2, 1fr);
393
- gap: 1rem;
394
- }
395
-
396
- @media (max-width: 480px) {
397
- .pv-presets-grid {
398
- grid-template-columns: 1fr;
399
- }
400
- }
401
-
402
- .pv-preset-card {
403
- background: var(--pv-surface-alt);
404
- border: 1px solid var(--pv-border);
405
- border-radius: 1rem;
406
- padding: 1.25rem;
407
- display: flex;
408
- flex-direction: column;
409
- align-items: flex-start;
410
- gap: 0.75rem;
411
- cursor: pointer;
412
- transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
413
- position: relative;
414
- overflow: hidden;
415
- }
416
-
417
- .pv-preset-card:hover {
418
- transform: translateY(-2px);
419
- border-color: var(--pv-accent);
420
- box-shadow: 0 10px 20px rgba(139, 92, 246, 0.1);
421
- }
422
-
423
- .pv-preset-icon {
424
- width: 2.5rem;
425
- height: 2.5rem;
426
- background: var(--pv-surface);
427
- border-radius: 0.625rem;
428
- display: flex;
429
- align-items: center;
430
- justify-content: center;
431
- color: var(--pv-accent);
432
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
433
- transition: all 200ms;
434
- }
435
-
436
- .pv-preset-icon-svg {
437
- width: 1.5rem;
438
- height: 1.5rem;
439
- }
440
-
441
- .pv-preset-title {
442
- font-weight: 800;
443
- font-size: 1rem;
444
- margin: 0;
445
- }
446
-
447
- .pv-preset-desc {
448
- font-size: 0.8rem;
449
- color: var(--pv-text-muted);
450
- margin: 0;
451
- line-height: 1.4;
452
- transition: color 200ms;
453
- }
454
-
455
- .pv-custom-sliders {
456
- display: flex;
457
- flex-direction: column;
458
- gap: 1.25rem;
459
- background: var(--pv-surface-alt);
460
- padding: 1.5rem;
461
- border-radius: 1rem;
462
- border: 1px solid var(--pv-border);
463
- }
464
-
465
- .pv-slider-group {
466
- display: flex;
467
- flex-direction: column;
468
- gap: 0.75rem;
469
- }
470
-
471
- .pv-slider-header {
472
- display: flex;
473
- justify-content: space-between;
474
- align-items: center;
475
- font-size: 0.9rem;
476
- font-weight: 700;
477
- }
478
-
479
- .pv-slider-val {
480
- background: var(--pv-surface);
481
- padding: 0.25rem 0.5rem;
482
- border-radius: 0.375rem;
483
- font-size: 0.85rem;
484
- font-weight: 700;
485
- color: var(--pv-accent);
486
- min-width: 3rem;
487
- text-align: center;
488
- }
489
-
490
- .pv-slider {
491
- -webkit-appearance: none;
492
- appearance: none;
493
- width: 100%;
494
- height: 8px;
495
- background: var(--pv-surface-hover);
496
- border-radius: 4px;
497
- outline: none;
498
- }
499
-
500
- .pv-slider::-webkit-slider-thumb {
501
- -webkit-appearance: none;
502
- appearance: none;
503
- width: 1.5rem;
504
- height: 1.5rem;
505
- border-radius: 9999px;
506
- background: var(--pv-accent);
507
- cursor: pointer;
508
- border: 3px solid var(--pv-surface);
509
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
510
- transition: transform 100ms;
511
- }
512
-
513
- .pv-slider::-webkit-slider-thumb:hover {
514
- transform: scale(1.15);
515
- }
516
-
517
- .pv-btn-send {
518
- width: 100%;
519
- padding: 1.25rem;
520
- border-radius: 1rem;
521
- border: none;
522
- background: linear-gradient(135deg, var(--pv-accent), var(--pv-accent-secondary));
523
- color: white;
524
- font-size: 1.1rem;
525
- font-weight: 900;
526
- letter-spacing: 0.5px;
527
- cursor: pointer;
528
- box-shadow: 0 10px 25px var(--pv-accent-glow);
529
- display: flex;
530
- align-items: center;
531
- justify-content: center;
532
- gap: 0.75rem;
533
- transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
534
- }
535
-
536
- .pv-btn-send:hover {
537
- transform: translateY(-2px);
538
- box-shadow: 0 15px 30px var(--pv-accent-glow);
539
- }
540
-
541
- .pv-btn-send:active {
542
- transform: translateY(1px);
543
- }
544
-
545
- .pv-btn-send-icon {
546
- width: 1.5rem;
547
- height: 1.5rem;
548
- }
549
- </style>
550
-
148
+
551
149
  <script>
552
150
  interface VibPad {
553
151
  vibrationActuator?: { playEffect: (t: string, p: object) => Promise<void> };
@@ -0,0 +1,30 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+
4
+ import type { ProbadorVibracionMandoUI } from './ui';
5
+ export type ProbadorVibracionMandoLocaleContent = ToolLocaleContent<ProbadorVibracionMandoUI>;
6
+
7
+ export const probadorVibracionMando: HardwareToolEntry<ProbadorVibracionMandoUI> = {
8
+ id: 'probador-vibracion-mando',
9
+ icons: {
10
+ bg: 'mdi:vibrate',
11
+ fg: 'mdi:gamepad-variant',
12
+ },
13
+ i18n: {
14
+ de: () => import('./i18n/de').then((m) => m.content),
15
+ en: () => import('./i18n/en').then((m) => m.content),
16
+ es: () => import('./i18n/es').then((m) => m.content),
17
+ fr: () => import('./i18n/fr').then((m) => m.content),
18
+ id: () => import('./i18n/id').then((m) => m.content),
19
+ it: () => import('./i18n/it').then((m) => m.content),
20
+ ja: () => import('./i18n/ja').then((m) => m.content),
21
+ ko: () => import('./i18n/ko').then((m) => m.content),
22
+ nl: () => import('./i18n/nl').then((m) => m.content),
23
+ pl: () => import('./i18n/pl').then((m) => m.content),
24
+ pt: () => import('./i18n/pt').then((m) => m.content),
25
+ ru: () => import('./i18n/ru').then((m) => m.content),
26
+ sv: () => import('./i18n/sv').then((m) => m.content),
27
+ tr: () => import('./i18n/tr').then((m) => m.content),
28
+ zh: () => import('./i18n/zh').then((m) => m.content),
29
+ },
30
+ };