react-native-inapp-inspector 2.3.13 → 2.3.14

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 (231) hide show
  1. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  2. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  3. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  4. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  6. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  7. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  8. package/android/.gradle/8.9/gc.properties +0 -0
  9. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  10. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  11. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  12. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  13. package/android/.gradle/9.2.0/gc.properties +0 -0
  14. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  15. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  16. package/android/.gradle/vcs-1/gc.properties +0 -0
  17. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/results.bin +1 -0
  18. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/transformed/classes/classes_dex/classes.dex +0 -0
  19. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/results.bin +1 -0
  20. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/BuildConfig.dex +0 -0
  21. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView$iconView$1.dex +0 -0
  22. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView.dex +0 -0
  23. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NativeNetworkInspectorSpec.dex +0 -0
  24. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$Companion.dex +0 -0
  25. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$frameCallback$1.dex +0 -0
  26. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$shakeListener$1.dex +0 -0
  27. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule.dex +0 -0
  28. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorPackage.dex +0 -0
  29. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  30. package/android/build/generated/source/buildConfig/debug/com/inappinspector/BuildConfig.java +10 -0
  31. package/android/build/generated/source/codegen/java/com/inappinspector/NativeNetworkInspectorSpec.java +104 -0
  32. package/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  33. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec-generated.cpp +128 -0
  34. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec.h +31 -0
  35. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.cpp +22 -0
  36. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.h +24 -0
  37. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.cpp +16 -0
  38. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.h +17 -0
  39. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.cpp +19 -0
  40. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.h +18 -0
  41. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/RNInAppInspectorSpecJSI.h +177 -0
  42. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.cpp +17 -0
  43. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.h +23 -0
  44. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.cpp +16 -0
  45. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.h +20 -0
  46. package/android/build/generated/source/codegen/schema.json +1 -0
  47. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +7 -0
  48. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  49. package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
  50. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  51. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  52. package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  53. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  54. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  55. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  56. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
  57. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  58. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  59. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  60. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  61. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  62. package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  63. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/BuildConfig.class +0 -0
  64. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  65. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +2 -0
  66. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +7 -0
  67. package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-inapp-inspector.jar +0 -0
  68. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +7 -0
  69. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  70. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  71. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  72. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/BuildConfig.class +0 -0
  73. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  74. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  75. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  76. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  77. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  78. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  79. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule.class +0 -0
  80. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorPackage.class +0 -0
  81. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  82. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +1 -0
  83. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  84. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  85. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  86. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  87. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  88. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  89. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  90. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  91. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  92. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  93. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  94. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  95. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  96. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  97. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  98. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  99. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  100. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  101. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  102. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  103. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  104. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  105. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  106. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  107. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  108. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  109. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  110. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  111. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  112. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  113. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  114. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  115. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  116. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  117. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  118. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  119. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  120. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  121. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  122. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  123. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  124. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  125. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  126. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  127. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  128. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  129. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  130. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  131. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  132. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  133. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  134. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  135. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  136. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  137. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  138. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  139. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  140. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  141. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  142. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  143. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  144. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  145. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  146. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +2 -0
  147. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  148. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  149. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  150. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  151. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  152. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  153. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  154. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  155. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  156. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  157. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  158. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  159. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  160. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  161. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  162. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  163. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  164. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  165. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  166. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  167. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  168. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  169. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  170. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  171. package/android/build/outputs/aar/react-native-inapp-inspector-debug.aar +0 -0
  172. package/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  173. package/android/build/reports/problems/problems-report.html +659 -0
  174. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  175. package/android/build/tmp/kotlin-classes/debug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  176. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  177. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  178. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  179. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  180. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  181. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule.class +0 -0
  182. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorPackage.class +0 -0
  183. package/bin/cli.js +6 -0
  184. package/dist/commonjs/components/Inspector/DebuggingTab.js +741 -438
  185. package/dist/commonjs/components/Inspector/MainScreen.js +4 -1
  186. package/dist/commonjs/components/Inspector/SettingsPanel.js +6 -4
  187. package/dist/commonjs/components/Inspector/TabBar.js +6 -2
  188. package/dist/commonjs/components/QRCodeView.js +1 -1
  189. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -3
  190. package/dist/commonjs/constants/telemetryConfig.js +3 -3
  191. package/dist/commonjs/constants/version.d.ts +1 -1
  192. package/dist/commonjs/constants/version.js +1 -1
  193. package/dist/commonjs/helpers/index.d.ts +1 -0
  194. package/dist/commonjs/helpers/index.js +11 -1
  195. package/dist/commonjs/helpers/qrGenerator.d.ts +1 -0
  196. package/dist/commonjs/helpers/qrGenerator.js +356 -33
  197. package/dist/commonjs/index.d.ts +1 -0
  198. package/dist/commonjs/index.js +5 -3
  199. package/dist/commonjs/metro.d.ts +25 -0
  200. package/dist/commonjs/metro.js +478 -0
  201. package/dist/esm/components/Inspector/DebuggingTab.js +744 -441
  202. package/dist/esm/components/Inspector/MainScreen.js +4 -1
  203. package/dist/esm/components/Inspector/SettingsPanel.js +7 -5
  204. package/dist/esm/components/Inspector/TabBar.js +7 -3
  205. package/dist/esm/components/QRCodeView.js +1 -1
  206. package/dist/esm/constants/telemetryConfig.d.ts +3 -3
  207. package/dist/esm/constants/telemetryConfig.js +3 -3
  208. package/dist/esm/constants/version.d.ts +1 -1
  209. package/dist/esm/constants/version.js +1 -1
  210. package/dist/esm/helpers/index.d.ts +1 -0
  211. package/dist/esm/helpers/index.js +9 -0
  212. package/dist/esm/helpers/qrGenerator.d.ts +1 -0
  213. package/dist/esm/helpers/qrGenerator.js +356 -30
  214. package/dist/esm/index.d.ts +1 -0
  215. package/dist/esm/index.js +3 -2
  216. package/dist/esm/metro.d.ts +25 -0
  217. package/dist/esm/metro.js +469 -0
  218. package/metro.d.ts +1 -0
  219. package/metro.js +1 -0
  220. package/package.json +16 -5
  221. package/src/components/Inspector/DebuggingTab.tsx +842 -514
  222. package/src/components/Inspector/MainScreen.tsx +4 -1
  223. package/src/components/Inspector/SettingsPanel.tsx +85 -75
  224. package/src/components/Inspector/TabBar.tsx +16 -2
  225. package/src/components/QRCodeView.tsx +2 -2
  226. package/src/constants/telemetryConfig.ts +5 -3
  227. package/src/constants/version.ts +1 -1
  228. package/src/helpers/index.ts +15 -0
  229. package/src/helpers/qrGenerator.ts +418 -37
  230. package/src/index.tsx +5 -3
  231. package/src/metro.ts +598 -0
@@ -1,14 +1,15 @@
1
- import React, {useState, useEffect, useMemo, useCallback} from 'react';
1
+ import React, {useState, useEffect, useMemo, useCallback, useRef} from 'react';
2
2
  import {
3
3
  View,
4
4
  Text,
5
5
  ScrollView,
6
6
  StyleSheet,
7
- TextInput,
8
- TouchableOpacity,
9
7
  NativeModules,
10
- Platform,
11
8
  Share,
9
+ TouchableOpacity,
10
+ ActivityIndicator,
11
+ Animated,
12
+ Platform,
12
13
  } from 'react-native';
13
14
  import {useInspector} from './InspectorContext';
14
15
  import {AppColors} from '../../styles/AppColors';
@@ -18,33 +19,40 @@ import TouchableScale from '../TouchableScale';
18
19
  import CopyButton from '../CopyButton';
19
20
  import {copyToClipboard} from '../../helpers';
20
21
  import {showToast} from '../../helpers/toast';
21
- import {useTranslation} from '../../i18n';
22
+ import {triggerNativeHaptic} from '../../native/NativeInspector';
22
23
  import {
24
+ PackageIcon,
25
+ InfoCircleIcon,
26
+ CheckIcon,
23
27
  BoltIcon,
24
- GlobeIcon,
25
- ClockIcon,
26
- CircleCheckIcon,
27
28
  CircleXIcon,
28
- SmartphoneIcon,
29
- PackageIcon,
30
- TerminalIcon,
29
+ CopyIcon,
31
30
  ExternalLinkIcon,
31
+ SparkleIcon,
32
+ AndroidIcon,
32
33
  RepeatIcon,
33
- ShieldAlertIcon,
34
- InfoCircleIcon,
35
34
  } from '../NetworkIcons';
35
+ import Svg, {Path} from 'react-native-svg';
36
36
 
37
- interface PortStatus {
38
- port: number;
39
- status: 'checking' | 'active' | 'inactive';
40
- latencyMs?: number;
41
- }
37
+ const TerminalConsoleIcon = ({color = AppColors.purple, size = 13}: {color?: string; size?: number}) => (
38
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
39
+ <Path d="M4 17l6-6-6-6M12 19h8" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
40
+ </Svg>
41
+ );
42
42
 
43
- const COMMON_PORTS = [8081, 8082, 8083, 19000];
43
+ interface BuildStatusData {
44
+ status: 'idle' | 'running' | 'completed' | 'failed';
45
+ scheme: string;
46
+ clean: boolean;
47
+ progress: number;
48
+ currentTask: string;
49
+ logs?: string[];
50
+ error: string | null;
51
+ apkName: string | null;
52
+ apkSize: number | null;
53
+ }
44
54
 
45
55
  export const DebuggingTab: React.FC = () => {
46
- const {t} = useTranslation();
47
-
48
56
  // Auto-detect host IP and initial port from NativeModules.SourceCode.scriptURL
49
57
  const detectedConfig = useMemo(() => {
50
58
  const scriptURL = NativeModules.SourceCode?.scriptURL || '';
@@ -70,705 +78,1025 @@ export const DebuggingTab: React.FC = () => {
70
78
  }, []);
71
79
 
72
80
  const [hostIp, setHostIp] = useState<string>(() => {
73
- // If localhost or 127.0.0.1 or 10.0.2.2, default to 192.168.1.1 or detected host
74
81
  if (
75
- detectedConfig.host === 'localhost' ||
76
- detectedConfig.host === '127.0.0.1' ||
77
- detectedConfig.host === '10.0.2.2'
82
+ detectedConfig.host &&
83
+ detectedConfig.host !== 'localhost' &&
84
+ detectedConfig.host !== '127.0.0.1' &&
85
+ detectedConfig.host !== '10.0.2.2'
78
86
  ) {
79
- return '192.168.1.15';
87
+ return detectedConfig.host;
80
88
  }
81
- return detectedConfig.host;
89
+ return '192.168.1.2';
90
+ });
91
+
92
+ const [port, setPort] = useState<number>(detectedConfig.port || 8083);
93
+ const [apkFileName, setApkFileName] = useState<string>('app-debug.apk');
94
+ const [apkSizeMb, setApkSizeMb] = useState<string | null>(null);
95
+
96
+ // Build generation state
97
+ const [selectedScheme, setSelectedScheme] = useState<'assembleRelease' | 'assembleDebug'>('assembleRelease');
98
+ const [isCleanBuild, setIsCleanBuild] = useState<boolean>(true);
99
+ const [buildStatus, setBuildStatus] = useState<BuildStatusData>({
100
+ status: 'idle',
101
+ scheme: 'assembleRelease',
102
+ clean: true,
103
+ progress: 0,
104
+ currentTask: '',
105
+ error: null,
106
+ apkName: null,
107
+ apkSize: null,
82
108
  });
83
109
 
84
- const [selectedPort, setSelectedPort] = useState<number>(detectedConfig.port);
85
- const [apkPath, setApkPath] = useState<string>('app-debug.apk');
86
- const [activeQrTab, setActiveQrTab] = useState<'metro' | 'apk' | 'host'>('metro');
87
- const [isAutoDetecting, setIsAutoDetecting] = useState<boolean>(false);
88
- const [portsStatus, setPortsStatus] = useState<Record<number, PortStatus>>({});
110
+ const pollingRef = useRef<NodeJS.Timeout | null>(null);
111
+ const progressAnim = useRef(new Animated.Value(0)).current;
112
+ const [showVerboseLogs, setShowVerboseLogs] = useState<boolean>(true);
113
+ const verboseScrollRef = useRef<ScrollView | null>(null);
89
114
 
90
- // Auto-probe ports on mount
91
- const probePorts = useCallback(async () => {
92
- setIsAutoDetecting(true);
93
- const results: Record<number, PortStatus> = {};
115
+ // Animate progress bar smoothly
116
+ useEffect(() => {
117
+ Animated.timing(progressAnim, {
118
+ toValue: Math.max(0, Math.min(100, buildStatus.progress)),
119
+ duration: 350,
120
+ useNativeDriver: false,
121
+ }).start();
122
+ }, [buildStatus.progress, progressAnim]);
94
123
 
95
- for (const p of COMMON_PORTS) {
96
- results[p] = {port: p, status: 'checking'};
124
+ // Auto-scroll verbose console to bottom
125
+ useEffect(() => {
126
+ if (buildStatus.logs && buildStatus.logs.length > 0) {
127
+ setTimeout(() => {
128
+ verboseScrollRef.current?.scrollToEnd({ animated: true });
129
+ }, 50);
97
130
  }
98
- setPortsStatus({...results});
131
+ }, [buildStatus.logs]);
132
+
133
+ // Auto-fetch dynamic IP and APK metadata from Metro / Standalone Server
134
+ const fetchMetroTelemetry = useCallback(async () => {
135
+ const hostsToTry = Array.from(
136
+ new Set([detectedConfig.host, '10.0.2.2', 'localhost', '127.0.0.1'].filter(Boolean)),
137
+ );
138
+ const portsToTry = Array.from(
139
+ new Set([detectedConfig.port, 8083, 8081, 8082].filter(Boolean)),
140
+ );
141
+
142
+ for (const h of hostsToTry) {
143
+ for (const p of portsToTry) {
144
+ try {
145
+ const controller = new AbortController();
146
+ const timeoutId = setTimeout(() => controller.abort(), 1200);
147
+ const res = await fetch(`http://${h}:${p}/__inapp_inspector/apk-info`, {
148
+ signal: controller.signal,
149
+ });
150
+ clearTimeout(timeoutId);
151
+ if (res.ok) {
152
+ const data = await res.json();
153
+ if (
154
+ data.hostIp &&
155
+ data.hostIp !== '127.0.0.1' &&
156
+ data.hostIp !== 'localhost' &&
157
+ data.hostIp !== '10.0.2.2'
158
+ ) {
159
+ setHostIp(data.hostIp);
160
+ }
161
+ if (data.port) {
162
+ setPort(data.port);
163
+ }
164
+ if (data.apkName) {
165
+ setApkFileName(data.apkName);
166
+ }
167
+ if (data.apkSize) {
168
+ setApkSizeMb((data.apkSize / (1024 * 1024)).toFixed(1));
169
+ }
170
+ return;
171
+ }
172
+ } catch {}
173
+ }
174
+ }
175
+ }, [detectedConfig.host, detectedConfig.port]);
176
+
177
+ useEffect(() => {
178
+ fetchMetroTelemetry();
179
+ }, [fetchMetroTelemetry]);
99
180
 
100
- let foundActivePort: number | null = null;
181
+ // Clean up polling interval on unmount
182
+ useEffect(() => {
183
+ return () => {
184
+ if (pollingRef.current) {
185
+ clearInterval(pollingRef.current);
186
+ }
187
+ };
188
+ }, []);
101
189
 
102
- for (const p of COMMON_PORTS) {
103
- const startTime = Date.now();
190
+ // Poll build status from Metro
191
+ const pollBuildStatus = useCallback(() => {
192
+ if (pollingRef.current) clearInterval(pollingRef.current);
193
+
194
+ const targetHost = detectedConfig.host || '10.0.2.2';
195
+ pollingRef.current = setInterval(async () => {
104
196
  try {
105
- const controller = new AbortController();
106
- const timeoutId = setTimeout(() => controller.abort(), 1500);
107
- // Ping /status endpoint of Metro Bundler
108
- const res = await fetch(`http://localhost:${p}/status`, {
109
- signal: controller.signal,
110
- });
111
- clearTimeout(timeoutId);
112
- const text = await res.text();
113
- const latency = Date.now() - startTime;
114
-
115
- if (res.ok && text.includes('packager-status:running')) {
116
- results[p] = {port: p, status: 'active', latencyMs: latency};
117
- if (!foundActivePort) foundActivePort = p;
118
- } else {
119
- results[p] = {port: p, status: 'inactive'};
197
+ const res = await fetch(`http://${targetHost}:${port}/__inapp_inspector/build-status`);
198
+ if (res.ok) {
199
+ const data: BuildStatusData = await res.json();
200
+ setBuildStatus(data);
201
+
202
+ if (data.status === 'completed') {
203
+ if (pollingRef.current) clearInterval(pollingRef.current);
204
+ triggerNativeHaptic('success');
205
+ showToast('✓ APK Build Generated Successfully!');
206
+ if (data.apkSize) {
207
+ setApkSizeMb((data.apkSize / (1024 * 1024)).toFixed(1));
208
+ }
209
+ if (data.apkName) {
210
+ setApkFileName(data.apkName);
211
+ }
212
+ fetchMetroTelemetry();
213
+ } else if (data.status === 'failed') {
214
+ if (pollingRef.current) clearInterval(pollingRef.current);
215
+ triggerNativeHaptic('error');
216
+ showToast('✕ Build Failed: ' + (data.error || 'Gradle error'));
217
+ }
120
218
  }
121
- } catch {
122
- results[p] = {port: p, status: 'inactive'};
219
+ } catch {}
220
+ }, 1000);
221
+ }, [detectedConfig.host, port, fetchMetroTelemetry]);
222
+
223
+ // Start Gradle build on computer via Metro / Standalone Server
224
+ const handleStartBuild = async () => {
225
+ triggerNativeHaptic('medium');
226
+ setBuildStatus({
227
+ status: 'running',
228
+ scheme: selectedScheme,
229
+ clean: isCleanBuild,
230
+ progress: 5,
231
+ currentTask: isCleanBuild ? 'Cleaning build cache...' : 'Initializing build...',
232
+ error: null,
233
+ apkName: null,
234
+ apkSize: null,
235
+ });
236
+
237
+ const hostsToTry = Array.from(
238
+ new Set([detectedConfig.host, '10.0.2.2', 'localhost', '127.0.0.1'].filter(Boolean)),
239
+ );
240
+ const portsToTry = Array.from(new Set([port, 8083, 8081, 8082].filter(Boolean)));
241
+
242
+ let buildTriggered = false;
243
+
244
+ for (const h of hostsToTry) {
245
+ for (const p of portsToTry) {
246
+ try {
247
+ const controller = new AbortController();
248
+ const timeoutId = setTimeout(() => controller.abort(), 2000);
249
+ const res = await fetch(
250
+ `http://${h}:${p}/__inapp_inspector/build-apk?scheme=${selectedScheme}&clean=${isCleanBuild}`,
251
+ { signal: controller.signal },
252
+ );
253
+ clearTimeout(timeoutId);
254
+ if (res.ok) {
255
+ buildTriggered = true;
256
+ pollBuildStatus();
257
+ return;
258
+ }
259
+ } catch {}
123
260
  }
124
- setPortsStatus({...results});
125
261
  }
126
262
 
127
- if (foundActivePort) {
128
- setSelectedPort(foundActivePort);
129
- showToast(`Detected Metro running on Port ${foundActivePort}!`);
263
+ if (!buildTriggered) {
264
+ setBuildStatus(prev => ({
265
+ ...prev,
266
+ status: 'failed',
267
+ error: 'Cannot reach build server. Ensure npm start or npm run serve-apk is running on host.',
268
+ }));
130
269
  }
270
+ };
131
271
 
132
- setIsAutoDetecting(false);
133
- }, []);
272
+ // Stop Gradle build on computer via Metro / Standalone Server
273
+ const handleStopBuild = async () => {
274
+ triggerNativeHaptic('warning');
275
+ if (pollingRef.current) clearInterval(pollingRef.current);
134
276
 
135
- useEffect(() => {
136
- probePorts();
137
- }, [probePorts]);
277
+ const hostsToTry = Array.from(
278
+ new Set([detectedConfig.host, '10.0.2.2', 'localhost', '127.0.0.1'].filter(Boolean)),
279
+ );
280
+ const portsToTry = Array.from(new Set([port, 8083, 8081, 8082].filter(Boolean)));
281
+
282
+ for (const h of hostsToTry) {
283
+ for (const p of portsToTry) {
284
+ try {
285
+ const controller = new AbortController();
286
+ const timeoutId = setTimeout(() => controller.abort(), 1500);
287
+ await fetch(`http://${h}:${p}/__inapp_inspector/stop-build`, {
288
+ signal: controller.signal,
289
+ });
290
+ clearTimeout(timeoutId);
291
+ } catch {}
292
+ }
293
+ }
138
294
 
139
- // Construct target URLs for QR codes
140
- const metroBundleUrl = `http://${hostIp}:${selectedPort}/index.bundle?platform=android&dev=true`;
141
- const directServerUrl = `http://${hostIp}:${selectedPort}`;
142
- const apkDownloadUrl = `http://${hostIp}:${selectedPort}/${apkPath}`;
143
- const devSettingsHost = `${hostIp}:${selectedPort}`;
295
+ setBuildStatus(prev => ({
296
+ ...prev,
297
+ status: 'idle',
298
+ currentTask: 'Build cancelled by user',
299
+ logs: [...(prev.logs || []), '🛑 Build cancelled by user.'],
300
+ }));
301
+ showToast('Build cancelled');
302
+ };
144
303
 
145
- const currentQrValue = useMemo(() => {
146
- if (activeQrTab === 'apk') return apkDownloadUrl;
147
- if (activeQrTab === 'host') return devSettingsHost;
148
- return directServerUrl;
149
- }, [activeQrTab, apkDownloadUrl, devSettingsHost, directServerUrl]);
304
+ // Construct target download URL
305
+ const apkDownloadUrl = `http://${hostIp}:${port}/${apkFileName.replace(/^\/+/, '')}`;
150
306
 
151
- const activePortInfo = portsStatus[selectedPort];
307
+ const handleShare = () => {
308
+ triggerNativeHaptic('light');
309
+ Share.share({
310
+ message: apkDownloadUrl,
311
+ title: 'Install Android APK',
312
+ });
313
+ };
314
+
315
+ const isBuilding = buildStatus.status === 'running';
152
316
 
153
317
  return (
154
318
  <ScrollView
155
- style={styles.container}
156
- contentContainerStyle={styles.content}
319
+ style={styles.scrollArea}
320
+ contentContainerStyle={styles.scrollContent}
157
321
  showsVerticalScrollIndicator={false}>
158
- {/* ─── Top Live Server Status Banner ────────────────────────────── */}
159
- <View style={styles.serverCard}>
160
- <View style={styles.serverCardTop}>
161
- <View style={styles.serverStatusLeft}>
162
- <View
163
- style={[
164
- styles.statusDot,
165
- {
166
- backgroundColor:
167
- activePortInfo?.status === 'active'
168
- ? AppColors.greenColor
169
- : activePortInfo?.status === 'checking'
170
- ? AppColors.warningIconGold
171
- : AppColors.errorColor,
172
- },
173
- ]}
174
- />
175
- <View>
176
- <View style={{flexDirection: 'row', alignItems: 'center', gap: 6}}>
177
- <Text style={styles.serverTitle}>Metro Dev Server</Text>
178
- <View style={styles.portPill}>
179
- <Text style={styles.portPillText}>Port {selectedPort}</Text>
180
- </View>
181
- </View>
182
- <Text style={styles.serverSubtitle}>
183
- {activePortInfo?.status === 'active'
184
- ? `Active & Bundling (${activePortInfo.latencyMs}ms)`
185
- : activePortInfo?.status === 'checking'
186
- ? 'Probing Metro Ports...'
187
- : 'Standby / Select active port'}
188
- </Text>
189
- </View>
322
+ {/* ─── Hero Card: Multi-Device APK Installer ───────────────────── */}
323
+ <View style={styles.heroCard}>
324
+ <View style={styles.heroHeader}>
325
+ <View style={styles.heroIconWrap}>
326
+ <AndroidIcon size={20} color={AppColors.white} />
327
+ </View>
328
+ <View style={{flex: 1, minWidth: 0}}>
329
+ <Text style={styles.heroTitle} numberOfLines={1}>
330
+ Multi-Device APK Installer
331
+ </Text>
332
+ <Text style={styles.heroSubtitle} numberOfLines={1}>
333
+ Scan QR code with another Android device to download
334
+ </Text>
335
+ </View>
336
+ <View style={styles.heroBadge}>
337
+ <View style={styles.pulseDot} />
338
+ <Text style={styles.heroBadgeText}>Live Metro</Text>
190
339
  </View>
191
-
192
- <TouchableScale
193
- onPress={probePorts}
194
- style={styles.scanBtn}
195
- hitSlop={8}>
196
- <RepeatIcon size={12} color={AppColors.purple} />
197
- <Text style={styles.scanBtnText}>Re-scan</Text>
198
- </TouchableScale>
199
340
  </View>
200
341
 
201
- {/* Port Selector Chips */}
202
- <View style={styles.portsRow}>
203
- {COMMON_PORTS.map(p => {
204
- const isSelected = selectedPort === p;
205
- const pInfo = portsStatus[p];
206
- const isActive = pInfo?.status === 'active';
207
- return (
208
- <TouchableOpacity
209
- key={p}
210
- activeOpacity={0.7}
211
- onPress={() => setSelectedPort(p)}
212
- style={[
213
- styles.portChip,
214
- isSelected && styles.portChipSelected,
215
- isActive && {borderColor: AppColors.greenColor},
216
- ]}>
217
- <View
218
- style={[
219
- styles.portMiniDot,
220
- {
221
- backgroundColor: isActive
222
- ? AppColors.greenColor
223
- : AppColors.grayTextWeak,
224
- },
225
- ]}
226
- />
227
- <Text
228
- style={[
229
- styles.portChipText,
230
- isSelected && styles.portChipTextSelected,
231
- ]}>
232
- {p}
233
- </Text>
234
- {isActive && (
235
- <View style={styles.liveBadge}>
236
- <Text style={styles.liveBadgeText}>LIVE</Text>
237
- </View>
238
- )}
239
- </TouchableOpacity>
240
- );
241
- })}
342
+ {/* Hero Metrics Strip (Matching DeviceInfoTab & PerformanceTab) */}
343
+ <View style={styles.heroMetricsStrip}>
344
+ <View style={styles.heroMetricItem}>
345
+ <Text style={styles.heroMetricLabel}>HOST IP</Text>
346
+ <Text style={styles.heroMetricValue} numberOfLines={1}>
347
+ {hostIp}
348
+ </Text>
349
+ </View>
350
+ <View style={styles.heroMetricDivider} />
351
+ <View style={styles.heroMetricItem}>
352
+ <Text style={styles.heroMetricLabel}>PORT</Text>
353
+ <Text style={styles.heroMetricValue}>{port}</Text>
354
+ </View>
355
+ <View style={styles.heroMetricDivider} />
356
+ <View style={styles.heroMetricItem}>
357
+ <Text style={styles.heroMetricLabel}>APK SIZE</Text>
358
+ <Text
359
+ style={[
360
+ styles.heroMetricValue,
361
+ {color: apkSizeMb ? AppColors.emerald500 : AppColors.grayTextWeak},
362
+ ]}>
363
+ {apkSizeMb ? `${apkSizeMb} MB` : 'Detected'}
364
+ </Text>
365
+ </View>
366
+ <View style={styles.heroMetricDivider} />
367
+ <View style={styles.heroMetricItem}>
368
+ <Text style={styles.heroMetricLabel}>STATUS</Text>
369
+ <Text
370
+ style={[
371
+ styles.heroMetricValue,
372
+ {color: AppColors.emerald500},
373
+ ]}>
374
+ Ready
375
+ </Text>
376
+ </View>
242
377
  </View>
243
378
  </View>
244
379
 
245
- {/* ─── Host IP Configuration Card ───────────────────────────────── */}
246
- <View style={styles.card}>
247
- <View style={styles.cardHeader}>
248
- <Text style={styles.cardTitle}>HOST IP & BUNDLE LOCATION</Text>
380
+ {/* ─── Section Card: QR Code & Direct Download ─────────────────── */}
381
+ <View style={styles.sectionCard}>
382
+ <View style={styles.sectionHeaderRow}>
383
+ <Text style={styles.sectionTitle}>QR CODE & DIRECT DOWNLOAD</Text>
249
384
  <TouchableOpacity
250
- onPress={() => {
251
- if (
252
- detectedConfig.host !== 'localhost' &&
253
- detectedConfig.host !== '127.0.0.1' &&
254
- detectedConfig.host !== '10.0.2.2'
255
- ) {
256
- setHostIp(detectedConfig.host);
257
- showToast(`Reset to detected IP: ${detectedConfig.host}`);
258
- }
259
- }}>
260
- <Text style={styles.headerActionText}>Reset to Detected</Text>
385
+ activeOpacity={0.7}
386
+ onPress={fetchMetroTelemetry}
387
+ style={styles.refreshBtn}>
388
+ <RepeatIcon size={12} color={AppColors.purple} />
389
+ <Text style={styles.refreshBtnText}>Refresh</Text>
261
390
  </TouchableOpacity>
262
391
  </View>
263
392
 
264
- <View style={styles.inputContainer}>
265
- <Text style={styles.inputPrefix}>http://</Text>
266
- <TextInput
267
- style={styles.input}
268
- value={hostIp}
269
- onChangeText={setHostIp}
270
- placeholder="192.168.1.15"
271
- placeholderTextColor={AppColors.grayTextWeak}
272
- autoCapitalize="none"
273
- autoCorrect={false}
274
- />
275
- <Text style={styles.inputSuffix}>:{selectedPort}</Text>
276
- </View>
277
- <View style={{flexDirection: 'row', alignItems: 'center', gap: 6, marginTop: 6}}>
278
- <InfoCircleIcon size={13} color={AppColors.grayTextWeak} />
279
- <Text style={[styles.inputHint, {marginTop: 0, flex: 1}]}>
280
- Ensure your physical Android device and Mac are connected to the same Wi-Fi network.
281
- </Text>
393
+ {/* QR Code Container */}
394
+ <View style={styles.qrCenteredWrapper}>
395
+ <View style={styles.qrInnerFrame}>
396
+ <QRCodeView
397
+ value={apkDownloadUrl}
398
+ size={235}
399
+ color={AppColors.primaryBlack}
400
+ backgroundColor={AppColors.white}
401
+ />
402
+ </View>
282
403
  </View>
283
404
  </View>
284
405
 
285
- {/* ─── Interactive QR Code Generator Card ──────────────────────── */}
286
- <View style={styles.qrCard}>
287
- {/* Mode Selector Tabs */}
288
- <View style={styles.qrTabsRow}>
406
+ {/* ─── Section Card: Build Generator (Gradle) ─────────────────── */}
407
+ <View style={styles.sectionCard}>
408
+ <View style={styles.sectionHeaderRow}>
409
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 6}}>
410
+ <BoltIcon size={13} color={AppColors.purple} />
411
+ <Text style={styles.sectionTitle}>BUILD GENERATOR (GRADLE)</Text>
412
+ </View>
413
+ {buildStatus.status === 'completed' && (
414
+ <View style={styles.completedBadge}>
415
+ <CheckIcon size={10} color={AppColors.emerald500} />
416
+ <Text style={styles.completedBadgeText}>100% Ready</Text>
417
+ </View>
418
+ )}
419
+ </View>
420
+
421
+ {/* SubTab Segmented Strip (Matching DeviceInfoTab & PerformanceTab) */}
422
+ <View style={styles.subTabStrip}>
289
423
  <TouchableOpacity
424
+ disabled={isBuilding}
290
425
  activeOpacity={0.7}
291
- onPress={() => setActiveQrTab('metro')}
426
+ onPress={() => {
427
+ triggerNativeHaptic('light');
428
+ setSelectedScheme('assembleRelease');
429
+ }}
292
430
  style={[
293
- styles.qrTab,
294
- activeQrTab === 'metro' && styles.qrTabActive,
431
+ styles.subTabItem,
432
+ selectedScheme === 'assembleRelease' && styles.subTabItemActive,
295
433
  ]}>
296
- <BoltIcon
297
- size={13}
298
- color={activeQrTab === 'metro' ? AppColors.white : AppColors.grayText}
299
- />
300
434
  <Text
301
435
  style={[
302
- styles.qrTabText,
303
- activeQrTab === 'metro' && styles.qrTabTextActive,
436
+ styles.subTabText,
437
+ selectedScheme === 'assembleRelease' && styles.subTabTextActive,
304
438
  ]}>
305
- Metro Live Reload
439
+ Release (assembleRelease)
306
440
  </Text>
307
441
  </TouchableOpacity>
308
442
 
309
443
  <TouchableOpacity
444
+ disabled={isBuilding}
310
445
  activeOpacity={0.7}
311
- onPress={() => setActiveQrTab('apk')}
446
+ onPress={() => {
447
+ triggerNativeHaptic('light');
448
+ setSelectedScheme('assembleDebug');
449
+ }}
312
450
  style={[
313
- styles.qrTab,
314
- activeQrTab === 'apk' && styles.qrTabActive,
451
+ styles.subTabItem,
452
+ selectedScheme === 'assembleDebug' && styles.subTabItemActive,
315
453
  ]}>
316
- <PackageIcon
317
- size={13}
318
- color={activeQrTab === 'apk' ? AppColors.white : AppColors.grayText}
319
- />
320
454
  <Text
321
455
  style={[
322
- styles.qrTabText,
323
- activeQrTab === 'apk' && styles.qrTabTextActive,
456
+ styles.subTabText,
457
+ selectedScheme === 'assembleDebug' && styles.subTabTextActive,
324
458
  ]}>
325
- Install Debug APK
459
+ 🛠 Debug (assembleDebug)
326
460
  </Text>
327
461
  </TouchableOpacity>
462
+ </View>
328
463
 
329
- <TouchableOpacity
330
- activeOpacity={0.7}
331
- onPress={() => setActiveQrTab('host')}
464
+ {/* Clean Build Checkbox */}
465
+ <TouchableOpacity
466
+ disabled={isBuilding}
467
+ activeOpacity={0.7}
468
+ onPress={() => {
469
+ triggerNativeHaptic('light');
470
+ setIsCleanBuild(!isCleanBuild);
471
+ }}
472
+ style={styles.cleanRow}>
473
+ <View
332
474
  style={[
333
- styles.qrTab,
334
- activeQrTab === 'host' && styles.qrTabActive,
475
+ styles.checkboxBox,
476
+ isCleanBuild && styles.checkboxBoxActive,
335
477
  ]}>
336
- <SmartphoneIcon
337
- size={13}
338
- color={activeQrTab === 'host' ? AppColors.white : AppColors.grayText}
339
- />
340
- <Text
341
- style={[
342
- styles.qrTabText,
343
- activeQrTab === 'host' && styles.qrTabTextActive,
344
- ]}>
345
- Dev Host Info
346
- </Text>
347
- </TouchableOpacity>
348
- </View>
478
+ {isCleanBuild && <CheckIcon size={11} color={AppColors.white} />}
479
+ </View>
480
+ <Text style={styles.cleanLabel}>
481
+ Clean build cache <Text style={styles.cleanCode}>(./gradlew clean)</Text>
482
+ </Text>
483
+ </TouchableOpacity>
349
484
 
350
- {/* QR Code Container */}
351
- <View style={styles.qrWrapper}>
352
- <QRCodeView
353
- value={currentQrValue}
354
- size={190}
355
- color={AppColors.primaryBlack}
356
- backgroundColor={AppColors.white}
357
- />
358
-
359
- <View style={styles.qrInfoBox}>
360
- <View style={{flexDirection: 'row', alignItems: 'center', gap: 5, marginBottom: 2}}>
361
- {activeQrTab === 'apk' ? (
362
- <PackageIcon size={14} color={AppColors.purple} />
363
- ) : activeQrTab === 'host' ? (
364
- <SmartphoneIcon size={14} color={AppColors.purple} />
365
- ) : (
366
- <BoltIcon size={14} color={AppColors.amber500} />
367
- )}
368
- <Text style={styles.qrTargetTitle}>
369
- {activeQrTab === 'apk'
370
- ? 'Direct APK Download URL'
371
- : activeQrTab === 'host'
372
- ? 'Dev Settings Bundle Host'
373
- : 'Live Metro Fast-Refresh Endpoint'}
485
+ {/* Progress Display Bar (0% to 100%) */}
486
+ {isBuilding && (
487
+ <View style={styles.progressContainer}>
488
+ <View style={styles.progressTopRow}>
489
+ <View style={styles.progressTaskGroup}>
490
+ <ActivityIndicator size="small" color={AppColors.purple} />
491
+ <Text style={styles.progressTaskText} numberOfLines={1}>
492
+ {buildStatus.currentTask || 'Executing Gradle tasks...'}
493
+ </Text>
494
+ </View>
495
+ <Text style={styles.progressPercentageText}>
496
+ {buildStatus.progress}%
374
497
  </Text>
375
498
  </View>
376
- <Text style={styles.qrTargetUrl} numberOfLines={2} ellipsizeMode="middle">
377
- {currentQrValue}
378
- </Text>
499
+
500
+ {/* Animated Progress Bar */}
501
+ <View style={styles.progressBarTrack}>
502
+ <Animated.View
503
+ style={[
504
+ styles.progressBarFill,
505
+ {
506
+ width: progressAnim.interpolate({
507
+ inputRange: [0, 100],
508
+ outputRange: ['5%', '100%'],
509
+ }),
510
+ },
511
+ ]}
512
+ />
513
+ </View>
379
514
  </View>
380
- </View>
515
+ )}
381
516
 
382
- {/* Quick Action Row */}
383
- <View style={styles.qrActionsRow}>
384
- <TouchableScale
385
- onPress={() => copyToClipboard(currentQrValue, 'QR Link')}
386
- style={styles.actionBtn}>
387
- <Text style={styles.actionBtnText}>Copy Link</Text>
388
- </TouchableScale>
517
+ {/* Error Container */}
518
+ {buildStatus.status === 'failed' && (
519
+ <View style={styles.errorContainer}>
520
+ <CircleXIcon size={13} color={AppColors.errorColor} />
521
+ <Text style={styles.errorText} numberOfLines={2}>
522
+ {buildStatus.error || 'Build execution failed.'}
523
+ </Text>
524
+ </View>
525
+ )}
389
526
 
390
- <TouchableScale
391
- onPress={() => {
392
- Share.share({
393
- message: currentQrValue,
394
- title: 'Metro Debug Link',
395
- });
396
- }}
397
- style={[styles.actionBtn, styles.actionBtnPrimary]}>
398
- <Text style={styles.actionBtnPrimaryText}>Share to Device</Text>
399
- </TouchableScale>
400
- </View>
401
- </View>
527
+ {/* Live Verbose Console Output */}
528
+ {((buildStatus.logs && buildStatus.logs.length > 0) || isBuilding) && (
529
+ <View style={styles.consoleContainer}>
530
+ <View style={styles.consoleHeaderRow}>
531
+ <View style={{flexDirection: 'row', alignItems: 'center', gap: 6}}>
532
+ <TerminalConsoleIcon color="#38BDF8" size={12} />
533
+ <Text style={styles.consoleHeaderTitle}>GRADLE VERBOSE OUTPUT</Text>
534
+ </View>
535
+ <TouchableOpacity
536
+ activeOpacity={0.7}
537
+ onPress={() => setShowVerboseLogs(!showVerboseLogs)}
538
+ style={styles.consoleToggleBtn}>
539
+ <Text style={styles.consoleToggleText}>
540
+ {showVerboseLogs ? 'Hide Console' : 'Show Console'}
541
+ </Text>
542
+ </TouchableOpacity>
543
+ </View>
402
544
 
403
- {/* ─── Bare React Native Multi-Device Setup Guide ───────────────── */}
404
- <View style={styles.guideCard}>
405
- <View style={{flexDirection: 'row', alignItems: 'center', gap: 6, marginBottom: 12}}>
406
- <SmartphoneIcon size={15} color={AppColors.primaryLight} />
407
- <Text style={[styles.guideHeading, {marginBottom: 0}]}>HOW TO CONNECT ANDROID DEVICE:</Text>
408
- </View>
545
+ {showVerboseLogs && (
546
+ <ScrollView
547
+ ref={verboseScrollRef}
548
+ style={styles.consoleLogBox}
549
+ contentContainerStyle={styles.consoleLogContent}
550
+ nestedScrollEnabled
551
+ showsVerticalScrollIndicator>
552
+ {buildStatus.logs && buildStatus.logs.length > 0 ? (
553
+ buildStatus.logs.map((logLine, idx) => {
554
+ let logColor = '#94A3B8';
555
+ if (logLine.startsWith('> Task :')) logColor = '#38BDF8';
556
+ else if (logLine.includes('BUILD SUCCESSFUL')) logColor = '#4ADE80';
557
+ else if (logLine.includes('FAILURE') || logLine.includes('error:')) logColor = '#F87171';
558
+ else if (logLine.includes('UP-TO-DATE')) logColor = '#A78BFA';
409
559
 
410
- <View style={styles.stepRow}>
411
- <View style={styles.stepNumberBadge}>
412
- <Text style={styles.stepNumberText}>1</Text>
413
- </View>
414
- <View style={{flex: 1}}>
415
- <Text style={styles.stepTitle}>Connect to Same Wi-Fi</Text>
416
- <Text style={styles.stepDesc}>
417
- Make sure your Android phone is connected to the same Wi-Fi router or Mac Mobile Hotspot.
418
- </Text>
560
+ return (
561
+ <Text key={idx} style={[styles.consoleLogLine, {color: logColor}]}>
562
+ {logLine}
563
+ </Text>
564
+ );
565
+ })
566
+ ) : (
567
+ <Text style={styles.consoleLogPlaceholder}>
568
+ Waiting for Gradle daemon output...
569
+ </Text>
570
+ )}
571
+ </ScrollView>
572
+ )}
419
573
  </View>
420
- </View>
574
+ )}
421
575
 
422
- <View style={styles.stepRow}>
423
- <View style={styles.stepNumberBadge}>
424
- <Text style={styles.stepNumberText}>2</Text>
425
- </View>
426
- <View style={{flex: 1}}>
427
- <Text style={styles.stepTitle}>Scan to Install / Connect</Text>
428
- <Text style={styles.stepDesc}>
429
- Open Android Camera or browser, scan the QR code above to download the APK or connect Metro.
430
- </Text>
431
- </View>
432
- </View>
576
+ {/* Action Button Row */}
577
+ {isBuilding ? (
578
+ <View style={styles.buildingActionsRow}>
579
+ <View style={styles.buildingStatusPill}>
580
+ <ActivityIndicator size="small" color={AppColors.purple} />
581
+ <Text style={styles.buildingStatusPillText} numberOfLines={1}>
582
+ Building ({buildStatus.progress}%)
583
+ </Text>
584
+ </View>
433
585
 
434
- <View style={styles.stepRow}>
435
- <View style={styles.stepNumberBadge}>
436
- <Text style={styles.stepNumberText}>3</Text>
586
+ <TouchableScale
587
+ onPress={handleStopBuild}
588
+ style={styles.stopBtn}>
589
+ <CircleXIcon size={13} color={AppColors.white} />
590
+ <Text style={styles.stopBtnText}>Stop Build</Text>
591
+ </TouchableScale>
437
592
  </View>
438
- <View style={{flex: 1}}>
439
- <View style={{flexDirection: 'row', alignItems: 'center', gap: 4}}>
440
- <Text style={styles.stepTitle}>Simultaneous Live Fast-Refresh</Text>
441
- <BoltIcon size={13} color={AppColors.amber500} />
593
+ ) : (
594
+ <TouchableScale
595
+ onPress={handleStartBuild}
596
+ style={styles.generateBtn}>
597
+ <View style={styles.ctaContentRow}>
598
+ <SparkleIcon size={14} color={AppColors.white} />
599
+ <Text style={styles.generateBtnText}>
600
+ {isCleanBuild ? 'Clean & Generate Build' : 'Generate Build'}
601
+ </Text>
442
602
  </View>
443
- <Text style={styles.stepDesc}>
444
- Any changes saved in VS Code will immediately update <Text style={{fontWeight: '700'}}>both the iOS Simulator and physical Android phone</Text> in real-time!
445
- </Text>
446
- </View>
447
- </View>
603
+ </TouchableScale>
604
+ )}
605
+ </View>
606
+
607
+ {/* ─── Footer Hint Note ───────────────────────────────────────── */}
608
+ <View style={styles.footerNoteRow}>
609
+ <InfoCircleIcon size={13} color={AppColors.grayTextWeak} />
610
+ <Text style={styles.footerNoteText}>
611
+ Ensure both Android devices are connected to the same Wi-Fi network.
612
+ </Text>
448
613
  </View>
449
614
  </ScrollView>
450
615
  );
451
616
  };
452
617
 
453
618
  const styles = StyleSheet.create({
454
- container: {
619
+ scrollArea: {
455
620
  flex: 1,
456
621
  backgroundColor: AppColors.contentBg,
457
622
  },
458
- content: {
623
+ scrollContent: {
459
624
  padding: 12,
460
625
  gap: 12,
461
- paddingBottom: 40,
626
+ paddingBottom: 100,
462
627
  },
463
- serverCard: {
628
+ heroCard: {
464
629
  backgroundColor: AppColors.primaryLight,
465
630
  borderRadius: 14,
466
- padding: 14,
467
631
  borderWidth: 1,
468
632
  borderColor: AppColors.grayBorderSecondary,
633
+ padding: 14,
469
634
  shadowColor: AppColors.black,
470
- shadowOffset: {width: 0, height: 2},
471
- shadowOpacity: 0.05,
635
+ shadowOpacity: 0.04,
472
636
  shadowRadius: 4,
473
- elevation: 2,
637
+ shadowOffset: {width: 0, height: 2},
638
+ elevation: 1,
474
639
  gap: 12,
475
640
  },
476
- serverCardTop: {
477
- flexDirection: 'row',
478
- alignItems: 'center',
479
- justifyContent: 'space-between',
480
- },
481
- serverStatusLeft: {
641
+ heroHeader: {
482
642
  flexDirection: 'row',
483
643
  alignItems: 'center',
484
644
  gap: 10,
485
- flex: 1,
486
645
  },
487
- statusDot: {
488
- width: 12,
489
- height: 12,
490
- borderRadius: 6,
646
+ heroIconWrap: {
647
+ width: 38,
648
+ height: 38,
649
+ borderRadius: 10,
650
+ backgroundColor: AppColors.purple,
651
+ alignItems: 'center',
652
+ justifyContent: 'center',
653
+ shadowColor: AppColors.purple,
654
+ shadowOpacity: 0.25,
655
+ shadowRadius: 4,
656
+ shadowOffset: {width: 0, height: 2},
657
+ elevation: 2,
491
658
  },
492
- serverTitle: {
659
+ heroTitle: {
493
660
  fontFamily: AppFonts.interBold,
494
661
  fontSize: 15,
495
662
  color: AppColors.primaryBlack,
663
+ letterSpacing: -0.2,
496
664
  },
497
- serverSubtitle: {
498
- fontFamily: AppFonts.interMedium,
499
- fontSize: 11,
665
+ heroSubtitle: {
666
+ fontFamily: AppFonts.interRegular,
667
+ fontSize: 11.5,
500
668
  color: AppColors.grayText,
501
- marginTop: 2,
502
- },
503
- portPill: {
504
- backgroundColor: `${AppColors.purple}18`,
505
- paddingHorizontal: 6,
506
- paddingVertical: 2,
507
- borderRadius: 6,
508
- },
509
- portPillText: {
510
- fontFamily: AppFonts.interBold,
511
- fontSize: 10,
512
- color: AppColors.purple,
669
+ marginTop: 1,
513
670
  },
514
- scanBtn: {
671
+ heroBadge: {
515
672
  flexDirection: 'row',
516
673
  alignItems: 'center',
517
674
  gap: 4,
518
- paddingHorizontal: 8,
519
- paddingVertical: 4,
675
+ backgroundColor: `${AppColors.emerald500}18`,
676
+ paddingHorizontal: 7,
677
+ paddingVertical: 3,
520
678
  borderRadius: 6,
521
- backgroundColor: `${AppColors.purple}14`,
522
- borderWidth: 1,
523
- borderColor: `${AppColors.purple}30`,
524
679
  },
525
- scanBtnText: {
526
- fontFamily: AppFonts.interBold,
527
- fontSize: 11,
528
- color: AppColors.purple,
680
+ pulseDot: {
681
+ width: 6,
682
+ height: 6,
683
+ borderRadius: 3,
684
+ backgroundColor: AppColors.emerald500,
529
685
  },
530
- portsRow: {
531
- flexDirection: 'row',
532
- gap: 8,
686
+ heroBadgeText: {
687
+ fontFamily: AppFonts.interBold,
688
+ fontSize: 9.5,
689
+ color: AppColors.emerald500,
533
690
  },
534
- portChip: {
535
- flex: 1,
691
+ heroMetricsStrip: {
536
692
  flexDirection: 'row',
537
693
  alignItems: 'center',
538
- justifyContent: 'center',
539
- gap: 4,
540
- paddingVertical: 7,
541
- borderRadius: 8,
542
694
  backgroundColor: AppColors.grayBackground,
543
- borderWidth: 1,
544
- borderColor: AppColors.grayBorderSecondary,
695
+ borderRadius: 10,
696
+ paddingVertical: 8,
697
+ paddingHorizontal: 10,
545
698
  },
546
- portChipSelected: {
547
- backgroundColor: `${AppColors.purple}18`,
548
- borderColor: AppColors.purple,
699
+ heroMetricItem: {
700
+ flex: 1,
701
+ alignItems: 'center',
702
+ paddingHorizontal: 2,
703
+ minWidth: 0,
549
704
  },
550
- portMiniDot: {
551
- width: 5,
552
- height: 5,
553
- borderRadius: 2.5,
705
+ heroMetricLabel: {
706
+ fontFamily: AppFonts.interBold,
707
+ fontSize: 8.5,
708
+ color: AppColors.grayTextWeak,
709
+ letterSpacing: 0.4,
554
710
  },
555
- portChipText: {
711
+ heroMetricValue: {
556
712
  fontFamily: AppFonts.interBold,
557
713
  fontSize: 11,
558
- color: AppColors.grayTextStrong,
559
- },
560
- portChipTextSelected: {
561
- color: AppColors.purple,
562
- },
563
- liveBadge: {
564
- backgroundColor: AppColors.greenColor,
565
- paddingHorizontal: 3,
566
- paddingVertical: 0.5,
567
- borderRadius: 3,
714
+ color: AppColors.primaryBlack,
715
+ marginTop: 2,
568
716
  },
569
- liveBadgeText: {
570
- fontFamily: AppFonts.interBold,
571
- fontSize: 7.5,
572
- color: AppColors.white,
717
+ heroMetricDivider: {
718
+ width: 1,
719
+ height: 20,
720
+ backgroundColor: AppColors.dividerColor,
573
721
  },
574
- card: {
722
+ sectionCard: {
575
723
  backgroundColor: AppColors.primaryLight,
576
724
  borderRadius: 14,
577
- padding: 14,
578
725
  borderWidth: 1,
579
726
  borderColor: AppColors.grayBorderSecondary,
727
+ padding: 14,
580
728
  shadowColor: AppColors.black,
581
- shadowOffset: {width: 0, height: 2},
582
- shadowOpacity: 0.05,
583
- shadowRadius: 4,
584
- elevation: 2,
585
- gap: 8,
729
+ shadowOpacity: 0.03,
730
+ shadowRadius: 3,
731
+ shadowOffset: {width: 0, height: 1},
732
+ elevation: 1,
733
+ gap: 12,
586
734
  },
587
- cardHeader: {
735
+ sectionHeaderRow: {
588
736
  flexDirection: 'row',
589
737
  alignItems: 'center',
590
738
  justifyContent: 'space-between',
591
739
  },
592
- cardTitle: {
740
+ sectionTitle: {
593
741
  fontFamily: AppFonts.interBold,
594
- fontSize: 11,
742
+ fontSize: 10.5,
595
743
  color: AppColors.grayTextWeak,
596
- letterSpacing: 0.6,
744
+ letterSpacing: 0.8,
745
+ textTransform: 'uppercase',
597
746
  },
598
- headerActionText: {
747
+ refreshBtn: {
748
+ flexDirection: 'row',
749
+ alignItems: 'center',
750
+ gap: 4,
751
+ paddingHorizontal: 7,
752
+ paddingVertical: 3,
753
+ borderRadius: 6,
754
+ backgroundColor: `${AppColors.purple}12`,
755
+ },
756
+ refreshBtnText: {
599
757
  fontFamily: AppFonts.interBold,
600
- fontSize: 11,
758
+ fontSize: 10,
601
759
  color: AppColors.purple,
602
760
  },
603
- inputContainer: {
761
+ qrCenteredWrapper: {
762
+ alignItems: 'center',
763
+ justifyContent: 'center',
764
+ backgroundColor: AppColors.grayBackground,
765
+ padding: 12,
766
+ borderRadius: 12,
767
+ borderWidth: 1,
768
+ borderColor: AppColors.grayBorderSecondary,
769
+ },
770
+ qrInnerFrame: {
771
+ backgroundColor: AppColors.white,
772
+ padding: 6,
773
+ borderRadius: 8,
774
+ },
775
+ urlBox: {
604
776
  flexDirection: 'row',
605
777
  alignItems: 'center',
606
778
  backgroundColor: AppColors.grayBackground,
607
779
  borderRadius: 10,
780
+ paddingLeft: 10,
781
+ paddingRight: 6,
782
+ paddingVertical: 6,
608
783
  borderWidth: 1,
609
784
  borderColor: AppColors.grayBorderSecondary,
610
- paddingHorizontal: 10,
611
- height: 40,
785
+ gap: 8,
612
786
  },
613
- inputPrefix: {
787
+ urlText: {
788
+ flex: 1,
614
789
  fontFamily: AppFonts.interMedium,
615
- fontSize: 12.5,
616
- color: AppColors.grayTextWeak,
790
+ fontSize: 11.5,
791
+ color: AppColors.skyBlue,
617
792
  },
618
- input: {
793
+ actionsRow: {
794
+ flexDirection: 'row',
795
+ gap: 10,
796
+ },
797
+ actionBtnSecondary: {
619
798
  flex: 1,
620
- fontFamily: AppFonts.interBold,
621
- fontSize: 13,
622
- color: AppColors.primaryBlack,
623
- paddingVertical: 0,
799
+ flexDirection: 'row',
800
+ alignItems: 'center',
801
+ justifyContent: 'center',
802
+ gap: 6,
803
+ paddingVertical: 9,
804
+ borderRadius: 10,
805
+ borderWidth: 1,
806
+ borderColor: AppColors.grayBorderSecondary,
807
+ backgroundColor: AppColors.grayBackground,
624
808
  },
625
- inputSuffix: {
809
+ actionBtnSecondaryText: {
626
810
  fontFamily: AppFonts.interBold,
627
- fontSize: 12.5,
628
- color: AppColors.purple,
629
- },
630
- inputHint: {
631
- fontFamily: AppFonts.interRegular,
632
- fontSize: 11,
633
- color: AppColors.grayTextWeak,
634
- lineHeight: 15,
811
+ fontSize: 12,
812
+ color: AppColors.grayTextStrong,
635
813
  },
636
- qrCard: {
637
- backgroundColor: AppColors.primaryLight,
638
- borderRadius: 14,
639
- padding: 14,
640
- borderWidth: 1,
641
- borderColor: AppColors.grayBorderSecondary,
642
- shadowColor: AppColors.black,
643
- shadowOffset: {width: 0, height: 2},
644
- shadowOpacity: 0.05,
814
+ actionBtnPrimary: {
815
+ flex: 1,
816
+ flexDirection: 'row',
817
+ alignItems: 'center',
818
+ justifyContent: 'center',
819
+ gap: 6,
820
+ paddingVertical: 9,
821
+ borderRadius: 10,
822
+ backgroundColor: AppColors.purple,
823
+ shadowColor: AppColors.purple,
824
+ shadowOpacity: 0.25,
645
825
  shadowRadius: 4,
826
+ shadowOffset: {width: 0, height: 2},
646
827
  elevation: 2,
828
+ },
829
+ actionBtnPrimaryText: {
830
+ fontFamily: AppFonts.interBold,
831
+ fontSize: 12,
832
+ color: AppColors.white,
833
+ },
834
+ completedBadge: {
835
+ flexDirection: 'row',
647
836
  alignItems: 'center',
648
- gap: 14,
837
+ gap: 3,
838
+ backgroundColor: `${AppColors.emerald500}18`,
839
+ paddingHorizontal: 6,
840
+ paddingVertical: 2,
841
+ borderRadius: 5,
842
+ },
843
+ completedBadgeText: {
844
+ fontFamily: AppFonts.interBold,
845
+ fontSize: 9.5,
846
+ color: AppColors.emerald500,
649
847
  },
650
- qrTabsRow: {
848
+ subTabStrip: {
651
849
  flexDirection: 'row',
652
850
  backgroundColor: AppColors.grayBackground,
653
- borderRadius: 10,
654
- padding: 3,
655
- width: '100%',
656
- gap: 4,
851
+ borderRadius: 8,
852
+ padding: 2,
853
+ borderWidth: 1,
854
+ borderColor: AppColors.grayBorderSecondary,
657
855
  },
658
- qrTab: {
856
+ subTabItem: {
659
857
  flex: 1,
660
- flexDirection: 'row',
858
+ paddingVertical: 7,
859
+ borderRadius: 6,
661
860
  alignItems: 'center',
662
861
  justifyContent: 'center',
663
- gap: 4,
664
- paddingVertical: 7,
665
- borderRadius: 8,
666
862
  },
667
- qrTabActive: {
863
+ subTabItemActive: {
668
864
  backgroundColor: AppColors.purple,
865
+ shadowColor: AppColors.purple,
866
+ shadowOpacity: 0.2,
867
+ shadowRadius: 3,
868
+ shadowOffset: {width: 0, height: 1},
869
+ elevation: 1,
669
870
  },
670
- qrTabText: {
871
+ subTabText: {
671
872
  fontFamily: AppFonts.interMedium,
672
873
  fontSize: 11,
673
874
  color: AppColors.grayText,
674
875
  },
675
- qrTabTextActive: {
676
- color: AppColors.white,
876
+ subTabTextActive: {
677
877
  fontFamily: AppFonts.interBold,
878
+ color: AppColors.white,
678
879
  },
679
- qrWrapper: {
880
+ cleanRow: {
881
+ flexDirection: 'row',
680
882
  alignItems: 'center',
681
- gap: 12,
883
+ gap: 8,
884
+ paddingVertical: 2,
682
885
  },
683
- qrInfoBox: {
886
+ checkboxBox: {
887
+ width: 18,
888
+ height: 18,
889
+ borderRadius: 4,
890
+ borderWidth: 1.5,
891
+ borderColor: AppColors.grayBorderSecondary,
892
+ backgroundColor: AppColors.grayBackground,
684
893
  alignItems: 'center',
685
- maxWidth: 280,
686
- gap: 2,
894
+ justifyContent: 'center',
687
895
  },
688
- qrTargetTitle: {
689
- fontFamily: AppFonts.interBold,
896
+ checkboxBoxActive: {
897
+ backgroundColor: AppColors.purple,
898
+ borderColor: AppColors.purple,
899
+ },
900
+ cleanLabel: {
901
+ fontFamily: AppFonts.interMedium,
690
902
  fontSize: 11.5,
691
- color: AppColors.primaryBlack,
903
+ color: AppColors.grayTextStrong,
692
904
  },
693
- qrTargetUrl: {
905
+ cleanCode: {
694
906
  fontFamily: AppFonts.interRegular,
907
+ color: AppColors.grayTextWeak,
695
908
  fontSize: 10.5,
696
- color: AppColors.skyBlue,
697
- textAlign: 'center',
698
909
  },
699
- qrActionsRow: {
700
- flexDirection: 'row',
701
- gap: 10,
702
- width: '100%',
703
- },
704
- actionBtn: {
705
- flex: 1,
706
- paddingVertical: 10,
910
+ progressContainer: {
911
+ backgroundColor: AppColors.grayBackground,
707
912
  borderRadius: 10,
913
+ padding: 10,
914
+ gap: 6,
708
915
  borderWidth: 1,
709
916
  borderColor: AppColors.grayBorderSecondary,
710
- backgroundColor: AppColors.grayBackground,
917
+ },
918
+ progressTopRow: {
919
+ flexDirection: 'row',
711
920
  alignItems: 'center',
712
- justifyContent: 'center',
921
+ justifyContent: 'space-between',
922
+ },
923
+ progressTaskGroup: {
924
+ flexDirection: 'row',
925
+ alignItems: 'center',
926
+ gap: 6,
927
+ flex: 1,
928
+ paddingRight: 8,
713
929
  },
714
- actionBtnText: {
930
+ progressTaskText: {
931
+ fontFamily: AppFonts.interMedium,
932
+ fontSize: 11,
933
+ color: AppColors.primaryBlack,
934
+ flex: 1,
935
+ },
936
+ progressPercentageText: {
715
937
  fontFamily: AppFonts.interBold,
716
- fontSize: 12,
717
- color: AppColors.grayTextStrong,
938
+ fontSize: 11.5,
939
+ color: AppColors.purple,
718
940
  },
719
- actionBtnPrimary: {
941
+ progressBarTrack: {
942
+ width: '100%',
943
+ height: 6,
944
+ borderRadius: 3,
945
+ backgroundColor: AppColors.grayBorderSecondary,
946
+ overflow: 'hidden',
947
+ },
948
+ progressBarFill: {
949
+ height: '100%',
720
950
  backgroundColor: AppColors.purple,
721
- borderColor: AppColors.purple,
951
+ borderRadius: 3,
722
952
  },
723
- actionBtnPrimaryText: {
724
- fontFamily: AppFonts.interBold,
725
- fontSize: 12,
726
- color: AppColors.white,
953
+ errorContainer: {
954
+ flexDirection: 'row',
955
+ alignItems: 'center',
956
+ gap: 6,
957
+ backgroundColor: `${AppColors.errorColor}12`,
958
+ padding: 8,
959
+ borderRadius: 8,
960
+ borderWidth: 1,
961
+ borderColor: `${AppColors.errorColor}25`,
727
962
  },
728
- guideCard: {
729
- backgroundColor: AppColors.primaryLight,
730
- borderRadius: 14,
731
- padding: 14,
963
+ errorText: {
964
+ fontFamily: AppFonts.interRegular,
965
+ fontSize: 11,
966
+ color: AppColors.errorColor,
967
+ flex: 1,
968
+ },
969
+ consoleContainer: {
970
+ backgroundColor: '#0F172A',
971
+ borderRadius: 10,
732
972
  borderWidth: 1,
733
- borderColor: AppColors.grayBorderSecondary,
734
- gap: 10,
973
+ borderColor: '#1E293B',
974
+ overflow: 'hidden',
975
+ marginTop: 4,
735
976
  },
736
- guideHeading: {
977
+ consoleHeaderRow: {
978
+ flexDirection: 'row',
979
+ alignItems: 'center',
980
+ justifyContent: 'space-between',
981
+ backgroundColor: '#1E293B',
982
+ paddingHorizontal: 10,
983
+ paddingVertical: 6,
984
+ },
985
+ consoleHeaderTitle: {
737
986
  fontFamily: AppFonts.interBold,
738
- fontSize: 11,
739
- color: AppColors.grayTextWeak,
740
- letterSpacing: 0.6,
987
+ fontSize: 10,
988
+ color: '#38BDF8',
989
+ letterSpacing: 0.5,
990
+ },
991
+ consoleToggleBtn: {
992
+ paddingHorizontal: 6,
993
+ paddingVertical: 2,
994
+ borderRadius: 4,
995
+ backgroundColor: 'rgba(255,255,255,0.1)',
996
+ },
997
+ consoleToggleText: {
998
+ fontFamily: AppFonts.interMedium,
999
+ fontSize: 9.5,
1000
+ color: '#94A3B8',
1001
+ },
1002
+ consoleLogBox: {
1003
+ maxHeight: 140,
1004
+ paddingHorizontal: 10,
1005
+ paddingVertical: 8,
741
1006
  },
742
- stepRow: {
1007
+ consoleLogContent: {
1008
+ gap: 3,
1009
+ },
1010
+ consoleLogLine: {
1011
+ fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',
1012
+ fontSize: 10,
1013
+ lineHeight: 14,
1014
+ },
1015
+ consoleLogPlaceholder: {
1016
+ fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',
1017
+ fontSize: 10,
1018
+ color: '#64748B',
1019
+ fontStyle: 'italic',
1020
+ },
1021
+ generateBtn: {
1022
+ backgroundColor: AppColors.purple,
1023
+ borderRadius: 10,
1024
+ paddingVertical: 10,
1025
+ alignItems: 'center',
1026
+ justifyContent: 'center',
1027
+ shadowColor: AppColors.purple,
1028
+ shadowOpacity: 0.25,
1029
+ shadowRadius: 4,
1030
+ shadowOffset: {width: 0, height: 2},
1031
+ elevation: 2,
1032
+ },
1033
+ generateBtnDisabled: {
1034
+ opacity: 0.7,
1035
+ },
1036
+ buildingActionsRow: {
743
1037
  flexDirection: 'row',
744
- alignItems: 'flex-start',
1038
+ alignItems: 'center',
745
1039
  gap: 10,
746
1040
  },
747
- stepNumberBadge: {
748
- width: 22,
749
- height: 22,
750
- borderRadius: 11,
751
- backgroundColor: `${AppColors.purple}18`,
1041
+ buildingStatusPill: {
1042
+ flex: 1,
1043
+ flexDirection: 'row',
752
1044
  alignItems: 'center',
753
1045
  justifyContent: 'center',
754
- marginTop: 1,
1046
+ gap: 8,
1047
+ backgroundColor: `${AppColors.purple}14`,
1048
+ borderRadius: 10,
1049
+ paddingVertical: 10,
1050
+ borderWidth: 1,
1051
+ borderColor: `${AppColors.purple}30`,
755
1052
  },
756
- stepNumberText: {
1053
+ buildingStatusPillText: {
757
1054
  fontFamily: AppFonts.interBold,
758
- fontSize: 11,
1055
+ fontSize: 12,
759
1056
  color: AppColors.purple,
760
1057
  },
761
- stepTitle: {
1058
+ stopBtn: {
1059
+ flexDirection: 'row',
1060
+ alignItems: 'center',
1061
+ justifyContent: 'center',
1062
+ gap: 6,
1063
+ backgroundColor: AppColors.errorColor,
1064
+ borderRadius: 10,
1065
+ paddingHorizontal: 16,
1066
+ paddingVertical: 10,
1067
+ shadowColor: AppColors.errorColor,
1068
+ shadowOpacity: 0.25,
1069
+ shadowRadius: 4,
1070
+ shadowOffset: {width: 0, height: 2},
1071
+ elevation: 2,
1072
+ },
1073
+ stopBtnText: {
1074
+ fontFamily: AppFonts.interBold,
1075
+ fontSize: 12,
1076
+ color: AppColors.white,
1077
+ },
1078
+ ctaContentRow: {
1079
+ flexDirection: 'row',
1080
+ alignItems: 'center',
1081
+ gap: 6,
1082
+ },
1083
+ generateBtnText: {
762
1084
  fontFamily: AppFonts.interBold,
763
1085
  fontSize: 12.5,
764
- color: AppColors.primaryBlack,
1086
+ color: AppColors.white,
765
1087
  },
766
- stepDesc: {
1088
+ footerNoteRow: {
1089
+ flexDirection: 'row',
1090
+ alignItems: 'center',
1091
+ gap: 6,
1092
+ paddingHorizontal: 8,
1093
+ },
1094
+ footerNoteText: {
767
1095
  fontFamily: AppFonts.interRegular,
768
1096
  fontSize: 11,
769
- color: AppColors.grayText,
770
- lineHeight: 16,
771
- marginTop: 1,
1097
+ color: AppColors.grayTextWeak,
1098
+ textAlign: 'center',
1099
+ flex: 1,
772
1100
  },
773
1101
  });
774
1102