@buoy-gg/network 7.0.41 → 7.0.42

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 (272) hide show
  1. package/README.md +11 -85
  2. package/lib/commonjs/index.js +1 -332
  3. package/lib/commonjs/index.web.js +1 -420
  4. package/lib/commonjs/network/components/DataViewer.web.js +1 -879
  5. package/lib/commonjs/network/components/NetworkCopyScreen.web.js +1 -48
  6. package/lib/commonjs/network/components/NetworkCopySettingsView.js +27 -755
  7. package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +14 -1242
  8. package/lib/commonjs/network/components/NetworkDetailScreen.web.js +1 -101
  9. package/lib/commonjs/network/components/NetworkDetailStepper.js +1 -108
  10. package/lib/commonjs/network/components/NetworkDetailStepper.web.js +1 -298
  11. package/lib/commonjs/network/components/NetworkEventDetailView.js +15 -1130
  12. package/lib/commonjs/network/components/NetworkEventDetailView.web.js +15 -1484
  13. package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -401
  14. package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +2 -820
  15. package/lib/commonjs/network/components/NetworkFilterScreen.web.js +1 -55
  16. package/lib/commonjs/network/components/NetworkFilterViewV3.js +1 -442
  17. package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1 -1310
  18. package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -375
  19. package/lib/commonjs/network/components/NetworkHeaderLive.web.js +1 -623
  20. package/lib/commonjs/network/components/NetworkHeaderMenu.js +1 -190
  21. package/lib/commonjs/network/components/NetworkListScreen.js +1 -403
  22. package/lib/commonjs/network/components/NetworkListScreen.web.js +1 -624
  23. package/lib/commonjs/network/components/NetworkModal.js +1 -786
  24. package/lib/commonjs/network/components/NetworkNumberPrompt.js +1 -178
  25. package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +1 -232
  26. package/lib/commonjs/network/components/NetworkOverrideEditor.js +1 -814
  27. package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +1 -942
  28. package/lib/commonjs/network/components/NetworkOverrideHeaderButton.js +1 -107
  29. package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +1 -133
  30. package/lib/commonjs/network/components/NetworkOverridesButton.js +1 -90
  31. package/lib/commonjs/network/components/NetworkOverridesButton.web.js +1 -143
  32. package/lib/commonjs/network/components/NetworkOverridesScreen.js +1 -543
  33. package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +1 -830
  34. package/lib/commonjs/network/components/NetworkSavedScreen.js +1 -226
  35. package/lib/commonjs/network/components/NetworkSavedScreen.web.js +1 -463
  36. package/lib/commonjs/network/components/NetworkUpgradeBanner.js +1 -76
  37. package/lib/commonjs/network/components/response-editor/Explorer.js +1 -973
  38. package/lib/commonjs/network/components/response-editor/Explorer.web.js +1 -1136
  39. package/lib/commonjs/network/components/response-editor/deleteNestedDataByPath.js +1 -56
  40. package/lib/commonjs/network/components/response-editor/editorContext.js +1 -33
  41. package/lib/commonjs/network/components/response-editor/updateNestedDataByPath.js +1 -61
  42. package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -235
  43. package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -136
  44. package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -33
  45. package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -310
  46. package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -219
  47. package/lib/commonjs/network/conditions/store.js +1 -75
  48. package/lib/commonjs/network/conditions/wait.js +1 -43
  49. package/lib/commonjs/network/conditions/xhr.js +1 -135
  50. package/lib/commonjs/network/hooks/useLiveNetworkEvent.js +1 -62
  51. package/lib/commonjs/network/hooks/useNetworkBadgeCounts.js +1 -83
  52. package/lib/commonjs/network/hooks/useNetworkEventList.js +1 -108
  53. package/lib/commonjs/network/hooks/useNetworkEvents.js +1 -318
  54. package/lib/commonjs/network/hooks/useNetworkHasMatches.js +1 -56
  55. package/lib/commonjs/network/hooks/useNetworkSaved.js +1 -38
  56. package/lib/commonjs/network/hooks/useNetworkSelection.js +1 -53
  57. package/lib/commonjs/network/hooks/useOverrideRules.js +1 -36
  58. package/lib/commonjs/network/hooks/useTickEveryMinute.js +1 -21
  59. package/lib/commonjs/network/overrides/applyToFetch.js +1 -80
  60. package/lib/commonjs/network/overrides/applyToXhr.js +2 -510
  61. package/lib/commonjs/network/overrides/engine.js +1 -93
  62. package/lib/commonjs/network/overrides/matchRule.js +1 -87
  63. package/lib/commonjs/network/overrides/overriddenRows.js +1 -37
  64. package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -550
  65. package/lib/commonjs/network/overrides/presets.js +1 -70
  66. package/lib/commonjs/network/overrides/resolveOverride.js +1 -158
  67. package/lib/commonjs/network/overrides/types.js +1 -90
  68. package/lib/commonjs/network/sync/networkBodyResolver.js +1 -39
  69. package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -882
  70. package/lib/commonjs/network/sync/overrideHonesty.release.test.js +1 -36
  71. package/lib/commonjs/network/types/index.js +1 -5
  72. package/lib/commonjs/network/utils/extractOperationName.js +1 -80
  73. package/lib/commonjs/network/utils/filterNetworkEvents.js +1 -96
  74. package/lib/commonjs/network/utils/formatGraphQLVariables.js +1 -219
  75. package/lib/commonjs/network/utils/formatting.js +1 -30
  76. package/lib/commonjs/network/utils/generateCurl.js +2 -71
  77. package/lib/commonjs/network/utils/generateNetworkCopyText.js +37 -166
  78. package/lib/commonjs/network/utils/httpCompletion.js +1 -37
  79. package/lib/commonjs/network/utils/networkEventStore.js +1 -411
  80. package/lib/commonjs/network/utils/networkListener.js +4 -1352
  81. package/lib/commonjs/network/utils/networkSavedStore.js +3 -577
  82. package/lib/commonjs/network/utils/networkSelectionStore.js +1 -193
  83. package/lib/commonjs/network/utils/realNow.js +1 -0
  84. package/lib/commonjs/network/utils/requestId.js +1 -16
  85. package/lib/commonjs/network/utils/resolveRequestUrl.js +1 -15
  86. package/lib/commonjs/network/utils/selectSavedEvents.js +1 -39
  87. package/lib/commonjs/network/utils/startNetworkCapture.js +1 -24
  88. package/lib/commonjs/network/utils/withPinnedFirst.js +1 -32
  89. package/lib/commonjs/preset.js +1 -93
  90. package/lib/module/index.js +1 -104
  91. package/lib/module/index.web.js +1 -82
  92. package/lib/module/network/components/DataViewer.web.js +1 -875
  93. package/lib/module/network/components/NetworkCopyScreen.web.js +1 -44
  94. package/lib/module/network/components/NetworkCopySettingsView.js +27 -750
  95. package/lib/module/network/components/NetworkCopySettingsView.web.js +14 -1237
  96. package/lib/module/network/components/NetworkDetailScreen.web.js +1 -97
  97. package/lib/module/network/components/NetworkDetailStepper.js +1 -104
  98. package/lib/module/network/components/NetworkDetailStepper.web.js +1 -296
  99. package/lib/module/network/components/NetworkEventDetailView.js +15 -1129
  100. package/lib/module/network/components/NetworkEventDetailView.web.js +15 -1482
  101. package/lib/module/network/components/NetworkEventItemCompact.js +2 -398
  102. package/lib/module/network/components/NetworkEventItemCompact.web.js +2 -818
  103. package/lib/module/network/components/NetworkFilterScreen.web.js +1 -51
  104. package/lib/module/network/components/NetworkFilterViewV3.js +1 -438
  105. package/lib/module/network/components/NetworkFilterViewV3.web.js +1 -1306
  106. package/lib/module/network/components/NetworkHeaderLive.js +1 -366
  107. package/lib/module/network/components/NetworkHeaderLive.web.js +1 -617
  108. package/lib/module/network/components/NetworkHeaderMenu.js +1 -184
  109. package/lib/module/network/components/NetworkListScreen.js +1 -399
  110. package/lib/module/network/components/NetworkListScreen.web.js +1 -622
  111. package/lib/module/network/components/NetworkModal.js +1 -781
  112. package/lib/module/network/components/NetworkNumberPrompt.js +1 -174
  113. package/lib/module/network/components/NetworkNumberPrompt.web.js +1 -230
  114. package/lib/module/network/components/NetworkOverrideEditor.js +1 -811
  115. package/lib/module/network/components/NetworkOverrideEditor.web.js +1 -939
  116. package/lib/module/network/components/NetworkOverrideHeaderButton.js +1 -104
  117. package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +1 -131
  118. package/lib/module/network/components/NetworkOverridesButton.js +1 -87
  119. package/lib/module/network/components/NetworkOverridesButton.web.js +1 -141
  120. package/lib/module/network/components/NetworkOverridesScreen.js +1 -539
  121. package/lib/module/network/components/NetworkOverridesScreen.web.js +1 -826
  122. package/lib/module/network/components/NetworkSavedScreen.js +1 -222
  123. package/lib/module/network/components/NetworkSavedScreen.web.js +1 -461
  124. package/lib/module/network/components/NetworkUpgradeBanner.js +1 -72
  125. package/lib/module/network/components/response-editor/Explorer.js +1 -972
  126. package/lib/module/network/components/response-editor/Explorer.web.js +1 -1133
  127. package/lib/module/network/components/response-editor/deleteNestedDataByPath.js +1 -51
  128. package/lib/module/network/components/response-editor/editorContext.js +1 -29
  129. package/lib/module/network/components/response-editor/updateNestedDataByPath.js +1 -56
  130. package/lib/module/network/conditions/NetworkConditionsControl.js +1 -231
  131. package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -135
  132. package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -29
  133. package/lib/module/network/conditions/NetworkFloatingTool.js +1 -304
  134. package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -218
  135. package/lib/module/network/conditions/store.js +1 -65
  136. package/lib/module/network/conditions/wait.js +1 -38
  137. package/lib/module/network/conditions/xhr.js +1 -131
  138. package/lib/module/network/hooks/useLiveNetworkEvent.js +1 -58
  139. package/lib/module/network/hooks/useNetworkBadgeCounts.js +1 -79
  140. package/lib/module/network/hooks/useNetworkEventList.js +1 -104
  141. package/lib/module/network/hooks/useNetworkEvents.js +1 -314
  142. package/lib/module/network/hooks/useNetworkHasMatches.js +1 -52
  143. package/lib/module/network/hooks/useNetworkSaved.js +1 -34
  144. package/lib/module/network/hooks/useNetworkSelection.js +1 -46
  145. package/lib/module/network/hooks/useOverrideRules.js +1 -32
  146. package/lib/module/network/hooks/useTickEveryMinute.js +1 -11
  147. package/lib/module/network/overrides/applyToFetch.js +1 -72
  148. package/lib/module/network/overrides/applyToXhr.js +2 -502
  149. package/lib/module/network/overrides/engine.js +1 -85
  150. package/lib/module/network/overrides/matchRule.js +1 -81
  151. package/lib/module/network/overrides/overriddenRows.js +1 -33
  152. package/lib/module/network/overrides/overrideRulesStore.js +1 -547
  153. package/lib/module/network/overrides/presets.js +1 -65
  154. package/lib/module/network/overrides/resolveOverride.js +1 -152
  155. package/lib/module/network/overrides/types.js +1 -86
  156. package/lib/module/network/sync/networkBodyResolver.js +1 -34
  157. package/lib/module/network/sync/networkSyncAdapter.js +1 -880
  158. package/lib/module/network/sync/overrideHonesty.release.test.js +1 -35
  159. package/lib/module/network/types/index.js +1 -3
  160. package/lib/module/network/utils/extractOperationName.js +1 -76
  161. package/lib/module/network/utils/filterNetworkEvents.js +1 -92
  162. package/lib/module/network/utils/formatGraphQLVariables.js +1 -213
  163. package/lib/module/network/utils/formatting.js +1 -9
  164. package/lib/module/network/utils/generateCurl.js +2 -67
  165. package/lib/module/network/utils/generateNetworkCopyText.js +37 -162
  166. package/lib/module/network/utils/httpCompletion.js +1 -32
  167. package/lib/module/network/utils/networkEventStore.js +1 -409
  168. package/lib/module/network/utils/networkListener.js +4 -1341
  169. package/lib/module/network/utils/networkSavedStore.js +3 -572
  170. package/lib/module/network/utils/networkSelectionStore.js +1 -188
  171. package/lib/module/network/utils/realNow.js +1 -0
  172. package/lib/module/network/utils/requestId.js +1 -12
  173. package/lib/module/network/utils/resolveRequestUrl.js +1 -11
  174. package/lib/module/network/utils/selectSavedEvents.js +1 -35
  175. package/lib/module/network/utils/startNetworkCapture.js +1 -21
  176. package/lib/module/network/utils/withPinnedFirst.js +1 -28
  177. package/lib/module/preset.js +1 -91
  178. package/lib/typescript/network/overrides/engine.d.ts +1 -1
  179. package/lib/typescript/network/overrides/matchRule.d.ts +1 -1
  180. package/lib/typescript/network/overrides/resolveOverride.d.ts +2 -2
  181. package/lib/typescript/network/overrides/types.d.ts +9 -0
  182. package/lib/typescript/network/utils/networkListener.d.ts +11 -0
  183. package/lib/typescript/network/utils/realNow.d.ts +18 -0
  184. package/lib/web/index.mjs +73 -74
  185. package/package.json +2 -2
  186. package/lib/typescript/index.d.ts.map +0 -1
  187. package/lib/typescript/index.web.d.ts.map +0 -1
  188. package/lib/typescript/network/components/DataViewer.web.d.ts.map +0 -1
  189. package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +0 -1
  190. package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +0 -1
  191. package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +0 -1
  192. package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +0 -1
  193. package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +0 -1
  194. package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +0 -1
  195. package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +0 -1
  196. package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +0 -1
  197. package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +0 -1
  198. package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +0 -1
  199. package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +0 -1
  200. package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +0 -1
  201. package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +0 -1
  202. package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +0 -1
  203. package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +0 -1
  204. package/lib/typescript/network/components/NetworkHeaderMenu.d.ts.map +0 -1
  205. package/lib/typescript/network/components/NetworkListScreen.d.ts.map +0 -1
  206. package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +0 -1
  207. package/lib/typescript/network/components/NetworkModal.d.ts.map +0 -1
  208. package/lib/typescript/network/components/NetworkNumberPrompt.d.ts.map +0 -1
  209. package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +0 -1
  210. package/lib/typescript/network/components/NetworkOverrideEditor.d.ts.map +0 -1
  211. package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +0 -1
  212. package/lib/typescript/network/components/NetworkOverrideHeaderButton.d.ts.map +0 -1
  213. package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +0 -1
  214. package/lib/typescript/network/components/NetworkOverridesButton.d.ts.map +0 -1
  215. package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +0 -1
  216. package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +0 -1
  217. package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +0 -1
  218. package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +0 -1
  219. package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +0 -1
  220. package/lib/typescript/network/components/NetworkUpgradeBanner.d.ts.map +0 -1
  221. package/lib/typescript/network/components/response-editor/Explorer.d.ts.map +0 -1
  222. package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +0 -1
  223. package/lib/typescript/network/components/response-editor/deleteNestedDataByPath.d.ts.map +0 -1
  224. package/lib/typescript/network/components/response-editor/editorContext.d.ts.map +0 -1
  225. package/lib/typescript/network/components/response-editor/updateNestedDataByPath.d.ts.map +0 -1
  226. package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts.map +0 -1
  227. package/lib/typescript/network/conditions/NetworkConditionsControl.test.d.ts.map +0 -1
  228. package/lib/typescript/network/conditions/NetworkConditionsIcon.d.ts.map +0 -1
  229. package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts.map +0 -1
  230. package/lib/typescript/network/conditions/NetworkFloatingTool.test.d.ts.map +0 -1
  231. package/lib/typescript/network/conditions/store.d.ts.map +0 -1
  232. package/lib/typescript/network/conditions/wait.d.ts.map +0 -1
  233. package/lib/typescript/network/conditions/xhr.d.ts.map +0 -1
  234. package/lib/typescript/network/hooks/useLiveNetworkEvent.d.ts.map +0 -1
  235. package/lib/typescript/network/hooks/useNetworkBadgeCounts.d.ts.map +0 -1
  236. package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +0 -1
  237. package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +0 -1
  238. package/lib/typescript/network/hooks/useNetworkHasMatches.d.ts.map +0 -1
  239. package/lib/typescript/network/hooks/useNetworkSaved.d.ts.map +0 -1
  240. package/lib/typescript/network/hooks/useNetworkSelection.d.ts.map +0 -1
  241. package/lib/typescript/network/hooks/useOverrideRules.d.ts.map +0 -1
  242. package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +0 -1
  243. package/lib/typescript/network/overrides/applyToFetch.d.ts.map +0 -1
  244. package/lib/typescript/network/overrides/applyToXhr.d.ts.map +0 -1
  245. package/lib/typescript/network/overrides/engine.d.ts.map +0 -1
  246. package/lib/typescript/network/overrides/matchRule.d.ts.map +0 -1
  247. package/lib/typescript/network/overrides/overriddenRows.d.ts.map +0 -1
  248. package/lib/typescript/network/overrides/overrideRulesStore.d.ts.map +0 -1
  249. package/lib/typescript/network/overrides/presets.d.ts.map +0 -1
  250. package/lib/typescript/network/overrides/resolveOverride.d.ts.map +0 -1
  251. package/lib/typescript/network/overrides/types.d.ts.map +0 -1
  252. package/lib/typescript/network/sync/networkBodyResolver.d.ts.map +0 -1
  253. package/lib/typescript/network/sync/networkSyncAdapter.d.ts.map +0 -1
  254. package/lib/typescript/network/sync/overrideHonesty.release.test.d.ts.map +0 -1
  255. package/lib/typescript/network/types/index.d.ts.map +0 -1
  256. package/lib/typescript/network/utils/extractOperationName.d.ts.map +0 -1
  257. package/lib/typescript/network/utils/filterNetworkEvents.d.ts.map +0 -1
  258. package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +0 -1
  259. package/lib/typescript/network/utils/formatting.d.ts.map +0 -1
  260. package/lib/typescript/network/utils/generateCurl.d.ts.map +0 -1
  261. package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +0 -1
  262. package/lib/typescript/network/utils/httpCompletion.d.ts.map +0 -1
  263. package/lib/typescript/network/utils/networkEventStore.d.ts.map +0 -1
  264. package/lib/typescript/network/utils/networkListener.d.ts.map +0 -1
  265. package/lib/typescript/network/utils/networkSavedStore.d.ts.map +0 -1
  266. package/lib/typescript/network/utils/networkSelectionStore.d.ts.map +0 -1
  267. package/lib/typescript/network/utils/requestId.d.ts.map +0 -1
  268. package/lib/typescript/network/utils/resolveRequestUrl.d.ts.map +0 -1
  269. package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +0 -1
  270. package/lib/typescript/network/utils/startNetworkCapture.d.ts.map +0 -1
  271. package/lib/typescript/network/utils/withPinnedFirst.d.ts.map +0 -1
  272. package/lib/typescript/preset.d.ts.map +0 -1
@@ -1,972 +1 @@
1
- "use strict";
2
-
3
- import { useState, useMemo, useCallback, useRef, useEffect, memo } from "react";
4
- import { Text, TouchableOpacity, View, StyleSheet } from "react-native";
5
- import { displayValue, buoyColors, monoFont } from "@buoy-gg/shared-ui";
6
- import { CopyButton as SharedCopyButton } from "@buoy-gg/shared-ui";
7
- import { ChevronRight, ChevronDown, Trash } from "@buoy-gg/shared-ui";
8
- import { CyberpunkInput } from "@buoy-gg/shared-ui/dataViewer";
9
- import { updateNestedDataByPath } from "./updateNestedDataByPath";
10
- import { deleteNestedDataByPath } from "./deleteNestedDataByPath";
11
- import { useResponseEditor } from "./editorContext";
12
-
13
- /**
14
- * The response-body tree: preview and editor as ONE surface.
15
- *
16
- * A 1:1 port of the React Query tool's `Explorer` — deliberately, because that
17
- * is the interaction that already works: there is no read mode and no edit
18
- * mode, no button that swaps one for the other. A string renders AS its input,
19
- * a boolean AS its toggle, and typing into what you are reading is the edit.
20
- *
21
- * The only thing changed from the original is where an edit LANDS. There it was
22
- * `queryClient.setQueryData(activeQuery.queryKey, …)`; here it's the `onChange`
23
- * from `ResponseEditorContext`, which turns the rebuilt body into an override
24
- * rule. Everything else — the chunked pages, the focus handling, the
25
- * local-input-state race note below — is carried over unchanged so the two
26
- * trees behave identically.
27
- */
28
-
29
- // Stable constants to prevent re-renders [[memory:4875251]]
30
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
31
- const CHUNK_SIZE = 100;
32
- const HIT_SLOP_OPTIMIZED = {
33
- top: 8,
34
- bottom: 8,
35
- left: 8,
36
- right: 8
37
- };
38
- const EXPANDER_SIZE = 12;
39
-
40
- // Optimized chunking function moved to module scope [[memory:4875251]]
41
- const chunkArray = (array, size = CHUNK_SIZE) => {
42
- if (size < 1 || array.length === 0) return [];
43
- const result = [];
44
- for (let i = 0; i < array.length; i += size) {
45
- result.push(array.slice(i, i + size));
46
- }
47
- return result;
48
- };
49
- // Memoized Expander component for performance [[memory:4875251]]
50
- const Expander = /*#__PURE__*/memo(({
51
- expanded,
52
- isFocused = false,
53
- isMain = false
54
- }) => {
55
- return /*#__PURE__*/_jsx(View, {
56
- style: [styles.expanderIcon, isMain && styles.expanderIconMain, expanded ? styles.expanded : styles.collapsed],
57
- children: expanded ? /*#__PURE__*/_jsx(ChevronDown, {
58
- size: isMain ? 14 : EXPANDER_SIZE,
59
- color: isFocused ? buoyColors.primary : isMain ? buoyColors.text : buoyColors.textSecondary,
60
- strokeWidth: 2.5
61
- }) : /*#__PURE__*/_jsx(ChevronRight, {
62
- size: isMain ? 14 : EXPANDER_SIZE,
63
- color: isFocused ? buoyColors.primary : isMain ? buoyColors.text : buoyColors.textSecondary,
64
- strokeWidth: 2.5
65
- })
66
- });
67
- });
68
- Expander.displayName = "Expander";
69
- // Local wrapper for the shared CopyButton to maintain backward compatibility
70
- const CopyButton = /*#__PURE__*/memo(({
71
- value,
72
- isFocused = false
73
- }) => {
74
- return /*#__PURE__*/_jsx(SharedCopyButton, {
75
- value: value,
76
- isFocused: isFocused,
77
- buttonStyle: isFocused ? {
78
- ...styles.buttonStyle,
79
- ...styles.buttonStyleFocused
80
- } : styles.buttonStyle
81
- });
82
- });
83
- CopyButton.displayName = "CopyButton";
84
-
85
- // Memoized DeleteItemButton component [[memory:4875251]]
86
- const DeleteItemButton = /*#__PURE__*/memo(({
87
- dataPath,
88
- isFocused = false
89
- }) => {
90
- const editor = useResponseEditor();
91
- const handleDelete = useCallback(() => {
92
- if (!editor) return;
93
- editor.onChange(deleteNestedDataByPath(editor.root, dataPath));
94
- }, [editor, dataPath]);
95
- if (!editor) return null;
96
- return /*#__PURE__*/_jsx(TouchableOpacity, {
97
- "sentry-label": "ignore devtools explorer delete button",
98
- onPress: handleDelete,
99
- style: [styles.deleteButton, isFocused && styles.deleteButtonFocused],
100
- accessibilityLabel: "Delete item",
101
- hitSlop: HIT_SLOP_OPTIMIZED,
102
- activeOpacity: 0.7,
103
- children: /*#__PURE__*/_jsx(Trash, {
104
- size: 14,
105
- strokeWidth: 2,
106
- color: isFocused ? buoyColors.error : buoyColors.error + "CC"
107
- })
108
- });
109
- });
110
- DeleteItemButton.displayName = "DeleteItemButton";
111
- // Memoized ClearArrayButton component [[memory:4875251]]
112
- const ClearArrayButton = /*#__PURE__*/memo(({
113
- dataPath,
114
- isFocused = false
115
- }) => {
116
- const editor = useResponseEditor();
117
- const handleClear = useCallback(() => {
118
- if (!editor) return;
119
- editor.onChange(updateNestedDataByPath(editor.root, dataPath, []));
120
- }, [editor, dataPath]);
121
- if (!editor) return null;
122
- return /*#__PURE__*/_jsx(TouchableOpacity, {
123
- "sentry-label": "ignore devtools explorer clear button",
124
- style: [styles.clearButton, isFocused && styles.clearButtonFocused],
125
- "aria-label": "Remove all items",
126
- onPress: handleClear,
127
- hitSlop: HIT_SLOP_OPTIMIZED,
128
- activeOpacity: 0.7,
129
- children: /*#__PURE__*/_jsx(Text, {
130
- style: [styles.clearButtonText, {
131
- color: isFocused ? buoyColors.warning : buoyColors.warning + "CC"
132
- }],
133
- children: "[]"
134
- })
135
- });
136
- });
137
- ClearArrayButton.displayName = "ClearArrayButton";
138
- // ToggleValueButton - not memoized because parent Explorer passes new dataPath array each render
139
- // which defeats memo anyway, and we need reliable re-renders when value changes
140
- function ToggleValueButton({
141
- dataPath,
142
- value,
143
- itemsDeletable
144
- }) {
145
- const editor = useResponseEditor();
146
- const handleClick = useCallback(() => {
147
- if (!editor) return;
148
- const currentValue = typeof value === "boolean" ? value : false;
149
- editor.onChange(updateNestedDataByPath(editor.root, dataPath, !currentValue));
150
- }, [editor, dataPath, value]);
151
- const handleDelete = useCallback(() => {
152
- if (!editor) return;
153
- editor.onChange(deleteNestedDataByPath(editor.root, dataPath));
154
- }, [editor, dataPath]);
155
- if (!editor) return null;
156
-
157
- // Pre-compute styles based on value state
158
- const badgeStyle = value ? styles.toggleBadgeTrue : styles.toggleBadgeFalse;
159
- const textStyle = value ? styles.toggleTextTrue : styles.toggleTextFalse;
160
- return /*#__PURE__*/_jsxs(TouchableOpacity, {
161
- "sentry-label": "ignore devtools explorer toggle button",
162
- style: styles.modernToggleButton,
163
- onPress: handleClick,
164
- hitSlop: HIT_SLOP_OPTIMIZED,
165
- activeOpacity: 0.8,
166
- children: [/*#__PURE__*/_jsx(View, {
167
- style: [styles.toggleBadge, badgeStyle],
168
- children: /*#__PURE__*/_jsx(Text, {
169
- style: [styles.toggleBadgeText, textStyle],
170
- children: value ? "TRUE" : "FALSE"
171
- })
172
- }), itemsDeletable && /*#__PURE__*/_jsx(TouchableOpacity, {
173
- "sentry-label": "ignore devtools explorer delete button in toggle",
174
- onPress: handleDelete,
175
- style: styles.deleteButtonInToggle,
176
- accessibilityLabel: "Delete item",
177
- hitSlop: HIT_SLOP_OPTIMIZED,
178
- activeOpacity: 0.7,
179
- children: /*#__PURE__*/_jsx(Trash, {
180
- size: 14,
181
- strokeWidth: 2,
182
- color: buoyColors.error + "CC"
183
- })
184
- })]
185
- });
186
- }
187
- // Optimized Explorer component following rule2 guidelines [[memory:4875251]]
188
- /**
189
- * Recursive data explorer component used for both editable and read-only JSON trees inside the
190
- * React Query dev tools.
191
- */
192
- export default function Explorer({
193
- editable,
194
- label,
195
- value,
196
- defaultExpanded,
197
- dataPath,
198
- itemsDeletable,
199
- dataVersion = 0
200
- }) {
201
- const editor = useResponseEditor();
202
- const [isRowFocused, setIsRowFocused] = useState(false);
203
-
204
- // Local state for input value to handle typing properly
205
- const [localInputValue, setLocalInputValue] = useState("");
206
-
207
- // Sync local state with prop value
208
- // ⚠️ CRITICAL: Do NOT add localInputValue to the dependency array!
209
- // Adding localInputValue causes a race condition where user edits get reverted:
210
- // 1. User types "5101" → setLocalInputValue("5101")
211
- // 2. Cache updates
212
- // 3. useEffect fires because localInputValue changed
213
- // 4. At this moment, value prop is still old (5100)
214
- // 5. Syncs back to 5100, reverting user's change ❌
215
- // Only sync when EXTERNAL changes happen (value, label, dataVersion)
216
- useEffect(() => {
217
- if (value !== null && value !== undefined && (typeof value === "string" || typeof value === "number")) {
218
- const newValue = value.toString();
219
- setLocalInputValue(newValue);
220
- }
221
- }, [value, label, dataVersion]); // ⚠️ DO NOT add localInputValue here!
222
-
223
- // Determine if this is a main section
224
- const isMainSection = useMemo(() => {
225
- const upperLabel = label.toUpperCase();
226
- return ["DATA", "QUERY", "QUERYKEY", "TYPES", "STATS", "OPTIONS", "OBSERVERS"].includes(upperLabel);
227
- }, [label]);
228
-
229
- // Explorer's section is expanded or collapsed
230
- const [isExpanded, setIsExpanded] = useState((defaultExpanded || []).includes(label));
231
- // Remove unnecessary useCallback - simple state setter [[memory:4875251]]
232
- const toggleExpanded = () => setIsExpanded(old => !old);
233
- const [expandedPages, setExpandedPages] = useState([]);
234
-
235
- // Optimized subEntries computation with early returns and limited processing [[memory:4875251]]
236
- const subEntries = useMemo(() => {
237
- // Early return for primitive values to avoid unnecessary computation
238
- if (value === null || value === undefined || typeof value !== "object") {
239
- return [];
240
- }
241
- if (Array.isArray(value)) {
242
- // Limit array processing for performance [[memory:4875251]]
243
- const limitedValue = value.length > 1000 ? value.slice(0, 1000) : value;
244
- return limitedValue.map((d, i) => ({
245
- label: i.toString(),
246
- value: d
247
- }));
248
- }
249
- if (value instanceof Map) {
250
- // Limit Map entries for performance
251
- const entries = Array.from(value.entries()).slice(0, 1000);
252
- return entries.map(([key, val]) => ({
253
- label: key.toString(),
254
- value: val
255
- }));
256
- }
257
- if (value instanceof Set) {
258
- // Limit Set entries for performance
259
- const entries = Array.from(value).slice(0, 1000);
260
- return entries.map((val, i) => ({
261
- label: i.toString(),
262
- value: val
263
- }));
264
- }
265
-
266
- // Handle regular objects with key limiting
267
- const entries = Object.entries(value).slice(0, 1000);
268
- return entries.map(([key, val]) => ({
269
- label: key,
270
- value: val
271
- }));
272
- }, [value]);
273
-
274
- // Optimized valueType computation with early returns [[memory:4875251]]
275
- const valueType = useMemo(() => {
276
- if (Array.isArray(value)) return "array";
277
- if (value === null || typeof value !== "object") return typeof value;
278
- if (value instanceof Map || value instanceof Set) return "Iterable";
279
- return "object";
280
- }, [value]);
281
-
282
- // Optimized chunking with stable chunk size [[memory:4875251]]
283
- const subEntryPages = useMemo(() => {
284
- return chunkArray(subEntries, CHUNK_SIZE);
285
- }, [subEntries]);
286
- const currentDataPath = dataPath ?? [];
287
-
288
- // Optimize handleChange using refs to avoid dependency arrays [[memory:4875251]]
289
- const editorRef = useRef(editor);
290
- const dataPathRef = useRef(currentDataPath);
291
- const valueTypeRef = useRef(valueType);
292
- editorRef.current = editor;
293
- dataPathRef.current = currentDataPath;
294
- valueTypeRef.current = valueType;
295
- const handleChange = useCallback((isNumber, newValue) => {
296
- // Update local state immediately for responsive typing
297
- setLocalInputValue(newValue);
298
- const current = editorRef.current;
299
- if (!current) return;
300
- if (isNumber && isNaN(Number(newValue))) return;
301
- const updatedValue = valueTypeRef.current === "number" ? Number(newValue) : newValue;
302
- current.onChange(updateNestedDataByPath(current.root, dataPathRef.current, updatedValue));
303
- }, [setLocalInputValue]);
304
- return /*#__PURE__*/_jsx(View, {
305
- style: styles.minWidthWrapper,
306
- children: /*#__PURE__*/_jsxs(View, {
307
- style: styles.fullWidthMarginRight,
308
- children: [subEntryPages.length > 0 && /*#__PURE__*/_jsxs(_Fragment, {
309
- children: [/*#__PURE__*/_jsxs(View, {
310
- style: [styles.flexRowItemsCenterGap, isMainSection && styles.flexRowItemsCenterGapMain],
311
- children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
312
- "sentry-label": "ignore devtools explorer expander button",
313
- style: styles.expanderButton,
314
- onPress: toggleExpanded,
315
- hitSlop: HIT_SLOP_OPTIMIZED,
316
- activeOpacity: 0.6,
317
- children: [/*#__PURE__*/_jsx(Expander, {
318
- expanded: isExpanded,
319
- isFocused: isRowFocused,
320
- isMain: isMainSection
321
- }), /*#__PURE__*/_jsx(Text, {
322
- style: [styles.labelText, isRowFocused && styles.labelTextFocused, isMainSection && styles.labelTextMain],
323
- children: label
324
- }), /*#__PURE__*/_jsx(Text, {
325
- style: styles.textGray500,
326
- children: `${String(valueType).toLowerCase() === "iterable" ? "(Iterable) " : ""}${subEntries.length} ${subEntries.length > 1 ? `items` : `item`}`
327
- })]
328
- }), editable && /*#__PURE__*/_jsxs(View, {
329
- style: styles.flexRowGapItemsCenter,
330
- children: [/*#__PURE__*/_jsx(CopyButton, {
331
- value: value,
332
- isFocused: isRowFocused
333
- }), itemsDeletable && editor !== null && /*#__PURE__*/_jsx(DeleteItemButton, {
334
- dataPath: currentDataPath,
335
- isFocused: isRowFocused
336
- }), valueType === "array" && editor !== null && /*#__PURE__*/_jsx(ClearArrayButton, {
337
- dataPath: currentDataPath,
338
- isFocused: isRowFocused
339
- })]
340
- })]
341
- }), isExpanded && /*#__PURE__*/_jsxs(_Fragment, {
342
- children: [subEntryPages.length === 1 && /*#__PURE__*/_jsx(View, {
343
- style: [styles.singleEntryContainer, isMainSection && styles.singleEntryContainerMain],
344
- children: subEntries.map((entry, index) => /*#__PURE__*/_jsx(Explorer, {
345
- defaultExpanded: defaultExpanded,
346
- label: entry.label,
347
- value: entry.value,
348
- editable: editable,
349
- dataPath: [...currentDataPath, entry.label],
350
- itemsDeletable: valueType === "array" || valueType === "Iterable" || valueType === "object",
351
- dataVersion: dataVersion
352
- }, entry.label + index))
353
- }), subEntryPages.length > 1 && /*#__PURE__*/_jsx(View, {
354
- style: styles.multiEntryContainer,
355
- children: subEntryPages.map((entries, index) => /*#__PURE__*/_jsx(View, {
356
- children: /*#__PURE__*/_jsxs(View, {
357
- style: styles.relativeOutlineNone,
358
- children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
359
- "sentry-label": "ignore devtools explorer page toggle",
360
- onPress: () => setExpandedPages(old => old.includes(index) ? old.filter(d => d !== index) : [...old, index]),
361
- style: styles.pageExpanderButton,
362
- hitSlop: HIT_SLOP_OPTIMIZED,
363
- children: [/*#__PURE__*/_jsx(Expander, {
364
- expanded: expandedPages.includes(index)
365
- }), /*#__PURE__*/_jsxs(Text, {
366
- style: styles.pageRangeText,
367
- children: ["[", index * CHUNK_SIZE, "...", index * CHUNK_SIZE + CHUNK_SIZE - 1, "]"]
368
- })]
369
- }), expandedPages.includes(index) && /*#__PURE__*/_jsx(View, {
370
- style: styles.entriesContainer,
371
- children: entries.map(entry => /*#__PURE__*/_jsx(Explorer, {
372
- defaultExpanded: defaultExpanded,
373
- label: entry.label,
374
- value: entry.value,
375
- editable: editable,
376
- dataPath: [...currentDataPath, entry.label],
377
- dataVersion: dataVersion
378
- }, entry.label))
379
- })]
380
- })
381
- }, index))
382
- })]
383
- })]
384
- }), subEntryPages.length === 0 && /*#__PURE__*/_jsxs(View, {
385
- style: styles.flexRowGapFullWidth,
386
- children: [editable && editor !== null && (valueType === "string" || valueType === "number" || valueType === "boolean") ? /*#__PURE__*/_jsxs(_Fragment, {
387
- children: [editable && editor && (valueType === "string" || valueType === "number") && /*#__PURE__*/_jsx(View, {
388
- style: styles.nebulaInputWrapper,
389
- children: /*#__PURE__*/_jsx(CyberpunkInput, {
390
- label: label,
391
- accessibilityLabel: "Data input field for editing values",
392
- style: [valueType === "number" ? styles.textNumber : styles.textString],
393
- keyboardType: valueType === "number" ? "numeric" : "default",
394
- value: localInputValue,
395
- onChangeText: newValue => handleChange(valueType === "number", newValue),
396
- onFocus: () => setIsRowFocused(true),
397
- onBlur: () => setIsRowFocused(false),
398
- showNumberControls: valueType === "number",
399
- onIncrement: () => {
400
- const currentNum = Number(localInputValue) || 0;
401
- handleChange(true, String(currentNum + 1));
402
- },
403
- onDecrement: () => {
404
- const currentNum = Number(localInputValue) || 0;
405
- handleChange(true, String(currentNum - 1));
406
- },
407
- showDeleteButton: itemsDeletable,
408
- onDelete: () => {
409
- editor.onChange(deleteNestedDataByPath(editor.root, currentDataPath));
410
- }
411
- })
412
- }), valueType === "boolean" && /*#__PURE__*/_jsxs(View, {
413
- style: styles.booleanRowContainer,
414
- children: [/*#__PURE__*/_jsx(Text, {
415
- style: styles.booleanLabel,
416
- children: label
417
- }), /*#__PURE__*/_jsx(View, {
418
- style: styles.booleanToggleWrapper,
419
- children: /*#__PURE__*/_jsx(ToggleValueButton, {
420
- dataPath: currentDataPath,
421
- value: value,
422
- itemsDeletable: itemsDeletable
423
- })
424
- })]
425
- })]
426
- }) : /*#__PURE__*/_jsxs(_Fragment, {
427
- children: [/*#__PURE__*/_jsx(Text, {
428
- style: styles.text344054,
429
- children: label
430
- }), /*#__PURE__*/_jsx(Text, {
431
- style: styles.displayValueText,
432
- children: displayValue(value)
433
- })]
434
- }), editable && itemsDeletable && editor !== null && valueType !== "string" && valueType !== "number" && valueType !== "boolean" && /*#__PURE__*/_jsx(DeleteItemButton, {
435
- dataPath: currentDataPath,
436
- isFocused: isRowFocused
437
- })]
438
- })]
439
- })
440
- });
441
- }
442
- const styles = StyleSheet.create({
443
- buttonStyle: {
444
- backgroundColor: buoyColors.card + "E6",
445
- borderWidth: 1,
446
- borderColor: buoyColors.textSecondary + "33",
447
- borderRadius: 6,
448
- flexDirection: "row",
449
- alignItems: "center",
450
- justifyContent: "center",
451
- width: 28,
452
- height: 28,
453
- position: "relative",
454
- shadowColor: "#000",
455
- shadowOffset: {
456
- width: 0,
457
- height: 1
458
- },
459
- shadowOpacity: 0.2,
460
- shadowRadius: 2
461
- },
462
- buttonStyleFocused: {
463
- borderColor: buoyColors.primary + "CC",
464
- backgroundColor: buoyColors.primary + "26",
465
- shadowColor: buoyColors.primary,
466
- shadowOpacity: 0.3,
467
- shadowRadius: 4
468
- },
469
- deleteButton: {
470
- backgroundColor: buoyColors.error + "1A",
471
- borderColor: buoyColors.error + "4D",
472
- borderWidth: 1,
473
- borderRadius: 6,
474
- padding: 0,
475
- alignItems: "center",
476
- justifyContent: "center",
477
- width: 28,
478
- height: 28,
479
- position: "relative",
480
- shadowColor: buoyColors.error,
481
- shadowOffset: {
482
- width: 0,
483
- height: 0
484
- },
485
- shadowOpacity: 0.15,
486
- shadowRadius: 3
487
- },
488
- deleteButtonFocused: {
489
- borderColor: buoyColors.error + "CC",
490
- backgroundColor: buoyColors.error + "33",
491
- shadowOpacity: 0.3,
492
- shadowRadius: 5
493
- },
494
- deleteButtonInToggle: {
495
- backgroundColor: buoyColors.error + "1A",
496
- borderColor: buoyColors.error + "4D",
497
- borderWidth: 1,
498
- borderRadius: 6,
499
- padding: 0,
500
- alignItems: "center",
501
- justifyContent: "center",
502
- width: 28,
503
- height: 28,
504
- shadowColor: buoyColors.error,
505
- shadowOffset: {
506
- width: 0,
507
- height: 0
508
- },
509
- shadowOpacity: 0.15,
510
- shadowRadius: 3
511
- },
512
- clearButton: {
513
- backgroundColor: buoyColors.warning + "1A",
514
- borderWidth: 1,
515
- borderColor: buoyColors.warning + "4D",
516
- borderRadius: 6,
517
- flexDirection: "row",
518
- padding: 0,
519
- alignItems: "center",
520
- justifyContent: "center",
521
- width: 28,
522
- height: 28,
523
- position: "relative",
524
- zIndex: 10,
525
- shadowColor: buoyColors.warning,
526
- shadowOffset: {
527
- width: 0,
528
- height: 0
529
- },
530
- shadowOpacity: 0.15,
531
- shadowRadius: 3
532
- },
533
- clearButtonFocused: {
534
- borderColor: buoyColors.warning + "CC",
535
- backgroundColor: buoyColors.warning + "33",
536
- shadowOpacity: 0.3,
537
- shadowRadius: 5
538
- },
539
- clearButtonText: {
540
- fontSize: 12,
541
- fontWeight: "700",
542
- fontFamily: monoFont
543
- },
544
- expanderIcon: {
545
- width: 18,
546
- height: 18,
547
- alignItems: "center",
548
- justifyContent: "center",
549
- marginRight: 1,
550
- backgroundColor: buoyColors.textSecondary + "14",
551
- borderRadius: 3
552
- },
553
- expanderIconMain: {
554
- backgroundColor: buoyColors.textSecondary + "1A",
555
- width: 20,
556
- height: 20,
557
- borderRadius: 4,
558
- borderWidth: 0.5,
559
- borderColor: buoyColors.textSecondary + "33"
560
- },
561
- expanded: {
562
- transform: [{
563
- rotate: "0deg"
564
- }]
565
- },
566
- collapsed: {
567
- transform: [{
568
- rotate: "0deg"
569
- }]
570
- },
571
- minWidthWrapper: {
572
- minWidth: 180,
573
- fontSize: 11,
574
- flexDirection: "row",
575
- flexWrap: "wrap",
576
- width: "100%",
577
- marginVertical: 0.5
578
- },
579
- fullWidthMarginRight: {
580
- position: "relative",
581
- width: "100%",
582
- marginRight: 1
583
- },
584
- flexRowItemsCenterGap: {
585
- flexDirection: "row",
586
- alignItems: "center",
587
- justifyContent: "space-between",
588
- paddingVertical: 3,
589
- paddingHorizontal: 6,
590
- marginVertical: 1,
591
- borderRadius: 4,
592
- backgroundColor: buoyColors.card + "66",
593
- borderWidth: 0.5,
594
- borderColor: buoyColors.textSecondary + "1A"
595
- },
596
- flexRowItemsCenterGapMain: {
597
- backgroundColor: buoyColors.card + "E6",
598
- borderLeftWidth: 2.5,
599
- borderLeftColor: buoyColors.textSecondary + "80",
600
- borderColor: buoyColors.textSecondary + "26",
601
- paddingVertical: 5,
602
- paddingHorizontal: 8,
603
- marginBottom: 3,
604
- borderWidth: 1,
605
- shadowColor: "#000",
606
- shadowOffset: {
607
- width: 0,
608
- height: 0
609
- },
610
- shadowOpacity: 0.08,
611
- shadowRadius: 3
612
- },
613
- expanderButton: {
614
- flexDirection: "row",
615
- alignItems: "center",
616
- backgroundColor: "transparent",
617
- paddingVertical: 1,
618
- paddingHorizontal: 2,
619
- gap: 6,
620
- borderWidth: 0,
621
- minHeight: 24,
622
- flex: 1
623
- },
624
- labelText: {
625
- color: buoyColors.textSecondary,
626
- fontSize: 10,
627
- fontWeight: "600",
628
- marginRight: 4,
629
- fontFamily: monoFont,
630
- letterSpacing: 0.4
631
- },
632
- labelTextFocused: {
633
- color: buoyColors.text
634
- },
635
- labelTextMain: {
636
- color: buoyColors.text,
637
- fontSize: 11,
638
- fontWeight: "700",
639
- letterSpacing: 0.6
640
- },
641
- textGray500: {
642
- color: buoyColors.textMuted,
643
- fontSize: 10,
644
- fontWeight: "400",
645
- fontFamily: monoFont,
646
- opacity: 0.7
647
- },
648
- pageRangeText: {
649
- color: buoyColors.textSecondary,
650
- fontSize: 10,
651
- fontWeight: "600",
652
- fontFamily: monoFont
653
- },
654
- flexRowGapItemsCenter: {
655
- flexDirection: "row",
656
- alignItems: "center",
657
- gap: 4,
658
- paddingLeft: 2
659
- },
660
- singleEntryContainer: {
661
- marginLeft: 2,
662
- marginTop: 2,
663
- paddingLeft: 8,
664
- borderLeftWidth: 1.5,
665
- borderLeftColor: buoyColors.textSecondary + "40"
666
- },
667
- singleEntryContainerMain: {
668
- borderLeftColor: buoyColors.textSecondary + "4D",
669
- marginLeft: 4,
670
- paddingLeft: 10
671
- },
672
- multiEntryContainer: {
673
- marginLeft: 2,
674
- marginTop: 2,
675
- paddingLeft: 8,
676
- borderLeftWidth: 1.5,
677
- borderLeftColor: buoyColors.textSecondary + "40"
678
- },
679
- multiEntryContainerMain: {
680
- borderLeftColor: buoyColors.textSecondary + "4D",
681
- marginLeft: 4,
682
- paddingLeft: 10
683
- },
684
- relativeOutlineNone: {
685
- position: "relative"
686
- },
687
- pageExpanderButton: {
688
- flexDirection: "row",
689
- alignItems: "center",
690
- backgroundColor: buoyColors.card + "66",
691
- paddingVertical: 3,
692
- paddingHorizontal: 6,
693
- gap: 6,
694
- borderRadius: 4,
695
- borderWidth: 0.5,
696
- borderColor: buoyColors.textSecondary + "1A",
697
- marginBottom: 2,
698
- minHeight: 24
699
- },
700
- entriesContainer: {
701
- marginLeft: 2,
702
- paddingLeft: 8,
703
- marginTop: 2,
704
- borderLeftWidth: 1.5,
705
- borderLeftColor: buoyColors.textSecondary + "40"
706
- },
707
- textNumber: {
708
- color: buoyColors.text,
709
- fontWeight: "600",
710
- fontFamily: monoFont
711
- },
712
- textString: {
713
- color: buoyColors.text,
714
- fontFamily: monoFont
715
- },
716
- flexRowGapFullWidth: {
717
- flexDirection: "row",
718
- width: "100%",
719
- alignItems: "center",
720
- marginVertical: 1,
721
- gap: 6,
722
- paddingHorizontal: 4,
723
- paddingVertical: 2,
724
- borderRadius: 3
725
- },
726
- text344054: {
727
- color: buoyColors.textSecondary,
728
- fontWeight: "600",
729
- fontSize: 9,
730
- minWidth: 50,
731
- fontFamily: monoFont,
732
- letterSpacing: 0.4,
733
- opacity: 0.8
734
- },
735
- numberInputButtons: {
736
- position: "absolute",
737
- right: 8,
738
- top: "50%",
739
- transform: [{
740
- translateY: -18
741
- }],
742
- flexDirection: "row",
743
- gap: 4,
744
- zIndex: 10
745
- },
746
- touchableButton: {
747
- width: 32,
748
- height: 32,
749
- borderRadius: 6,
750
- backgroundColor: buoyColors.card + "E6",
751
- borderWidth: 1,
752
- borderColor: buoyColors.textSecondary + "33",
753
- alignItems: "center",
754
- justifyContent: "center",
755
- marginLeft: 2,
756
- shadowColor: "#000",
757
- shadowOffset: {
758
- width: 0,
759
- height: 1
760
- },
761
- shadowOpacity: 0.2,
762
- shadowRadius: 2
763
- },
764
- touchableButtonFocused: {
765
- borderColor: buoyColors.primary + "CC",
766
- backgroundColor: buoyColors.primary + "26",
767
- shadowColor: buoyColors.primary,
768
- shadowOffset: {
769
- width: 0,
770
- height: 0
771
- },
772
- shadowOpacity: 0.3,
773
- shadowRadius: 4,
774
- elevation: 3
775
- },
776
- nebulaInputWrapper: {
777
- flex: 1,
778
- width: "100%",
779
- position: "relative"
780
- },
781
- displayValueText: {
782
- flex: 1,
783
- color: buoyColors.text,
784
- fontWeight: "400",
785
- fontFamily: monoFont,
786
- fontSize: 12,
787
- paddingVertical: 6,
788
- paddingHorizontal: 10,
789
- borderRadius: 6,
790
- borderWidth: 1,
791
- borderColor: buoyColors.textMuted + "66",
792
- minHeight: 34
793
- },
794
- // New redesigned styles (kept for future use)
795
- dataRow: {
796
- flexDirection: "row",
797
- alignItems: "center",
798
- paddingVertical: 4,
799
- paddingHorizontal: 8,
800
- minHeight: 44,
801
- gap: 12
802
- },
803
- dataLabel: {
804
- color: buoyColors.textSecondary,
805
- fontSize: 13,
806
- fontWeight: "500",
807
- minWidth: 80,
808
- flexShrink: 0
809
- },
810
- dataValueContainer: {
811
- flex: 1,
812
- flexDirection: "row",
813
- alignItems: "center"
814
- },
815
- inputWithActions: {
816
- flex: 1,
817
- position: "relative"
818
- },
819
- numberControls: {
820
- position: "absolute",
821
- right: 8,
822
- top: "50%",
823
- transform: [{
824
- translateY: -16
825
- }],
826
- flexDirection: "column",
827
- gap: 2
828
- },
829
- numberButton: {
830
- width: 32,
831
- height: 16,
832
- borderRadius: 4,
833
- alignItems: "center",
834
- justifyContent: "center",
835
- borderWidth: 1,
836
- borderColor: buoyColors.primary + "0F"
837
- },
838
- readOnlyValue: {
839
- color: buoyColors.text,
840
- fontSize: 13,
841
- fontFamily: monoFont,
842
- paddingVertical: 8,
843
- paddingHorizontal: 12,
844
- borderRadius: 6,
845
- borderWidth: 1,
846
- borderColor: buoyColors.textMuted + "33",
847
- flex: 1
848
- },
849
- actionButtons: {
850
- flexDirection: "row",
851
- gap: 6,
852
- paddingLeft: 8
853
- },
854
- booleanContainer: {
855
- flexDirection: "row",
856
- alignItems: "center",
857
- padding: 8,
858
- borderRadius: 6,
859
- borderWidth: 1,
860
- borderColor: buoyColors.textMuted + "4D",
861
- flex: 1
862
- },
863
- booleanText: {
864
- marginLeft: 8,
865
- color: buoyColors.warning,
866
- fontWeight: "500",
867
- fontFamily: monoFont
868
- },
869
- modernToggleButton: {
870
- flexDirection: "row",
871
- alignItems: "center",
872
- justifyContent: "space-between",
873
- borderRadius: 6,
874
- borderWidth: 1,
875
- borderColor: buoyColors.textMuted + "99",
876
- paddingHorizontal: 8,
877
- paddingVertical: 6,
878
- marginVertical: 2,
879
- minHeight: 34,
880
- gap: 8
881
- },
882
- toggleIconContainer: {
883
- marginRight: 6
884
- },
885
- toggleIcon: {
886
- padding: 8,
887
- borderRadius: 8,
888
- alignItems: "center",
889
- justifyContent: "center",
890
- width: 32,
891
- height: 32
892
- },
893
- toggleIconSmall: {
894
- width: 8,
895
- height: 8,
896
- borderRadius: 4
897
- },
898
- toggleContent: {
899
- flex: 1,
900
- minWidth: 0
901
- },
902
- toggleLabel: {
903
- color: "#E5E7EB",
904
- fontSize: 11,
905
- fontWeight: "600",
906
- fontFamily: monoFont,
907
- letterSpacing: 0.3
908
- },
909
- toggleStatus: {
910
- color: "#9CA3AF",
911
- fontSize: 11
912
- },
913
- toggleBadge: {
914
- marginLeft: 6,
915
- paddingHorizontal: 6,
916
- paddingVertical: 3,
917
- borderRadius: 4,
918
- borderWidth: 1
919
- },
920
- toggleBadgeText: {
921
- fontSize: 9,
922
- fontWeight: "700",
923
- textTransform: "uppercase",
924
- letterSpacing: 0.8,
925
- fontFamily: monoFont
926
- },
927
- // Pre-computed toggle icon styles to avoid inline objects [[memory:4875251]]
928
- toggleIconTrue: {
929
- backgroundColor: buoyColors.primary
930
- },
931
- toggleIconFalse: {
932
- backgroundColor: buoyColors.textMuted
933
- },
934
- // Pre-computed toggle badge styles [[memory:4875251]]
935
- toggleBadgeTrue: {
936
- backgroundColor: buoyColors.primary + "1A",
937
- borderColor: buoyColors.primary + "4D"
938
- },
939
- toggleBadgeFalse: {
940
- backgroundColor: buoyColors.textMuted + "1A",
941
- borderColor: buoyColors.textMuted + "4D"
942
- },
943
- // Pre-computed toggle text styles [[memory:4875251]]
944
- toggleTextTrue: {
945
- color: buoyColors.primary,
946
- fontWeight: "600"
947
- },
948
- toggleTextFalse: {
949
- color: buoyColors.textSecondary,
950
- fontWeight: "500"
951
- },
952
- // Boolean row container styles
953
- booleanRowContainer: {
954
- flexDirection: "row",
955
- alignItems: "center",
956
- width: "100%",
957
- gap: 8,
958
- paddingVertical: 2
959
- },
960
- booleanLabel: {
961
- color: buoyColors.textSecondary,
962
- fontSize: 10,
963
- fontWeight: "600",
964
- fontFamily: monoFont,
965
- letterSpacing: 0.4,
966
- minWidth: 60,
967
- flexShrink: 0
968
- },
969
- booleanToggleWrapper: {
970
- flex: 1
971
- }
972
- });
1
+ "use strict";import{useState as D,useMemo as F,useCallback as I,useRef as N,useEffect as re,memo as E}from"react";import{Text as y,TouchableOpacity as C,View as g,StyleSheet as oe}from"react-native";import{displayValue as ne,buoyColors as e,monoFont as h}from"@buoy-gg/shared-ui";import{CopyButton as ie}from"@buoy-gg/shared-ui";import{ChevronRight as ae,ChevronDown as le,Trash as K}from"@buoy-gg/shared-ui";import{CyberpunkInput as de}from"@buoy-gg/shared-ui/dataViewer";import{updateNestedDataByPath as M}from"./updateNestedDataByPath";import{deleteNestedDataByPath as j}from"./deleteNestedDataByPath";import{useResponseEditor as L}from"./editorContext";import{jsx as o,jsxs as u,Fragment as O}from"react/jsx-runtime";const T=100;const w={top:8,bottom:8,left:8,right:8};const Q=12;const se=(i,n=T)=>{if(n<1||i.length===0)return[];const t=[];for(let l=0;l<i.length;l+=n){t.push(i.slice(l,l+n))}return t};const P=E(({expanded:i,isFocused:n=false,isMain:t=false})=>{return o(g,{style:[r.expanderIcon,t&&r.expanderIconMain,i?r.expanded:r.collapsed],children:i?o(le,{size:t?14:Q,color:n?e.primary:t?e.text:e.textSecondary,strokeWidth:2.5}):o(ae,{size:t?14:Q,color:n?e.primary:t?e.text:e.textSecondary,strokeWidth:2.5})})});P.displayName="Expander";const X=E(({value:i,isFocused:n=false})=>{return o(ie,{value:i,isFocused:n,buttonStyle:n?{...r.buttonStyle,...r.buttonStyleFocused}:r.buttonStyle})});X.displayName="CopyButton";const H=E(({dataPath:i,isFocused:n=false})=>{const t=L();const l=I(()=>{if(!t)return;t.onChange(j(t.root,i))},[t,i]);if(!t)return null;return o(C,{"sentry-label":"ignore devtools explorer delete button",onPress:l,style:[r.deleteButton,n&&r.deleteButtonFocused],accessibilityLabel:"Delete item",hitSlop:w,activeOpacity:.7,children:o(K,{size:14,strokeWidth:2,color:n?e.error:e.error+"CC"})})});H.displayName="DeleteItemButton";const q=E(({dataPath:i,isFocused:n=false})=>{const t=L();const l=I(()=>{if(!t)return;t.onChange(M(t.root,i,[]))},[t,i]);if(!t)return null;return o(C,{"sentry-label":"ignore devtools explorer clear button",style:[r.clearButton,n&&r.clearButtonFocused],"aria-label":"Remove all items",onPress:l,hitSlop:w,activeOpacity:.7,children:o(y,{style:[r.clearButtonText,{color:n?e.warning:e.warning+"CC"}],children:"[]"})})});q.displayName="ClearArrayButton";function ce({dataPath:i,value:n,itemsDeletable:t}){const l=L();const k=I(()=>{if(!l)return;const m=typeof n==="boolean"?n:false;l.onChange(M(l.root,i,!m))},[l,i,n]);const x=I(()=>{if(!l)return;l.onChange(j(l.root,i))},[l,i]);if(!l)return null;const S=n?r.toggleBadgeTrue:r.toggleBadgeFalse;const p=n?r.toggleTextTrue:r.toggleTextFalse;return u(C,{"sentry-label":"ignore devtools explorer toggle button",style:r.modernToggleButton,onPress:k,hitSlop:w,activeOpacity:.8,children:[o(g,{style:[r.toggleBadge,S],children:o(y,{style:[r.toggleBadgeText,p],children:n?"TRUE":"FALSE"})}),t&&o(C,{"sentry-label":"ignore devtools explorer delete button in toggle",onPress:x,style:r.deleteButtonInToggle,accessibilityLabel:"Delete item",hitSlop:w,activeOpacity:.7,children:o(K,{size:14,strokeWidth:2,color:e.error+"CC"})})]})}export default function G({editable:i,label:n,value:t,defaultExpanded:l,dataPath:k,itemsDeletable:x,dataVersion:S=0}){const p=L();const[m,_]=D(false);const[z,V]=D("");re(()=>{if(t!==null&&t!==void 0&&(typeof t==="string"||typeof t==="number")){const d=t.toString();V(d)}},[t,n,S]);const B=F(()=>{const d=n.toUpperCase();return["DATA","QUERY","QUERYKEY","TYPES","STATS","OPTIONS","OBSERVERS"].includes(d)},[n]);const[v,J]=D((l||[]).includes(n));const ee=()=>J(d=>!d);const[Y,te]=D([]);const R=F(()=>{if(t===null||t===void 0||typeof t!=="object"){return[]}if(Array.isArray(t)){const a=t.length>1e3?t.slice(0,1e3):t;return a.map((c,b)=>({label:b.toString(),value:c}))}if(t instanceof Map){const a=Array.from(t.entries()).slice(0,1e3);return a.map(([c,b])=>({label:c.toString(),value:b}))}if(t instanceof Set){const a=Array.from(t).slice(0,1e3);return a.map((c,b)=>({label:b.toString(),value:c}))}const d=Object.entries(t).slice(0,1e3);return d.map(([a,c])=>({label:a,value:c}))},[t]);const s=F(()=>{if(Array.isArray(t))return"array";if(t===null||typeof t!=="object")return typeof t;if(t instanceof Map||t instanceof Set)return"Iterable";return"object"},[t]);const W=F(()=>{return se(R,T)},[R]);const f=k??[];const U=N(p);const Z=N(f);const $=N(s);U.current=p;Z.current=f;$.current=s;const A=I((d,a)=>{V(a);const c=U.current;if(!c)return;if(d&&isNaN(Number(a)))return;const b=$.current==="number"?Number(a):a;c.onChange(M(c.root,Z.current,b))},[V]);return o(g,{style:r.minWidthWrapper,children:u(g,{style:r.fullWidthMarginRight,children:[W.length>0&&u(O,{children:[u(g,{style:[r.flexRowItemsCenterGap,B&&r.flexRowItemsCenterGapMain],children:[u(C,{"sentry-label":"ignore devtools explorer expander button",style:r.expanderButton,onPress:ee,hitSlop:w,activeOpacity:.6,children:[o(P,{expanded:v,isFocused:m,isMain:B}),o(y,{style:[r.labelText,m&&r.labelTextFocused,B&&r.labelTextMain],children:n}),o(y,{style:r.textGray500,children:`${String(s).toLowerCase()==="iterable"?"(Iterable) ":""}${R.length} ${R.length>1?`items`:`item`}`})]}),i&&u(g,{style:r.flexRowGapItemsCenter,children:[o(X,{value:t,isFocused:m}),x&&p!==null&&o(H,{dataPath:f,isFocused:m}),s==="array"&&p!==null&&o(q,{dataPath:f,isFocused:m})]})]}),v&&u(O,{children:[W.length===1&&o(g,{style:[r.singleEntryContainer,B&&r.singleEntryContainerMain],children:R.map((d,a)=>o(G,{defaultExpanded:l,label:d.label,value:d.value,editable:i,dataPath:[...f,d.label],itemsDeletable:s==="array"||s==="Iterable"||s==="object",dataVersion:S},d.label+a))}),W.length>1&&o(g,{style:r.multiEntryContainer,children:W.map((d,a)=>o(g,{children:u(g,{style:r.relativeOutlineNone,children:[u(C,{"sentry-label":"ignore devtools explorer page toggle",onPress:()=>te(c=>c.includes(a)?c.filter(b=>b!==a):[...c,a]),style:r.pageExpanderButton,hitSlop:w,children:[o(P,{expanded:Y.includes(a)}),u(y,{style:r.pageRangeText,children:["[",a*T,"...",a*T+T-1,"]"]})]}),Y.includes(a)&&o(g,{style:r.entriesContainer,children:d.map(c=>o(G,{defaultExpanded:l,label:c.label,value:c.value,editable:i,dataPath:[...f,c.label],dataVersion:S},c.label))})]})},a))})]})]}),W.length===0&&u(g,{style:r.flexRowGapFullWidth,children:[i&&p!==null&&(s==="string"||s==="number"||s==="boolean")?u(O,{children:[i&&p&&(s==="string"||s==="number")&&o(g,{style:r.nebulaInputWrapper,children:o(de,{label:n,accessibilityLabel:"Data input field for editing values",style:[s==="number"?r.textNumber:r.textString],keyboardType:s==="number"?"numeric":"default",value:z,onChangeText:d=>A(s==="number",d),onFocus:()=>_(true),onBlur:()=>_(false),showNumberControls:s==="number",onIncrement:()=>{const d=Number(z)||0;A(true,String(d+1))},onDecrement:()=>{const d=Number(z)||0;A(true,String(d-1))},showDeleteButton:x,onDelete:()=>{p.onChange(j(p.root,f))}})}),s==="boolean"&&u(g,{style:r.booleanRowContainer,children:[o(y,{style:r.booleanLabel,children:n}),o(g,{style:r.booleanToggleWrapper,children:o(ce,{dataPath:f,value:t,itemsDeletable:x})})]})]}):u(O,{children:[o(y,{style:r.text344054,children:n}),o(y,{style:r.displayValueText,children:ne(t)})]}),i&&x&&p!==null&&s!=="string"&&s!=="number"&&s!=="boolean"&&o(H,{dataPath:f,isFocused:m})]})]})})}const r=oe.create({buttonStyle:{backgroundColor:e.card+"E6",borderWidth:1,borderColor:e.textSecondary+"33",borderRadius:6,flexDirection:"row",alignItems:"center",justifyContent:"center",width:28,height:28,position:"relative",shadowColor:"#000",shadowOffset:{width:0,height:1},shadowOpacity:.2,shadowRadius:2},buttonStyleFocused:{borderColor:e.primary+"CC",backgroundColor:e.primary+"26",shadowColor:e.primary,shadowOpacity:.3,shadowRadius:4},deleteButton:{backgroundColor:e.error+"1A",borderColor:e.error+"4D",borderWidth:1,borderRadius:6,padding:0,alignItems:"center",justifyContent:"center",width:28,height:28,position:"relative",shadowColor:e.error,shadowOffset:{width:0,height:0},shadowOpacity:.15,shadowRadius:3},deleteButtonFocused:{borderColor:e.error+"CC",backgroundColor:e.error+"33",shadowOpacity:.3,shadowRadius:5},deleteButtonInToggle:{backgroundColor:e.error+"1A",borderColor:e.error+"4D",borderWidth:1,borderRadius:6,padding:0,alignItems:"center",justifyContent:"center",width:28,height:28,shadowColor:e.error,shadowOffset:{width:0,height:0},shadowOpacity:.15,shadowRadius:3},clearButton:{backgroundColor:e.warning+"1A",borderWidth:1,borderColor:e.warning+"4D",borderRadius:6,flexDirection:"row",padding:0,alignItems:"center",justifyContent:"center",width:28,height:28,position:"relative",zIndex:10,shadowColor:e.warning,shadowOffset:{width:0,height:0},shadowOpacity:.15,shadowRadius:3},clearButtonFocused:{borderColor:e.warning+"CC",backgroundColor:e.warning+"33",shadowOpacity:.3,shadowRadius:5},clearButtonText:{fontSize:12,fontWeight:"700",fontFamily:h},expanderIcon:{width:18,height:18,alignItems:"center",justifyContent:"center",marginRight:1,backgroundColor:e.textSecondary+"14",borderRadius:3},expanderIconMain:{backgroundColor:e.textSecondary+"1A",width:20,height:20,borderRadius:4,borderWidth:.5,borderColor:e.textSecondary+"33"},expanded:{transform:[{rotate:"0deg"}]},collapsed:{transform:[{rotate:"0deg"}]},minWidthWrapper:{minWidth:180,fontSize:11,flexDirection:"row",flexWrap:"wrap",width:"100%",marginVertical:.5},fullWidthMarginRight:{position:"relative",width:"100%",marginRight:1},flexRowItemsCenterGap:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingVertical:3,paddingHorizontal:6,marginVertical:1,borderRadius:4,backgroundColor:e.card+"66",borderWidth:.5,borderColor:e.textSecondary+"1A"},flexRowItemsCenterGapMain:{backgroundColor:e.card+"E6",borderLeftWidth:2.5,borderLeftColor:e.textSecondary+"80",borderColor:e.textSecondary+"26",paddingVertical:5,paddingHorizontal:8,marginBottom:3,borderWidth:1,shadowColor:"#000",shadowOffset:{width:0,height:0},shadowOpacity:.08,shadowRadius:3},expanderButton:{flexDirection:"row",alignItems:"center",backgroundColor:"transparent",paddingVertical:1,paddingHorizontal:2,gap:6,borderWidth:0,minHeight:24,flex:1},labelText:{color:e.textSecondary,fontSize:10,fontWeight:"600",marginRight:4,fontFamily:h,letterSpacing:.4},labelTextFocused:{color:e.text},labelTextMain:{color:e.text,fontSize:11,fontWeight:"700",letterSpacing:.6},textGray500:{color:e.textMuted,fontSize:10,fontWeight:"400",fontFamily:h,opacity:.7},pageRangeText:{color:e.textSecondary,fontSize:10,fontWeight:"600",fontFamily:h},flexRowGapItemsCenter:{flexDirection:"row",alignItems:"center",gap:4,paddingLeft:2},singleEntryContainer:{marginLeft:2,marginTop:2,paddingLeft:8,borderLeftWidth:1.5,borderLeftColor:e.textSecondary+"40"},singleEntryContainerMain:{borderLeftColor:e.textSecondary+"4D",marginLeft:4,paddingLeft:10},multiEntryContainer:{marginLeft:2,marginTop:2,paddingLeft:8,borderLeftWidth:1.5,borderLeftColor:e.textSecondary+"40"},multiEntryContainerMain:{borderLeftColor:e.textSecondary+"4D",marginLeft:4,paddingLeft:10},relativeOutlineNone:{position:"relative"},pageExpanderButton:{flexDirection:"row",alignItems:"center",backgroundColor:e.card+"66",paddingVertical:3,paddingHorizontal:6,gap:6,borderRadius:4,borderWidth:.5,borderColor:e.textSecondary+"1A",marginBottom:2,minHeight:24},entriesContainer:{marginLeft:2,paddingLeft:8,marginTop:2,borderLeftWidth:1.5,borderLeftColor:e.textSecondary+"40"},textNumber:{color:e.text,fontWeight:"600",fontFamily:h},textString:{color:e.text,fontFamily:h},flexRowGapFullWidth:{flexDirection:"row",width:"100%",alignItems:"center",marginVertical:1,gap:6,paddingHorizontal:4,paddingVertical:2,borderRadius:3},text344054:{color:e.textSecondary,fontWeight:"600",fontSize:9,minWidth:50,fontFamily:h,letterSpacing:.4,opacity:.8},numberInputButtons:{position:"absolute",right:8,top:"50%",transform:[{translateY:-18}],flexDirection:"row",gap:4,zIndex:10},touchableButton:{width:32,height:32,borderRadius:6,backgroundColor:e.card+"E6",borderWidth:1,borderColor:e.textSecondary+"33",alignItems:"center",justifyContent:"center",marginLeft:2,shadowColor:"#000",shadowOffset:{width:0,height:1},shadowOpacity:.2,shadowRadius:2},touchableButtonFocused:{borderColor:e.primary+"CC",backgroundColor:e.primary+"26",shadowColor:e.primary,shadowOffset:{width:0,height:0},shadowOpacity:.3,shadowRadius:4,elevation:3},nebulaInputWrapper:{flex:1,width:"100%",position:"relative"},displayValueText:{flex:1,color:e.text,fontWeight:"400",fontFamily:h,fontSize:12,paddingVertical:6,paddingHorizontal:10,borderRadius:6,borderWidth:1,borderColor:e.textMuted+"66",minHeight:34},dataRow:{flexDirection:"row",alignItems:"center",paddingVertical:4,paddingHorizontal:8,minHeight:44,gap:12},dataLabel:{color:e.textSecondary,fontSize:13,fontWeight:"500",minWidth:80,flexShrink:0},dataValueContainer:{flex:1,flexDirection:"row",alignItems:"center"},inputWithActions:{flex:1,position:"relative"},numberControls:{position:"absolute",right:8,top:"50%",transform:[{translateY:-16}],flexDirection:"column",gap:2},numberButton:{width:32,height:16,borderRadius:4,alignItems:"center",justifyContent:"center",borderWidth:1,borderColor:e.primary+"0F"},readOnlyValue:{color:e.text,fontSize:13,fontFamily:h,paddingVertical:8,paddingHorizontal:12,borderRadius:6,borderWidth:1,borderColor:e.textMuted+"33",flex:1},actionButtons:{flexDirection:"row",gap:6,paddingLeft:8},booleanContainer:{flexDirection:"row",alignItems:"center",padding:8,borderRadius:6,borderWidth:1,borderColor:e.textMuted+"4D",flex:1},booleanText:{marginLeft:8,color:e.warning,fontWeight:"500",fontFamily:h},modernToggleButton:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",borderRadius:6,borderWidth:1,borderColor:e.textMuted+"99",paddingHorizontal:8,paddingVertical:6,marginVertical:2,minHeight:34,gap:8},toggleIconContainer:{marginRight:6},toggleIcon:{padding:8,borderRadius:8,alignItems:"center",justifyContent:"center",width:32,height:32},toggleIconSmall:{width:8,height:8,borderRadius:4},toggleContent:{flex:1,minWidth:0},toggleLabel:{color:"#E5E7EB",fontSize:11,fontWeight:"600",fontFamily:h,letterSpacing:.3},toggleStatus:{color:"#9CA3AF",fontSize:11},toggleBadge:{marginLeft:6,paddingHorizontal:6,paddingVertical:3,borderRadius:4,borderWidth:1},toggleBadgeText:{fontSize:9,fontWeight:"700",textTransform:"uppercase",letterSpacing:.8,fontFamily:h},toggleIconTrue:{backgroundColor:e.primary},toggleIconFalse:{backgroundColor:e.textMuted},toggleBadgeTrue:{backgroundColor:e.primary+"1A",borderColor:e.primary+"4D"},toggleBadgeFalse:{backgroundColor:e.textMuted+"1A",borderColor:e.textMuted+"4D"},toggleTextTrue:{color:e.primary,fontWeight:"600"},toggleTextFalse:{color:e.textSecondary,fontWeight:"500"},booleanRowContainer:{flexDirection:"row",alignItems:"center",width:"100%",gap:8,paddingVertical:2},booleanLabel:{color:e.textSecondary,fontSize:10,fontWeight:"600",fontFamily:h,letterSpacing:.4,minWidth:60,flexShrink:0},booleanToggleWrapper:{flex:1}});