@smileid/web-components 2.0.1 → 10.0.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 (125) hide show
  1. package/dist/DocumentCaptureScreens-Dwl7UqVH.js +1534 -0
  2. package/dist/DocumentCaptureScreens-Dwl7UqVH.js.map +1 -0
  3. package/dist/EndUserConsent-C5hZdJzH.js +715 -0
  4. package/dist/EndUserConsent-C5hZdJzH.js.map +1 -0
  5. package/dist/Navigation-juBE4qOw.js +136 -0
  6. package/dist/Navigation-juBE4qOw.js.map +1 -0
  7. package/dist/PoweredBySmileId-CxbaihMu.js +33 -0
  8. package/dist/PoweredBySmileId-CxbaihMu.js.map +1 -0
  9. package/dist/SelfieCaptureScreens-CQc251hz.js +7618 -0
  10. package/dist/SelfieCaptureScreens-CQc251hz.js.map +1 -0
  11. package/dist/SignaturePad-C7MtmT8m.js +324 -0
  12. package/dist/SignaturePad-C7MtmT8m.js.map +1 -0
  13. package/dist/TotpConsent-CQU5jQi4.js +730 -0
  14. package/dist/TotpConsent-CQU5jQi4.js.map +1 -0
  15. package/dist/combobox.js +300 -0
  16. package/dist/combobox.js.map +1 -0
  17. package/dist/document.js +5 -0
  18. package/dist/document.js.map +1 -0
  19. package/dist/end-user-consent.js +5 -0
  20. package/dist/end-user-consent.js.map +1 -0
  21. package/dist/main.js +22 -0
  22. package/dist/main.js.map +1 -0
  23. package/dist/navigation.js +5 -0
  24. package/dist/navigation.js.map +1 -0
  25. package/dist/package-Oi2Yil3b.js +105 -0
  26. package/dist/package-Oi2Yil3b.js.map +1 -0
  27. package/dist/selfie.js +5 -0
  28. package/dist/selfie.js.map +1 -0
  29. package/dist/signature-pad.js +5 -0
  30. package/dist/signature-pad.js.map +1 -0
  31. package/dist/smart-camera-web.js +303 -0
  32. package/dist/smart-camera-web.js.map +1 -0
  33. package/dist/styles-BUWNxWeQ.js +406 -0
  34. package/dist/styles-BUWNxWeQ.js.map +1 -0
  35. package/dist/totp-consent.js +5 -0
  36. package/dist/totp-consent.js.map +1 -0
  37. package/dist/types/combobox.d.ts +21 -0
  38. package/dist/types/document.d.ts +21 -0
  39. package/dist/types/end-user-consent.d.ts +21 -0
  40. package/dist/types/main.d.ts +331 -0
  41. package/dist/types/navigation.d.ts +21 -0
  42. package/dist/types/selfie.d.ts +21 -0
  43. package/dist/types/signature-pad.d.ts +21 -0
  44. package/dist/types/smart-camera-web.d.ts +21 -0
  45. package/dist/types/totp-consent.d.ts +21 -0
  46. package/{src → lib}/components/README.md +14 -14
  47. package/{src → lib}/components/attribution/PoweredBySmileId.js +42 -42
  48. package/{src → lib}/components/camera-permission/CameraPermission.js +140 -140
  49. package/{src → lib}/components/camera-permission/CameraPermission.stories.js +27 -27
  50. package/{src → lib}/components/combobox/src/Combobox.js +589 -589
  51. package/{src → lib}/components/combobox/src/index.js +1 -1
  52. package/{src → lib}/components/document/src/DocumentCaptureScreens.js +409 -409
  53. package/{src → lib}/components/document/src/DocumentCaptureScreens.stories.js +57 -57
  54. package/{src → lib}/components/document/src/README.md +111 -111
  55. package/{src → lib}/components/document/src/document-capture/DocumentCapture.js +760 -760
  56. package/{src → lib}/components/document/src/document-capture/DocumentCapture.stories.js +78 -78
  57. package/{src → lib}/components/document/src/document-capture/README.md +90 -90
  58. package/{src → lib}/components/document/src/document-capture/index.js +3 -3
  59. package/{src → lib}/components/document/src/document-capture-instructions/DocumentCaptureInstructions.js +499 -499
  60. package/{src → lib}/components/document/src/document-capture-instructions/DocumentCaptureInstructions.stories.js +24 -24
  61. package/{src → lib}/components/document/src/document-capture-instructions/README.md +56 -56
  62. package/{src → lib}/components/document/src/document-capture-instructions/index.js +3 -3
  63. package/{src → lib}/components/document/src/document-capture-review/DocumentCaptureReview.js +362 -362
  64. package/{src → lib}/components/document/src/document-capture-review/DocumentCaptureReview.stories.js +24 -24
  65. package/{src → lib}/components/document/src/document-capture-review/README.md +79 -79
  66. package/{src → lib}/components/document/src/document-capture-review/index.js +3 -3
  67. package/{src → lib}/components/document/src/index.js +3 -3
  68. package/{src → lib}/components/end-user-consent/src/EndUserConsent.js +795 -795
  69. package/{src → lib}/components/end-user-consent/src/EndUserConsent.stories.js +29 -29
  70. package/{src → lib}/components/end-user-consent/src/index.js +4 -4
  71. package/{src → lib}/components/navigation/src/Navigation.js +171 -171
  72. package/{src → lib}/components/navigation/src/Navigation.stories.js +24 -24
  73. package/{src → lib}/components/navigation/src/index.js +3 -3
  74. package/{src → lib}/components/selfie/README.md +225 -225
  75. package/{src → lib}/components/selfie/src/SelfieCaptureScreens.js +433 -282
  76. package/{src → lib}/components/selfie/src/SelfieCaptureScreens.stories.js +29 -29
  77. package/{src → lib}/components/selfie/src/index.js +3 -5
  78. package/{src → lib}/components/selfie/src/selfie-capture/SelfieCapture.js +1041 -1010
  79. package/{src → lib}/components/selfie/src/selfie-capture/SelfieCapture.stories.js +36 -36
  80. package/{src → lib}/components/selfie/src/selfie-capture/index.js +3 -3
  81. package/{src → lib}/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.js +657 -648
  82. package/{src → lib}/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.stories.js +23 -23
  83. package/{src → lib}/components/selfie/src/selfie-capture-instructions/index.js +3 -3
  84. package/{src → lib}/components/selfie/src/selfie-capture-review/SelfieCaptureReview.js +340 -347
  85. package/{src → lib}/components/selfie/src/selfie-capture-review/SelfieCaptureReview.stories.js +24 -24
  86. package/{src → lib}/components/selfie/src/selfie-capture-review/index.js +3 -3
  87. package/lib/components/selfie/src/selfie-capture-wrapper/SelfieCaptureWrapper.tsx +227 -0
  88. package/lib/components/selfie/src/selfie-capture-wrapper/index.ts +1 -0
  89. package/lib/components/selfie/src/smartselfie-capture/OvalProgress.tsx +81 -0
  90. package/lib/components/selfie/src/smartselfie-capture/SmartSelfieCapture.tsx +224 -0
  91. package/lib/components/selfie/src/smartselfie-capture/components/AlertDisplay.tsx +34 -0
  92. package/lib/components/selfie/src/smartselfie-capture/components/CameraPreview.tsx +97 -0
  93. package/lib/components/selfie/src/smartselfie-capture/components/CaptureControls.tsx +74 -0
  94. package/lib/components/selfie/src/smartselfie-capture/components/index.ts +3 -0
  95. package/lib/components/selfie/src/smartselfie-capture/constants.ts +23 -0
  96. package/lib/components/selfie/src/smartselfie-capture/hooks/index.ts +2 -0
  97. package/lib/components/selfie/src/smartselfie-capture/hooks/useCamera.ts +94 -0
  98. package/lib/components/selfie/src/smartselfie-capture/hooks/useFaceCapture.ts +558 -0
  99. package/lib/components/selfie/src/smartselfie-capture/index.ts +1 -0
  100. package/lib/components/selfie/src/smartselfie-capture/utils/alertMessages.ts +12 -0
  101. package/lib/components/selfie/src/smartselfie-capture/utils/canvas.ts +105 -0
  102. package/lib/components/selfie/src/smartselfie-capture/utils/faceDetection.ts +129 -0
  103. package/lib/components/selfie/src/smartselfie-capture/utils/imageCapture.ts +64 -0
  104. package/lib/components/selfie/src/smartselfie-capture/utils/index.ts +4 -0
  105. package/lib/components/selfie/src/smartselfie-capture/utils/mediapipeManager.ts +60 -0
  106. package/{src → lib}/components/signature-pad/package-lock.json +3009 -3009
  107. package/{src → lib}/components/signature-pad/package.json +30 -30
  108. package/{src → lib}/components/signature-pad/src/SignaturePad.js +484 -484
  109. package/{src → lib}/components/signature-pad/src/SignaturePad.stories.js +32 -32
  110. package/{src → lib}/components/signature-pad/src/index.js +3 -3
  111. package/{src → lib}/components/smart-camera-web/src/README.md +206 -207
  112. package/{src → lib}/components/smart-camera-web/src/SmartCameraWeb.js +299 -299
  113. package/{src → lib}/components/smart-camera-web/src/SmartCameraWeb.stories.js +57 -57
  114. package/{src → lib}/components/totp-consent/src/TotpConsent.js +949 -949
  115. package/{src → lib}/components/totp-consent/src/index.js +4 -4
  116. package/{src → lib}/domain/camera/src/README.md +38 -38
  117. package/{src → lib}/domain/camera/src/SmartCamera.js +109 -109
  118. package/{src → lib}/domain/constants/src/Constants.js +27 -27
  119. package/{src → lib}/domain/file-upload/README.md +35 -35
  120. package/{src → lib}/domain/file-upload/src/SmartFileUpload.js +65 -65
  121. package/{src → lib}/styles/README.md +3 -3
  122. package/{src → lib}/styles/src/styles.js +359 -359
  123. package/{src → lib}/styles/src/typography.js +52 -52
  124. package/package.json +109 -58
  125. package/src/index.js +0 -5
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Calculate the size of a face relative to the video frame
3
+ */
4
+ export const calculateFaceSize = (landmarks: any): number => {
5
+ if (!landmarks || landmarks.length === 0) return 0;
6
+
7
+ const face = landmarks[0];
8
+
9
+ if (!face || face.length === 0) return 0;
10
+
11
+ // Get bounding box of face landmarks
12
+ let minX = 1;
13
+ let maxX = 0;
14
+ let minY = 1;
15
+ let maxY = 0;
16
+
17
+ face.forEach((landmark: any) => {
18
+ if (
19
+ landmark &&
20
+ typeof landmark.x === 'number' &&
21
+ typeof landmark.y === 'number'
22
+ ) {
23
+ minX = Math.min(minX, landmark.x);
24
+ maxX = Math.max(maxX, landmark.x);
25
+ minY = Math.min(minY, landmark.y);
26
+ maxY = Math.max(maxY, landmark.y);
27
+ }
28
+ });
29
+
30
+ // Calculate face size as percentage of video area
31
+ const faceWidth = maxX - minX;
32
+ const faceHeight = maxY - minY;
33
+ const faceSize = Math.max(faceWidth, faceHeight);
34
+
35
+ return faceSize;
36
+ };
37
+
38
+ /**
39
+ * Check if a face is positioned within the oval bounds
40
+ */
41
+ export const isFaceInBounds = (
42
+ landmarks: any,
43
+ videoAspectRatio: number,
44
+ ): boolean => {
45
+ if (!landmarks || landmarks.length === 0) return false;
46
+
47
+ const face = landmarks[0];
48
+
49
+ let minX = 1;
50
+ let maxX = 0;
51
+ let minY = 1;
52
+ let maxY = 0;
53
+ face.forEach((landmark: any) => {
54
+ minX = Math.min(minX, landmark.x);
55
+ maxX = Math.max(maxX, landmark.x);
56
+ minY = Math.min(minY, landmark.y);
57
+ maxY = Math.max(maxY, landmark.y);
58
+ });
59
+
60
+ const ovalCenterX = 0.5;
61
+ const ovalCenterY = 0.6;
62
+
63
+ const isLandscape = videoAspectRatio > 1;
64
+ let ovalWidth;
65
+ let ovalHeight;
66
+ if (isLandscape) {
67
+ ovalWidth = 0.4;
68
+ ovalHeight = 0.3;
69
+ } else {
70
+ ovalWidth = 0.35;
71
+ ovalHeight = 0.5;
72
+ }
73
+
74
+ const faceCenterX = (minX + maxX) / 2;
75
+ const faceCenterY = (minY + maxY) / 2;
76
+
77
+ const centerTolerance = 0.2;
78
+ const centerOvalWidth = ovalWidth * (1 + centerTolerance);
79
+ const centerOvalHeight = ovalHeight * (1 + centerTolerance);
80
+
81
+ const checkPointInCenterOval = (x: number, y: number) => {
82
+ const dx = (x - ovalCenterX) / centerOvalWidth;
83
+ const dy = (y - ovalCenterY) / centerOvalHeight;
84
+ return dx * dx + dy * dy <= 1;
85
+ };
86
+ const centerInBounds = checkPointInCenterOval(faceCenterX, faceCenterY);
87
+
88
+ const toleranceX = 0.2;
89
+ const toleranceY = 0.1;
90
+ const adjustedOvalWidth = ovalWidth * (1 + toleranceX);
91
+ const adjustedOvalHeight = ovalHeight * (1 + toleranceY);
92
+
93
+ const checkPointInExpandedOval = (x: number, y: number) => {
94
+ const dx = (x - ovalCenterX) / adjustedOvalWidth;
95
+ const dy = (y - ovalCenterY) / adjustedOvalHeight;
96
+ return dx * dx + dy * dy <= 1;
97
+ };
98
+
99
+ const topLeft = checkPointInExpandedOval(minX, minY);
100
+ const topRight = checkPointInExpandedOval(maxX, minY);
101
+ const bottomLeft = checkPointInExpandedOval(minX, maxY);
102
+ const bottomRight = checkPointInExpandedOval(maxX, maxY);
103
+
104
+ return centerInBounds && topLeft && topRight && bottomLeft && bottomRight;
105
+ };
106
+
107
+ /**
108
+ * Calculate mouth opening using face landmarks
109
+ */
110
+ export const calculateMouthOpening = (landmarks: any): number => {
111
+ if (!landmarks || landmarks.length === 0) return 0;
112
+
113
+ const face = landmarks[0];
114
+ if (!face || face.length === 0) return 0;
115
+
116
+ // MediaPipe face landmark indices for mouth
117
+ const upperLipCenter = face[13]; // Upper lip center
118
+ const lowerLipCenter = face[14]; // Lower lip center
119
+
120
+ if (!upperLipCenter || !lowerLipCenter) return 0;
121
+
122
+ const mouthHeight = Math.abs(lowerLipCenter.y - upperLipCenter.y);
123
+
124
+ const faceTop = Math.min(...face.map((p: any) => p.y));
125
+ const faceBottom = Math.max(...face.map((p: any) => p.y));
126
+ const faceHeight = faceBottom - faceTop;
127
+
128
+ return faceHeight > 0 ? mouthHeight / faceHeight : 0;
129
+ };
@@ -0,0 +1,64 @@
1
+ export const captureImageFromVideo = (
2
+ videoElement: HTMLVideoElement,
3
+ isReference: boolean = false,
4
+ ): string | null => {
5
+ const canvas = document.createElement('canvas');
6
+ const ctx = canvas.getContext('2d');
7
+ if (!ctx) return null;
8
+
9
+ const isPortrait = videoElement.videoHeight > videoElement.videoWidth;
10
+
11
+ if (isReference) {
12
+ if (isPortrait) {
13
+ canvas.width = 480;
14
+ canvas.height = Math.max(
15
+ 640,
16
+ (canvas.width * videoElement.videoHeight) / videoElement.videoWidth,
17
+ );
18
+ } else {
19
+ canvas.width = 640;
20
+ canvas.height = Math.max(
21
+ 480,
22
+ (canvas.width * videoElement.videoHeight) / videoElement.videoWidth,
23
+ );
24
+ }
25
+ } else if (isPortrait) {
26
+ canvas.width = 240;
27
+ canvas.height = Math.max(
28
+ 320,
29
+ (canvas.width * videoElement.videoHeight) / videoElement.videoWidth,
30
+ );
31
+ } else {
32
+ canvas.width = 320;
33
+ canvas.height = Math.max(
34
+ 240,
35
+ (canvas.width * videoElement.videoHeight) / videoElement.videoWidth,
36
+ );
37
+ }
38
+
39
+ // capture more of the user's head and avoid clipping
40
+ const zoomOutFactor = 1.3;
41
+ const sourceWidth = videoElement.videoWidth * zoomOutFactor;
42
+ const sourceHeight = videoElement.videoHeight * zoomOutFactor;
43
+
44
+ // center the zoomed out area
45
+ const offsetX = (sourceWidth - videoElement.videoWidth) / 2;
46
+ const offsetY = (sourceHeight - videoElement.videoHeight) / 2;
47
+
48
+ // vertical offset to shift up and capture full head
49
+ const verticalOffset = videoElement.videoHeight * 0.05;
50
+
51
+ ctx.drawImage(
52
+ videoElement,
53
+ -offsetX,
54
+ -offsetY - verticalOffset,
55
+ sourceWidth,
56
+ sourceHeight,
57
+ 0,
58
+ 0,
59
+ canvas.width,
60
+ canvas.height,
61
+ );
62
+
63
+ return canvas.toDataURL('image/jpeg');
64
+ };
@@ -0,0 +1,4 @@
1
+ export * from './faceDetection';
2
+ export * from './canvas';
3
+ export * from './imageCapture';
4
+ export * from './alertMessages';
@@ -0,0 +1,60 @@
1
+ import { FaceLandmarker, FilesetResolver } from '@mediapipe/tasks-vision';
2
+
3
+ declare global {
4
+ interface Window {
5
+ __smileIdentityMediapipe?: {
6
+ instance: FaceLandmarker | null;
7
+ loading: Promise<FaceLandmarker> | null;
8
+ loaded: boolean;
9
+ };
10
+ }
11
+ }
12
+
13
+ export const getMediapipeInstance = async (): Promise<FaceLandmarker> => {
14
+ if (!window.__smileIdentityMediapipe) {
15
+ window.__smileIdentityMediapipe = {
16
+ instance: null,
17
+ loading: null,
18
+ loaded: false,
19
+ };
20
+ }
21
+
22
+ const mediapipeGlobal = window.__smileIdentityMediapipe;
23
+
24
+ if (mediapipeGlobal.loaded && mediapipeGlobal.instance) {
25
+ return mediapipeGlobal.instance;
26
+ }
27
+
28
+ if (mediapipeGlobal.loading) {
29
+ return mediapipeGlobal.loading;
30
+ }
31
+
32
+ mediapipeGlobal.loading = (async () => {
33
+ try {
34
+ const vision = await FilesetResolver.forVisionTasks(
35
+ 'https://web-models.smileidentity.com/mediapipe-tasks-vision-wasm',
36
+ );
37
+
38
+ const faceLandmarker = await FaceLandmarker.createFromOptions(vision, {
39
+ baseOptions: {
40
+ modelAssetPath: `https://web-models.smileidentity.com/face_landmarker/face_landmarker.task`,
41
+ delegate: 'GPU',
42
+ },
43
+ outputFaceBlendshapes: true,
44
+ runningMode: 'VIDEO',
45
+ numFaces: 2,
46
+ });
47
+
48
+ mediapipeGlobal.instance = faceLandmarker;
49
+ mediapipeGlobal.loaded = true;
50
+ mediapipeGlobal.loading = null;
51
+
52
+ return faceLandmarker;
53
+ } catch (error) {
54
+ mediapipeGlobal.loading = null;
55
+ throw error;
56
+ }
57
+ })();
58
+
59
+ return mediapipeGlobal.loading;
60
+ };