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