@smileid/usesmileid 12.0.0-beta01 → 12.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 (556) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +701 -89
  3. package/dist/camera/camera_defaults.d.ts +14 -9
  4. package/dist/camera/camera_defaults.d.ts.map +1 -1
  5. package/dist/camera/camera_defaults.js +11 -9
  6. package/dist/camera/camera_defaults.js.map +1 -1
  7. package/dist/camera/orientation_degrees.d.ts +5 -6
  8. package/dist/camera/orientation_degrees.d.ts.map +1 -1
  9. package/dist/camera/orientation_degrees.js +5 -6
  10. package/dist/camera/orientation_degrees.js.map +1 -1
  11. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts +11 -0
  12. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.d.ts.map +1 -0
  13. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js +17 -0
  14. package/dist/core/exception/agent_mode_with_enhanced_liveness_exception.js.map +1 -0
  15. package/dist/core/exception/capture_validation_exceptions.d.ts +1 -0
  16. package/dist/core/exception/capture_validation_exceptions.d.ts.map +1 -1
  17. package/dist/core/exception/capture_validation_exceptions.js +1 -0
  18. package/dist/core/exception/capture_validation_exceptions.js.map +1 -1
  19. package/dist/core/exception/index.d.ts +1 -0
  20. package/dist/core/exception/index.d.ts.map +1 -1
  21. package/dist/core/exception/index.js +1 -0
  22. package/dist/core/exception/index.js.map +1 -1
  23. package/dist/core/exception/use_smile_id_error_code.d.ts +1 -0
  24. package/dist/core/exception/use_smile_id_error_code.d.ts.map +1 -1
  25. package/dist/core/exception/use_smile_id_error_code.js +1 -0
  26. package/dist/core/exception/use_smile_id_error_code.js.map +1 -1
  27. package/dist/core/models/config.d.ts +19 -0
  28. package/dist/core/models/config.d.ts.map +1 -1
  29. package/dist/core/models/document_capture_mode.d.ts +8 -0
  30. package/dist/core/models/document_capture_mode.d.ts.map +1 -1
  31. package/dist/core/models/document_capture_mode.js +24 -0
  32. package/dist/core/models/document_capture_mode.js.map +1 -1
  33. package/dist/core/models/document_type.d.ts +2 -2
  34. package/dist/core/models/document_type.d.ts.map +1 -1
  35. package/dist/core/models/document_type.js +7 -5
  36. package/dist/core/models/document_type.js.map +1 -1
  37. package/dist/core/models/global_privacy_control.d.ts +36 -0
  38. package/dist/core/models/global_privacy_control.d.ts.map +1 -0
  39. package/dist/core/models/global_privacy_control.js +39 -0
  40. package/dist/core/models/global_privacy_control.js.map +1 -0
  41. package/dist/core/models/network_config.d.ts +2 -2
  42. package/dist/core/models/network_config.js +2 -2
  43. package/dist/core/models/result.d.ts +9 -8
  44. package/dist/core/models/result.d.ts.map +1 -1
  45. package/dist/core/models/result.js +5 -6
  46. package/dist/core/models/result.js.map +1 -1
  47. package/dist/data/api/interceptors/smile_auth_interceptor.d.ts.map +1 -1
  48. package/dist/data/api/interceptors/smile_auth_interceptor.js +3 -17
  49. package/dist/data/api/interceptors/smile_auth_interceptor.js.map +1 -1
  50. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts +11 -0
  51. package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts.map +1 -1
  52. package/dist/data/api/interceptors/smile_integrity_interceptor.js +13 -0
  53. package/dist/data/api/interceptors/smile_integrity_interceptor.js.map +1 -1
  54. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts +8 -0
  55. package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts.map +1 -1
  56. package/dist/data/api/interceptors/smile_request_mac_interceptor.js +11 -0
  57. package/dist/data/api/interceptors/smile_request_mac_interceptor.js.map +1 -1
  58. package/dist/data/api/smile_id_api.d.ts +1 -1
  59. package/dist/data/api/smile_id_api.d.ts.map +1 -1
  60. package/dist/data/compression/compressible_asset.d.ts +41 -0
  61. package/dist/data/compression/compressible_asset.d.ts.map +1 -0
  62. package/dist/data/compression/compressible_asset.js +34 -0
  63. package/dist/data/compression/compressible_asset.js.map +1 -0
  64. package/dist/data/compression/payload_compression_config.d.ts +36 -0
  65. package/dist/data/compression/payload_compression_config.d.ts.map +1 -0
  66. package/dist/data/compression/payload_compression_config.js +52 -0
  67. package/dist/data/compression/payload_compression_config.js.map +1 -0
  68. package/dist/data/compression/payload_compression_runner.d.ts +29 -0
  69. package/dist/data/compression/payload_compression_runner.d.ts.map +1 -0
  70. package/dist/data/compression/payload_compression_runner.js +55 -0
  71. package/dist/data/compression/payload_compression_runner.js.map +1 -0
  72. package/dist/data/compression/payload_compressor.d.ts +40 -0
  73. package/dist/data/compression/payload_compressor.d.ts.map +1 -0
  74. package/dist/data/compression/payload_compressor.js +126 -0
  75. package/dist/data/compression/payload_compressor.js.map +1 -0
  76. package/dist/data/compression/uri_compressible_asset.d.ts +23 -0
  77. package/dist/data/compression/uri_compressible_asset.d.ts.map +1 -0
  78. package/dist/data/compression/uri_compressible_asset.js +77 -0
  79. package/dist/data/compression/uri_compressible_asset.js.map +1 -0
  80. package/dist/data/dsl/builder/cache_config_builder.d.ts +2 -1
  81. package/dist/data/dsl/builder/cache_config_builder.d.ts.map +1 -1
  82. package/dist/data/dsl/builder/cache_config_builder.js +2 -1
  83. package/dist/data/dsl/builder/cache_config_builder.js.map +1 -1
  84. package/dist/data/dsl/builder/config_builder.d.ts +40 -14
  85. package/dist/data/dsl/builder/config_builder.d.ts.map +1 -1
  86. package/dist/data/dsl/builder/config_builder.js +40 -14
  87. package/dist/data/dsl/builder/config_builder.js.map +1 -1
  88. package/dist/data/dsl/builder/interceptor_config_builder.d.ts +9 -7
  89. package/dist/data/dsl/builder/interceptor_config_builder.d.ts.map +1 -1
  90. package/dist/data/dsl/builder/interceptor_config_builder.js +9 -7
  91. package/dist/data/dsl/builder/interceptor_config_builder.js.map +1 -1
  92. package/dist/data/dsl/builder/retry_config_builder.d.ts +19 -4
  93. package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
  94. package/dist/data/dsl/builder/retry_config_builder.js +21 -6
  95. package/dist/data/dsl/builder/retry_config_builder.js.map +1 -1
  96. package/dist/data/dsl/builder/timeout_config_builder.d.ts +4 -0
  97. package/dist/data/dsl/builder/timeout_config_builder.d.ts.map +1 -1
  98. package/dist/data/dsl/builder/timeout_config_builder.js +4 -0
  99. package/dist/data/dsl/builder/timeout_config_builder.js.map +1 -1
  100. package/dist/data/dsl/use_smile_id_network_builder.d.ts +17 -0
  101. package/dist/data/dsl/use_smile_id_network_builder.d.ts.map +1 -1
  102. package/dist/data/dsl/use_smile_id_network_builder.js +17 -0
  103. package/dist/data/dsl/use_smile_id_network_builder.js.map +1 -1
  104. package/dist/data/factory/networking_factory.d.ts.map +1 -1
  105. package/dist/data/factory/networking_factory.js +11 -1
  106. package/dist/data/factory/networking_factory.js.map +1 -1
  107. package/dist/data/repository/use_smile_id_repository_impl.d.ts +6 -0
  108. package/dist/data/repository/use_smile_id_repository_impl.d.ts.map +1 -1
  109. package/dist/data/repository/use_smile_id_repository_impl.js +82 -8
  110. package/dist/data/repository/use_smile_id_repository_impl.js.map +1 -1
  111. package/dist/data/security/request_canonicalizer.d.ts.map +1 -1
  112. package/dist/data/security/request_canonicalizer.js +14 -2
  113. package/dist/data/security/request_canonicalizer.js.map +1 -1
  114. package/dist/data/security/security_policy.d.ts +43 -0
  115. package/dist/data/security/security_policy.d.ts.map +1 -0
  116. package/dist/data/security/security_policy.js +61 -0
  117. package/dist/data/security/security_policy.js.map +1 -0
  118. package/dist/data/smile_id_urls.d.ts +1 -1
  119. package/dist/data/smile_id_urls.js +1 -1
  120. package/dist/data/smile_id_urls.js.map +1 -1
  121. package/dist/data/util/retry_util.d.ts +2 -2
  122. package/dist/data/util/retry_util.d.ts.map +1 -1
  123. package/dist/data/util/retry_util.js +7 -1
  124. package/dist/data/util/retry_util.js.map +1 -1
  125. package/dist/data/util/use_smile_id_token_decoder.d.ts +22 -0
  126. package/dist/data/util/use_smile_id_token_decoder.d.ts.map +1 -1
  127. package/dist/data/util/use_smile_id_token_decoder.js +58 -24
  128. package/dist/data/util/use_smile_id_token_decoder.js.map +1 -1
  129. package/dist/index.d.ts +2 -2
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +2 -2
  132. package/dist/index.js.map +1 -1
  133. package/dist/l10n/strings_en.d.ts +2 -1
  134. package/dist/l10n/strings_en.d.ts.map +1 -1
  135. package/dist/l10n/strings_en.js +2 -1
  136. package/dist/l10n/strings_en.js.map +1 -1
  137. package/dist/l10n/use_smile_id_localizations.d.ts +1 -0
  138. package/dist/l10n/use_smile_id_localizations.d.ts.map +1 -1
  139. package/dist/l10n/use_smile_id_localizations.js +3 -0
  140. package/dist/l10n/use_smile_id_localizations.js.map +1 -1
  141. package/dist/metadata/builder_configuration.d.ts +44 -0
  142. package/dist/metadata/builder_configuration.d.ts.map +1 -0
  143. package/dist/metadata/builder_configuration.js +35 -0
  144. package/dist/metadata/builder_configuration.js.map +1 -0
  145. package/dist/metadata/captured_image_properties.d.ts +11 -0
  146. package/dist/metadata/captured_image_properties.d.ts.map +1 -0
  147. package/dist/metadata/captured_image_properties.js +11 -0
  148. package/dist/metadata/captured_image_properties.js.map +1 -0
  149. package/dist/metadata/device_orientation_collector.d.ts +17 -0
  150. package/dist/metadata/device_orientation_collector.d.ts.map +1 -0
  151. package/dist/metadata/device_orientation_collector.js +66 -0
  152. package/dist/metadata/device_orientation_collector.js.map +1 -0
  153. package/dist/metadata/geolocation.d.ts +20 -0
  154. package/dist/metadata/geolocation.d.ts.map +1 -0
  155. package/dist/metadata/geolocation.js +40 -0
  156. package/dist/metadata/geolocation.js.map +1 -0
  157. package/dist/metadata/metadata_configuration_mappers.d.ts +47 -0
  158. package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -0
  159. package/dist/metadata/metadata_configuration_mappers.js +178 -0
  160. package/dist/metadata/metadata_configuration_mappers.js.map +1 -0
  161. package/dist/metadata/model_configuration.d.ts +41 -0
  162. package/dist/metadata/model_configuration.d.ts.map +1 -0
  163. package/dist/metadata/model_configuration.js +44 -0
  164. package/dist/metadata/model_configuration.js.map +1 -0
  165. package/dist/metadata/optional_native_modules.d.ts +79 -3
  166. package/dist/metadata/optional_native_modules.d.ts.map +1 -1
  167. package/dist/metadata/optional_native_modules.js +108 -3
  168. package/dist/metadata/optional_native_modules.js.map +1 -1
  169. package/dist/metadata/use_smile_id_metadata.d.ts +45 -7
  170. package/dist/metadata/use_smile_id_metadata.d.ts.map +1 -1
  171. package/dist/metadata/use_smile_id_metadata.js +85 -13
  172. package/dist/metadata/use_smile_id_metadata.js.map +1 -1
  173. package/dist/metadata/use_smile_id_metadata_factory.d.ts +37 -0
  174. package/dist/metadata/use_smile_id_metadata_factory.d.ts.map +1 -1
  175. package/dist/metadata/use_smile_id_metadata_factory.js +197 -16
  176. package/dist/metadata/use_smile_id_metadata_factory.js.map +1 -1
  177. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts +14 -0
  178. package/dist/presentation/assets/svg/document_shimmer_strings.d.ts.map +1 -0
  179. package/dist/presentation/assets/svg/document_shimmer_strings.js +14 -0
  180. package/dist/presentation/assets/svg/document_shimmer_strings.js.map +1 -0
  181. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts +12 -4
  182. package/dist/presentation/assets/svg/instruction_svg_strings.d.ts.map +1 -1
  183. package/dist/presentation/assets/svg/instruction_svg_strings.js +19 -8
  184. package/dist/presentation/assets/svg/instruction_svg_strings.js.map +1 -1
  185. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts +0 -5
  186. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts.map +1 -1
  187. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js +0 -5
  188. package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js.map +1 -1
  189. package/dist/presentation/components/icons/index.d.ts +24 -8
  190. package/dist/presentation/components/icons/index.d.ts.map +1 -1
  191. package/dist/presentation/components/icons/index.js +31 -11
  192. package/dist/presentation/components/icons/index.js.map +1 -1
  193. package/dist/presentation/components/use_smile_id_attribution.d.ts +1 -1
  194. package/dist/presentation/components/use_smile_id_button.d.ts +2 -2
  195. package/dist/presentation/components/use_smile_id_button.js +4 -4
  196. package/dist/presentation/components/use_smile_id_button.js.map +1 -1
  197. package/dist/presentation/components/use_smile_id_capture_content.d.ts +13 -0
  198. package/dist/presentation/components/use_smile_id_capture_content.d.ts.map +1 -1
  199. package/dist/presentation/components/use_smile_id_capture_content.js +15 -9
  200. package/dist/presentation/components/use_smile_id_capture_content.js.map +1 -1
  201. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts +2 -3
  202. package/dist/presentation/components/use_smile_id_captured_document_image.d.ts.map +1 -1
  203. package/dist/presentation/components/use_smile_id_captured_document_image.js +1 -3
  204. package/dist/presentation/components/use_smile_id_captured_document_image.js.map +1 -1
  205. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts +12 -6
  206. package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts.map +1 -1
  207. package/dist/presentation/components/use_smile_id_document_capture_controls.js +59 -16
  208. package/dist/presentation/components/use_smile_id_document_capture_controls.js.map +1 -1
  209. package/dist/presentation/components/use_smile_id_document_overlay.d.ts +22 -5
  210. package/dist/presentation/components/use_smile_id_document_overlay.d.ts.map +1 -1
  211. package/dist/presentation/components/use_smile_id_document_overlay.js +80 -40
  212. package/dist/presentation/components/use_smile_id_document_overlay.js.map +1 -1
  213. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts +15 -0
  214. package/dist/presentation/components/use_smile_id_document_shimmer.d.ts.map +1 -0
  215. package/dist/presentation/components/use_smile_id_document_shimmer.js +23 -0
  216. package/dist/presentation/components/use_smile_id_document_shimmer.js.map +1 -0
  217. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts +5 -2
  218. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts.map +1 -1
  219. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +9 -6
  220. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js.map +1 -1
  221. package/dist/presentation/components/use_smile_id_guideline_thumbnail.d.ts.map +1 -1
  222. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js +84 -1
  223. package/dist/presentation/components/use_smile_id_guideline_thumbnail.js.map +1 -1
  224. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts +3 -1
  225. package/dist/presentation/components/use_smile_id_instructions_hero.d.ts.map +1 -1
  226. package/dist/presentation/components/use_smile_id_instructions_hero.js +25 -5
  227. package/dist/presentation/components/use_smile_id_instructions_hero.js.map +1 -1
  228. package/dist/presentation/components/use_smile_id_oval_border_palette.d.ts.map +1 -1
  229. package/dist/presentation/components/use_smile_id_oval_border_palette.js +7 -3
  230. package/dist/presentation/components/use_smile_id_oval_border_palette.js.map +1 -1
  231. package/dist/presentation/flow/dsl/builder/config_builder.d.ts +28 -0
  232. package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
  233. package/dist/presentation/flow/dsl/builder/config_builder.js +30 -0
  234. package/dist/presentation/flow/dsl/builder/config_builder.js.map +1 -1
  235. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts +13 -4
  236. package/dist/presentation/flow/dsl/builder/ml_builder.d.ts.map +1 -1
  237. package/dist/presentation/flow/dsl/builder/ml_builder.js +3 -2
  238. package/dist/presentation/flow/dsl/builder/ml_builder.js.map +1 -1
  239. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts +110 -12
  240. package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
  241. package/dist/presentation/flow/dsl/builder/screens_builder.js +110 -12
  242. package/dist/presentation/flow/dsl/builder/screens_builder.js.map +1 -1
  243. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts +15 -2
  244. package/dist/presentation/flow/dsl/builder/theme_builder.d.ts.map +1 -1
  245. package/dist/presentation/flow/dsl/builder/theme_builder.js +15 -2
  246. package/dist/presentation/flow/dsl/builder/theme_builder.js.map +1 -1
  247. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts +6 -4
  248. package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts.map +1 -1
  249. package/dist/presentation/flow/dsl/use_smile_id_builder.js.map +1 -1
  250. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts +62 -36
  251. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts.map +1 -1
  252. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +62 -36
  253. package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js.map +1 -1
  254. package/dist/presentation/flow/flow_navigation_manager.d.ts +44 -5
  255. package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
  256. package/dist/presentation/flow/flow_navigation_manager.js +148 -11
  257. package/dist/presentation/flow/flow_navigation_manager.js.map +1 -1
  258. package/dist/presentation/flow/model/instruction_guideline.d.ts +9 -0
  259. package/dist/presentation/flow/model/instruction_guideline.d.ts.map +1 -1
  260. package/dist/presentation/flow/model/instructions_defaults.d.ts +11 -2
  261. package/dist/presentation/flow/model/instructions_defaults.d.ts.map +1 -1
  262. package/dist/presentation/flow/model/instructions_defaults.js +74 -26
  263. package/dist/presentation/flow/model/instructions_defaults.js.map +1 -1
  264. package/dist/presentation/flow/screen/orchestrated_capture_screen.d.ts.map +1 -1
  265. package/dist/presentation/flow/screen/orchestrated_capture_screen.js +48 -14
  266. package/dist/presentation/flow/screen/orchestrated_capture_screen.js.map +1 -1
  267. package/dist/presentation/flow/screen/orchestrated_consent_screen.d.ts.map +1 -1
  268. package/dist/presentation/flow/screen/orchestrated_consent_screen.js +3 -1
  269. package/dist/presentation/flow/screen/orchestrated_consent_screen.js.map +1 -1
  270. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js +1 -1
  271. package/dist/presentation/flow/screen/orchestrated_instructions_screen.js.map +1 -1
  272. package/dist/presentation/flow/screen/orchestrated_preview_screen.d.ts.map +1 -1
  273. package/dist/presentation/flow/screen/orchestrated_preview_screen.js +3 -9
  274. package/dist/presentation/flow/screen/orchestrated_preview_screen.js.map +1 -1
  275. package/dist/presentation/flow/screen/orchestrated_processing_screen.js +3 -3
  276. package/dist/presentation/flow/screen/orchestrated_processing_screen.js.map +1 -1
  277. package/dist/presentation/flow/use_smile_id_flow.d.ts.map +1 -1
  278. package/dist/presentation/flow/use_smile_id_flow.js +10 -4
  279. package/dist/presentation/flow/use_smile_id_flow.js.map +1 -1
  280. package/dist/presentation/flow/validation/flow_validator.d.ts.map +1 -1
  281. package/dist/presentation/flow/validation/flow_validator.js +42 -20
  282. package/dist/presentation/flow/validation/flow_validator.js.map +1 -1
  283. package/dist/presentation/flow/validation/job_type_validator.d.ts.map +1 -1
  284. package/dist/presentation/flow/validation/job_type_validator.js +14 -0
  285. package/dist/presentation/flow/validation/job_type_validator.js.map +1 -1
  286. package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts.map +1 -1
  287. package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -0
  288. package/dist/presentation/screen/helpers/capture_screen_helpers.js.map +1 -1
  289. package/dist/presentation/screen/helpers/capture_ui_state.d.ts +6 -6
  290. package/dist/presentation/screen/helpers/capture_ui_state.d.ts.map +1 -1
  291. package/dist/presentation/screen/helpers/capture_ui_state.js +19 -19
  292. package/dist/presentation/screen/helpers/capture_ui_state.js.map +1 -1
  293. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts +2 -2
  294. package/dist/presentation/screen/helpers/ess_turn_haptics.d.ts.map +1 -1
  295. package/dist/presentation/screen/helpers/ess_turn_haptics.js +6 -6
  296. package/dist/presentation/screen/helpers/ess_turn_haptics.js.map +1 -1
  297. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts +1 -0
  298. package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts.map +1 -1
  299. package/dist/presentation/screen/helpers/instructions_screen_helpers.js +6 -2
  300. package/dist/presentation/screen/helpers/instructions_screen_helpers.js.map +1 -1
  301. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts +5 -5
  302. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.d.ts.map +1 -1
  303. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js +14 -11
  304. package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
  305. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts +13 -3
  306. package/dist/presentation/screen/helpers/use_capture_orientation_lock.d.ts.map +1 -1
  307. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js +48 -6
  308. package/dist/presentation/screen/helpers/use_capture_orientation_lock.js.map +1 -1
  309. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +21 -3
  310. package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
  311. package/dist/presentation/screen/use_smile_id_capture_screen.js +188 -32
  312. package/dist/presentation/screen/use_smile_id_capture_screen.js.map +1 -1
  313. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts +7 -0
  314. package/dist/presentation/screen/use_smile_id_consent_screen.d.ts.map +1 -1
  315. package/dist/presentation/screen/use_smile_id_consent_screen.js +6 -5
  316. package/dist/presentation/screen/use_smile_id_consent_screen.js.map +1 -1
  317. package/dist/presentation/screen/use_smile_id_document_back_instructions.d.ts.map +1 -1
  318. package/dist/presentation/screen/use_smile_id_document_back_instructions.js +5 -13
  319. package/dist/presentation/screen/use_smile_id_document_back_instructions.js.map +1 -1
  320. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts +2 -3
  321. package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts.map +1 -1
  322. package/dist/presentation/screen/use_smile_id_document_preview_screen.js +17 -12
  323. package/dist/presentation/screen/use_smile_id_document_preview_screen.js.map +1 -1
  324. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts +2 -0
  325. package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts.map +1 -1
  326. package/dist/presentation/screen/use_smile_id_instructions_screen.js +2 -1
  327. package/dist/presentation/screen/use_smile_id_instructions_screen.js.map +1 -1
  328. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +7 -26
  329. package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
  330. package/dist/presentation/screen/use_smile_id_preview_screen.js +10 -20
  331. package/dist/presentation/screen/use_smile_id_preview_screen.js.map +1 -1
  332. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts +2 -3
  333. package/dist/presentation/screen/use_smile_id_processing_screen.d.ts.map +1 -1
  334. package/dist/presentation/screen/use_smile_id_processing_screen.js +4 -3
  335. package/dist/presentation/screen/use_smile_id_processing_screen.js.map +1 -1
  336. package/dist/presentation/theme/theme.d.ts +1 -1
  337. package/dist/presentation/theme/theme.d.ts.map +1 -1
  338. package/dist/presentation/theme/theme.js +20 -18
  339. package/dist/presentation/theme/theme.js.map +1 -1
  340. package/dist/presentation/utils/force_max_brightness.d.ts +4 -4
  341. package/dist/presentation/utils/locale_utils.d.ts +10 -4
  342. package/dist/presentation/utils/locale_utils.d.ts.map +1 -1
  343. package/dist/presentation/utils/locale_utils.js +13 -5
  344. package/dist/presentation/utils/locale_utils.js.map +1 -1
  345. package/dist/testing/fake_face_analyzer.d.ts +43 -0
  346. package/dist/testing/fake_face_analyzer.d.ts.map +1 -0
  347. package/dist/testing/fake_face_analyzer.js +52 -0
  348. package/dist/testing/fake_face_analyzer.js.map +1 -0
  349. package/dist/testing/index.d.ts +5 -0
  350. package/dist/testing/index.d.ts.map +1 -0
  351. package/dist/testing/index.js +7 -0
  352. package/dist/testing/index.js.map +1 -0
  353. package/dist/testing/scenario_expectations.d.ts +28 -0
  354. package/dist/testing/scenario_expectations.d.ts.map +1 -0
  355. package/dist/testing/scenario_expectations.js +65 -0
  356. package/dist/testing/scenario_expectations.js.map +1 -0
  357. package/dist/testing/scenario_loader.d.ts +11 -0
  358. package/dist/testing/scenario_loader.d.ts.map +1 -0
  359. package/dist/testing/scenario_loader.js +64 -0
  360. package/dist/testing/scenario_loader.js.map +1 -0
  361. package/dist/testing/scripted_scan_results.d.ts +17 -0
  362. package/dist/testing/scripted_scan_results.d.ts.map +1 -0
  363. package/dist/testing/scripted_scan_results.js +52 -0
  364. package/dist/testing/scripted_scan_results.js.map +1 -0
  365. package/package.json +34 -7
  366. package/src/__tests__/dsl.test.ts +51 -1
  367. package/src/__tests__/react_native_mock.tsx +8 -0
  368. package/src/__tests__/setup_react_native.ts +17 -2
  369. package/src/__tests__/snapshots/__snapshots__/screens_structural.test.tsx.snap +5261 -0
  370. package/src/__tests__/snapshots/screens_structural.test.tsx +230 -0
  371. package/src/camera/__tests__/use_smile_id_camera_system.test.ts +103 -0
  372. package/src/camera/camera_defaults.ts +11 -9
  373. package/src/camera/orientation_degrees.ts +5 -6
  374. package/src/core/exception/__tests__/builder_validation_exceptions.test.ts +67 -0
  375. package/src/core/exception/agent_mode_with_enhanced_liveness_exception.ts +20 -0
  376. package/src/core/exception/capture_validation_exceptions.ts +1 -0
  377. package/src/core/exception/index.ts +1 -0
  378. package/src/core/exception/use_smile_id_error_code.ts +1 -0
  379. package/src/core/models/__tests__/document_type.test.ts +7 -5
  380. package/src/core/models/__tests__/flow_models.test.ts +26 -0
  381. package/src/core/models/config.ts +22 -0
  382. package/src/core/models/document_capture_mode.ts +27 -0
  383. package/src/core/models/document_type.ts +7 -5
  384. package/src/core/models/global_privacy_control.ts +45 -0
  385. package/src/core/models/network_config.ts +2 -2
  386. package/src/core/models/result.ts +9 -8
  387. package/src/data/api/__tests__/smile_id_api.test.ts +1 -1
  388. package/src/data/api/interceptors/__tests__/gzip_interceptor.test.ts +83 -0
  389. package/src/data/api/interceptors/__tests__/smile_integrity_interceptor.test.ts +37 -1
  390. package/src/data/api/interceptors/__tests__/smile_request_mac_interceptor.test.ts +59 -1
  391. package/src/data/api/interceptors/smile_auth_interceptor.ts +3 -18
  392. package/src/data/api/interceptors/smile_integrity_interceptor.ts +20 -0
  393. package/src/data/api/interceptors/smile_request_mac_interceptor.ts +13 -0
  394. package/src/data/compression/__tests__/payload_compressor.test.ts +200 -0
  395. package/src/data/compression/__tests__/payload_compressor_real_jpeg.test.ts +226 -0
  396. package/src/data/compression/compressible_asset.ts +62 -0
  397. package/src/data/compression/payload_compression_config.ts +53 -0
  398. package/src/data/compression/payload_compression_runner.ts +102 -0
  399. package/src/data/compression/payload_compressor.ts +164 -0
  400. package/src/data/compression/uri_compressible_asset.ts +85 -0
  401. package/src/data/dsl/builder/__tests__/config_builders.test.ts +62 -0
  402. package/src/data/dsl/builder/cache_config_builder.ts +3 -1
  403. package/src/data/dsl/builder/config_builder.ts +45 -14
  404. package/src/data/dsl/builder/interceptor_config_builder.ts +9 -7
  405. package/src/data/dsl/builder/retry_config_builder.ts +27 -6
  406. package/src/data/dsl/builder/timeout_config_builder.ts +7 -0
  407. package/src/data/dsl/use_smile_id_network_builder.ts +17 -0
  408. package/src/data/factory/__tests__/retry_gzip_mac_composition.test.ts +163 -0
  409. package/src/data/factory/__tests__/signed_job_submission_headers.test.ts +1 -1
  410. package/src/data/factory/networking_factory.ts +14 -1
  411. package/src/data/repository/__tests__/network_retries.test.ts +117 -0
  412. package/src/data/repository/__tests__/use_smile_id_repository.test.ts +1 -1
  413. package/src/data/repository/use_smile_id_repository_impl.ts +96 -9
  414. package/src/data/security/__tests__/request_canonicalizer.test.ts +132 -0
  415. package/src/data/security/__tests__/security_policy.test.ts +96 -0
  416. package/src/data/security/__tests__/smile_id_crypto_manager.test.ts +18 -0
  417. package/src/data/security/request_canonicalizer.ts +15 -2
  418. package/src/data/security/security_policy.ts +70 -0
  419. package/src/data/smile_id_urls.ts +1 -1
  420. package/src/data/util/__tests__/retry_util.test.ts +25 -0
  421. package/src/data/util/__tests__/use_smile_id_token_decoder.test.ts +57 -1
  422. package/src/data/util/retry_util.ts +12 -3
  423. package/src/data/util/use_smile_id_token_decoder.ts +76 -28
  424. package/src/index.ts +6 -4
  425. package/src/l10n/strings_en.ts +2 -1
  426. package/src/l10n/use_smile_id_localizations.ts +3 -0
  427. package/src/metadata/__tests__/device_orientation_collector.test.ts +15 -0
  428. package/src/metadata/__tests__/metadata_configuration_mappers.test.ts +254 -0
  429. package/src/metadata/__tests__/metadata_configuration_objects.test.ts +86 -0
  430. package/src/metadata/__tests__/metadata_device_context.test.ts +147 -0
  431. package/src/metadata/__tests__/metadata_device_os_android.test.ts +18 -0
  432. package/src/metadata/__tests__/metadata_golden_fixture.json +13 -0
  433. package/src/metadata/__tests__/metadata_payload_golden.test.ts +193 -0
  434. package/src/metadata/__tests__/use_smile_id_metadata.test.ts +19 -25
  435. package/src/metadata/builder_configuration.ts +69 -0
  436. package/src/metadata/captured_image_properties.ts +10 -0
  437. package/src/metadata/device_orientation_collector.ts +75 -0
  438. package/src/metadata/geolocation.ts +46 -0
  439. package/src/metadata/metadata_configuration_mappers.ts +248 -0
  440. package/src/metadata/model_configuration.ts +68 -0
  441. package/src/metadata/optional_native_modules.ts +157 -3
  442. package/src/metadata/use_smile_id_metadata.ts +140 -17
  443. package/src/metadata/use_smile_id_metadata_factory.ts +211 -16
  444. package/src/presentation/assets/si_document_green_book_hero_animation.json +1 -4668
  445. package/src/presentation/assets/si_document_hero_animation.json +1 -4799
  446. package/src/presentation/assets/si_document_hero_back_animation.json +1 -2039
  447. package/src/presentation/assets/si_document_passport_hero_animation.json +1 -14491
  448. package/src/presentation/assets/si_ess_all_directions_hero_animation.json +1 -0
  449. package/src/presentation/assets/si_ess_animation_all_directions.json +1 -5575
  450. package/src/presentation/assets/si_selfie_hero_animation.json +1 -1439
  451. package/src/presentation/assets/si_smile_to_capture_animation.json +1 -1439
  452. package/src/presentation/assets/svg/document_shimmer_strings.ts +17 -0
  453. package/src/presentation/assets/svg/instruction_svg_strings.ts +34 -12
  454. package/src/presentation/components/__tests__/enhanced_smart_selfie_animation_frames.test.ts +1 -3
  455. package/src/presentation/components/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx +12 -8
  456. package/src/presentation/components/__tests__/use_smile_id_guideline_thumbnail.test.tsx +34 -1
  457. package/src/presentation/components/__tests__/use_smile_id_instructions_hero.test.tsx +71 -0
  458. package/src/presentation/components/__tests__/use_smile_id_oval_border_palette.test.ts +7 -5
  459. package/src/presentation/components/helpers/enhanced_smart_selfie_animation_frames.ts +0 -6
  460. package/src/presentation/components/icons/index.tsx +65 -18
  461. package/src/presentation/components/use_smile_id_attribution.tsx +1 -1
  462. package/src/presentation/components/use_smile_id_button.tsx +4 -4
  463. package/src/presentation/components/use_smile_id_capture_content.tsx +36 -12
  464. package/src/presentation/components/use_smile_id_captured_document_image.tsx +3 -8
  465. package/src/presentation/components/use_smile_id_document_capture_controls.tsx +103 -39
  466. package/src/presentation/components/use_smile_id_document_overlay.tsx +134 -44
  467. package/src/presentation/components/use_smile_id_document_shimmer.tsx +51 -0
  468. package/src/presentation/components/use_smile_id_enhanced_smart_selfie_clip.tsx +9 -6
  469. package/src/presentation/components/use_smile_id_guideline_thumbnail.tsx +131 -2
  470. package/src/presentation/components/use_smile_id_instructions_hero.tsx +111 -60
  471. package/src/presentation/components/use_smile_id_oval_border_palette.ts +7 -3
  472. package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +203 -4
  473. package/src/presentation/flow/__tests__/flow_navigation_manager.test.ts +49 -0
  474. package/src/presentation/flow/dsl/builder/__tests__/config_builder.test.ts +25 -0
  475. package/src/presentation/flow/dsl/builder/config_builder.ts +35 -0
  476. package/src/presentation/flow/dsl/builder/ml_builder.ts +13 -4
  477. package/src/presentation/flow/dsl/builder/screens_builder.ts +110 -12
  478. package/src/presentation/flow/dsl/builder/theme_builder.ts +19 -2
  479. package/src/presentation/flow/dsl/use_smile_id_builder.tsx +6 -4
  480. package/src/presentation/flow/dsl/use_smile_id_flow_builder.ts +62 -36
  481. package/src/presentation/flow/flow_navigation_manager.ts +185 -14
  482. package/src/presentation/flow/model/instruction_guideline.ts +6 -0
  483. package/src/presentation/flow/model/instructions_defaults.ts +104 -26
  484. package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +60 -12
  485. package/src/presentation/flow/screen/orchestrated_consent_screen.tsx +5 -0
  486. package/src/presentation/flow/screen/orchestrated_instructions_screen.tsx +1 -0
  487. package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +4 -14
  488. package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +3 -3
  489. package/src/presentation/flow/use_smile_id_flow.tsx +11 -4
  490. package/src/presentation/flow/validation/__tests__/flow_validator.test.ts +61 -1
  491. package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +64 -0
  492. package/src/presentation/flow/validation/flow_validator.ts +55 -26
  493. package/src/presentation/flow/validation/job_type_validator.ts +24 -0
  494. package/src/presentation/screen/__tests__/capture_ui_state.test.ts +66 -47
  495. package/src/presentation/screen/__tests__/ess_turn_haptics.test.ts +15 -11
  496. package/src/presentation/screen/__tests__/instructions_screen_helpers.test.ts +15 -3
  497. package/src/presentation/screen/__tests__/scan_state_to_overlay_state.test.ts +47 -27
  498. package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +182 -18
  499. package/src/presentation/screen/__tests__/use_smile_id_document_back_instructions.test.tsx +1 -1
  500. package/src/presentation/screen/__tests__/use_smile_id_preview_screen.test.tsx +10 -40
  501. package/src/presentation/screen/helpers/__tests__/use_capture_orientation_lock.test.tsx +212 -0
  502. package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
  503. package/src/presentation/screen/helpers/capture_ui_state.ts +27 -27
  504. package/src/presentation/screen/helpers/ess_turn_haptics.ts +9 -9
  505. package/src/presentation/screen/helpers/instructions_screen_helpers.ts +7 -2
  506. package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +16 -13
  507. package/src/presentation/screen/helpers/use_capture_orientation_lock.ts +69 -7
  508. package/src/presentation/screen/use_smile_id_capture_screen.tsx +280 -54
  509. package/src/presentation/screen/use_smile_id_consent_screen.tsx +16 -5
  510. package/src/presentation/screen/use_smile_id_document_back_instructions.tsx +14 -23
  511. package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +33 -23
  512. package/src/presentation/screen/use_smile_id_instructions_screen.tsx +4 -0
  513. package/src/presentation/screen/use_smile_id_preview_screen.tsx +21 -53
  514. package/src/presentation/screen/use_smile_id_processing_screen.tsx +8 -8
  515. package/src/presentation/theme/theme.ts +21 -19
  516. package/src/presentation/utils/__tests__/locale_utils.test.ts +46 -5
  517. package/src/presentation/utils/force_max_brightness.tsx +4 -4
  518. package/src/presentation/utils/locale_utils.ts +13 -4
  519. package/src/testing/__tests__/fake_face_analyzer.test.ts +42 -0
  520. package/src/testing/__tests__/scenario_expectations.test.ts +110 -0
  521. package/src/testing/__tests__/scenario_loader.test.ts +64 -0
  522. package/src/testing/fake_face_analyzer.ts +82 -0
  523. package/src/testing/index.ts +15 -0
  524. package/src/testing/scenario_expectations.ts +87 -0
  525. package/src/testing/scenario_loader.ts +83 -0
  526. package/src/testing/scripted_scan_results.ts +66 -0
  527. package/dist/camera/frame_processor_plugin.d.ts +0 -28
  528. package/dist/camera/frame_processor_plugin.d.ts.map +0 -1
  529. package/dist/camera/frame_processor_plugin.js +0 -21
  530. package/dist/camera/frame_processor_plugin.js.map +0 -1
  531. package/dist/camera/use_smile_id_frame_processor.d.ts +0 -38
  532. package/dist/camera/use_smile_id_frame_processor.d.ts.map +0 -1
  533. package/dist/camera/use_smile_id_frame_processor.js +0 -2
  534. package/dist/camera/use_smile_id_frame_processor.js.map +0 -1
  535. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts +0 -17
  536. package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts.map +0 -1
  537. package/dist/presentation/components/use_smile_id_document_frame_glyph.js +0 -17
  538. package/dist/presentation/components/use_smile_id_document_frame_glyph.js.map +0 -1
  539. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts +0 -24
  540. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts.map +0 -1
  541. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js +0 -91
  542. package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js.map +0 -1
  543. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts +0 -15
  544. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.d.ts.map +0 -1
  545. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js +0 -19
  546. package/dist/presentation/components/use_smile_id_face_silhouette_overlay.js.map +0 -1
  547. package/dist/presentation/components/use_smile_id_instruction_card.d.ts +0 -31
  548. package/dist/presentation/components/use_smile_id_instruction_card.d.ts.map +0 -1
  549. package/dist/presentation/components/use_smile_id_instruction_card.js +0 -43
  550. package/dist/presentation/components/use_smile_id_instruction_card.js.map +0 -1
  551. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts +0 -24
  552. package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts.map +0 -1
  553. package/dist/presentation/screen/helpers/use_document_orientation_lock.js +0 -47
  554. package/dist/presentation/screen/helpers/use_document_orientation_lock.js.map +0 -1
  555. package/src/presentation/components/use_smile_id_document_frame_glyph.tsx +0 -162
  556. package/src/presentation/components/use_smile_id_face_silhouette_overlay.tsx +0 -27
@@ -1,4 +1,5 @@
1
- import { StyleSheet, Text, View } from "react-native";
1
+ import { useState } from "react";
2
+ import { StyleSheet, Text, View, type LayoutChangeEvent } from "react-native";
2
3
  import type { UseSmileIDTheme } from "../theme/theme";
3
4
  import { useUseSmileIDTheme } from "../theme/theme_context";
4
5
  import { useUseSmileIDLocalizations } from "../../l10n/use_smile_id_localizations_provider";
@@ -17,6 +18,15 @@ const BADGE_ICON_SIZE = 14;
17
18
  // The badge overhangs the top-end corner of the card.
18
19
  const BADGE_OVERHANG = -10;
19
20
 
21
+ // Document card SVGs carry a transparent bleed around the visible card (3px
22
+ // L/R, 2px top, 4px bottom); the tile offsets the SVG by it so the card fills
23
+ // the framed box exactly.
24
+ const DOC_CARD_RADIUS = 4;
25
+ const DOC_BLEED_X = 3;
26
+ const DOC_BLEED_TOP = 2;
27
+ const DOC_BLEED_BOTTOM = 4;
28
+ const DOC_BADGE_OVERHANG = -8;
29
+
20
30
  export type UseSmileIDGuidelineThumbnailProps = {
21
31
  readonly guideline: InstructionGuideline;
22
32
  readonly theme?: UseSmileIDTheme;
@@ -33,12 +43,96 @@ export function UseSmileIDGuidelineThumbnail({
33
43
  const themeFromContext = useUseSmileIDTheme();
34
44
  const theme = themeProp ?? themeFromContext;
35
45
  const localizations = useUseSmileIDLocalizations();
46
+ // Measured card width — the card scales to its column, so the SVG size and
47
+ // bleed offset scale with it.
48
+ const [measuredCardWidth, setMeasuredCardWidth] = useState(0);
36
49
  const allowed = guideline.status === "allowed";
37
50
  const Illustration = guideline.image;
38
51
  const Badge = allowed ? SiFilledCheckCircle : SiFilledCloseCircle;
39
52
  const badgeLabel = allowed
40
53
  ? localizations.siCdGuidelineAllowed
41
54
  : localizations.siCdGuidelineBlocked;
55
+ const caption = guideline.label(localizations);
56
+
57
+ // Document tile: one of four equal columns (so all four fit one row); the
58
+ // self-contained card SVG fills the column, framed by a border + shadow with
59
+ // an overhanging badge (no pill).
60
+ if (guideline.card) {
61
+ const { width: figmaCardWidth, height: figmaCardHeight } = guideline.card;
62
+ const scale =
63
+ measuredCardWidth > 0 ? measuredCardWidth / figmaCardWidth : 0;
64
+ return (
65
+ <View style={styles.documentTile}>
66
+ {/* No `overflow: hidden` so the badge can overhang the card corner. */}
67
+ <View style={[styles.documentCardWrap, { maxWidth: figmaCardWidth }]}>
68
+ <View
69
+ style={[
70
+ styles.documentCard,
71
+ {
72
+ aspectRatio: figmaCardWidth / figmaCardHeight,
73
+ backgroundColor: theme.colors.cardBackground,
74
+ },
75
+ ]}
76
+ onLayout={(event: LayoutChangeEvent) => {
77
+ const width = event.nativeEvent.layout.width;
78
+ setMeasuredCardWidth((previous) =>
79
+ Math.abs(previous - width) < 0.5 ? previous : width,
80
+ );
81
+ }}
82
+ >
83
+ {scale > 0 ? (
84
+ <View
85
+ style={{
86
+ position: "absolute",
87
+ left: -DOC_BLEED_X * scale,
88
+ top: -DOC_BLEED_TOP * scale,
89
+ }}
90
+ >
91
+ <Illustration
92
+ width={(figmaCardWidth + DOC_BLEED_X * 2) * scale}
93
+ height={
94
+ (figmaCardHeight + DOC_BLEED_TOP + DOC_BLEED_BOTTOM) * scale
95
+ }
96
+ />
97
+ </View>
98
+ ) : null}
99
+ {/* Border drawn over the art so the SVG can't paint over it. */}
100
+ <View
101
+ pointerEvents="none"
102
+ style={[
103
+ styles.documentCardBorder,
104
+ { borderColor: theme.colors.stroke },
105
+ ]}
106
+ />
107
+ </View>
108
+ <View
109
+ style={[
110
+ styles.badge,
111
+ styles.documentBadge,
112
+ { backgroundColor: theme.colors.cardBackground },
113
+ ]}
114
+ accessibilityRole="image"
115
+ accessibilityLabel={badgeLabel}
116
+ >
117
+ <Badge size={BADGE_ICON_SIZE} />
118
+ </View>
119
+ </View>
120
+ <Text
121
+ numberOfLines={1}
122
+ style={{
123
+ ...theme.typography.cardCaption,
124
+ fontSize: 10,
125
+ lineHeight: 12,
126
+ color: theme.colors.cardText,
127
+ textAlign: "center",
128
+ marginTop: theme.spacing.extraSmall,
129
+ }}
130
+ >
131
+ {caption}
132
+ </Text>
133
+ </View>
134
+ );
135
+ }
42
136
 
43
137
  return (
44
138
  <View style={styles.container}>
@@ -86,7 +180,7 @@ export function UseSmileIDGuidelineThumbnail({
86
180
  marginTop: theme.spacing.extraSmall,
87
181
  }}
88
182
  >
89
- {guideline.label(localizations)}
183
+ {caption}
90
184
  </Text>
91
185
  </View>
92
186
  );
@@ -131,4 +225,39 @@ const styles = StyleSheet.create({
131
225
  shadowOffset: { width: 0, height: 1 },
132
226
  elevation: 1,
133
227
  },
228
+ // One of four equal columns so the document guidelines always fit one row.
229
+ documentTile: {
230
+ width: "25%",
231
+ alignItems: "center",
232
+ paddingHorizontal: 3,
233
+ },
234
+ // Capped at the artwork's natural width (inline maxWidth) so it never grows
235
+ // past its design size on wide screens.
236
+ documentCardWrap: {
237
+ width: "100%",
238
+ alignSelf: "center",
239
+ },
240
+ documentCard: {
241
+ width: "100%",
242
+ borderRadius: DOC_CARD_RADIUS,
243
+ // No `overflow: hidden` — would clip the SVG's bleed and the shadow.
244
+ shadowColor: "#000000",
245
+ shadowOpacity: 0.1,
246
+ shadowRadius: 3,
247
+ shadowOffset: { width: 0, height: 1 },
248
+ elevation: 1,
249
+ },
250
+ documentCardBorder: {
251
+ position: "absolute",
252
+ top: 0,
253
+ bottom: 0,
254
+ start: 0,
255
+ end: 0,
256
+ borderRadius: DOC_CARD_RADIUS,
257
+ borderWidth: 1,
258
+ },
259
+ documentBadge: {
260
+ top: DOC_BADGE_OVERHANG,
261
+ end: DOC_BADGE_OVERHANG,
262
+ },
134
263
  });
@@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from "react";
2
2
  import {
3
3
  Animated,
4
4
  Easing,
5
+ Platform,
5
6
  StyleSheet,
6
7
  View,
7
8
  type LayoutChangeEvent,
@@ -27,6 +28,9 @@ const DEFAULT_LOOP_MS = 2000;
27
28
  // the hero animation's playback speed, so a long hero composition can't slow
28
29
  // the fill down to a crawl.
29
30
  export const OVAL_PROGRESS_DURATION_MS = 5500;
31
+ // Document hero card: 4:3 frame, corner radius = 40/384 of its width.
32
+ const HERO_CARD_WIDTH_TO_HEIGHT = 384 / 288;
33
+ const HERO_CARD_CORNER_RATIO = 40 / 384;
30
34
 
31
35
  export type UseSmileIDInstructionsHeroProps = {
32
36
  /** Lottie animation rendered inside the (optional) face-oval ring. */
@@ -39,6 +43,8 @@ export type UseSmileIDInstructionsHeroProps = {
39
43
  * scheduled (Enhanced Smart Selfie has no single rising-progress gesture).
40
44
  */
41
45
  readonly showOvalProgress?: boolean;
46
+ /** Present the animation inside a cream rounded card instead of a face oval (document instructions). */
47
+ readonly showCardBackground?: boolean;
42
48
  readonly theme?: UseSmileIDTheme;
43
49
  };
44
50
 
@@ -67,6 +73,7 @@ export function UseSmileIDInstructionsHero({
67
73
  source,
68
74
  showOval = false,
69
75
  showOvalProgress = true,
76
+ showCardBackground = false,
70
77
  theme: themeProp,
71
78
  }: UseSmileIDInstructionsHeroProps) {
72
79
  const themeFromContext = useUseSmileIDTheme();
@@ -134,6 +141,13 @@ export function UseSmileIDInstructionsHero({
134
141
  const verticalOffset = animationSize * ANIMATION_VERTICAL_OFFSET_RATIO;
135
142
  const hasSize = ovalWidth > 0 && ovalHeight > 0;
136
143
 
144
+ const cardWidth = Math.min(
145
+ size.width,
146
+ size.height * HERO_CARD_WIDTH_TO_HEIGHT,
147
+ );
148
+ const cardHeight = cardWidth / HERO_CARD_WIDTH_TO_HEIGHT;
149
+ const cardRadius = cardWidth * HERO_CARD_CORNER_RATIO;
150
+
137
151
  const onLayout = (event: LayoutChangeEvent) => {
138
152
  const { width, height } = event.nativeEvent.layout;
139
153
  setSize((previous) =>
@@ -147,6 +161,13 @@ export function UseSmileIDInstructionsHero({
147
161
  // motion is reduced; otherwise let it play on its own clock (autoPlay+loop).
148
162
  const lottieDrivenByProgress = showOvalProgress || reducedMotion;
149
163
 
164
+ // lottie-ios's Core Animation engine mis-renders the document heroes' track mattes,
165
+ // so oval-less heroes use the main-thread engine on iOS; Android keeps its default.
166
+ const renderModeProps =
167
+ Platform.OS === "ios" && !showOval
168
+ ? ({ renderMode: "SOFTWARE" } as const)
169
+ : {};
170
+
150
171
  // Inset the ring by half the stroke so it isn't clipped at the SVG edge.
151
172
  const ellipseProps = {
152
173
  cx: ovalWidth / 2,
@@ -164,77 +185,107 @@ export function UseSmileIDInstructionsHero({
164
185
  testID="si_instructions_hero"
165
186
  >
166
187
  {hasSize ? (
167
- <>
168
- {showOval ? (
169
- <>
170
- <Svg
171
- width={ovalWidth}
172
- height={ovalHeight}
173
- style={{
174
- position: "absolute",
175
- left: (size.width - ovalWidth) / 2,
176
- top: (size.height - ovalHeight) / 2,
177
- }}
178
- >
179
- <Ellipse {...ellipseProps} stroke={theme.colors.ovalDefault} />
180
- </Svg>
181
- {/* Green fill revealed by a bottom-anchored view window —
182
- Android never re-resolves animated SVG clipPath contents,
183
- so the clip must happen at the View layer. */}
184
- {showOvalProgress ? (
185
- <View
186
- pointerEvents="none"
188
+ showCardBackground ? (
189
+ <View
190
+ style={{
191
+ position: "absolute",
192
+ left: (size.width - cardWidth) / 2,
193
+ top: (size.height - cardHeight) / 2,
194
+ width: cardWidth,
195
+ height: cardHeight,
196
+ borderRadius: cardRadius,
197
+ overflow: "hidden",
198
+ backgroundColor: theme.colors.instructionCardBackground,
199
+ }}
200
+ testID="si_instructions_hero_card"
201
+ >
202
+ <AnimatedLottieView
203
+ source={source}
204
+ autoPlay={!lottieDrivenByProgress}
205
+ loop={!lottieDrivenByProgress}
206
+ {...(lottieDrivenByProgress ? { progress: heroProgress } : {})}
207
+ {...renderModeProps}
208
+ resizeMode="contain"
209
+ style={{ width: cardWidth, height: cardHeight }}
210
+ />
211
+ </View>
212
+ ) : (
213
+ <>
214
+ {showOval ? (
215
+ <>
216
+ <Svg
217
+ width={ovalWidth}
218
+ height={ovalHeight}
187
219
  style={{
188
220
  position: "absolute",
189
221
  left: (size.width - ovalWidth) / 2,
190
222
  top: (size.height - ovalHeight) / 2,
191
- width: ovalWidth,
192
- height: ovalHeight,
193
223
  }}
194
224
  >
195
- <Animated.View
225
+ <Ellipse
226
+ {...ellipseProps}
227
+ stroke={theme.colors.ovalDefault}
228
+ />
229
+ </Svg>
230
+ {/* Green fill revealed by a bottom-anchored view window —
231
+ Android never re-resolves animated SVG clipPath contents,
232
+ so the clip must happen at the View layer. */}
233
+ {showOvalProgress ? (
234
+ <View
235
+ pointerEvents="none"
196
236
  style={{
197
237
  position: "absolute",
198
- left: 0,
199
- right: 0,
200
- bottom: 0,
201
- overflow: "hidden",
202
- height: ovalProgress.interpolate({
203
- inputRange: [0, 1],
204
- outputRange: [0, ovalHeight],
205
- }),
238
+ left: (size.width - ovalWidth) / 2,
239
+ top: (size.height - ovalHeight) / 2,
240
+ width: ovalWidth,
241
+ height: ovalHeight,
206
242
  }}
207
243
  >
208
- <Svg
209
- width={ovalWidth}
210
- height={ovalHeight}
211
- style={{ position: "absolute", left: 0, bottom: 0 }}
244
+ <Animated.View
245
+ style={{
246
+ position: "absolute",
247
+ left: 0,
248
+ right: 0,
249
+ bottom: 0,
250
+ overflow: "hidden",
251
+ height: ovalProgress.interpolate({
252
+ inputRange: [0, 1],
253
+ outputRange: [0, ovalHeight],
254
+ }),
255
+ }}
212
256
  >
213
- <Ellipse
214
- {...ellipseProps}
215
- stroke={theme.colors.ovalActive}
216
- />
217
- </Svg>
218
- </Animated.View>
219
- </View>
220
- ) : null}
221
- </>
222
- ) : null}
223
-
224
- <AnimatedLottieView
225
- source={source}
226
- autoPlay={!lottieDrivenByProgress}
227
- loop={!lottieDrivenByProgress}
228
- {...(lottieDrivenByProgress ? { progress: heroProgress } : {})}
229
- style={{
230
- position: "absolute",
231
- width: animationSize,
232
- height: animationSize,
233
- left: (size.width - animationSize) / 2,
234
- top: (size.height - animationSize) / 2 + verticalOffset,
235
- }}
236
- />
237
- </>
257
+ <Svg
258
+ width={ovalWidth}
259
+ height={ovalHeight}
260
+ style={{ position: "absolute", left: 0, bottom: 0 }}
261
+ >
262
+ <Ellipse
263
+ {...ellipseProps}
264
+ stroke={theme.colors.ovalActive}
265
+ />
266
+ </Svg>
267
+ </Animated.View>
268
+ </View>
269
+ ) : null}
270
+ </>
271
+ ) : null}
272
+
273
+ <AnimatedLottieView
274
+ source={source}
275
+ autoPlay={!lottieDrivenByProgress}
276
+ loop={!lottieDrivenByProgress}
277
+ {...(lottieDrivenByProgress ? { progress: heroProgress } : {})}
278
+ {...renderModeProps}
279
+ style={{
280
+ position: "absolute",
281
+ width: animationSize,
282
+ height: animationSize,
283
+ left: (size.width - animationSize) / 2,
284
+ top: (size.height - animationSize) / 2 + verticalOffset,
285
+ }}
286
+ />
287
+ </>
288
+ )
238
289
  ) : null}
239
290
  </View>
240
291
  );
@@ -48,13 +48,17 @@ export const UseSmileIDOvalBorderPalette = {
48
48
  case UseSmileIDOverlayState.MULTIPLE_FACES:
49
49
  return "ovalWarning";
50
50
 
51
- // Document states render via UseSmileIDDocumentOverlay, not here.
51
+ // Document states (UseSmileIDDocumentOverlay resolves its border through
52
+ // this same table): green once the document is correctly framed, red
53
+ // while it is detected but mispositioned (too far / close / off-centre /
54
+ // not steady).
55
+ case UseSmileIDOverlayState.DOCUMENT_READY:
56
+ return "ovalActive";
52
57
  case UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED:
53
58
  case UseSmileIDOverlayState.DOCUMENT_TOO_FAR:
54
59
  case UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE:
55
60
  case UseSmileIDOverlayState.DOCUMENT_HOLD_STILL:
56
- case UseSmileIDOverlayState.DOCUMENT_READY:
57
- return "ovalDefault";
61
+ return "ovalWarning";
58
62
  }
59
63
  },
60
64
  } as const;
@@ -3,6 +3,7 @@ import { DocumentSide } from "@smileid/usesmileid_bridge";
3
3
  import { FlowNavigationManager } from "../flow_navigation_manager";
4
4
  import {
5
5
  CaptureType,
6
+ type DocumentCaptureConfigBuilder,
6
7
  ScreensBuilder,
7
8
  type ScreensConfig,
8
9
  } from "../dsl/builder/screens_builder";
@@ -40,7 +41,7 @@ function twoSidedDocumentFlow(): ScreensConfig {
40
41
  screens.capture((capture) => {
41
42
  capture.captureType = CaptureType.document;
42
43
  capture.document((document) => {
43
- document.documentType = DocumentType.SouthAfricaGreenBook; // hasBackSide
44
+ document.documentType = DocumentType.GenericDocument(); // hasBackSide
44
45
  document.captureBothSides = true;
45
46
  document.allowSkipBack = true;
46
47
  });
@@ -73,15 +74,15 @@ describe("FlowNavigationManager — document per-side preview loop", () => {
73
74
  true,
74
75
  );
75
76
 
76
- const passportFlow = buildScreens((screens) => {
77
+ const greenBookFlow = buildScreens((screens) => {
77
78
  screens.capture((capture) => {
78
79
  capture.captureType = CaptureType.document;
79
80
  capture.document((document) => {
80
- document.documentType = DocumentType.Passport; // no back side
81
+ document.documentType = DocumentType.SouthAfricaGreenBook; // no back side
81
82
  });
82
83
  });
83
84
  });
84
- expect(makeManager(passportFlow).documentCapturesBack()).toBe(false);
85
+ expect(makeManager(greenBookFlow).documentCapturesBack()).toBe(false);
85
86
  });
86
87
 
87
88
  it("after the FRONT preview, routes back to the document capture for the BACK", () => {
@@ -136,6 +137,44 @@ describe("FlowNavigationManager — document per-side preview loop", () => {
136
137
  );
137
138
  });
138
139
 
140
+ it("with no document preview, still routes to the BACK capture after the front", () => {
141
+ // Regression: captureBothSides must capture the back even with no document
142
+ // preview { }, not jump straight to the selfie.
143
+ const noPreviewFlow = buildScreens((screens) => {
144
+ screens.instructions();
145
+ screens.capture((capture) => {
146
+ capture.captureType = CaptureType.document;
147
+ capture.document((document) => {
148
+ document.documentType = DocumentType.GenericDocument(); // hasBackSide
149
+ document.captureBothSides = true;
150
+ document.allowSkipBack = false;
151
+ });
152
+ });
153
+ screens.capture((capture) => {
154
+ capture.captureType = CaptureType.selfie;
155
+ });
156
+ screens.processing();
157
+ });
158
+ const manager = makeManager(noPreviewFlow);
159
+ manager.navigateToNext(); // instructions → document capture (front)
160
+ manager.setCapturedFrontDocument("file:///front.jpg");
161
+
162
+ // No preview follows → re-enter the document capture for the back side.
163
+ const next = manager.getNextScreen();
164
+ expect(next?.kind).toBe("capture");
165
+ expect(next?.kind === "capture" ? next.config.captureType : undefined).toBe(
166
+ CaptureType.document,
167
+ );
168
+
169
+ // After the back is captured, advance to the selfie.
170
+ manager.navigateToNext(); // → document capture (back)
171
+ manager.setCapturedBackDocument("file:///back.jpg");
172
+ const afterBack = manager.getNextScreen();
173
+ expect(
174
+ afterBack?.kind === "capture" ? afterBack.config.captureType : undefined,
175
+ ).toBe(CaptureType.selfie);
176
+ });
177
+
139
178
  it("retakeCurrentDocumentSide clears the back first, then the front", () => {
140
179
  const manager = makeManager(twoSidedDocumentFlow());
141
180
  manager.setCapturedFrontDocument("file:///front.jpg");
@@ -282,4 +321,164 @@ describe("FlowNavigationManager — document image origin metadata", () => {
282
321
  entries.some((entry) => entry.name === "DocumentBackImageOrigin"),
283
322
  ).toBe(false);
284
323
  });
324
+
325
+ it("stamps capture telemetry and image properties onto the submitted metadata", () => {
326
+ const repository = new StubRepository();
327
+ const manager = makeManager(
328
+ buildScreens((screens) => screens.processing()),
329
+ {
330
+ documentVerificationParams: { country: "NG" },
331
+ userDetails: SAMPLE_USER_DETAILS,
332
+ network: {
333
+ config: {
334
+ jobType: JobType.documentVerification,
335
+ token: "k",
336
+ partnerConfig: {
337
+ partnerId: "p",
338
+ callbackUrl: "",
339
+ useSandbox: true,
340
+ },
341
+ },
342
+ },
343
+ },
344
+ repository,
345
+ );
346
+ manager.setCapturedSelfie("file:///selfie.jpg", ["file:///l1.jpg"]);
347
+ manager.setCapturedFrontDocument("file:///front.jpg");
348
+ manager.recordSelfieCaptureTelemetry({
349
+ durationMs: 4200,
350
+ retries: 0,
351
+ cameraName: "com.apple.avfoundation:front",
352
+ devicePositions: ["1000,0.1,0.2,0.98", "1066,0.1,0.3,0.97"],
353
+ deviceMovementDetected: 0.35,
354
+ });
355
+ manager.recordDocumentCaptureTelemetry(DocumentSide.Front, {
356
+ durationMs: 5000,
357
+ retries: 1,
358
+ devicePositions: [],
359
+ deviceMovementDetected: null,
360
+ });
361
+ manager.setConsent(consentInfo);
362
+
363
+ manager.beginSubmissionIfNeeded();
364
+
365
+ const entries = repository.received[0]!.metadata.toEntries();
366
+ // Selfie: duration + retries (0 kept) + image color depth / pixel config.
367
+ expect(entries).toContainEqual({
368
+ name: "selfie_capture_duration_ms",
369
+ value: "4200",
370
+ });
371
+ expect(entries).toContainEqual({
372
+ name: "selfie_capture_retries",
373
+ value: "0",
374
+ });
375
+ expect(entries).toContainEqual({
376
+ name: "selfie_image_color_depth",
377
+ value: "24",
378
+ });
379
+ expect(entries).toContainEqual({
380
+ name: "selfie_image_pixel_config",
381
+ value: "RGB_888",
382
+ });
383
+ // Document front: telemetry + image color depth / pixel config. (Original/final compressed
384
+ // sizes are stamped in the repository around the compression pass, not by the flow manager.)
385
+ expect(entries).toContainEqual({
386
+ name: "document_front_capture_duration_ms",
387
+ value: "5000",
388
+ });
389
+ expect(entries).toContainEqual({
390
+ name: "document_front_capture_retries",
391
+ value: "1",
392
+ });
393
+ // Back side never captured → no back entries.
394
+ expect(
395
+ entries.some((entry) => entry.name === "document_back_capture_retries"),
396
+ ).toBe(false);
397
+ // Camera id from the telemetry.
398
+ expect(entries).toContainEqual({
399
+ name: "camera_name",
400
+ value: "com.apple.avfoundation:front",
401
+ });
402
+ // Accelerometer telemetry from the selfie capture.
403
+ expect(entries).toContainEqual({
404
+ name: "device_positions",
405
+ value: JSON.stringify(["1000,0.1,0.2,0.98", "1066,0.1,0.3,0.97"]),
406
+ });
407
+ expect(entries).toContainEqual({
408
+ name: "device_movement_detected",
409
+ value: "0.35",
410
+ });
411
+ });
412
+ });
413
+
414
+ describe("FlowNavigationManager — documentFrameAspectRatio", () => {
415
+ function documentFlow(
416
+ configure: (document: DocumentCaptureConfigBuilder) => void,
417
+ ): ScreensConfig {
418
+ return buildScreens((screens) => {
419
+ screens.capture((capture) => {
420
+ capture.captureType = CaptureType.document;
421
+ capture.document(configure);
422
+ });
423
+ });
424
+ }
425
+
426
+ it("uses the document type's own knownAspectRatio for presets", () => {
427
+ expect(
428
+ makeManager(
429
+ documentFlow((document) => {
430
+ document.documentType = DocumentType.Passport;
431
+ }),
432
+ ).documentFrameAspectRatio,
433
+ ).toBeCloseTo(356 / 272);
434
+
435
+ expect(
436
+ makeManager(
437
+ documentFlow((document) => {
438
+ document.documentType = DocumentType.SouthAfricaGreenBook;
439
+ }),
440
+ ).documentFrameAspectRatio,
441
+ ).toBeCloseTo(320 / 428);
442
+ });
443
+
444
+ it("falls back to the partner ratio, then the orientation default", () => {
445
+ // Generic landscape with no fixed ratio → landscape default.
446
+ expect(
447
+ makeManager(
448
+ documentFlow((document) => {
449
+ document.documentType = DocumentType.GenericDocument();
450
+ }),
451
+ ).documentFrameAspectRatio,
452
+ ).toBeCloseTo(1.586);
453
+
454
+ // A partner override wins when the type has no fixed ratio.
455
+ expect(
456
+ makeManager(
457
+ documentFlow((document) => {
458
+ document.documentType = DocumentType.GenericDocument();
459
+ document.knownIdAspectRatio = 1.4;
460
+ }),
461
+ ).documentFrameAspectRatio,
462
+ ).toBeCloseTo(1.4);
463
+
464
+ // Generic portrait with no fixed ratio → portrait default.
465
+ expect(
466
+ makeManager(
467
+ documentFlow((document) => {
468
+ document.documentType = DocumentType.GenericDocument({
469
+ orientation: "Portrait",
470
+ });
471
+ }),
472
+ ).documentFrameAspectRatio,
473
+ ).toBeCloseTo(0.65);
474
+ });
475
+
476
+ it("is undefined when the flow has no document capture step", () => {
477
+ const selfieFlow = buildScreens((screens) => {
478
+ screens.capture((capture) => {
479
+ capture.captureType = CaptureType.selfie;
480
+ });
481
+ });
482
+ expect(makeManager(selfieFlow).documentFrameAspectRatio).toBeUndefined();
483
+ });
285
484
  });