@jjlmoya/utils-science 1.43.0 → 1.45.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 (53) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +5 -1
  4. package/src/index.ts +2 -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/black-hole-event-horizon-simulator/bibliography.astro +14 -0
  8. package/src/tool/black-hole-event-horizon-simulator/bibliography.ts +16 -0
  9. package/src/tool/black-hole-event-horizon-simulator/black-hole-event-horizon-simulator.css +366 -0
  10. package/src/tool/black-hole-event-horizon-simulator/component.astro +302 -0
  11. package/src/tool/black-hole-event-horizon-simulator/entry.ts +29 -0
  12. package/src/tool/black-hole-event-horizon-simulator/i18n/de.ts +179 -0
  13. package/src/tool/black-hole-event-horizon-simulator/i18n/en.ts +259 -0
  14. package/src/tool/black-hole-event-horizon-simulator/i18n/es.ts +259 -0
  15. package/src/tool/black-hole-event-horizon-simulator/i18n/fr.ts +179 -0
  16. package/src/tool/black-hole-event-horizon-simulator/i18n/id.ts +259 -0
  17. package/src/tool/black-hole-event-horizon-simulator/i18n/it.ts +179 -0
  18. package/src/tool/black-hole-event-horizon-simulator/i18n/ja.ts +179 -0
  19. package/src/tool/black-hole-event-horizon-simulator/i18n/ko.ts +259 -0
  20. package/src/tool/black-hole-event-horizon-simulator/i18n/nl.ts +179 -0
  21. package/src/tool/black-hole-event-horizon-simulator/i18n/pl.ts +259 -0
  22. package/src/tool/black-hole-event-horizon-simulator/i18n/pt.ts +179 -0
  23. package/src/tool/black-hole-event-horizon-simulator/i18n/ru.ts +259 -0
  24. package/src/tool/black-hole-event-horizon-simulator/i18n/sv.ts +179 -0
  25. package/src/tool/black-hole-event-horizon-simulator/i18n/tr.ts +179 -0
  26. package/src/tool/black-hole-event-horizon-simulator/i18n/zh.ts +179 -0
  27. package/src/tool/black-hole-event-horizon-simulator/index.ts +11 -0
  28. package/src/tool/black-hole-event-horizon-simulator/logic.ts +68 -0
  29. package/src/tool/black-hole-event-horizon-simulator/seo.astro +15 -0
  30. package/src/tool/exoplanet-biosignature-detector/bibliography.astro +14 -0
  31. package/src/tool/exoplanet-biosignature-detector/bibliography.ts +16 -0
  32. package/src/tool/exoplanet-biosignature-detector/component.astro +351 -0
  33. package/src/tool/exoplanet-biosignature-detector/entry.ts +26 -0
  34. package/src/tool/exoplanet-biosignature-detector/exoplanet-biosignature-detector.css +516 -0
  35. package/src/tool/exoplanet-biosignature-detector/i18n/de.ts +196 -0
  36. package/src/tool/exoplanet-biosignature-detector/i18n/en.ts +196 -0
  37. package/src/tool/exoplanet-biosignature-detector/i18n/es.ts +196 -0
  38. package/src/tool/exoplanet-biosignature-detector/i18n/fr.ts +196 -0
  39. package/src/tool/exoplanet-biosignature-detector/i18n/id.ts +196 -0
  40. package/src/tool/exoplanet-biosignature-detector/i18n/it.ts +196 -0
  41. package/src/tool/exoplanet-biosignature-detector/i18n/ja.ts +196 -0
  42. package/src/tool/exoplanet-biosignature-detector/i18n/ko.ts +196 -0
  43. package/src/tool/exoplanet-biosignature-detector/i18n/nl.ts +196 -0
  44. package/src/tool/exoplanet-biosignature-detector/i18n/pl.ts +149 -0
  45. package/src/tool/exoplanet-biosignature-detector/i18n/pt.ts +149 -0
  46. package/src/tool/exoplanet-biosignature-detector/i18n/ru.ts +149 -0
  47. package/src/tool/exoplanet-biosignature-detector/i18n/sv.ts +149 -0
  48. package/src/tool/exoplanet-biosignature-detector/i18n/tr.ts +149 -0
  49. package/src/tool/exoplanet-biosignature-detector/i18n/zh.ts +196 -0
  50. package/src/tool/exoplanet-biosignature-detector/index.ts +11 -0
  51. package/src/tool/exoplanet-biosignature-detector/logic.ts +169 -0
  52. package/src/tool/exoplanet-biosignature-detector/seo.astro +15 -0
  53. package/src/tools.ts +4 -0
@@ -0,0 +1,26 @@
1
+ import type { ScienceToolEntry } from '../../types';
2
+
3
+ export const exoplanetBiosignatureDetector: ScienceToolEntry = {
4
+ id: 'exoplanet-biosignature-detector',
5
+ icons: {
6
+ bg: 'mdi:planet',
7
+ fg: 'mdi:sine-wave',
8
+ },
9
+ i18n: {
10
+ en: () => import('./i18n/en').then((m) => m.content),
11
+ de: () => import('./i18n/de').then((m) => m.content),
12
+ es: () => import('./i18n/es').then((m) => m.content),
13
+ fr: () => import('./i18n/fr').then((m) => m.content),
14
+ id: () => import('./i18n/id').then((m) => m.content),
15
+ it: () => import('./i18n/it').then((m) => m.content),
16
+ ja: () => import('./i18n/ja').then((m) => m.content),
17
+ ko: () => import('./i18n/ko').then((m) => m.content),
18
+ nl: () => import('./i18n/nl').then((m) => m.content),
19
+ pl: () => import('./i18n/pl').then((m) => m.content),
20
+ pt: () => import('./i18n/pt').then((m) => m.content),
21
+ ru: () => import('./i18n/ru').then((m) => m.content),
22
+ sv: () => import('./i18n/sv').then((m) => m.content),
23
+ tr: () => import('./i18n/tr').then((m) => m.content),
24
+ zh: () => import('./i18n/zh').then((m) => m.content),
25
+ },
26
+ };
@@ -0,0 +1,516 @@
1
+ .biosig-root {
2
+ --biosig-ink: #13211f;
3
+ --biosig-muted: rgba(19, 33, 31, 0.58);
4
+ --biosig-soft: rgba(19, 33, 31, 0.12);
5
+ --biosig-cyan: #228c92;
6
+ --biosig-green: #38a878;
7
+ --biosig-blue: #356fa8;
8
+ --biosig-spectrum-dim: 0.72;
9
+ --biosig-meter-core: rgba(246, 252, 249, 0.74);
10
+ --biosig-control-fill: 50%;
11
+ --biosig-atmo-hue: 172;
12
+ --biosig-atmo-alpha: 0.32;
13
+ --biosig-life: 48%;
14
+ --biosig-noise: 0.18;
15
+
16
+ position: relative;
17
+ display: grid;
18
+ max-width: 1120px;
19
+ min-height: 760px;
20
+ margin: 0 auto;
21
+ overflow: hidden;
22
+ border: 0;
23
+ border-radius: 0;
24
+ background:
25
+ radial-gradient(circle at 18% 12%, rgba(34, 140, 146, 0.18), transparent 31%),
26
+ radial-gradient(circle at 86% 82%, rgba(56, 168, 120, 0.12), transparent 28%),
27
+ linear-gradient(135deg, rgba(248, 255, 252, 0.76), rgba(220, 238, 232, 0.42));
28
+ box-shadow: none;
29
+ color: var(--biosig-ink);
30
+ backdrop-filter: blur(30px);
31
+ -webkit-backdrop-filter: blur(30px);
32
+ }
33
+
34
+ .theme-dark .biosig-root,
35
+ body.theme-dark .biosig-root,
36
+ html.theme-dark .biosig-root {
37
+ --biosig-ink: #effdfa;
38
+ --biosig-muted: rgba(239, 253, 250, 0.56);
39
+ --biosig-soft: rgba(239, 253, 250, 0.12);
40
+ --biosig-cyan: #76e4de;
41
+ --biosig-green: #6ff0b8;
42
+ --biosig-blue: #83b8f6;
43
+ --biosig-spectrum-dim: 0.58;
44
+ --biosig-meter-core: rgba(5, 18, 24, 0.78);
45
+
46
+ background:
47
+ radial-gradient(circle at 16% 18%, rgba(118, 228, 222, 0.16), transparent 28%),
48
+ radial-gradient(circle at 80% 88%, rgba(111, 240, 184, 0.1), transparent 25%),
49
+ linear-gradient(135deg, rgba(3, 9, 14, 0.42), rgba(2, 6, 9, 0.12));
50
+ }
51
+
52
+ .biosig-root::before {
53
+ content: "";
54
+ position: absolute;
55
+ inset: 0;
56
+ opacity: 0.24;
57
+ background:
58
+ radial-gradient(circle at 8% 12%, currentcolor 0 1px, transparent 1.4px),
59
+ radial-gradient(circle at 92% 16%, currentcolor 0 1px, transparent 1.4px),
60
+ radial-gradient(circle at 77% 52%, currentcolor 0 1px, transparent 1.4px),
61
+ radial-gradient(circle at 19% 88%, currentcolor 0 1px, transparent 1.4px),
62
+ radial-gradient(ellipse at 42% 50%, transparent 0 44%, var(--biosig-soft) 44.2% 44.35%, transparent 44.6%);
63
+ color: var(--biosig-muted);
64
+ pointer-events: none;
65
+ }
66
+
67
+ .biosig-live {
68
+ display: flex;
69
+ gap: 0.48rem;
70
+ align-items: center;
71
+ color: var(--biosig-muted);
72
+ font-size: 0.78rem;
73
+ letter-spacing: 0.08em;
74
+ text-transform: uppercase;
75
+ }
76
+
77
+ .biosig-live span {
78
+ width: 7px;
79
+ aspect-ratio: 1;
80
+ border-radius: 50%;
81
+ background: var(--biosig-cyan);
82
+ box-shadow: 0 0 18px color-mix(in srgb, var(--biosig-cyan), transparent 22%);
83
+ }
84
+
85
+ .biosig-live-top {
86
+ position: absolute;
87
+ top: 1.35rem;
88
+ right: 1.45rem;
89
+ z-index: 4;
90
+ }
91
+
92
+ .biosig-scope {
93
+ position: relative;
94
+ min-height: 590px;
95
+ overflow: visible;
96
+ isolation: isolate;
97
+ }
98
+
99
+ .biosig-planet {
100
+ position: absolute;
101
+ top: 0.7rem;
102
+ left: 46%;
103
+ width: min(108vw, 640px);
104
+ aspect-ratio: 1;
105
+ transform: translateX(-50%);
106
+ filter: drop-shadow(0 48px 110px rgba(0, 0, 0, 0.24));
107
+ }
108
+
109
+ .biosig-planet canvas {
110
+ display: block;
111
+ width: 100%;
112
+ height: 100%;
113
+ filter: saturate(calc(0.7 + var(--biosig-life) / 120)) contrast(1.1);
114
+ transition: filter 240ms ease;
115
+ }
116
+
117
+ .biosig-planet span,
118
+ .biosig-planet::before,
119
+ .biosig-planet::after {
120
+ content: "";
121
+ position: absolute;
122
+ inset: 9%;
123
+ border-radius: 50%;
124
+ border: 1px solid color-mix(in srgb, var(--biosig-cyan), transparent 78%);
125
+ transform: rotate(-13deg) scaleX(1.12);
126
+ pointer-events: none;
127
+ }
128
+
129
+ .biosig-planet::before {
130
+ inset: 0;
131
+ opacity: 0.34;
132
+ }
133
+
134
+ .biosig-planet::after {
135
+ inset: -11%;
136
+ opacity: 0.2;
137
+ }
138
+
139
+ .biosig-spectrum {
140
+ position: absolute;
141
+ right: 8%;
142
+ bottom: 5.2rem;
143
+ left: 8%;
144
+ height: 54px;
145
+ overflow: hidden;
146
+ border-radius: 999px;
147
+ opacity: calc(var(--biosig-spectrum-dim) * 0.9);
148
+ background:
149
+ linear-gradient(90deg, #7156ba 0%, #4280d6 25%, #43b6c4 45%, #62cb87 63%, #decf72 80%, #ef826e 100%),
150
+ linear-gradient(90deg, transparent, rgba(255, 255, 255, calc(var(--biosig-noise) * 0.42)));
151
+ background-blend-mode: screen;
152
+ box-shadow: 0 18px 40px rgba(0, 0, 0, 0.08), inset 0 0 18px rgba(255, 255, 255, 0.16);
153
+ }
154
+
155
+ .biosig-spectrum::after {
156
+ content: "";
157
+ position: absolute;
158
+ inset: 0;
159
+ opacity: calc(0.12 + var(--biosig-noise));
160
+ background:
161
+ repeating-linear-gradient(90deg, transparent 0 10px, rgba(0, 0, 0, 0.3) 10px 11px),
162
+ linear-gradient(180deg, rgba(255, 255, 255, 0.22), transparent 44%, rgba(0, 0, 0, 0.14));
163
+ pointer-events: none;
164
+ }
165
+
166
+ .biosig-line,
167
+ .biosig-spectrum b {
168
+ position: absolute;
169
+ top: -12px;
170
+ bottom: -12px;
171
+ width: 2px;
172
+ z-index: 1;
173
+ transform: translateX(-50%);
174
+ }
175
+
176
+ .biosig-line {
177
+ background: rgba(255, 255, 255, 0.78);
178
+ box-shadow: 0 0 18px rgba(255, 255, 255, 0.84);
179
+ }
180
+
181
+ .biosig-line-o2 {
182
+ left: 68%;
183
+ }
184
+
185
+ .biosig-line-ch4 {
186
+ left: 88%;
187
+ }
188
+
189
+ .biosig-line-o3 {
190
+ left: 54%;
191
+ }
192
+
193
+ .biosig-spectrum b {
194
+ width: 14px;
195
+ border: 1px solid rgba(255, 255, 255, 0.92);
196
+ border-radius: 999px;
197
+ background: rgba(255, 255, 255, 0.16);
198
+ transition: left 180ms ease;
199
+ }
200
+
201
+ .biosig-float {
202
+ z-index: 4;
203
+ pointer-events: none;
204
+ }
205
+
206
+ .biosig-readout {
207
+ position: absolute;
208
+ bottom: 1.5rem;
209
+ left: 1.8rem;
210
+ display: grid;
211
+ gap: 0.2rem;
212
+ }
213
+
214
+ .biosig-float-bio,
215
+ .biosig-float-tech,
216
+ .biosig-float-risk {
217
+ position: absolute;
218
+ display: grid;
219
+ gap: 0.08rem;
220
+ }
221
+
222
+ .biosig-float-bio {
223
+ top: 4.6rem;
224
+ left: 1.35rem;
225
+ }
226
+
227
+ .biosig-float-tech {
228
+ top: 18rem;
229
+ right: 1.3rem;
230
+ }
231
+
232
+ .biosig-float-risk {
233
+ top: 24.2rem;
234
+ right: 1.25rem;
235
+ }
236
+
237
+ .biosig-readout span,
238
+ .biosig-controls span,
239
+ .biosig-evidence span,
240
+ .biosig-float span {
241
+ color: var(--biosig-muted);
242
+ font-size: 0.78rem;
243
+ line-height: 1.1;
244
+ letter-spacing: 0.09em;
245
+ text-transform: uppercase;
246
+ }
247
+
248
+ .biosig-readout strong {
249
+ color: var(--biosig-ink);
250
+ font-size: clamp(7rem, 27vw, 13rem);
251
+ font-weight: 500;
252
+ letter-spacing: -0.04em;
253
+ line-height: 0.72;
254
+ text-shadow: 0 0 34px color-mix(in srgb, var(--biosig-cyan), transparent 62%);
255
+ }
256
+
257
+ .biosig-float-bio strong,
258
+ .biosig-float-tech strong,
259
+ .biosig-float-risk strong {
260
+ color: var(--biosig-ink);
261
+ font-size: clamp(3.15rem, 12vw, 7rem);
262
+ font-weight: 500;
263
+ letter-spacing: -0.05em;
264
+ line-height: 0.8;
265
+ }
266
+
267
+ .biosig-console {
268
+ position: relative;
269
+ z-index: 2;
270
+ display: grid;
271
+ align-content: start;
272
+ gap: 3rem;
273
+ padding: 2rem;
274
+ }
275
+
276
+ .biosig-controls,
277
+ .biosig-evidence {
278
+ padding: 0;
279
+ border: 0;
280
+ background: transparent;
281
+ }
282
+
283
+ .biosig-controls {
284
+ display: grid;
285
+ gap: 1.8rem;
286
+ opacity: 1;
287
+ transition: opacity 180ms ease;
288
+ }
289
+
290
+ .biosig-controls:hover,
291
+ .biosig-controls:focus-within {
292
+ opacity: 1;
293
+ }
294
+
295
+ .biosig-controls label {
296
+ display: grid;
297
+ grid-template-columns: minmax(0, 1fr) auto;
298
+ gap: 0.64rem 1rem;
299
+ align-items: center;
300
+ }
301
+
302
+ .biosig-controls strong {
303
+ color: var(--biosig-ink);
304
+ font-size: 0.9rem;
305
+ font-weight: 600;
306
+ opacity: 1;
307
+ transition: opacity 160ms ease;
308
+ }
309
+
310
+ .biosig-controls label:focus-within strong,
311
+ .biosig-controls label:hover strong {
312
+ opacity: 1;
313
+ }
314
+
315
+ .biosig-controls select,
316
+ .biosig-controls input {
317
+ grid-column: 1 / -1;
318
+ }
319
+
320
+ .biosig-controls select {
321
+ min-height: 48px;
322
+ border: 0;
323
+ border-bottom: 0;
324
+ border-radius: 0;
325
+ background: transparent;
326
+ color: var(--biosig-ink);
327
+ font-size: 1rem;
328
+ padding: 0;
329
+ outline: 0;
330
+ }
331
+
332
+ .biosig-controls option {
333
+ background: #f4fbf8;
334
+ color: #13211f;
335
+ }
336
+
337
+ .theme-dark .biosig-controls option,
338
+ body.theme-dark .biosig-controls option,
339
+ html.theme-dark .biosig-controls option {
340
+ background: #061018;
341
+ color: #effdfa;
342
+ }
343
+
344
+ .biosig-controls input {
345
+ width: 100%;
346
+ height: 26px;
347
+ appearance: none;
348
+ background: transparent;
349
+ cursor: pointer;
350
+ }
351
+
352
+ .biosig-controls input::-webkit-slider-runnable-track {
353
+ height: 6px;
354
+ border-radius: 999px;
355
+ background:
356
+ linear-gradient(90deg, color-mix(in srgb, var(--biosig-cyan), transparent 5%) 0 var(--control-fill, 50%), var(--biosig-soft) var(--control-fill, 50%) 100%),
357
+ linear-gradient(90deg, var(--biosig-soft), var(--biosig-soft));
358
+ box-shadow: 0 0 calc(8px + var(--biosig-noise) * 20px) color-mix(in srgb, var(--biosig-cyan), transparent 58%);
359
+ }
360
+
361
+ .biosig-controls input::-webkit-slider-thumb {
362
+ width: 20px;
363
+ height: 20px;
364
+ appearance: none;
365
+ margin-top: -7px;
366
+ border: 2px solid color-mix(in srgb, var(--biosig-ink), transparent 32%);
367
+ border-radius: 50%;
368
+ background: color-mix(in srgb, var(--biosig-ink), white 86%);
369
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--biosig-cyan), transparent 86%), 0 0 26px color-mix(in srgb, var(--biosig-cyan), transparent 14%);
370
+ }
371
+
372
+ .biosig-controls input::-moz-range-track {
373
+ height: 6px;
374
+ border-radius: 999px;
375
+ background: linear-gradient(90deg, color-mix(in srgb, var(--biosig-cyan), transparent 5%) 0 var(--control-fill, 50%), var(--biosig-soft) var(--control-fill, 50%) 100%);
376
+ }
377
+
378
+ .biosig-controls input::-moz-range-thumb {
379
+ width: 20px;
380
+ height: 20px;
381
+ border: 2px solid color-mix(in srgb, var(--biosig-ink), transparent 32%);
382
+ border-radius: 50%;
383
+ background: color-mix(in srgb, var(--biosig-ink), white 86%);
384
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--biosig-cyan), transparent 86%), 0 0 26px color-mix(in srgb, var(--biosig-cyan), transparent 14%);
385
+ }
386
+
387
+ .biosig-context {
388
+ display: grid;
389
+ gap: 1.1rem;
390
+ }
391
+
392
+ .biosig-evidence {
393
+ display: grid;
394
+ gap: 1.8rem;
395
+ }
396
+
397
+ .biosig-conclusion {
398
+ display: grid;
399
+ gap: 1rem;
400
+ max-width: 42ch;
401
+ }
402
+
403
+ .biosig-conclusion > span {
404
+ color: var(--biosig-muted);
405
+ font-size: 0.82rem;
406
+ letter-spacing: 0.09em;
407
+ }
408
+
409
+ .biosig-evidence p {
410
+ margin: 0;
411
+ color: var(--biosig-ink);
412
+ font-size: 1.2rem;
413
+ font-weight: 350;
414
+ line-height: 1.5;
415
+ }
416
+
417
+ .biosig-evidence-grid {
418
+ display: flex;
419
+ flex-wrap: wrap;
420
+ gap: 1.2rem;
421
+ align-items: center;
422
+ }
423
+
424
+ .biosig-evidence-grid div {
425
+ display: grid;
426
+ grid-template-columns: auto 3.15rem;
427
+ gap: 0.18rem 0.7rem;
428
+ align-items: center;
429
+ }
430
+
431
+ .biosig-evidence-grid span {
432
+ color: var(--biosig-muted);
433
+ font-size: 0.9rem;
434
+ }
435
+
436
+ .biosig-evidence-grid i {
437
+ --meter-value: 0%;
438
+
439
+ grid-row: span 2;
440
+ width: 3.15rem;
441
+ aspect-ratio: 1;
442
+ border-radius: 50%;
443
+ background:
444
+ radial-gradient(circle, var(--biosig-meter-core) 0 52%, transparent 53%),
445
+ conic-gradient(var(--biosig-green) var(--meter-value), var(--biosig-soft) 0);
446
+ box-shadow: 0 0 18px color-mix(in srgb, var(--biosig-green), transparent 58%);
447
+ }
448
+
449
+ .biosig-evidence-grid b {
450
+ color: var(--biosig-green);
451
+ font-size: 0.96rem;
452
+ font-weight: 500;
453
+ }
454
+
455
+ .biosig-live-bottom {
456
+ justify-self: start;
457
+ }
458
+
459
+ .biosig-root[data-verdict="ambiguous"] {
460
+ --biosig-green: #d5a95c;
461
+ }
462
+
463
+ @media (min-width: 760px) {
464
+ .biosig-root {
465
+ grid-template-columns: minmax(0, 1.34fr) minmax(310px, 0.66fr);
466
+ padding: 0;
467
+ }
468
+
469
+ .biosig-scope {
470
+ min-height: 760px;
471
+ }
472
+
473
+ .biosig-console {
474
+ min-height: 760px;
475
+ padding: 5.4rem 2.2rem 2.8rem 0.8rem;
476
+ }
477
+
478
+ .biosig-planet {
479
+ top: 0.1rem;
480
+ left: 42%;
481
+ width: min(62vw, 760px);
482
+ }
483
+
484
+ .biosig-spectrum {
485
+ right: 13%;
486
+ bottom: 10.5rem;
487
+ left: 8%;
488
+ height: 60px;
489
+ }
490
+
491
+ .biosig-readout {
492
+ bottom: 2.7rem;
493
+ left: 2.6rem;
494
+ }
495
+
496
+ .biosig-float-bio {
497
+ top: 4.4rem;
498
+ left: 1.7rem;
499
+ }
500
+
501
+ .biosig-float-tech {
502
+ top: 17.8rem;
503
+ right: 1.8rem;
504
+ }
505
+
506
+ .biosig-float-risk {
507
+ right: 1.6rem;
508
+ bottom: 13.5rem;
509
+ }
510
+
511
+ .biosig-float-bio strong,
512
+ .biosig-float-tech strong,
513
+ .biosig-float-risk strong {
514
+ font-size: clamp(3.8rem, 13vw, 7rem);
515
+ }
516
+ }