@buoy-gg/network 7.0.41 → 7.0.43

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 +3 -6
  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,51 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * NetworkFilterScreen.web — DOM twin of the `NetworkFilterScreen` screen
5
- * component inside NetworkModal.tsx (the native screen is private to the
6
- * modal; web hosts compose their own shell, so the screen is exported here as
7
- * the reusable piece — same precedent as NetworkDetailScreen.web).
8
- *
9
- * Same rule4 contract as native: hooks run unconditionally and the component
10
- * returns null when not visible; the subscription passes `paused || !visible`
11
- * so a hidden screen doesn't subscribe. Facet counts read the SAME filtered
12
- * list the user is looking at (`useNetworkEventList` — the platform-free hook
13
- * native uses, reused, not forked).
14
- *
15
- * @platform React DOM Web
16
- */
17
-
18
- import { useNetworkEventList } from "../hooks/useNetworkEventList";
19
- import { NetworkFilterViewV3 } from "./NetworkFilterViewV3.web";
20
- import { jsx as _jsx } from "react/jsx-runtime";
21
- export function NetworkFilterScreen({
22
- visible,
23
- paused,
24
- isPro,
25
- filter,
26
- onFilterChange,
27
- ignoredPatterns,
28
- onRemovePattern,
29
- onAddPattern,
30
- onTogglePatternMode
31
- }) {
32
- // Facet counts read the same filtered list the user is looking at.
33
- const {
34
- events
35
- } = useNetworkEventList({
36
- filter,
37
- ignoredPatterns,
38
- paused: paused || !visible,
39
- isPro
40
- });
41
- if (!visible) return null;
42
- return /*#__PURE__*/_jsx(NetworkFilterViewV3, {
43
- events: events,
44
- filter: filter,
45
- onFilterChange: onFilterChange,
46
- ignoredPatterns: ignoredPatterns,
47
- onRemovePattern: onRemovePattern,
48
- onAddPattern: onAddPattern,
49
- onTogglePatternMode: onTogglePatternMode
50
- });
51
- }
1
+ "use strict";import{useNetworkEventList as f}from"../hooks/useNetworkEventList";import{NetworkFilterViewV3 as l}from"./NetworkFilterViewV3.web";import{jsx as p}from"react/jsx-runtime";export function NetworkFilterScreen({visible:e,paused:o,isPro:n,filter:t,onFilterChange:s,ignoredPatterns:r,onRemovePattern:i,onAddPattern:m,onTogglePatternMode:u}){const{events:a}=f({filter:t,ignoredPatterns:r,paused:o||!e,isPro:n});if(!e)return null;return p(l,{events:a,filter:t,onFilterChange:s,ignoredPatterns:r,onRemovePattern:i,onAddPattern:m,onTogglePatternMode:u})}
@@ -1,438 +1 @@
1
- "use strict";
2
-
3
- import { CheckCircle, Clock, DynamicFilterView, Film, FileJson, FileText, Filter, Globe, Image, macOSColors, night, Music, XCircle, monoFont } from "@buoy-gg/shared-ui";
4
- import { useCallback, useMemo, useState } from "react";
5
- import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
6
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
- function getContentType(event) {
8
- const headers = event.responseHeaders || event.requestHeaders;
9
- const contentType = headers?.["content-type"] || headers?.["Content-Type"] || "";
10
- if (contentType.includes("json")) return {
11
- type: "JSON",
12
- color: macOSColors.semantic.info
13
- };
14
- if (contentType.includes("xml")) return {
15
- type: "XML",
16
- color: macOSColors.semantic.success
17
- };
18
- if (contentType.includes("html")) return {
19
- type: "HTML",
20
- color: macOSColors.semantic.warning
21
- };
22
- if (contentType.includes("text")) return {
23
- type: "TEXT",
24
- color: macOSColors.semantic.success
25
- };
26
- if (contentType.includes("image")) return {
27
- type: "IMAGE",
28
- color: macOSColors.semantic.error
29
- };
30
- if (contentType.includes("video")) return {
31
- type: "VIDEO",
32
- color: macOSColors.semantic.error
33
- };
34
- if (contentType.includes("audio")) return {
35
- type: "AUDIO",
36
- color: macOSColors.semantic.debug
37
- };
38
- if (contentType.includes("form")) return {
39
- type: "FORM",
40
- color: macOSColors.semantic.info
41
- };
42
- return {
43
- type: "OTHER",
44
- color: night.color.textTertiary
45
- };
46
- }
47
- function getContentTypeIcon(type) {
48
- switch (type) {
49
- case "JSON":
50
- return FileJson;
51
- case "HTML":
52
- case "XML":
53
- case "TEXT":
54
- return FileText;
55
- case "IMAGE":
56
- return Image;
57
- case "VIDEO":
58
- return Film;
59
- case "AUDIO":
60
- return Music;
61
- default:
62
- return Globe;
63
- }
64
- }
65
- function getMethodColor(method) {
66
- switch (method) {
67
- case "GET":
68
- return macOSColors.semantic.success;
69
- case "POST":
70
- return macOSColors.semantic.info;
71
- case "PUT":
72
- return macOSColors.semantic.warning;
73
- case "DELETE":
74
- return macOSColors.semantic.error;
75
- case "PATCH":
76
- return macOSColors.semantic.success;
77
- default:
78
- return night.color.textTertiary;
79
- }
80
- }
81
-
82
- /**
83
- * Control panel for filtering captured network events by status, method, host, and content type.
84
- * Provides quick toggles, stats, and ignored-pattern management reminiscent of desktop tooling.
85
- */
86
- export function NetworkFilterViewV3({
87
- events,
88
- filter,
89
- onFilterChange,
90
- ignoredPatterns = [],
91
- onRemovePattern = () => {},
92
- onAddPattern = () => {},
93
- onTogglePatternMode = () => {}
94
- }) {
95
- // Mode applied when the user submits the "Add pattern" input. Defaults to
96
- // `contains` so behavior matches the previous implementation until the user
97
- // opts into `exact`.
98
- const [nextPatternMode, setNextPatternMode] = useState("contains");
99
- const patternModes = useMemo(() => {
100
- const map = new Map();
101
- for (const p of ignoredPatterns) map.set(p.value, p.mode);
102
- return map;
103
- }, [ignoredPatterns]);
104
- const activePatternsSet = useMemo(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
105
- const handlePatternAdd = useCallback(pattern => {
106
- onAddPattern({
107
- value: pattern,
108
- mode: nextPatternMode
109
- });
110
- }, [onAddPattern, nextPatternMode]);
111
- const renderPatternMeta = useCallback(pattern => {
112
- const mode = patternModes.get(pattern) ?? "contains";
113
- const isExact = mode === "exact";
114
- const color = isExact ? night.color.warning : night.color.info;
115
- return /*#__PURE__*/_jsx(TouchableOpacity, {
116
- accessibilityRole: "button",
117
- accessibilityLabel: `Match mode: ${mode}. Tap to toggle.`,
118
- onPress: () => onTogglePatternMode(pattern),
119
- style: [styles.modeBadge, {
120
- borderColor: `${color}60`,
121
- backgroundColor: `${color}15`
122
- }],
123
- hitSlop: {
124
- top: 6,
125
- bottom: 6,
126
- left: 6,
127
- right: 6
128
- },
129
- children: /*#__PURE__*/_jsx(Text, {
130
- style: [styles.modeBadgeText, {
131
- color
132
- }],
133
- children: isExact ? "EXACT" : "CONTAINS"
134
- })
135
- });
136
- }, [patternModes, onTogglePatternMode]);
137
- const renderAddFilterExtra = useCallback(() => {
138
- const options = [{
139
- label: "Contains",
140
- value: "contains",
141
- hint: "substring"
142
- }, {
143
- label: "Exact",
144
- value: "exact",
145
- hint: "whole path/host/url"
146
- }];
147
- return /*#__PURE__*/_jsxs(View, {
148
- style: styles.modeToggleRow,
149
- children: [/*#__PURE__*/_jsx(Text, {
150
- style: styles.modeToggleLabel,
151
- children: "Match:"
152
- }), /*#__PURE__*/_jsx(View, {
153
- style: styles.modeToggleGroup,
154
- children: options.map(opt => {
155
- const isActive = nextPatternMode === opt.value;
156
- return /*#__PURE__*/_jsxs(TouchableOpacity, {
157
- onPress: () => setNextPatternMode(opt.value),
158
- style: [styles.modeToggleButton, isActive && styles.modeToggleButtonActive],
159
- accessibilityRole: "button",
160
- accessibilityState: {
161
- selected: isActive
162
- },
163
- children: [/*#__PURE__*/_jsx(Text, {
164
- style: [styles.modeToggleButtonText, isActive && styles.modeToggleButtonTextActive],
165
- children: opt.label
166
- }), /*#__PURE__*/_jsx(Text, {
167
- style: styles.modeToggleButtonHint,
168
- children: opt.hint
169
- })]
170
- }, opt.value);
171
- })
172
- })]
173
- });
174
- }, [nextPatternMode]);
175
- const statusCounts = useMemo(() => {
176
- const counts = {
177
- all: events.length,
178
- success: 0,
179
- error: 0,
180
- pending: 0
181
- };
182
- events.forEach(event => {
183
- if (event.error || event.status && event.status >= 400) {
184
- counts.error += 1;
185
- return;
186
- }
187
- if (event.status && event.status >= 200 && event.status < 300) {
188
- counts.success += 1;
189
- return;
190
- }
191
- if (!event.status && !event.error) {
192
- counts.pending += 1;
193
- }
194
- });
195
- return counts;
196
- }, [events]);
197
- const methodCounts = useMemo(() => {
198
- return events.reduce((acc, event) => {
199
- if (!event.method) return acc;
200
- acc[event.method] = (acc[event.method] || 0) + 1;
201
- return acc;
202
- }, {});
203
- }, [events]);
204
- const contentTypeCounts = useMemo(() => {
205
- return events.reduce((acc, event) => {
206
- const {
207
- type
208
- } = getContentType(event);
209
- acc[type] = (acc[type] || 0) + 1;
210
- return acc;
211
- }, {});
212
- }, [events]);
213
- const availableDomains = useMemo(() => {
214
- const domains = new Set();
215
- events.forEach(event => {
216
- if (event.host) {
217
- domains.add(event.host);
218
- return;
219
- }
220
- try {
221
- if (event.url) {
222
- const parsed = new URL(event.url);
223
- const host = String(parsed.host || "");
224
- if (host) domains.add(host);
225
- }
226
- } catch {
227
- // Ignore relative URLs
228
- }
229
- });
230
- return Array.from(domains).filter(domain => domain && domain !== "").sort((a, b) => a.localeCompare(b));
231
- }, [events]);
232
- const availableUrls = useMemo(() => {
233
- const urls = new Set();
234
- events.forEach(event => {
235
- if (!event.url) return;
236
- try {
237
- const parsed = new URL(event.url);
238
- const origin = String(parsed.origin || "");
239
- const pathname = String(parsed.pathname || "");
240
- const normalized = `${origin}${pathname}`;
241
- urls.add(normalized);
242
- } catch {
243
- // URL constructor fails for relative paths - fall back to raw value
244
- urls.add(event.url);
245
- }
246
- });
247
- return Array.from(urls).filter(url => url && url !== "").sort((a, b) => a.localeCompare(b));
248
- }, [events]);
249
- const suggestionItems = useMemo(() => {
250
- const maxItemsPerGroup = 30;
251
- const domainSuggestions = availableDomains.slice(0, maxItemsPerGroup);
252
- const urlSuggestions = availableUrls.slice(0, maxItemsPerGroup);
253
- return [...domainSuggestions, ...urlSuggestions];
254
- }, [availableDomains, availableUrls]);
255
- const handleDynamicFilterChange = useCallback((optionId, value) => {
256
- const [group] = optionId.split("::");
257
- if (group === "status") {
258
- const nextStatus = value === "all" ? undefined : value;
259
- onFilterChange({
260
- ...filter,
261
- status: nextStatus
262
- });
263
- return;
264
- }
265
- if (group === "method") {
266
- const methodValue = String(value);
267
- const currentMethods = filter.method || [];
268
- const hasMethod = currentMethods.includes(methodValue);
269
- const updatedMethods = hasMethod ? currentMethods.filter(method => method !== methodValue) : [methodValue];
270
- onFilterChange({
271
- ...filter,
272
- method: updatedMethods.length > 0 ? updatedMethods : undefined
273
- });
274
- return;
275
- }
276
- if (group === "contentType") {
277
- const typeValue = String(value);
278
- const currentTypes = filter.contentType || [];
279
- const hasType = currentTypes.includes(typeValue);
280
- const updatedTypes = hasType ? currentTypes.filter(type => type !== typeValue) : [typeValue];
281
- onFilterChange({
282
- ...filter,
283
- contentType: updatedTypes.length > 0 ? updatedTypes : undefined
284
- });
285
- }
286
- }, [filter, onFilterChange]);
287
- const filterSections = useMemo(() => {
288
- const sections = [];
289
- sections.push({
290
- id: "status",
291
- title: "Status",
292
- type: "status",
293
- data: ["all", "success", "error", "pending"].map(status => ({
294
- id: `status::${status}`,
295
- label: status.charAt(0).toUpperCase() + status.slice(1),
296
- count: statusCounts[status],
297
- icon: status === "success" ? CheckCircle : status === "error" ? XCircle : status === "pending" ? Clock : Globe,
298
- color: status === "success" ? macOSColors.semantic.success : status === "error" ? macOSColors.semantic.error : status === "pending" ? macOSColors.semantic.warning : macOSColors.semantic.info,
299
- isActive: filter.status === status || !filter.status && status === "all",
300
- value: status
301
- }))
302
- });
303
- const methodEntries = Object.entries(methodCounts);
304
- if (methodEntries.length > 0) {
305
- sections.push({
306
- id: "method",
307
- title: "Method",
308
- type: "method",
309
- data: methodEntries.map(([method, count]) => ({
310
- id: `method::${method}`,
311
- label: method,
312
- count,
313
- color: getMethodColor(method),
314
- isActive: filter.method?.includes(method) ?? false,
315
- value: method
316
- }))
317
- });
318
- }
319
- const contentTypeEntries = Object.entries(contentTypeCounts);
320
- if (contentTypeEntries.length > 0) {
321
- sections.push({
322
- id: "contentType",
323
- title: "Content Type",
324
- type: "contentType",
325
- data: contentTypeEntries.map(([type, count]) => {
326
- const representativeEvent = events.find(event => getContentType(event).type === type);
327
- const {
328
- color
329
- } = representativeEvent ? getContentType(representativeEvent) : {
330
- color: night.color.textTertiary
331
- };
332
- return {
333
- id: `contentType::${type}`,
334
- label: type,
335
- count,
336
- icon: getContentTypeIcon(type),
337
- color,
338
- isActive: filter.contentType?.includes(type) ?? false,
339
- value: type
340
- };
341
- })
342
- });
343
- }
344
- return sections;
345
- }, [contentTypeCounts, events, filter.contentType, filter.method, filter.status, methodCounts, statusCounts]);
346
- const dynamicFilterConfig = useMemo(() => ({
347
- sections: filterSections,
348
- addFilterSection: {
349
- enabled: true,
350
- placeholder: "Enter domain or URL pattern...",
351
- title: "ACTIVE FILTERS",
352
- icon: Filter,
353
- renderExtra: renderAddFilterExtra
354
- },
355
- availableItemsSection: {
356
- enabled: true,
357
- title: "AVAILABLE DOMAINS & URLS",
358
- emptyMessage: "No network events captured yet. Domains and URLs will appear here.",
359
- items: suggestionItems
360
- },
361
- howItWorksSection: {
362
- enabled: true,
363
- title: "HOW NETWORK FILTERS WORK",
364
- description: "Patterns hide matching requests from the network event list. Each pattern has a match mode you can toggle on its badge: CONTAINS hides any URL containing the text; EXACT hides only an exact path/host/url match.",
365
- examples: ["• example.com (CONTAINS) → any request whose URL contains example.com", "• example.com (EXACT) → only requests served by that exact host", "• /v1 (CONTAINS) → any URL containing /v1 (e.g. /v1, /v1/users)", "• /v1 (EXACT) → only requests whose pathname is exactly /v1"],
366
- icon: Filter
367
- },
368
- onFilterChange: handleDynamicFilterChange,
369
- onPatternAdd: handlePatternAdd,
370
- onPatternToggle: onRemovePattern,
371
- activePatterns: activePatternsSet,
372
- renderPatternMeta
373
- }), [activePatternsSet, filterSections, handleDynamicFilterChange, handlePatternAdd, onRemovePattern, renderAddFilterExtra, renderPatternMeta, suggestionItems]);
374
- return /*#__PURE__*/_jsx(DynamicFilterView, {
375
- ...dynamicFilterConfig
376
- });
377
- }
378
- const styles = StyleSheet.create({
379
- modeBadge: {
380
- paddingHorizontal: 8,
381
- paddingVertical: 3,
382
- borderRadius: 6,
383
- borderWidth: 1
384
- },
385
- modeBadgeText: {
386
- fontSize: 9,
387
- fontFamily: monoFont,
388
- fontWeight: "700",
389
- letterSpacing: 0.5
390
- },
391
- modeToggleRow: {
392
- flexDirection: "row",
393
- alignItems: "center",
394
- gap: 8,
395
- marginBottom: 8
396
- },
397
- modeToggleLabel: {
398
- fontSize: 11,
399
- fontWeight: "600",
400
- color: night.color.textSecondary,
401
- fontFamily: monoFont,
402
- letterSpacing: 0.3
403
- },
404
- modeToggleGroup: {
405
- flexDirection: "row",
406
- gap: 6,
407
- flex: 1
408
- },
409
- modeToggleButton: {
410
- flex: 1,
411
- paddingVertical: 6,
412
- paddingHorizontal: 10,
413
- borderRadius: 8,
414
- borderWidth: 1,
415
- borderColor: night.color.border,
416
- backgroundColor: night.color.buttonSurface,
417
- alignItems: "center"
418
- },
419
- modeToggleButtonActive: {
420
- borderColor: night.color.accentBorderStrong,
421
- backgroundColor: night.color.accentSoft
422
- },
423
- modeToggleButtonText: {
424
- fontSize: 11,
425
- fontWeight: "700",
426
- color: night.color.textSecondary,
427
- fontFamily: monoFont,
428
- letterSpacing: 0.3
429
- },
430
- modeToggleButtonTextActive: {
431
- color: night.color.accent
432
- },
433
- modeToggleButtonHint: {
434
- fontSize: 9,
435
- color: night.color.textTertiary,
436
- marginTop: 1
437
- }
438
- });
1
+ "use strict";import{CheckCircle as G,Clock as q,DynamicFilterView as v,Film as J,FileJson as K,FileText as _,Filter as k,Globe as P,Image as Q,macOSColors as c,night as a,Music as Y,XCircle as Z,monoFont as b}from"@buoy-gg/shared-ui";import{useCallback as f,useMemo as d,useState as ee}from"react";import{StyleSheet as te,Text as S,TouchableOpacity as W,View as X}from"react-native";import{jsx as p,jsxs as $}from"react/jsx-runtime";function x(r){const s=r.responseHeaders||r.requestHeaders;const i=s?.["content-type"]||s?.["Content-Type"]||"";if(i.includes("json"))return{type:"JSON",color:c.semantic.info};if(i.includes("xml"))return{type:"XML",color:c.semantic.success};if(i.includes("html"))return{type:"HTML",color:c.semantic.warning};if(i.includes("text"))return{type:"TEXT",color:c.semantic.success};if(i.includes("image"))return{type:"IMAGE",color:c.semantic.error};if(i.includes("video"))return{type:"VIDEO",color:c.semantic.error};if(i.includes("audio"))return{type:"AUDIO",color:c.semantic.debug};if(i.includes("form"))return{type:"FORM",color:c.semantic.info};return{type:"OTHER",color:a.color.textTertiary}}function oe(r){switch(r){case"JSON":return K;case"HTML":case"XML":case"TEXT":return _;case"IMAGE":return Q;case"VIDEO":return J;case"AUDIO":return Y;default:return P}}function ne(r){switch(r){case"GET":return c.semantic.success;case"POST":return c.semantic.info;case"PUT":return c.semantic.warning;case"DELETE":return c.semantic.error;case"PATCH":return c.semantic.success;default:return a.color.textTertiary}}export function NetworkFilterViewV3({events:r,filter:s,onFilterChange:i,ignoredPatterns:T=[],onRemovePattern:C=()=>{},onAddPattern:E=()=>{},onTogglePatternMode:A=()=>{}}){const[y,j]=ee("contains");const w=d(()=>{const o=new Map;for(const e of T)o.set(e.value,e.mode);return o},[T]);const I=d(()=>new Set(T.map(o=>o.value)),[T]);const M=f(o=>{E({value:o,mode:y})},[E,y]);const O=f(o=>{const e=w.get(o)??"contains";const n=e==="exact";const t=n?a.color.warning:a.color.info;return p(W,{accessibilityRole:"button",accessibilityLabel:`Match mode: ${e}. Tap to toggle.`,onPress:()=>A(o),style:[u.modeBadge,{borderColor:`${t}60`,backgroundColor:`${t}15`}],hitSlop:{top:6,bottom:6,left:6,right:6},children:p(S,{style:[u.modeBadgeText,{color:t}],children:n?"EXACT":"CONTAINS"})})},[w,A]);const L=f(()=>{const o=[{label:"Contains",value:"contains",hint:"substring"},{label:"Exact",value:"exact",hint:"whole path/host/url"}];return $(X,{style:u.modeToggleRow,children:[p(S,{style:u.modeToggleLabel,children:"Match:"}),p(X,{style:u.modeToggleGroup,children:o.map(e=>{const n=y===e.value;return $(W,{onPress:()=>j(e.value),style:[u.modeToggleButton,n&&u.modeToggleButtonActive],accessibilityRole:"button",accessibilityState:{selected:n},children:[p(S,{style:[u.modeToggleButtonText,n&&u.modeToggleButtonTextActive],children:e.label}),p(S,{style:u.modeToggleButtonHint,children:e.hint})]},e.value)})})]})},[y]);const R=d(()=>{const o={all:r.length,success:0,error:0,pending:0};r.forEach(e=>{if(e.error||e.status&&e.status>=400){o.error+=1;return}if(e.status&&e.status>=200&&e.status<300){o.success+=1;return}if(!e.status&&!e.error){o.pending+=1}});return o},[r]);const B=d(()=>{return r.reduce((o,e)=>{if(!e.method)return o;o[e.method]=(o[e.method]||0)+1;return o},{})},[r]);const F=d(()=>{return r.reduce((o,e)=>{const{type:n}=x(e);o[n]=(o[n]||0)+1;return o},{})},[r]);const N=d(()=>{const o=new Set;r.forEach(e=>{if(e.host){o.add(e.host);return}try{if(e.url){const n=new URL(e.url);const t=String(n.host||"");if(t)o.add(t)}}catch{}});return Array.from(o).filter(e=>e&&e!=="").sort((e,n)=>e.localeCompare(n))},[r]);const U=d(()=>{const o=new Set;r.forEach(e=>{if(!e.url)return;try{const n=new URL(e.url);const t=String(n.origin||"");const l=String(n.pathname||"");const m=`${t}${l}`;o.add(m)}catch{o.add(e.url)}});return Array.from(o).filter(e=>e&&e!=="").sort((e,n)=>e.localeCompare(n))},[r]);const D=d(()=>{const o=30;const e=N.slice(0,o);const n=U.slice(0,o);return[...e,...n]},[N,U]);const V=f((o,e)=>{const[n]=o.split("::");if(n==="status"){const t=e==="all"?void 0:e;i({...s,status:t});return}if(n==="method"){const t=String(e);const l=s.method||[];const m=l.includes(t);const g=m?l.filter(h=>h!==t):[t];i({...s,method:g.length>0?g:void 0});return}if(n==="contentType"){const t=String(e);const l=s.contentType||[];const m=l.includes(t);const g=m?l.filter(h=>h!==t):[t];i({...s,contentType:g.length>0?g:void 0})}},[s,i]);const H=d(()=>{const o=[];o.push({id:"status",title:"Status",type:"status",data:["all","success","error","pending"].map(t=>({id:`status::${t}`,label:t.charAt(0).toUpperCase()+t.slice(1),count:R[t],icon:t==="success"?G:t==="error"?Z:t==="pending"?q:P,color:t==="success"?c.semantic.success:t==="error"?c.semantic.error:t==="pending"?c.semantic.warning:c.semantic.info,isActive:s.status===t||!s.status&&t==="all",value:t}))});const e=Object.entries(B);if(e.length>0){o.push({id:"method",title:"Method",type:"method",data:e.map(([t,l])=>({id:`method::${t}`,label:t,count:l,color:ne(t),isActive:s.method?.includes(t)??false,value:t}))})}const n=Object.entries(F);if(n.length>0){o.push({id:"contentType",title:"Content Type",type:"contentType",data:n.map(([t,l])=>{const m=r.find(h=>x(h).type===t);const{color:g}=m?x(m):{color:a.color.textTertiary};return{id:`contentType::${t}`,label:t,count:l,icon:oe(t),color:g,isActive:s.contentType?.includes(t)??false,value:t}})})}return o},[F,r,s.contentType,s.method,s.status,B,R]);const z=d(()=>({sections:H,addFilterSection:{enabled:true,placeholder:"Enter domain or URL pattern...",title:"ACTIVE FILTERS",icon:k,renderExtra:L},availableItemsSection:{enabled:true,title:"AVAILABLE DOMAINS & URLS",emptyMessage:"No network events captured yet. Domains and URLs will appear here.",items:D},howItWorksSection:{enabled:true,title:"HOW NETWORK FILTERS WORK",description:"Patterns hide matching requests from the network event list. Each pattern has a match mode you can toggle on its badge: CONTAINS hides any URL containing the text; EXACT hides only an exact path/host/url match.",examples:["\u2022 example.com (CONTAINS) \u2192 any request whose URL contains example.com","\u2022 example.com (EXACT) \u2192 only requests served by that exact host","\u2022 /v1 (CONTAINS) \u2192 any URL containing /v1 (e.g. /v1, /v1/users)","\u2022 /v1 (EXACT) \u2192 only requests whose pathname is exactly /v1"],icon:k},onFilterChange:V,onPatternAdd:M,onPatternToggle:C,activePatterns:I,renderPatternMeta:O}),[I,H,V,M,C,L,O,D]);return p(v,{...z})}const u=te.create({modeBadge:{paddingHorizontal:8,paddingVertical:3,borderRadius:6,borderWidth:1},modeBadgeText:{fontSize:9,fontFamily:b,fontWeight:"700",letterSpacing:.5},modeToggleRow:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:8},modeToggleLabel:{fontSize:11,fontWeight:"600",color:a.color.textSecondary,fontFamily:b,letterSpacing:.3},modeToggleGroup:{flexDirection:"row",gap:6,flex:1},modeToggleButton:{flex:1,paddingVertical:6,paddingHorizontal:10,borderRadius:8,borderWidth:1,borderColor:a.color.border,backgroundColor:a.color.buttonSurface,alignItems:"center"},modeToggleButtonActive:{borderColor:a.color.accentBorderStrong,backgroundColor:a.color.accentSoft},modeToggleButtonText:{fontSize:11,fontWeight:"700",color:a.color.textSecondary,fontFamily:b,letterSpacing:.3},modeToggleButtonTextActive:{color:a.color.accent},modeToggleButtonHint:{fontSize:9,color:a.color.textTertiary,marginTop:1}});