@jjlmoya/utils-hardware 1.28.0 → 1.30.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 (57) 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 +1 -1
  6. package/src/tests/tool_validation.test.ts +1 -1
  7. package/src/tool/mouseJitterAngleSnappingTest/bibliography.astro +14 -0
  8. package/src/tool/mouseJitterAngleSnappingTest/bibliography.ts +16 -0
  9. package/src/tool/mouseJitterAngleSnappingTest/component.astro +110 -0
  10. package/src/tool/mouseJitterAngleSnappingTest/entry.ts +29 -0
  11. package/src/tool/mouseJitterAngleSnappingTest/i18n/de.ts +289 -0
  12. package/src/tool/mouseJitterAngleSnappingTest/i18n/en.ts +289 -0
  13. package/src/tool/mouseJitterAngleSnappingTest/i18n/es.ts +289 -0
  14. package/src/tool/mouseJitterAngleSnappingTest/i18n/fr.ts +289 -0
  15. package/src/tool/mouseJitterAngleSnappingTest/i18n/id.ts +289 -0
  16. package/src/tool/mouseJitterAngleSnappingTest/i18n/it.ts +289 -0
  17. package/src/tool/mouseJitterAngleSnappingTest/i18n/ja.ts +289 -0
  18. package/src/tool/mouseJitterAngleSnappingTest/i18n/ko.ts +289 -0
  19. package/src/tool/mouseJitterAngleSnappingTest/i18n/nl.ts +289 -0
  20. package/src/tool/mouseJitterAngleSnappingTest/i18n/pl.ts +289 -0
  21. package/src/tool/mouseJitterAngleSnappingTest/i18n/pt.ts +289 -0
  22. package/src/tool/mouseJitterAngleSnappingTest/i18n/ru.ts +289 -0
  23. package/src/tool/mouseJitterAngleSnappingTest/i18n/sv.ts +289 -0
  24. package/src/tool/mouseJitterAngleSnappingTest/i18n/tr.ts +289 -0
  25. package/src/tool/mouseJitterAngleSnappingTest/i18n/zh.ts +289 -0
  26. package/src/tool/mouseJitterAngleSnappingTest/index.ts +9 -0
  27. package/src/tool/mouseJitterAngleSnappingTest/logic.ts +245 -0
  28. package/src/tool/mouseJitterAngleSnappingTest/model.ts +38 -0
  29. package/src/tool/mouseJitterAngleSnappingTest/mouse-jitter-angle-snapping-test.css +412 -0
  30. package/src/tool/mouseJitterAngleSnappingTest/render.ts +48 -0
  31. package/src/tool/mouseJitterAngleSnappingTest/seo.astro +15 -0
  32. package/src/tool/mouseJitterAngleSnappingTest/ui.ts +29 -0
  33. package/src/tool/subwooferCrossoverTest/bibliography.astro +14 -0
  34. package/src/tool/subwooferCrossoverTest/bibliography.ts +16 -0
  35. package/src/tool/subwooferCrossoverTest/component.astro +253 -0
  36. package/src/tool/subwooferCrossoverTest/entry.ts +29 -0
  37. package/src/tool/subwooferCrossoverTest/i18n/de.ts +188 -0
  38. package/src/tool/subwooferCrossoverTest/i18n/en.ts +188 -0
  39. package/src/tool/subwooferCrossoverTest/i18n/es.ts +188 -0
  40. package/src/tool/subwooferCrossoverTest/i18n/fr.ts +188 -0
  41. package/src/tool/subwooferCrossoverTest/i18n/id.ts +188 -0
  42. package/src/tool/subwooferCrossoverTest/i18n/it.ts +188 -0
  43. package/src/tool/subwooferCrossoverTest/i18n/ja.ts +188 -0
  44. package/src/tool/subwooferCrossoverTest/i18n/ko.ts +188 -0
  45. package/src/tool/subwooferCrossoverTest/i18n/nl.ts +188 -0
  46. package/src/tool/subwooferCrossoverTest/i18n/pl.ts +188 -0
  47. package/src/tool/subwooferCrossoverTest/i18n/pt.ts +188 -0
  48. package/src/tool/subwooferCrossoverTest/i18n/ru.ts +188 -0
  49. package/src/tool/subwooferCrossoverTest/i18n/sv.ts +188 -0
  50. package/src/tool/subwooferCrossoverTest/i18n/tr.ts +188 -0
  51. package/src/tool/subwooferCrossoverTest/i18n/zh.ts +188 -0
  52. package/src/tool/subwooferCrossoverTest/index.ts +11 -0
  53. package/src/tool/subwooferCrossoverTest/logic.ts +30 -0
  54. package/src/tool/subwooferCrossoverTest/seo.astro +15 -0
  55. package/src/tool/subwooferCrossoverTest/subwoofer-crossover-test.css +282 -0
  56. package/src/tool/subwooferCrossoverTest/ui.ts +20 -0
  57. package/src/tools.ts +3 -1
@@ -0,0 +1,282 @@
1
+ .sct-shell {
2
+ --sct-ink: #111827;
3
+ --sct-muted: #667085;
4
+ --sct-panel: rgba(255, 255, 255, 0.74);
5
+ --sct-panel-strong: rgba(255, 255, 255, 0.94);
6
+ --sct-line: rgba(15, 23, 42, 0.14);
7
+ --sct-a: #00a3ff;
8
+ --sct-b: #ff2e63;
9
+ --sct-c: #f7c948;
10
+ --sct-shadow: rgba(15, 23, 42, 0.16);
11
+
12
+ color: var(--sct-ink);
13
+ width: 100%;
14
+ }
15
+
16
+ .theme-dark .sct-shell {
17
+ --sct-ink: #f8fafc;
18
+ --sct-muted: #a8b3c7;
19
+ --sct-panel: rgba(15, 23, 42, 0.7);
20
+ --sct-panel-strong: rgba(2, 6, 23, 0.92);
21
+ --sct-line: rgba(226, 232, 240, 0.2);
22
+ --sct-shadow: rgba(0, 0, 0, 0.45);
23
+ }
24
+
25
+ .sct-console {
26
+ position: relative;
27
+ overflow: hidden;
28
+ border: 1px solid var(--sct-line);
29
+ border-radius: 8px;
30
+ padding: clamp(1rem, 3vw, 1.6rem);
31
+ background:
32
+ radial-gradient(circle at 20% 20%, rgba(0, 163, 255, 0.22), transparent 28%),
33
+ radial-gradient(circle at 84% 10%, rgba(255, 46, 99, 0.18), transparent 26%),
34
+ linear-gradient(135deg, rgba(248, 250, 252, 0.92), rgba(226, 232, 240, 0.56));
35
+ box-shadow: 0 18px 46px var(--sct-shadow);
36
+ }
37
+
38
+ .theme-dark .sct-console {
39
+ background:
40
+ radial-gradient(circle at 20% 20%, rgba(0, 163, 255, 0.18), transparent 28%),
41
+ radial-gradient(circle at 84% 10%, rgba(255, 46, 99, 0.14), transparent 26%),
42
+ linear-gradient(135deg, rgba(2, 6, 23, 0.96), rgba(15, 23, 42, 0.76));
43
+ }
44
+
45
+ .sct-stage {
46
+ display: grid;
47
+ grid-template-columns: minmax(8rem, 0.9fr) minmax(0, 1.4fr);
48
+ gap: clamp(1rem, 4vw, 2rem);
49
+ align-items: stretch;
50
+ }
51
+
52
+ .sct-orbit,
53
+ .sct-frequency-panel,
54
+ .sct-result,
55
+ .sct-slider-wrap {
56
+ border: 1px solid var(--sct-line);
57
+ background: var(--sct-panel);
58
+ backdrop-filter: blur(18px);
59
+ }
60
+
61
+ .sct-orbit {
62
+ position: relative;
63
+ min-height: 16rem;
64
+ border-radius: 8px;
65
+ display: grid;
66
+ place-items: center;
67
+ overflow: hidden;
68
+ }
69
+
70
+ .sct-ring {
71
+ position: absolute;
72
+ border: 2px solid rgba(0, 163, 255, 0.35);
73
+ border-radius: 50%;
74
+ transform: scale(0.7);
75
+ opacity: 0.78;
76
+ }
77
+
78
+ .sct-ring-a {
79
+ width: 82%;
80
+ aspect-ratio: 1;
81
+ }
82
+
83
+ .sct-ring-b {
84
+ width: 58%;
85
+ aspect-ratio: 1;
86
+ border-color: rgba(255, 46, 99, 0.34);
87
+ }
88
+
89
+ .is-running .sct-ring-a {
90
+ animation: sct-pulse 1.3s ease-out infinite;
91
+ }
92
+
93
+ .is-running .sct-ring-b {
94
+ animation: sct-pulse 1.3s ease-out infinite 0.32s;
95
+ }
96
+
97
+ .sct-driver {
98
+ z-index: 1;
99
+ width: min(8.2rem, 56%);
100
+ aspect-ratio: 1;
101
+ border: 1px solid var(--sct-line);
102
+ border-radius: 50%;
103
+ display: grid;
104
+ place-items: center;
105
+ background: radial-gradient(circle, var(--sct-panel-strong) 0 45%, rgba(0, 163, 255, 0.16) 46% 65%, rgba(17, 24, 39, 0.1) 66%);
106
+ }
107
+
108
+ .sct-speaker-icon {
109
+ width: 3.2rem;
110
+ height: 3.2rem;
111
+ color: var(--sct-a);
112
+ }
113
+
114
+ .sct-frequency-panel {
115
+ border-radius: 8px;
116
+ padding: clamp(1rem, 4vw, 2rem);
117
+ display: flex;
118
+ flex-direction: column;
119
+ justify-content: center;
120
+ gap: 1rem;
121
+ }
122
+
123
+ .sct-status,
124
+ .sct-result-label {
125
+ color: var(--sct-muted);
126
+ font-size: 0.78rem;
127
+ font-weight: 800;
128
+ letter-spacing: 0.08em;
129
+ text-transform: uppercase;
130
+ }
131
+
132
+ .sct-frequency {
133
+ display: block;
134
+ font-size: clamp(3.3rem, 16vw, 8.5rem);
135
+ font-weight: 950;
136
+ line-height: 0.9;
137
+ letter-spacing: 0;
138
+ color: var(--sct-ink);
139
+ text-shadow: 0 0 28px rgba(0, 163, 255, 0.22);
140
+ }
141
+
142
+ .sct-meter {
143
+ height: 0.8rem;
144
+ border-radius: 8px;
145
+ background: rgba(15, 23, 42, 0.12);
146
+ overflow: hidden;
147
+ }
148
+
149
+ .sct-meter-fill {
150
+ display: block;
151
+ width: 100%;
152
+ height: 100%;
153
+ transform-origin: left center;
154
+ background: linear-gradient(90deg, var(--sct-b), var(--sct-c), var(--sct-a));
155
+ }
156
+
157
+ .sct-readouts,
158
+ .sct-controls,
159
+ .sct-tuning {
160
+ display: grid;
161
+ gap: 0.75rem;
162
+ }
163
+
164
+ .sct-readouts {
165
+ grid-template-columns: repeat(2, minmax(0, 1fr));
166
+ color: var(--sct-muted);
167
+ font-size: 0.92rem;
168
+ }
169
+
170
+ .sct-controls {
171
+ grid-template-columns: 1.1fr 1.1fr 0.72fr;
172
+ margin-top: 1rem;
173
+ }
174
+
175
+ .sct-primary,
176
+ .sct-secondary,
177
+ .sct-ghost {
178
+ min-height: 3.2rem;
179
+ border: 1px solid var(--sct-line);
180
+ border-radius: 8px;
181
+ cursor: pointer;
182
+ display: inline-flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ gap: 0.55rem;
186
+ font-weight: 850;
187
+ color: var(--sct-ink);
188
+ }
189
+
190
+ .sct-primary {
191
+ color: #fff;
192
+ background: linear-gradient(135deg, #07f, #00b8ff);
193
+ }
194
+
195
+ .sct-primary[data-playing="true"] {
196
+ background: linear-gradient(135deg, #ff2e63, #be123c);
197
+ }
198
+
199
+ .sct-secondary {
200
+ background: var(--sct-panel-strong);
201
+ }
202
+
203
+ .sct-secondary:disabled {
204
+ cursor: not-allowed;
205
+ opacity: 0.48;
206
+ }
207
+
208
+ .sct-ghost {
209
+ background: transparent;
210
+ }
211
+
212
+ .sct-button-icon {
213
+ width: 1.25rem;
214
+ height: 1.25rem;
215
+ }
216
+
217
+ .sct-tuning {
218
+ grid-template-columns: repeat(2, minmax(0, 1fr));
219
+ margin-top: 0.75rem;
220
+ }
221
+
222
+ .sct-slider-wrap {
223
+ border-radius: 8px;
224
+ padding: 0.85rem;
225
+ color: var(--sct-muted);
226
+ font-weight: 750;
227
+ }
228
+
229
+ .sct-slider {
230
+ width: 100%;
231
+ margin-top: 0.6rem;
232
+ accent-color: var(--sct-a);
233
+ }
234
+
235
+ .sct-result {
236
+ margin-top: 0.75rem;
237
+ border-radius: 8px;
238
+ padding: 1rem;
239
+ display: grid;
240
+ grid-template-columns: minmax(0, 0.7fr) minmax(0, 1.3fr);
241
+ gap: 1rem;
242
+ align-items: center;
243
+ }
244
+
245
+ .sct-result strong {
246
+ display: block;
247
+ margin-top: 0.18rem;
248
+ font-size: 1.45rem;
249
+ }
250
+
251
+ .sct-result p {
252
+ margin: 0;
253
+ color: var(--sct-muted);
254
+ }
255
+
256
+ @keyframes sct-pulse {
257
+ from {
258
+ opacity: 0.9;
259
+ transform: scale(0.42);
260
+ }
261
+ to {
262
+ opacity: 0;
263
+ transform: scale(1.18);
264
+ }
265
+ }
266
+
267
+ @media (max-width: 760px) {
268
+ .sct-stage,
269
+ .sct-controls,
270
+ .sct-tuning,
271
+ .sct-result {
272
+ grid-template-columns: 1fr;
273
+ }
274
+
275
+ .sct-orbit {
276
+ min-height: 12rem;
277
+ }
278
+
279
+ .sct-readouts {
280
+ grid-template-columns: 1fr;
281
+ }
282
+ }
@@ -0,0 +1,20 @@
1
+ export interface SubwooferCrossoverTestUI extends Record<string, string> {
2
+ sweepLabel: string;
3
+ currentFrequency: string;
4
+ targetFrequency: string;
5
+ elapsed: string;
6
+ statusReady: string;
7
+ statusRunning: string;
8
+ statusStopped: string;
9
+ start: string;
10
+ stop: string;
11
+ markDropout: string;
12
+ reset: string;
13
+ volume: string;
14
+ duration: string;
15
+ safeStart: string;
16
+ roomNote: string;
17
+ dropoutLabel: string;
18
+ dropoutEmpty: string;
19
+ crossoverEstimate: string;
20
+ }
package/src/tools.ts CHANGED
@@ -19,5 +19,7 @@ import { KEYBOARD_CHATTER_TEST_TOOL } from './tool/keyboardChatterTest/index';
19
19
  import { WEB_USB_SERIAL_MONITOR_TOOL } from './tool/webUsbSerialMonitor/index';
20
20
  import { USB_POWER_BUDGET_CALCULATOR_TOOL } from './tool/usbPowerBudgetCalculator/index';
21
21
  import { MOBILE_SENSOR_TEST_TOOL } from './tool/mobileSensorTest/index';
22
+ import { SUBWOOFER_CROSSOVER_TEST_TOOL } from './tool/subwooferCrossoverTest/index';
23
+ import { MOUSE_JITTER_ANGLE_SNAPPING_TEST_TOOL } from './tool/mouseJitterAngleSnappingTest/index';
22
24
 
23
- 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, USB_POWER_BUDGET_CALCULATOR_TOOL, MOBILE_SENSOR_TEST_TOOL, STEREO_AUDIO_TEST_TOOL, WEB_BLUETOOTH_BLE_SCANNER_TOOL, WEB_USB_SERIAL_MONITOR_TOOL];
25
+ 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, MOUSE_JITTER_ANGLE_SNAPPING_TEST_TOOL, ESTIMADOR_SALUD_BATERIA_TOOL, TONE_GENERATOR_TOOL, SUBWOOFER_CROSSOVER_TEST_TOOL, REFRESH_RATE_DETECTOR_TOOL, MONITOR_GHOSTING_TEST_TOOL, SPECTRUM_CANVAS_TOOL, UPS_RUNTIME_CALCULATOR_TOOL, USB_POWER_BUDGET_CALCULATOR_TOOL, MOBILE_SENSOR_TEST_TOOL, STEREO_AUDIO_TEST_TOOL, WEB_BLUETOOTH_BLE_SCANNER_TOOL, WEB_USB_SERIAL_MONITOR_TOOL];