@jjlmoya/utils-forensic-science 1.8.0 → 1.10.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 (87) hide show
  1. package/package.json +2 -2
  2. package/src/category/index.ts +6 -1
  3. package/src/entries.ts +8 -1
  4. package/src/tests/diacritics_density.test.ts +8 -8
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/seo_parity.test.ts +60 -0
  7. package/src/tests/tool_validation.test.ts +2 -2
  8. package/src/tests/translation_copy.test.ts +124 -0
  9. package/src/tool/fire-pattern-origin-analyzer/i18n/zh.ts +2 -1
  10. package/src/tool/forensic-blood-test-simulator/i18n/fr.ts +13 -13
  11. package/src/tool/forensic-fiber-comparison-microscope/i18n/de.ts +1 -5
  12. package/src/tool/forensic-fiber-comparison-microscope/i18n/id.ts +0 -4
  13. package/src/tool/forensic-fiber-comparison-microscope/i18n/ja.ts +0 -4
  14. package/src/tool/forensic-fiber-comparison-microscope/i18n/pl.ts +0 -4
  15. package/src/tool/forensic-fiber-comparison-microscope/i18n/pt.ts +0 -4
  16. package/src/tool/forensic-fiber-comparison-microscope/i18n/ru.ts +1 -5
  17. package/src/tool/forensic-fiber-comparison-microscope/i18n/sv.ts +1 -5
  18. package/src/tool/forensic-fiber-comparison-microscope/i18n/zh.ts +0 -4
  19. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/de.ts +1 -10
  20. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/fr.ts +0 -9
  21. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/id.ts +1 -10
  22. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/it.ts +1 -10
  23. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/ja.ts +3 -1
  24. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/ko.ts +3 -1
  25. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/nl.ts +1 -10
  26. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/pl.ts +1 -10
  27. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/pt.ts +1 -10
  28. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/ru.ts +1 -10
  29. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/sv.ts +1 -10
  30. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/tr.ts +1 -10
  31. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/zh.ts +3 -1
  32. package/src/tool/forensic-image-authenticity-analyzer/i18n/id.ts +20 -1
  33. package/src/tool/forensic-image-authenticity-analyzer/i18n/ja.ts +24 -1
  34. package/src/tool/forensic-image-authenticity-analyzer/i18n/ko.ts +24 -1
  35. package/src/tool/forensic-image-authenticity-analyzer/i18n/nl.ts +20 -1
  36. package/src/tool/forensic-image-authenticity-analyzer/i18n/pl.ts +20 -1
  37. package/src/tool/forensic-image-authenticity-analyzer/i18n/ru.ts +20 -1
  38. package/src/tool/forensic-image-authenticity-analyzer/i18n/sv.ts +20 -1
  39. package/src/tool/forensic-image-authenticity-analyzer/i18n/tr.ts +20 -1
  40. package/src/tool/forensic-image-authenticity-analyzer/i18n/zh.ts +24 -1
  41. package/src/tool/forensic-tlc-ink-simulator/i18n/ja.ts +3 -1
  42. package/src/tool/forensic-tlc-ink-simulator/i18n/ko.ts +3 -1
  43. package/src/tool/forensic-tlc-ink-simulator/i18n/zh.ts +3 -1
  44. package/src/tool/time-of-death-algor-mortis-calculator/bibliography.astro +14 -0
  45. package/src/tool/time-of-death-algor-mortis-calculator/bibliography.ts +7 -0
  46. package/src/tool/time-of-death-algor-mortis-calculator/component.astro +133 -0
  47. package/src/tool/time-of-death-algor-mortis-calculator/controller.ts +254 -0
  48. package/src/tool/time-of-death-algor-mortis-calculator/dom-views.ts +144 -0
  49. package/src/tool/time-of-death-algor-mortis-calculator/entry.ts +29 -0
  50. package/src/tool/time-of-death-algor-mortis-calculator/evaluator.ts +34 -0
  51. package/src/tool/time-of-death-algor-mortis-calculator/i18n/de.ts +136 -0
  52. package/src/tool/time-of-death-algor-mortis-calculator/i18n/en.ts +136 -0
  53. package/src/tool/time-of-death-algor-mortis-calculator/i18n/es.ts +136 -0
  54. package/src/tool/time-of-death-algor-mortis-calculator/i18n/fr.ts +136 -0
  55. package/src/tool/time-of-death-algor-mortis-calculator/i18n/id.ts +136 -0
  56. package/src/tool/time-of-death-algor-mortis-calculator/i18n/it.ts +136 -0
  57. package/src/tool/time-of-death-algor-mortis-calculator/i18n/ja.ts +136 -0
  58. package/src/tool/time-of-death-algor-mortis-calculator/i18n/ko.ts +136 -0
  59. package/src/tool/time-of-death-algor-mortis-calculator/i18n/nl.ts +136 -0
  60. package/src/tool/time-of-death-algor-mortis-calculator/i18n/pl.ts +136 -0
  61. package/src/tool/time-of-death-algor-mortis-calculator/i18n/pt.ts +136 -0
  62. package/src/tool/time-of-death-algor-mortis-calculator/i18n/ru.ts +136 -0
  63. package/src/tool/time-of-death-algor-mortis-calculator/i18n/sv.ts +136 -0
  64. package/src/tool/time-of-death-algor-mortis-calculator/i18n/tr.ts +136 -0
  65. package/src/tool/time-of-death-algor-mortis-calculator/i18n/zh.ts +136 -0
  66. package/src/tool/time-of-death-algor-mortis-calculator/index.ts +11 -0
  67. package/src/tool/time-of-death-algor-mortis-calculator/logic.test.ts +77 -0
  68. package/src/tool/time-of-death-algor-mortis-calculator/logic.ts +177 -0
  69. package/src/tool/time-of-death-algor-mortis-calculator/seo.astro +15 -0
  70. package/src/tool/time-of-death-algor-mortis-calculator/storage.ts +21 -0
  71. package/src/tool/time-of-death-algor-mortis-calculator/time-of-death-algor-mortis-calculator.css +596 -0
  72. package/src/tool/time-of-death-algor-mortis-calculator/ui.ts +60 -0
  73. package/src/tool/widmark-alcohol-simulator/i18n/de.ts +4 -1
  74. package/src/tool/widmark-alcohol-simulator/i18n/es.ts +4 -1
  75. package/src/tool/widmark-alcohol-simulator/i18n/fr.ts +4 -1
  76. package/src/tool/widmark-alcohol-simulator/i18n/id.ts +4 -1
  77. package/src/tool/widmark-alcohol-simulator/i18n/it.ts +4 -1
  78. package/src/tool/widmark-alcohol-simulator/i18n/ja.ts +4 -1
  79. package/src/tool/widmark-alcohol-simulator/i18n/ko.ts +4 -1
  80. package/src/tool/widmark-alcohol-simulator/i18n/nl.ts +4 -1
  81. package/src/tool/widmark-alcohol-simulator/i18n/pl.ts +4 -1
  82. package/src/tool/widmark-alcohol-simulator/i18n/pt.ts +4 -1
  83. package/src/tool/widmark-alcohol-simulator/i18n/ru.ts +4 -1
  84. package/src/tool/widmark-alcohol-simulator/i18n/sv.ts +4 -1
  85. package/src/tool/widmark-alcohol-simulator/i18n/tr.ts +4 -1
  86. package/src/tool/widmark-alcohol-simulator/i18n/zh.ts +4 -1
  87. package/src/tools.ts +3 -1
@@ -0,0 +1,596 @@
1
+ :root {
2
+ --n-bg: #f8fafc;
3
+ --n-surface: #fff;
4
+ --n-surface-subtle: #f1f5f9;
5
+ --n-card-bg: rgba(255, 255, 255, 0.96);
6
+ --n-border: #cbd5e1;
7
+ --n-border-hover: #94a3b8;
8
+ --n-text: #0f172a;
9
+ --n-text-muted: #64748b;
10
+ --n-text-bright: #020617;
11
+ --n-primary: #0284c7;
12
+ --n-primary-hover: #0369a1;
13
+ --n-accent-cyan: #06b6d4;
14
+ --n-success: #10b981;
15
+ --n-warning: #f59e0b;
16
+ --n-danger: #ef4444;
17
+ --n-info: #0284c7;
18
+ --n-chart-bg: #f8fafc;
19
+ --n-chart-plateau: rgba(6, 182, 212, 0.12);
20
+ --n-chart-band: rgba(2, 132, 199, 0.12);
21
+ --n-chart-amb: #94a3b8;
22
+ --n-shadow: 0 16px 40px -8px rgba(0, 0, 0, 0.08);
23
+ }
24
+
25
+ .theme-dark {
26
+ --n-bg: #070b12;
27
+ --n-surface: #0f172a;
28
+ --n-surface-subtle: #1e293b;
29
+ --n-card-bg: rgba(15, 23, 42, 0.94);
30
+ --n-border: #1e293b;
31
+ --n-border-hover: #334155;
32
+ --n-text: #f8fafc;
33
+ --n-text-muted: #94a3b8;
34
+ --n-text-bright: #fff;
35
+ --n-primary: #38bdf8;
36
+ --n-primary-hover: #7dd3fc;
37
+ --n-accent-cyan: #22d3ee;
38
+ --n-success: #34d399;
39
+ --n-warning: #fbbf24;
40
+ --n-danger: #f87171;
41
+ --n-info: #38bdf8;
42
+ --n-chart-bg: #0b1120;
43
+ --n-chart-plateau: rgba(34, 211, 238, 0.14);
44
+ --n-chart-band: rgba(56, 189, 248, 0.14);
45
+ --n-chart-amb: #64748b;
46
+ --n-shadow: 0 20px 48px -10px rgba(0, 0, 0, 0.65);
47
+ }
48
+
49
+ .sc-algor-cockpit {
50
+ display: grid;
51
+ grid-template-columns: 1fr;
52
+ gap: 2.25rem;
53
+ background-color: var(--n-card-bg);
54
+ border: 1px solid var(--n-border);
55
+ border-radius: 20px;
56
+ padding: 2.25rem;
57
+ box-shadow: var(--n-shadow);
58
+ backdrop-filter: blur(14px);
59
+ color: var(--n-text);
60
+ box-sizing: border-box;
61
+ width: 100%;
62
+ }
63
+
64
+ @media (min-width: 1024px) {
65
+ .sc-algor-cockpit {
66
+ grid-template-columns: 420px 1fr;
67
+ gap: 2.5rem;
68
+ }
69
+ }
70
+
71
+ .sc-cockpit-sidebar {
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: 1.5rem;
75
+ }
76
+
77
+ .sc-cockpit-stage {
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: 1.5rem;
81
+ }
82
+
83
+ .sc-header-row {
84
+ display: flex;
85
+ justify-content: space-between;
86
+ align-items: center;
87
+ margin-bottom: 0.5rem;
88
+ }
89
+
90
+ .sc-panel-title {
91
+ font-size: 1.05rem;
92
+ font-weight: 700;
93
+ color: var(--n-text-bright);
94
+ text-transform: uppercase;
95
+ letter-spacing: 0.04em;
96
+ }
97
+
98
+ .sc-unit-toggle {
99
+ display: flex;
100
+ background-color: var(--n-surface-subtle);
101
+ border: 1px solid var(--n-border);
102
+ border-radius: 10px;
103
+ padding: 3px;
104
+ }
105
+
106
+ .sc-unit-btn {
107
+ background: transparent;
108
+ border: none;
109
+ color: var(--n-text-muted);
110
+ font-size: 0.825rem;
111
+ font-weight: 700;
112
+ padding: 0.4rem 0.85rem;
113
+ border-radius: 7px;
114
+ cursor: pointer;
115
+ transition: all 0.15s ease;
116
+ }
117
+
118
+ .sc-unit-btn:hover {
119
+ color: var(--n-text-bright);
120
+ }
121
+
122
+ .sc-unit-btn.active {
123
+ background-color: var(--n-primary);
124
+ color: #fff;
125
+ }
126
+
127
+ .sc-presets-wrap {
128
+ display: flex;
129
+ flex-wrap: wrap;
130
+ gap: 0.6rem;
131
+ }
132
+
133
+ .sc-preset-chip {
134
+ background-color: var(--n-surface);
135
+ border: 1px solid var(--n-border);
136
+ color: var(--n-text);
137
+ border-radius: 10px;
138
+ padding: 0.55rem 0.95rem;
139
+ font-size: 0.875rem;
140
+ font-weight: 600;
141
+ cursor: pointer;
142
+ transition: all 0.15s ease;
143
+ }
144
+
145
+ .sc-preset-chip:hover {
146
+ border-color: var(--n-primary);
147
+ color: var(--n-primary);
148
+ }
149
+
150
+ .sc-preset-chip.active {
151
+ background-color: var(--n-primary);
152
+ border-color: var(--n-primary);
153
+ color: #fff;
154
+ }
155
+
156
+ .sc-input-group {
157
+ display: flex;
158
+ flex-direction: column;
159
+ gap: 0.5rem;
160
+ }
161
+
162
+ .sc-input-label-row {
163
+ display: flex;
164
+ justify-content: space-between;
165
+ align-items: center;
166
+ }
167
+
168
+ .sc-label {
169
+ font-size: 0.9rem;
170
+ font-weight: 600;
171
+ color: var(--n-text-muted);
172
+ }
173
+
174
+ .sc-tactile-row {
175
+ display: grid;
176
+ grid-template-columns: 1fr 95px;
177
+ gap: 1rem;
178
+ align-items: center;
179
+ }
180
+
181
+ .sc-slider {
182
+ appearance: none;
183
+ width: 100%;
184
+ height: 8px;
185
+ border-radius: 9999px;
186
+ background: var(--n-surface-subtle);
187
+ border: 1px solid var(--n-border);
188
+ outline: none;
189
+ }
190
+
191
+ .sc-slider::-webkit-slider-thumb {
192
+ appearance: none;
193
+ width: 22px;
194
+ height: 22px;
195
+ border-radius: 50%;
196
+ background: var(--n-primary);
197
+ cursor: pointer;
198
+ border: 2px solid #fff;
199
+ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25);
200
+ }
201
+
202
+ .sc-num-input {
203
+ padding: 0.55rem 0.75rem;
204
+ border-radius: 8px;
205
+ border: 1px solid var(--n-border);
206
+ background-color: var(--n-surface);
207
+ color: var(--n-text-bright);
208
+ font-size: 1rem;
209
+ font-weight: 600;
210
+ text-align: center;
211
+ }
212
+
213
+ .sc-time-wrap {
214
+ position: relative;
215
+ display: inline-flex;
216
+ align-items: center;
217
+ }
218
+
219
+ .sc-time-input {
220
+ padding: 0.55rem 2.5rem 0.55rem 0.85rem;
221
+ border-radius: 8px;
222
+ border: 1px solid var(--n-border);
223
+ background-color: var(--n-surface);
224
+ color: var(--n-text-bright);
225
+ font-size: 1rem;
226
+ font-weight: 600;
227
+ text-align: center;
228
+ position: relative;
229
+ }
230
+
231
+ .sc-time-input::-webkit-calendar-picker-indicator {
232
+ position: absolute;
233
+ top: 0;
234
+ left: 0;
235
+ width: 100%;
236
+ height: 100%;
237
+ opacity: 0;
238
+ cursor: pointer;
239
+ }
240
+
241
+ .sc-time-icon {
242
+ position: absolute;
243
+ right: 0.75rem;
244
+ width: 18px;
245
+ height: 18px;
246
+ stroke: var(--n-primary);
247
+ pointer-events: none;
248
+ }
249
+
250
+ .sc-custom-select {
251
+ position: relative;
252
+ width: 100%;
253
+ }
254
+
255
+ .sc-select-trigger {
256
+ width: 100%;
257
+ display: flex;
258
+ justify-content: space-between;
259
+ align-items: center;
260
+ padding: 0.75rem 1rem;
261
+ border-radius: 10px;
262
+ border: 1px solid var(--n-border);
263
+ background-color: var(--n-surface);
264
+ color: var(--n-text-bright);
265
+ font-size: 0.95rem;
266
+ font-weight: 600;
267
+ cursor: pointer;
268
+ transition: border-color 0.15s ease;
269
+ }
270
+
271
+ .sc-select-trigger:hover {
272
+ border-color: var(--n-border-hover);
273
+ }
274
+
275
+ .sc-select-chevron {
276
+ width: 18px;
277
+ height: 18px;
278
+ stroke: var(--n-text-muted);
279
+ }
280
+
281
+ .sc-select-dropdown {
282
+ display: none;
283
+ position: absolute;
284
+ top: calc(100% + 6px);
285
+ left: 0;
286
+ width: 100%;
287
+ max-height: 240px;
288
+ overflow-y: auto;
289
+ background-color: var(--n-surface);
290
+ border: 1px solid var(--n-border);
291
+ border-radius: 10px;
292
+ box-shadow: var(--n-shadow);
293
+ z-index: 50;
294
+ }
295
+
296
+ .sc-select-dropdown.open {
297
+ display: block;
298
+ }
299
+
300
+ .sc-select-option {
301
+ padding: 0.7rem 1rem;
302
+ font-size: 0.9rem;
303
+ color: var(--n-text);
304
+ cursor: pointer;
305
+ transition: background-color 0.1s ease;
306
+ }
307
+
308
+ .sc-select-option:hover {
309
+ background-color: var(--n-surface-subtle);
310
+ color: var(--n-primary);
311
+ }
312
+
313
+ .sc-actions-row {
314
+ display: flex;
315
+ gap: 0.75rem;
316
+ align-items: center;
317
+ }
318
+
319
+ .sc-btn {
320
+ padding: 0.65rem 1.1rem;
321
+ border-radius: 10px;
322
+ border: 1px solid var(--n-border);
323
+ background-color: var(--n-surface);
324
+ color: var(--n-text-bright);
325
+ font-size: 0.9rem;
326
+ font-weight: 600;
327
+ cursor: pointer;
328
+ transition: all 0.15s ease;
329
+ }
330
+
331
+ .sc-btn:hover {
332
+ border-color: var(--n-primary);
333
+ color: var(--n-primary);
334
+ }
335
+
336
+ .sc-btn-primary {
337
+ background-color: var(--n-primary);
338
+ border-color: var(--n-primary);
339
+ color: #fff;
340
+ }
341
+
342
+ .sc-btn-primary:hover {
343
+ background-color: var(--n-primary-hover);
344
+ color: #fff;
345
+ }
346
+
347
+ .sc-warning-card {
348
+ background-color: var(--n-surface-subtle);
349
+ border: 1px solid var(--n-border);
350
+ border-left: 4px solid var(--n-warning);
351
+ border-radius: 10px;
352
+ padding: 1rem 1.25rem;
353
+ display: flex;
354
+ flex-direction: column;
355
+ gap: 0.35rem;
356
+ }
357
+
358
+ .sc-warning-title {
359
+ font-size: 0.825rem;
360
+ font-weight: 700;
361
+ color: var(--n-warning);
362
+ text-transform: uppercase;
363
+ letter-spacing: 0.05em;
364
+ }
365
+
366
+ .sc-warning-text {
367
+ font-size: 0.825rem;
368
+ line-height: 1.5;
369
+ color: var(--n-text-muted);
370
+ }
371
+
372
+ .sc-hero-card {
373
+ background: linear-gradient(135deg, rgba(2, 132, 199, 0.08), rgba(16, 185, 129, 0.06));
374
+ border: 1px solid var(--n-border);
375
+ border-radius: 14px;
376
+ padding: 1.6rem 1.75rem;
377
+ display: flex;
378
+ flex-direction: column;
379
+ gap: 0.85rem;
380
+ }
381
+
382
+ .sc-hero-header {
383
+ display: flex;
384
+ justify-content: space-between;
385
+ align-items: center;
386
+ }
387
+
388
+ .sc-hero-title {
389
+ font-size: 0.95rem;
390
+ font-weight: 700;
391
+ color: var(--n-text-muted);
392
+ text-transform: uppercase;
393
+ letter-spacing: 0.05em;
394
+ }
395
+
396
+ .sc-hero-val {
397
+ font-size: 2.85rem;
398
+ font-weight: 800;
399
+ color: var(--n-text-bright);
400
+ line-height: 1.1;
401
+ }
402
+
403
+ .sc-hero-sub {
404
+ font-size: 0.95rem;
405
+ color: var(--n-text-muted);
406
+ }
407
+
408
+ .sc-hero-sub strong {
409
+ color: var(--n-text-bright);
410
+ }
411
+
412
+ .sc-gauge-wrap {
413
+ display: flex;
414
+ flex-direction: column;
415
+ gap: 0.4rem;
416
+ margin-top: 0.4rem;
417
+ }
418
+
419
+ .sc-gauge-track {
420
+ width: 100%;
421
+ height: 10px;
422
+ background-color: var(--n-surface-subtle);
423
+ border-radius: 9999px;
424
+ overflow: hidden;
425
+ border: 1px solid var(--n-border);
426
+ }
427
+
428
+ .sc-gauge-bar {
429
+ height: 100%;
430
+ border-radius: 9999px;
431
+ transition: width 0.3s ease;
432
+ }
433
+
434
+ .sc-gauge-labels {
435
+ display: flex;
436
+ justify-content: space-between;
437
+ font-size: 0.8rem;
438
+ font-weight: 600;
439
+ color: var(--n-text-muted);
440
+ }
441
+
442
+ .sc-badge {
443
+ font-size: 0.8rem;
444
+ font-weight: 700;
445
+ padding: 0.3rem 0.8rem;
446
+ border-radius: 9999px;
447
+ text-transform: uppercase;
448
+ letter-spacing: 0.04em;
449
+ }
450
+
451
+ .badge-success {
452
+ background: rgba(16, 185, 129, 0.18);
453
+ color: var(--n-success);
454
+ border: 1px solid rgba(16, 185, 129, 0.3);
455
+ }
456
+
457
+ .badge-info {
458
+ background: rgba(6, 182, 212, 0.18);
459
+ color: var(--n-accent-cyan);
460
+ border: 1px solid rgba(6, 182, 212, 0.3);
461
+ }
462
+
463
+ .badge-warning {
464
+ background: rgba(245, 158, 11, 0.18);
465
+ color: var(--n-warning);
466
+ border: 1px solid rgba(245, 158, 11, 0.3);
467
+ }
468
+
469
+ .badge-danger {
470
+ background: rgba(239, 68, 68, 0.18);
471
+ color: var(--n-danger);
472
+ border: 1px solid rgba(239, 68, 68, 0.3);
473
+ }
474
+
475
+ .sc-stats-grid {
476
+ display: grid;
477
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
478
+ gap: 1rem;
479
+ }
480
+
481
+ .sc-stat-card {
482
+ background-color: var(--n-surface);
483
+ border: 1px solid var(--n-border);
484
+ border-radius: 12px;
485
+ padding: 1.1rem 1.25rem;
486
+ display: flex;
487
+ flex-direction: column;
488
+ gap: 0.3rem;
489
+ }
490
+
491
+ .sc-stat-label {
492
+ font-size: 0.825rem;
493
+ font-weight: 600;
494
+ color: var(--n-text-muted);
495
+ }
496
+
497
+ .sc-stat-val {
498
+ font-size: 1.35rem;
499
+ font-weight: 700;
500
+ color: var(--n-text-bright);
501
+ }
502
+
503
+ .sc-stat-sub {
504
+ font-size: 0.75rem;
505
+ color: var(--n-text-muted);
506
+ }
507
+
508
+ .sc-chart-stage {
509
+ background-color: var(--n-chart-bg);
510
+ border: 1px solid var(--n-border);
511
+ border-radius: 14px;
512
+ padding: 1.5rem;
513
+ display: flex;
514
+ flex-direction: column;
515
+ gap: 0.85rem;
516
+ }
517
+
518
+ .sc-nomogram-svg {
519
+ width: 100%;
520
+ height: auto;
521
+ max-height: 350px;
522
+ display: block;
523
+ }
524
+
525
+ .sc-chart-axis {
526
+ stroke: var(--n-border);
527
+ stroke-width: 1.5;
528
+ }
529
+
530
+ .sc-chart-grid {
531
+ stroke: var(--n-border);
532
+ stroke-width: 1;
533
+ stroke-dasharray: 3 4;
534
+ opacity: 0.65;
535
+ }
536
+
537
+ .sc-chart-axis-label {
538
+ fill: var(--n-text-muted);
539
+ font-size: 12px;
540
+ font-weight: 600;
541
+ }
542
+
543
+ .sc-chart-plateau {
544
+ fill: var(--n-chart-plateau);
545
+ }
546
+
547
+ .sc-chart-band {
548
+ fill: var(--n-chart-band);
549
+ }
550
+
551
+ .sc-chart-amb {
552
+ stroke: var(--n-chart-amb);
553
+ stroke-width: 1.5;
554
+ stroke-dasharray: 4 4;
555
+ }
556
+
557
+ .sc-chart-line {
558
+ fill: none;
559
+ stroke: url("#sc-curve-grad");
560
+ stroke-width: 4;
561
+ stroke-linecap: round;
562
+ }
563
+
564
+ .sc-chart-pulse {
565
+ fill: rgba(56, 189, 248, 0.35);
566
+ animation: sc-pulse-anim 2s infinite ease-out;
567
+ }
568
+
569
+ .sc-chart-core {
570
+ fill: var(--n-danger);
571
+ stroke: #fff;
572
+ stroke-width: 2.5;
573
+ }
574
+
575
+ .sc-chart-tag {
576
+ fill: var(--n-text-muted);
577
+ font-size: 12px;
578
+ font-weight: 600;
579
+ }
580
+
581
+ .sc-chart-pt-label {
582
+ fill: var(--n-text-bright);
583
+ font-size: 13px;
584
+ font-weight: 700;
585
+ }
586
+
587
+ @keyframes sc-pulse-anim {
588
+ 0% {
589
+ r: 5;
590
+ opacity: 0.9;
591
+ }
592
+ 100% {
593
+ r: 16;
594
+ opacity: 0;
595
+ }
596
+ }
@@ -0,0 +1,60 @@
1
+ export interface TimeOfDeathAlgorMortisUI {
2
+ [key: string]: string;
3
+ title: string;
4
+ subtitle: string;
5
+ disclaimer: string;
6
+ unitSystemLabel: string;
7
+ unitMetricLabel: string;
8
+ unitImperialLabel: string;
9
+ presetsHeader: string;
10
+ presetNakedCalm: string;
11
+ presetDressedIndoor: string;
12
+ presetWinterOutdoor: string;
13
+ presetSubmergedWater: string;
14
+ presetHeavyDuvet: string;
15
+ inputsHeader: string;
16
+ rectalTempLabel: string;
17
+ ambientTempLabel: string;
18
+ bodyWeightLabel: string;
19
+ factorLabel: string;
20
+ measurementTimeLabel: string;
21
+ factorNaked: string;
22
+ factorLightClothes: string;
23
+ factorStandardClothes: string;
24
+ factorHeavyWinter: string;
25
+ factorLightBlanket: string;
26
+ factorHeavyDuvet: string;
27
+ factorStillWater: string;
28
+ factorFlowingWater: string;
29
+ factorWetClothing: string;
30
+ factorMovingAir: string;
31
+ resultsHeader: string;
32
+ estimatedPmiLabel: string;
33
+ deathWindowLabel: string;
34
+ confidenceMarginLabel: string;
35
+ coolingPhaseLabel: string;
36
+ coolingRateLabel: string;
37
+ glaisterEstimateLabel: string;
38
+ chartHeader: string;
39
+ chartXAxis: string;
40
+ chartYAxis: string;
41
+ chartNowMarker: string;
42
+ chartPlateauMarker: string;
43
+ phasePlateau: string;
44
+ phaseDescent: string;
45
+ phaseEquilibrium: string;
46
+ phaseHyperthermia: string;
47
+ hoursUnit: string;
48
+ minutesUnit: string;
49
+ celsiusUnit: string;
50
+ fahrenheitUnit: string;
51
+ kgUnit: string;
52
+ lbUnit: string;
53
+ celsiusPerHour: string;
54
+ fahrenheitPerHour: string;
55
+ resetBtn: string;
56
+ nowBtn: string;
57
+ coreThermometerLabel: string;
58
+ baselineAmbientLabel: string;
59
+ referenceBodyTempLabel: string;
60
+ }
@@ -154,7 +154,10 @@ export const content: ToolLocaleContent = {
154
154
  type: 'paragraph',
155
155
  html: 'Nach dem Eintritt in den Blutkreislauf wird Alkohol primär in der Leber durch das Enzym Alkoholdehydrogenase (ADH) abgebaut. Da dieses Enzym bereits bei sehr geringen Konzentrationen gesättigt ist, verläuft der Abbau nach einer Kinetik nullter Ordnung. Dies bedeutet, dass pro Zeiteinheit eine konstante Alkoholmenge eliminiert wird. Der forensisch etablierte Mittelwert (&beta;<sub>60</sub>) beträgt 0,15 g/L pro Stunde, was dem Abbau von etwa 10 g reinem Alkohol pro Stunde entspricht. Dieser lineare Abbau erzeugt den geradlinigen Abfall der Kurve.',
156
156
  },
157
- ],
157
+
158
+ { type: 'paragraph', html: "Nutzen Sie das Ergebnis zur Planung und zum Szenarienvergleich; es ersetzt keine offizielle Berechnung oder Fachberatung." },
159
+ { type: 'paragraph', html: "Deuten Sie das Ergebnis gemeinsam mit den angezeigten Annahmen, bevor Sie es verwenden." },
160
+ { type: 'paragraph', html: "Prüfen Sie Eingaben, Einheiten, Rundung, Datum und Recht, weil jedes Element die Schätzung verändern kann." },],
158
161
  faq,
159
162
  bibliography,
160
163
  howTo,
@@ -154,7 +154,10 @@ export const content: ToolLocaleContent = {
154
154
  type: 'paragraph',
155
155
  html: 'Una vez en la circulación, el alcohol es metabolizado principalmente en el hígado por el sistema enzimático de la alcohol deshidrogenasa (ADH), que lo transforma en acetaldehído. Este proceso se satura a concentraciones muy bajas, lo que da lugar a una cinética de orden cero. Esto significa que el hígado metaboliza una cantidad fija de alcohol por hora, sin importar el nivel de intoxicación. En el ámbito forense, esta tasa constante de aclaramiento (&beta;<sub>60</sub>) se fija de media en 0.15 g/L por hora, equivalente a eliminar unos 10 gramos de alcohol puro cada hora. Esta eliminación de orden cero es la que genera la característica pendiente de descenso lineal en los gráficos de alcoholemia.',
156
156
  },
157
- ],
157
+
158
+ { type: 'paragraph', html: "Usa el resultado para planificar y comparar escenarios; no sustituye un cálculo oficial ni el asesoramiento profesional." },
159
+ { type: 'paragraph', html: "Interpreta el resultado junto con los supuestos que muestra la calculadora antes de utilizarlo." },
160
+ { type: 'paragraph', html: "Comprueba los datos, las unidades, el redondeo, la fecha y la jurisdicción, porque todos pueden cambiar la estimación." },],
158
161
  faq,
159
162
  bibliography,
160
163
  howTo,
@@ -154,7 +154,10 @@ export const content: ToolLocaleContent = {
154
154
  type: 'paragraph',
155
155
  html: 'Une fois dans le sang, l\'éthanol est métabolisé par le foie, principalement par l\'alcool déshydrogénase (ADH). Cette enzyme se sature à des taux très bas (0,02 g/L), ce qui produit une cinétique d\'élimination d\'ordre zéro: le foie élimine une quantité fixe d\'alcool par heure, quelle que soit la quantité ingérée. La vitesse d\'élimination moyenne acceptée est de 0,15 g/L par heure, ce qui engendre la décroissance linéaire caractéristique sur le graphique.',
156
156
  },
157
- ],
157
+
158
+ { type: 'paragraph', html: "Utilisez le résultat pour planifier et comparer des scénarios ; il ne remplace ni un calcul officiel ni un avis professionnel." },
159
+ { type: 'paragraph', html: "Interprétez le résultat avec les hypothèses affichées par le calculateur avant de l'utiliser." },
160
+ { type: 'paragraph', html: "Vérifiez les données, unités, arrondi, date et juridiction, car chacun de ces éléments peut modifier l'estimation." },],
158
161
  faq,
159
162
  bibliography,
160
163
  howTo,
@@ -154,7 +154,10 @@ export const content: ToolLocaleContent = {
154
154
  type: 'paragraph',
155
155
  html: 'Setelah masuk ke sirkulasi darah, alkohol dimetabolisme terutama di hati oleh enzim alkohol dehidrogenase (ADH). Enzim ini mengalami kejenuhan pada konsentrasi yang sangat rendah (0,02 g/L), sehingga metabolisme berlangsung dengan kecepatan konstan tanpa dipengaruhi kadar alkohol dalam darah. Rata-rata laju eliminasi forensik (&beta;<sub>60</sub>) ditetapkan sebesar 0,15 g/L per jam. Penurunan konstan ini menghasilkan kemiringan linier lurus pada kurva hingga mencapai angka nol.',
156
156
  },
157
- ],
157
+
158
+ { type: 'paragraph', html: "Gunakan hasil untuk perencanaan dan perbandingan skenario; hasil ini bukan pengganti perhitungan resmi atau nasihat ahli." },
159
+ { type: 'paragraph', html: "Tafsirkan hasil bersama asumsi yang ditampilkan kalkulator sebelum menggunakannya." },
160
+ { type: 'paragraph', html: "Periksa input, satuan, pembulatan, tanggal, dan yurisdiksi karena semuanya dapat mengubah estimasi." },],
158
161
  faq,
159
162
  bibliography,
160
163
  howTo,
@@ -154,7 +154,10 @@ export const content: ToolLocaleContent = {
154
154
  type: 'paragraph',
155
155
  html: 'Una volta assorbito, l\'etanolo viene metabolizzato per la quasi totalità dal fegato tramite l\'alcol deidrogenasi (ADH). Questo enzima si satura molto rapidamente a concentrazioni minime (0,02 g/L), instaurando una cinetica di eliminazione di ordine zero. Di conseguenza, il fegato smaltisce una quantità fissa e costante di alcol per unità di tempo. Il tasso di eliminazione forense standard (&beta;<sub>60</sub>) è fissato a 0,15 g/L all\'ora, generando la tipica discesa rettilinea visibile sul grafico.',
156
156
  },
157
- ],
157
+
158
+ { type: 'paragraph', html: "Usa il risultato per pianificare e confrontare scenari; non sostituisce un calcolo ufficiale o una consulenza professionale." },
159
+ { type: 'paragraph', html: "Interpreta il risultato insieme alle ipotesi mostrate dal calcolatore prima di utilizzarlo." },
160
+ { type: 'paragraph', html: "Controlla dati, unità, arrotondamento, data e giurisdizione, perché ciascun elemento può cambiare la stima." },],
158
161
  faq,
159
162
  bibliography,
160
163
  howTo,