@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
@@ -8,10 +8,10 @@ import {
8
8
  import { AccessibilityInfo } from "react-native";
9
9
  import {
10
10
  UseSmileIDEnhancedSmartSelfieClip,
11
- ENHANCED_SMART_SELFIE_ANIMATION_SIZE,
11
+ ENHANCED_SMART_SELFIE_ARROW_FIT,
12
12
  } from "../use_smile_id_enhanced_smart_selfie_clip";
13
+ import { FaceOvalDefaults } from "../face_oval_defaults";
13
14
  import {
14
- ENHANCED_SMART_SELFIE_ANIMATION_OPACITY,
15
15
  ENHANCED_SMART_SELFIE_ANIMATION_SPEED,
16
16
  ENHANCED_SMART_SELFIE_TOTAL_FRAMES,
17
17
  } from "../helpers/enhanced_smart_selfie_animation_frames";
@@ -196,7 +196,7 @@ describe("UseSmileIDEnhancedSmartSelfieClip", () => {
196
196
  });
197
197
 
198
198
  describe("positioning", () => {
199
- it("produces a container sized to ENHANCED_SMART_SELFIE_ANIMATION_SIZE", async () => {
199
+ it("sizes the container to the oval width times the arrow-fit factor", async () => {
200
200
  const tree = renderClip({ pingPong: false });
201
201
  await act(async () => {
202
202
  await Promise.resolve();
@@ -210,13 +210,17 @@ describe("UseSmileIDEnhancedSmartSelfieClip", () => {
210
210
  );
211
211
  expect(container).toBeDefined();
212
212
  const style = container!.props.style as { width: number; height: number };
213
- expect(style.width).toBe(ENHANCED_SMART_SELFIE_ANIMATION_SIZE);
214
- expect(style.height).toBe(ENHANCED_SMART_SELFIE_ANIMATION_SIZE);
213
+ const expectedSize =
214
+ BASE_CONTAINER_WIDTH *
215
+ FaceOvalDefaults.ovalWidthRatio *
216
+ ENHANCED_SMART_SELFIE_ARROW_FIT;
217
+ expect(style.width).toBe(expectedSize);
218
+ expect(style.height).toBe(expectedSize);
215
219
  });
216
220
  });
217
221
 
218
222
  describe("tuning — opacity + speed", () => {
219
- it("renders the cue at 0.75 opacity so the face stays the focal point", async () => {
223
+ it("renders the cue at full opacity (no translucency over the animation)", async () => {
220
224
  const tree = renderClip({ pingPong: false });
221
225
  await act(async () => {
222
226
  await Promise.resolve();
@@ -227,8 +231,8 @@ describe("UseSmileIDEnhancedSmartSelfieClip", () => {
227
231
  match.props.style !== undefined && match.props.style !== null,
228
232
  );
229
233
  expect(container).toBeDefined();
230
- const style = container!.props.style as { opacity: number };
231
- expect(style.opacity).toBe(ENHANCED_SMART_SELFIE_ANIMATION_OPACITY);
234
+ const style = container!.props.style as { opacity?: number };
235
+ expect(style.opacity).toBeUndefined();
232
236
  });
233
237
 
234
238
  it("plays the full primer at 0.6x speed", async () => {
@@ -7,7 +7,10 @@ import {
7
7
  } from "react-test-renderer";
8
8
  import { Text } from "react-native";
9
9
  import { UseSmileIDGuidelineThumbnail } from "../use_smile_id_guideline_thumbnail";
10
- import { SELFIE_GUIDELINES } from "../../flow/model/instructions_defaults";
10
+ import {
11
+ DOCUMENT_GUIDELINES_PASSPORT,
12
+ SELFIE_GUIDELINES,
13
+ } from "../../flow/model/instructions_defaults";
11
14
 
12
15
  function render(element: React.ReactElement) {
13
16
  let tree!: ReturnType<typeof createRenderer>;
@@ -77,3 +80,33 @@ describe("UseSmileIDGuidelineThumbnail", () => {
77
80
  );
78
81
  });
79
82
  });
83
+
84
+ // DOCUMENT_GUIDELINES_PASSPORT order: [Good (allowed), …, Not reflective]; these
85
+ // carry a `card` size → the thumbnail renders the document-card layout.
86
+ const documentAllowedGuideline = DOCUMENT_GUIDELINES_PASSPORT[0]!;
87
+ const documentBlockedGuideline = DOCUMENT_GUIDELINES_PASSPORT[3]!;
88
+
89
+ describe("UseSmileIDGuidelineThumbnail — document card", () => {
90
+ it("renders the caption and allowed badge for a document guideline", () => {
91
+ const { root } = render(
92
+ <UseSmileIDGuidelineThumbnail guideline={documentAllowedGuideline} />,
93
+ );
94
+ expect(findTextNode(root, "Good")).not.toBeNull();
95
+ expect(
96
+ root.findAllByProps({ accessibilityLabel: "Allowed" })[0],
97
+ ).toBeTruthy();
98
+ expect(
99
+ root.findAllByProps({ accessibilityLabel: "Not allowed" }),
100
+ ).toHaveLength(0);
101
+ });
102
+
103
+ it("renders the blocked badge and caption for a blocked document guideline", () => {
104
+ const { root } = render(
105
+ <UseSmileIDGuidelineThumbnail guideline={documentBlockedGuideline} />,
106
+ );
107
+ expect(findTextNode(root, "Not reflective")).not.toBeNull();
108
+ expect(
109
+ root.findAllByProps({ accessibilityLabel: "Not allowed" })[0],
110
+ ).toBeTruthy();
111
+ });
112
+ });
@@ -7,6 +7,7 @@ import {
7
7
  OVAL_PROGRESS_DURATION_MS,
8
8
  loopDurationMs,
9
9
  } from "../use_smile_id_instructions_hero";
10
+ import { AnimatedLottieView } from "../helpers/animated_lottie_view";
10
11
  import { SELFIE_HERO_ANIMATION } from "../../flow/model/instructions_defaults";
11
12
 
12
13
  function render(element: React.ReactElement) {
@@ -76,4 +77,74 @@ describe("UseSmileIDInstructionsHero", () => {
76
77
  timingSpy.mockRestore();
77
78
  }
78
79
  });
80
+
81
+ it("pins oval-less heroes to the software Lottie engine on iOS", () => {
82
+ // lottie-ios's CA engine mis-renders the doc heroes' track mattes, so
83
+ // oval-less heroes must pin renderMode SOFTWARE on iOS.
84
+ const docTree = render(
85
+ <UseSmileIDInstructionsHero
86
+ source={SELFIE_HERO_ANIMATION}
87
+ showOval={false}
88
+ showOvalProgress={false}
89
+ />,
90
+ );
91
+ const docHero = docTree.root.findByProps({
92
+ testID: "si_instructions_hero",
93
+ });
94
+ act(() => {
95
+ docHero.props.onLayout({
96
+ nativeEvent: { layout: { width: 390, height: 600 } },
97
+ });
98
+ });
99
+ expect(docTree.root.findByType(AnimatedLottieView).props.renderMode).toBe(
100
+ "SOFTWARE",
101
+ );
102
+ act(() => docTree.unmount());
103
+
104
+ const ovalTree = render(
105
+ <UseSmileIDInstructionsHero
106
+ source={SELFIE_HERO_ANIMATION}
107
+ showOval
108
+ showOvalProgress={false}
109
+ />,
110
+ );
111
+ const ovalHero = ovalTree.root.findByProps({
112
+ testID: "si_instructions_hero",
113
+ });
114
+ act(() => {
115
+ ovalHero.props.onLayout({
116
+ nativeEvent: { layout: { width: 390, height: 600 } },
117
+ });
118
+ });
119
+ expect(
120
+ ovalTree.root.findByType(AnimatedLottieView).props.renderMode,
121
+ ).toBeUndefined();
122
+ act(() => ovalTree.unmount());
123
+ });
124
+
125
+ it("gives the document card hero explicit dimensions (no intrinsic-size flash)", () => {
126
+ const tree = render(
127
+ <UseSmileIDInstructionsHero
128
+ source={SELFIE_HERO_ANIMATION}
129
+ showCardBackground
130
+ showOvalProgress={false}
131
+ />,
132
+ );
133
+ // The renderer doesn't fire onLayout on its own; drive it so the measured
134
+ // subtree (card + Lottie) materializes.
135
+ const hero = tree.root.findByProps({ testID: "si_instructions_hero" });
136
+ act(() => {
137
+ hero.props.onLayout({
138
+ nativeEvent: { layout: { width: 384, height: 600 } },
139
+ });
140
+ });
141
+
142
+ const lottie = tree.root.findByType(AnimatedLottieView);
143
+ const style = lottie.props.style as { width?: unknown; height?: unknown };
144
+ // Regression guard: explicit numeric width/height (not absoluteFill), else the Lottie
145
+ // flashes at the composition's intrinsic size on first render.
146
+ expect(typeof style.width).toBe("number");
147
+ expect(typeof style.height).toBe("number");
148
+ act(() => tree.unmount());
149
+ });
79
150
  });
@@ -16,17 +16,14 @@ describe("UseSmileIDOvalBorderPalette", () => {
16
16
  UseSmileIDOverlayState.MOVE_RIGHT,
17
17
  UseSmileIDOverlayState.MOVE_UP,
18
18
  UseSmileIDOverlayState.MOVE_DOWN,
19
- UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED,
20
- UseSmileIDOverlayState.DOCUMENT_TOO_FAR,
21
- UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE,
22
- UseSmileIDOverlayState.DOCUMENT_HOLD_STILL,
23
- UseSmileIDOverlayState.DOCUMENT_READY,
24
19
  ];
25
20
 
26
21
  const active: UseSmileIDOverlayState[] = [
27
22
  UseSmileIDOverlayState.READY,
28
23
  UseSmileIDOverlayState.CAPTURING,
29
24
  UseSmileIDOverlayState.PROCESSING,
25
+ // Document is correctly framed → green, mirroring the selfie ready state.
26
+ UseSmileIDOverlayState.DOCUMENT_READY,
30
27
  ];
31
28
 
32
29
  const warning: UseSmileIDOverlayState[] = [
@@ -38,6 +35,11 @@ describe("UseSmileIDOvalBorderPalette", () => {
38
35
  UseSmileIDOverlayState.WRONG_ORIENTATION,
39
36
  UseSmileIDOverlayState.NOT_SMILING,
40
37
  UseSmileIDOverlayState.MULTIPLE_FACES,
38
+ // Document detected but mispositioned → red, mirroring the face warnings.
39
+ UseSmileIDOverlayState.DOCUMENT_NOT_CENTERED,
40
+ UseSmileIDOverlayState.DOCUMENT_TOO_FAR,
41
+ UseSmileIDOverlayState.DOCUMENT_TOO_CLOSE,
42
+ UseSmileIDOverlayState.DOCUMENT_HOLD_STILL,
41
43
  ];
42
44
 
43
45
  it("covers every overlay state exactly once across the three buckets", () => {
@@ -50,12 +50,6 @@ export const ENHANCED_SMART_SELFIE_FRAME_RATE = 30;
50
50
  */
51
51
  export const ENHANCED_SMART_SELFIE_ANIMATION_SPEED = 0.6;
52
52
 
53
- /**
54
- * Opacity for the ESS cues so the face stays the focal point behind the
55
- * translucent arrow overlay.
56
- */
57
- export const ENHANCED_SMART_SELFIE_ANIMATION_OPACITY = 0.75;
58
-
59
53
  /**
60
54
  * Resolve the keyframe span for [direction] — the green `matched` span
61
55
  * while [poseMatched], otherwise the grey `pending` span. Pure, so the
@@ -4,10 +4,18 @@ import {
4
4
  SI_FILLED_CHECK_CIRCLE,
5
5
  SI_FILLED_CLOSE_CIRCLE,
6
6
  SI_GUIDELINE_ACCESSORIES,
7
- SI_GUIDELINE_DOCUMENT_GOOD,
8
- SI_GUIDELINE_DOCUMENT_NOT_BLURRY,
9
- SI_GUIDELINE_DOCUMENT_NOT_CROPPED,
10
- SI_GUIDELINE_DOCUMENT_NOT_REFLECTIVE,
7
+ SI_GUIDELINE_DOCUMENT_GENERIC_GOOD,
8
+ SI_GUIDELINE_DOCUMENT_GENERIC_NOT_BLURRY,
9
+ SI_GUIDELINE_DOCUMENT_GENERIC_NOT_CROPPED,
10
+ SI_GUIDELINE_DOCUMENT_GENERIC_NOT_REFLECTIVE,
11
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_GOOD,
12
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_BLURRY,
13
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_CROPPED,
14
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_REFLECTIVE,
15
+ SI_GUIDELINE_DOCUMENT_PASSPORT_GOOD,
16
+ SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_BLURRY,
17
+ SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_CROPPED,
18
+ SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_REFLECTIVE,
11
19
  SI_GUIDELINE_GOOD,
12
20
  SI_GUIDELINE_MULTIPLE_FACES,
13
21
  SI_GUIDELINE_POOR_LIGHTING,
@@ -245,23 +253,62 @@ export const SiGuidelinePoorLighting = guidelineIllustration(
245
253
  SI_GUIDELINE_POOR_LIGHTING,
246
254
  );
247
255
 
248
- // Document-capture guideline illustrations. All four render the shared ID-card
249
- // placeholder for now; per-guideline assets are pending design.
250
- /** "Good" document-guideline illustration (allowed). */
251
- export const SiGuidelineDocumentGood = guidelineIllustration(
252
- SI_GUIDELINE_DOCUMENT_GOOD,
256
+ // Document-capture guideline illustrations — self-contained card art per
257
+ // document type (see `instruction_svg_strings`). Each renders at the asset's
258
+ // natural viewBox; `UseSmileIDGuidelineThumbnail` sizes and frames them.
259
+
260
+ // --- Generic document (landscape) ---
261
+ /** "Good" generic-document guideline illustration (allowed). */
262
+ export const SiGuidelineDocumentGenericGood = guidelineIllustration(
263
+ SI_GUIDELINE_DOCUMENT_GENERIC_GOOD,
264
+ );
265
+ /** "Not cropped" generic-document guideline illustration (blocked). */
266
+ export const SiGuidelineDocumentGenericNotCropped = guidelineIllustration(
267
+ SI_GUIDELINE_DOCUMENT_GENERIC_NOT_CROPPED,
268
+ );
269
+ /** "Not blurry" generic-document guideline illustration (blocked). */
270
+ export const SiGuidelineDocumentGenericNotBlurry = guidelineIllustration(
271
+ SI_GUIDELINE_DOCUMENT_GENERIC_NOT_BLURRY,
272
+ );
273
+ /** "Not reflective" generic-document guideline illustration (blocked). */
274
+ export const SiGuidelineDocumentGenericNotReflective = guidelineIllustration(
275
+ SI_GUIDELINE_DOCUMENT_GENERIC_NOT_REFLECTIVE,
276
+ );
277
+
278
+ // --- Passport (landscape) ---
279
+ /** "Good" passport guideline illustration (allowed). */
280
+ export const SiGuidelineDocumentPassportGood = guidelineIllustration(
281
+ SI_GUIDELINE_DOCUMENT_PASSPORT_GOOD,
282
+ );
283
+ /** "Not cropped" passport guideline illustration (blocked). */
284
+ export const SiGuidelineDocumentPassportNotCropped = guidelineIllustration(
285
+ SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_CROPPED,
286
+ );
287
+ /** "Not blurry" passport guideline illustration (blocked). */
288
+ export const SiGuidelineDocumentPassportNotBlurry = guidelineIllustration(
289
+ SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_BLURRY,
290
+ );
291
+ /** "Not reflective" passport guideline illustration (blocked). */
292
+ export const SiGuidelineDocumentPassportNotReflective = guidelineIllustration(
293
+ SI_GUIDELINE_DOCUMENT_PASSPORT_NOT_REFLECTIVE,
294
+ );
295
+
296
+ // --- South Africa green book (portrait) ---
297
+ /** "Good" green-book guideline illustration (allowed). */
298
+ export const SiGuidelineDocumentGreenBookGood = guidelineIllustration(
299
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_GOOD,
253
300
  );
254
- /** "Not cropped" document-guideline illustration (blocked). */
255
- export const SiGuidelineDocumentNotCropped = guidelineIllustration(
256
- SI_GUIDELINE_DOCUMENT_NOT_CROPPED,
301
+ /** "Not cropped" green-book guideline illustration (blocked). */
302
+ export const SiGuidelineDocumentGreenBookNotCropped = guidelineIllustration(
303
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_CROPPED,
257
304
  );
258
- /** "Not blurry" document-guideline illustration (blocked). */
259
- export const SiGuidelineDocumentNotBlurry = guidelineIllustration(
260
- SI_GUIDELINE_DOCUMENT_NOT_BLURRY,
305
+ /** "Not blurry" green-book guideline illustration (blocked). */
306
+ export const SiGuidelineDocumentGreenBookNotBlurry = guidelineIllustration(
307
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_BLURRY,
261
308
  );
262
- /** "Not reflective" document-guideline illustration (blocked). */
263
- export const SiGuidelineDocumentNotReflective = guidelineIllustration(
264
- SI_GUIDELINE_DOCUMENT_NOT_REFLECTIVE,
309
+ /** "Not reflective" green-book guideline illustration (blocked). */
310
+ export const SiGuidelineDocumentGreenBookNotReflective = guidelineIllustration(
311
+ SI_GUIDELINE_DOCUMENT_GREEN_BOOK_NOT_REFLECTIVE,
265
312
  );
266
313
 
267
314
  /** Capture-guidelines section-header glyph; tint via `color` (currentColor). */
@@ -8,7 +8,7 @@ export type UseSmileIDAttributionProps = {
8
8
  /**
9
9
  * Force the light-tone attribution regardless of the active
10
10
  * colour scheme. Used by surfaces that always render light
11
- * (capture screen overlay, processing screen card).
11
+ * (the capture screen overlay).
12
12
  */
13
13
  readonly forceLightMode?: boolean;
14
14
  readonly testID?: string;
@@ -23,8 +23,8 @@ export type UseSmileIDButtonProps = {
23
23
  * Pill-shaped primary / secondary button (48-dp height, 32-radius
24
24
  * corners).
25
25
  *
26
- * Secondary variant: transparent background + 1-pt stroke in the
27
- * secondary colour + primary-coloured label.
26
+ * Secondary variant: transparent background + 2-pt stroke in the
27
+ * primary colour + primary-coloured label.
28
28
  */
29
29
  export function UseSmileIDButton(props: UseSmileIDButtonProps) {
30
30
  const themeFromContext = useUseSmileIDTheme();
@@ -58,8 +58,8 @@ export function UseSmileIDButton(props: UseSmileIDButtonProps) {
58
58
  ? "transparent"
59
59
  : theme.colors.primary,
60
60
  borderColor:
61
- !disabled && isSecondary ? theme.colors.secondary : "transparent",
62
- borderWidth: !disabled && isSecondary ? 1 : 0,
61
+ !disabled && isSecondary ? theme.colors.primary : "transparent",
62
+ borderWidth: !disabled && isSecondary ? 2 : 0,
63
63
  opacity: disabled ? 1 : pressed ? 0.85 : 1,
64
64
  },
65
65
  ]}
@@ -9,6 +9,7 @@ import {
9
9
  import { SafeAreaView } from "react-native-safe-area-context";
10
10
  import type { ScanHeadTurnDirection } from "@smileid/usesmileid_bridge";
11
11
  import { CaptureType } from "../../core/models/ml_config";
12
+ import type { DocumentType } from "../../core/models/document_type";
12
13
  import { defaultLightTheme, type UseSmileIDTheme } from "../theme/theme";
13
14
  import { useUseSmileIDTheme } from "../theme/theme_context";
14
15
  import {
@@ -45,6 +46,10 @@ export type UseSmileIDCaptureContentState = {
45
46
  /** Show the Start Capture control (pre-flight instruction state only). */
46
47
  readonly showCaptureButton: boolean;
47
48
  readonly knownIdAspectRatio?: number;
49
+ /** Document type — selects the in-frame shimmer skeleton. Ignored for selfie. */
50
+ readonly documentTypeKind?: DocumentType["kind"];
51
+ /** Active side is the back — swaps the generic shimmer front→back. Ignored for selfie. */
52
+ readonly isBackSide?: boolean;
48
53
  /** Document manual shutter availability (capture-mode + fallback-timer driven). Ignored for selfie. */
49
54
  readonly showManualShutter?: boolean;
50
55
  /** Document gallery-upload availability (`allowGalleryUpload`). Ignored for selfie. */
@@ -72,6 +77,13 @@ export type UseSmileIDCaptureContentProps = {
72
77
  readonly onGalleryUpload?: (() => void) | undefined;
73
78
  /** Disables document controls while a manual/gallery delivery is in flight. */
74
79
  readonly documentControlsEnabled?: boolean | undefined;
80
+ /**
81
+ * Reports the camera-viewport (canvas) size on layout so the screen can
82
+ * derive the document crop region from the same geometry the overlay draws.
83
+ */
84
+ readonly onViewportLayout?:
85
+ | ((size: { width: number; height: number }) => void)
86
+ | undefined;
75
87
  readonly theme?: UseSmileIDTheme | undefined;
76
88
  };
77
89
 
@@ -96,9 +108,14 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
96
108
  ? previous
97
109
  : { width, height },
98
110
  );
111
+ // Surface the viewport size; the screen dedupes no-change passes.
112
+ props.onViewportLayout?.({ width, height });
99
113
  };
100
114
 
101
115
  const isSelfie = state.captureType === CaptureType.selfie;
116
+ // Landscape document moves the close ✕ into the control lane; portrait /
117
+ // selfie keep it in the top bar. False until the canvas is measured.
118
+ const isLandscapeDocument = !isSelfie && canvas.width > canvas.height;
102
119
  const feedback = state.feedbackKey
103
120
  ? resolveFeedbackCopy(state.feedbackKey, loc)
104
121
  : null;
@@ -129,6 +146,10 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
129
146
  containerWidth={canvas.width}
130
147
  containerHeight={canvas.height}
131
148
  theme={theme}
149
+ isBackSide={state.isBackSide ?? false}
150
+ {...(state.documentTypeKind !== undefined
151
+ ? { documentTypeKind: state.documentTypeKind }
152
+ : {})}
132
153
  {...(state.knownIdAspectRatio !== undefined
133
154
  ? { knownIdAspectRatio: state.knownIdAspectRatio }
134
155
  : {})}
@@ -159,11 +180,11 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
159
180
  />
160
181
  ) : null
161
182
  ) : null}
162
- {/* Document control slot: shutter + gallery while positioning;
163
- progress spinner once capture commits (they never coexist). */}
183
+ {/* Document control slot: shutter + gallery while positioning (plus the
184
+ close ✕ in landscape). The capture-progress spinner renders in the
185
+ overlay only while capturing, so it never coexists with these controls. */}
164
186
  {!isSelfie ? (
165
187
  <UseSmileIDDocumentCaptureControls
166
- capturing={isDocumentCaptureActive(state.overlayState)}
167
188
  showManualShutter={
168
189
  (state.showManualShutter ?? false) &&
169
190
  props.onManualShutter !== undefined &&
@@ -180,14 +201,17 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
180
201
  onGallery={props.onGalleryUpload ?? noop}
181
202
  shutterAccessibilityLabel={loc.siCdDocumentCaptureShutter}
182
203
  galleryAccessibilityLabel={loc.siCdDocumentGallery}
204
+ closeAccessibilityLabel={loc.siCdClose}
205
+ onClose={props.onClose}
183
206
  />
184
207
  ) : null}
185
208
  </>
186
209
  ) : null}
187
210
 
188
- {/* Camera stays full-bleed; only the control layers inset from the system bars. */}
211
+ {/* Control layers inset from the system bars (camera stays full-bleed);
212
+ both horizontal edges so landscape keeps chrome clear of the notch. */}
189
213
  <SafeAreaView
190
- edges={["top"]}
214
+ edges={["top", "left", "right"]}
191
215
  style={[
192
216
  styles.topBar,
193
217
  {
@@ -207,8 +231,9 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
207
231
  ) : (
208
232
  <View style={styles.chromeSpacer} />
209
233
  )}
210
- {/* Close/cancel (document chrome) — top-right, mirrors the back button. */}
211
- {props.onClose ? (
234
+ {/* Close/cancel (document chrome) — top-right in portrait / selfie; in
235
+ landscape document capture the ✕ moves into the control lane. */}
236
+ {props.onClose && !isLandscapeDocument ? (
212
237
  <Pressable
213
238
  onPress={props.onClose}
214
239
  accessibilityRole="button"
@@ -247,10 +272,9 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
247
272
  <Text
248
273
  style={{
249
274
  ...theme.typography.cardTitle,
250
- // Light-palette forced: overlay is locked to light mode (selfie navy-on-white).
251
- color: isSelfie
252
- ? defaultLightTheme.colors.primary
253
- : defaultLightTheme.colors.captureFeedbackText,
275
+ // The capture screen supplies the light-resolved partner theme, so
276
+ // this stays light-on-light while honouring a partner `primary`.
277
+ color: theme.colors.primary,
254
278
  textAlign: "center",
255
279
  }}
256
280
  testID="si_capture_feedback_text"
@@ -261,7 +285,7 @@ function UseSmileIDCaptureContentInner(props: UseSmileIDCaptureContentProps) {
261
285
  ) : null}
262
286
 
263
287
  <SafeAreaView
264
- edges={["bottom"]}
288
+ edges={["bottom", "left", "right"]}
265
289
  style={[
266
290
  styles.bottom,
267
291
  {
@@ -1,17 +1,13 @@
1
1
  import type { ReactNode } from "react";
2
2
  import { Image, StyleSheet, View } from "react-native";
3
- import {
4
- defaultFrameAspectRatio,
5
- type DocumentOrientation,
6
- } from "../../core/models/document_type";
7
3
  import type { UseSmileIDTheme } from "../theme/theme";
8
4
  import { useUseSmileIDTheme } from "../theme/theme_context";
9
5
 
10
6
  export type UseSmileIDCapturedDocumentImageProps = {
11
7
  /** Local file URI (`file:///…`) of the captured document side. */
12
8
  readonly uri?: string;
13
- /** Drives the frame aspect: landscape fills width, portrait fills height. */
14
- readonly orientation: DocumentOrientation;
9
+ /** Capture-frame aspect ratio (width / height): ≥1 fills width (landscape), <1 fills height (portrait). */
10
+ readonly aspectRatio: number;
15
11
  /** Content centered over the document rect — e.g. the processing-screen status badge. */
16
12
  readonly overlayChild?: ReactNode;
17
13
  /** Accessible name for the image; when unset the image stays decorative. */
@@ -33,8 +29,7 @@ export function UseSmileIDCapturedDocumentImage(
33
29
  ) {
34
30
  const themeFromContext = useUseSmileIDTheme();
35
31
  const theme = props.theme ?? themeFromContext;
36
- const aspectRatio = defaultFrameAspectRatio(props.orientation);
37
- // Landscape (aspect ≥ 1) is width-bound; portrait is height-bound.
32
+ const aspectRatio = props.aspectRatio;
38
33
  const fill = aspectRatio >= 1 ? styles.fillWidth : styles.fillHeight;
39
34
 
40
35
  return (