facecog-liveness-showcase 0.0.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.
Files changed (229) hide show
  1. package/.browserslistrc +15 -0
  2. package/.dockerignore +48 -0
  3. package/.editorconfig +16 -0
  4. package/.eslintrc.json +47 -0
  5. package/.vercelignore +7 -0
  6. package/.vscode/extensions.json +5 -0
  7. package/.vscode/settings.json +3 -0
  8. package/DOCKER.md +221 -0
  9. package/Dockerfile +33 -0
  10. package/README.md +268 -0
  11. package/angular.json +156 -0
  12. package/capacitor.config.ts +9 -0
  13. package/docker-compose.dev.yml +20 -0
  14. package/docker-compose.yml +18 -0
  15. package/ionic.config.json +7 -0
  16. package/jest.config.js +38 -0
  17. package/nginx.conf +50 -0
  18. package/package.json +131 -0
  19. package/patches/ng-packagr+20.3.2.patch +60 -0
  20. package/projects/facecog-liveness-verification/README.md +295 -0
  21. package/projects/facecog-liveness-verification/ng-package.json +7 -0
  22. package/projects/facecog-liveness-verification/package.json +48 -0
  23. package/projects/facecog-liveness-verification/scripts/build-with-wrapper-copy.js +38 -0
  24. package/projects/facecog-liveness-verification/scripts/copy-wrapper-after-ngc.js +35 -0
  25. package/projects/facecog-liveness-verification/sources/FaceLivenessReactWrapper.tsx +320 -0
  26. package/projects/facecog-liveness-verification/src/lib/components/aws-face-liveness/FaceLivenessReactWrapper.generated.d.ts +28 -0
  27. package/projects/facecog-liveness-verification/src/lib/components/aws-face-liveness/FaceLivenessReactWrapper.generated.js +247 -0
  28. package/projects/facecog-liveness-verification/src/lib/components/aws-face-liveness/FaceLivenessReactWrapper.generated.js.map +1 -0
  29. package/projects/facecog-liveness-verification/src/lib/components/aws-face-liveness/FaceLivenessReactWrapper.js.map +1 -0
  30. package/projects/facecog-liveness-verification/src/lib/components/aws-face-liveness/FaceLivenessReactWrapper.ts +5 -0
  31. package/projects/facecog-liveness-verification/src/lib/components/aws-face-liveness/aws-face-liveness.component.ts +500 -0
  32. package/projects/facecog-liveness-verification/src/lib/components/camera-permission/camera-permission.component.html +41 -0
  33. package/projects/facecog-liveness-verification/src/lib/components/camera-permission/camera-permission.component.scss +234 -0
  34. package/projects/facecog-liveness-verification/src/lib/components/camera-permission/camera-permission.component.spec.ts +158 -0
  35. package/projects/facecog-liveness-verification/src/lib/components/camera-permission/camera-permission.component.ts +58 -0
  36. package/projects/facecog-liveness-verification/src/lib/components/camera-verification/camera-verification.component.html +34 -0
  37. package/projects/facecog-liveness-verification/src/lib/components/camera-verification/camera-verification.component.ts +210 -0
  38. package/projects/facecog-liveness-verification/src/lib/components/dialogs/save-custom-pose-dialog.component.ts +174 -0
  39. package/projects/facecog-liveness-verification/src/lib/components/facetec-scan/facetec-scan.component.html +45 -0
  40. package/projects/facecog-liveness-verification/src/lib/components/facetec-scan/facetec-scan.component.scss +87 -0
  41. package/projects/facecog-liveness-verification/src/lib/components/facetec-scan/facetec-scan.component.ts +182 -0
  42. package/projects/facecog-liveness-verification/src/lib/components/intro/intro.component.html +394 -0
  43. package/projects/facecog-liveness-verification/src/lib/components/intro/intro.component.scss +1567 -0
  44. package/projects/facecog-liveness-verification/src/lib/components/intro/intro.component.spec.ts +699 -0
  45. package/projects/facecog-liveness-verification/src/lib/components/intro/intro.component.ts +721 -0
  46. package/projects/facecog-liveness-verification/src/lib/components/live-preview/live-preview.component.html +120 -0
  47. package/projects/facecog-liveness-verification/src/lib/components/live-preview/live-preview.component.scss +611 -0
  48. package/projects/facecog-liveness-verification/src/lib/components/live-preview/live-preview.component.spec.ts +605 -0
  49. package/projects/facecog-liveness-verification/src/lib/components/live-preview/live-preview.component.ts +524 -0
  50. package/projects/facecog-liveness-verification/src/lib/components/liveness-flow/liveness-flow.component.html +73 -0
  51. package/projects/facecog-liveness-verification/src/lib/components/liveness-flow/liveness-flow.component.scss +19 -0
  52. package/projects/facecog-liveness-verification/src/lib/components/liveness-flow/liveness-flow.component.spec.ts +673 -0
  53. package/projects/facecog-liveness-verification/src/lib/components/liveness-flow/liveness-flow.component.ts +963 -0
  54. package/projects/facecog-liveness-verification/src/lib/components/liveness-verification/liveness-verification.component.html +38 -0
  55. package/projects/facecog-liveness-verification/src/lib/components/liveness-verification/liveness-verification.component.scss +10 -0
  56. package/projects/facecog-liveness-verification/src/lib/components/liveness-verification/liveness-verification.component.ts +233 -0
  57. package/projects/facecog-liveness-verification/src/lib/components/pose-selection/pose-selection.component.html +17 -0
  58. package/projects/facecog-liveness-verification/src/lib/components/pose-selection/pose-selection.component.spec.ts +35 -0
  59. package/projects/facecog-liveness-verification/src/lib/components/pose-selection/pose-selection.component.ts +33 -0
  60. package/projects/facecog-liveness-verification/src/lib/components/processing/processing.component.html +17 -0
  61. package/projects/facecog-liveness-verification/src/lib/components/processing/processing.component.scss +156 -0
  62. package/projects/facecog-liveness-verification/src/lib/components/processing/processing.component.spec.ts +46 -0
  63. package/projects/facecog-liveness-verification/src/lib/components/processing/processing.component.ts +18 -0
  64. package/projects/facecog-liveness-verification/src/lib/components/verification-result/verification-result.component.html +190 -0
  65. package/projects/facecog-liveness-verification/src/lib/components/verification-result/verification-result.component.scss +534 -0
  66. package/projects/facecog-liveness-verification/src/lib/components/verification-result/verification-result.component.spec.ts +286 -0
  67. package/projects/facecog-liveness-verification/src/lib/components/verification-result/verification-result.component.ts +155 -0
  68. package/projects/facecog-liveness-verification/src/lib/interfaces/analyze-response.interface.ts +16 -0
  69. package/projects/facecog-liveness-verification/src/lib/interfaces/aws-face-liveness.interface.ts +46 -0
  70. package/projects/facecog-liveness-verification/src/lib/interfaces/backend-adapter.interface.ts +21 -0
  71. package/projects/facecog-liveness-verification/src/lib/interfaces/backend-http-client.interface.ts +93 -0
  72. package/projects/facecog-liveness-verification/src/lib/interfaces/backend-response.interface.ts +9 -0
  73. package/projects/facecog-liveness-verification/src/lib/interfaces/camera-provider.interface.ts +107 -0
  74. package/projects/facecog-liveness-verification/src/lib/interfaces/category-info.interface.ts +9 -0
  75. package/projects/facecog-liveness-verification/src/lib/interfaces/custom-pose-data.interface.ts +14 -0
  76. package/projects/facecog-liveness-verification/src/lib/interfaces/custom-pose-repository.interface.ts +48 -0
  77. package/projects/facecog-liveness-verification/src/lib/interfaces/custom-pose-response.interface.ts +14 -0
  78. package/projects/facecog-liveness-verification/src/lib/interfaces/index.ts +52 -0
  79. package/projects/facecog-liveness-verification/src/lib/interfaces/liveness-action-result.interface.ts +13 -0
  80. package/projects/facecog-liveness-verification/src/lib/interfaces/liveness-config.interface.ts +17 -0
  81. package/projects/facecog-liveness-verification/src/lib/interfaces/liveness-metadata.interface.ts +17 -0
  82. package/projects/facecog-liveness-verification/src/lib/interfaces/liveness-result.interface.ts +24 -0
  83. package/projects/facecog-liveness-verification/src/lib/interfaces/liveness-verification-config.interface.ts +41 -0
  84. package/projects/facecog-liveness-verification/src/lib/interfaces/multi-backend-analyze-response.interface.ts +21 -0
  85. package/projects/facecog-liveness-verification/src/lib/interfaces/multi-backend-liveness-result.interface.ts +14 -0
  86. package/projects/facecog-liveness-verification/src/lib/interfaces/pose-definition.interface.ts +35 -0
  87. package/projects/facecog-liveness-verification/src/lib/interfaces/pose-keypoint.interface.ts +12 -0
  88. package/projects/facecog-liveness-verification/src/lib/interfaces/pose-match-result.interface.ts +9 -0
  89. package/projects/facecog-liveness-verification/src/lib/interfaces/pose-verify-response.interface.ts +8 -0
  90. package/projects/facecog-liveness-verification/src/lib/interfaces/scan-results.interface.ts +29 -0
  91. package/projects/facecog-liveness-verification/src/lib/interfaces/verification-plan.interface.ts +42 -0
  92. package/projects/facecog-liveness-verification/src/lib/interfaces/verification-progress-event.interface.ts +12 -0
  93. package/projects/facecog-liveness-verification/src/lib/interfaces/verification-session.interface.ts +72 -0
  94. package/projects/facecog-liveness-verification/src/lib/interfaces/verification-step-change-event.interface.ts +11 -0
  95. package/projects/facecog-liveness-verification/src/lib/interfaces/video-recording.interface.ts +9 -0
  96. package/projects/facecog-liveness-verification/src/lib/liveness-verification.module.ts +123 -0
  97. package/projects/facecog-liveness-verification/src/lib/models/constants/aws-face-liveness-component.token.ts +23 -0
  98. package/projects/facecog-liveness-verification/src/lib/models/constants/category-info.constant.ts +14 -0
  99. package/projects/facecog-liveness-verification/src/lib/models/constants/default-liveness-config.constant.ts +18 -0
  100. package/projects/facecog-liveness-verification/src/lib/models/constants/index.ts +5 -0
  101. package/projects/facecog-liveness-verification/src/lib/models/constants/liveness-verification-config.token.ts +16 -0
  102. package/projects/facecog-liveness-verification/src/lib/models/constants/pose-definitions.constant.ts +377 -0
  103. package/projects/facecog-liveness-verification/src/lib/models/index.ts +5 -0
  104. package/projects/facecog-liveness-verification/src/lib/models/utils/index.ts +2 -0
  105. package/projects/facecog-liveness-verification/src/lib/models/utils/pose.utils.spec.ts +76 -0
  106. package/projects/facecog-liveness-verification/src/lib/models/utils/pose.utils.ts +59 -0
  107. package/projects/facecog-liveness-verification/src/lib/services/aws-face-liveness.service.ts +49 -0
  108. package/projects/facecog-liveness-verification/src/lib/services/backend-http.service.spec.ts +111 -0
  109. package/projects/facecog-liveness-verification/src/lib/services/backend-http.service.ts +130 -0
  110. package/projects/facecog-liveness-verification/src/lib/services/backends/azure-backend.service.spec.ts +69 -0
  111. package/projects/facecog-liveness-verification/src/lib/services/backends/azure-backend.service.ts +72 -0
  112. package/projects/facecog-liveness-verification/src/lib/services/backends/facetec-backend.service.spec.ts +24 -0
  113. package/projects/facecog-liveness-verification/src/lib/services/backends/facetec-backend.service.ts +35 -0
  114. package/projects/facecog-liveness-verification/src/lib/services/backends/mock-backend.service.spec.ts +36 -0
  115. package/projects/facecog-liveness-verification/src/lib/services/backends/mock-backend.service.ts +39 -0
  116. package/projects/facecog-liveness-verification/src/lib/services/backends/openpose-backend.service.spec.ts +81 -0
  117. package/projects/facecog-liveness-verification/src/lib/services/backends/openpose-backend.service.ts +72 -0
  118. package/projects/facecog-liveness-verification/src/lib/services/backends/rekognition-analysis-backend.service.spec.ts +69 -0
  119. package/projects/facecog-liveness-verification/src/lib/services/backends/rekognition-analysis-backend.service.ts +83 -0
  120. package/projects/facecog-liveness-verification/src/lib/services/camera.service.spec.ts +200 -0
  121. package/projects/facecog-liveness-verification/src/lib/services/camera.service.ts +155 -0
  122. package/projects/facecog-liveness-verification/src/lib/services/custom-poses-api.service.ts +117 -0
  123. package/projects/facecog-liveness-verification/src/lib/services/index.ts +18 -0
  124. package/projects/facecog-liveness-verification/src/lib/services/liveness-backend.service.spec.ts +103 -0
  125. package/projects/facecog-liveness-verification/src/lib/services/liveness-backend.service.ts +61 -0
  126. package/projects/facecog-liveness-verification/src/lib/services/liveness-config.service.spec.ts +109 -0
  127. package/projects/facecog-liveness-verification/src/lib/services/liveness-config.service.ts +70 -0
  128. package/projects/facecog-liveness-verification/src/lib/services/liveness-orchestrator.service.spec.ts +144 -0
  129. package/projects/facecog-liveness-verification/src/lib/services/liveness-orchestrator.service.ts +162 -0
  130. package/projects/facecog-liveness-verification/src/lib/services/pose-detection/hand-gesture-detection.service.ts +315 -0
  131. package/projects/facecog-liveness-verification/src/lib/services/pose-detection/index.ts +5 -0
  132. package/projects/facecog-liveness-verification/src/lib/services/pose-detection/openpose.service.ts +287 -0
  133. package/projects/facecog-liveness-verification/src/lib/services/pose-detection/pose-comparison.service.ts +353 -0
  134. package/projects/facecog-liveness-verification/src/lib/services/pose-detection/pose-matching.service.ts +2370 -0
  135. package/projects/facecog-liveness-verification/src/lib/services/pose-detection/reference-pose.service.ts +271 -0
  136. package/projects/facecog-liveness-verification/src/lib/services/pose-selection.service.spec.ts +183 -0
  137. package/projects/facecog-liveness-verification/src/lib/services/pose-selection.service.ts +179 -0
  138. package/projects/facecog-liveness-verification/src/lib/services/verification-api.service.spec.ts +159 -0
  139. package/projects/facecog-liveness-verification/src/lib/services/verification-api.service.ts +151 -0
  140. package/projects/facecog-liveness-verification/src/lib/services/verification-plan.service.spec.ts +184 -0
  141. package/projects/facecog-liveness-verification/src/lib/services/verification-plan.service.ts +94 -0
  142. package/projects/facecog-liveness-verification/src/lib/services/video-recorder.service.spec.ts +52 -0
  143. package/projects/facecog-liveness-verification/src/lib/services/video-recorder.service.ts +117 -0
  144. package/projects/facecog-liveness-verification/src/lib/types/detection-strategy.type.ts +5 -0
  145. package/projects/facecog-liveness-verification/src/lib/types/index.ts +7 -0
  146. package/projects/facecog-liveness-verification/src/lib/types/liveness-action.type.ts +31 -0
  147. package/projects/facecog-liveness-verification/src/lib/types/liveness-backend.type.ts +5 -0
  148. package/projects/facecog-liveness-verification/src/lib/types/pose-category.type.ts +5 -0
  149. package/projects/facecog-liveness-verification/src/lib/types/pose-difficulty.type.ts +5 -0
  150. package/projects/facecog-liveness-verification/src/lib/types/verification-flow-step.type.ts +5 -0
  151. package/projects/facecog-liveness-verification/src/lib/types/verification-step-kind.type.ts +4 -0
  152. package/projects/facecog-liveness-verification/src/public-api.ts +150 -0
  153. package/projects/facecog-liveness-verification/tsconfig.lib.json +20 -0
  154. package/projects/facecog-liveness-verification/tsconfig.lib.prod.json +11 -0
  155. package/projects/facecog-liveness-verification/tsconfig.spec.json +13 -0
  156. package/projects/facecog-liveness-verification/tsconfig.wrapper.json +15 -0
  157. package/projects/facecog-liveness-verification-test/src/app/app-routing.module.ts +22 -0
  158. package/projects/facecog-liveness-verification-test/src/app/app.component.html +3 -0
  159. package/projects/facecog-liveness-verification-test/src/app/app.component.scss +0 -0
  160. package/projects/facecog-liveness-verification-test/src/app/app.component.ts +11 -0
  161. package/projects/facecog-liveness-verification-test/src/app/app.module.ts +27 -0
  162. package/projects/facecog-liveness-verification-test/src/app/home/home-routing.module.ts +16 -0
  163. package/projects/facecog-liveness-verification-test/src/app/home/home.module.ts +19 -0
  164. package/projects/facecog-liveness-verification-test/src/app/home/home.page.html +39 -0
  165. package/projects/facecog-liveness-verification-test/src/app/home/home.page.scss +97 -0
  166. package/projects/facecog-liveness-verification-test/src/app/home/home.page.spec.ts +24 -0
  167. package/projects/facecog-liveness-verification-test/src/app/home/home.page.ts +92 -0
  168. package/projects/facecog-liveness-verification-test/src/app/home/verification-modal.component.ts +106 -0
  169. package/projects/facecog-liveness-verification-test/src/assets/fonts/gilroy/Gilroy-Bold_0.ttf +0 -0
  170. package/projects/facecog-liveness-verification-test/src/assets/fonts/gilroy/Gilroy-Medium_0.ttf +0 -0
  171. package/projects/facecog-liveness-verification-test/src/assets/fonts/gilroy/Gilroy-Regular_0.ttf +0 -0
  172. package/projects/facecog-liveness-verification-test/src/assets/fonts/gilroy/Gilroy-SemiBold_0.ttf +0 -0
  173. package/projects/facecog-liveness-verification-test/src/assets/fonts/gilroy/Gilroy-Thin_0.ttf +0 -0
  174. package/projects/facecog-liveness-verification-test/src/assets/icon/favicon.png +0 -0
  175. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Five_Fingers_Left.jpg +0 -0
  176. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Left_Palm.jpg +0 -0
  177. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Ok_Sign_Right.jpg +0 -0
  178. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Peace_Sign_Left.jpg +0 -0
  179. package/projects/facecog-liveness-verification-test/src/assets/images/poses/README.md +77 -0
  180. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Right_Palm.jpg +0 -0
  181. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Speak_Phrase.jpg +0 -0
  182. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Three_Fingers_Right.jpg +0 -0
  183. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Thumbs_Up_Left.jpg +0 -0
  184. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Thumbs_Up_Right.jpg +0 -0
  185. package/projects/facecog-liveness-verification-test/src/assets/images/poses/Wave_Right.jpg +0 -0
  186. package/projects/facecog-liveness-verification-test/src/assets/images/poses/blink.jpeg +0 -0
  187. package/projects/facecog-liveness-verification-test/src/assets/images/poses/blink_twice.jpeg +0 -0
  188. package/projects/facecog-liveness-verification-test/src/assets/images/poses/center_face.png +0 -0
  189. package/projects/facecog-liveness-verification-test/src/assets/images/poses/clap.jpeg +0 -0
  190. package/projects/facecog-liveness-verification-test/src/assets/images/poses/cover_mouth.png +0 -0
  191. package/projects/facecog-liveness-verification-test/src/assets/images/poses/cover_right_eye.png +0 -0
  192. package/projects/facecog-liveness-verification-test/src/assets/images/poses/cross_arms.png +0 -0
  193. package/projects/facecog-liveness-verification-test/src/assets/images/poses/face_straight.png +0 -0
  194. package/projects/facecog-liveness-verification-test/src/assets/images/poses/follow_dot.png +0 -0
  195. package/projects/facecog-liveness-verification-test/src/assets/images/poses/look_down.png +0 -0
  196. package/projects/facecog-liveness-verification-test/src/assets/images/poses/look_up.png +0 -0
  197. package/projects/facecog-liveness-verification-test/src/assets/images/poses/move_closer.png +0 -0
  198. package/projects/facecog-liveness-verification-test/src/assets/images/poses/nod.png +0 -0
  199. package/projects/facecog-liveness-verification-test/src/assets/images/poses/open_mouth.png +0 -0
  200. package/projects/facecog-liveness-verification-test/src/assets/images/poses/raise_eyebrow.png +0 -0
  201. package/projects/facecog-liveness-verification-test/src/assets/images/poses/rotate_face.jpeg +0 -0
  202. package/projects/facecog-liveness-verification-test/src/assets/images/poses/shake_head.jpeg +0 -0
  203. package/projects/facecog-liveness-verification-test/src/assets/images/poses/smile.png +0 -0
  204. package/projects/facecog-liveness-verification-test/src/assets/images/poses/tilt_left.png +0 -0
  205. package/projects/facecog-liveness-verification-test/src/assets/images/poses/tilt_right.png +0 -0
  206. package/projects/facecog-liveness-verification-test/src/assets/images/poses/touch_chin_left.jpg +0 -0
  207. package/projects/facecog-liveness-verification-test/src/assets/images/poses/touch_left_cheek.jpeg +0 -0
  208. package/projects/facecog-liveness-verification-test/src/assets/images/poses/touch_nose_right.png +0 -0
  209. package/projects/facecog-liveness-verification-test/src/assets/images/poses/touch_right_cheek.jpeg +0 -0
  210. package/projects/facecog-liveness-verification-test/src/assets/images/poses/turn_left.png +0 -0
  211. package/projects/facecog-liveness-verification-test/src/assets/images/poses/turn_right.png +0 -0
  212. package/projects/facecog-liveness-verification-test/src/assets/images/poses/wink.jpeg +0 -0
  213. package/projects/facecog-liveness-verification-test/src/assets/images/reference-pose.jpg +0 -0
  214. package/projects/facecog-liveness-verification-test/src/assets/shapes.svg +1 -0
  215. package/projects/facecog-liveness-verification-test/src/environments/environment.prod.ts +4 -0
  216. package/projects/facecog-liveness-verification-test/src/environments/environment.ts +17 -0
  217. package/projects/facecog-liveness-verification-test/src/global.scss +288 -0
  218. package/projects/facecog-liveness-verification-test/src/index.html +31 -0
  219. package/projects/facecog-liveness-verification-test/src/main.ts +6 -0
  220. package/projects/facecog-liveness-verification-test/src/polyfills.ts +55 -0
  221. package/projects/facecog-liveness-verification-test/src/theme/nextsapien-theme.scss +174 -0
  222. package/projects/facecog-liveness-verification-test/src/theme/variables.scss +2 -0
  223. package/projects/facecog-liveness-verification-test/src/zone-flags.ts +6 -0
  224. package/projects/facecog-liveness-verification-test/tsconfig.app.json +15 -0
  225. package/projects/facecog-liveness-verification-test/tsconfig.spec.json +14 -0
  226. package/setup-jest.ts +118 -0
  227. package/tsconfig.json +41 -0
  228. package/tsconfig.spec.json +15 -0
  229. package/vercel.json +24 -0
@@ -0,0 +1,190 @@
1
+ <!-- Processing Step -->
2
+ <div *ngIf="isProcessing" class="step-processing">
3
+ <ion-card>
4
+ <ion-card-content class="processing-content">
5
+ <ion-spinner name="crescent"></ion-spinner>
6
+ <p>Processing verification...</p>
7
+ <ion-progress-bar [value]="processingProgress / 100"></ion-progress-bar>
8
+ </ion-card-content>
9
+ </ion-card>
10
+ </div>
11
+
12
+ <!-- Result Step -->
13
+ <div *ngIf="!isProcessing && result" class="result-container">
14
+ <div class="content-wrapper">
15
+ <div class="result-icon">
16
+ <ion-icon
17
+ [name]="result.success ? 'checkmark-circle' : 'close-circle'"
18
+ [color]="result.success ? 'success' : 'danger'">
19
+ </ion-icon>
20
+ </div>
21
+
22
+ <!-- Image only (no video in pose-specific mode) -->
23
+ <div class="media-container" *ngIf="!poseSpecificMode">
24
+ <div class="result-image" *ngIf="result.verifiedImage">
25
+ <h3>Captured Image</h3>
26
+ <img [src]="result.verifiedImage" alt="Verified image" />
27
+ </div>
28
+
29
+ <div class="result-video" *ngIf="videoUrl">
30
+ <h3>Recorded Video</h3>
31
+ <video [src]="videoUrl" controls playsinline class="video-player"></video>
32
+ <p class="video-info" *ngIf="videoSizeMB">
33
+ Size: {{ videoSizeMB.toFixed(2) }} MB
34
+ </p>
35
+ <p class="video-url" *ngIf="result.videoUrl">
36
+ <ion-text color="medium">
37
+ <small>S3 URL: {{ result.videoUrl }}</small>
38
+ </ion-text>
39
+ </p>
40
+ </div>
41
+ </div>
42
+
43
+ <!-- Pose-specific: just the photo -->
44
+ <div class="media-container pose-specific-media" *ngIf="poseSpecificMode && result.verifiedImage">
45
+ <div class="result-image">
46
+ <img [src]="result.verifiedImage" alt="Verified image" />
47
+ </div>
48
+ </div>
49
+
50
+ <!-- Countdown Banner -->
51
+ <div class="countdown-banner" *ngIf="countdownActive()" [class.success]="result.success" [class.failure]="!result.success">
52
+ <ion-icon [name]="result.success ? 'checkmark-circle-outline' : 'refresh-outline'"></ion-icon>
53
+ <span>{{ countdownMessage }}</span>
54
+ </div>
55
+
56
+ <!-- Detailed results only in non-pose-specific mode -->
57
+ <ng-container *ngIf="!poseSpecificMode">
58
+ <!-- Single Backend Result -->
59
+ <ion-text class="result-text" *ngIf="!isMultiBackend">
60
+ <h2 *ngIf="result.success">Verification Successful!</h2>
61
+ <h2 *ngIf="!result.success">Verification Failed</h2>
62
+
63
+ <p *ngIf="result.success">
64
+ Confidence: {{ confidencePercent }}%
65
+ </p>
66
+ <p *ngIf="result.success && singleBackendMetadata" class="metadata">
67
+ Backend: {{ singleBackendMetadata.backend }}<br>
68
+ Time: {{ singleBackendMetadata.timestamp | date: 'short' }}
69
+ </p>
70
+
71
+ <p *ngIf="!result.success">
72
+ {{ result.error || 'Please try again with better lighting and ensure your face is clearly visible.' }}
73
+ </p>
74
+ </ion-text>
75
+
76
+ <!-- Multi-Backend Results -->
77
+ <div class="multi-backend-results" *ngIf="isMultiBackend && multiBackendResult">
78
+ <h2 class="consensus-title">
79
+ <ion-icon
80
+ [name]="multiBackendResult.multiBackendResults.consensus.isLive ? 'checkmark-circle' : 'close-circle'"
81
+ [color]="multiBackendResult.multiBackendResults.consensus.isLive ? 'success' : 'danger'">
82
+ </ion-icon>
83
+ Consensus: {{ multiBackendResult.multiBackendResults.consensus.isLive ? 'Live' : 'Not Live' }}
84
+ </h2>
85
+
86
+ <ion-card class="consensus-card">
87
+ <ion-card-header>
88
+ <ion-card-title>
89
+ Voting Results
90
+ <ion-badge [color]="getAgreementBadgeColor(multiBackendResult.multiBackendResults.consensus.votingResults.agreement)">
91
+ {{ multiBackendResult.multiBackendResults.consensus.votingResults.agreement }}
92
+ </ion-badge>
93
+ </ion-card-title>
94
+ </ion-card-header>
95
+ <ion-card-content>
96
+ <p>
97
+ <strong>Consensus Confidence:</strong> {{ getBackendConfidencePercent(multiBackendResult.multiBackendResults.primary) }}%
98
+ </p>
99
+ <p>
100
+ <strong>Live Votes:</strong> {{ multiBackendResult.multiBackendResults.consensus.votingResults.liveVotes }} / 3<br>
101
+ <strong>Not Live Votes:</strong> {{ multiBackendResult.multiBackendResults.consensus.votingResults.notLiveVotes }} / 3
102
+ </p>
103
+ </ion-card-content>
104
+ </ion-card>
105
+
106
+ <h3 class="backends-title">Individual Backend Results</h3>
107
+
108
+ <div class="backend-cards-grid">
109
+ <ion-card class="backend-card" *ngIf="multiBackendResult.multiBackendResults.amazon">
110
+ <ion-card-header>
111
+ <div class="card-icon"><ion-icon name="logo-amazon"></ion-icon></div>
112
+ <ion-card-title>{{ getBackendName('amazon') }}</ion-card-title>
113
+ <ion-badge [color]="multiBackendResult.multiBackendResults.amazon.isLive ? 'success' : 'danger'">
114
+ {{ multiBackendResult.multiBackendResults.amazon.isLive ? 'Live' : 'Not Live' }}
115
+ </ion-badge>
116
+ </ion-card-header>
117
+ <ion-card-content>
118
+ <p *ngIf="!multiBackendResult.multiBackendResults.amazon.error" class="confidence-text">
119
+ <strong>{{ getBackendConfidencePercent(multiBackendResult.multiBackendResults.amazon) }}%</strong>
120
+ <span class="confidence-label">Confidence</span>
121
+ </p>
122
+ <p *ngIf="multiBackendResult.multiBackendResults.amazon.error" class="error-text">
123
+ {{ multiBackendResult.multiBackendResults.amazon.error }}
124
+ </p>
125
+ </ion-card-content>
126
+ </ion-card>
127
+
128
+ <ion-card class="backend-card" *ngIf="multiBackendResult.multiBackendResults.openpose">
129
+ <ion-card-header>
130
+ <div class="card-icon"><ion-icon name="body"></ion-icon></div>
131
+ <ion-card-title>{{ getBackendName('openpose') }}</ion-card-title>
132
+ <ion-badge [color]="multiBackendResult.multiBackendResults.openpose.isLive ? 'success' : 'danger'">
133
+ {{ multiBackendResult.multiBackendResults.openpose.isLive ? 'Live' : 'Not Live' }}
134
+ </ion-badge>
135
+ </ion-card-header>
136
+ <ion-card-content>
137
+ <p *ngIf="!multiBackendResult.multiBackendResults.openpose.error" class="confidence-text">
138
+ <strong>{{ getBackendConfidencePercent(multiBackendResult.multiBackendResults.openpose) }}%</strong>
139
+ <span class="confidence-label">Confidence</span>
140
+ </p>
141
+ <p *ngIf="multiBackendResult.multiBackendResults.openpose.error" class="error-text">
142
+ {{ multiBackendResult.multiBackendResults.openpose.error }}
143
+ </p>
144
+ </ion-card-content>
145
+ </ion-card>
146
+
147
+ <ion-card class="backend-card" *ngIf="multiBackendResult.multiBackendResults.facetec">
148
+ <ion-card-header>
149
+ <div class="card-icon"><ion-icon name="scan"></ion-icon></div>
150
+ <ion-card-title>{{ getBackendName('facetec') }}</ion-card-title>
151
+ <ion-badge [color]="multiBackendResult.multiBackendResults.facetec.isLive ? 'success' : 'danger'">
152
+ {{ multiBackendResult.multiBackendResults.facetec.isLive ? 'Live' : 'Not Live' }}
153
+ </ion-badge>
154
+ </ion-card-header>
155
+ <ion-card-content>
156
+ <p *ngIf="!multiBackendResult.multiBackendResults.facetec.error" class="confidence-text">
157
+ <strong>{{ getBackendConfidencePercent(multiBackendResult.multiBackendResults.facetec) }}%</strong>
158
+ <span class="confidence-label">Confidence</span>
159
+ </p>
160
+ <p *ngIf="multiBackendResult.multiBackendResults.facetec.error" class="error-text">
161
+ {{ multiBackendResult.multiBackendResults.facetec.error }}
162
+ </p>
163
+ </ion-card-content>
164
+ </ion-card>
165
+ </div>
166
+
167
+ <p class="metadata">
168
+ Time: {{ multiBackendResult.metadata.timestamp | date: 'short' }}
169
+ </p>
170
+ </div>
171
+ </ng-container>
172
+
173
+ <div class="button-container" *ngIf="!countdownActive()">
174
+ <ion-button
175
+ *ngIf="result.success"
176
+ expand="block"
177
+ (click)="onDone()">
178
+ Done
179
+ </ion-button>
180
+
181
+ <ion-button
182
+ *ngIf="!result.success"
183
+ expand="block"
184
+ fill="outline"
185
+ (click)="onRetry()">
186
+ Try Again
187
+ </ion-button>
188
+ </div>
189
+ </div>
190
+ </div>
@@ -0,0 +1,534 @@
1
+ :host {
2
+ display: flex;
3
+ flex-direction: column;
4
+ flex: 1;
5
+ min-height: 0;
6
+ overflow-y: auto;
7
+ padding: 16px;
8
+ -webkit-overflow-scrolling: touch;
9
+ }
10
+
11
+ .step-processing {
12
+ ion-card {
13
+ margin: 0;
14
+ }
15
+ }
16
+
17
+ .processing-content {
18
+ text-align: center;
19
+ padding: 32px;
20
+
21
+ ion-spinner {
22
+ margin-bottom: 16px;
23
+ width: 48px;
24
+ height: 48px;
25
+ }
26
+
27
+ p {
28
+ margin-bottom: 16px;
29
+ color: var(--ion-color-medium);
30
+ }
31
+ }
32
+
33
+ .result-container {
34
+ display: flex;
35
+ flex-direction: column;
36
+ align-items: center;
37
+ justify-content: center;
38
+ min-height: 100%;
39
+ padding: 24px;
40
+ background: var(--ion-background-color);
41
+ }
42
+
43
+ .content-wrapper {
44
+ display: flex;
45
+ flex-direction: column;
46
+ align-items: center;
47
+ width: 100%;
48
+ max-width: 960px;
49
+
50
+ @media (max-width: 767px) {
51
+ max-width: 480px;
52
+ }
53
+ }
54
+
55
+ .result-icon {
56
+ animation: scaleIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
57
+
58
+ ion-icon {
59
+ font-size: 90px;
60
+ margin: 0 0 20px;
61
+ filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15));
62
+ }
63
+ }
64
+
65
+ .media-container {
66
+ display: flex;
67
+ gap: 24px;
68
+ margin: 0 0 24px;
69
+ width: 100%;
70
+ max-width: 960px;
71
+ justify-content: center;
72
+ align-items: flex-start;
73
+ animation: fadeInUp 0.6s ease-out 0.2s backwards;
74
+
75
+ @media (max-width: 768px) {
76
+ flex-direction: column;
77
+ align-items: center;
78
+ }
79
+ }
80
+
81
+ .result-image {
82
+ flex: 1;
83
+ max-width: 340px;
84
+ display: flex;
85
+ flex-direction: column;
86
+ align-items: center;
87
+
88
+ h3 {
89
+ font-size: 16px;
90
+ font-weight: 600;
91
+ margin-bottom: 12px;
92
+ text-align: center;
93
+ color: var(--ion-text-color);
94
+ }
95
+
96
+ img {
97
+ width: 100%;
98
+ max-width: 280px;
99
+ height: auto;
100
+ aspect-ratio: 1;
101
+ object-fit: cover;
102
+ border-radius: 24px;
103
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15), 0 8px 16px rgba(0, 0, 0, 0.1);
104
+ }
105
+ }
106
+
107
+ .result-video {
108
+ flex: 1;
109
+ max-width: 480px;
110
+ display: flex;
111
+ flex-direction: column;
112
+ align-items: center;
113
+
114
+ h3 {
115
+ font-size: 16px;
116
+ font-weight: 600;
117
+ margin-bottom: 12px;
118
+ text-align: center;
119
+ color: var(--ion-text-color);
120
+ }
121
+
122
+ .video-player {
123
+ width: 100%;
124
+ max-width: 360px;
125
+ border-radius: 16px;
126
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
127
+ background: #000;
128
+ }
129
+
130
+ .video-info {
131
+ margin: 8px 0 4px;
132
+ text-align: center;
133
+ font-size: 14px;
134
+ color: var(--ion-color-medium);
135
+ }
136
+ }
137
+
138
+ .countdown-banner {
139
+ display: flex;
140
+ align-items: center;
141
+ justify-content: center;
142
+ gap: 10px;
143
+ width: 100%;
144
+ max-width: 480px;
145
+ padding: 14px 20px;
146
+ border-radius: 12px;
147
+ margin-bottom: 20px;
148
+ font-size: 16px;
149
+ font-weight: 600;
150
+ animation: fadeIn 0.4s ease-out;
151
+
152
+ ion-icon {
153
+ font-size: 22px;
154
+ flex-shrink: 0;
155
+ }
156
+
157
+ &.success {
158
+ background: rgba(var(--ion-color-success-rgb, 45, 211, 111), 0.12);
159
+ color: var(--ion-color-success, #2dd36f);
160
+ border: 1px solid rgba(var(--ion-color-success-rgb, 45, 211, 111), 0.3);
161
+ }
162
+
163
+ &.failure {
164
+ background: rgba(var(--ion-color-warning-rgb, 255, 196, 9), 0.12);
165
+ color: var(--ion-color-warning-shade, #e0ac08);
166
+ border: 1px solid rgba(var(--ion-color-warning-rgb, 255, 196, 9), 0.3);
167
+ }
168
+ }
169
+
170
+ .result-text {
171
+ text-align: center;
172
+ margin: 0 0 32px;
173
+ width: 100%;
174
+ animation: fadeIn 0.6s ease-out 0.4s backwards;
175
+
176
+ h2 {
177
+ margin-bottom: 20px;
178
+ font-size: 28px;
179
+ font-weight: 700;
180
+ letter-spacing: -0.5px;
181
+ }
182
+
183
+ p {
184
+ color: var(--ion-color-medium);
185
+ line-height: 1.7;
186
+ margin: 12px 0;
187
+ font-size: 16px;
188
+ font-weight: 400;
189
+
190
+ &:first-of-type {
191
+ font-size: 18px;
192
+ font-weight: 600;
193
+ color: var(--ion-text-color);
194
+ margin-bottom: 16px;
195
+ }
196
+ }
197
+
198
+ .metadata {
199
+ font-size: 14px;
200
+ opacity: 0.7;
201
+ margin-top: 20px;
202
+ padding-top: 16px;
203
+ border-top: 1px solid rgba(var(--ion-color-medium-rgb), 0.2);
204
+ line-height: 1.8;
205
+ }
206
+ }
207
+
208
+ .button-container {
209
+ width: 100%;
210
+ max-width: 320px;
211
+ display: flex;
212
+ flex-direction: column;
213
+ align-items: center;
214
+ gap: 16px;
215
+ animation: fadeInUp 0.6s ease-out 0.5s backwards;
216
+
217
+ ion-button {
218
+ width: 100%;
219
+ --border-radius: 12px;
220
+ height: 52px;
221
+ font-size: 16px;
222
+ font-weight: 600;
223
+ }
224
+ }
225
+
226
+ // Multi-backend results styling
227
+ .multi-backend-results {
228
+ width: 100%;
229
+ text-align: center;
230
+ animation: fadeIn 0.6s ease-out 0.4s backwards;
231
+
232
+ .consensus-title {
233
+ font-size: 24px;
234
+ font-weight: 700;
235
+ margin-bottom: 16px;
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: center;
239
+ gap: 12px;
240
+
241
+ ion-icon {
242
+ font-size: 32px;
243
+ }
244
+ }
245
+
246
+ .consensus-card {
247
+ margin-bottom: 24px;
248
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
249
+
250
+ ion-card-title {
251
+ display: flex;
252
+ align-items: center;
253
+ justify-content: space-between;
254
+ font-size: 18px;
255
+ }
256
+
257
+ ion-badge {
258
+ text-transform: uppercase;
259
+ font-weight: 600;
260
+ }
261
+
262
+ p {
263
+ margin: 8px 0;
264
+ color: var(--ion-color-medium);
265
+
266
+ strong {
267
+ color: var(--ion-text-color);
268
+ }
269
+ }
270
+ }
271
+
272
+ .backends-title {
273
+ font-size: 20px;
274
+ font-weight: 600;
275
+ margin: 32px 0 20px;
276
+ text-align: center;
277
+ }
278
+
279
+ .backend-cards-grid {
280
+ display: grid;
281
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
282
+ gap: 16px;
283
+ width: 100%;
284
+ margin-bottom: 16px;
285
+
286
+ @media (min-width: 768px) {
287
+ grid-template-columns: repeat(3, 1fr);
288
+ max-width: 900px;
289
+ margin: 0 auto 16px;
290
+ }
291
+
292
+ @media (max-width: 767px) {
293
+ grid-template-columns: 1fr;
294
+ }
295
+ }
296
+
297
+ .backend-card {
298
+ margin: 0;
299
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
300
+ border-radius: 16px;
301
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
302
+ overflow: hidden;
303
+
304
+ &:hover {
305
+ transform: translateY(-4px);
306
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
307
+ }
308
+
309
+ ion-card-header {
310
+ display: flex;
311
+ flex-direction: column;
312
+ align-items: center;
313
+ text-align: center;
314
+ padding: 20px 16px 12px;
315
+ background: linear-gradient(135deg, rgba(var(--ion-color-primary-rgb), 0.05) 0%, transparent 100%);
316
+
317
+ .card-icon {
318
+ width: 56px;
319
+ height: 56px;
320
+ border-radius: 50%;
321
+ display: flex;
322
+ align-items: center;
323
+ justify-content: center;
324
+ background: linear-gradient(135deg, var(--ion-color-primary) 0%, var(--ion-color-secondary) 100%);
325
+ margin-bottom: 12px;
326
+ box-shadow: 0 4px 12px rgba(var(--ion-color-primary-rgb), 0.3);
327
+
328
+ ion-icon {
329
+ font-size: 28px;
330
+ color: white;
331
+ }
332
+ }
333
+
334
+ ion-card-title {
335
+ font-size: 15px;
336
+ font-weight: 600;
337
+ margin-bottom: 8px;
338
+ color: var(--ion-text-color);
339
+ }
340
+
341
+ ion-badge {
342
+ font-size: 11px;
343
+ font-weight: 600;
344
+ padding: 4px 12px;
345
+ border-radius: 12px;
346
+ }
347
+ }
348
+
349
+ ion-card-content {
350
+ padding: 16px;
351
+ text-align: center;
352
+
353
+ .confidence-text {
354
+ margin: 0;
355
+ display: flex;
356
+ flex-direction: column;
357
+ align-items: center;
358
+ gap: 4px;
359
+
360
+ strong {
361
+ font-size: 32px;
362
+ font-weight: 700;
363
+ color: var(--ion-color-primary);
364
+ line-height: 1;
365
+ }
366
+
367
+ .confidence-label {
368
+ font-size: 13px;
369
+ color: var(--ion-color-medium);
370
+ text-transform: uppercase;
371
+ letter-spacing: 0.5px;
372
+ }
373
+ }
374
+
375
+ .error-text {
376
+ margin: 0;
377
+ font-size: 13px;
378
+ color: var(--ion-color-danger);
379
+ font-style: italic;
380
+ line-height: 1.5;
381
+ }
382
+ }
383
+ }
384
+
385
+ .metadata {
386
+ font-size: 14px;
387
+ opacity: 0.7;
388
+ margin-top: 20px;
389
+ padding-top: 16px;
390
+ border-top: 1px solid rgba(var(--ion-color-medium-rgb), 0.2);
391
+ }
392
+ }
393
+
394
+ @keyframes scaleIn {
395
+ 0% {
396
+ transform: scale(0);
397
+ opacity: 0;
398
+ }
399
+ 100% {
400
+ transform: scale(1);
401
+ opacity: 1;
402
+ }
403
+ }
404
+
405
+ @keyframes fadeIn {
406
+ 0% {
407
+ opacity: 0;
408
+ }
409
+ 100% {
410
+ opacity: 1;
411
+ }
412
+ }
413
+
414
+ @keyframes fadeInUp {
415
+ 0% {
416
+ opacity: 0;
417
+ transform: translateY(20px);
418
+ }
419
+ 100% {
420
+ opacity: 1;
421
+ transform: translateY(0);
422
+ }
423
+ }
424
+
425
+ @media (max-width: 768px) {
426
+ .result-icon ion-icon {
427
+ font-size: 90px;
428
+ }
429
+
430
+ .result-image {
431
+ width: 240px;
432
+ height: 240px;
433
+ }
434
+
435
+ .result-text {
436
+ h2 {
437
+ font-size: 24px;
438
+ }
439
+
440
+ p {
441
+ font-size: 15px;
442
+
443
+ &:first-of-type {
444
+ font-size: 17px;
445
+ }
446
+ }
447
+ }
448
+ }
449
+
450
+ @media (max-width: 480px) {
451
+ .result-container {
452
+ padding: 32px 20px 24px;
453
+ }
454
+
455
+ .result-icon ion-icon {
456
+ font-size: 80px;
457
+ margin: 20px 0;
458
+ }
459
+
460
+ .result-image {
461
+ width: 200px;
462
+ height: 200px;
463
+ margin: 16px 0 20px;
464
+ }
465
+
466
+ .result-text {
467
+ margin: 20px 0 24px;
468
+
469
+ h2 {
470
+ font-size: 22px;
471
+ }
472
+ }
473
+
474
+ .multi-backend-results {
475
+ .consensus-title {
476
+ font-size: 20px;
477
+
478
+ ion-icon {
479
+ font-size: 28px;
480
+ }
481
+ }
482
+
483
+ .backends-title {
484
+ font-size: 18px;
485
+ }
486
+
487
+ .backend-cards-grid {
488
+ grid-template-columns: 1fr;
489
+ gap: 12px;
490
+ }
491
+
492
+ .backend-card {
493
+ ion-card-header {
494
+ padding: 16px 12px 10px;
495
+
496
+ .card-icon {
497
+ width: 48px;
498
+ height: 48px;
499
+
500
+ ion-icon {
501
+ font-size: 24px;
502
+ }
503
+ }
504
+
505
+ ion-card-title {
506
+ font-size: 14px;
507
+ }
508
+
509
+ ion-badge {
510
+ font-size: 10px;
511
+ padding: 3px 10px;
512
+ }
513
+ }
514
+
515
+ ion-card-content {
516
+ padding: 12px;
517
+
518
+ .confidence-text {
519
+ strong {
520
+ font-size: 28px;
521
+ }
522
+
523
+ .confidence-label {
524
+ font-size: 12px;
525
+ }
526
+ }
527
+
528
+ .error-text {
529
+ font-size: 12px;
530
+ }
531
+ }
532
+ }
533
+ }
534
+ }