@jjlmoya/utils-forensic-science 1.3.0 → 1.4.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-fingerprint-minutiae-identifier/bibliography.astro +6 -0
  8. package/src/tool/forensic-fingerprint-minutiae-identifier/bibliography.ts +16 -0
  9. package/src/tool/forensic-fingerprint-minutiae-identifier/component.astro +429 -0
  10. package/src/tool/forensic-fingerprint-minutiae-identifier/drawer.ts +94 -0
  11. package/src/tool/forensic-fingerprint-minutiae-identifier/entry.ts +32 -0
  12. package/src/tool/forensic-fingerprint-minutiae-identifier/forensic-fingerprint-minutiae-identifier.css +969 -0
  13. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/de.ts +298 -0
  14. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/en.ts +289 -0
  15. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/es.ts +291 -0
  16. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/fr.ts +298 -0
  17. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/id.ts +298 -0
  18. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/it.ts +298 -0
  19. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/ja.ts +281 -0
  20. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/ko.ts +281 -0
  21. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/nl.ts +298 -0
  22. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/pl.ts +298 -0
  23. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/pt.ts +298 -0
  24. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/ru.ts +298 -0
  25. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/sv.ts +298 -0
  26. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/tr.ts +298 -0
  27. package/src/tool/forensic-fingerprint-minutiae-identifier/i18n/zh.ts +281 -0
  28. package/src/tool/forensic-fingerprint-minutiae-identifier/index.ts +11 -0
  29. package/src/tool/forensic-fingerprint-minutiae-identifier/logic.ts +168 -0
  30. package/src/tool/forensic-fingerprint-minutiae-identifier/renderer.ts +116 -0
  31. package/src/tool/forensic-fingerprint-minutiae-identifier/seo.astro +15 -0
  32. package/src/tools.ts +3 -1
@@ -0,0 +1,969 @@
1
+ .fp-shell {
2
+ --fp-ink: #10202c;
3
+ --fp-muted: #5d6f7b;
4
+ --fp-border: rgba(16, 32, 44, 0.14);
5
+ --fp-card: rgba(255, 255, 255, 0.82);
6
+ --fp-card-solid: #fff;
7
+ --fp-paper: #f8f3e9;
8
+ --fp-ridge: #203040;
9
+ --fp-ridge-glow: rgba(32, 48, 64, 0.16);
10
+ --fp-dust: #19b7a7;
11
+ --fp-accent: #0e9f8f;
12
+ --fp-blue: #1877d5;
13
+ --fp-amber: #e79a19;
14
+ --fp-green: #16a85c;
15
+ --fp-red: #e5484d;
16
+
17
+ color: var(--fp-ink);
18
+ }
19
+
20
+ .theme-dark .fp-shell {
21
+ --fp-ink: #edf7ff;
22
+ --fp-muted: #9eb0bc;
23
+ --fp-border: rgba(211, 230, 239, 0.18);
24
+ --fp-card: rgba(13, 22, 28, 0.78);
25
+ --fp-card-solid: #101a21;
26
+ --fp-paper: #e9ded0;
27
+ --fp-ridge: #273849;
28
+ --fp-ridge-glow: rgba(20, 184, 166, 0.18);
29
+ --fp-dust: #34d5c5;
30
+ --fp-accent: #55dccd;
31
+ }
32
+
33
+ .fp-board {
34
+ position: relative;
35
+ display: grid;
36
+ grid-template-columns: 1fr;
37
+ gap: 12px;
38
+ width: 100%;
39
+ overflow: hidden;
40
+ border: 1px solid var(--fp-border);
41
+ border-radius: 8px;
42
+ background:
43
+ linear-gradient(135deg, rgba(255, 255, 255, 0.88), rgba(231, 248, 244, 0.82) 50%, rgba(255, 246, 229, 0.72)),
44
+ repeating-linear-gradient(90deg, transparent 0 34px, rgba(14, 159, 143, 0.08) 34px 35px);
45
+ padding: 12px;
46
+ box-shadow: 0 18px 44px rgba(10, 24, 34, 0.1);
47
+ }
48
+
49
+ .fp-board[data-active-step='1'] .fp-canvas-actions,
50
+ .fp-board[data-active-step='2'] .fp-canvas-actions #fp-clear,
51
+ .fp-board[data-active-step='2'] .fp-canvas-actions #fp-export,
52
+ .fp-board[data-active-step='3'] .fp-canvas-actions #fp-export {
53
+ display: none;
54
+ }
55
+
56
+ .fp-board[data-active-step='3'] .fp-canvas-panel canvas {
57
+ cursor: crosshair;
58
+ }
59
+
60
+ .fp-workflow {
61
+ position: relative;
62
+ z-index: 1;
63
+ grid-column: 1 / -1;
64
+ display: grid;
65
+ grid-template-columns: repeat(4, 1fr);
66
+ gap: 8px;
67
+ }
68
+
69
+ .fp-workflow span {
70
+ display: grid;
71
+ grid-template-columns: 26px 1fr;
72
+ gap: 8px;
73
+ align-items: center;
74
+ min-width: 0;
75
+ border: 1px solid var(--fp-border);
76
+ border-radius: 8px;
77
+ background: var(--fp-card);
78
+ padding: 7px;
79
+ color: var(--fp-muted);
80
+ font-size: 0.78rem;
81
+ font-weight: 900;
82
+ }
83
+
84
+ .fp-workflow b {
85
+ display: grid;
86
+ width: 26px;
87
+ height: 26px;
88
+ place-items: center;
89
+ border-radius: 50%;
90
+ background: color-mix(in srgb, var(--fp-muted), transparent 84%);
91
+ color: var(--fp-ink);
92
+ }
93
+
94
+ .fp-workflow span[data-active='true'] {
95
+ border-color: color-mix(in srgb, var(--fp-accent), transparent 34%);
96
+ background: color-mix(in srgb, var(--fp-accent), transparent 86%);
97
+ color: var(--fp-ink);
98
+ }
99
+
100
+ .fp-workflow span[data-done='true'] b {
101
+ background: var(--fp-accent);
102
+ color: #fff;
103
+ }
104
+
105
+ .fp-board::before {
106
+ content: '';
107
+ position: absolute;
108
+ inset: 10px;
109
+ border: 1px dashed color-mix(in srgb, var(--fp-accent), transparent 70%);
110
+ border-radius: 7px;
111
+ pointer-events: none;
112
+ }
113
+
114
+ .theme-dark .fp-board {
115
+ background:
116
+ linear-gradient(135deg, rgba(7, 15, 20, 0.96), rgba(8, 38, 39, 0.88) 54%, rgba(44, 35, 22, 0.78)),
117
+ repeating-linear-gradient(90deg, transparent 0 34px, rgba(85, 220, 205, 0.07) 34px 35px);
118
+ box-shadow: 0 22px 52px rgba(0, 0, 0, 0.34);
119
+ }
120
+
121
+ .fp-canvas-panel,
122
+ .fp-controls,
123
+ .fp-flow,
124
+ .fp-evidence table {
125
+ position: relative;
126
+ z-index: 1;
127
+ }
128
+
129
+ .fp-canvas-panel {
130
+ grid-column: 1 / -1;
131
+ min-width: 0;
132
+ overflow: hidden;
133
+ border: 1px solid color-mix(in srgb, var(--fp-accent), transparent 58%);
134
+ border-radius: 8px;
135
+ background:
136
+ linear-gradient(180deg, rgba(255, 255, 255, 0.45), transparent 18%),
137
+ var(--fp-paper);
138
+ box-shadow:
139
+ inset 0 0 0 1px rgba(255, 255, 255, 0.56),
140
+ 0 18px 40px rgba(13, 33, 42, 0.14);
141
+ }
142
+
143
+ .fp-upload {
144
+ position: absolute;
145
+ inset: 0;
146
+ z-index: 6;
147
+ display: grid;
148
+ align-content: center;
149
+ justify-items: center;
150
+ gap: 8px;
151
+ background:
152
+ linear-gradient(135deg, rgba(255, 255, 255, 0.82), rgba(231, 248, 244, 0.82)),
153
+ var(--fp-paper);
154
+ color: var(--fp-ink);
155
+ text-align: center;
156
+ }
157
+
158
+ .fp-upload[data-has-image='true'] {
159
+ display: none;
160
+ }
161
+
162
+ .fp-upload svg {
163
+ width: 42px;
164
+ height: 42px;
165
+ color: var(--fp-accent);
166
+ }
167
+
168
+ .fp-upload strong {
169
+ font-size: clamp(1.25rem, 4vw, 1.8rem);
170
+ line-height: 1;
171
+ }
172
+
173
+ .fp-upload span {
174
+ color: var(--fp-muted);
175
+ font-weight: 850;
176
+ }
177
+
178
+ .fp-upload input {
179
+ position: absolute;
180
+ inset: 0;
181
+ opacity: 0;
182
+ cursor: pointer;
183
+ }
184
+
185
+ .fp-canvas-panel canvas {
186
+ display: block;
187
+ width: 100%;
188
+ min-height: 540px;
189
+ aspect-ratio: 16 / 9;
190
+ cursor: zoom-in;
191
+ }
192
+
193
+ .fp-canvas-hint {
194
+ position: absolute;
195
+ top: 12px;
196
+ right: 12px;
197
+ left: auto;
198
+ z-index: 5;
199
+ max-width: min(520px, calc(100% - 24px));
200
+ border: 1px solid color-mix(in srgb, var(--fp-accent), transparent 50%);
201
+ border-radius: 999px;
202
+ background: rgba(9, 18, 24, 0.72);
203
+ color: #f2fbff;
204
+ padding: 7px 12px;
205
+ box-shadow: 0 14px 30px rgba(10, 24, 34, 0.14);
206
+ }
207
+
208
+ .theme-dark .fp-canvas-hint {
209
+ background: rgba(9, 18, 24, 0.84);
210
+ }
211
+
212
+ .fp-canvas-hint strong {
213
+ font-size: clamp(0.84rem, 1.7vw, 1rem);
214
+ line-height: 1.1;
215
+ }
216
+
217
+ .fp-canvas-panel::after {
218
+ content: '';
219
+ position: absolute;
220
+ inset: 0;
221
+ background:
222
+ linear-gradient(90deg, rgba(255, 255, 255, 0.38), transparent 18%, transparent 78%, rgba(255, 255, 255, 0.28)),
223
+ repeating-linear-gradient(0deg, transparent 0 39px, rgba(14, 159, 143, 0.08) 39px 40px),
224
+ repeating-linear-gradient(90deg, transparent 0 39px, rgba(14, 159, 143, 0.06) 39px 40px);
225
+ mix-blend-mode: multiply;
226
+ pointer-events: none;
227
+ }
228
+
229
+ .theme-dark .fp-canvas-panel::after {
230
+ mix-blend-mode: soft-light;
231
+ }
232
+
233
+ .fp-glass {
234
+ position: absolute;
235
+ z-index: 4;
236
+ width: 124px;
237
+ height: 124px;
238
+ border: 3px solid rgba(255, 255, 255, 0.9);
239
+ border-radius: 50%;
240
+ background:
241
+ linear-gradient(rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.12));
242
+ background-repeat: no-repeat;
243
+ box-shadow:
244
+ 0 0 0 8px rgba(14, 159, 143, 0.12),
245
+ 0 18px 38px rgba(12, 26, 35, 0.26);
246
+ opacity: 0;
247
+ pointer-events: none;
248
+ transform: translate(-50%, -50%);
249
+ transition: opacity 120ms ease;
250
+ }
251
+
252
+ .fp-canvas-actions {
253
+ position: absolute;
254
+ right: 12px;
255
+ bottom: 12px;
256
+ z-index: 5;
257
+ display: flex;
258
+ gap: 8px;
259
+ }
260
+
261
+ .fp-canvas-actions button,
262
+ .fp-selector button,
263
+ .fp-legend button,
264
+ .fp-evidence button {
265
+ min-height: 38px;
266
+ border: 1px solid var(--fp-border);
267
+ border-radius: 6px;
268
+ background: rgba(255, 255, 255, 0.78);
269
+ color: var(--fp-ink);
270
+ font-size: inherit;
271
+ font-weight: 900;
272
+ box-shadow: 0 8px 18px rgba(10, 24, 34, 0.06);
273
+ }
274
+
275
+ .fp-canvas-actions button {
276
+ display: inline-flex;
277
+ align-items: center;
278
+ gap: 6px;
279
+ padding: 0 10px;
280
+ }
281
+
282
+ .fp-canvas-actions svg {
283
+ width: 18px;
284
+ height: 18px;
285
+ }
286
+
287
+ .theme-dark .fp-canvas-actions button,
288
+ .theme-dark .fp-selector button,
289
+ .theme-dark .fp-legend button,
290
+ .theme-dark .fp-evidence button {
291
+ background: rgba(9, 18, 24, 0.82);
292
+ }
293
+
294
+ .fp-controls {
295
+ grid-column: 1 / -1;
296
+ display: grid;
297
+ grid-template-columns: 1.2fr 1fr auto;
298
+ gap: 20px;
299
+ align-items: center;
300
+ min-width: 0;
301
+ border: 1px solid var(--fp-border);
302
+ border-radius: 16px;
303
+ background: rgba(255, 255, 255, 0.45);
304
+ padding: 24px;
305
+ backdrop-filter: blur(20px);
306
+ box-shadow: 0 8px 32px 0 rgba(10, 24, 34, 0.08);
307
+ }
308
+
309
+ .theme-dark .fp-controls {
310
+ background: rgba(13, 22, 28, 0.45);
311
+ border: 1px solid rgba(255, 255, 255, 0.08);
312
+ box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
313
+ }
314
+
315
+ .fp-step-panel {
316
+ display: none;
317
+ }
318
+
319
+ .fp-step-panel[data-active='true'] {
320
+ display: contents;
321
+ }
322
+
323
+ .fp-step-panel[data-fp-panel='1'] .fp-step-heading {
324
+ grid-column: 1 / 3;
325
+ grid-row: 1;
326
+ }
327
+
328
+ .fp-step-panel[data-fp-panel='1'] .fp-primary-action {
329
+ grid-column: 3;
330
+ grid-row: 1;
331
+ justify-self: end;
332
+ align-self: center;
333
+ width: auto;
334
+ min-width: 200px;
335
+ }
336
+
337
+ .fp-step-panel[data-fp-panel='2'] .fp-step-heading {
338
+ grid-column: 1 / -1;
339
+ grid-row: 1;
340
+ border-bottom: 1px solid var(--fp-border);
341
+ padding-bottom: 12px;
342
+ margin-bottom: 8px;
343
+ }
344
+
345
+ .fp-step-panel[data-fp-panel='2'] .fp-selector {
346
+ grid-column: 1;
347
+ grid-row: 2;
348
+ }
349
+
350
+ .fp-step-panel[data-fp-panel='2'] .fp-compact-sliders {
351
+ grid-column: 2;
352
+ grid-row: 2;
353
+ }
354
+
355
+ .fp-step-panel[data-fp-panel='2'] .fp-primary-action {
356
+ grid-column: 2;
357
+ grid-row: 3;
358
+ justify-self: end;
359
+ width: auto;
360
+ min-width: 200px;
361
+ }
362
+
363
+ .fp-step-panel[data-fp-panel='3'] .fp-step-heading {
364
+ grid-column: 1 / -1;
365
+ grid-row: 1;
366
+ border-bottom: 1px solid var(--fp-border);
367
+ padding-bottom: 12px;
368
+ margin-bottom: 8px;
369
+ }
370
+
371
+ .fp-step-panel[data-fp-panel='3'] .fp-legend {
372
+ grid-column: 1;
373
+ grid-row: 2;
374
+ }
375
+
376
+ .fp-step-panel[data-fp-panel='3'] .fp-active-minutia {
377
+ grid-column: 2;
378
+ grid-row: 2;
379
+ }
380
+
381
+ .fp-step-panel[data-fp-panel='3'] .fp-mark-actions {
382
+ grid-column: 3;
383
+ grid-row: 2;
384
+ }
385
+
386
+ .fp-step-panel[data-fp-panel='3'] .fp-primary-action {
387
+ grid-column: 2;
388
+ grid-row: 3;
389
+ justify-self: end;
390
+ width: auto;
391
+ min-width: 200px;
392
+ }
393
+
394
+ .fp-step-panel[data-fp-panel='4'] .fp-step-heading {
395
+ grid-column: 1 / 3;
396
+ grid-row: 1;
397
+ }
398
+
399
+ .fp-step-panel[data-fp-panel='4'] .fp-primary-action {
400
+ grid-column: 3;
401
+ grid-row: 1;
402
+ justify-self: end;
403
+ align-self: center;
404
+ width: auto;
405
+ min-width: 200px;
406
+ }
407
+
408
+ .fp-step-nav {
409
+ grid-column: 3;
410
+ grid-row: 3;
411
+ display: flex;
412
+ gap: 8px;
413
+ justify-content: flex-end;
414
+ align-self: center;
415
+ }
416
+
417
+ .fp-primary-action {
418
+ display: inline-flex;
419
+ align-items: center;
420
+ justify-content: center;
421
+ gap: 7px;
422
+ min-height: 42px;
423
+ width: 100%;
424
+ height: 42px;
425
+ border: none;
426
+ border-radius: 8px;
427
+ background: var(--fp-accent);
428
+ color: #fff;
429
+ font-size: inherit;
430
+ font-weight: 700;
431
+ cursor: pointer;
432
+ box-shadow: 0 4px 14px rgba(14, 159, 143, 0.3);
433
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
434
+ }
435
+
436
+ .theme-dark .fp-primary-action {
437
+ color: #052d29;
438
+ }
439
+
440
+ .fp-primary-action:hover:not(:disabled) {
441
+ background: var(--fp-dust);
442
+ transform: translateY(-1.5px);
443
+ box-shadow: 0 6px 20px rgba(14, 159, 143, 0.45);
444
+ }
445
+
446
+ .fp-primary-action:disabled {
447
+ opacity: 0.4;
448
+ cursor: not-allowed;
449
+ transform: none;
450
+ box-shadow: none;
451
+ }
452
+
453
+ .fp-step-nav button {
454
+ display: inline-flex;
455
+ align-items: center;
456
+ justify-content: center;
457
+ gap: 7px;
458
+ min-height: 42px;
459
+ height: 42px;
460
+ padding: 0 18px;
461
+ border: 1px solid var(--fp-border);
462
+ border-radius: 8px;
463
+ background: transparent;
464
+ color: var(--fp-ink);
465
+ font-size: inherit;
466
+ font-weight: 700;
467
+ cursor: pointer;
468
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
469
+ }
470
+
471
+ .theme-dark .fp-step-nav button {
472
+ border-color: rgba(255, 255, 255, 0.15);
473
+ }
474
+
475
+ .fp-step-nav button:hover:not(:disabled) {
476
+ background: rgba(0, 0, 0, 0.05);
477
+ border-color: rgba(0, 0, 0, 0.25);
478
+ transform: translateY(-1.5px);
479
+ }
480
+
481
+ .theme-dark .fp-step-nav button:hover:not(:disabled) {
482
+ background: rgba(255, 255, 255, 0.08);
483
+ border-color: rgba(255, 255, 255, 0.25);
484
+ }
485
+
486
+ .fp-step-nav button:disabled {
487
+ opacity: 0.4;
488
+ cursor: not-allowed;
489
+ transform: none;
490
+ }
491
+
492
+ .fp-step-nav svg,
493
+ .fp-primary-action svg {
494
+ width: 18px;
495
+ height: 18px;
496
+ }
497
+
498
+ .fp-board[data-active-step='1'] .fp-step-nav,
499
+ .fp-board[data-active-step='2'] .fp-step-nav,
500
+ .fp-board[data-active-step='4'] .fp-step-nav {
501
+ display: none;
502
+ }
503
+
504
+ .fp-step-heading {
505
+ display: grid;
506
+ gap: 6px;
507
+ min-width: 0;
508
+ }
509
+
510
+ .fp-step-heading span {
511
+ color: var(--fp-accent);
512
+ font-size: 0.75rem;
513
+ font-weight: 800;
514
+ text-transform: uppercase;
515
+ letter-spacing: 0.05em;
516
+ }
517
+
518
+ .fp-step-heading strong {
519
+ font-size: 1.25rem;
520
+ font-weight: 700;
521
+ line-height: 1.15;
522
+ color: var(--fp-ink);
523
+ }
524
+
525
+ .fp-step-heading p {
526
+ margin: 0;
527
+ color: var(--fp-muted);
528
+ font-size: 0.85rem;
529
+ font-weight: 500;
530
+ line-height: 1.4;
531
+ }
532
+
533
+
534
+ .fp-shell .fp-selector {
535
+ display: grid;
536
+ grid-template-columns: repeat(3, 1fr);
537
+ gap: 4px;
538
+ background: rgba(0, 0, 0, 0.06);
539
+ padding: 4px;
540
+ border-radius: 8px;
541
+ border: 1px solid var(--fp-border);
542
+ }
543
+
544
+ .theme-dark .fp-shell .fp-selector {
545
+ background: rgba(255, 255, 255, 0.05);
546
+ border-color: rgba(255, 255, 255, 0.08);
547
+ }
548
+
549
+ .fp-shell .fp-selector button {
550
+ border: none;
551
+ background: transparent;
552
+ color: var(--fp-muted);
553
+ box-shadow: none;
554
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
555
+ border-radius: 6px;
556
+ min-width: 0;
557
+ padding: 0 8px;
558
+ min-height: 44px;
559
+ font-weight: 700;
560
+ }
561
+
562
+ .fp-shell .fp-selector button:hover {
563
+ color: var(--fp-ink);
564
+ background: rgba(255, 255, 255, 0.05);
565
+ }
566
+
567
+ .fp-shell .fp-selector button[data-active='true'] {
568
+ background: var(--fp-accent);
569
+ color: #052d29;
570
+ box-shadow: 0 4px 12px rgba(14, 159, 143, 0.25);
571
+ }
572
+
573
+ .theme-dark .fp-shell .fp-selector button[data-active='true'] {
574
+ background: var(--fp-accent);
575
+ color: #052d29;
576
+ box-shadow: 0 4px 12px rgba(14, 159, 143, 0.4);
577
+ }
578
+
579
+ .fp-compact-sliders {
580
+ display: flex;
581
+ flex-direction: column;
582
+ gap: 12px;
583
+ }
584
+
585
+ .fp-slider {
586
+ display: grid;
587
+ gap: 6px;
588
+ color: var(--fp-muted);
589
+ font-size: 0.8rem;
590
+ font-weight: 700;
591
+ grid-template-columns: 1fr auto;
592
+ }
593
+
594
+ .fp-slider span {
595
+ text-transform: uppercase;
596
+ letter-spacing: 0.05em;
597
+ }
598
+
599
+ .fp-slider input[type="range"] {
600
+ grid-column: 1 / -1;
601
+ width: 100%;
602
+ -webkit-appearance: none;
603
+ appearance: none;
604
+ background: rgba(0, 0, 0, 0.08);
605
+ height: 4px;
606
+ border-radius: 2px;
607
+ outline: none;
608
+ }
609
+
610
+ .theme-dark .fp-slider input[type="range"] {
611
+ background: rgba(255, 255, 255, 0.12);
612
+ }
613
+
614
+ .fp-slider input[type="range"]::-webkit-slider-thumb {
615
+ -webkit-appearance: none;
616
+ appearance: none;
617
+ width: 14px;
618
+ height: 14px;
619
+ border-radius: 50%;
620
+ background: var(--fp-accent);
621
+ border: 2px solid var(--fp-card-solid);
622
+ cursor: pointer;
623
+ box-shadow: 0 0 8px var(--fp-accent);
624
+ transition: transform 0.1s ease;
625
+ }
626
+
627
+ .fp-slider input[type="range"]::-webkit-slider-thumb:hover {
628
+ transform: scale(1.2);
629
+ }
630
+
631
+ .fp-slider strong {
632
+ color: var(--fp-accent);
633
+ font-size: 0.95rem;
634
+ background: rgba(14, 159, 143, 0.1);
635
+ padding: 2px 6px;
636
+ border-radius: 4px;
637
+ border: 1px solid rgba(14, 159, 143, 0.2);
638
+ line-height: 1;
639
+ }
640
+
641
+ .fp-readouts {
642
+ display: grid;
643
+ grid-template-columns: 1fr 1fr;
644
+ gap: 8px;
645
+ }
646
+
647
+ .fp-step-panel[data-fp-panel='2'] .fp-readouts,
648
+ .fp-step-panel[data-fp-panel='3'] .fp-readouts,
649
+ .fp-step-panel[data-fp-panel='4'] .fp-readouts {
650
+ display: none;
651
+ }
652
+
653
+ .fp-readouts div,
654
+ .fp-flow {
655
+ min-height: 86px;
656
+ border: 1px solid color-mix(in srgb, var(--fp-accent), transparent 68%);
657
+ border-radius: 8px;
658
+ background:
659
+ linear-gradient(135deg, color-mix(in srgb, var(--fp-accent), transparent 84%), transparent),
660
+ var(--fp-card);
661
+ padding: 12px;
662
+ }
663
+
664
+ .fp-readouts span,
665
+ .fp-flow span {
666
+ display: block;
667
+ color: var(--fp-muted);
668
+ font-size: 0.66rem;
669
+ font-weight: 900;
670
+ letter-spacing: 0;
671
+ text-transform: uppercase;
672
+ }
673
+
674
+ .fp-readouts strong,
675
+ .fp-flow strong {
676
+ display: block;
677
+ margin-top: 8px;
678
+ font-size: clamp(1.05rem, 3vw, 1.48rem);
679
+ line-height: 1.1;
680
+ }
681
+
682
+ .fp-legend {
683
+ display: grid;
684
+ grid-template-columns: 1fr 1fr;
685
+ gap: 6px;
686
+ }
687
+
688
+ .fp-legend button {
689
+ display: grid;
690
+ grid-template-columns: 12px 1fr auto;
691
+ grid-template-rows: auto auto;
692
+ gap: 6px;
693
+ align-items: center;
694
+ min-width: 0;
695
+ min-height: 58px;
696
+ padding: 7px 12px;
697
+ text-align: left;
698
+ border-radius: 8px;
699
+ transition: all 0.2s ease;
700
+ }
701
+
702
+ .fp-legend button:hover:not(:disabled) {
703
+ transform: translateY(-1px);
704
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
705
+ border-color: color-mix(in srgb, var(--legend-color), transparent 50%);
706
+ }
707
+
708
+ .fp-legend small {
709
+ grid-column: 2 / 4;
710
+ color: var(--fp-muted);
711
+ font-size: 0.68rem;
712
+ font-weight: 760;
713
+ line-height: 1.1;
714
+ }
715
+
716
+ .fp-legend b {
717
+ color: var(--fp-muted);
718
+ font-size: 0.72rem;
719
+ }
720
+
721
+ .fp-legend button[data-active='true'] {
722
+ border-color: color-mix(in srgb, var(--legend-color), transparent 34%);
723
+ background: color-mix(in srgb, var(--legend-color), transparent 86%);
724
+ }
725
+
726
+ .fp-legend button[data-full='true'] {
727
+ opacity: 0.52;
728
+ cursor: not-allowed;
729
+ }
730
+
731
+ .fp-legend i {
732
+ width: 11px;
733
+ height: 11px;
734
+ border-radius: 50%;
735
+ background: var(--legend-color);
736
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--legend-color), transparent 84%);
737
+ }
738
+
739
+ .fp-legend button:nth-child(1) { --legend-color: var(--fp-red); }
740
+ .fp-legend button:nth-child(2) { --legend-color: var(--fp-blue); }
741
+ .fp-legend button:nth-child(3) { --legend-color: var(--fp-amber); }
742
+ .fp-legend button:nth-child(4) { --legend-color: var(--fp-green); }
743
+
744
+ .fp-active-minutia {
745
+ display: grid;
746
+ gap: 4px;
747
+ min-height: 58px;
748
+ border: 1px solid color-mix(in srgb, var(--fp-accent), transparent 75%);
749
+ border-radius: 8px;
750
+ background: color-mix(in srgb, var(--fp-accent), transparent 94%);
751
+ padding: 10px 12px;
752
+ }
753
+
754
+ .fp-active-minutia span {
755
+ color: var(--fp-muted);
756
+ font-size: 0.64rem;
757
+ font-weight: 900;
758
+ text-transform: uppercase;
759
+ }
760
+
761
+ .fp-active-minutia strong {
762
+ font-size: 0.98rem;
763
+ line-height: 1;
764
+ }
765
+
766
+ .fp-active-minutia p {
767
+ margin: 0;
768
+ color: var(--fp-muted);
769
+ font-size: 0.72rem;
770
+ font-weight: 760;
771
+ line-height: 1.25;
772
+ }
773
+
774
+ .fp-mark-actions {
775
+ display: flex;
776
+ flex-direction: column;
777
+ gap: 6px;
778
+ justify-content: center;
779
+ }
780
+
781
+ .fp-mark-actions button {
782
+ display: inline-flex;
783
+ align-items: center;
784
+ justify-content: center;
785
+ gap: 5px;
786
+ min-height: 38px;
787
+ border: 1px solid var(--fp-border);
788
+ border-radius: 6px;
789
+ background: rgba(255, 255, 255, 0.68);
790
+ color: var(--fp-ink);
791
+ font-size: 0.78rem;
792
+ font-weight: 900;
793
+ transition: all 0.2s ease;
794
+ }
795
+
796
+ .fp-mark-actions button:hover:not(:disabled) {
797
+ background: var(--fp-card-solid);
798
+ border-color: color-mix(in srgb, var(--fp-accent), transparent 50%);
799
+ transform: translateY(-1px);
800
+ }
801
+
802
+ .theme-dark .fp-mark-actions button {
803
+ background: rgba(9, 18, 24, 0.82);
804
+ }
805
+
806
+ .fp-mark-actions button:disabled {
807
+ opacity: 0.42;
808
+ cursor: not-allowed;
809
+ }
810
+
811
+ .fp-mark-actions svg {
812
+ width: 16px;
813
+ height: 16px;
814
+ }
815
+
816
+ .fp-evidence {
817
+ grid-column: 1 / -1;
818
+ display: none;
819
+ grid-template-columns: minmax(240px, 0.42fr) minmax(0, 1fr);
820
+ gap: 12px;
821
+ min-width: 0;
822
+ }
823
+
824
+ .fp-board[data-active-step='4'] .fp-evidence {
825
+ display: grid;
826
+ }
827
+
828
+ .fp-evidence table {
829
+ width: 100%;
830
+ min-width: 520px;
831
+ overflow: hidden;
832
+ border: 1px solid var(--fp-border);
833
+ border-spacing: 0;
834
+ border-radius: 8px;
835
+ background: var(--fp-card);
836
+ backdrop-filter: blur(10px);
837
+ }
838
+
839
+ .fp-evidence th,
840
+ .fp-evidence td {
841
+ border-bottom: 1px solid var(--fp-border);
842
+ padding: 10px 12px;
843
+ text-align: left;
844
+ }
845
+
846
+ .fp-evidence th {
847
+ color: var(--fp-muted);
848
+ font-size: 0.68rem;
849
+ font-weight: 900;
850
+ text-transform: uppercase;
851
+ }
852
+
853
+ .fp-evidence td {
854
+ font-weight: 820;
855
+ }
856
+
857
+ .fp-evidence td span {
858
+ display: inline-block;
859
+ width: 11px;
860
+ height: 11px;
861
+ margin-right: 8px;
862
+ border-radius: 50%;
863
+ background: var(--dot);
864
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--dot), transparent 84%);
865
+ }
866
+
867
+ .fp-icon-button {
868
+ display: inline-grid;
869
+ width: 36px;
870
+ min-height: 34px;
871
+ place-items: center;
872
+ padding: 0;
873
+ }
874
+
875
+ .fp-icon-button svg {
876
+ width: 18px;
877
+ height: 18px;
878
+ }
879
+
880
+ .fp-checklist {
881
+ position: relative;
882
+ z-index: 1;
883
+ grid-column: 1 / -1;
884
+ margin: 0;
885
+ border-left: 3px solid var(--fp-accent);
886
+ padding: 2px 0 2px 10px;
887
+ color: var(--fp-muted);
888
+ font-size: 0.88rem;
889
+ font-weight: 850;
890
+ }
891
+
892
+ @media (max-width: 860px) {
893
+ .fp-board,
894
+ .fp-controls,
895
+ .fp-evidence {
896
+ grid-template-columns: 1fr;
897
+ }
898
+
899
+ .fp-step-panel[data-active='true'] {
900
+ display: flex;
901
+ flex-direction: column;
902
+ gap: 16px;
903
+ width: 100%;
904
+ }
905
+
906
+ .fp-step-panel[data-active='true'] > * {
907
+ grid-column: 1;
908
+ grid-row: auto;
909
+ }
910
+
911
+ .fp-step-panel[data-active='true'] .fp-primary-action {
912
+ width: 100%;
913
+ align-self: stretch;
914
+ }
915
+
916
+ .fp-step-nav {
917
+ grid-column: 1;
918
+ grid-row: auto;
919
+ justify-content: stretch;
920
+ width: 100%;
921
+ }
922
+
923
+ .fp-step-nav button {
924
+ width: 100%;
925
+ }
926
+
927
+ .fp-compact-sliders {
928
+ grid-template-columns: 1fr;
929
+ }
930
+
931
+ .fp-mark-actions {
932
+ grid-template-columns: 1fr;
933
+ }
934
+
935
+ .fp-workflow {
936
+ grid-template-columns: 1fr 1fr;
937
+ }
938
+
939
+ .fp-evidence {
940
+ overflow-x: auto;
941
+ }
942
+
943
+ .fp-evidence table {
944
+ min-width: 0;
945
+ width: 100%;
946
+ }
947
+ }
948
+
949
+ @media (max-width: 560px) {
950
+ .fp-board {
951
+ padding: 10px;
952
+ }
953
+
954
+ .fp-selector,
955
+ .fp-readouts,
956
+ .fp-legend,
957
+ .fp-workflow {
958
+ grid-template-columns: 1fr;
959
+ }
960
+
961
+ .fp-canvas-panel canvas {
962
+ min-height: 430px;
963
+ }
964
+
965
+ .fp-canvas-actions {
966
+ right: 8px;
967
+ bottom: 8px;
968
+ }
969
+ }