@buoy-gg/shared-ui 7.0.4 → 7.0.5

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 (191) hide show
  1. package/lib/commonjs/colors/index.js +49 -0
  2. package/lib/commonjs/dataViewer/DataTreeActionBar.js +389 -0
  3. package/lib/commonjs/dataViewer/DataTreeActionDock.js +222 -0
  4. package/lib/commonjs/dataViewer/DataViewer.js +18 -3
  5. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +227 -28
  6. package/lib/commonjs/dataViewer/index.js +88 -0
  7. package/lib/commonjs/dataViewer/jsonOps.js +320 -0
  8. package/lib/commonjs/dataViewer/lineDiff.js +285 -83
  9. package/lib/commonjs/dataViewer/tree/TreeDiffViewer.js +20 -5
  10. package/lib/commonjs/dataViewer/treeActions.js +167 -0
  11. package/lib/commonjs/env/EnvironmentSelector.js +2 -2
  12. package/lib/commonjs/env/EnvironmentSelectorInline.js +2 -2
  13. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  14. package/lib/commonjs/icons/index.js +79 -3
  15. package/lib/commonjs/icons/lucide-icons-original-full.js +5 -1
  16. package/lib/commonjs/icons/lucide-icons.js +59 -2
  17. package/lib/commonjs/index.js +35 -0
  18. package/lib/commonjs/settings/components/BubbleSettingsSection.js +21 -19
  19. package/lib/commonjs/storage/devToolsStorageKeys.js +6 -3
  20. package/lib/commonjs/ui/components/Badge.js +2 -0
  21. package/lib/commonjs/ui/components/CompactRow.js +7 -0
  22. package/lib/commonjs/ui/components/CopyButton.js +27 -4
  23. package/lib/commonjs/ui/components/DevToolsCard.js +11 -0
  24. package/lib/commonjs/ui/components/DynamicFilterView.js +8 -1
  25. package/lib/commonjs/ui/components/EmptyState.js +12 -5
  26. package/lib/commonjs/ui/components/ErrorBoundary.js +3 -2
  27. package/lib/commonjs/ui/components/EventHistoryViewer/EventHistoryViewer.js +63 -11
  28. package/lib/commonjs/ui/components/ExpandableSection.js +4 -3
  29. package/lib/commonjs/ui/components/ExpandableSectionHeader.js +2 -1
  30. package/lib/commonjs/ui/components/FilterViewPattern.js +8 -7
  31. package/lib/commonjs/ui/components/ListItem.js +7 -5
  32. package/lib/commonjs/ui/components/PowerToggleButton.js +4 -1
  33. package/lib/commonjs/ui/components/TabSelector.js +3 -0
  34. package/lib/commonjs/ui/console/CyberpunkConsoleSection.js +1 -1
  35. package/lib/commonjs/ui/console/GalaxyButton.js +1 -1
  36. package/lib/commonjs/ui/gameUI/components/GameUICompactStats.js +2 -2
  37. package/lib/commonjs/ui/gameUI/constants/gameUIColors.js +28 -6
  38. package/lib/commonjs/ui/gameUI/constants/macOSDesignSystemColors.js +22 -4
  39. package/lib/commonjs/utils/index.js +25 -0
  40. package/lib/commonjs/utils/reloadApp.js +144 -0
  41. package/lib/module/colors/index.js +21 -0
  42. package/lib/module/dataViewer/DataTreeActionBar.js +384 -0
  43. package/lib/module/dataViewer/DataTreeActionDock.js +218 -0
  44. package/lib/module/dataViewer/DataViewer.js +18 -3
  45. package/lib/module/dataViewer/VirtualizedDataExplorer.js +228 -30
  46. package/lib/module/dataViewer/index.js +16 -1
  47. package/lib/module/dataViewer/jsonOps.js +311 -0
  48. package/lib/module/dataViewer/lineDiff.js +284 -82
  49. package/lib/module/dataViewer/tree/TreeDiffViewer.js +20 -5
  50. package/lib/module/dataViewer/treeActions.js +161 -0
  51. package/lib/module/env/EnvironmentSelector.js +2 -2
  52. package/lib/module/env/EnvironmentSelectorInline.js +2 -2
  53. package/lib/module/hooks/safe-area-impl.js +1 -1
  54. package/lib/module/icons/index.js +10 -1
  55. package/lib/module/icons/lucide-icons-original-full.js +5 -1
  56. package/lib/module/icons/lucide-icons.js +56 -0
  57. package/lib/module/index.js +4 -0
  58. package/lib/module/settings/components/BubbleSettingsSection.js +21 -19
  59. package/lib/module/storage/devToolsStorageKeys.js +6 -3
  60. package/lib/module/ui/components/Badge.js +2 -0
  61. package/lib/module/ui/components/CompactRow.js +7 -0
  62. package/lib/module/ui/components/CopyButton.js +29 -6
  63. package/lib/module/ui/components/DevToolsCard.js +11 -0
  64. package/lib/module/ui/components/DynamicFilterView.js +8 -1
  65. package/lib/module/ui/components/EmptyState.js +12 -5
  66. package/lib/module/ui/components/ErrorBoundary.js +3 -2
  67. package/lib/module/ui/components/EventHistoryViewer/EventHistoryViewer.js +63 -11
  68. package/lib/module/ui/components/ExpandableSection.js +4 -3
  69. package/lib/module/ui/components/ExpandableSectionHeader.js +2 -1
  70. package/lib/module/ui/components/FilterViewPattern.js +9 -7
  71. package/lib/module/ui/components/ListItem.js +7 -5
  72. package/lib/module/ui/components/PowerToggleButton.js +4 -1
  73. package/lib/module/ui/components/TabSelector.js +3 -0
  74. package/lib/module/ui/console/CyberpunkConsoleSection.js +1 -1
  75. package/lib/module/ui/console/GalaxyButton.js +1 -1
  76. package/lib/module/ui/gameUI/components/GameUICompactStats.js +2 -2
  77. package/lib/module/ui/gameUI/constants/gameUIColors.js +27 -6
  78. package/lib/module/ui/gameUI/constants/macOSDesignSystemColors.js +19 -2
  79. package/lib/module/utils/index.js +1 -0
  80. package/lib/module/utils/reloadApp.js +137 -0
  81. package/lib/typescript/commonjs/colors/index.d.ts +22 -0
  82. package/lib/typescript/commonjs/colors/index.d.ts.map +1 -0
  83. package/lib/typescript/commonjs/dataViewer/DataTreeActionBar.d.ts +53 -0
  84. package/lib/typescript/commonjs/dataViewer/DataTreeActionBar.d.ts.map +1 -0
  85. package/lib/typescript/commonjs/dataViewer/DataTreeActionDock.d.ts +33 -0
  86. package/lib/typescript/commonjs/dataViewer/DataTreeActionDock.d.ts.map +1 -0
  87. package/lib/typescript/commonjs/dataViewer/DataViewer.d.ts +14 -1
  88. package/lib/typescript/commonjs/dataViewer/DataViewer.d.ts.map +1 -1
  89. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts +30 -1
  90. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  91. package/lib/typescript/commonjs/dataViewer/__tests__/jsonOps.test.d.ts +19 -0
  92. package/lib/typescript/commonjs/dataViewer/__tests__/jsonOps.test.d.ts.map +1 -0
  93. package/lib/typescript/commonjs/dataViewer/index.d.ts +5 -1
  94. package/lib/typescript/commonjs/dataViewer/index.d.ts.map +1 -1
  95. package/lib/typescript/commonjs/dataViewer/jsonOps.d.ts +124 -0
  96. package/lib/typescript/commonjs/dataViewer/jsonOps.d.ts.map +1 -0
  97. package/lib/typescript/commonjs/dataViewer/lineDiff.d.ts +27 -0
  98. package/lib/typescript/commonjs/dataViewer/lineDiff.d.ts.map +1 -1
  99. package/lib/typescript/commonjs/dataViewer/tree/TreeDiffViewer.d.ts +8 -1
  100. package/lib/typescript/commonjs/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  101. package/lib/typescript/commonjs/dataViewer/treeActions.d.ts +83 -0
  102. package/lib/typescript/commonjs/dataViewer/treeActions.d.ts.map +1 -0
  103. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  104. package/lib/typescript/commonjs/icons/index.d.ts +6 -1
  105. package/lib/typescript/commonjs/icons/index.d.ts.map +1 -1
  106. package/lib/typescript/commonjs/icons/lucide-icons-original-full.d.ts.map +1 -1
  107. package/lib/typescript/commonjs/icons/lucide-icons.d.ts +9 -0
  108. package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
  109. package/lib/typescript/commonjs/index.d.ts +2 -1
  110. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  111. package/lib/typescript/commonjs/settings/components/BubbleSettingsSection.d.ts.map +1 -1
  112. package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts +5 -1
  113. package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts.map +1 -1
  114. package/lib/typescript/commonjs/ui/components/CopyButton.d.ts +7 -1
  115. package/lib/typescript/commonjs/ui/components/CopyButton.d.ts.map +1 -1
  116. package/lib/typescript/commonjs/ui/components/EmptyState.d.ts.map +1 -1
  117. package/lib/typescript/commonjs/ui/components/ErrorBoundary.d.ts.map +1 -1
  118. package/lib/typescript/commonjs/ui/components/EventHistoryViewer/EventHistoryViewer.d.ts.map +1 -1
  119. package/lib/typescript/commonjs/ui/components/EventHistoryViewer/types.d.ts +23 -7
  120. package/lib/typescript/commonjs/ui/components/EventHistoryViewer/types.d.ts.map +1 -1
  121. package/lib/typescript/commonjs/ui/components/ExpandableSection.d.ts.map +1 -1
  122. package/lib/typescript/commonjs/ui/components/ExpandableSectionHeader.d.ts.map +1 -1
  123. package/lib/typescript/commonjs/ui/components/FilterViewPattern.d.ts.map +1 -1
  124. package/lib/typescript/commonjs/ui/components/ListItem.d.ts.map +1 -1
  125. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts +36 -30
  126. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  127. package/lib/typescript/commonjs/ui/gameUI/constants/macOSDesignSystemColors.d.ts +5 -0
  128. package/lib/typescript/commonjs/ui/gameUI/constants/macOSDesignSystemColors.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/utils/index.d.ts +1 -0
  130. package/lib/typescript/commonjs/utils/index.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/utils/reloadApp.d.ts +68 -0
  132. package/lib/typescript/commonjs/utils/reloadApp.d.ts.map +1 -0
  133. package/lib/typescript/module/colors/index.d.ts +22 -0
  134. package/lib/typescript/module/colors/index.d.ts.map +1 -0
  135. package/lib/typescript/module/dataViewer/DataTreeActionBar.d.ts +53 -0
  136. package/lib/typescript/module/dataViewer/DataTreeActionBar.d.ts.map +1 -0
  137. package/lib/typescript/module/dataViewer/DataTreeActionDock.d.ts +33 -0
  138. package/lib/typescript/module/dataViewer/DataTreeActionDock.d.ts.map +1 -0
  139. package/lib/typescript/module/dataViewer/DataViewer.d.ts +14 -1
  140. package/lib/typescript/module/dataViewer/DataViewer.d.ts.map +1 -1
  141. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts +30 -1
  142. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  143. package/lib/typescript/module/dataViewer/__tests__/jsonOps.test.d.ts +19 -0
  144. package/lib/typescript/module/dataViewer/__tests__/jsonOps.test.d.ts.map +1 -0
  145. package/lib/typescript/module/dataViewer/index.d.ts +5 -1
  146. package/lib/typescript/module/dataViewer/index.d.ts.map +1 -1
  147. package/lib/typescript/module/dataViewer/jsonOps.d.ts +124 -0
  148. package/lib/typescript/module/dataViewer/jsonOps.d.ts.map +1 -0
  149. package/lib/typescript/module/dataViewer/lineDiff.d.ts +27 -0
  150. package/lib/typescript/module/dataViewer/lineDiff.d.ts.map +1 -1
  151. package/lib/typescript/module/dataViewer/tree/TreeDiffViewer.d.ts +8 -1
  152. package/lib/typescript/module/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  153. package/lib/typescript/module/dataViewer/treeActions.d.ts +83 -0
  154. package/lib/typescript/module/dataViewer/treeActions.d.ts.map +1 -0
  155. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  156. package/lib/typescript/module/icons/index.d.ts +6 -1
  157. package/lib/typescript/module/icons/index.d.ts.map +1 -1
  158. package/lib/typescript/module/icons/lucide-icons-original-full.d.ts.map +1 -1
  159. package/lib/typescript/module/icons/lucide-icons.d.ts +9 -0
  160. package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
  161. package/lib/typescript/module/index.d.ts +2 -1
  162. package/lib/typescript/module/index.d.ts.map +1 -1
  163. package/lib/typescript/module/settings/components/BubbleSettingsSection.d.ts.map +1 -1
  164. package/lib/typescript/module/storage/devToolsStorageKeys.d.ts +5 -1
  165. package/lib/typescript/module/storage/devToolsStorageKeys.d.ts.map +1 -1
  166. package/lib/typescript/module/ui/components/CopyButton.d.ts +7 -1
  167. package/lib/typescript/module/ui/components/CopyButton.d.ts.map +1 -1
  168. package/lib/typescript/module/ui/components/EmptyState.d.ts.map +1 -1
  169. package/lib/typescript/module/ui/components/ErrorBoundary.d.ts.map +1 -1
  170. package/lib/typescript/module/ui/components/EventHistoryViewer/EventHistoryViewer.d.ts.map +1 -1
  171. package/lib/typescript/module/ui/components/EventHistoryViewer/types.d.ts +23 -7
  172. package/lib/typescript/module/ui/components/EventHistoryViewer/types.d.ts.map +1 -1
  173. package/lib/typescript/module/ui/components/ExpandableSection.d.ts.map +1 -1
  174. package/lib/typescript/module/ui/components/ExpandableSectionHeader.d.ts.map +1 -1
  175. package/lib/typescript/module/ui/components/FilterViewPattern.d.ts.map +1 -1
  176. package/lib/typescript/module/ui/components/ListItem.d.ts.map +1 -1
  177. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts +36 -30
  178. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  179. package/lib/typescript/module/ui/gameUI/constants/macOSDesignSystemColors.d.ts +5 -0
  180. package/lib/typescript/module/ui/gameUI/constants/macOSDesignSystemColors.d.ts.map +1 -1
  181. package/lib/typescript/module/utils/index.d.ts +1 -0
  182. package/lib/typescript/module/utils/index.d.ts.map +1 -1
  183. package/lib/typescript/module/utils/reloadApp.d.ts +68 -0
  184. package/lib/typescript/module/utils/reloadApp.d.ts.map +1 -0
  185. package/package.json +15 -4
  186. package/lib/commonjs/icons/ImageOverlayIcon.js +0 -142
  187. package/lib/module/icons/ImageOverlayIcon.js +0 -137
  188. package/lib/typescript/commonjs/icons/ImageOverlayIcon.d.ts +0 -14
  189. package/lib/typescript/commonjs/icons/ImageOverlayIcon.d.ts.map +0 -1
  190. package/lib/typescript/module/icons/ImageOverlayIcon.d.ts +0 -14
  191. package/lib/typescript/module/icons/ImageOverlayIcon.d.ts.map +0 -1
@@ -7,6 +7,16 @@ export * from "./primitives/index.js";
7
7
  export { NetworkIcon, NETWORK_ICON_COLOR } from "@buoy-gg/floating-tools-core";
8
8
  export { EnvIcon, ENV_ICON_COLOR } from "@buoy-gg/floating-tools-core";
9
9
 
10
+ // Buoy Icon Format icons: authored once in shared/icons/*.json and generated
11
+ // into core, so these are the same artwork the Flutter build renders. Tool
12
+ // packages re-export from here rather than drawing their own copies.
13
+ export { ConsoleIcon, CONSOLE_ICON_COLOR } from "@buoy-gg/floating-tools-core";
14
+ export { ImagesIcon, IMAGES_ICON_COLOR } from "@buoy-gg/floating-tools-core";
15
+ export { ImpersonateIcon, IMPERSONATE_ICON_COLOR } from "@buoy-gg/floating-tools-core";
16
+ export { ImageOverlayIcon, IMAGE_OVERLAY_ICON_COLOR } from "@buoy-gg/floating-tools-core";
17
+ export { ZustandIcon, ZUSTAND_ICON_COLOR } from "@buoy-gg/floating-tools-core";
18
+ export { JotaiIcon, JOTAI_ICON_COLOR } from "@buoy-gg/floating-tools-core";
19
+
10
20
  // Export custom icons
11
21
  export { EnvLaptopIcon, LaptopIcon } from "./EnvLaptopIcon.js";
12
22
  export { ReactQueryIcon } from "./ReactQueryIcon.js";
@@ -17,7 +27,6 @@ export { RouteMapIcon, RouteIcon, NavigationIcon } from "./RouteMapIcon.js";
17
27
  export { StackPulseIcon, RenderPulseIcon, HighlightUpdatesIcon } from "./StackPulseIcon.js";
18
28
  export { RenderCountIcon } from "./RenderCountIcon.js";
19
29
  export { BenchmarkIcon } from "./BenchmarkIcon.js";
20
- export { ImageOverlayIcon } from "./ImageOverlayIcon.js";
21
30
  export { IconBackground } from "./IconBackground.js";
22
31
 
23
32
  // Export lucide icons
@@ -951,7 +951,11 @@ export const GlobeIcon = ({
951
951
  strokeWidth = 2,
952
952
  ...props
953
953
  }) => {
954
- color = gameUIColors.env;
954
+ // NOTE: this used to reassign `color = gameUIColors.env` right here, throwing
955
+ // away whatever the caller passed. The default above already covers the
956
+ // "network tool green" case; the reassignment only broke every caller that
957
+ // asked for something else (e.g. the network empty state, which asks for
958
+ // muted grey and was getting a green globe on the white canvas).
955
959
  const scale = size / 24;
956
960
  const globeSize = 18 * scale;
957
961
  return /*#__PURE__*/_jsxs(View, {
@@ -530,6 +530,62 @@ export const Pin = ({
530
530
  strokeWidth: strokeWidth
531
531
  })]
532
532
  });
533
+
534
+ /**
535
+ * Bookmark — the "saved request" glyph (Network tool's favorites).
536
+ *
537
+ * Lucide's Star would be the obvious choice, but these icons are composed from
538
+ * View-based `Line`/`Circle`/`Rect` primitives (there is no `Path`), so a
539
+ * 5-point star isn't drawable here. A bookmark is five straight segments and
540
+ * reads as "kept for later" at 10px, which is what the glyph has to say.
541
+ */
542
+ export const Bookmark = ({
543
+ size = 24,
544
+ color = "currentColor",
545
+ strokeWidth = 2,
546
+ ...props
547
+ }) => /*#__PURE__*/_jsxs(Svg, {
548
+ width: size,
549
+ height: size,
550
+ viewBox: "0 0 24 24",
551
+ ...props,
552
+ children: [/*#__PURE__*/_jsx(Line, {
553
+ x1: 5,
554
+ y1: 3,
555
+ x2: 19,
556
+ y2: 3,
557
+ stroke: color,
558
+ strokeWidth: strokeWidth
559
+ }), /*#__PURE__*/_jsx(Line, {
560
+ x1: 5,
561
+ y1: 3,
562
+ x2: 5,
563
+ y2: 21,
564
+ stroke: color,
565
+ strokeWidth: strokeWidth
566
+ }), /*#__PURE__*/_jsx(Line, {
567
+ x1: 19,
568
+ y1: 3,
569
+ x2: 19,
570
+ y2: 21,
571
+ stroke: color,
572
+ strokeWidth: strokeWidth
573
+ }), /*#__PURE__*/_jsx(Line, {
574
+ x1: 5,
575
+ y1: 21,
576
+ x2: 12,
577
+ y2: 15,
578
+ stroke: color,
579
+ strokeWidth: strokeWidth
580
+ }), /*#__PURE__*/_jsx(Line, {
581
+ x1: 19,
582
+ y1: 21,
583
+ x2: 12,
584
+ y2: 15,
585
+ stroke: color,
586
+ strokeWidth: strokeWidth
587
+ })]
588
+ });
533
589
  export const EyeOff = ({
534
590
  size = 24,
535
591
  color = "currentColor",
@@ -26,6 +26,8 @@ parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath,
26
26
  loadOptionalModule, getCachedOptionalModule,
27
27
  // Render-commit capture bridge (provider: highlight-updates, consumer: perf-monitor)
28
28
  setRenderCaptureProvider, getRenderCaptureProvider,
29
+ // JS-bundle reload (core's `app` adapter + perf-monitor's batch runner)
30
+ reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS,
29
31
  // Subscribable base class for self-managing listeners
30
32
  Subscribable,
31
33
  // Subscriber count notifier for cross-package notifications
@@ -54,6 +56,8 @@ export { useSafeAreaInsets, useFilterManager, useDeviceInfo, getDeviceInfo, logD
54
56
  export { JsModal } from "./JsModal.js";
55
57
  // game ui colors
56
58
  export { gameUIColors, buoyColors } from "./ui/gameUI/constants/gameUIColors.js";
59
+ // Runtime re-tint hook — only the desktop dashboard's theme switcher uses it.
60
+ export { refreshGameUIColors } from "./ui/gameUI/constants/gameUIColors.js";
57
61
  export { macOSColors } from "./ui/gameUI/constants/macOSDesignSystemColors.js";
58
62
  export { dialColors } from "./ui/gameUI/constants/gameUIColors.js";
59
63
  //EnvironmentIndicator
@@ -6,6 +6,8 @@ import { useState, useEffect } from "react";
6
6
  import { CyberpunkSectionButton } from "../../ui/console/CyberpunkSectionButton.js";
7
7
  import { devToolsStorageKeys } from "../../storage/devToolsStorageKeys.js";
8
8
  import { persistentStorage } from "../../utils/persistentStorage.js";
9
+ import { macOSColors } from "../../ui/gameUI/constants/macOSDesignSystemColors.js";
10
+ import { buoyColors } from "../../ui/gameUI/constants/gameUIColors.js";
9
11
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
12
  const STORAGE_KEY = devToolsStorageKeys.bubble.settings();
11
13
  const USER_PREFERENCES_KEY = devToolsStorageKeys.bubble.userPreferences();
@@ -206,7 +208,7 @@ export function BubbleSettingsDetail({
206
208
  false: "#4B5563",
207
209
  true: "#10B981"
208
210
  },
209
- thumbColor: settings[config.key] ? "#fff" : "#9CA3AF"
211
+ thumbColor: settings[config.key] ? "#fff" : buoyColors.textSecondary
210
212
  })]
211
213
  }, config.key))
212
214
  }), /*#__PURE__*/_jsxs(View, {
@@ -215,7 +217,7 @@ export function BubbleSettingsDetail({
215
217
  style: styles.noteContainer,
216
218
  children: [/*#__PURE__*/_jsx(EyeOff, {
217
219
  size: 16,
218
- color: "#9CA3AF"
220
+ color: buoyColors.textSecondary
219
221
  }), /*#__PURE__*/_jsx(Text, {
220
222
  style: styles.noteText,
221
223
  children: "User status indicator is always visible and cannot be disabled"
@@ -244,7 +246,7 @@ const styles = StyleSheet.create({
244
246
  flexGrow: 1
245
247
  },
246
248
  sectionCard: {
247
- backgroundColor: "#1F2937",
249
+ backgroundColor: buoyColors.input,
248
250
  borderRadius: 8,
249
251
  padding: 16,
250
252
  flexDirection: "row",
@@ -264,25 +266,25 @@ const styles = StyleSheet.create({
264
266
  flex: 1
265
267
  },
266
268
  title: {
267
- color: "#E5E7EB",
269
+ color: buoyColors.text,
268
270
  fontSize: 14,
269
271
  fontWeight: "600",
270
272
  marginBottom: 2
271
273
  },
272
274
  subtitle: {
273
- color: "#9CA3AF",
275
+ color: buoyColors.textSecondary,
274
276
  fontSize: 12
275
277
  },
276
278
  chevron: {
277
- color: "#6B7280",
279
+ color: macOSColors.text.icon,
278
280
  fontSize: 20
279
281
  },
280
282
  detailContainer: {
281
283
  flex: 1,
282
- backgroundColor: "#171717"
284
+ backgroundColor: buoyColors.card
283
285
  },
284
286
  loadingText: {
285
- color: "#9CA3AF",
287
+ color: buoyColors.textSecondary,
286
288
  fontSize: 14,
287
289
  textAlign: "center",
288
290
  marginTop: 20
@@ -290,16 +292,16 @@ const styles = StyleSheet.create({
290
292
  header: {
291
293
  padding: 16,
292
294
  borderBottomWidth: 1,
293
- borderBottomColor: "rgba(255, 255, 255, 0.1)"
295
+ borderBottomColor: "rgba(128, 128, 128, 0.2)"
294
296
  },
295
297
  headerTitle: {
296
- color: "#E5E7EB",
298
+ color: buoyColors.text,
297
299
  fontSize: 16,
298
300
  fontWeight: "600",
299
301
  marginBottom: 4
300
302
  },
301
303
  headerDescription: {
302
- color: "#9CA3AF",
304
+ color: buoyColors.textSecondary,
303
305
  fontSize: 12
304
306
  },
305
307
  settingsList: {
@@ -310,7 +312,7 @@ const styles = StyleSheet.create({
310
312
  alignItems: "center",
311
313
  paddingVertical: 12,
312
314
  borderBottomWidth: 1,
313
- borderBottomColor: "rgba(255, 255, 255, 0.05)"
315
+ borderBottomColor: "rgba(128, 128, 128, 0.1)"
314
316
  },
315
317
  settingIconContainer: {
316
318
  width: 32,
@@ -324,13 +326,13 @@ const styles = StyleSheet.create({
324
326
  marginRight: 12
325
327
  },
326
328
  settingLabel: {
327
- color: "#E5E7EB",
329
+ color: buoyColors.text,
328
330
  fontSize: 14,
329
331
  fontWeight: "500",
330
332
  marginBottom: 2
331
333
  },
332
334
  settingDescription: {
333
- color: "#6B7280",
335
+ color: macOSColors.text.icon,
334
336
  fontSize: 11
335
337
  },
336
338
  indicator: {
@@ -341,7 +343,7 @@ const styles = StyleSheet.create({
341
343
  footer: {
342
344
  padding: 16,
343
345
  borderTopWidth: 1,
344
- borderTopColor: "rgba(255, 255, 255, 0.1)"
346
+ borderTopColor: "rgba(128, 128, 128, 0.2)"
345
347
  },
346
348
  noteContainer: {
347
349
  flexDirection: "row",
@@ -350,12 +352,12 @@ const styles = StyleSheet.create({
350
352
  marginBottom: 8
351
353
  },
352
354
  noteText: {
353
- color: "#9CA3AF",
355
+ color: buoyColors.textSecondary,
354
356
  fontSize: 12,
355
357
  flex: 1
356
358
  },
357
359
  restartNote: {
358
- color: "#6B7280",
360
+ color: macOSColors.text.icon,
359
361
  fontSize: 11,
360
362
  fontStyle: "italic"
361
363
  },
@@ -364,10 +366,10 @@ const styles = StyleSheet.create({
364
366
  paddingVertical: 8,
365
367
  marginTop: 8,
366
368
  borderTopWidth: 1,
367
- borderTopColor: "rgba(255, 255, 255, 0.06)"
369
+ borderTopColor: "rgba(128, 128, 128, 0.12)"
368
370
  },
369
371
  sectionTitle: {
370
- color: "#9CA3AF",
372
+ color: buoyColors.textSecondary,
371
373
  fontSize: 12,
372
374
  fontWeight: "600",
373
375
  letterSpacing: 0.5,
@@ -95,8 +95,6 @@ export const devToolsStorageKeys = {
95
95
  preferences: () => `${devToolsStorageKeys.storage.root()}_preferences`,
96
96
  activeTab: () => `${devToolsStorageKeys.storage.root()}_active_tab`,
97
97
  isMonitoring: () => `${devToolsStorageKeys.storage.root()}_is_monitoring`,
98
- detailView: () => `${devToolsStorageKeys.storage.root()}_detail_view`,
99
- // 'current' | 'diff'
100
98
  diffViewerMode: () => `${devToolsStorageKeys.storage.root()}_diff_viewer_mode` // 'split' | 'tree'
101
99
  },
102
100
  /**
@@ -123,7 +121,12 @@ export const devToolsStorageKeys = {
123
121
  ignoredDomains: () => `${devToolsStorageKeys.network.root()}_ignored_domains`,
124
122
  ignoredUrls: () => `${devToolsStorageKeys.network.root()}_ignored_urls`,
125
123
  preferences: () => `${devToolsStorageKeys.network.root()}_preferences`,
126
- copyOptions: () => `${devToolsStorageKeys.network.root()}_copy_options`
124
+ copyOptions: () => `${devToolsStorageKeys.network.root()}_copy_options`,
125
+ /**
126
+ * Pinned + saved requests (snapshots, not IDs — request IDs are
127
+ * per-runtime counters and collide across app launches).
128
+ */
129
+ saved: () => `${devToolsStorageKeys.network.root()}_saved`
127
130
  },
128
131
  /**
129
132
  * Route events-related storage keys
@@ -204,6 +204,8 @@ const styles = StyleSheet.create({
204
204
  alignItems: "center"
205
205
  },
206
206
  methodBadge: {
207
+ // Fixed width keeps the URL column aligned down the list whether or not
208
+ // the badge still has a chip around it.
207
209
  minWidth: 45,
208
210
  alignItems: "center"
209
211
  },
@@ -114,12 +114,19 @@ const styles = StyleSheet.create({
114
114
  borderRadius: 8,
115
115
  borderWidth: 1,
116
116
  borderColor: buoyColors.border + "40",
117
+ // …separated by a single hairline instead of four borders per row.
118
+ // Declared after borderWidth so the specific side wins on the chat path.
119
+ borderBottomWidth: 1,
120
+ borderBottomColor: buoyColors.border + "40",
117
121
  padding: 12,
122
+ paddingHorizontal: 12,
118
123
  transform: [{
119
124
  scale: 1
120
125
  }]
121
126
  },
122
127
  selectedRow: {
128
+ // Neutral fill, no outline, no lift — the same selection language as the
129
+ // sidebar. The classic path keeps its tinted, scaled, glowing card.
123
130
  backgroundColor: buoyColors.primary + "15",
124
131
  borderColor: buoyColors.primary + "50",
125
132
  transform: [{
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { useState, useRef, useCallback, memo, useEffect } from "react";
4
- import { TouchableOpacity, StyleSheet } from "react-native";
4
+ import { Text, TouchableOpacity, StyleSheet } from "react-native";
5
5
  import { copyToClipboard } from "../../clipboard/copyToClipboard.js";
6
6
  import { gameUIColors } from "../gameUI/constants/gameUIColors.js";
7
7
  import { Copy, CheckCircle2, AlertTriangle, Trash2 } from "../../icons/lucide-icons.js";
@@ -12,7 +12,7 @@ import { persistentStorage } from "../../utils/persistentStorage.js";
12
12
  import { useHintsDisabled } from "../../context/index.js";
13
13
  import { ProUpgradeModal } from "../../license/index.js";
14
14
  import { useIsPro } from "@buoy-gg/license";
15
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
15
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
16
16
  /**
17
17
  * Reusable copy button component with visual feedback
18
18
  * Shows different icons for idle, success, and error states
@@ -55,6 +55,8 @@ export const CopyButton = /*#__PURE__*/memo(function CopyButton({
55
55
  isFocused = false,
56
56
  size = 16,
57
57
  buttonStyle,
58
+ label,
59
+ labelStyle,
58
60
  onCopySuccess,
59
61
  onCopyError,
60
62
  feedbackDuration = 1500,
@@ -176,7 +178,7 @@ export const CopyButton = /*#__PURE__*/memo(function CopyButton({
176
178
  });
177
179
  };
178
180
  return /*#__PURE__*/_jsxs(_Fragment, {
179
- children: [/*#__PURE__*/_jsx(TouchableOpacity, {
181
+ children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
180
182
  ...touchableProps,
181
183
  style: [styles.button, buttonStyle],
182
184
  onPress: copyState === "idle" || !isPro ? handlePress : undefined,
@@ -189,7 +191,12 @@ export const CopyButton = /*#__PURE__*/memo(function CopyButton({
189
191
  },
190
192
  accessibilityLabel: copyState === "idle" ? "Copy to clipboard" : copyState === "success" ? "Copied to clipboard" : "Failed to copy",
191
193
  accessibilityRole: "button",
192
- children: renderIcon()
194
+ children: [renderIcon(), label ? /*#__PURE__*/_jsx(Text, {
195
+ style: [styles.label, {
196
+ color: getColor()
197
+ }, labelStyle],
198
+ children: label
199
+ }) : null]
193
200
  }), /*#__PURE__*/_jsx(ClipboardHintBanner, {
194
201
  visible: showHint,
195
202
  onAcknowledge: handleHintAcknowledge
@@ -204,7 +211,15 @@ const styles = StyleSheet.create({
204
211
  button: {
205
212
  padding: 4,
206
213
  justifyContent: "center",
207
- alignItems: "center"
214
+ alignItems: "center",
215
+ // Only relevant when a `label` is present; a bare icon button has one
216
+ // child, so the row direction and gap cost it nothing.
217
+ flexDirection: "row",
218
+ gap: 7
219
+ },
220
+ label: {
221
+ fontSize: 12.5,
222
+ fontWeight: "600"
208
223
  }
209
224
  });
210
225
 
@@ -268,7 +283,15 @@ const clearStyles = StyleSheet.create({
268
283
  button: {
269
284
  padding: 4,
270
285
  justifyContent: "center",
271
- alignItems: "center"
286
+ alignItems: "center",
287
+ // Only relevant when a `label` is present; a bare icon button has one
288
+ // child, so the row direction and gap cost it nothing.
289
+ flexDirection: "row",
290
+ gap: 7
291
+ },
292
+ label: {
293
+ fontSize: 12.5,
294
+ fontWeight: "600"
272
295
  },
273
296
  disabled: {
274
297
  opacity: 0.4
@@ -74,6 +74,11 @@ export function DevToolsCard({
74
74
  })
75
75
  });
76
76
  }
77
+
78
+ /**
79
+ * A bordered tile in a gutter. `CompactRow` is the other row primitive; keep the
80
+ * two in step.
81
+ */
77
82
  const styles = StyleSheet.create({
78
83
  wrapper: {
79
84
  marginHorizontal: DEVTOOLS_CARD_CONSTANTS.marginHorizontal,
@@ -84,10 +89,16 @@ const styles = StyleSheet.create({
84
89
  borderRadius: DEVTOOLS_CARD_CONSTANTS.borderRadius,
85
90
  borderWidth: DEVTOOLS_CARD_CONSTANTS.borderWidth,
86
91
  borderColor: buoyColors.border + "40",
92
+ // The separator. On classic this just re-states the full outline; on chat
93
+ // it is the ONLY edge the row has.
94
+ borderBottomWidth: 1,
95
+ borderBottomColor: buoyColors.border + "40",
87
96
  padding: DEVTOOLS_CARD_CONSTANTS.padding,
97
+ paddingHorizontal: DEVTOOLS_CARD_CONSTANTS.padding,
88
98
  minHeight: DEVTOOLS_CARD_CONSTANTS.minHeight
89
99
  },
90
100
  selectedCard: {
101
+ // Neutral grey fill, no tinted outline and no lift — see CompactRow.
91
102
  backgroundColor: buoyColors.primary + "15",
92
103
  borderColor: buoyColors.primary + "50",
93
104
  shadowColor: buoyColors.primary,
@@ -381,7 +381,14 @@ const styles = StyleSheet.create({
381
381
  borderRadius: 8,
382
382
  borderWidth: 1
383
383
  },
384
+ /**
385
+ * Selection is marked with a 2px accent outline. Border width stays 1 so
386
+ * selecting a
387
+ * tile doesn't shift the grid by a pixel.
388
+ */
384
389
  tabButtonActive: {
390
+ // White THUMB, not a grey one — the INACTIVE tab is already
391
+ // `buoyColors.hover` here, so a grey active state would be invisible.
385
392
  backgroundColor: buoyColors.primary + "20",
386
393
  borderColor: buoyColors.primary,
387
394
  borderWidth: 2
@@ -444,7 +451,7 @@ const styles = StyleSheet.create({
444
451
  backgroundColor: buoyColors.primary + "33",
445
452
  borderColor: buoyColors.primary,
446
453
  borderWidth: 2,
447
- // Subtle glow effect like web
454
+ // Subtle glow effect like web — no glows on a light surface.
448
455
  shadowColor: buoyColors.primary,
449
456
  shadowOffset: {
450
457
  width: 0,
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { StyleSheet, Text, View, TouchableOpacity } from "react-native";
4
+ import { macOSColors } from "../gameUI/constants/macOSDesignSystemColors.js";
4
5
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
6
  /**
6
7
  * Reusable empty state component for consistent empty/no-data displays
@@ -10,7 +11,7 @@ export function EmptyState({
10
11
  description,
11
12
  icon: Icon,
12
13
  iconSize = 48,
13
- iconColor = "#4B5563",
14
+ iconColor = macOSColors.border.hover,
14
15
  action,
15
16
  variant = "default",
16
17
  style
@@ -87,11 +88,11 @@ const styles = StyleSheet.create({
87
88
  maxWidth: 300
88
89
  },
89
90
  cardVariant: {
90
- backgroundColor: "rgba(255, 255, 255, 0.03)",
91
+ backgroundColor: "rgba(128, 128, 128, 0.06)",
91
92
  padding: 32,
92
93
  borderRadius: 8,
93
94
  borderWidth: 1,
94
- borderColor: "rgba(255, 255, 255, 0.05)"
95
+ borderColor: "rgba(128, 128, 128, 0.1)"
95
96
  },
96
97
  minimalVariant: {
97
98
  padding: 16
@@ -100,14 +101,20 @@ const styles = StyleSheet.create({
100
101
  marginBottom: 16
101
102
  },
102
103
  title: {
103
- color: "#6B7280",
104
+ color: macOSColors.text.icon,
104
105
  fontSize: 16,
105
106
  fontWeight: "500",
106
107
  textAlign: "center",
107
108
  marginBottom: 8
108
109
  },
109
110
  description: {
110
- color: "#4B5563",
111
+ // ⚠️ KNOWN LOW CONTRAST. This reads a BORDER token — border.hover is tuned
112
+ // to be a faint LINE, so as text it lands at ~2.8:1 on the near-black
113
+ // canvas, under WCAG AA. `macOSColors.text.muted` is the real tertiary-text
114
+ // token and would clear it comfortably. Left as-is because it is the
115
+ // shipped look and changing it moves every empty state in the suite; worth
116
+ // a deliberate pass rather than a drive-by.
117
+ color: macOSColors.border.hover,
111
118
  fontSize: 14,
112
119
  textAlign: "center",
113
120
  lineHeight: 20
@@ -3,6 +3,7 @@
3
3
  import { Component } from "react";
4
4
  import { View, Text, StyleSheet, TouchableOpacity } from "react-native";
5
5
  import { AlertTriangle, RefreshCw } from "../../icons/index.js";
6
+ import { buoyColors } from "../gameUI/constants/gameUIColors.js";
6
7
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
8
  export class ErrorBoundary extends Component {
8
9
  constructor(props) {
@@ -64,7 +65,7 @@ export class ErrorBoundary extends Component {
64
65
  }
65
66
  const styles = StyleSheet.create({
66
67
  errorContainer: {
67
- backgroundColor: "#171717",
68
+ backgroundColor: buoyColors.card,
68
69
  borderRadius: 6,
69
70
  borderWidth: 1,
70
71
  borderColor: "#EF4444",
@@ -82,7 +83,7 @@ const styles = StyleSheet.create({
82
83
  fontWeight: "600"
83
84
  },
84
85
  errorMessage: {
85
- color: "#9CA3AF",
86
+ color: buoyColors.textSecondary,
86
87
  fontSize: 12,
87
88
  textAlign: "center",
88
89
  lineHeight: 16
@@ -16,6 +16,30 @@ import { ViewToggleCards } from "./ViewToggleCards.js";
16
16
  import { DiffModeTabs } from "./DiffModeTabs.js";
17
17
  import { CompareBar } from "./CompareBar.js";
18
18
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
19
+ /**
20
+ * Section wrapper for the diff view: a plain flex box normally, or a ScrollView
21
+ * when the whole section should scroll as one page. Split out so the children
22
+ * are written once instead of duplicated across both branches.
23
+ */
24
+ function DiffSectionContainer({
25
+ scrolls,
26
+ style,
27
+ children
28
+ }) {
29
+ if (!scrolls) return /*#__PURE__*/_jsx(View, {
30
+ style: style,
31
+ children: children
32
+ });
33
+ // `contentSection` carries `flex: 1`, which is meaningless (and harmful) on a
34
+ // content container — the scrolling variant uses flexGrow padding instead.
35
+ return /*#__PURE__*/_jsx(ScrollView, {
36
+ style: styles.contentScroll,
37
+ contentContainerStyle: styles.contentScrollInner,
38
+ showsVerticalScrollIndicator: true,
39
+ children: children
40
+ });
41
+ }
42
+
19
43
  /**
20
44
  * EventHistoryViewer is the main container for viewing event history.
21
45
  * It composes sub-components to display current value or diff views.
@@ -51,6 +75,7 @@ export const EventHistoryViewer = /*#__PURE__*/memo(function EventHistoryViewer(
51
75
  canRightNext,
52
76
  onLeftPickerOpen,
53
77
  onRightPickerOpen,
78
+ scrollDiffSection,
54
79
  // Footer
55
80
  disableInternalFooter,
56
81
  footerCurrentIndex,
@@ -60,28 +85,36 @@ export const EventHistoryViewer = /*#__PURE__*/memo(function EventHistoryViewer(
60
85
  onFooterPrevious,
61
86
  onFooterNext
62
87
  }) {
88
+ const hasCurrentView = renderCurrentView != null;
63
89
  const diffDisabled = footerTotalItems <= 1;
64
90
  return /*#__PURE__*/_jsxs(_Fragment, {
65
91
  children: [/*#__PURE__*/_jsxs(View, {
66
92
  style: [styles.container, {
67
- // Add padding when footer is shown (internal or external via modal)
68
- paddingBottom: footerTotalItems > 1 ? 96 : 0
93
+ // Reserve space ONLY for the internal footer, which is absolutely
94
+ // positioned and would otherwise cover the content. An external
95
+ // footer is laid out by the host modal, which already pads the
96
+ // content area by its own footerHeight — adding this on top of that
97
+ // left a dead band above the footer (96px of padding for a footer
98
+ // that isn't in this subtree).
99
+ paddingBottom: !disableInternalFooter && footerTotalItems > 1 ? 96 : 0
69
100
  }],
70
- children: [/*#__PURE__*/_jsx(ViewToggleCards, {
101
+ children: [hasCurrentView && /*#__PURE__*/_jsx(ViewToggleCards, {
71
102
  activeView: activeView,
72
- onViewChange: onViewChange,
73
- currentLabel: currentViewLabel,
74
- currentDescription: currentViewDescription,
103
+ onViewChange: onViewChange ?? (() => {}),
104
+ currentLabel: currentViewLabel ?? "",
105
+ currentDescription: currentViewDescription ?? "",
75
106
  currentIcon: currentViewIcon,
76
107
  diffLabel: diffViewLabel,
77
108
  diffDescription: diffViewDescription,
78
109
  diffIcon: diffViewIcon,
79
110
  diffDisabled: diffDisabled
80
- }), activeView === "current" && /*#__PURE__*/_jsx(ScrollView, {
81
- style: styles.contentSection,
111
+ }), hasCurrentView && activeView === "current" && /*#__PURE__*/_jsx(ScrollView, {
112
+ style: styles.contentScroll,
113
+ contentContainerStyle: styles.contentScrollInner,
82
114
  showsVerticalScrollIndicator: true,
83
- children: renderCurrentView()
84
- }), activeView === "diff" && /*#__PURE__*/_jsxs(View, {
115
+ children: renderCurrentView?.()
116
+ }), (!hasCurrentView || activeView === "diff") && /*#__PURE__*/_jsxs(DiffSectionContainer, {
117
+ scrolls: scrollDiffSection,
85
118
  style: styles.contentSection,
86
119
  children: [diffModeTabs && diffModeTabs.length > 0 && onDiffModeChange && /*#__PURE__*/_jsx(DiffModeTabs, {
87
120
  tabs: diffModeTabs,
@@ -101,7 +134,10 @@ export const EventHistoryViewer = /*#__PURE__*/memo(function EventHistoryViewer(
101
134
  canRightNext: canRightNext,
102
135
  onLeftPress: onLeftPickerOpen,
103
136
  onRightPress: onRightPickerOpen
104
- }), renderDiffContent()]
137
+ }), scrollDiffSection ? renderDiffContent() : /*#__PURE__*/_jsx(View, {
138
+ style: styles.diffContent,
139
+ children: renderDiffContent()
140
+ })]
105
141
  })]
106
142
  }), !disableInternalFooter && /*#__PURE__*/_jsx(EventStepperFooter, {
107
143
  currentIndex: footerCurrentIndex,
@@ -121,7 +157,23 @@ const styles = StyleSheet.create({
121
157
  },
122
158
  contentSection: {
123
159
  flex: 1,
160
+ minHeight: 0,
124
161
  paddingHorizontal: 14,
125
162
  paddingVertical: 10
163
+ },
164
+ contentScroll: {
165
+ // No `minHeight: 0` here. On the scroll frame it stops the ScrollView from
166
+ // constraining itself, so a tall value lays out at full content height and
167
+ // spills past the panel and the footer instead of scrolling inside it.
168
+ flex: 1
169
+ },
170
+ contentScrollInner: {
171
+ flexGrow: 1,
172
+ paddingHorizontal: 14,
173
+ paddingVertical: 10
174
+ },
175
+ diffContent: {
176
+ flex: 1,
177
+ minHeight: 0
126
178
  }
127
179
  });