@trustchex/react-native-sdk 1.409.0 → 1.464.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/android/src/main/java/com/trustchex/reactnativesdk/TrustchexSDKModule.kt +2 -8
  2. package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +59 -1
  3. package/ios/Camera/TrustchexCameraView.swift +9 -1
  4. package/lib/module/Screens/Debug/NFCScanTestScreen.js +635 -0
  5. package/lib/module/Screens/Dynamic/ContractAcceptanceScreen.js +1 -4
  6. package/lib/module/Screens/Dynamic/IdentityDocumentEIDScanningScreen.js +17 -4
  7. package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +102 -23
  8. package/lib/module/Screens/Dynamic/VerbalConsentScreen.js +1079 -0
  9. package/lib/module/Screens/Dynamic/VideoCallScreen.js +3 -1
  10. package/lib/module/Screens/Static/ResultScreen.js +128 -22
  11. package/lib/module/Screens/Static/VerificationSessionCheckScreen.js +8 -0
  12. package/lib/module/Shared/Animations/recording.json +1 -0
  13. package/lib/module/Shared/Components/DebugNavigationPanel.js +69 -71
  14. package/lib/module/Shared/Components/EIDScanner.js +212 -108
  15. package/lib/module/Shared/Components/IdentityDocumentCamera.flows.js +5 -3
  16. package/lib/module/Shared/Components/IdentityDocumentCamera.js +53 -36
  17. package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +13 -4
  18. package/lib/module/Shared/Components/NavigationManager.js +24 -16
  19. package/lib/module/Shared/EIDReader/aesSecureMessagingWrapper.js +51 -0
  20. package/lib/module/Shared/EIDReader/apduLevelPACECapable.js +3 -0
  21. package/lib/module/Shared/EIDReader/bacKey.js +16 -2
  22. package/lib/module/Shared/EIDReader/eidReader.js +354 -13
  23. package/lib/module/Shared/EIDReader/eidService.js +25 -1
  24. package/lib/module/Shared/EIDReader/nfcManagerCardService.js +4 -7
  25. package/lib/module/Shared/EIDReader/paceInfo.js +85 -0
  26. package/lib/module/Shared/EIDReader/paceKeySpec.js +51 -0
  27. package/lib/module/Shared/EIDReader/protocol/paceAPDUSender.js +100 -0
  28. package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +655 -0
  29. package/lib/module/Shared/EIDReader/protocol/paceResult.js +37 -0
  30. package/lib/module/Shared/EIDReader/secureMessagingWrapper.js +27 -4
  31. package/lib/module/Shared/EIDReader/smartcards/commandAPDU.js +2 -1
  32. package/lib/module/Shared/EIDReader/tlv/tlv.helpers.js +1 -1
  33. package/lib/module/Shared/EIDReader/tlv/tlv.utils.js +6 -3
  34. package/lib/module/Shared/EIDReader/utils/aesCrypto.utils.js +189 -0
  35. package/lib/module/Shared/Libs/analytics.utils.js +4 -0
  36. package/lib/module/Shared/Libs/contains.js +1 -40
  37. package/lib/module/Shared/Libs/country-display.utils.js +34 -0
  38. package/lib/module/Shared/Libs/demo.utils.js +8 -0
  39. package/lib/module/Shared/Libs/mrz.utils.js +3 -2
  40. package/lib/module/Shared/Libs/status-bar.utils.js +4 -2
  41. package/lib/module/Shared/Types/analytics.types.js +2 -0
  42. package/lib/module/Translation/Resources/en.js +41 -2
  43. package/lib/module/Translation/Resources/tr.js +41 -2
  44. package/lib/module/Trustchex.js +54 -20
  45. package/lib/module/version.js +1 -1
  46. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts +3 -0
  47. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts.map +1 -0
  48. package/lib/typescript/src/Screens/Dynamic/ContractAcceptanceScreen.d.ts.map +1 -1
  49. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.d.ts.map +1 -1
  50. package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
  51. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts +3 -0
  52. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts.map +1 -0
  53. package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts.map +1 -1
  54. package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
  55. package/lib/typescript/src/Screens/Static/VerificationSessionCheckScreen.d.ts.map +1 -1
  56. package/lib/typescript/src/Shared/Components/DebugNavigationPanel.d.ts.map +1 -1
  57. package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
  58. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
  59. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts +1 -1
  60. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts.map +1 -1
  61. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +5 -0
  62. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
  63. package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
  64. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts +18 -0
  65. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts.map +1 -0
  66. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts +23 -0
  67. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts.map +1 -0
  68. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts +6 -0
  69. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts.map +1 -1
  70. package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
  71. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts +9 -0
  72. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts.map +1 -1
  73. package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
  74. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts +50 -0
  75. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts.map +1 -0
  76. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts +30 -0
  77. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts.map +1 -0
  78. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts +17 -0
  79. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts.map +1 -0
  80. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts +105 -0
  81. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -0
  82. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts +24 -0
  83. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts.map +1 -0
  84. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts +15 -0
  85. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts.map +1 -1
  86. package/lib/typescript/src/Shared/EIDReader/smartcards/commandAPDU.d.ts.map +1 -1
  87. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts.map +1 -1
  88. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts +39 -0
  89. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts.map +1 -0
  90. package/lib/typescript/src/Shared/Libs/analytics.utils.d.ts.map +1 -1
  91. package/lib/typescript/src/Shared/Libs/contains.d.ts +0 -7
  92. package/lib/typescript/src/Shared/Libs/contains.d.ts.map +1 -1
  93. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts +2 -0
  94. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -0
  95. package/lib/typescript/src/Shared/Libs/demo.utils.d.ts.map +1 -1
  96. package/lib/typescript/src/Shared/Libs/http-client.d.ts +1 -1
  97. package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
  98. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
  99. package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts.map +1 -1
  100. package/lib/typescript/src/Shared/Types/analytics.types.d.ts +2 -0
  101. package/lib/typescript/src/Shared/Types/analytics.types.d.ts.map +1 -1
  102. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts +10 -1
  103. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts.map +1 -1
  104. package/lib/typescript/src/Translation/Resources/en.d.ts +40 -1
  105. package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
  106. package/lib/typescript/src/Translation/Resources/tr.d.ts +40 -1
  107. package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
  108. package/lib/typescript/src/Trustchex.d.ts.map +1 -1
  109. package/lib/typescript/src/version.d.ts +1 -1
  110. package/package.json +7 -4
  111. package/src/Screens/Debug/NFCScanTestScreen.tsx +692 -0
  112. package/src/Screens/Dynamic/ContractAcceptanceScreen.tsx +1 -4
  113. package/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.tsx +21 -4
  114. package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +124 -23
  115. package/src/Screens/Dynamic/VerbalConsentScreen.tsx +1401 -0
  116. package/src/Screens/Dynamic/VideoCallScreen.tsx +3 -1
  117. package/src/Screens/Static/ResultScreen.tsx +183 -31
  118. package/src/Screens/Static/VerificationSessionCheckScreen.tsx +9 -0
  119. package/src/Shared/Animations/recording.json +1 -0
  120. package/src/Shared/Components/DebugNavigationPanel.tsx +73 -48
  121. package/src/Shared/Components/EIDScanner.tsx +222 -111
  122. package/src/Shared/Components/IdentityDocumentCamera.flows.ts +7 -4
  123. package/src/Shared/Components/IdentityDocumentCamera.tsx +199 -184
  124. package/src/Shared/Components/IdentityDocumentCamera.utils.ts +13 -4
  125. package/src/Shared/Components/NavigationManager.tsx +27 -18
  126. package/src/Shared/EIDReader/aesSecureMessagingWrapper.ts +69 -0
  127. package/src/Shared/EIDReader/apduLevelPACECapable.ts +34 -0
  128. package/src/Shared/EIDReader/bacKey.ts +24 -8
  129. package/src/Shared/EIDReader/eidReader.ts +398 -12
  130. package/src/Shared/EIDReader/eidService.ts +49 -1
  131. package/src/Shared/EIDReader/nfcManagerCardService.ts +4 -6
  132. package/src/Shared/EIDReader/paceInfo.ts +159 -0
  133. package/src/Shared/EIDReader/paceKeySpec.ts +56 -0
  134. package/src/Shared/EIDReader/protocol/paceAPDUSender.ts +163 -0
  135. package/src/Shared/EIDReader/protocol/paceProtocol.ts +946 -0
  136. package/src/Shared/EIDReader/protocol/paceResult.ts +62 -0
  137. package/src/Shared/EIDReader/secureMessagingWrapper.ts +28 -10
  138. package/src/Shared/EIDReader/smartcards/commandAPDU.ts +2 -1
  139. package/src/Shared/EIDReader/tlv/tlv.helpers.ts +1 -1
  140. package/src/Shared/EIDReader/tlv/tlv.utils.ts +8 -5
  141. package/src/Shared/EIDReader/utils/aesCrypto.utils.ts +217 -0
  142. package/src/Shared/Libs/analytics.utils.ts +4 -0
  143. package/src/Shared/Libs/contains.ts +0 -53
  144. package/src/Shared/Libs/country-display.utils.ts +55 -0
  145. package/src/Shared/Libs/crypto.utils.ts +2 -2
  146. package/src/Shared/Libs/demo.utils.ts +10 -0
  147. package/src/Shared/Libs/http-client.ts +12 -4
  148. package/src/Shared/Libs/mrz.utils.ts +3 -2
  149. package/src/Shared/Libs/status-bar.utils.ts +4 -2
  150. package/src/Shared/Services/VideoSessionService.ts +1 -1
  151. package/src/Shared/Types/analytics.types.ts +2 -0
  152. package/src/Shared/Types/identificationInfo.ts +11 -0
  153. package/src/Translation/Resources/en.ts +63 -3
  154. package/src/Translation/Resources/tr.ts +62 -3
  155. package/src/Trustchex.tsx +53 -17
  156. package/src/version.ts +1 -1
@@ -3,13 +3,12 @@
3
3
  import Svg, { Rect as SvgRect, Circle, Mask } from 'react-native-svg';
4
4
  import { useNavigation } from '@react-navigation/native';
5
5
  import React, { useState, useReducer, useContext, useEffect, useCallback, useRef } from 'react';
6
- import { StyleSheet, Text, View, Dimensions, Vibration, StatusBar } from 'react-native';
6
+ import { Animated, Easing, StyleSheet, Text, View, Dimensions, Platform, Vibration, StatusBar } from 'react-native';
7
7
  import { useSafeAreaInsets, SafeAreaView } from 'react-native-safe-area-context';
8
8
  import NativeCircularProgress from "../../Shared/Components/NativeCircularProgress.js";
9
9
  import FaceCamera from "../../Shared/Components/FaceCamera.js";
10
10
  import NavigationManager from "../../Shared/Components/NavigationManager.js";
11
11
  import AppContext from "../../Shared/Contexts/AppContext.js";
12
- import { contains } from "../../Shared/Libs/contains.js";
13
12
  import { useTranslation } from 'react-i18next';
14
13
  import StyledButton from "../../Shared/Components/StyledButton.js";
15
14
  import LottieView from 'lottie-react-native';
@@ -22,7 +21,7 @@ const {
22
21
  width: windowWidth,
23
22
  height: windowHeight
24
23
  } = Dimensions.get('window');
25
- const PREVIEW_SIZE = windowWidth * 0.8;
24
+ const PREVIEW_SIZE = windowWidth * 0.95;
26
25
  const PREVIEW_RECT = {
27
26
  minX: (windowWidth - PREVIEW_SIZE) / 2,
28
27
  minY: (windowHeight - PREVIEW_SIZE) / 2,
@@ -44,9 +43,29 @@ const LivenessDetectionScreen = () => {
44
43
  const [isRecording, setIsRecording] = useState(false);
45
44
  const insets = useSafeAreaInsets();
46
45
  const referenceFaceTrackingId = useRef(null);
46
+ const recordingDotOpacity = useRef(new Animated.Value(1)).current;
47
47
 
48
48
  // Track screen view and exit
49
49
  useScreenTracking('liveness_detection');
50
+ useEffect(() => {
51
+ if (isRecording) {
52
+ const pulse = Animated.loop(Animated.sequence([Animated.timing(recordingDotOpacity, {
53
+ toValue: 0.2,
54
+ duration: 600,
55
+ easing: Easing.inOut(Easing.ease),
56
+ useNativeDriver: true
57
+ }), Animated.timing(recordingDotOpacity, {
58
+ toValue: 1,
59
+ duration: 600,
60
+ easing: Easing.inOut(Easing.ease),
61
+ useNativeDriver: true
62
+ })]));
63
+ pulse.start();
64
+ return () => pulse.stop();
65
+ } else {
66
+ recordingDotOpacity.setValue(1);
67
+ }
68
+ }, [isRecording, recordingDotOpacity]);
50
69
 
51
70
  // Configure status bar for white background
52
71
  useStatusBarWhiteBackground();
@@ -113,7 +132,9 @@ const LivenessDetectionScreen = () => {
113
132
  } else {
114
133
  // Guide screen with white background - use dark icons
115
134
  StatusBar.setBarStyle('dark-content', true);
116
- StatusBar.setBackgroundColor('#ffffff', true);
135
+ if (Platform.OS === 'android') {
136
+ StatusBar.setBackgroundColor('#ffffff', true);
137
+ }
117
138
  }
118
139
  }, [hasGuideShown]);
119
140
  useEffect(() => {
@@ -195,6 +216,13 @@ const LivenessDetectionScreen = () => {
195
216
  const rightOpen = face.rightEyeOpenProbability ?? 0;
196
217
  return leftOpen >= 0.8 && rightOpen >= 0.8;
197
218
  };
219
+ const areEyesVisible = face => {
220
+ // Relaxed check: eyes just need to be detected (not fully closed).
221
+ // Smiling naturally causes squinting, so a lower threshold is used.
222
+ const leftOpen = face.leftEyeOpenProbability ?? 0;
223
+ const rightOpen = face.rightEyeOpenProbability ?? 0;
224
+ return leftOpen >= 0.3 && rightOpen >= 0.3;
225
+ };
198
226
  const instructionReducer = (state, action) => {
199
227
  switch (action.type) {
200
228
  case 'RESET':
@@ -386,25 +414,33 @@ const LivenessDetectionScreen = () => {
386
414
  });
387
415
  }
388
416
 
389
- // Calculate preview rect in frame coordinates (not screen coordinates)
390
- // Preview circle is 80% of frame width, centered
391
- const previewSizeInFrame = frameWidth * 0.8;
417
+ // Map the on-screen circle into frame coordinates.
418
+ // Camera uses FILL_CENTER / resizeAspectFill (cover): uniform scale filling
419
+ // the view, cropping overflow symmetrically.
420
+ const coverScale = Math.max(windowWidth / frameWidth, windowHeight / frameHeight);
421
+ const offsetX = (frameWidth - windowWidth / coverScale) / 2;
422
+ const offsetY = (frameHeight - windowHeight / coverScale) / 2;
392
423
  const previewRectInFrame = {
393
- minX: (frameWidth - previewSizeInFrame) / 2,
394
- minY: (frameHeight - previewSizeInFrame) / 2,
395
- width: previewSizeInFrame,
396
- height: previewSizeInFrame
397
- };
398
- const faceRectSmaller = {
399
- width: face.bounds.width - PREVIEW_EDGE_OFFSET,
400
- height: face.bounds.height - PREVIEW_EDGE_OFFSET,
401
- minY: face.bounds.y + PREVIEW_EDGE_OFFSET / 2,
402
- minX: face.bounds.x + PREVIEW_EDGE_OFFSET / 2
424
+ minX: PREVIEW_RECT.minX / coverScale + offsetX,
425
+ minY: PREVIEW_RECT.minY / coverScale + offsetY,
426
+ width: PREVIEW_RECT.width / coverScale,
427
+ height: PREVIEW_RECT.height / coverScale
403
428
  };
404
- const previewContainsFace = contains({
405
- outside: previewRectInFrame,
406
- inside: faceRectSmaller
407
- });
429
+ const previewSizeInFrame = PREVIEW_RECT.width / coverScale;
430
+
431
+ // Check containment using face center + yaw-stable core radius.
432
+ // When the head turns (yaw), the bounding box grows wider but height stays
433
+ // constant — so min(width, height)/2 gives a stable size that doesn't
434
+ // falsely trigger an outside-circle reset during TURN_HEAD_LEFT/RIGHT.
435
+ const faceCenterX = face.bounds.x + face.bounds.width / 2;
436
+ const faceCenterY = face.bounds.y + face.bounds.height / 2;
437
+ const faceCoreRadius = Math.max(0, Math.min(face.bounds.width, face.bounds.height) / 2 - PREVIEW_EDGE_OFFSET / 2);
438
+ const circleCX = previewRectInFrame.minX + previewRectInFrame.width / 2;
439
+ const circleCY = previewRectInFrame.minY + previewRectInFrame.height / 2;
440
+ const circleR = previewSizeInFrame / 2;
441
+ const faceDx = faceCenterX - circleCX;
442
+ const faceDy = faceCenterY - circleCY;
443
+ const previewContainsFace = faceDx * faceDx + faceDy * faceDy <= (circleR - faceCoreRadius) * (circleR - faceCoreRadius);
408
444
  const multipleFacesDetected = faces.length > 1;
409
445
  if (!isImageBright) {
410
446
  // Brightness too low - reset progress if we've started the flow
@@ -564,8 +600,9 @@ const LivenessDetectionScreen = () => {
564
600
  // Ensure user is looking at camera (face direction check)
565
601
  const isFacingCamera = instructions.SMILE.minAngle < face.yawAngle && face.yawAngle < instructions.SMILE.maxAngle && instructions.SMILE.minAngle < face.pitchAngle && face.pitchAngle < instructions.SMILE.maxAngle;
566
602
 
567
- // Check if smiling with sufficient probability AND looking at camera AND eyes open
568
- if (smilingProb >= instructions.SMILE.minProbability && isFacingCamera && areEyesOpen(face)) {
603
+ // Check if smiling with sufficient probability AND looking at camera AND eyes visible
604
+ // Use relaxed eye check smiling naturally causes squinting
605
+ if (smilingProb >= instructions.SMILE.minProbability && isFacingCamera && areEyesVisible(face)) {
569
606
  instructions.SMILE.photo = image;
570
607
  dispatch({
571
608
  type: 'NEXT_INSTRUCTION',
@@ -711,6 +748,21 @@ const LivenessDetectionScreen = () => {
711
748
  fill: "white",
712
749
  mask: "url(#hole-mask)"
713
750
  })]
751
+ }), isRecording && /*#__PURE__*/_jsx(View, {
752
+ style: [styles.recordingIndicatorContainer, {
753
+ top: PREVIEW_RECT.minY - 40
754
+ }],
755
+ children: /*#__PURE__*/_jsxs(View, {
756
+ style: styles.recordingIndicator,
757
+ children: [/*#__PURE__*/_jsx(Animated.View, {
758
+ style: [styles.recordingDot, {
759
+ opacity: recordingDotOpacity
760
+ }]
761
+ }), /*#__PURE__*/_jsx(Text, {
762
+ style: styles.recordingText,
763
+ children: "REC"
764
+ })]
765
+ })
714
766
  }), /*#__PURE__*/_jsx(View, {
715
767
  style: [styles.instructionsContainerBottom, {
716
768
  top: PREVIEW_RECT.minY + PREVIEW_SIZE + 20
@@ -836,6 +888,33 @@ const styles = StyleSheet.create({
836
888
  width: '100%',
837
889
  zIndex: 1
838
890
  },
891
+ recordingIndicatorContainer: {
892
+ position: 'absolute',
893
+ width: '100%',
894
+ alignItems: 'center',
895
+ zIndex: 2
896
+ },
897
+ recordingIndicator: {
898
+ flexDirection: 'row',
899
+ alignItems: 'center',
900
+ gap: 8,
901
+ backgroundColor: 'rgba(0, 0, 0, 0.6)',
902
+ paddingVertical: 6,
903
+ paddingHorizontal: 14,
904
+ borderRadius: 20
905
+ },
906
+ recordingDot: {
907
+ width: 10,
908
+ height: 10,
909
+ borderRadius: 5,
910
+ backgroundColor: '#ef4444'
911
+ },
912
+ recordingText: {
913
+ color: '#ffffff',
914
+ fontSize: 14,
915
+ fontWeight: '700',
916
+ letterSpacing: 1
917
+ },
839
918
  guide: {
840
919
  flex: 1,
841
920
  display: 'flex',