@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,7 +1,7 @@
1
1
  import { Pressable, StyleSheet, View } from "react-native";
2
+ import { SafeAreaView } from "react-native-safe-area-context";
2
3
  import { defaultLightTheme } from "../theme/theme";
3
- import { SiGallery } from "./icons";
4
- import { UseSmileIDCaptureSpinner } from "./use_smile_id_capture_spinner";
4
+ import { SiGallery, SiOutlineClose } from "./icons";
5
5
 
6
6
  export type UseSmileIDDocumentCaptureControlsProps = {
7
7
  /** Manual shutter — taps capture a still through the document pipeline. */
@@ -9,30 +9,43 @@ export type UseSmileIDDocumentCaptureControlsProps = {
9
9
  /** Gallery upload — taps open the photo library to import a document. */
10
10
  readonly showGallery: boolean;
11
11
  /**
12
- * Landscape: controls form a trailing-edge column; portrait: a bottom row.
13
- * Driven by the measured canvas aspect (not the lock) so it follows what renders.
12
+ * Landscape → trailing-edge lane (✕ top, controls centred); portrait →
13
+ * centred bottom row (✕ in the top chrome). From the measured canvas aspect.
14
14
  */
15
15
  readonly isLandscape: boolean;
16
16
  /** Disables presses (e.g. a delivery is already in flight). */
17
17
  readonly enabled: boolean;
18
- /** Capture is committing — the slot shows the progress spinner instead of shutter/gallery. */
19
- readonly capturing: boolean;
18
+ /**
19
+ * Close/cancel the whole flow. Rendered at the top of the landscape lane so it
20
+ * shares the shutter's centre-x; in portrait the top chrome renders it instead.
21
+ */
22
+ readonly onClose?: (() => void) | undefined;
20
23
  readonly onManualShutter: () => void;
21
24
  readonly onGallery: () => void;
22
25
  /** Localized screen-reader label for the shutter (`si_cd_document_capture_shutter`). */
23
26
  readonly shutterAccessibilityLabel: string;
24
27
  /** Localized screen-reader label for the gallery button (`si_cd_document_gallery`). */
25
28
  readonly galleryAccessibilityLabel: string;
29
+ /** Localized screen-reader label for the close button (`si_cd_close`). */
30
+ readonly closeAccessibilityLabel: string;
26
31
  };
27
32
 
28
- const SHUTTER_SIZE = 72;
29
- const SHUTTER_INNER_SIZE = 56;
30
- const GALLERY_SIZE = 52;
31
- const CONTROL_GAP = 20;
33
+ const SHUTTER_SIZE = 64;
34
+ const SHUTTER_INNER_SIZE = 46;
35
+ const GALLERY_SIZE = 56;
36
+ const CONTROL_GAP = 24;
37
+ const CLOSE_SIZE = 40;
38
+ /** Trailing-edge inset for the landscape lane (spacing.large). */
39
+ const LANE_EDGE = 24;
40
+ /** Bottom inset for the portrait control row above the safe area (spacing.large). */
41
+ const PORTRAIT_ROW_BOTTOM = 24;
42
+ /** Top/bottom inset bounding the ✕ and the centred controls inside the lane. */
43
+ const LANE_VERTICAL_PADDING = 16;
32
44
 
33
45
  /**
34
- * Document capture controls — manual shutter + gallery upload, a trailing-edge
35
- * column in landscape and a centred bottom row in portrait (matches the capture design).
46
+ * Document capture controls — manual shutter + gallery upload, plus the close ✕
47
+ * in landscape (laid out as a trailing-edge lane; portrait is a centred bottom
48
+ * row with the ✕ in the top chrome).
36
49
  */
37
50
  export function UseSmileIDDocumentCaptureControls(
38
51
  props: UseSmileIDDocumentCaptureControlsProps,
@@ -40,10 +53,33 @@ export function UseSmileIDDocumentCaptureControls(
40
53
  // Light-palette forced: overlay is locked to light mode so brand-blue reads over the dim feed.
41
54
  const theme = defaultLightTheme;
42
55
 
43
- if (!props.capturing && !props.showManualShutter && !props.showGallery) {
56
+ const controlsVisible = props.showManualShutter || props.showGallery;
57
+ // The lane keeps the ✕ even when shutter/gallery hide (during capture); portrait
58
+ // renders nothing here once the controls are hidden.
59
+ const showCloseInLane = props.isLandscape && props.onClose !== undefined;
60
+ if (!controlsVisible && !showCloseInLane) {
44
61
  return null;
45
62
  }
46
63
 
64
+ const closeButton = props.onClose ? (
65
+ <Pressable
66
+ onPress={props.onClose}
67
+ accessibilityRole="button"
68
+ accessibilityLabel={props.closeAccessibilityLabel}
69
+ testID="si_document_close_button"
70
+ style={({ pressed }) => [
71
+ styles.closeButton,
72
+ {
73
+ backgroundColor: theme.colors.offBlack,
74
+ borderColor: theme.colors.backButtonBorder,
75
+ opacity: pressed ? 0.7 : 1,
76
+ },
77
+ ]}
78
+ >
79
+ <SiOutlineClose size={20} color={theme.colors.offWhite} />
80
+ </Pressable>
81
+ ) : null;
82
+
47
83
  const shutter = props.showManualShutter ? (
48
84
  <Pressable
49
85
  onPress={props.onManualShutter}
@@ -81,60 +117,88 @@ export function UseSmileIDDocumentCaptureControls(
81
117
  </Pressable>
82
118
  ) : null;
83
119
 
120
+ if (props.isLandscape) {
121
+ // Trailing-edge lane: ✕ at the top, shutter/gallery vertically centred
122
+ // between two flex spacers so the controls hold the lane's vertical centre.
123
+ return (
124
+ <SafeAreaView
125
+ edges={["top", "right", "bottom", "left"]}
126
+ style={styles.landscapeLane}
127
+ pointerEvents="box-none"
128
+ testID="si_document_capture_controls"
129
+ >
130
+ {/* Fixed-width slot keeps the ✕ on the shutter's centre-x even when the
131
+ shutter/gallery hide during capture (matches the native lane width). */}
132
+ <View style={styles.laneSlot}>{closeButton}</View>
133
+ <View style={styles.laneSpacer} />
134
+ {controlsVisible ? (
135
+ <View style={styles.landscapeControls}>
136
+ {shutter}
137
+ {gallery}
138
+ </View>
139
+ ) : null}
140
+ <View style={styles.laneSpacer} />
141
+ </SafeAreaView>
142
+ );
143
+ }
144
+
145
+ // Portrait: centred bottom row (gallery left of shutter).
84
146
  return (
85
- <View
86
- style={props.isLandscape ? styles.landscapeColumn : styles.portraitRow}
147
+ <SafeAreaView
148
+ edges={["top", "right", "bottom", "left"]}
149
+ style={styles.portraitRow}
87
150
  pointerEvents="box-none"
88
151
  testID="si_document_capture_controls"
89
152
  >
90
- {props.capturing ? (
91
- <UseSmileIDCaptureSpinner
92
- color={theme.colors.ovalActive}
93
- testID="si_document_capture_spinner"
94
- />
95
- ) : props.isLandscape ? (
96
- // Landscape: shutter above gallery (trailing column).
97
- <>
98
- {shutter}
99
- {gallery}
100
- </>
101
- ) : (
102
- // Portrait: gallery left of shutter (bottom row).
103
- <>
104
- {gallery}
105
- {shutter}
106
- </>
107
- )}
108
- </View>
153
+ {gallery}
154
+ {shutter}
155
+ </SafeAreaView>
109
156
  );
110
157
  }
111
158
 
112
159
  const styles = StyleSheet.create({
113
- landscapeColumn: {
160
+ // No fixed width: the lane sizes to its (≤ SHUTTER_SIZE-wide) content so the
161
+ // additive horizontal safe-area inset SHIFTS it inward instead of squeezing the
162
+ // controls (RN is border-box; padding inside a fixed width would clip them).
163
+ landscapeLane: {
114
164
  position: "absolute",
115
165
  top: 0,
116
166
  bottom: 0,
117
- end: 24,
167
+ end: LANE_EDGE,
168
+ flexDirection: "column",
169
+ alignItems: "center",
170
+ paddingVertical: LANE_VERTICAL_PADDING,
171
+ },
172
+ laneSpacer: { flex: 1 },
173
+ laneSlot: { width: SHUTTER_SIZE, alignItems: "center" },
174
+ landscapeControls: {
118
175
  flexDirection: "column",
119
176
  alignItems: "center",
120
- justifyContent: "center",
121
177
  gap: CONTROL_GAP,
122
178
  },
123
179
  portraitRow: {
124
180
  position: "absolute",
125
181
  start: 0,
126
182
  end: 0,
127
- bottom: 96,
183
+ bottom: PORTRAIT_ROW_BOTTOM,
128
184
  flexDirection: "row",
129
185
  alignItems: "center",
130
186
  justifyContent: "center",
131
187
  gap: CONTROL_GAP * 1.6,
132
188
  },
189
+ closeButton: {
190
+ width: CLOSE_SIZE,
191
+ height: CLOSE_SIZE,
192
+ borderRadius: CLOSE_SIZE / 2,
193
+ borderWidth: 1,
194
+ alignItems: "center",
195
+ justifyContent: "center",
196
+ },
133
197
  shutterOuter: {
134
198
  width: SHUTTER_SIZE,
135
199
  height: SHUTTER_SIZE,
136
200
  borderRadius: SHUTTER_SIZE / 2,
137
- borderWidth: 3,
201
+ borderWidth: 4,
138
202
  borderColor: "#FFFFFF",
139
203
  alignItems: "center",
140
204
  justifyContent: "center",
@@ -1,5 +1,6 @@
1
1
  import { memo } from "react";
2
2
  import { StyleSheet, Text, View } from "react-native";
3
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
3
4
  import Svg, { Path } from "react-native-svg";
4
5
  import type { UseSmileIDTheme } from "../theme/theme";
5
6
  import { useUseSmileIDTheme } from "../theme/theme_context";
@@ -7,7 +8,10 @@ import {
7
8
  isDocumentCaptureActive,
8
9
  type UseSmileIDOverlayState as OverlayState,
9
10
  } from "../state/use_smile_id_overlay_state";
10
- import { UseSmileIDDocumentFrameGlyph } from "./use_smile_id_document_frame_glyph";
11
+ import type { DocumentType } from "../../core/models/document_type";
12
+ import { UseSmileIDOvalBorderPalette } from "./use_smile_id_oval_border_palette";
13
+ import { UseSmileIDDocumentShimmer } from "./use_smile_id_document_shimmer";
14
+ import { UseSmileIDCaptureSpinner } from "./use_smile_id_capture_spinner";
11
15
 
12
16
  export type UseSmileIDDocumentOverlayProps = {
13
17
  readonly state: OverlayState;
@@ -15,6 +19,10 @@ export type UseSmileIDDocumentOverlayProps = {
15
19
  readonly containerHeight: number;
16
20
  /** Optional aspect ratio hint — e.g. CR-80 ID card = 1.586. */
17
21
  readonly knownIdAspectRatio?: number;
22
+ /** Document type — selects the in-frame shimmer skeleton. */
23
+ readonly documentTypeKind?: DocumentType["kind"];
24
+ /** Generic-document back side — swaps the front skeleton for the back. */
25
+ readonly isBackSide?: boolean;
18
26
  /**
19
27
  * Coaching copy shown in the dark pill below the frame. Rendered here so it
20
28
  * tracks the frame geometry instead of a fixed screen offset.
@@ -28,50 +36,88 @@ export type UseSmileIDDocumentOverlayProps = {
28
36
  const CHIP_TOP_GAP = 16;
29
37
 
30
38
  /**
31
- * Fraction of the container width the document frame spans, per orientation.
32
- * Matches the Figma capture frames: landscape ID-1 card ≈ 0.53 of the (wide)
33
- * screen; portrait booklet / passport ≈ 0.68 of the (narrow) screen.
39
+ * Frame spans ≤71% of container width, height capped at 61% (re-deriving width
40
+ * from aspect when the cap bites — keeps a wide ID-1 card from overflowing in
41
+ * landscape). One ratio pair drives both orientations.
34
42
  */
35
- const FRAME_WIDTH_FRACTION_LANDSCAPE = 0.53;
36
- const FRAME_WIDTH_FRACTION_PORTRAIT = 0.68;
43
+ const FRAME_MAX_WIDTH_RATIO = 0.71;
44
+ const FRAME_MAX_HEIGHT_RATIO = 0.61;
37
45
  /** Frame corner radius (matches the bordered frame's `borderRadius`). */
38
- const FRAME_CORNER_RADIUS = 8;
46
+ const FRAME_CORNER_RADIUS = 16;
47
+ /** Guide-rect border thickness; drawn straddling the frame edge (centred stroke, matching the other SDKs). */
48
+ const FRAME_BORDER_WIDTH = 4;
49
+ /** Capture-progress spinner shown beside the frame (landscape) or bottom-centre (portrait). */
50
+ const SPINNER_SIZE = 48;
51
+ /** Portrait spinner gap above the safe-area bottom (spacing.large) — matches the shutter row. */
52
+ const PORTRAIT_SPINNER_BOTTOM_GAP = 24;
53
+
54
+ /** Default document aspect (CR-80 ID-1 card) when no known ratio is supplied. */
55
+ export const DEFAULT_DOCUMENT_ASPECT = 1.586;
56
+
39
57
  /**
40
- * Faint black tint over the WHOLE live feed (net ~0.15 inside the frame). A
41
- * component constant, not a theme colour — the surround dim (`documentOverlayScrim`)
42
- * is the partner-overridable layer.
58
+ * Centred document guide rectangle (container px) for a document [aspect] and
59
+ * viewport. Single source of truth shared by the overlay (draws the frame) and
60
+ * the capture screen (derives the native crop region), so the saved capture
61
+ * matches the frame the user saw.
62
+ */
63
+ export function documentGuideRect(
64
+ aspect: number,
65
+ containerWidth: number,
66
+ containerHeight: number,
67
+ ): {
68
+ readonly left: number;
69
+ readonly top: number;
70
+ readonly width: number;
71
+ readonly height: number;
72
+ } {
73
+ let width = containerWidth * FRAME_MAX_WIDTH_RATIO;
74
+ let height = width / aspect;
75
+ const maxHeight = containerHeight * FRAME_MAX_HEIGHT_RATIO;
76
+ if (height > maxHeight) {
77
+ height = maxHeight;
78
+ width = height * aspect;
79
+ }
80
+ return {
81
+ left: (containerWidth - width) / 2,
82
+ top: (containerHeight - height) / 2,
83
+ width,
84
+ height,
85
+ };
86
+ }
87
+ /**
88
+ * Faint black tint over the whole live feed (~0.15 inside the frame). Component
89
+ * constant, not a theme colour — the surround dim is the overridable layer.
43
90
  */
44
91
  const DOCUMENT_CAMERA_TINT = "#00000026"; // black @15%
45
92
  /** Fallback surround dim when the theme omits `documentOverlayScrim`. */
46
93
  const DEFAULT_DOCUMENT_OVERLAY_SCRIM = "#00000066"; // black @40%
47
94
 
48
95
  /**
49
- * Document capture frame — two-layer dim (faint full-feed tint + darker surround
50
- * outside the cutout, ~0.15 inside / ~0.49 outside) plus a border that flips to
51
- * `ovalActive` on `DOCUMENT_READY`. The cutout is one even-odd path, NOT a `<Mask>`:
52
- * masks rasterize the full-screen layer to a bitmap on the UI thread per invalidation,
53
- * freezing the camera preview. Respects `knownIdAspectRatio`; the frame stays centred.
96
+ * Document capture frame — two-layer dim + a border that flips to `ovalActive`
97
+ * on `DOCUMENT_READY`. The cutout is one even-odd path, NOT a `<Mask>` (masks
98
+ * rasterize the full-screen layer per invalidation, freezing the preview).
54
99
  */
55
100
  export function UseSmileIDDocumentOverlay(
56
101
  props: UseSmileIDDocumentOverlayProps,
57
102
  ) {
58
103
  const themeFromContext = useUseSmileIDTheme();
59
104
  const theme = props.theme ?? themeFromContext;
60
- const aspect = props.knownIdAspectRatio ?? 1.586;
61
- const isLandscapeFrame = aspect >= 1;
62
- const frameWidth =
63
- props.containerWidth *
64
- (isLandscapeFrame
65
- ? FRAME_WIDTH_FRACTION_LANDSCAPE
66
- : FRAME_WIDTH_FRACTION_PORTRAIT);
67
- const frameHeight = frameWidth / aspect;
68
- const left = (props.containerWidth - frameWidth) / 2;
69
- const top = (props.containerHeight - frameHeight) / 2;
70
- // Two-state border: neutral light while idle/positioning, green once committing.
105
+ const insets = useSafeAreaInsets();
106
+ const aspect = props.knownIdAspectRatio ?? DEFAULT_DOCUMENT_ASPECT;
107
+ const isPortrait = aspect < 1;
108
+ const {
109
+ left,
110
+ top,
111
+ width: frameWidth,
112
+ height: frameHeight,
113
+ } = documentGuideRect(aspect, props.containerWidth, props.containerHeight);
114
+ // Three-state border, shared with the selfie oval (UseSmileIDOvalBorderPalette):
115
+ // green once the document is correctly framed (ready / capturing / processing),
116
+ // red while detected but mispositioned (too far / close / off-centre / not
117
+ // steady), neutral while idle.
71
118
  const captureActive = isDocumentCaptureActive(props.state);
72
- const borderColor = captureActive
73
- ? theme.colors.ovalActive
74
- : theme.colors.stroke;
119
+ const borderColor =
120
+ theme.colors[UseSmileIDOvalBorderPalette.tokenFor(props.state, false)];
75
121
  const surroundColor =
76
122
  theme.colors.documentOverlayScrim ?? DEFAULT_DOCUMENT_OVERLAY_SCRIM;
77
123
 
@@ -104,37 +150,81 @@ export function UseSmileIDDocumentOverlay(
104
150
  cornerRadius={FRAME_CORNER_RADIUS}
105
151
  color={surroundColor}
106
152
  />
107
- {/* In-frame document glyph (placeholder for the per-type capture Lottie). */}
153
+ {/* In-frame document shimmer — per-type skeleton hint while positioning. */}
108
154
  {!captureActive ? (
109
155
  <View
110
156
  style={{
157
+ // Inset 10% per axis so the shimmer guide never touches the frame edge.
111
158
  position: "absolute",
112
- left,
113
- top,
114
- width: frameWidth,
115
- height: frameHeight,
159
+ left: left + frameWidth * 0.1,
160
+ top: top + frameHeight * 0.1,
161
+ width: frameWidth * 0.8,
162
+ height: frameHeight * 0.8,
116
163
  }}
117
164
  pointerEvents="none"
118
165
  >
119
- <UseSmileIDDocumentFrameGlyph
120
- width={frameWidth}
121
- height={frameHeight}
122
- isLandscape={isLandscapeFrame}
166
+ <UseSmileIDDocumentShimmer
167
+ width={frameWidth * 0.8}
168
+ height={frameHeight * 0.8}
169
+ isBackSide={props.isBackSide ?? false}
170
+ {...(props.documentTypeKind !== undefined
171
+ ? { documentTypeKind: props.documentTypeKind }
172
+ : {})}
123
173
  />
124
174
  </View>
125
175
  ) : null}
126
176
  <View
127
177
  style={{
128
178
  position: "absolute",
129
- left,
130
- top,
131
- width: frameWidth,
132
- height: frameHeight,
133
- borderWidth: 1.5,
134
- borderRadius: FRAME_CORNER_RADIUS,
179
+ left: left - FRAME_BORDER_WIDTH / 2,
180
+ top: top - FRAME_BORDER_WIDTH / 2,
181
+ width: frameWidth + FRAME_BORDER_WIDTH,
182
+ height: frameHeight + FRAME_BORDER_WIDTH,
183
+ borderWidth: FRAME_BORDER_WIDTH,
184
+ borderRadius: FRAME_CORNER_RADIUS + FRAME_BORDER_WIDTH / 2,
135
185
  borderColor,
136
186
  }}
137
187
  />
188
+ {/* Capture-progress spinner: beside the frame in landscape; bottom-centre in portrait
189
+ (e.g. Green Book), where the near-full-width frame leaves no side margin. */}
190
+ {captureActive ? (
191
+ isPortrait ? (
192
+ <View
193
+ style={{
194
+ position: "absolute",
195
+ left: 0,
196
+ right: 0,
197
+ bottom: insets.bottom + PORTRAIT_SPINNER_BOTTOM_GAP,
198
+ alignItems: "center",
199
+ }}
200
+ pointerEvents="none"
201
+ >
202
+ <UseSmileIDCaptureSpinner
203
+ size={SPINNER_SIZE}
204
+ color={theme.colors.ovalActive}
205
+ testID="si_document_capture_spinner"
206
+ />
207
+ </View>
208
+ ) : (
209
+ <View
210
+ style={{
211
+ position: "absolute",
212
+ left:
213
+ left +
214
+ frameWidth +
215
+ (props.containerWidth - (left + frameWidth) - SPINNER_SIZE) / 2,
216
+ top: top + (frameHeight - SPINNER_SIZE) / 2,
217
+ }}
218
+ pointerEvents="none"
219
+ >
220
+ <UseSmileIDCaptureSpinner
221
+ size={SPINNER_SIZE}
222
+ color={theme.colors.ovalActive}
223
+ testID="si_document_capture_spinner"
224
+ />
225
+ </View>
226
+ )
227
+ ) : null}
138
228
  {/* Coaching pill, anchored just below the frame (Figma off-black pill). */}
139
229
  {props.feedbackText ? (
140
230
  <View
@@ -0,0 +1,51 @@
1
+ import { memo } from "react";
2
+ import { SvgXml } from "react-native-svg";
3
+ import type { DocumentType } from "../../core/models/document_type";
4
+ import {
5
+ SI_DOCUMENT_BACK_SHIMMER,
6
+ SI_DOCUMENT_FRONT_SHIMMER,
7
+ SI_DOCUMENT_GREEN_BOOK_SHIMMER,
8
+ SI_DOCUMENT_PASSPORT_SHIMMER,
9
+ } from "../assets/svg/document_shimmer_strings";
10
+
11
+ /** Translucent in-frame document shimmer — the per-type "align here" skeleton, scaled to fit the capture frame. */
12
+ export type UseSmileIDDocumentShimmerProps = {
13
+ readonly width: number;
14
+ readonly height: number;
15
+ /** Selects the skeleton; the green book and passport ignore `isBackSide`. */
16
+ readonly documentTypeKind?: DocumentType["kind"];
17
+ /** Generic documents only: show the back-side skeleton instead of the front. */
18
+ readonly isBackSide?: boolean;
19
+ readonly testID?: string;
20
+ };
21
+
22
+ /** Shimmer skeleton for a document type + side. Only generic documents have front/back; passport and green book ignore the side. */
23
+ export function documentShimmerXml(
24
+ documentTypeKind: DocumentType["kind"] | undefined,
25
+ isBackSide: boolean,
26
+ ): string {
27
+ switch (documentTypeKind) {
28
+ case "passport":
29
+ return SI_DOCUMENT_PASSPORT_SHIMMER;
30
+ case "southAfricaGreenBook":
31
+ return SI_DOCUMENT_GREEN_BOOK_SHIMMER;
32
+ default:
33
+ return isBackSide ? SI_DOCUMENT_BACK_SHIMMER : SI_DOCUMENT_FRONT_SHIMMER;
34
+ }
35
+ }
36
+
37
+ export const UseSmileIDDocumentShimmer = memo(
38
+ function UseSmileIDDocumentShimmer(props: UseSmileIDDocumentShimmerProps) {
39
+ const { width, height, documentTypeKind, isBackSide = false } = props;
40
+ if (width <= 0 || height <= 0) return null;
41
+ // Default preserveAspectRatio (meet) fits the skeleton in the frame, undistorted.
42
+ return (
43
+ <SvgXml
44
+ xml={documentShimmerXml(documentTypeKind, isBackSide)}
45
+ width={width}
46
+ height={height}
47
+ {...(props.testID !== undefined ? { testID: props.testID } : {})}
48
+ />
49
+ );
50
+ },
51
+ );
@@ -5,7 +5,6 @@ import type { AnimationObject } from "lottie-react-native";
5
5
  import { useReducedMotion } from "../utils/use_reduced_motion";
6
6
  import { FaceOvalDefaults } from "./face_oval_defaults";
7
7
  import {
8
- ENHANCED_SMART_SELFIE_ANIMATION_OPACITY,
9
8
  ENHANCED_SMART_SELFIE_ANIMATION_SPEED,
10
9
  ENHANCED_SMART_SELFIE_TOTAL_FRAMES,
11
10
  } from "./helpers/enhanced_smart_selfie_animation_frames";
@@ -14,8 +13,11 @@ import {
14
13
  export const ESS_ALL_DIRECTIONS_ANIMATION =
15
14
  require("../assets/si_ess_animation_all_directions.json") as AnimationObject;
16
15
 
17
- /** Square box the Enhanced Smart Selfie cues render in, centred on the oval. */
18
- export const ENHANCED_SMART_SELFIE_ANIMATION_SIZE = 383;
16
+ /**
17
+ * Box width as a multiple of the oval width; the baked arrow tips touch the
18
+ * oval boundary at ≈1.19× — keep this factor below that.
19
+ */
20
+ export const ENHANCED_SMART_SELFIE_ARROW_FIT = 1.15;
19
21
  /** Nudge so the composition's face lands on the oval centre. */
20
22
  export const VERTICAL_ALIGNMENT_OFFSET = -15;
21
23
 
@@ -47,7 +49,10 @@ export function UseSmileIDEnhancedSmartSelfieClip(
47
49
  return null;
48
50
  }
49
51
 
50
- const size = ENHANCED_SMART_SELFIE_ANIMATION_SIZE;
52
+ const size =
53
+ containerWidth *
54
+ FaceOvalDefaults.ovalWidthRatio *
55
+ ENHANCED_SMART_SELFIE_ARROW_FIT;
51
56
  const ovalCenterY = containerHeight * FaceOvalDefaults.ovalCenterYRatio;
52
57
 
53
58
  const containerStyle = {
@@ -56,8 +61,6 @@ export function UseSmileIDEnhancedSmartSelfieClip(
56
61
  top: ovalCenterY - size / 2 + VERTICAL_ALIGNMENT_OFFSET,
57
62
  width: size,
58
63
  height: size,
59
- // Translucent so the face stays the focal point behind the arrow cue.
60
- opacity: ENHANCED_SMART_SELFIE_ANIMATION_OPACITY,
61
64
  };
62
65
 
63
66
  if (reducedMotion) {