@jjlmoya/utils-science 1.17.0 → 1.18.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.
@@ -0,0 +1,415 @@
1
+ :root {
2
+ --microwave-primary: #e11d48;
3
+ --microwave-text: #0f172a;
4
+ --microwave-text-muted: #64748b;
5
+ --microwave-bg: #fff;
6
+ --microwave-bg-secondary: #fafbfc;
7
+ --microwave-bg-tertiary: #f1f5f9;
8
+ --microwave-border: #e2e8f0;
9
+ --microwave-border-light: #f1f5f9;
10
+ --microwave-badge-bg: rgba(255, 255, 255, 0.9);
11
+ --microwave-panel-shadow: rgba(0, 0, 0, 0.05);
12
+ --microwave-modal-backdrop: rgba(255, 255, 255, 0.98);
13
+ --microwave-modal-icon-bg: var(--microwave-bg-tertiary);
14
+ --microwave-emerald: #10b981;
15
+ --microwave-yellow: #eab308;
16
+ --microwave-orange: #f97316;
17
+ --microwave-red: #dc2626;
18
+ --microwave-indigo: #4f46e5;
19
+ }
20
+
21
+ .theme-dark {
22
+ --microwave-text: #fff;
23
+ --microwave-text-muted: #94a3b8;
24
+ --microwave-bg: #000;
25
+ --microwave-bg-secondary: #0f172a;
26
+ --microwave-bg-tertiary: #1e293b;
27
+ --microwave-border: #1e293b;
28
+ --microwave-border-light: #334155;
29
+ --microwave-badge-bg: rgba(15, 23, 42, 0.5);
30
+ --microwave-panel-shadow: rgba(0, 0, 0, 0.3);
31
+ --microwave-modal-backdrop: rgba(15, 23, 42, 0.95);
32
+ --microwave-modal-icon-bg: var(--microwave-bg-tertiary);
33
+ }
34
+
35
+ .microwave-detector-container {
36
+ max-width: 56rem;
37
+ margin: 0 auto;
38
+ padding: 1rem;
39
+
40
+ @media (min-width: 640px) {
41
+ padding: 2rem;
42
+ }
43
+
44
+ position: relative;
45
+ }
46
+
47
+ .microwave-modal {
48
+ position: fixed;
49
+ inset: 0;
50
+ z-index: 50;
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ padding: 1rem;
55
+ background-color: var(--microwave-modal-backdrop);
56
+ backdrop-filter: blur(12px);
57
+ }
58
+
59
+ .microwave-modal-content {
60
+ background-color: var(--microwave-bg);
61
+ border: 1px solid var(--microwave-border);
62
+ border-radius: 1.5rem;
63
+ padding: 2rem;
64
+ max-width: 28rem;
65
+ width: 100%;
66
+ text-align: center;
67
+ animation: zoomIn 0.3s ease-out;
68
+ box-shadow: 0 20px 25px -5px var(--microwave-panel-shadow);
69
+ }
70
+
71
+ .microwave-modal-icon {
72
+ background-color: var(--microwave-modal-icon-bg);
73
+ width: 5rem;
74
+ height: 5rem;
75
+ border-radius: 9999px;
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ margin: 0 auto 1.5rem;
80
+ }
81
+
82
+ .microwave-modal-icon svg {
83
+ width: 3rem;
84
+ height: 3rem;
85
+ color: var(--microwave-primary);
86
+ }
87
+
88
+ .microwave-modal-content h2 {
89
+ font-size: 1.5rem;
90
+ font-weight: 700;
91
+ color: var(--microwave-text);
92
+ margin-bottom: 1rem;
93
+ }
94
+
95
+ .microwave-modal-content p {
96
+ color: var(--microwave-text-muted);
97
+ margin-bottom: 2rem;
98
+ line-height: 1.6;
99
+ }
100
+
101
+ .microwave-btn-start {
102
+ width: 100%;
103
+ padding: 1rem;
104
+ background-color: var(--microwave-indigo);
105
+ color: white;
106
+ border: none;
107
+ border-radius: 0.75rem;
108
+ font-weight: 700;
109
+ font-size: 1rem;
110
+ cursor: pointer;
111
+ transition: background-color 0.2s, box-shadow 0.2s;
112
+ box-shadow: 0 4px 6px -1px rgba(79, 70, 229, 0.2);
113
+ }
114
+
115
+ .microwave-btn-start:hover {
116
+ background-color: #4338ca;
117
+ opacity: 0.9;
118
+ }
119
+
120
+ .microwave-btn-start:active {
121
+ transform: scale(0.95);
122
+ }
123
+
124
+ .microwave-modal.hidden {
125
+ display: none;
126
+ }
127
+
128
+ .microwave-detector-panel {
129
+ background-color: var(--microwave-bg);
130
+ border: 1px solid var(--microwave-border);
131
+ border-radius: 2.5rem;
132
+ box-shadow: 0 20px 25px -5px var(--microwave-panel-shadow);
133
+ overflow: hidden;
134
+ padding: 1.5rem;
135
+ position: relative;
136
+
137
+ @media (min-width: 640px) {
138
+ padding: 2.5rem;
139
+ }
140
+ }
141
+
142
+ .microwave-header {
143
+ display: flex;
144
+ justify-content: space-between;
145
+ align-items: flex-start;
146
+ margin-bottom: 2rem;
147
+ }
148
+
149
+ .microwave-label {
150
+ color: var(--microwave-primary);
151
+ font-size: 0.75rem;
152
+ text-transform: uppercase;
153
+ letter-spacing: 0.3em;
154
+ font-weight: 700;
155
+ display: block;
156
+ margin-bottom: 0.25rem;
157
+ }
158
+
159
+ .microwave-title {
160
+ color: var(--microwave-text);
161
+ font-size: 1.875rem;
162
+ font-weight: 900;
163
+ font-style: italic;
164
+ letter-spacing: -0.02em;
165
+ }
166
+
167
+ .microwave-status-badge {
168
+ display: flex;
169
+ align-items: center;
170
+ gap: 0.5rem;
171
+ background-color: var(--microwave-badge-bg);
172
+ padding: 0.5rem 1rem;
173
+ border-radius: 9999px;
174
+ border: 1px solid var(--microwave-border);
175
+ }
176
+
177
+ .microwave-status-dot {
178
+ width: 0.75rem;
179
+ height: 0.75rem;
180
+ border-radius: 50%;
181
+ background-color: var(--microwave-secondary);
182
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
183
+ }
184
+
185
+ .microwave-status-text {
186
+ color: var(--microwave-text-muted);
187
+ font-size: 0.625rem;
188
+ text-transform: uppercase;
189
+ }
190
+
191
+ @keyframes pulse {
192
+ 0%, 100% {
193
+ opacity: 1;
194
+ }
195
+ 50% {
196
+ opacity: 0.5;
197
+ }
198
+ }
199
+
200
+ .microwave-canvas-container {
201
+ position: relative;
202
+ aspect-ratio: 2.3333;
203
+ background-color: var(--microwave-bg-secondary);
204
+ border: 1px solid var(--microwave-border);
205
+ border-radius: 1rem;
206
+ overflow: hidden;
207
+ margin-bottom: 2rem;
208
+ }
209
+
210
+ #interference-canvas {
211
+ width: 100%;
212
+ height: 100%;
213
+ opacity: 0.6;
214
+ display: block;
215
+ }
216
+
217
+ .microwave-canvas-overlay {
218
+ position: absolute;
219
+ inset: 0;
220
+ display: flex;
221
+ flex-direction: column;
222
+ align-items: center;
223
+ justify-content: center;
224
+ pointer-events: none;
225
+ }
226
+
227
+ .microwave-big-value {
228
+ font-size: 120px;
229
+
230
+ @media (min-width: 640px) {
231
+ font-size: 180px;
232
+ }
233
+
234
+ font-weight: 900;
235
+ font-style: italic;
236
+ letter-spacing: -0.02em;
237
+ color: white;
238
+ opacity: 0.05;
239
+ user-select: none;
240
+ line-height: 1;
241
+ }
242
+
243
+ .microwave-jitter-display {
244
+ position: absolute;
245
+ inset: 0;
246
+ display: flex;
247
+ flex-direction: column;
248
+ align-items: center;
249
+ justify-content: center;
250
+ }
251
+
252
+ .microwave-jitter-value {
253
+ color: var(--microwave-primary);
254
+ font-size: 40px;
255
+
256
+ @media (min-width: 640px) {
257
+ font-size: 60px;
258
+ }
259
+
260
+ font-weight: 900;
261
+ }
262
+
263
+ .microwave-jitter-unit {
264
+ color: var(--microwave-text-muted);
265
+ font-size: 0.75rem;
266
+ text-transform: uppercase;
267
+ letter-spacing: 0.05em;
268
+ margin-top: -0.625rem;
269
+ }
270
+
271
+ .microwave-canvas-grid {
272
+ position: absolute;
273
+ inset: 0;
274
+ pointer-events: none;
275
+ z-index: 10;
276
+ opacity: 0.2;
277
+ background-image: linear-gradient(var(--microwave-border-light) 1px, transparent 1px), linear-gradient(90deg, var(--microwave-border-light) 1px, transparent 1px);
278
+ background-size: 40px 40px;
279
+ }
280
+
281
+ .microwave-content-grid {
282
+ display: grid;
283
+ grid-template-columns: 1fr;
284
+
285
+ @media (min-width: 768px) {
286
+ grid-template-columns: 1fr 1fr;
287
+ }
288
+
289
+ gap: 2rem;
290
+ align-items: flex-end;
291
+ }
292
+
293
+ .microwave-verdict {
294
+ padding: 1.5rem;
295
+ border-radius: 1rem;
296
+ border: 1px solid var(--microwave-border);
297
+ background-color: var(--microwave-bg-secondary);
298
+ transition: all 0.3s;
299
+ }
300
+
301
+ .microwave-verdict-label {
302
+ font-size: 0.75rem;
303
+ font-weight: 700;
304
+ color: var(--microwave-text-muted);
305
+ text-transform: uppercase;
306
+ letter-spacing: 0.05em;
307
+ margin-bottom: 0.5rem;
308
+ }
309
+
310
+ .microwave-verdict-desc {
311
+ color: var(--microwave-text);
312
+ font-weight: 500;
313
+ }
314
+
315
+ .microwave-latency-info {
316
+ margin-top: 1rem;
317
+ display: flex;
318
+ align-items: center;
319
+ gap: 1rem;
320
+ color: var(--microwave-text-muted);
321
+ }
322
+
323
+ .microwave-latency-badge {
324
+ display: flex;
325
+ align-items: center;
326
+ gap: 0.5rem;
327
+ font-size: 0.75rem;
328
+ }
329
+
330
+ .microwave-latency-badge svg {
331
+ width: 1rem;
332
+ height: 1rem;
333
+ }
334
+
335
+ .microwave-audio-section {
336
+ display: flex;
337
+ flex-direction: column;
338
+ gap: 1rem;
339
+ }
340
+
341
+ .microwave-audio-label {
342
+ display: flex;
343
+ justify-content: space-between;
344
+ align-items: center;
345
+ font-size: 0.75rem;
346
+ color: var(--microwave-text-muted);
347
+ text-transform: uppercase;
348
+ letter-spacing: 0.05em;
349
+ padding: 0 0.5rem;
350
+ }
351
+
352
+ .microwave-btn-audio {
353
+ height: 3rem;
354
+ border-radius: 0.75rem;
355
+ background-color: var(--microwave-bg-tertiary);
356
+ color: var(--microwave-text-muted);
357
+ border: 1px solid var(--microwave-border);
358
+ transition: all 0.2s;
359
+ display: flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ gap: 0.5rem;
363
+ cursor: pointer;
364
+ font-weight: 600;
365
+ font-size: 0.875rem;
366
+ text-transform: uppercase;
367
+ }
368
+
369
+ .microwave-btn-audio:hover {
370
+ background-color: var(--microwave-border-light);
371
+ }
372
+
373
+ .microwave-btn-audio svg {
374
+ width: 1.25rem;
375
+ height: 1.25rem;
376
+ }
377
+
378
+ .microwave-scanline {
379
+ position: absolute;
380
+ inset: 0;
381
+ pointer-events: none;
382
+ z-index: 20;
383
+ opacity: 0.03;
384
+ overflow: hidden;
385
+ border-radius: 2.5rem;
386
+ }
387
+
388
+ .microwave-scanline::before {
389
+ content: '';
390
+ position: absolute;
391
+ height: 4px;
392
+ background-color: white;
393
+ width: 100%;
394
+ animation: scanline 4s linear infinite;
395
+ }
396
+
397
+ @keyframes scanline {
398
+ 0% {
399
+ transform: translateY(-100%);
400
+ }
401
+ 100% {
402
+ transform: translateY(1000%);
403
+ }
404
+ }
405
+
406
+ @keyframes zoomIn {
407
+ from {
408
+ opacity: 0;
409
+ transform: scale(0.95);
410
+ }
411
+ to {
412
+ opacity: 1;
413
+ transform: scale(1);
414
+ }
415
+ }
@@ -87,225 +87,7 @@ const { ui } = Astro.props;
87
87
  </div>
88
88
  </div>
89
89
 
90
- <style is:inline define:vars={{}}>
91
- :root {
92
- --sim-primary: #06c;
93
- --sim-secondary: #60c;
94
- --sim-accent: #2c0;
95
- --sim-text: #0f172a;
96
- --sim-text-muted: #475569;
97
- --sim-bg: #fff;
98
- --sim-bg-secondary: #f8fafc;
99
- --sim-bg-tertiary: #f1f5f9;
100
- --sim-border: #e2e8f0;
101
- --sim-glow-primary: rgba(0, 102, 204, 0.3);
102
- --sim-glow-accent: rgba(34, 204, 0, 0.3);
103
- }
104
-
105
- .theme-dark {
106
- --sim-primary: #00f2ff;
107
- --sim-secondary: #7000ff;
108
- --sim-accent: #39ff14;
109
- --sim-text: #fff;
110
- --sim-text-muted: #a0aec0;
111
- --sim-bg: #12141d;
112
- --sim-bg-secondary: #1c1f2e;
113
- --sim-bg-tertiary: #0a0b10;
114
- --sim-border: #2d3748;
115
- --sim-glow-primary: rgba(0, 242, 255, 0.5);
116
- --sim-glow-accent: rgba(57, 255, 20, 0.4);
117
- }
118
-
119
- .simulation-app {
120
- padding: 0;
121
- border-radius: 28px;
122
- background: var(--sim-bg);
123
- border: 1px solid var(--sim-border);
124
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
125
- overflow: hidden;
126
- max-width: 850px;
127
- }
128
-
129
- .simulation-header {
130
- padding: 2.5rem;
131
- background: linear-gradient(135deg, var(--sim-bg-secondary) 0%, var(--sim-bg) 100%);
132
- border-bottom: 2px solid var(--sim-border);
133
- text-align: center;
134
- }
135
-
136
- .simulation-header h2 {
137
- font-size: 1.5rem;
138
- margin: 0;
139
- color: var(--sim-primary);
140
- text-transform: uppercase;
141
- letter-spacing: 2px;
142
- }
143
-
144
- .simulation-main {
145
- padding: 2.5rem;
146
- display: grid;
147
- grid-template-columns: 1fr;
148
- gap: 2.5rem;
149
- }
150
-
151
- .parameter-card {
152
- background: var(--sim-bg-secondary);
153
- padding: 1.5rem;
154
- border-radius: 20px;
155
- border: 1px solid var(--sim-border);
156
- transition: transform 0.2s ease, border-color 0.2s ease;
157
- }
158
-
159
- .parameter-card:focus-within {
160
- border-color: var(--sim-primary);
161
- transform: translateY(-2px);
162
- }
163
-
164
- .label-row {
165
- display: flex;
166
- justify-content: space-between;
167
- align-items: center;
168
- margin-bottom: 1.5rem;
169
- }
170
-
171
- .label-info {
172
- display: flex;
173
- align-items: center;
174
- gap: 0.75rem;
175
- }
176
-
177
- .label-info label {
178
- font-weight: 700;
179
- font-size: 1.1rem;
180
- color: var(--sim-text);
181
- }
182
-
183
- .helper-text {
184
- font-size: 0.85rem;
185
- color: var(--sim-text-muted);
186
- margin-bottom: 1.5rem;
187
- display: block;
188
- line-height: 1.6;
189
- }
190
-
191
- .control-row {
192
- display: flex;
193
- align-items: center;
194
- gap: 1.5rem;
195
- }
196
-
197
- .slider-container {
198
- flex: 1;
199
- }
200
-
201
- input[type="range"] {
202
- -webkit-appearance: none;
203
- appearance: none;
204
- width: 100%;
205
- height: 12px;
206
- background: var(--sim-bg-tertiary);
207
- border-radius: 10px;
208
- outline: none;
209
- border: 1px solid var(--sim-border);
210
- }
211
-
212
- input[type="range"]::-webkit-slider-thumb {
213
- -webkit-appearance: none;
214
- width: 28px;
215
- height: 28px;
216
- background: var(--sim-primary);
217
- border: 4px solid var(--sim-bg-secondary);
218
- border-radius: 50%;
219
- cursor: pointer;
220
- box-shadow: 0 0 15px var(--sim-glow-primary);
221
- }
222
-
223
- input[type="range"]::-moz-range-thumb {
224
- width: 28px;
225
- height: 28px;
226
- background: var(--sim-primary);
227
- border: 4px solid var(--sim-bg-secondary);
228
- border-radius: 50%;
229
- cursor: pointer;
230
- box-shadow: 0 0 15px var(--sim-glow-primary);
231
- }
232
-
233
- .value-display {
234
- background: var(--sim-bg-tertiary);
235
- border: 1px solid var(--sim-primary);
236
- color: var(--sim-primary);
237
- padding: 0.5rem 1rem;
238
- border-radius: 12px;
239
- font-size: 1.25rem;
240
- font-weight: 700;
241
- min-width: 80px;
242
- text-align: center;
243
- }
244
-
245
- .results-section {
246
- padding: 3rem;
247
- background: var(--sim-bg-tertiary);
248
- border-top: 2px solid var(--sim-border);
249
- text-align: center;
250
- }
251
-
252
- .probability-ring {
253
- position: relative;
254
- display: inline-flex;
255
- justify-content: center;
256
- align-items: center;
257
- margin-bottom: 2rem;
258
- }
259
90
 
260
- .probability-number {
261
- font-size: 5rem;
262
- font-weight: 950;
263
- color: var(--sim-accent);
264
- text-shadow: 0 0 30px var(--sim-glow-accent);
265
- line-height: 1;
266
- }
267
-
268
- .verdict-box {
269
- max-width: 500px;
270
- margin: 0 auto;
271
- }
272
-
273
- .verdict-title {
274
- color: var(--sim-text);
275
- font-size: 1.25rem;
276
- font-weight: 800;
277
- margin-bottom: 1rem;
278
- text-transform: uppercase;
279
- }
280
-
281
- .verdict-detail {
282
- color: var(--sim-text-muted);
283
- font-size: 1rem;
284
- line-height: 1.6;
285
- }
286
-
287
- @media (max-width: 640px) {
288
- .simulation-main,
289
- .results-section {
290
- padding: 1.5rem;
291
- }
292
-
293
- .probability-number {
294
- font-size: 3.5rem;
295
- }
296
-
297
- .simulation-app {
298
- border-radius: 16px;
299
- }
300
- }
301
-
302
- @media (min-width: 1025px) {
303
- .simulation-app {
304
- max-width: 700px;
305
- margin: 0 auto;
306
- }
307
- }
308
- </style>
309
91
 
310
92
  <script>
311
93
  import { SimulationEngine } from "./logic/SimulationEngine";