@jjlmoya/utils-forensic-science 1.5.0 → 1.6.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 +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +5 -1
  4. package/src/index.ts +1 -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/forensic-toolmark-striation-matcher/bibliography.astro +6 -0
  8. package/src/tool/forensic-toolmark-striation-matcher/bibliography.ts +16 -0
  9. package/src/tool/forensic-toolmark-striation-matcher/component.astro +121 -0
  10. package/src/tool/forensic-toolmark-striation-matcher/entry.ts +32 -0
  11. package/src/tool/forensic-toolmark-striation-matcher/forensic-toolmark-striation-matcher.css +580 -0
  12. package/src/tool/forensic-toolmark-striation-matcher/i18n/de.ts +301 -0
  13. package/src/tool/forensic-toolmark-striation-matcher/i18n/en.ts +301 -0
  14. package/src/tool/forensic-toolmark-striation-matcher/i18n/es.ts +301 -0
  15. package/src/tool/forensic-toolmark-striation-matcher/i18n/fr.ts +301 -0
  16. package/src/tool/forensic-toolmark-striation-matcher/i18n/id.ts +301 -0
  17. package/src/tool/forensic-toolmark-striation-matcher/i18n/it.ts +301 -0
  18. package/src/tool/forensic-toolmark-striation-matcher/i18n/ja.ts +301 -0
  19. package/src/tool/forensic-toolmark-striation-matcher/i18n/ko.ts +301 -0
  20. package/src/tool/forensic-toolmark-striation-matcher/i18n/nl.ts +301 -0
  21. package/src/tool/forensic-toolmark-striation-matcher/i18n/pl.ts +301 -0
  22. package/src/tool/forensic-toolmark-striation-matcher/i18n/pt.ts +301 -0
  23. package/src/tool/forensic-toolmark-striation-matcher/i18n/ru.ts +301 -0
  24. package/src/tool/forensic-toolmark-striation-matcher/i18n/sv.ts +301 -0
  25. package/src/tool/forensic-toolmark-striation-matcher/i18n/tr.ts +301 -0
  26. package/src/tool/forensic-toolmark-striation-matcher/i18n/zh.ts +301 -0
  27. package/src/tool/forensic-toolmark-striation-matcher/index.ts +11 -0
  28. package/src/tool/forensic-toolmark-striation-matcher/logic.ts +71 -0
  29. package/src/tool/forensic-toolmark-striation-matcher/renderer.ts +237 -0
  30. package/src/tool/forensic-toolmark-striation-matcher/seo.astro +15 -0
  31. package/src/tool/forensic-toolmark-striation-matcher/view.ts +291 -0
  32. package/src/tools.ts +3 -1
@@ -0,0 +1,580 @@
1
+ .toolmark-shell {
2
+ --toolmark-split: 50%;
3
+ --toolmark-score: 0%;
4
+
5
+ width: 100%;
6
+ color: #132126;
7
+ }
8
+
9
+ .toolmark-stage {
10
+ display: grid;
11
+ grid-template-columns: minmax(0, 1.65fr) minmax(280px, 0.55fr);
12
+ gap: 12px;
13
+ padding: 12px;
14
+ border: 1px solid rgba(15, 23, 42, 0.12);
15
+ border-radius: 8px;
16
+ background:
17
+ linear-gradient(135deg, rgba(20, 184, 166, 0.13), transparent 34%),
18
+ linear-gradient(315deg, rgba(245, 158, 11, 0.16), transparent 38%),
19
+ #eef3f0;
20
+ box-shadow: 0 22px 44px rgba(15, 23, 42, 0.12);
21
+ }
22
+
23
+ .toolmark-view-wrap {
24
+ display: grid;
25
+ gap: 8px;
26
+ min-width: 0;
27
+ }
28
+
29
+ .toolmark-view {
30
+ position: relative;
31
+ min-height: 430px;
32
+ overflow: hidden;
33
+ border-radius: 8px;
34
+ background: #0d161c;
35
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12), inset 0 -24px 70px rgba(0, 0, 0, 0.28);
36
+ }
37
+
38
+ .toolmark-view canvas {
39
+ display: block;
40
+ width: 100%;
41
+ height: 100%;
42
+ min-height: 430px;
43
+ }
44
+
45
+ .toolmark-split {
46
+ position: absolute;
47
+ inset: 0;
48
+ z-index: 4;
49
+ width: 100%;
50
+ height: 100%;
51
+ opacity: 0;
52
+ cursor: ew-resize;
53
+ }
54
+
55
+ .toolmark-handle {
56
+ position: absolute;
57
+ z-index: 3;
58
+ top: 0;
59
+ bottom: 0;
60
+ left: var(--toolmark-split);
61
+ width: 34px;
62
+ pointer-events: none;
63
+ transform: translateX(-50%);
64
+ }
65
+
66
+ .toolmark-handle::before {
67
+ position: absolute;
68
+ inset: 0 auto 0 50%;
69
+ width: 4px;
70
+ content: "";
71
+ border-radius: 99px;
72
+ background: #f59e0b;
73
+ box-shadow: 0 0 22px rgba(245, 158, 11, 0.74);
74
+ transform: translateX(-50%);
75
+ }
76
+
77
+ .toolmark-handle span {
78
+ position: absolute;
79
+ top: 50%;
80
+ left: 50%;
81
+ width: 28px;
82
+ height: 54px;
83
+ border: 1px solid rgba(255, 255, 255, 0.36);
84
+ border-radius: 8px;
85
+ background: rgba(12, 18, 24, 0.8);
86
+ box-shadow: 0 12px 28px rgba(0, 0, 0, 0.28);
87
+ transform: translate(-50%, -50%);
88
+ }
89
+
90
+ .toolmark-handle span::before,
91
+ .toolmark-handle span::after {
92
+ position: absolute;
93
+ top: 15px;
94
+ width: 5px;
95
+ height: 24px;
96
+ content: "";
97
+ border-radius: 99px;
98
+ background: rgba(255, 255, 255, 0.72);
99
+ }
100
+
101
+ .toolmark-handle span::before {
102
+ left: 8px;
103
+ }
104
+
105
+ .toolmark-handle span::after {
106
+ right: 8px;
107
+ }
108
+
109
+ .toolmark-score {
110
+ position: absolute;
111
+ right: 14px;
112
+ bottom: 14px;
113
+ z-index: 5;
114
+ display: grid;
115
+ gap: 1px;
116
+ min-width: 132px;
117
+ padding: 12px 13px;
118
+ border: 1px solid rgba(255, 255, 255, 0.16);
119
+ border-radius: 8px;
120
+ background:
121
+ radial-gradient(circle at 16px 16px, rgba(20, 184, 166, 0.42), transparent 36px),
122
+ rgba(8, 14, 19, 0.9);
123
+ color: #f8fafc;
124
+ box-shadow: 0 16px 30px rgba(0, 0, 0, 0.32);
125
+ }
126
+
127
+ .toolmark-score span,
128
+ .toolmark-bars span {
129
+ color: #cbd5e1;
130
+ font-size: 0.72rem;
131
+ font-weight: 850;
132
+ text-transform: uppercase;
133
+ letter-spacing: 0;
134
+ }
135
+
136
+ .toolmark-score strong {
137
+ font-size: 2.25rem;
138
+ line-height: 0.95;
139
+ overflow-wrap: anywhere;
140
+ }
141
+
142
+ .toolmark-score small {
143
+ color: #8fe7db;
144
+ font-size: 0.78rem;
145
+ font-weight: 800;
146
+ }
147
+
148
+ .toolmark-strip {
149
+ display: grid;
150
+ grid-template-columns: 1fr 1fr 1fr;
151
+ gap: 8px;
152
+ }
153
+
154
+ .toolmark-strip span {
155
+ height: 7px;
156
+ border-radius: 999px;
157
+ background: linear-gradient(90deg, #14b8a6, #f59e0b);
158
+ opacity: 0.78;
159
+ }
160
+
161
+ .toolmark-controls {
162
+ display: flex;
163
+ flex-direction: column;
164
+ gap: 10px;
165
+ }
166
+
167
+ .toolmark-unit-toggle {
168
+ display: grid;
169
+ grid-template-columns: 1fr 1fr;
170
+ gap: 5px;
171
+ }
172
+
173
+ .toolmark-panel-head .toolmark-unit-toggle {
174
+ width: 116px;
175
+ padding: 2px;
176
+ border-radius: 999px;
177
+ background: rgba(19, 33, 38, 0.08);
178
+ }
179
+
180
+ .toolmark-profile {
181
+ display: grid;
182
+ gap: 7px;
183
+ }
184
+
185
+ .toolmark-panel,
186
+ .toolmark-demo,
187
+ .toolmark-actions {
188
+ padding: 10px;
189
+ border: 1px solid rgba(15, 23, 42, 0.08);
190
+ border-radius: 8px;
191
+ background: rgba(255, 255, 255, 0.76);
192
+ }
193
+
194
+ .toolmark-panel {
195
+ display: grid;
196
+ gap: 10px;
197
+ }
198
+
199
+ .toolmark-panel-head {
200
+ display: flex;
201
+ align-items: center;
202
+ justify-content: space-between;
203
+ gap: 8px;
204
+ }
205
+
206
+ .toolmark-panel-label {
207
+ color: #475569;
208
+ font-size: 0.74rem;
209
+ font-weight: 900;
210
+ text-transform: uppercase;
211
+ letter-spacing: 0;
212
+ }
213
+
214
+ .toolmark-panel:has(.toolmark-upload) {
215
+ grid-template-columns: 1fr 1fr;
216
+ }
217
+
218
+ .toolmark-panel:has(.toolmark-upload) .toolmark-panel-label {
219
+ grid-column: 1 / -1;
220
+ }
221
+
222
+ .toolmark-upload {
223
+ position: relative;
224
+ display: grid;
225
+ gap: 5px;
226
+ min-width: 0;
227
+ min-height: 66px;
228
+ padding: 9px;
229
+ border: 1px dashed rgba(20, 184, 166, 0.55);
230
+ border-radius: 7px;
231
+ background: rgba(20, 184, 166, 0.08);
232
+ cursor: pointer;
233
+ }
234
+
235
+ .toolmark-upload span {
236
+ color: #334155;
237
+ font-size: 0.76rem;
238
+ font-weight: 850;
239
+ }
240
+
241
+ .toolmark-upload strong {
242
+ color: #132126;
243
+ font-size: 0.8rem;
244
+ font-weight: 800;
245
+ line-height: 1.12;
246
+ overflow: hidden;
247
+ text-overflow: ellipsis;
248
+ white-space: nowrap;
249
+ }
250
+
251
+ .toolmark-upload input {
252
+ position: absolute;
253
+ inset: 0;
254
+ opacity: 0;
255
+ cursor: pointer;
256
+ }
257
+
258
+ .toolmark-unit-toggle button,
259
+ .toolmark-actions button,
260
+ .toolmark-profile button {
261
+ min-height: 38px;
262
+ border: 0;
263
+ border-radius: 6px;
264
+ cursor: pointer;
265
+ font-size: 0.9rem;
266
+ font-weight: 850;
267
+ line-height: 1.1;
268
+ }
269
+
270
+ .toolmark-panel-head .toolmark-unit-toggle button {
271
+ min-height: 28px;
272
+ border-radius: 999px;
273
+ font-size: 0.72rem;
274
+ }
275
+
276
+ .toolmark-unit-toggle button,
277
+ .toolmark-profile button {
278
+ background: transparent;
279
+ color: #334155;
280
+ }
281
+
282
+ .toolmark-unit-toggle button[data-active="true"],
283
+ .toolmark-profile button[data-active="true"] {
284
+ background: #132126;
285
+ color: #f8fafc;
286
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12);
287
+ }
288
+
289
+ .toolmark-profile button {
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: space-between;
293
+ gap: 8px;
294
+ padding: 8px 10px;
295
+ text-align: left;
296
+ }
297
+
298
+ .toolmark-profile small {
299
+ color: currentcolor;
300
+ font-size: 0.72rem;
301
+ font-weight: 750;
302
+ opacity: 0.68;
303
+ }
304
+
305
+ .toolmark-slider {
306
+ position: relative;
307
+ display: grid;
308
+ gap: 6px;
309
+ padding: 0;
310
+ }
311
+
312
+ .toolmark-slider span,
313
+ .toolmark-bars span {
314
+ display: flex;
315
+ align-items: baseline;
316
+ justify-content: space-between;
317
+ gap: 8px;
318
+ }
319
+
320
+ .toolmark-slider b {
321
+ color: #334155;
322
+ font-size: 0.78rem;
323
+ font-weight: 850;
324
+ }
325
+
326
+ .toolmark-slider strong,
327
+ .toolmark-bars strong {
328
+ color: #132126;
329
+ font-size: 0.98rem;
330
+ line-height: 1;
331
+ }
332
+
333
+ .toolmark-slider input {
334
+ width: 100%;
335
+ height: 18px;
336
+ accent-color: #14b8a6;
337
+ }
338
+
339
+ .toolmark-bars {
340
+ display: grid;
341
+ gap: 10px;
342
+ }
343
+
344
+ .toolmark-tune {
345
+ display: grid;
346
+ grid-template-columns: 1fr 1fr;
347
+ gap: 8px;
348
+ }
349
+
350
+ .toolmark-tune label {
351
+ display: grid;
352
+ gap: 5px;
353
+ min-width: 0;
354
+ }
355
+
356
+ .toolmark-tune span {
357
+ color: #334155;
358
+ font-size: 0.78rem;
359
+ font-weight: 850;
360
+ }
361
+
362
+ .toolmark-tune input {
363
+ width: 100%;
364
+ accent-color: #f59e0b;
365
+ }
366
+
367
+ .toolmark-bars div {
368
+ display: grid;
369
+ gap: 6px;
370
+ }
371
+
372
+ .toolmark-bars meter {
373
+ width: 100%;
374
+ height: 13px;
375
+ }
376
+
377
+ .toolmark-actions {
378
+ display: grid;
379
+ grid-template-columns: repeat(3, 1fr);
380
+ gap: 8px;
381
+ }
382
+
383
+ .toolmark-actions button {
384
+ min-height: 40px;
385
+ border: 0;
386
+ border-radius: 6px;
387
+ background: rgba(19, 33, 38, 0.1);
388
+ color: #132126;
389
+ cursor: pointer;
390
+ font-size: 0.86rem;
391
+ font-weight: 850;
392
+ }
393
+
394
+ .toolmark-actions button[data-active="true"] {
395
+ background: #14b8a6;
396
+ color: #06211e;
397
+ }
398
+
399
+ .toolmark-demo {
400
+ display: grid;
401
+ gap: 8px;
402
+ padding: 8px 10px;
403
+ background: rgba(255, 255, 255, 0.46);
404
+ }
405
+
406
+ .toolmark-demo summary {
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: space-between;
410
+ cursor: pointer;
411
+ color: #334155;
412
+ font-size: 0.78rem;
413
+ font-weight: 900;
414
+ list-style: none;
415
+ }
416
+
417
+ .toolmark-demo summary::-webkit-details-marker {
418
+ display: none;
419
+ }
420
+
421
+ .toolmark-demo summary::after {
422
+ width: 9px;
423
+ height: 9px;
424
+ content: "";
425
+ border-right: 2px solid currentcolor;
426
+ border-bottom: 2px solid currentcolor;
427
+ transform: translateY(-2px) rotate(45deg);
428
+ }
429
+
430
+ .toolmark-demo[open] summary::after {
431
+ transform: translateY(2px) rotate(225deg);
432
+ }
433
+
434
+ .toolmark-demo .toolmark-profile,
435
+ .toolmark-demo .toolmark-bars {
436
+ margin-top: 6px;
437
+ }
438
+
439
+ .toolmark-demo .toolmark-profile {
440
+ grid-template-columns: 1fr;
441
+ gap: 4px;
442
+ }
443
+
444
+ .toolmark-demo .toolmark-profile button {
445
+ min-height: 34px;
446
+ padding: 6px 9px;
447
+ font-size: 0.8rem;
448
+ }
449
+
450
+ .toolmark-demo .toolmark-bars {
451
+ gap: 7px;
452
+ padding-top: 2px;
453
+ }
454
+
455
+ .toolmark-demo .toolmark-bars span {
456
+ font-size: 0.68rem;
457
+ }
458
+
459
+ .toolmark-demo .toolmark-bars meter {
460
+ height: 8px;
461
+ }
462
+
463
+ .toolmark-interpretation {
464
+ margin: 0;
465
+ padding: 2px 4px;
466
+ color: #64748b;
467
+ font-size: 0.72rem;
468
+ font-weight: 700;
469
+ line-height: 1.34;
470
+ }
471
+
472
+ .toolmark-interpretation:empty {
473
+ display: none;
474
+ }
475
+
476
+ .theme-dark .toolmark-shell {
477
+ color: #e5edf2;
478
+ }
479
+
480
+ .theme-dark .toolmark-stage {
481
+ border-color: rgba(255, 255, 255, 0.12);
482
+ background:
483
+ linear-gradient(135deg, rgba(20, 184, 166, 0.13), transparent 34%),
484
+ linear-gradient(315deg, rgba(245, 158, 11, 0.12), transparent 38%),
485
+ #111a20;
486
+ box-shadow: 0 22px 44px rgba(0, 0, 0, 0.38);
487
+ }
488
+
489
+ .theme-dark .toolmark-panel,
490
+ .theme-dark .toolmark-demo,
491
+ .theme-dark .toolmark-actions,
492
+ .theme-dark .toolmark-interpretation {
493
+ border-color: rgba(255, 255, 255, 0.08);
494
+ background: rgba(13, 22, 29, 0.82);
495
+ }
496
+
497
+ .theme-dark .toolmark-upload {
498
+ border-color: rgba(20, 184, 166, 0.44);
499
+ background: rgba(20, 184, 166, 0.1);
500
+ }
501
+
502
+ .theme-dark .toolmark-unit-toggle button,
503
+ .theme-dark .toolmark-profile button {
504
+ color: #dbe7ee;
505
+ }
506
+
507
+ .theme-dark .toolmark-panel-head .toolmark-unit-toggle {
508
+ background: rgba(255, 255, 255, 0.08);
509
+ }
510
+
511
+ .theme-dark .toolmark-unit-toggle button[data-active="true"],
512
+ .theme-dark .toolmark-profile button[data-active="true"] {
513
+ background: #f8fafc;
514
+ color: #122029;
515
+ }
516
+
517
+ .theme-dark .toolmark-slider b,
518
+ .theme-dark .toolmark-slider strong,
519
+ .theme-dark .toolmark-panel-label,
520
+ .theme-dark .toolmark-upload span,
521
+ .theme-dark .toolmark-upload strong,
522
+ .theme-dark .toolmark-tune span,
523
+ .theme-dark .toolmark-bars strong,
524
+ .theme-dark .toolmark-demo summary {
525
+ color: #f8fafc;
526
+ }
527
+
528
+ .theme-dark .toolmark-interpretation {
529
+ color: #b8c5cf;
530
+ }
531
+
532
+ .theme-dark .toolmark-actions button {
533
+ background: rgba(255, 255, 255, 0.08);
534
+ color: #f8fafc;
535
+ }
536
+
537
+ .theme-dark .toolmark-actions button[data-active="true"] {
538
+ background: #5eead4;
539
+ color: #06211e;
540
+ }
541
+
542
+ @media (max-width: 900px) {
543
+ .toolmark-stage {
544
+ grid-template-columns: 1fr;
545
+ padding: 9px;
546
+ }
547
+
548
+ .toolmark-view,
549
+ .toolmark-view canvas {
550
+ min-height: 380px;
551
+ }
552
+
553
+ .toolmark-profile {
554
+ grid-template-columns: 1fr;
555
+ }
556
+ }
557
+
558
+ @media (max-width: 540px) {
559
+ .toolmark-view,
560
+ .toolmark-view canvas {
561
+ min-height: 340px;
562
+ }
563
+
564
+ .toolmark-panel:has(.toolmark-upload),
565
+ .toolmark-tune {
566
+ grid-template-columns: 1fr;
567
+ }
568
+
569
+ .toolmark-actions {
570
+ grid-template-columns: 1fr;
571
+ }
572
+
573
+ .toolmark-score {
574
+ min-width: 112px;
575
+ }
576
+
577
+ .toolmark-score strong {
578
+ font-size: 1.8rem;
579
+ }
580
+ }