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