react-native-debug-toolkit 0.6.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -212
  3. package/lib/commonjs/components/ClipboardTab.js +92 -0
  4. package/lib/commonjs/components/ClipboardTab.js.map +1 -0
  5. package/lib/commonjs/components/ConsoleLogTab.js +295 -0
  6. package/lib/commonjs/components/ConsoleLogTab.js.map +1 -0
  7. package/lib/commonjs/components/EnvironmentTab.js +288 -0
  8. package/lib/commonjs/components/EnvironmentTab.js.map +1 -0
  9. package/lib/commonjs/components/FloatPanelView.js +797 -0
  10. package/lib/commonjs/components/FloatPanelView.js.map +1 -0
  11. package/lib/commonjs/components/NavigationLogTab.js +131 -0
  12. package/lib/commonjs/components/NavigationLogTab.js.map +1 -0
  13. package/lib/commonjs/components/NetworkLogTab.js +575 -0
  14. package/lib/commonjs/components/NetworkLogTab.js.map +1 -0
  15. package/lib/commonjs/components/ThirdPartyLibsTab.js +97 -0
  16. package/lib/commonjs/components/ThirdPartyLibsTab.js.map +1 -0
  17. package/lib/commonjs/components/TrackLogTab.js +372 -0
  18. package/lib/commonjs/components/TrackLogTab.js.map +1 -0
  19. package/lib/commonjs/components/ZustandLogTab.js +451 -0
  20. package/lib/commonjs/components/ZustandLogTab.js.map +1 -0
  21. package/lib/commonjs/components/shared/CollapsibleSection.js +84 -0
  22. package/lib/commonjs/components/shared/CollapsibleSection.js.map +1 -0
  23. package/lib/commonjs/components/shared/CopyButton.js +64 -0
  24. package/lib/commonjs/components/shared/CopyButton.js.map +1 -0
  25. package/lib/commonjs/components/shared/JsonView.js +157 -0
  26. package/lib/commonjs/components/shared/JsonView.js.map +1 -0
  27. package/lib/commonjs/core/DebugToolkit.js +142 -0
  28. package/lib/commonjs/core/DebugToolkit.js.map +1 -0
  29. package/lib/commonjs/core/DebugToolkitProvider.js +64 -0
  30. package/lib/commonjs/core/DebugToolkitProvider.js.map +1 -0
  31. package/lib/commonjs/features/ClipboardFeature.js +17 -0
  32. package/lib/commonjs/features/ClipboardFeature.js.map +1 -0
  33. package/lib/commonjs/features/ConsoleLogFeature.js +98 -0
  34. package/lib/commonjs/features/ConsoleLogFeature.js.map +1 -0
  35. package/lib/commonjs/features/EnvironmentFeature.js +168 -0
  36. package/lib/commonjs/features/EnvironmentFeature.js.map +1 -0
  37. package/lib/commonjs/features/NavigationLogFeature.js +60 -0
  38. package/lib/commonjs/features/NavigationLogFeature.js.map +1 -0
  39. package/lib/commonjs/features/NetworkFeature.js +328 -0
  40. package/lib/commonjs/features/NetworkFeature.js.map +1 -0
  41. package/lib/commonjs/features/ThirdPartyLibsFeature.js +51 -0
  42. package/lib/commonjs/features/ThirdPartyLibsFeature.js.map +1 -0
  43. package/lib/commonjs/features/TrackFeature.js +55 -0
  44. package/lib/commonjs/features/TrackFeature.js.map +1 -0
  45. package/lib/commonjs/features/ZustandLogFeature.js +76 -0
  46. package/lib/commonjs/features/ZustandLogFeature.js.map +1 -0
  47. package/lib/commonjs/hooks/useNavigationLogger.js +78 -0
  48. package/lib/commonjs/hooks/useNavigationLogger.js.map +1 -0
  49. package/lib/commonjs/hooks/useSlideDetailAnimation.js +53 -0
  50. package/lib/commonjs/hooks/useSlideDetailAnimation.js.map +1 -0
  51. package/lib/commonjs/index.js +165 -0
  52. package/lib/commonjs/index.js.map +1 -0
  53. package/lib/commonjs/initialize.js +161 -0
  54. package/lib/commonjs/initialize.js.map +1 -0
  55. package/lib/commonjs/native/NativeDebugLibs.js +58 -0
  56. package/lib/commonjs/native/NativeDebugLibs.js.map +1 -0
  57. package/lib/commonjs/package.json +1 -0
  58. package/lib/commonjs/types/index.js +6 -0
  59. package/lib/commonjs/types/index.js.map +1 -0
  60. package/lib/commonjs/utils/constants.js +135 -0
  61. package/lib/commonjs/utils/constants.js.map +1 -0
  62. package/lib/commonjs/utils/copyToComputer.js +97 -0
  63. package/lib/commonjs/utils/copyToComputer.js.map +1 -0
  64. package/lib/commonjs/utils/createEventChannel.js +21 -0
  65. package/lib/commonjs/utils/createEventChannel.js.map +1 -0
  66. package/lib/commonjs/utils/createObservableStore.js +38 -0
  67. package/lib/commonjs/utils/createObservableStore.js.map +1 -0
  68. package/lib/commonjs/utils/safeStringify.js +27 -0
  69. package/lib/commonjs/utils/safeStringify.js.map +1 -0
  70. package/lib/module/components/ClipboardTab.js +86 -0
  71. package/lib/module/components/ClipboardTab.js.map +1 -0
  72. package/lib/module/components/ConsoleLogTab.js +290 -0
  73. package/lib/module/components/ConsoleLogTab.js.map +1 -0
  74. package/lib/module/components/EnvironmentTab.js +282 -0
  75. package/lib/module/components/EnvironmentTab.js.map +1 -0
  76. package/lib/module/components/FloatPanelView.js +791 -0
  77. package/lib/module/components/FloatPanelView.js.map +1 -0
  78. package/lib/module/components/NavigationLogTab.js +126 -0
  79. package/lib/module/components/NavigationLogTab.js.map +1 -0
  80. package/lib/module/components/NetworkLogTab.js +570 -0
  81. package/lib/module/components/NetworkLogTab.js.map +1 -0
  82. package/lib/module/components/ThirdPartyLibsTab.js +91 -0
  83. package/lib/module/components/ThirdPartyLibsTab.js.map +1 -0
  84. package/lib/module/components/TrackLogTab.js +367 -0
  85. package/lib/module/components/TrackLogTab.js.map +1 -0
  86. package/lib/module/components/ZustandLogTab.js +446 -0
  87. package/lib/module/components/ZustandLogTab.js.map +1 -0
  88. package/lib/module/components/shared/CollapsibleSection.js +78 -0
  89. package/lib/module/components/shared/CollapsibleSection.js.map +1 -0
  90. package/lib/module/components/shared/CopyButton.js +58 -0
  91. package/lib/module/components/shared/CopyButton.js.map +1 -0
  92. package/lib/module/components/shared/JsonView.js +152 -0
  93. package/lib/module/components/shared/JsonView.js.map +1 -0
  94. package/lib/module/core/DebugToolkit.js +137 -0
  95. package/lib/module/core/DebugToolkit.js.map +1 -0
  96. package/lib/module/core/DebugToolkitProvider.js +58 -0
  97. package/lib/module/core/DebugToolkitProvider.js.map +1 -0
  98. package/lib/module/features/ClipboardFeature.js +12 -0
  99. package/lib/module/features/ClipboardFeature.js.map +1 -0
  100. package/lib/module/features/ConsoleLogFeature.js +93 -0
  101. package/lib/module/features/ConsoleLogFeature.js.map +1 -0
  102. package/lib/module/features/EnvironmentFeature.js +164 -0
  103. package/lib/module/features/EnvironmentFeature.js.map +1 -0
  104. package/lib/module/features/NavigationLogFeature.js +54 -0
  105. package/lib/module/features/NavigationLogFeature.js.map +1 -0
  106. package/lib/module/features/NetworkFeature.js +322 -0
  107. package/lib/module/features/NetworkFeature.js.map +1 -0
  108. package/lib/module/features/ThirdPartyLibsFeature.js +46 -0
  109. package/lib/module/features/ThirdPartyLibsFeature.js.map +1 -0
  110. package/lib/module/features/TrackFeature.js +49 -0
  111. package/lib/module/features/TrackFeature.js.map +1 -0
  112. package/lib/module/features/ZustandLogFeature.js +69 -0
  113. package/lib/module/features/ZustandLogFeature.js.map +1 -0
  114. package/lib/module/hooks/useNavigationLogger.js +74 -0
  115. package/lib/module/hooks/useNavigationLogger.js.map +1 -0
  116. package/lib/module/hooks/useSlideDetailAnimation.js +50 -0
  117. package/lib/module/hooks/useSlideDetailAnimation.js.map +1 -0
  118. package/lib/module/index.js +29 -0
  119. package/lib/module/index.js.map +1 -0
  120. package/lib/module/initialize.js +156 -0
  121. package/lib/module/initialize.js.map +1 -0
  122. package/lib/module/native/NativeDebugLibs.js +54 -0
  123. package/lib/module/native/NativeDebugLibs.js.map +1 -0
  124. package/lib/module/package.json +1 -0
  125. package/lib/module/types/index.js +4 -0
  126. package/lib/module/types/index.js.map +1 -0
  127. package/lib/module/utils/constants.js +130 -0
  128. package/lib/module/utils/constants.js.map +1 -0
  129. package/lib/module/utils/copyToComputer.js +91 -0
  130. package/lib/module/utils/copyToComputer.js.map +1 -0
  131. package/lib/module/utils/createEventChannel.js +17 -0
  132. package/lib/module/utils/createEventChannel.js.map +1 -0
  133. package/lib/module/utils/createObservableStore.js +34 -0
  134. package/lib/module/utils/createObservableStore.js.map +1 -0
  135. package/lib/module/utils/safeStringify.js +23 -0
  136. package/lib/module/utils/safeStringify.js.map +1 -0
  137. package/lib/typescript/src/components/ClipboardTab.d.ts +4 -0
  138. package/lib/typescript/src/components/ClipboardTab.d.ts.map +1 -0
  139. package/lib/typescript/src/components/ConsoleLogTab.d.ts +4 -0
  140. package/lib/typescript/src/components/ConsoleLogTab.d.ts.map +1 -0
  141. package/lib/typescript/src/components/EnvironmentTab.d.ts +4 -0
  142. package/lib/typescript/src/components/EnvironmentTab.d.ts.map +1 -0
  143. package/lib/typescript/src/components/FloatPanelView.d.ts +64 -0
  144. package/lib/typescript/src/components/FloatPanelView.d.ts.map +1 -0
  145. package/lib/typescript/src/components/NavigationLogTab.d.ts +4 -0
  146. package/lib/typescript/src/components/NavigationLogTab.d.ts.map +1 -0
  147. package/lib/typescript/src/components/NetworkLogTab.d.ts +4 -0
  148. package/lib/typescript/src/components/NetworkLogTab.d.ts.map +1 -0
  149. package/lib/typescript/src/components/ThirdPartyLibsTab.d.ts +4 -0
  150. package/lib/typescript/src/components/ThirdPartyLibsTab.d.ts.map +1 -0
  151. package/lib/typescript/src/components/TrackLogTab.d.ts +4 -0
  152. package/lib/typescript/src/components/TrackLogTab.d.ts.map +1 -0
  153. package/lib/typescript/src/components/ZustandLogTab.d.ts +4 -0
  154. package/lib/typescript/src/components/ZustandLogTab.d.ts.map +1 -0
  155. package/lib/typescript/src/components/shared/CollapsibleSection.d.ts +9 -0
  156. package/lib/typescript/src/components/shared/CollapsibleSection.d.ts.map +1 -0
  157. package/lib/typescript/src/components/shared/CopyButton.d.ts +12 -0
  158. package/lib/typescript/src/components/shared/CopyButton.d.ts.map +1 -0
  159. package/lib/typescript/src/components/shared/JsonView.d.ts +6 -0
  160. package/lib/typescript/src/components/shared/JsonView.d.ts.map +1 -0
  161. package/lib/typescript/src/core/DebugToolkit.d.ts +27 -0
  162. package/lib/typescript/src/core/DebugToolkit.d.ts.map +1 -0
  163. package/lib/typescript/src/core/DebugToolkitProvider.d.ts +18 -0
  164. package/lib/typescript/src/core/DebugToolkitProvider.d.ts.map +1 -0
  165. package/lib/typescript/src/features/ClipboardFeature.d.ts +3 -0
  166. package/lib/typescript/src/features/ClipboardFeature.d.ts.map +1 -0
  167. package/lib/typescript/src/features/ConsoleLogFeature.d.ts +7 -0
  168. package/lib/typescript/src/features/ConsoleLogFeature.d.ts.map +1 -0
  169. package/lib/typescript/src/features/EnvironmentFeature.d.ts +8 -0
  170. package/lib/typescript/src/features/EnvironmentFeature.d.ts.map +1 -0
  171. package/lib/typescript/src/features/NavigationLogFeature.d.ts +8 -0
  172. package/lib/typescript/src/features/NavigationLogFeature.d.ts.map +1 -0
  173. package/lib/typescript/src/features/NetworkFeature.d.ts +28 -0
  174. package/lib/typescript/src/features/NetworkFeature.d.ts.map +1 -0
  175. package/lib/typescript/src/features/ThirdPartyLibsFeature.d.ts +3 -0
  176. package/lib/typescript/src/features/ThirdPartyLibsFeature.d.ts.map +1 -0
  177. package/lib/typescript/src/features/TrackFeature.d.ts +12 -0
  178. package/lib/typescript/src/features/TrackFeature.d.ts.map +1 -0
  179. package/lib/typescript/src/features/ZustandLogFeature.d.ts +29 -0
  180. package/lib/typescript/src/features/ZustandLogFeature.d.ts.map +1 -0
  181. package/lib/typescript/src/hooks/useNavigationLogger.d.ts +20 -0
  182. package/lib/typescript/src/hooks/useNavigationLogger.d.ts.map +1 -0
  183. package/lib/typescript/src/hooks/useSlideDetailAnimation.d.ts +11 -0
  184. package/lib/typescript/src/hooks/useSlideDetailAnimation.d.ts.map +1 -0
  185. package/lib/typescript/src/index.d.ts +26 -0
  186. package/lib/typescript/src/index.d.ts.map +1 -0
  187. package/lib/typescript/src/initialize.d.ts +51 -0
  188. package/lib/typescript/src/initialize.d.ts.map +1 -0
  189. package/lib/typescript/src/native/NativeDebugLibs.d.ts +11 -0
  190. package/lib/typescript/src/native/NativeDebugLibs.d.ts.map +1 -0
  191. package/lib/typescript/src/types/index.d.ts +112 -0
  192. package/lib/typescript/src/types/index.d.ts.map +1 -0
  193. package/lib/typescript/src/utils/constants.d.ts +96 -0
  194. package/lib/typescript/src/utils/constants.d.ts.map +1 -0
  195. package/lib/typescript/src/utils/copyToComputer.d.ts +30 -0
  196. package/lib/typescript/src/utils/copyToComputer.d.ts.map +1 -0
  197. package/lib/typescript/src/utils/createEventChannel.d.ts +7 -0
  198. package/lib/typescript/src/utils/createEventChannel.d.ts.map +1 -0
  199. package/lib/typescript/src/utils/createObservableStore.d.ts +9 -0
  200. package/lib/typescript/src/utils/createObservableStore.d.ts.map +1 -0
  201. package/lib/typescript/src/utils/safeStringify.d.ts +6 -0
  202. package/lib/typescript/src/utils/safeStringify.d.ts.map +1 -0
  203. package/package.json +63 -24
  204. package/src/components/ClipboardTab.tsx +81 -0
  205. package/src/components/ConsoleLogTab.tsx +209 -0
  206. package/src/components/EnvironmentTab.tsx +276 -0
  207. package/src/components/FloatPanelView.tsx +714 -0
  208. package/src/components/NavigationLogTab.tsx +66 -0
  209. package/src/components/NetworkLogTab.tsx +411 -0
  210. package/src/components/ThirdPartyLibsTab.tsx +63 -0
  211. package/src/components/TrackLogTab.tsx +245 -0
  212. package/src/components/ZustandLogTab.tsx +305 -0
  213. package/src/components/shared/CollapsibleSection.tsx +78 -0
  214. package/src/components/shared/CopyButton.tsx +68 -0
  215. package/src/components/shared/JsonView.tsx +125 -0
  216. package/src/core/DebugToolkit.tsx +174 -0
  217. package/src/core/DebugToolkitProvider.tsx +89 -0
  218. package/src/features/ClipboardFeature.ts +11 -0
  219. package/src/features/ConsoleLogFeature.ts +118 -0
  220. package/src/features/EnvironmentFeature.ts +194 -0
  221. package/src/features/NavigationLogFeature.ts +74 -0
  222. package/src/features/NetworkFeature.ts +488 -0
  223. package/src/features/ThirdPartyLibsFeature.ts +42 -0
  224. package/src/features/TrackFeature.ts +69 -0
  225. package/src/features/ZustandLogFeature.ts +127 -0
  226. package/src/hooks/useNavigationLogger.ts +107 -0
  227. package/src/hooks/useSlideDetailAnimation.ts +45 -0
  228. package/src/index.ts +52 -0
  229. package/src/initialize.ts +214 -0
  230. package/src/native/NativeDebugLibs.ts +74 -0
  231. package/src/types/index.ts +138 -0
  232. package/src/utils/constants.ts +91 -0
  233. package/src/utils/copyToComputer.ts +104 -0
  234. package/src/utils/createEventChannel.ts +22 -0
  235. package/src/utils/createObservableStore.ts +42 -0
  236. package/src/utils/safeStringify.ts +25 -0
  237. package/.cursor/rules/react-native.mdc +0 -41
  238. package/README.zh-CN.md +0 -230
  239. package/android/build.gradle +0 -34
  240. package/android/src/main/AndroidManifest.xml +0 -8
  241. package/android/src/main/java/com/reactnative/debuglibs/BuildTypeModule.java +0 -44
  242. package/android/src/main/java/com/reactnative/debuglibs/BuildTypePackage.java +0 -25
  243. package/android/src/main/java/com/reactnative/debuglibs/RNDebugLibsModule.java +0 -75
  244. package/android/src/main/java/com/reactnative/debuglibs/RNDebugLibsPackage.java +0 -28
  245. package/index.js +0 -41
  246. package/ios/BuildTypeModule.h +0 -9
  247. package/ios/BuildTypeModule.m +0 -42
  248. package/ios/RNDebugLibs.h +0 -10
  249. package/ios/RNDebugLibs.m +0 -79
  250. package/lib/DebugToolKit.js +0 -126
  251. package/lib/EnvironmentManager.ts +0 -80
  252. package/lib/NativeDebugLibs.js +0 -67
  253. package/lib/features/ConsoleLogFeature.js +0 -70
  254. package/lib/features/NavigationLogFeature.js +0 -45
  255. package/lib/features/NetworkFeature.js +0 -389
  256. package/lib/features/PerformanceFeature.js +0 -390
  257. package/lib/features/ThirdPartyLibsFeature.js +0 -63
  258. package/lib/features/TrackFeature.js +0 -94
  259. package/lib/features/ZustandLogFeature.js +0 -44
  260. package/lib/hooks/useNavigationLogger.js +0 -92
  261. package/lib/index.js +0 -114
  262. package/lib/navigation/NavigationLogger.js +0 -1
  263. package/lib/types/TrackTypes.ts +0 -92
  264. package/lib/utils/DebugConst.js +0 -67
  265. package/lib/utils/StorageUtils.js +0 -80
  266. package/lib/views/ConsoleLogDetails.js +0 -314
  267. package/lib/views/FloatPanelView.js +0 -697
  268. package/lib/views/HttpLogDetails.js +0 -648
  269. package/lib/views/NavigationLogDetails.js +0 -302
  270. package/lib/views/RestartModal.js +0 -75
  271. package/lib/views/SubViewConsoleLogs.js +0 -209
  272. package/lib/views/SubViewEnvironment.js +0 -73
  273. package/lib/views/SubViewHTTPLogs.js +0 -235
  274. package/lib/views/SubViewNavigationLogs.js +0 -199
  275. package/lib/views/SubViewPerformance.js +0 -515
  276. package/lib/views/SubViewThirdPartyLibs.js +0 -239
  277. package/lib/views/SubViewTrackLogs.js +0 -318
  278. package/lib/views/SubViewZustandLogs.js +0 -279
  279. package/lib/views/TabView.js +0 -66
  280. package/lib/views/TrackLogDetails.js +0 -481
  281. package/lib/views/ZustandLogDetails.js +0 -355
  282. package/react-native-debug-toolkit.podspec +0 -25
  283. package/react-native.config.js +0 -18
@@ -0,0 +1,791 @@
1
+ "use strict";
2
+
3
+ import React, { Component } from 'react';
4
+ import { View, Text, StyleSheet, Animated, PanResponder, Pressable, ScrollView, TouchableOpacity, Easing } from 'react-native';
5
+ import { Layout, Colors } from '../utils/constants';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ export class FloatPanelView extends Component {
8
+ tabScrollViewRef = /*#__PURE__*/React.createRef();
9
+ unsubscribeFns = [];
10
+ refreshTimeout = null;
11
+ isDisposed = false;
12
+ isSwitchingTab = false;
13
+ underlineInitialized = false;
14
+ tabScrollOffset = 0;
15
+ tabViewportWidth = 0;
16
+ tabContentWidth = 0;
17
+ tabLayouts = [];
18
+ constructor(props) {
19
+ super(props);
20
+ const initialPosition = {
21
+ x: Layout.screenWidth - Layout.iconSize - 16,
22
+ y: Layout.screenHeight / 2 - Layout.iconSize / 2
23
+ };
24
+ this.state = {
25
+ isOpen: false,
26
+ toFloat: true,
27
+ pan: new Animated.ValueXY(initialPosition),
28
+ scale: new Animated.Value(1),
29
+ lastPosition: initialPosition,
30
+ activeTab: 0,
31
+ panelTranslateY: new Animated.Value(Layout.screenHeight),
32
+ backdropOpacity: new Animated.Value(0),
33
+ contentOpacity: new Animated.Value(1),
34
+ contentTranslateX: new Animated.Value(0),
35
+ underlineTranslateX: new Animated.Value(0),
36
+ underlineWidth: 0
37
+ };
38
+ this.gestureResponder = PanResponder.create({
39
+ onStartShouldSetPanResponder: () => true,
40
+ onMoveShouldSetPanResponder: () => true,
41
+ onPanResponderGrant: () => {
42
+ this.setState({
43
+ toFloat: true
44
+ });
45
+ Animated.spring(this.state.scale, {
46
+ toValue: 0.9,
47
+ friction: 5,
48
+ useNativeDriver: true
49
+ }).start();
50
+ },
51
+ onPanResponderMove: (_, gs) => {
52
+ const {
53
+ lastPosition
54
+ } = this.state;
55
+ const x = Math.max(0, Math.min(lastPosition.x + gs.dx, Layout.screenWidth - Layout.iconSize));
56
+ const y = Math.max(0, Math.min(lastPosition.y + gs.dy, Layout.screenHeight - Layout.iconSize));
57
+ this.state.pan.setValue({
58
+ x,
59
+ y
60
+ });
61
+ },
62
+ onPanResponderRelease: (_, gs) => {
63
+ if (Math.abs(gs.dx) < 5 && Math.abs(gs.dy) < 5) {
64
+ Animated.spring(this.state.scale, {
65
+ toValue: 1,
66
+ friction: 5,
67
+ useNativeDriver: true
68
+ }).start();
69
+ this.togglePanel();
70
+ return;
71
+ }
72
+ Animated.spring(this.state.scale, {
73
+ toValue: 1,
74
+ friction: 5,
75
+ useNativeDriver: true
76
+ }).start();
77
+ const {
78
+ lastPosition
79
+ } = this.state;
80
+ const newPosition = {
81
+ x: Math.max(0, Math.min(lastPosition.x + gs.dx, Layout.screenWidth - Layout.iconSize)),
82
+ y: Math.max(0, Math.min(lastPosition.y + gs.dy, Layout.screenHeight - Layout.iconSize))
83
+ };
84
+ this.setState({
85
+ lastPosition: newPosition,
86
+ toFloat: true
87
+ });
88
+ },
89
+ onPanResponderTerminate: (_, gs) => {
90
+ const {
91
+ lastPosition
92
+ } = this.state;
93
+ const newPosition = {
94
+ x: Math.max(0, Math.min(lastPosition.x + gs.dx, Layout.screenWidth - Layout.iconSize)),
95
+ y: Math.max(0, Math.min(lastPosition.y + gs.dy, Layout.screenHeight - Layout.iconSize))
96
+ };
97
+ this.setState({
98
+ lastPosition: newPosition
99
+ });
100
+ }
101
+ });
102
+ this.panelResponder = PanResponder.create({
103
+ onStartShouldSetPanResponder: () => true,
104
+ onMoveShouldSetPanResponder: (_, gs) => gs.dy > 5,
105
+ onPanResponderMove: (_, gs) => {
106
+ if (gs.dy > 0) {
107
+ this.state.panelTranslateY.setValue(gs.dy);
108
+ this.state.backdropOpacity.setValue(Math.max(0, 1 - gs.dy / 200));
109
+ }
110
+ },
111
+ onPanResponderRelease: (_, gs) => {
112
+ if (gs.dy > 100) {
113
+ this.closePanel();
114
+ } else {
115
+ Animated.spring(this.state.panelTranslateY, {
116
+ toValue: 0,
117
+ friction: 8,
118
+ tension: 50,
119
+ useNativeDriver: true
120
+ }).start();
121
+ Animated.timing(this.state.backdropOpacity, {
122
+ toValue: 1,
123
+ duration: 200,
124
+ useNativeDriver: true
125
+ }).start();
126
+ }
127
+ }
128
+ });
129
+
130
+ // Horizontal swipe for tab switching
131
+ this.swipeResponder = PanResponder.create({
132
+ onStartShouldSetPanResponder: () => false,
133
+ onMoveShouldSetPanResponder: (_, gs) => {
134
+ if (this.isSwitchingTab) return false;
135
+ return Math.abs(gs.dx) > 25 && Math.abs(gs.dx) > Math.abs(gs.dy) * 2.5;
136
+ },
137
+ onPanResponderRelease: (_, gs) => {
138
+ const tabs = this.getTabs();
139
+ if (gs.dx < -40 && this.state.activeTab < tabs.length - 1) {
140
+ this.switchTab(this.state.activeTab + 1);
141
+ } else if (gs.dx > 40 && this.state.activeTab > 0) {
142
+ this.switchTab(this.state.activeTab - 1);
143
+ }
144
+ },
145
+ onPanResponderTerminationRequest: () => true
146
+ });
147
+ }
148
+ componentDidMount() {
149
+ this.isDisposed = false;
150
+ this.subscribeToFeatures(this.props.features);
151
+ }
152
+ componentDidUpdate(prevProps) {
153
+ if (prevProps.features !== this.props.features) {
154
+ this.unsubscribeFromFeatures();
155
+ this.subscribeToFeatures(this.props.features);
156
+ if (this.state.activeTab >= this.props.features.length) {
157
+ this.setState({
158
+ activeTab: 0
159
+ });
160
+ }
161
+ }
162
+ }
163
+ componentWillUnmount() {
164
+ this.isDisposed = true;
165
+ if (this.refreshTimeout) {
166
+ clearTimeout(this.refreshTimeout);
167
+ this.refreshTimeout = null;
168
+ }
169
+ this.unsubscribeFromFeatures();
170
+ }
171
+ scheduleRefresh() {
172
+ if (this.isDisposed || this.refreshTimeout) return;
173
+ this.refreshTimeout = setTimeout(() => {
174
+ this.refreshTimeout = null;
175
+ if (!this.isDisposed) this.forceUpdate();
176
+ }, 0);
177
+ }
178
+ subscribeToFeatures(features) {
179
+ this.unsubscribeFns = features.map(feature => feature.subscribe?.(() => this.scheduleRefresh())).filter(unsubscribe => typeof unsubscribe === 'function');
180
+ }
181
+ unsubscribeFromFeatures() {
182
+ this.unsubscribeFns.forEach(unsubscribe => unsubscribe());
183
+ this.unsubscribeFns = [];
184
+ }
185
+ togglePanel = () => {
186
+ if (this.state.isOpen) this.closePanel();else this.openPanel();
187
+ };
188
+ openPanel = () => {
189
+ this.resetTabMeasurements();
190
+ this.setState({
191
+ isOpen: true,
192
+ toFloat: false,
193
+ underlineWidth: 0
194
+ }, () => {
195
+ Animated.parallel([Animated.spring(this.state.panelTranslateY, {
196
+ toValue: 0,
197
+ friction: 8,
198
+ tension: 65,
199
+ useNativeDriver: true
200
+ }), Animated.timing(this.state.backdropOpacity, {
201
+ toValue: 1,
202
+ duration: 250,
203
+ useNativeDriver: true
204
+ })]).start();
205
+ });
206
+ };
207
+ closePanel = () => {
208
+ Animated.parallel([Animated.spring(this.state.panelTranslateY, {
209
+ toValue: Layout.screenHeight,
210
+ friction: 8,
211
+ tension: 65,
212
+ useNativeDriver: true
213
+ }), Animated.timing(this.state.backdropOpacity, {
214
+ toValue: 0,
215
+ duration: 200,
216
+ useNativeDriver: true
217
+ })]).start(() => {
218
+ this.setState({
219
+ isOpen: false,
220
+ toFloat: true
221
+ });
222
+ });
223
+ };
224
+ resetTabMeasurements() {
225
+ this.underlineInitialized = false;
226
+ this.tabScrollOffset = 0;
227
+ this.tabViewportWidth = 0;
228
+ this.tabContentWidth = 0;
229
+ this.tabLayouts = [];
230
+ this.state.underlineTranslateX.setValue(0);
231
+ }
232
+ switchTab = index => {
233
+ if (this.isSwitchingTab || index === this.state.activeTab) return;
234
+ this.isSwitchingTab = true;
235
+ const direction = index > this.state.activeTab ? 1 : -1;
236
+
237
+ // Auto-scroll tab bar first, then animate underline
238
+ const layout = this.tabLayouts[index];
239
+ if (layout) {
240
+ const targetScrollX = this.getTabScrollTarget(index);
241
+ this.tabScrollOffset = targetScrollX;
242
+ if (this.tabScrollViewRef.current) {
243
+ this.tabScrollViewRef.current.scrollTo({
244
+ x: targetScrollX,
245
+ animated: true
246
+ });
247
+ }
248
+ this.animateUnderline(index, targetScrollX);
249
+ }
250
+
251
+ // Animate content: slide out + fade out
252
+ Animated.parallel([Animated.timing(this.state.contentOpacity, {
253
+ toValue: 0,
254
+ duration: 80,
255
+ useNativeDriver: true
256
+ }), Animated.timing(this.state.contentTranslateX, {
257
+ toValue: -direction * 40,
258
+ duration: 80,
259
+ useNativeDriver: true
260
+ })]).start(() => {
261
+ this.setState({
262
+ activeTab: index
263
+ }, () => {
264
+ // Reset translateX to opposite side instantly, then slide in + fade in
265
+ this.state.contentTranslateX.setValue(direction * 40);
266
+ Animated.parallel([Animated.timing(this.state.contentOpacity, {
267
+ toValue: 1,
268
+ duration: 150,
269
+ useNativeDriver: true
270
+ }), Animated.timing(this.state.contentTranslateX, {
271
+ toValue: 0,
272
+ duration: 200,
273
+ easing: Easing.out(Easing.cubic),
274
+ useNativeDriver: true
275
+ })]).start(() => {
276
+ this.isSwitchingTab = false;
277
+ });
278
+ });
279
+ });
280
+ };
281
+ animateUnderline(index, scrollOffset) {
282
+ const layout = this.tabLayouts[index];
283
+ if (!layout) {
284
+ return;
285
+ }
286
+ const offsetX = this.getClampedTabScrollOffset(scrollOffset ?? this.tabScrollOffset);
287
+ this.setState({
288
+ underlineWidth: layout.width
289
+ });
290
+ Animated.spring(this.state.underlineTranslateX, {
291
+ toValue: layout.x - offsetX,
292
+ friction: 7,
293
+ tension: 50,
294
+ useNativeDriver: true
295
+ }).start();
296
+ }
297
+ getMaxTabScrollOffset() {
298
+ return Math.max(0, this.tabContentWidth - this.tabViewportWidth);
299
+ }
300
+ getClampedTabScrollOffset(offset) {
301
+ return Math.min(Math.max(0, offset), this.getMaxTabScrollOffset());
302
+ }
303
+ getTabScrollTarget(index) {
304
+ const layout = this.tabLayouts[index];
305
+ if (!layout) {
306
+ return this.getClampedTabScrollOffset(this.tabScrollOffset);
307
+ }
308
+ return this.getClampedTabScrollOffset(layout.x - 60);
309
+ }
310
+ tryInitializeTabBar() {
311
+ if (this.underlineInitialized || this.tabViewportWidth <= 0 || this.tabContentWidth <= 0) {
312
+ return;
313
+ }
314
+ const layout = this.tabLayouts[this.state.activeTab];
315
+ if (!layout) {
316
+ return;
317
+ }
318
+ const targetScrollX = this.getTabScrollTarget(this.state.activeTab);
319
+ this.tabScrollOffset = targetScrollX;
320
+ if (this.tabScrollViewRef.current) {
321
+ this.tabScrollViewRef.current.scrollTo({
322
+ x: targetScrollX,
323
+ animated: false
324
+ });
325
+ }
326
+ this.state.underlineTranslateX.setValue(layout.x - targetScrollX);
327
+ this.setState({
328
+ underlineWidth: layout.width
329
+ });
330
+ this.underlineInitialized = true;
331
+ }
332
+ syncUnderlineToActiveTab() {
333
+ const layout = this.tabLayouts[this.state.activeTab];
334
+ if (!layout) {
335
+ return;
336
+ }
337
+ const clampedOffset = this.getClampedTabScrollOffset(this.tabScrollOffset);
338
+ if (clampedOffset !== this.tabScrollOffset) {
339
+ this.tabScrollOffset = clampedOffset;
340
+ }
341
+ this.state.underlineTranslateX.setValue(layout.x - clampedOffset);
342
+ if (this.state.underlineWidth !== layout.width) {
343
+ this.setState({
344
+ underlineWidth: layout.width
345
+ });
346
+ }
347
+ }
348
+ handleTabLayout = (index, event) => {
349
+ const {
350
+ x,
351
+ width
352
+ } = event.nativeEvent.layout;
353
+ this.tabLayouts[index] = {
354
+ x,
355
+ width
356
+ };
357
+ if (index === this.state.activeTab) {
358
+ this.tryInitializeTabBar();
359
+ }
360
+ };
361
+ getTabs() {
362
+ return this.props.features.map(f => ({
363
+ label: f.label,
364
+ id: f.name
365
+ }));
366
+ }
367
+ renderFeatureContent() {
368
+ const tabs = this.getTabs();
369
+ if (tabs.length === 0) {
370
+ return /*#__PURE__*/_jsx(Text, {
371
+ style: styles.emptyText,
372
+ children: "No debug features enabled"
373
+ });
374
+ }
375
+ const featureId = tabs[this.state.activeTab]?.id;
376
+ const feature = this.props.features.find(f => f.name === featureId);
377
+ if (!feature) {
378
+ return /*#__PURE__*/_jsx(Text, {
379
+ style: styles.emptyText,
380
+ children: "Feature not found"
381
+ });
382
+ }
383
+ const data = feature.getData();
384
+ const TabComponent = feature.renderContent;
385
+ if (TabComponent) {
386
+ return /*#__PURE__*/_jsx(TabComponent, {
387
+ data: data,
388
+ feature: feature
389
+ });
390
+ }
391
+ return /*#__PURE__*/_jsx(View, {
392
+ style: styles.genericContent,
393
+ children: /*#__PURE__*/_jsx(Text, {
394
+ style: styles.jsonContent,
395
+ children: JSON.stringify(data, null, 2)
396
+ })
397
+ });
398
+ }
399
+ render() {
400
+ const {
401
+ isOpen,
402
+ toFloat,
403
+ pan,
404
+ scale,
405
+ panelTranslateY,
406
+ backdropOpacity,
407
+ activeTab,
408
+ contentOpacity
409
+ } = this.state;
410
+ const tabs = this.getTabs();
411
+ return /*#__PURE__*/_jsxs(View, {
412
+ style: styles.container,
413
+ pointerEvents: "box-none",
414
+ children: [!isOpen && toFloat && /*#__PURE__*/_jsx(Animated.View, {
415
+ ...this.gestureResponder.panHandlers,
416
+ style: [styles.floatBtn, {
417
+ transform: [{
418
+ translateX: pan.x
419
+ }, {
420
+ translateY: pan.y
421
+ }, {
422
+ scale
423
+ }]
424
+ }],
425
+ children: /*#__PURE__*/_jsxs(Pressable, {
426
+ onPress: this.togglePanel,
427
+ style: styles.floatBtnInner,
428
+ children: [/*#__PURE__*/_jsxs(View, {
429
+ style: styles.iconGrid,
430
+ children: [/*#__PURE__*/_jsxs(View, {
431
+ style: styles.iconRow,
432
+ children: [/*#__PURE__*/_jsx(View, {
433
+ style: [styles.iconCell, {
434
+ backgroundColor: Colors.primary
435
+ }]
436
+ }), /*#__PURE__*/_jsx(View, {
437
+ style: [styles.iconCell, {
438
+ backgroundColor: Colors.success
439
+ }]
440
+ })]
441
+ }), /*#__PURE__*/_jsxs(View, {
442
+ style: styles.iconRow,
443
+ children: [/*#__PURE__*/_jsx(View, {
444
+ style: [styles.iconCell, {
445
+ backgroundColor: Colors.warning
446
+ }]
447
+ }), /*#__PURE__*/_jsx(View, {
448
+ style: [styles.iconCell, {
449
+ backgroundColor: Colors.purple
450
+ }]
451
+ })]
452
+ })]
453
+ }), (() => {
454
+ const envBadge = this.props.features.map(f => f.badge?.()).find(b => b != null);
455
+ if (!envBadge) return null;
456
+ return /*#__PURE__*/_jsx(View, {
457
+ style: [styles.envBadge, {
458
+ backgroundColor: envBadge.color
459
+ }],
460
+ children: /*#__PURE__*/_jsx(Text, {
461
+ style: styles.envBadgeText,
462
+ children: envBadge.label
463
+ })
464
+ });
465
+ })()]
466
+ })
467
+ }), isOpen && /*#__PURE__*/_jsxs(View, {
468
+ style: styles.panelContainer,
469
+ children: [/*#__PURE__*/_jsx(Animated.View, {
470
+ style: [styles.backdrop, {
471
+ opacity: backdropOpacity
472
+ }],
473
+ children: /*#__PURE__*/_jsx(Pressable, {
474
+ style: styles.backdropPressable,
475
+ onPress: this.closePanel
476
+ })
477
+ }), /*#__PURE__*/_jsxs(Animated.View, {
478
+ style: [styles.panel, {
479
+ transform: [{
480
+ translateY: panelTranslateY
481
+ }]
482
+ }],
483
+ children: [/*#__PURE__*/_jsxs(View, {
484
+ ...this.panelResponder.panHandlers,
485
+ children: [/*#__PURE__*/_jsx(View, {
486
+ style: styles.dragHandle,
487
+ children: /*#__PURE__*/_jsx(View, {
488
+ style: styles.dragIndicator
489
+ })
490
+ }), /*#__PURE__*/_jsxs(View, {
491
+ style: styles.header,
492
+ children: [/*#__PURE__*/_jsx(Text, {
493
+ style: styles.headerTitle,
494
+ children: "Debug Toolkit"
495
+ }), /*#__PURE__*/_jsxs(View, {
496
+ style: styles.headerButtons,
497
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
498
+ onPress: () => {
499
+ this.props.onClearAll();
500
+ this.closePanel();
501
+ },
502
+ style: styles.clearAllButton,
503
+ activeOpacity: 0.6,
504
+ children: /*#__PURE__*/_jsx(Text, {
505
+ style: styles.clearButtonText,
506
+ children: "Clear"
507
+ })
508
+ }), /*#__PURE__*/_jsx(Pressable, {
509
+ onPress: this.closePanel,
510
+ style: styles.closeButton,
511
+ children: /*#__PURE__*/_jsx(Text, {
512
+ style: styles.closeButtonText,
513
+ children: "\u2715"
514
+ })
515
+ })]
516
+ })]
517
+ })]
518
+ }), /*#__PURE__*/_jsxs(View, {
519
+ style: styles.panelContent,
520
+ children: [/*#__PURE__*/_jsxs(View, {
521
+ style: styles.tabBarContainer,
522
+ children: [/*#__PURE__*/_jsx(ScrollView, {
523
+ ref: this.tabScrollViewRef,
524
+ horizontal: true,
525
+ showsHorizontalScrollIndicator: false,
526
+ contentContainerStyle: styles.tabsScrollContainer,
527
+ onLayout: e => {
528
+ this.tabViewportWidth = e.nativeEvent.layout.width;
529
+ this.tryInitializeTabBar();
530
+ },
531
+ onContentSizeChange: width => {
532
+ this.tabContentWidth = width;
533
+ this.tryInitializeTabBar();
534
+ },
535
+ onScroll: e => {
536
+ this.tabScrollOffset = this.getClampedTabScrollOffset(e.nativeEvent.contentOffset.x);
537
+ // Keep underline aligned with active tab during manual scroll
538
+ if (!this.isSwitchingTab) {
539
+ this.syncUnderlineToActiveTab();
540
+ }
541
+ },
542
+ scrollEventThrottle: 16,
543
+ children: tabs.map((tab, index) => /*#__PURE__*/_jsx(TouchableOpacity, {
544
+ style: styles.tab,
545
+ onPress: () => this.switchTab(index),
546
+ activeOpacity: 0.7,
547
+ onLayout: e => this.handleTabLayout(index, e),
548
+ children: /*#__PURE__*/_jsx(Text, {
549
+ style: [styles.tabText, activeTab === index && styles.activeTabText],
550
+ numberOfLines: 1,
551
+ children: tab.label
552
+ })
553
+ }, tab.id))
554
+ }), /*#__PURE__*/_jsx(Animated.View, {
555
+ style: [styles.slidingUnderline, {
556
+ width: this.state.underlineWidth,
557
+ transform: [{
558
+ translateX: this.state.underlineTranslateX
559
+ }]
560
+ }]
561
+ })]
562
+ }), /*#__PURE__*/_jsx(Animated.View, {
563
+ style: [styles.contentContainer, {
564
+ opacity: contentOpacity,
565
+ transform: [{
566
+ translateX: this.state.contentTranslateX
567
+ }]
568
+ }],
569
+ ...this.swipeResponder.panHandlers,
570
+ children: this.renderFeatureContent()
571
+ })]
572
+ })]
573
+ })]
574
+ })]
575
+ });
576
+ }
577
+ }
578
+ const styles = StyleSheet.create({
579
+ container: {
580
+ position: 'absolute',
581
+ top: 0,
582
+ left: 0,
583
+ right: 0,
584
+ bottom: 0,
585
+ zIndex: 999
586
+ },
587
+ // Float button
588
+ floatBtn: {
589
+ position: 'absolute',
590
+ width: Layout.iconSize,
591
+ height: Layout.iconSize,
592
+ borderRadius: Layout.iconSize / 2,
593
+ backgroundColor: '#FFFFFF',
594
+ elevation: 6,
595
+ shadowColor: '#000',
596
+ shadowOffset: {
597
+ width: 0,
598
+ height: 2
599
+ },
600
+ shadowOpacity: 0.12,
601
+ shadowRadius: 8
602
+ },
603
+ floatBtnInner: {
604
+ width: '100%',
605
+ height: '100%',
606
+ alignItems: 'center',
607
+ justifyContent: 'center'
608
+ },
609
+ iconGrid: {
610
+ width: 22,
611
+ height: 22,
612
+ justifyContent: 'space-between'
613
+ },
614
+ iconRow: {
615
+ flexDirection: 'row',
616
+ justifyContent: 'space-between'
617
+ },
618
+ iconCell: {
619
+ width: 8,
620
+ height: 8,
621
+ borderRadius: 2.5
622
+ },
623
+ envBadge: {
624
+ position: 'absolute',
625
+ top: -4,
626
+ right: -4,
627
+ minWidth: 20,
628
+ height: 18,
629
+ borderRadius: 9,
630
+ paddingHorizontal: 5,
631
+ alignItems: 'center',
632
+ justifyContent: 'center',
633
+ borderWidth: 2,
634
+ borderColor: '#FFF',
635
+ elevation: 4
636
+ },
637
+ envBadgeText: {
638
+ color: '#FFF',
639
+ fontSize: 9,
640
+ fontWeight: '700'
641
+ },
642
+ // Panel
643
+ panelContainer: {
644
+ position: 'absolute',
645
+ top: 0,
646
+ left: 0,
647
+ right: 0,
648
+ bottom: 0,
649
+ justifyContent: 'flex-end'
650
+ },
651
+ backdrop: {
652
+ position: 'absolute',
653
+ top: 0,
654
+ left: 0,
655
+ right: 0,
656
+ bottom: 0,
657
+ backgroundColor: 'rgba(0,0,0,0.35)'
658
+ },
659
+ backdropPressable: {
660
+ flex: 1
661
+ },
662
+ panel: {
663
+ width: '100%',
664
+ height: '90%',
665
+ backgroundColor: Colors.background,
666
+ borderTopLeftRadius: 28,
667
+ borderTopRightRadius: 28,
668
+ overflow: 'hidden',
669
+ elevation: 24,
670
+ shadowColor: '#000',
671
+ shadowOffset: {
672
+ width: 0,
673
+ height: -4
674
+ },
675
+ shadowOpacity: 0.08,
676
+ shadowRadius: 12
677
+ },
678
+ dragHandle: {
679
+ width: '100%',
680
+ height: 20,
681
+ alignItems: 'center',
682
+ justifyContent: 'center',
683
+ backgroundColor: Colors.surface
684
+ },
685
+ dragIndicator: {
686
+ width: 40,
687
+ height: 4,
688
+ borderRadius: 2,
689
+ backgroundColor: '#D1D1D6'
690
+ },
691
+ panelContent: {
692
+ flex: 1
693
+ },
694
+ contentContainer: {
695
+ flex: 1
696
+ },
697
+ // Header
698
+ header: {
699
+ flexDirection: 'row',
700
+ justifyContent: 'space-between',
701
+ alignItems: 'center',
702
+ paddingHorizontal: 20,
703
+ paddingTop: 6,
704
+ paddingBottom: 10,
705
+ backgroundColor: Colors.surface
706
+ },
707
+ headerTitle: {
708
+ fontSize: 17,
709
+ fontWeight: '600',
710
+ color: Colors.text
711
+ },
712
+ headerButtons: {
713
+ flexDirection: 'row',
714
+ alignItems: 'center',
715
+ gap: 12
716
+ },
717
+ clearAllButton: {
718
+ paddingHorizontal: 12,
719
+ paddingVertical: 6,
720
+ borderRadius: 8,
721
+ backgroundColor: 'rgba(255,59,48,0.06)'
722
+ },
723
+ clearButtonText: {
724
+ color: Colors.error,
725
+ fontSize: 14,
726
+ fontWeight: '500'
727
+ },
728
+ closeButton: {
729
+ width: 30,
730
+ height: 30,
731
+ borderRadius: 15,
732
+ backgroundColor: Colors.background,
733
+ alignItems: 'center',
734
+ justifyContent: 'center'
735
+ },
736
+ closeButtonText: {
737
+ fontSize: 16,
738
+ fontWeight: '400',
739
+ color: Colors.textSecondary,
740
+ lineHeight: 16
741
+ },
742
+ // Tab bar - iOS 17 sliding underline style
743
+ tabBarContainer: {
744
+ backgroundColor: Colors.surface,
745
+ borderBottomWidth: StyleSheet.hairlineWidth,
746
+ borderBottomColor: Colors.border
747
+ },
748
+ tabsScrollContainer: {
749
+ paddingHorizontal: 20,
750
+ flexDirection: 'row'
751
+ },
752
+ tab: {
753
+ paddingVertical: 10,
754
+ paddingHorizontal: 14,
755
+ marginRight: 8
756
+ },
757
+ tabText: {
758
+ fontSize: 14,
759
+ fontWeight: '500',
760
+ color: Colors.textLight
761
+ },
762
+ activeTabText: {
763
+ color: Colors.primary,
764
+ fontWeight: '600'
765
+ },
766
+ slidingUnderline: {
767
+ position: 'absolute',
768
+ bottom: 0,
769
+ left: 0,
770
+ height: 2.5,
771
+ borderRadius: 1.25,
772
+ backgroundColor: Colors.primary
773
+ },
774
+ // Misc
775
+ emptyText: {
776
+ padding: 20,
777
+ textAlign: 'center',
778
+ color: Colors.textLight,
779
+ fontSize: 13
780
+ },
781
+ genericContent: {
782
+ padding: 16,
783
+ flex: 1
784
+ },
785
+ jsonContent: {
786
+ fontFamily: 'monospace',
787
+ fontSize: 12,
788
+ color: Colors.text
789
+ }
790
+ });
791
+ //# sourceMappingURL=FloatPanelView.js.map