@simprints/simface-sdk 0.11.1 → 0.13.1

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.
@@ -404,7 +404,8 @@ let SimFaceCapture = class SimFaceCapture extends LitElement {
404
404
  SimFaceCapture.styles = css `
405
405
  :host {
406
406
  display: block;
407
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
407
+ font-family: 'Mulish', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
408
+ color: #212529;
408
409
  max-width: 400px;
409
410
  margin: 0 auto;
410
411
  text-align: center;
@@ -419,9 +420,9 @@ SimFaceCapture.styles = css `
419
420
  .container {
420
421
  position: relative;
421
422
  padding: 16px;
422
- border: 1px solid #e0e0e0;
423
+ border: 1px solid #E0E0E0;
423
424
  border-radius: 16px;
424
- background: #fafafa;
425
+ background: #F6F6F6;
425
426
  }
426
427
 
427
428
  .close-btn {
@@ -438,7 +439,7 @@ SimFaceCapture.styles = css `
438
439
  border: none;
439
440
  border-radius: 50%;
440
441
  background: rgba(0, 0, 0, 0.06);
441
- color: #49454f;
442
+ color: #5D5E5E;
442
443
  cursor: pointer;
443
444
  transition: background-color 0.15s;
444
445
  }
@@ -461,7 +462,7 @@ SimFaceCapture.styles = css `
461
462
 
462
463
  .capture-copy {
463
464
  margin: 0;
464
- color: #334155;
465
+ color: #5D5E5E;
465
466
  text-align: center;
466
467
  width: 100%;
467
468
  }
@@ -473,8 +474,8 @@ SimFaceCapture.styles = css `
473
474
  aspect-ratio: 3 / 4;
474
475
  border-radius: 22px;
475
476
  background:
476
- radial-gradient(circle at top, rgba(56, 189, 248, 0.16), transparent 30%),
477
- linear-gradient(180deg, #0f172a, #020617);
477
+ radial-gradient(circle at top, rgba(0, 179, 209, 0.16), transparent 30%),
478
+ linear-gradient(180deg, #1a1a1a, #0d0d0d);
478
479
  box-shadow: inset 0 0 0 1px rgba(148, 163, 184, 0.2);
479
480
  }
480
481
 
@@ -506,7 +507,7 @@ SimFaceCapture.styles = css `
506
507
  }
507
508
 
508
509
  .guide-mask {
509
- fill: rgba(51, 65, 85, 0.75);
510
+ fill: rgba(42, 42, 42, 0.75);
510
511
  fill-rule: evenodd;
511
512
  }
512
513
 
@@ -520,7 +521,7 @@ SimFaceCapture.styles = css `
520
521
 
521
522
  .ring-progress {
522
523
  fill: none;
523
- stroke: #22c55e;
524
+ stroke: #00B3D1;
524
525
  stroke-width: 2.8;
525
526
  stroke-linecap: round;
526
527
  stroke-linejoin: round;
@@ -544,24 +545,25 @@ SimFaceCapture.styles = css `
544
545
  border: none;
545
546
  border-radius: 100px;
546
547
  font-size: 15px;
547
- font-weight: 600;
548
- letter-spacing: 0.02em;
548
+ font-weight: 700;
549
+ letter-spacing: 0.04em;
550
+ text-transform: var(--simface-button-text-transform, uppercase);
549
551
  cursor: pointer;
550
552
  transition: background-color 0.15s, box-shadow 0.15s;
551
553
  }
552
554
 
553
555
  .btn-primary {
554
- background: #2563eb;
556
+ background: #00B3D1;
555
557
  color: white;
556
558
  }
557
559
 
558
560
  .btn-primary:hover {
559
- background: #1d4ed8;
560
- box-shadow: 0 1px 3px rgba(37, 99, 235, 0.3);
561
+ background: #009DB8;
562
+ box-shadow: 0 1px 3px rgba(0, 179, 209, 0.3);
561
563
  }
562
564
 
563
565
  .btn-primary:disabled {
564
- background: #93c5fd;
566
+ background: #80D9E8;
565
567
  cursor: not-allowed;
566
568
  box-shadow: none;
567
569
  }
@@ -587,12 +589,12 @@ SimFaceCapture.styles = css `
587
589
  }
588
590
 
589
591
  .btn-secondary {
590
- background: #e5e7eb;
591
- color: #374151;
592
+ background: #E0E0E0;
593
+ color: #212529;
592
594
  }
593
595
 
594
596
  .btn-secondary:hover {
595
- background: #d1d5db;
597
+ background: #D0D0D0;
596
598
  }
597
599
 
598
600
  .quality-msg {
@@ -619,21 +621,21 @@ SimFaceCapture.styles = css `
619
621
  }
620
622
 
621
623
  .quality-neutral {
622
- background: #e2e8f0;
623
- color: #0f172a;
624
+ background: #E0E0E0;
625
+ color: #212529;
624
626
  }
625
627
 
626
628
  .quality-manual {
627
- background: #e0f2fe;
628
- color: #0f172a;
629
+ background: #E0F7FB;
630
+ color: #212529;
629
631
  }
630
632
 
631
633
  .spinner {
632
634
  display: inline-block;
633
635
  width: 24px;
634
636
  height: 24px;
635
- border: 3px solid #e5e7eb;
636
- border-top: 3px solid #2563eb;
637
+ border: 3px solid #E0E0E0;
638
+ border-top: 3px solid #00B3D1;
637
639
  border-radius: 50%;
638
640
  animation: spin 0.8s linear infinite;
639
641
  margin: 12px auto;
@@ -1 +1 @@
1
- {"version":3,"file":"simface-capture.js","sourceRoot":"","sources":["../../src/components/simface-capture.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,8BAA8B,GAG/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAMtC;;;;;;;GAOG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,UAAU;IAAvC;;QACuB,UAAK,GAAG,aAAa,CAAC;QACY,sBAAiB,GAAG,2BAA2B,CAAC;QAClE,aAAQ,GAAG,KAAK,CAAC;QACjB,WAAM,GAAG,KAAK,CAAC;QACH,iBAAY,GAAG,qBAAqB,CAAC;QACrC,iBAAY,GAAG,qBAAqB,CAAC;QACtC,gBAAW,GAAG,oBAAoB,CAAC;QACpC,eAAU,GAAG,mBAAmB,CAAC;QAEvF,sBAAiB,GAAsB,gBAAgB,CAAC;QAExD,6BAAwB,GAAG,IAAI,CAAC;QAEf,iBAAY,GAAiB,MAAM,CAAC;QACpC,iBAAY,GAAG,EAAE,CAAC;QAClB,oBAAe,GAAG,2BAA2B,CAAC;QAC9C,iBAAY,GAAiB,SAAS,CAAC;QACvC,eAAU,GAAG,EAAE,CAAC;QAChB,kBAAa,GAA6B,IAAI,CAAC;QAC/C,iBAAY,GAAG,IAAI,CAAC;QACpB,gBAAW,GAAoB,MAAM,CAAC;QAI/C,WAAM,GAAuB,IAAI,CAAC;QAClC,sBAAiB,GAA0C,IAAI,CAAC;QAChE,uBAAkB,GAA2B,IAAI,CAAC;QAClD,iBAAY,GAAgB,IAAI,CAAC;QACjC,sBAAiB,GAAG,KAAK,CAAC;IA8oBpC,CAAC;IAnZC,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,UAAU,CAAC,iBAAuC;QAC1D,IAAI,iBAAiB,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YAC/E,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,iBAAuC;QAC7C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAE/B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;oBACjC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3B,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,kBAAkB,EAAE;;KAE9B,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,YAAY;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,IAAI,CAAC,cAAc,CAAC;QAC1B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEO,kBAAkB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC;QAE/C,OAAO,IAAI,CAAA;QACP,SAAS;YACT,CAAC,CAAC,IAAI,CAAA,iEAAiE,IAAI,CAAC,YAAY;;;;;oBAK5E;YACZ,CAAC,CAAC,EAAE;;gCAEoB,IAAI,CAAC,KAAK;QAClC,IAAI,CAAC,YAAY,KAAK,MAAM;YAC5B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAA;;;;;;;;;;qCAUuB,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;sBAC9D,IAAI,CAAC,UAAU;;;;uCAIE,IAAI,CAAC,YAAY,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;;;+CAGxE,uBAAuB;iDACrB,kBAAkB;kDACjB,kBAAkB;;;;WAIzD;;gCAEqB,IAAI,CAAC,aAAa,EAAE;UAC1C,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe;;;;UAIvF,IAAI,CAAC,YAAY,KAAK,MAAM;YAC5B,CAAC,CAAC,IAAI,CAAA;gBACA,IAAI,CAAC,WAAW,KAAK,QAAQ;gBAC7B,CAAC,CAAC,IAAI,CAAA,2EAA2E,CAAC,IAAI,CAAC,YAAY,WAAW,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY,WAAW;gBACtK,CAAC,CAAC,EAAE;aACP;YACH,CAAC,CAAC,EAAE;UACJ,IAAI,CAAC,YAAY,KAAK,SAAS;YAC/B,CAAC,CAAC,IAAI,CAAA;mFACmE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW;gBACxG,IAAI,CAAC,aAAa,EAAE,mBAAmB,KAAK,KAAK;gBACjD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,IAAI,CAAA,wEAAwE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,WAAW;aACnI;YACH,CAAC,CAAC,EAAE;UACJ,IAAI,CAAC,YAAY,KAAK,OAAO;YAC7B,CAAC,CAAC,IAAI,CAAA;mFACmE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU;aAC1G;YACH,CAAC,CAAC,EAAE;;KAET,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YACrF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,6BAA6B,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAE9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACtC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;SACxD,EAAE,IAAI,CAAC,CAAC;QACT,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACnD,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACrC,MAAM,YAAY,GAAG,MAAM,0BAA0B,CAAC;YACpD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;SAC7C,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,eAAe,CAAC,IAAI,IAAI,CAAC;QACzG,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAEnE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,MAAM,0BAA0B,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;gBACjE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,8BAA8B,CAAC;YAC1D,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,UAAU,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YAC7D,IAAI,EAAE;gBACJ,gBAAgB,EAAE,sFAAsF;gBACxG,kBAAkB,EAAE,uCAAuC;gBAC3D,sBAAsB,EAAE,6DAA6D;gBACrF,kBAAkB,EAAE,uCAAuC;aAC5D;YACD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;SACxD,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,yBAAyB,CAAC;QACjD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAgC;QACxD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;QAE9B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC;YACtC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,IAAU;QACxC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,aAAa,EAAE,OAAO,IAAI,wCAAwC,CAAC;QAC1F,IAAI,CAAC,YAAY,GAAG,aAAa;YAC/B,CAAC,CAAC,aAAa,CAAC,mBAAmB;gBACjC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,OAAO;YACX,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,mBAAmB;QACzB,KAAK,IAAI,CAAC,iBAAiB,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1D,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,kBAAkB,KAAK,cAAc,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3B,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,kBAAkB,CAAC,KAAc;QACvC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC9E,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,CAAC;IAEO,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,cAAc,CAAC,IAAU;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,IAAU;QACjC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,EAAE;YACrD,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;YAC3B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE;YACtD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,aAAa,CAAC,OAAe;QACnC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,eAAe,EAAE;YAClD,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;YAClC,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAU;QACvC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;;AA3oBM,qBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuPlB,AAvPY,CAuPX;AArR0B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAuB;AACY;IAA7D,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC;yDAAiD;AAClE;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gDAAkB;AACjB;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;8CAAgB;AACH;IAAvD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;oDAAsC;AACrC;IAAvD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;oDAAsC;AACtC;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;mDAAoC;AACpC;IAArD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;kDAAkC;AAEvF;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;yDACJ;AAExD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,6BAA6B,EAAE,CAAC;gEACtC;AAEf;IAAhB,KAAK,EAAE;oDAA6C;AACpC;IAAhB,KAAK,EAAE;oDAA2B;AAClB;IAAhB,KAAK,EAAE;uDAAuD;AAC9C;IAAhB,KAAK,EAAE;oDAAgD;AACvC;IAAhB,KAAK,EAAE;kDAAyB;AAChB;IAAhB,KAAK,EAAE;qDAAwD;AAC/C;IAAhB,KAAK,EAAE;oDAA6B;AACpB;IAAhB,KAAK,EAAE;mDAA+C;AAErB;IAAjC,KAAK,CAAC,iBAAiB,CAAC;4DAAiD;AAvB/D,cAAc;IAD1B,aAAa,CAAC,iBAAiB,CAAC;GACpB,cAAc,CA2qB1B"}
1
+ {"version":3,"file":"simface-capture.js","sourceRoot":"","sources":["../../src/components/simface-capture.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { FaceDetector, FilesetResolver } from '@mediapipe/tasks-vision';
2
2
  import { evaluateFaceQuality } from './face-quality.js';
3
+ import { computeSharpnessScore } from './sharpness.js';
3
4
  const WASM_CDN = 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/wasm';
4
5
  const MODEL_URL = 'https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite';
5
6
  // Minimum confidence to consider a face detected
@@ -40,13 +41,28 @@ export async function assessFaceQuality(imageElement) {
40
41
  height: imageElement.naturalHeight,
41
42
  });
42
43
  }
44
+ // Reusable offscreen canvas for sharpness computation (avoids allocation per frame)
45
+ let sharpnessCanvas = null;
43
46
  export async function assessFaceQualityForVideo(videoElement, timestamp) {
44
47
  const detector = await getVideoDetector();
45
48
  const result = detector.detectForVideo(videoElement, timestamp);
49
+ const detections = mapDetections(result.detections);
46
50
  return evaluateFaceQuality({
47
- detections: mapDetections(result.detections),
51
+ detections,
48
52
  width: videoElement.videoWidth,
49
53
  height: videoElement.videoHeight,
54
+ resolveSharpnessScore: detections.length === 1 && detections[0].boundingBox
55
+ ? () => {
56
+ const bbox = detections[0].boundingBox;
57
+ sharpnessCanvas ?? (sharpnessCanvas = document.createElement('canvas'));
58
+ return computeSharpnessScore(videoElement, {
59
+ x: bbox.originX,
60
+ y: bbox.originY,
61
+ width: bbox.width,
62
+ height: bbox.height,
63
+ }, sharpnessCanvas);
64
+ }
65
+ : undefined,
50
66
  });
51
67
  }
52
68
  function mapDetections(detections) {
@@ -1 +1 @@
1
- {"version":3,"file":"face-detection.js","sourceRoot":"","sources":["../../src/services/face-detection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"face-detection.js","sourceRoot":"","sources":["../../src/services/face-detection.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,10 @@ interface FaceQualityInput {
18
18
  width: number;
19
19
  height: number;
20
20
  detections: FaceDetectionSnapshot[];
21
+ /** Normalised sharpness score (0–1) for the face region. Omit when unavailable (e.g. image mode). */
22
+ sharpnessScore?: number;
23
+ /** Lazily compute sharpness only after framing and pose checks pass. */
24
+ resolveSharpnessScore?: () => number;
21
25
  }
22
26
  export declare function evaluateFaceQuality(input: FaceQualityInput): FaceQualityResult;
23
27
  export {};
@@ -1,20 +1,31 @@
1
+ import { MIN_SHARPNESS_SCORE } from './sharpness.js';
1
2
  const MIN_FACE_AREA_RATIO = 0.1;
2
3
  const MAX_FACE_AREA_RATIO = 0.42;
3
4
  const IDEAL_FACE_AREA_RATIO = 0.24;
4
5
  const CENTER_TOLERANCE_X = 0.14;
5
6
  const CENTER_TOLERANCE_Y = 0.18;
7
+ /** Yaw: max horizontal nose offset / interocular distance. */
6
8
  const MAX_NOSE_OFFSET_RATIO = 0.12;
9
+ /** Roll: max eye vertical difference / interocular distance. */
10
+ const MAX_EYE_TILT_RATIO = 0.2;
11
+ /** Pitch ceiling: live BlazeFace signal shows higher ratios when the chin is tucked / looking down. */
12
+ const MAX_PITCH_RATIO = 0.95;
13
+ /** Pitch floor: live BlazeFace signal shows lower ratios when the chin is raised / looking up. */
14
+ const MIN_PITCH_RATIO = 0.2;
15
+ /** Image-mode sharpness is unavailable, so do not penalise captures for a missing live-video metric. */
16
+ const DEFAULT_SHARPNESS_SCORE = 1;
7
17
  const KEYPOINT_RIGHT_EYE = 0;
8
18
  const KEYPOINT_LEFT_EYE = 1;
9
19
  const KEYPOINT_NOSE = 2;
10
20
  export function evaluateFaceQuality(input) {
11
- const { detections, width, height } = input;
21
+ const { detections, width, height, sharpnessScore, resolveSharpnessScore } = input;
12
22
  if (detections.length === 0) {
13
23
  return createQualityResult({
14
24
  hasFace: false,
15
25
  faceCount: 0,
16
26
  confidence: 0,
17
27
  captureScore: 0,
28
+ sharpnessScore: 0,
18
29
  isCentered: false,
19
30
  passesQualityChecks: false,
20
31
  feedback: 'no-face',
@@ -27,6 +38,7 @@ export function evaluateFaceQuality(input) {
27
38
  faceCount: detections.length,
28
39
  confidence: detections[0]?.confidence ?? 0,
29
40
  captureScore: 0,
41
+ sharpnessScore: 0,
30
42
  isCentered: false,
31
43
  passesQualityChecks: false,
32
44
  feedback: 'multiple-faces',
@@ -41,6 +53,7 @@ export function evaluateFaceQuality(input) {
41
53
  faceCount: 1,
42
54
  confidence: detection.confidence,
43
55
  captureScore: 0,
56
+ sharpnessScore: 0,
44
57
  isCentered: false,
45
58
  passesQualityChecks: false,
46
59
  feedback: 'face-unclear',
@@ -68,34 +81,50 @@ export function evaluateFaceQuality(input) {
68
81
  if (faceCenterY > 0.5 + CENTER_TOLERANCE_Y) {
69
82
  return createFrameAdjustmentResult(detection.confidence, 'move-up', 'Move your face slightly up.');
70
83
  }
71
- const turnFeedback = detectTurnFeedback(detection.keypoints);
72
- if (turnFeedback) {
73
- return createFrameAdjustmentResult(detection.confidence, turnFeedback.feedback, turnFeedback.message);
84
+ const poseFeedback = detectPoseFeedback(detection.keypoints);
85
+ if (poseFeedback) {
86
+ return createFrameAdjustmentResult(detection.confidence, poseFeedback.feedback, poseFeedback.message);
87
+ }
88
+ const resolvedSharpness = sharpnessScore ?? resolveSharpnessScore?.() ?? DEFAULT_SHARPNESS_SCORE;
89
+ if (resolvedSharpness < MIN_SHARPNESS_SCORE) {
90
+ return createQualityResult({
91
+ hasFace: true,
92
+ faceCount: 1,
93
+ confidence: detection.confidence,
94
+ captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio, resolvedSharpness),
95
+ sharpnessScore: resolvedSharpness,
96
+ isCentered: true,
97
+ passesQualityChecks: false,
98
+ feedback: 'too-blurry',
99
+ message: 'Hold still so the image is not blurry.',
100
+ });
74
101
  }
75
102
  return createQualityResult({
76
103
  hasFace: true,
77
104
  faceCount: 1,
78
105
  confidence: detection.confidence,
79
- captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio),
106
+ captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio, resolvedSharpness),
107
+ sharpnessScore: resolvedSharpness,
80
108
  isCentered: true,
81
109
  passesQualityChecks: true,
82
110
  feedback: 'good',
83
111
  message: 'Hold still. Capturing automatically...',
84
112
  });
85
113
  }
86
- function detectTurnFeedback(keypoints) {
114
+ function detectPoseFeedback(keypoints) {
87
115
  const rightEye = keypoints[KEYPOINT_RIGHT_EYE];
88
116
  const leftEye = keypoints[KEYPOINT_LEFT_EYE];
89
117
  const nose = keypoints[KEYPOINT_NOSE];
90
118
  if (!rightEye || !leftEye || !nose) {
91
119
  return null;
92
120
  }
93
- const eyeMidpointX = (rightEye.x + leftEye.x) / 2;
94
- const eyeDistance = Math.abs(leftEye.x - rightEye.x);
95
- if (eyeDistance === 0) {
121
+ const eyeDistanceX = Math.abs(leftEye.x - rightEye.x);
122
+ if (eyeDistanceX === 0) {
96
123
  return null;
97
124
  }
98
- const noseOffsetRatio = (nose.x - eyeMidpointX) / eyeDistance;
125
+ // Yaw: horizontal nose offset relative to eye midpoint
126
+ const eyeMidpointX = (rightEye.x + leftEye.x) / 2;
127
+ const noseOffsetRatio = (nose.x - eyeMidpointX) / eyeDistanceX;
99
128
  if (noseOffsetRatio <= -MAX_NOSE_OFFSET_RATIO) {
100
129
  return {
101
130
  feedback: 'turn-left',
@@ -108,6 +137,35 @@ function detectTurnFeedback(keypoints) {
108
137
  message: 'Turn slightly right so your face points at the camera.',
109
138
  };
110
139
  }
140
+ // Roll: head tilt detected via eye vertical difference
141
+ const eyeTiltRatio = (rightEye.y - leftEye.y) / eyeDistanceX;
142
+ if (eyeTiltRatio >= MAX_EYE_TILT_RATIO) {
143
+ return {
144
+ feedback: 'tilt-left',
145
+ message: 'Straighten your head — it is tilting to the right.',
146
+ };
147
+ }
148
+ if (eyeTiltRatio <= -MAX_EYE_TILT_RATIO) {
149
+ return {
150
+ feedback: 'tilt-right',
151
+ message: 'Straighten your head — it is tilting to the left.',
152
+ };
153
+ }
154
+ // Pitch: nose vertical offset relative to eye midpoint
155
+ const eyeMidpointY = (rightEye.y + leftEye.y) / 2;
156
+ const pitchRatio = (nose.y - eyeMidpointY) / eyeDistanceX;
157
+ if (pitchRatio >= MAX_PITCH_RATIO) {
158
+ return {
159
+ feedback: 'look-up',
160
+ message: 'Raise your chin slightly so your face points at the camera.',
161
+ };
162
+ }
163
+ if (pitchRatio <= MIN_PITCH_RATIO) {
164
+ return {
165
+ feedback: 'look-down',
166
+ message: 'Lower your chin slightly so your face points at the camera.',
167
+ };
168
+ }
111
169
  return null;
112
170
  }
113
171
  function createFrameAdjustmentResult(confidence, feedback, message) {
@@ -116,6 +174,7 @@ function createFrameAdjustmentResult(confidence, feedback, message) {
116
174
  faceCount: 1,
117
175
  confidence,
118
176
  captureScore: 0,
177
+ sharpnessScore: 0,
119
178
  isCentered: false,
120
179
  passesQualityChecks: false,
121
180
  feedback,
@@ -125,12 +184,12 @@ function createFrameAdjustmentResult(confidence, feedback, message) {
125
184
  function createQualityResult(result) {
126
185
  return result;
127
186
  }
128
- function calculateCaptureScore(confidence, faceCenterX, faceCenterY, faceAreaRatio) {
187
+ function calculateCaptureScore(confidence, faceCenterX, faceCenterY, faceAreaRatio, sharpnessScore) {
129
188
  const xPenalty = Math.abs(faceCenterX - 0.5) / CENTER_TOLERANCE_X;
130
189
  const yPenalty = Math.abs(faceCenterY - 0.5) / CENTER_TOLERANCE_Y;
131
190
  const centerScore = 1 - Math.min((xPenalty + yPenalty) / 2, 1);
132
191
  const maxAreaDistance = Math.max(Math.abs(IDEAL_FACE_AREA_RATIO - MIN_FACE_AREA_RATIO), Math.abs(MAX_FACE_AREA_RATIO - IDEAL_FACE_AREA_RATIO));
133
192
  const sizeScore = 1 - Math.min(Math.abs(faceAreaRatio - IDEAL_FACE_AREA_RATIO) / maxAreaDistance, 1);
134
- return Number((confidence * 0.55 + centerScore * 0.3 + sizeScore * 0.15).toFixed(4));
193
+ return Number((confidence * 0.40 + centerScore * 0.25 + sizeScore * 0.10 + sharpnessScore * 0.25).toFixed(4));
135
194
  }
136
195
  //# sourceMappingURL=face-quality.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"face-quality.js","sourceRoot":"","sources":["../../src/services/face-quality.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"face-quality.js","sourceRoot":"","sources":["../../src/services/face-quality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Image sharpness estimation via Laplacian variance.
3
+ *
4
+ * A sharp image has strong edges (high second-derivative response) and
5
+ * therefore a high variance in the Laplacian-filtered output. A blurry
6
+ * image has weak edges and low variance.
7
+ */
8
+ export interface SharpnessRegion {
9
+ x: number;
10
+ y: number;
11
+ width: number;
12
+ height: number;
13
+ }
14
+ /** Minimum sharpness score (0–1) below which a frame is considered too blurry. */
15
+ export declare const MIN_SHARPNESS_SCORE = 0.15;
16
+ /**
17
+ * Compute a normalised sharpness score (0–1) for the given video frame.
18
+ *
19
+ * The score is the Laplacian variance of the face region, clamped and
20
+ * mapped to [0, 1] using {@link REFERENCE_VARIANCE} as the ceiling.
21
+ *
22
+ * @param video The video element to sample from.
23
+ * @param region The face bounding box in pixel coordinates.
24
+ * @param canvas An optional reusable offscreen canvas (avoids allocation per call).
25
+ */
26
+ export declare function computeSharpnessScore(video: HTMLVideoElement, region: SharpnessRegion, canvas?: HTMLCanvasElement): number;
27
+ /**
28
+ * Compute the Laplacian variance of an ImageData buffer.
29
+ *
30
+ * 1. Convert RGBA → luminance using BT.601 luma weights.
31
+ * 2. Convolve with the 3×3 Laplacian kernel: [[0,1,0],[1,-4,1],[0,1,0]]
32
+ * 3. Return the variance of the filtered values.
33
+ *
34
+ * Exported for direct unit-testing with synthetic ImageData.
35
+ */
36
+ export declare function laplacianVariance(imageData: ImageData, grayBuffer?: Float32Array): number;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Image sharpness estimation via Laplacian variance.
3
+ *
4
+ * A sharp image has strong edges (high second-derivative response) and
5
+ * therefore a high variance in the Laplacian-filtered output. A blurry
6
+ * image has weak edges and low variance.
7
+ */
8
+ /**
9
+ * Reference Laplacian variance used to normalise the raw variance into a
10
+ * 0–1 score. Values at or above this are mapped to 1.0. This was tuned
11
+ * empirically against 640×480 webcam frames; it may need adjustment for
12
+ * significantly different resolutions.
13
+ */
14
+ const REFERENCE_VARIANCE = 800;
15
+ const GRAY_BUFFER_GROWTH_FACTOR = 1.5;
16
+ /** Minimum sharpness score (0–1) below which a frame is considered too blurry. */
17
+ export const MIN_SHARPNESS_SCORE = 0.15;
18
+ const grayBuffersByCanvas = new WeakMap();
19
+ /**
20
+ * Compute a normalised sharpness score (0–1) for the given video frame.
21
+ *
22
+ * The score is the Laplacian variance of the face region, clamped and
23
+ * mapped to [0, 1] using {@link REFERENCE_VARIANCE} as the ceiling.
24
+ *
25
+ * @param video The video element to sample from.
26
+ * @param region The face bounding box in pixel coordinates.
27
+ * @param canvas An optional reusable offscreen canvas (avoids allocation per call).
28
+ */
29
+ export function computeSharpnessScore(video, region, canvas) {
30
+ const target = canvas ?? document.createElement('canvas');
31
+ target.width = region.width;
32
+ target.height = region.height;
33
+ const ctx = target.getContext('2d');
34
+ if (!ctx)
35
+ return 0;
36
+ ctx.drawImage(video, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height);
37
+ const imageData = ctx.getImageData(0, 0, region.width, region.height);
38
+ const grayBuffer = canvas ? getReusableGrayBuffer(canvas, region.width * region.height) : undefined;
39
+ const variance = Math.max(laplacianVariance(imageData, grayBuffer), 0);
40
+ return Math.min(Math.max(variance / REFERENCE_VARIANCE, 0), 1);
41
+ }
42
+ /**
43
+ * Compute the Laplacian variance of an ImageData buffer.
44
+ *
45
+ * 1. Convert RGBA → luminance using BT.601 luma weights.
46
+ * 2. Convolve with the 3×3 Laplacian kernel: [[0,1,0],[1,-4,1],[0,1,0]]
47
+ * 3. Return the variance of the filtered values.
48
+ *
49
+ * Exported for direct unit-testing with synthetic ImageData.
50
+ */
51
+ export function laplacianVariance(imageData, grayBuffer) {
52
+ const { data, width, height } = imageData;
53
+ // --- Step 1: grayscale luminance ---
54
+ const pixelCount = width * height;
55
+ const gray = grayBuffer && grayBuffer.length >= pixelCount
56
+ ? grayBuffer
57
+ : new Float32Array(pixelCount);
58
+ for (let i = 0; i < pixelCount; i++) {
59
+ const offset = i * 4;
60
+ // ITU-R BT.601 luma weights
61
+ gray[i] = data[offset] * 0.299 + data[offset + 1] * 0.587 + data[offset + 2] * 0.114;
62
+ }
63
+ // --- Step 2: Laplacian convolution (skip 1-pixel border) ---
64
+ const innerPixels = (width - 2) * (height - 2);
65
+ if (innerPixels <= 0)
66
+ return 0;
67
+ let sum = 0;
68
+ let sumSq = 0;
69
+ for (let y = 1; y < height - 1; y++) {
70
+ for (let x = 1; x < width - 1; x++) {
71
+ const idx = y * width + x;
72
+ const lap = gray[idx - width] + // top
73
+ gray[idx - 1] + // left
74
+ -4 * gray[idx] + // center
75
+ gray[idx + 1] + // right
76
+ gray[idx + width]; // bottom
77
+ sum += lap;
78
+ sumSq += lap * lap;
79
+ }
80
+ }
81
+ // variance = E[X²] - E[X]²
82
+ const mean = sum / innerPixels;
83
+ return Math.max(sumSq / innerPixels - mean * mean, 0);
84
+ }
85
+ function getReusableGrayBuffer(canvas, pixelCount) {
86
+ const existing = grayBuffersByCanvas.get(canvas);
87
+ if (existing && existing.length >= pixelCount) {
88
+ return existing;
89
+ }
90
+ const nextSize = existing
91
+ ? Math.max(pixelCount, Math.ceil(existing.length * GRAY_BUFFER_GROWTH_FACTOR))
92
+ : pixelCount;
93
+ const next = new Float32Array(nextSize);
94
+ grayBuffersByCanvas.set(canvas, next);
95
+ return next;
96
+ }
97
+ //# sourceMappingURL=sharpness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharpness.js","sourceRoot":"","sources":["../../src/services/sharpness.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,10 @@ export declare class CameraAccessError extends Error {
6
6
  }
7
7
  export interface ReusableFrameCapture {
8
8
  captureBlob: (video: HTMLVideoElement) => Promise<Blob>;
9
+ /** Snapshot the current video frame to an internal working canvas. */
10
+ captureWorkingFrame: (video: HTMLVideoElement) => void;
11
+ /** Copy the working canvas to the best-frame canvas, replacing any previous best. */
12
+ promoteWorkingToBest: () => void;
9
13
  storeBestFrame: (video: HTMLVideoElement) => void;
10
14
  hasStoredBestFrame: () => boolean;
11
15
  storedBestFrameToBlob: () => Promise<Blob>;
@@ -78,6 +78,18 @@ export function createReusableFrameCapture() {
78
78
  drawFrame(video, workingCanvas);
79
79
  return canvasToBlob(workingCanvas);
80
80
  },
81
+ captureWorkingFrame(video) {
82
+ drawFrame(video, workingCanvas);
83
+ },
84
+ promoteWorkingToBest() {
85
+ if (!workingCanvas.width || !workingCanvas.height) {
86
+ throw new Error('No working frame to promote.');
87
+ }
88
+ bestFrameCanvas.width = workingCanvas.width;
89
+ bestFrameCanvas.height = workingCanvas.height;
90
+ getContext(bestFrameCanvas).drawImage(workingCanvas, 0, 0);
91
+ hasStoredBestFrame = true;
92
+ },
81
93
  storeBestFrame(video) {
82
94
  drawFrame(video, bestFrameCanvas);
83
95
  hasStoredBestFrame = true;