@buoy-gg/core 7.0.40 → 7.0.41

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 (140) hide show
  1. package/README.md +10 -0
  2. package/bin/buoy.js +25 -31
  3. package/lib/commonjs/browserRegister.js +48 -0
  4. package/lib/commonjs/browserRegister.server.js +10 -0
  5. package/lib/commonjs/floatingMenu/AppHost.web.js +71 -59
  6. package/lib/commonjs/floatingMenu/BrowserToolRuntime.js +150 -0
  7. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.js +10 -1111
  8. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.shared.js +1114 -0
  9. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.web.js +28 -1028
  10. package/lib/commonjs/floatingMenu/FloatingDevTools.js +7 -2
  11. package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +54 -40
  12. package/lib/commonjs/floatingMenu/MinimizedToolsStack.web.js +8 -2
  13. package/lib/commonjs/floatingMenu/autoDiscoverPresets.js +10 -0
  14. package/lib/commonjs/floatingMenu/autoExternalSync.js +9 -0
  15. package/lib/commonjs/floatingMenu/dial/DialDevTools.web.js +86 -12
  16. package/lib/commonjs/floatingMenu/dial/DialIcon.js +4 -2
  17. package/lib/commonjs/floatingMenu/settingsBus.js +6 -17
  18. package/lib/commonjs/floatingMenu/useDesktopSyncStatus.web.js +14 -0
  19. package/lib/commonjs/index.web.js +92 -1
  20. package/lib/commonjs/reactDevtoolsTypes.js +1 -0
  21. package/lib/commonjs/utils/autoDiscoverPresets.web.js +5 -178
  22. package/lib/commonjs/utils/createWebTool.js +20 -0
  23. package/lib/commonjs/utils/createWebTools.js +30 -0
  24. package/lib/commonjs/version.js +1 -1
  25. package/lib/module/browserRegister.js +44 -0
  26. package/lib/module/browserRegister.server.js +6 -0
  27. package/lib/module/floatingMenu/AppHost.web.js +71 -59
  28. package/lib/module/floatingMenu/BrowserToolRuntime.js +146 -0
  29. package/lib/module/floatingMenu/DevToolsSettingsModal.js +1 -1113
  30. package/lib/module/floatingMenu/DevToolsSettingsModal.shared.js +1110 -0
  31. package/lib/module/floatingMenu/DevToolsSettingsModal.web.js +32 -1043
  32. package/lib/module/floatingMenu/FloatingDevTools.js +7 -2
  33. package/lib/module/floatingMenu/FloatingDevTools.web.js +55 -42
  34. package/lib/module/floatingMenu/MinimizedToolsStack.web.js +8 -2
  35. package/lib/module/floatingMenu/autoDiscoverPresets.js +10 -0
  36. package/lib/module/floatingMenu/autoExternalSync.js +9 -0
  37. package/lib/module/floatingMenu/dial/DialDevTools.web.js +87 -14
  38. package/lib/module/floatingMenu/dial/DialIcon.js +4 -2
  39. package/lib/module/floatingMenu/settingsBus.js +1 -17
  40. package/lib/module/floatingMenu/useDesktopSyncStatus.web.js +10 -0
  41. package/lib/module/index.web.js +8 -1
  42. package/lib/module/reactDevtoolsTypes.js +1 -0
  43. package/lib/module/utils/autoDiscoverPresets.web.js +5 -180
  44. package/lib/module/utils/createWebTool.js +17 -0
  45. package/lib/module/utils/createWebTools.js +25 -0
  46. package/lib/module/version.js +1 -1
  47. package/lib/typescript/commonjs/browserRegister.d.ts +5 -0
  48. package/lib/typescript/commonjs/browserRegister.d.ts.map +1 -0
  49. package/lib/typescript/commonjs/browserRegister.server.d.ts +5 -0
  50. package/lib/typescript/commonjs/browserRegister.server.d.ts.map +1 -0
  51. package/lib/typescript/commonjs/floatingMenu/AppHost.web.d.ts +3 -3
  52. package/lib/typescript/commonjs/floatingMenu/AppHost.web.d.ts.map +1 -1
  53. package/lib/typescript/commonjs/floatingMenu/BrowserToolRuntime.d.ts +14 -0
  54. package/lib/typescript/commonjs/floatingMenu/BrowserToolRuntime.d.ts.map +1 -0
  55. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts +2 -67
  56. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
  57. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.shared.d.ts +71 -0
  58. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.shared.d.ts.map +1 -0
  59. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.web.d.ts +3 -16
  60. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.web.d.ts.map +1 -1
  61. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.d.ts.map +1 -1
  62. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.web.d.ts +12 -6
  63. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.web.d.ts.map +1 -1
  64. package/lib/typescript/commonjs/floatingMenu/MinimizedToolsStack.web.d.ts.map +1 -1
  65. package/lib/typescript/commonjs/floatingMenu/autoDiscoverPresets.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/floatingMenu/autoExternalSync.d.ts.map +1 -1
  67. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts +1 -1
  68. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts.map +1 -1
  69. package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.web.d.ts.map +1 -1
  70. package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts.map +1 -1
  71. package/lib/typescript/commonjs/floatingMenu/settingsBus.d.ts +1 -9
  72. package/lib/typescript/commonjs/floatingMenu/settingsBus.d.ts.map +1 -1
  73. package/lib/typescript/commonjs/floatingMenu/useDesktopSyncStatus.web.d.ts +3 -0
  74. package/lib/typescript/commonjs/floatingMenu/useDesktopSyncStatus.web.d.ts.map +1 -0
  75. package/lib/typescript/commonjs/index.web.d.ts +6 -0
  76. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  77. package/lib/typescript/commonjs/reactDevtoolsTypes.d.ts +8 -0
  78. package/lib/typescript/commonjs/reactDevtoolsTypes.d.ts.map +1 -0
  79. package/lib/typescript/commonjs/utils/autoDiscoverPresets.web.d.ts +3 -40
  80. package/lib/typescript/commonjs/utils/autoDiscoverPresets.web.d.ts.map +1 -1
  81. package/lib/typescript/commonjs/utils/createWebTool.d.ts +6 -0
  82. package/lib/typescript/commonjs/utils/createWebTool.d.ts.map +1 -0
  83. package/lib/typescript/commonjs/utils/createWebTools.d.ts +4 -0
  84. package/lib/typescript/commonjs/utils/createWebTools.d.ts.map +1 -0
  85. package/lib/typescript/commonjs/version.d.ts +1 -1
  86. package/lib/typescript/module/browserRegister.d.ts +5 -0
  87. package/lib/typescript/module/browserRegister.d.ts.map +1 -0
  88. package/lib/typescript/module/browserRegister.server.d.ts +5 -0
  89. package/lib/typescript/module/browserRegister.server.d.ts.map +1 -0
  90. package/lib/typescript/module/floatingMenu/AppHost.web.d.ts +3 -3
  91. package/lib/typescript/module/floatingMenu/AppHost.web.d.ts.map +1 -1
  92. package/lib/typescript/module/floatingMenu/BrowserToolRuntime.d.ts +14 -0
  93. package/lib/typescript/module/floatingMenu/BrowserToolRuntime.d.ts.map +1 -0
  94. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts +2 -67
  95. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
  96. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.shared.d.ts +71 -0
  97. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.shared.d.ts.map +1 -0
  98. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.web.d.ts +3 -16
  99. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.web.d.ts.map +1 -1
  100. package/lib/typescript/module/floatingMenu/FloatingDevTools.d.ts.map +1 -1
  101. package/lib/typescript/module/floatingMenu/FloatingDevTools.web.d.ts +12 -6
  102. package/lib/typescript/module/floatingMenu/FloatingDevTools.web.d.ts.map +1 -1
  103. package/lib/typescript/module/floatingMenu/MinimizedToolsStack.web.d.ts.map +1 -1
  104. package/lib/typescript/module/floatingMenu/autoDiscoverPresets.d.ts.map +1 -1
  105. package/lib/typescript/module/floatingMenu/autoExternalSync.d.ts.map +1 -1
  106. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts +1 -1
  107. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts.map +1 -1
  108. package/lib/typescript/module/floatingMenu/dial/DialDevTools.web.d.ts.map +1 -1
  109. package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts.map +1 -1
  110. package/lib/typescript/module/floatingMenu/settingsBus.d.ts +1 -9
  111. package/lib/typescript/module/floatingMenu/settingsBus.d.ts.map +1 -1
  112. package/lib/typescript/module/floatingMenu/useDesktopSyncStatus.web.d.ts +3 -0
  113. package/lib/typescript/module/floatingMenu/useDesktopSyncStatus.web.d.ts.map +1 -0
  114. package/lib/typescript/module/index.web.d.ts +6 -0
  115. package/lib/typescript/module/index.web.d.ts.map +1 -1
  116. package/lib/typescript/module/reactDevtoolsTypes.d.ts +8 -0
  117. package/lib/typescript/module/reactDevtoolsTypes.d.ts.map +1 -0
  118. package/lib/typescript/module/utils/autoDiscoverPresets.web.d.ts +3 -40
  119. package/lib/typescript/module/utils/autoDiscoverPresets.web.d.ts.map +1 -1
  120. package/lib/typescript/module/utils/createWebTool.d.ts +6 -0
  121. package/lib/typescript/module/utils/createWebTool.d.ts.map +1 -0
  122. package/lib/typescript/module/utils/createWebTools.d.ts +4 -0
  123. package/lib/typescript/module/utils/createWebTools.d.ts.map +1 -0
  124. package/lib/typescript/module/version.d.ts +1 -1
  125. package/lib/web/chunks/chunk-5NZOQR6Q.mjs +2 -0
  126. package/lib/web/chunks/chunk-CGDSLLZF.mjs +2 -0
  127. package/lib/web/chunks/chunk-DCJDUSNR.mjs +2 -0
  128. package/lib/web/chunks/chunk-IDSHFS6G.mjs +2 -0
  129. package/lib/web/chunks/chunk-JOAMJGCS.mjs +2 -0
  130. package/lib/web/chunks/chunk-KYKZ2N52.mjs +2 -0
  131. package/lib/web/chunks/chunk-NGM7JGGS.mjs +2 -0
  132. package/lib/web/chunks/chunk-QZDVCMCT.mjs +2 -0
  133. package/lib/web/chunks/chunk-R7RGRTY5.mjs +2 -0
  134. package/lib/web/chunks/chunk-Z3XWDDIO.mjs +2 -0
  135. package/lib/web/chunks/chunk-ZTGQ6TTY.mjs +2 -0
  136. package/lib/web/index.mjs +11 -0
  137. package/lib/web/register-server.mjs +2 -0
  138. package/lib/web/register.mjs +2 -0
  139. package/lib/web/toolkit.mjs +2 -0
  140. package/package.json +50 -12
@@ -517,7 +517,12 @@ const FloatingDevTools = ({
517
517
  ,
518
518
  __buoyDevToolsRoot: true,
519
519
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_DevToolsVisibilityContext.DevToolsVisibilityProvider, {
520
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_AppHost.AppHostProvider, {
520
+ children: [ImageOverlayOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
521
+ style: _reactNative.StyleSheet.absoluteFill,
522
+ pointerEvents: "box-none",
523
+ collapsable: false,
524
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ImageOverlayOverlay, {})
525
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_AppHost.AppHostProvider, {
521
526
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MinimizedToolsContext.MinimizedToolsProvider, {
522
527
  getToolIcon: getToolIcon,
523
528
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_FloatingMenu.FloatingMenu, {
@@ -528,7 +533,7 @@ const FloatingDevTools = ({
528
533
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_AppHost.AppOverlay, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.FloatingToolHost, {})]
529
534
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolOpenerBridge.ToolOpenerBridge, {})]
530
535
  })
531
- }), children, DebugBordersOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(DebugBordersOverlay, {}), HighlightUpdatesOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(HighlightUpdatesOverlay, {}), ImageOverlayOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(ImageOverlayOverlay, {}), PerfMonitorOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(PerfMonitorOverlay, {}), JsTopOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(JsTopOverlay, {}), ImpersonateOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(ImpersonateOverlay, {}), ScenariosOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(ScenariosOverlay, {}), ReduxAutoInstrument && /*#__PURE__*/(0, _jsxRuntime.jsx)(ReduxAutoInstrument, {}), ConsoleRoot && /*#__PURE__*/(0, _jsxRuntime.jsx)(ConsoleRoot, {}), RouteTracker && /*#__PURE__*/(0, _jsxRuntime.jsx)(RouteTracker, {}), ReactQueryTracker && /*#__PURE__*/(0, _jsxRuntime.jsx)(ReactQueryTracker, {}), toolRegistry, syncEnabled && /*#__PURE__*/(0, _jsxRuntime.jsx)(_autoExternalSync.AutoExternalSync, {
536
+ }), children, DebugBordersOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(DebugBordersOverlay, {}), HighlightUpdatesOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(HighlightUpdatesOverlay, {}), PerfMonitorOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(PerfMonitorOverlay, {}), JsTopOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(JsTopOverlay, {}), ImpersonateOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(ImpersonateOverlay, {}), ScenariosOverlay && /*#__PURE__*/(0, _jsxRuntime.jsx)(ScenariosOverlay, {}), ReduxAutoInstrument && /*#__PURE__*/(0, _jsxRuntime.jsx)(ReduxAutoInstrument, {}), ConsoleRoot && /*#__PURE__*/(0, _jsxRuntime.jsx)(ConsoleRoot, {}), RouteTracker && /*#__PURE__*/(0, _jsxRuntime.jsx)(RouteTracker, {}), ReactQueryTracker && /*#__PURE__*/(0, _jsxRuntime.jsx)(ReactQueryTracker, {}), toolRegistry, syncEnabled && /*#__PURE__*/(0, _jsxRuntime.jsx)(_autoExternalSync.AutoExternalSync, {
532
537
  options: (0, _externalSyncGate.externalSyncOptions)(externalSync),
533
538
  requiredEnvVars: requiredEnvVars,
534
539
  isPro: isLicensed,
@@ -17,36 +17,15 @@ var _OnboardingTooltipWeb = require("./dial/OnboardingTooltip.web.js");
17
17
  var _DevToolsSettingsModalWeb = require("./DevToolsSettingsModal.web.js");
18
18
  var _AppHostWeb = require("./AppHost.web.js");
19
19
  var _MinimizedToolsStackWeb = require("./MinimizedToolsStack.web.js");
20
+ var _createWebTools = require("../utils/createWebTools.js");
21
+ var _BrowserToolRuntime = require("./BrowserToolRuntime.js");
22
+ var _DevToolsVisibilityContext = require("./DevToolsVisibilityContext.js");
20
23
  var _jsxRuntime = require("react/jsx-runtime");
21
- /**
22
- * FloatingDevTools - Unified dev tools component for React DOM Web.
23
- *
24
- * Matches the mobile FloatingDevTools API exactly:
25
- * - Self-contained (doesn't wrap your app)
26
- * - Auto-discovers installed tool packages
27
- * - Manages dial menu and settings modal state internally
28
- *
29
- * Usage (same as mobile):
30
- * ```tsx
31
- * <>
32
- * <YourApp />
33
- * <FloatingDevTools environment="qa" userRole="admin" />
34
- * </>
35
- * ```
36
- *
37
- * @platform React DOM Web (Vite, CRA, Next.js, Electron)
38
- */
24
+ const EMPTY_MODULES = {};
39
25
 
40
26
  // native FloatingMenu.tsx TOOLTIP_SHOWN_KEY
41
27
  const MENU_TOOLTIP_KEY = '@react_buoy_floating_menu_tooltip_shown';
42
-
43
- // Same localStorage adapter the settings modal uses — without it, useSettings
44
- // never loads persisted settings and this instance sits on defaults across
45
- // launches (live changes still arrive via the settings event bus).
46
- const webSettingsStorage = {
47
- getItem: key => localStorage.getItem(key),
48
- setItem: (key, value) => localStorage.setItem(key, value)
49
- };
28
+ const webSettingsStorage = _sharedUi.persistentStorage;
50
29
 
51
30
  // =============================
52
31
  // Types
@@ -92,9 +71,11 @@ function MenuLauncherIcon({
92
71
  function AdmittedFloatingDevTools(props) {
93
72
  // The tool host wraps everything so dial presses can open tool components
94
73
  // into the AppOverlay (web twin of the native AppHostProvider/AppOverlay).
95
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_AppHostWeb.AppHostProvider, {
96
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(FloatingDevToolsInner, {
97
- ...props
74
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_DevToolsVisibilityContext.DevToolsVisibilityProvider, {
75
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_AppHostWeb.AppHostProvider, {
76
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(FloatingDevToolsInner, {
77
+ ...props
78
+ })
98
79
  })
99
80
  });
100
81
  }
@@ -104,6 +85,10 @@ function FloatingDevToolsInner({
104
85
  availableEnvironments,
105
86
  onEnvironmentSwitch,
106
87
  apps,
88
+ modules = EMPTY_MODULES,
89
+ externalSync,
90
+ requiredEnvVars,
91
+ sentryGetClient,
107
92
  disableHints = false,
108
93
  headless = false
109
94
  }) {
@@ -114,7 +99,15 @@ function FloatingDevToolsInner({
114
99
  const appHost = (0, _AppHostWeb.useAppHost)();
115
100
 
116
101
  // Auto-discover tools and merge with custom apps
117
- const tools = (0, _react.useMemo)(() => (0, _autoDiscoverPresetsWeb.autoDiscoverWithCustom)(apps), [apps]);
102
+ const tools = (0, _react.useMemo)(() => (0, _autoDiscoverPresetsWeb.autoDiscoverWithCustom)([...(0, _createWebTools.createWebTools)(modules), ...(apps ?? [])]), [apps, modules]);
103
+ const visibility = (0, _DevToolsVisibilityContext.useDevToolsVisibility)();
104
+ const toolVisible = appHost.openApps.some(app => !app.minimized);
105
+ (0, _react.useEffect)(() => {
106
+ visibility.setDialOpen(isDialOpen);
107
+ }, [isDialOpen, visibility.setDialOpen]);
108
+ (0, _react.useEffect)(() => {
109
+ visibility.setToolOpen(toolVisible || isSettingsOpen);
110
+ }, [toolVisible, isSettingsOpen, visibility.setToolOpen]);
118
111
 
119
112
  // Let the host restore `@react_buoy_open_apps` from the previous session
120
113
  // once it knows which tools exist (native registerApps parity).
@@ -122,7 +115,15 @@ function FloatingDevToolsInner({
122
115
  registerApps
123
116
  } = appHost;
124
117
  (0, _react.useEffect)(() => {
125
- registerApps(tools);
118
+ registerApps(tools.map(tool => {
119
+ const icon = tool.icon;
120
+ return {
121
+ ...tool,
122
+ icon: typeof icon === 'function' ? ({
123
+ size
124
+ }) => icon(size) : icon
125
+ };
126
+ }));
126
127
  }, [registerApps, tools]);
127
128
 
128
129
  // Convert to available tools config for settings
@@ -173,6 +174,10 @@ function FloatingDevToolsInner({
173
174
  // Shared open path for dial + bubble-row tools.
174
175
  const openTool = (0, _react.useCallback)(tool => {
175
176
  void (0, _dialUsageStore.recordToolUsage)(tool.id);
177
+ if (tool.launchMode === 'toggle-only') {
178
+ tool.onPress?.();
179
+ return;
180
+ }
176
181
  if (tool.component) {
177
182
  const dockIcon = typeof tool.icon === 'function' ? tool.icon(20) : tool.icon;
178
183
  appHost.open({
@@ -180,6 +185,7 @@ function FloatingDevToolsInner({
180
185
  title: tool.name || (0, _floatingToolsReact.getToolLabel)(tool.id),
181
186
  component: tool.component,
182
187
  props: tool.props,
188
+ modal: tool.modal,
183
189
  launchMode: tool.launchMode || 'self-modal',
184
190
  singleton: tool.singleton ?? true,
185
191
  icon: dockIcon,
@@ -274,9 +280,9 @@ function FloatingDevToolsInner({
274
280
  // Callbacks
275
281
  const handleOpenDial = (0, _react.useCallback)(() => {
276
282
  // Opening the dial dismisses the welcome tooltip (native handleDialOpen).
277
- if (showWelcomeTooltip) dismissWelcomeTooltip();
283
+ dismissWelcomeTooltip();
278
284
  setIsDialOpen(true);
279
- }, [showWelcomeTooltip, dismissWelcomeTooltip]);
285
+ }, [dismissWelcomeTooltip]);
280
286
  const handleCloseDial = (0, _react.useCallback)(() => {
281
287
  setIsDialOpen(false);
282
288
  setIsSettingsOpen(false); // settings lives above the dial
@@ -291,13 +297,21 @@ function FloatingDevToolsInner({
291
297
  const environmentEnabled = settings.floatingTools.environment !== false;
292
298
  const welcomeActive = showWelcomeTooltip && !isDialOpen && !isAnyToolOpen;
293
299
  const hasMinimizedTools = appHost.openApps.some(app => app.minimized && app.launchMode !== 'toggle-only');
294
-
295
- // Headless: desktop sync is native-only, so there is nothing to mount on
296
- // web — accept the prop for API parity and render nothing. (After all
297
- // hooks so hook order is preserved.)
298
- if (headless) return null;
299
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
300
- children: [welcomeActive && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
300
+ const runtime = /*#__PURE__*/(0, _jsxRuntime.jsx)(_BrowserToolRuntime.BrowserToolRuntime, {
301
+ modules: modules,
302
+ apps: apps,
303
+ requiredEnvVars: requiredEnvVars,
304
+ externalSync: externalSync,
305
+ headless: headless,
306
+ sentryGetClient: sentryGetClient
307
+ });
308
+ if (headless) return runtime;
309
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
310
+ "data-buoy-root": "",
311
+ style: {
312
+ display: 'contents'
313
+ },
314
+ children: [runtime, welcomeActive && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
301
315
  style: {
302
316
  position: 'fixed',
303
317
  inset: 0,
@@ -258,12 +258,16 @@ function MinimizedToolsStack({
258
258
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
259
259
  style: {
260
260
  position: 'absolute',
261
- bottom: 0,
261
+ bottom: 'var(--buoy-stack-bottom, 0px)',
262
+ top: 'var(--buoy-stack-top, auto)',
262
263
  left: 0,
263
264
  width: containerWidth,
265
+ maxHeight: 'var(--buoy-stack-space, calc(100vh - 48px))',
266
+ visibility: isExpanded ? 'visible' : 'hidden',
264
267
  height: isExpanded ? expandedHeight : 0,
265
268
  opacity: isExpanded ? 1 : 0,
266
- overflow: 'hidden',
269
+ overflowY: 'auto',
270
+ overflowX: 'hidden',
267
271
  transition: 'height 200ms ease, opacity 200ms ease',
268
272
  pointerEvents: isExpanded ? 'auto' : 'none',
269
273
  ...frame
@@ -314,6 +318,8 @@ function MinimizedToolsStack({
314
318
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("button", {
315
319
  type: "button",
316
320
  "aria-label": `Show ${minimized.length} minimized tools`,
321
+ tabIndex: isExpanded ? -1 : 0,
322
+ "aria-hidden": isExpanded,
317
323
  onClick: () => setIsExpanded(true),
318
324
  style: {
319
325
  position: 'absolute',
@@ -188,6 +188,16 @@ function autoDiscoverPresets() {
188
188
  return null;
189
189
  }
190
190
  }
191
+ }, {
192
+ name: "@buoy-gg/notifications",
193
+ loader: () => {
194
+ try {
195
+ return require("@buoy-gg/notifications").notificationToolPreset;
196
+ } catch (e) {
197
+ (0, _optionalRequire.reportOptionalRequireError)("@buoy-gg/notifications", e);
198
+ return null;
199
+ }
200
+ }
191
201
  },
192
202
  // Sentry
193
203
  {
@@ -53,6 +53,12 @@ let jotaiModule = null;
53
53
  let eventsModule = null;
54
54
  let consoleModule = null;
55
55
  let sentryModule = null;
56
+ let notificationsModule = null;
57
+ try {
58
+ notificationsModule = require("@buoy-gg/notifications");
59
+ } catch (e) {
60
+ (0, _optionalRequire.reportOptionalRequireError)("@buoy-gg/notifications", e);
61
+ }
56
62
  let envModule = null;
57
63
  let highlightUpdatesModule = null;
58
64
  let debugBordersModule = null;
@@ -355,6 +361,9 @@ function useToolAdapterMapInner(queryAdapter, requiredEnvVars, customApps) {
355
361
  if (consoleModule?.consoleSyncAdapter) {
356
362
  map.console = consoleModule.consoleSyncAdapter;
357
363
  }
364
+ if (notificationsModule?.notificationSyncAdapter) {
365
+ map["push-notifications"] = notificationsModule.notificationSyncAdapter;
366
+ }
358
367
  if (sentryModule?.sentrySyncAdapter) {
359
368
  map.sentry = sentryModule.sentrySyncAdapter;
360
369
  }
@@ -7,6 +7,7 @@ exports.DialMenu = DialMenu;
7
7
  var _react = require("react");
8
8
  var _floatingToolsReact = require("@buoy-gg/floating-tools-react");
9
9
  var _sharedUi = require("@buoy-gg/shared-ui");
10
+ var _DialHyperspace = require("./DialHyperspace.js");
10
11
  var _OnboardingTooltipWeb = require("./OnboardingTooltip.web.js");
11
12
  var _jsxRuntime = require("react/jsx-runtime");
12
13
  /**
@@ -21,6 +22,11 @@ var _jsxRuntime = require("react/jsx-runtime");
21
22
  * @platform React DOM Web (Vite, CRA, Next.js, Electron)
22
23
  */
23
24
 
25
+ const DIAL_BACKGROUND_FOCUS = {
26
+ x: 0.5,
27
+ y: 0.5
28
+ };
29
+
24
30
  // native DialDevTools.tsx SETTINGS_TOOLTIP_KEY
25
31
  const SETTINGS_TOOLTIP_KEY = '@react_buoy_settings_tooltip_shown';
26
32
 
@@ -294,6 +300,10 @@ function DialMenu({
294
300
  settingsOpen = false,
295
301
  hintsDisabled = false
296
302
  }) {
303
+ const {
304
+ id: backgroundId
305
+ } = (0, _sharedUi.useToolBackground)();
306
+
297
307
  // Animation values
298
308
  const [backdropOpacity, setBackdropOpacity] = (0, _react.useState)(0);
299
309
  const [dialScale, setDialScale] = (0, _react.useState)(0);
@@ -308,6 +318,8 @@ function DialMenu({
308
318
  const [entranceComplete, setEntranceComplete] = (0, _react.useState)(false);
309
319
 
310
320
  // Refs
321
+ const dialogRef = (0, _react.useRef)(null);
322
+ const centerRef = (0, _react.useRef)(null);
311
323
  const animationRef = (0, _react.useRef)(null);
312
324
  const isClosingRef = (0, _react.useRef)(false);
313
325
 
@@ -320,9 +332,22 @@ function DialMenu({
320
332
  const cssAnimations = (0, _floatingToolsReact.getDialCSSAnimationStyles)();
321
333
 
322
334
  // Layout
335
+ const [viewport, setViewport] = (0, _react.useState)(() => ({
336
+ width: window.innerWidth,
337
+ height: window.innerHeight
338
+ }));
339
+ (0, _react.useEffect)(() => {
340
+ const resize = () => setViewport({
341
+ width: window.innerWidth,
342
+ height: window.innerHeight
343
+ });
344
+ window.addEventListener('resize', resize);
345
+ return () => window.removeEventListener('resize', resize);
346
+ }, []);
323
347
  const layout = (0, _react.useMemo)(() => (0, _floatingToolsReact.getDialLayout)({
324
- screenWidth: window.innerWidth
325
- }), []);
348
+ screenWidth: viewport.width,
349
+ maxCircleSize: Math.max(120, Math.min(320, viewport.height - 96))
350
+ }), [viewport]);
326
351
  const gridRotations = (0, _react.useMemo)(() => (0, _floatingToolsReact.getGridLineRotations)(), []);
327
352
  const positions = (0, _react.useMemo)(() => (0, _floatingToolsReact.getAllIconPositions)(_floatingToolsReact.MAX_DIAL_SLOTS, layout.iconRadius), [layout.iconRadius]);
328
353
 
@@ -469,17 +494,44 @@ function DialMenu({
469
494
  };
470
495
  animationRef.current = requestAnimationFrame(animate);
471
496
  }, [exit, onClose]);
472
-
473
- // Document-level Escape key handler
474
497
  (0, _react.useEffect)(() => {
475
- const handleKeyDown = e => {
476
- if (e.key === 'Escape') {
498
+ const opener = document.activeElement;
499
+ const dialog = dialogRef.current;
500
+ return () => {
501
+ if (opener?.isConnected && (document.activeElement === document.body || dialog?.contains(document.activeElement))) {
502
+ opener.focus();
503
+ }
504
+ };
505
+ }, []);
506
+ (0, _react.useEffect)(() => {
507
+ if (settingsOpen) return;
508
+ centerRef.current?.focus();
509
+ const handleKeyDown = event => {
510
+ const dialog = dialogRef.current;
511
+ if (!dialog) return;
512
+ if (event.key === 'Escape') {
513
+ event.preventDefault();
477
514
  handleClose();
515
+ } else if (event.key === 'Tab') {
516
+ const controls = Array.from(dialog.querySelectorAll('button:not(:disabled):not([aria-disabled="true"]), [tabindex="0"]')).filter(element => element.getClientRects().length > 0);
517
+ const first = controls[0];
518
+ const last = controls[controls.length - 1];
519
+ if (!dialog.contains(document.activeElement) || (event.shiftKey ? document.activeElement === first : document.activeElement === last)) {
520
+ event.preventDefault();
521
+ (event.shiftKey ? last : first)?.focus();
522
+ }
523
+ } else if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp', 'Home', 'End'].includes(event.key)) {
524
+ const items = Array.from(dialog.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])'));
525
+ const current = items.indexOf(document.activeElement);
526
+ if (current < 0 || !items.length) return;
527
+ event.preventDefault();
528
+ const next = event.key === 'Home' ? 0 : event.key === 'End' ? items.length - 1 : (current + (event.key === 'ArrowRight' || event.key === 'ArrowDown' ? 1 : -1) + items.length) % items.length;
529
+ items[next].focus();
478
530
  }
479
531
  };
480
532
  document.addEventListener('keydown', handleKeyDown);
481
533
  return () => document.removeEventListener('keydown', handleKeyDown);
482
- }, [handleClose]);
534
+ }, [handleClose, settingsOpen]);
483
535
 
484
536
  // Settings onboarding tooltip — native DialDevTools.tsx:174-196: shown
485
537
  // 1200ms after the dial mounts (entrance animations settle first) if never
@@ -555,6 +607,7 @@ function DialMenu({
555
607
  const hubClearance = layout.buttonSize * _floatingToolsReact.dialStyles.centerButton.containerRatio / 2 + 6;
556
608
  const isAnimating = entranceComplete && !isExiting;
557
609
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
610
+ ref: dialogRef,
558
611
  role: "dialog",
559
612
  "aria-label": "Dial Menu",
560
613
  "aria-modal": "true",
@@ -563,15 +616,16 @@ function DialMenu({
563
616
  inset: 0,
564
617
  zIndex: 10000
565
618
  },
566
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
567
- role: "button",
619
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
620
+ type: "button",
568
621
  "aria-label": "Close dial menu",
569
622
  tabIndex: 0,
570
623
  onClick: handleClose,
571
- onKeyDown: e => e.key === 'Escape' && handleClose(),
572
624
  style: {
573
625
  position: 'absolute',
574
626
  inset: 0,
627
+ border: 0,
628
+ padding: 0,
575
629
  backgroundColor: _floatingToolsReact.dialColors.dialBackdrop,
576
630
  opacity: backdropOpacity
577
631
  }
@@ -641,7 +695,20 @@ function DialMenu({
641
695
  backgroundColor: _floatingToolsReact.dialColors.dialGridLine
642
696
  }
643
697
  }, side))
644
- }, deg)), paddedIcons.map((icon, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(DialIconItem, {
698
+ }, deg)), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
699
+ "data-testid": "dial-background",
700
+ "data-background": backgroundId,
701
+ style: {
702
+ position: 'absolute',
703
+ inset: 0,
704
+ pointerEvents: 'none'
705
+ },
706
+ children: backgroundId === 'hyperspace' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_DialHyperspace.DialHyperspace, {
707
+ size: layout.circleSize
708
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ToolBackground, {
709
+ focus: DIAL_BACKGROUND_FOCUS
710
+ })
711
+ }), paddedIcons.map((icon, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(DialIconItem, {
645
712
  icon: icon,
646
713
  index: index,
647
714
  totalIcons: paddedIcons.length,
@@ -707,11 +774,18 @@ function DialMenu({
707
774
  alignItems: 'center',
708
775
  justifyContent: 'center'
709
776
  },
710
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
777
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
778
+ ref: centerRef,
779
+ type: "button",
780
+ "aria-label": settingsOpen ? 'Close settings' : 'Open settings',
781
+ disabled: !onCenterPress,
711
782
  onClick: onCenterPress,
712
783
  onMouseEnter: () => setIsHoveringCenter(true),
713
784
  onMouseLeave: () => setIsHoveringCenter(false),
714
785
  style: {
786
+ border: 0,
787
+ padding: 0,
788
+ background: 'transparent',
715
789
  width: layout.buttonSize,
716
790
  height: layout.buttonSize,
717
791
  borderRadius: layout.buttonSize / 2,
@@ -25,11 +25,13 @@ var _jsxRuntime = require("react/jsx-runtime");
25
25
  "time-machine": "Time Machine",
26
26
  "highlight-updates": "Highlight Updates",
27
27
  "debug-borders": "Debug Borders",
28
- "perf-monitor": "Perf Monitor",
28
+ // Bench (@buoy-gg/perf-monitor) has two dial entries: the HUD toggle and
29
+ // the tool. Both used to read "Perf Monitor", a name the product no longer uses.
30
+ "perf-monitor": "Bench HUD",
29
31
  "js-top": "JS Top",
30
32
  "js-top-modal": "JS Top",
31
33
  impersonate: "Impersonate",
32
- "perf-monitor-modal": "Perf Monitor"
34
+ "perf-monitor-modal": "Bench"
33
35
  };
34
36
  function dialAccessibilityLabel(id, name) {
35
37
  if (id && DIAL_A11Y[id]) return DIAL_A11Y[id];
@@ -3,21 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.settingsBus = void 0;
7
- class SimpleEventBus {
8
- listeners = new Set();
9
- emit(payload) {
10
- this.listeners.forEach(l => {
11
- try {
12
- l(payload);
13
- } catch (e) {
14
- console.error("Error emitting event:", e);
15
- }
16
- });
6
+ Object.defineProperty(exports, "settingsBus", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _floatingToolsCore.settingsEventBus;
17
10
  }
18
- addListener(listener) {
19
- this.listeners.add(listener);
20
- return () => this.listeners.delete(listener);
21
- }
22
- }
23
- const settingsBus = exports.settingsBus = new SimpleEventBus();
11
+ });
12
+ var _floatingToolsCore = require("@buoy-gg/floating-tools-core");
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useDesktopSyncStatus = useDesktopSyncStatus;
7
+ var _react = require("react");
8
+ var _sharedUi = require("@buoy-gg/shared-ui");
9
+ const noopSubscribe = () => () => {};
10
+ const serverSnapshot = () => null;
11
+ function useDesktopSyncStatus() {
12
+ const sync = (0, _sharedUi.getRegisteredToolModule)("@buoy-gg/external-sync");
13
+ return (0, _react.useSyncExternalStore)(sync?.subscribeSyncStatus ?? noopSubscribe, () => sync?.getSyncStatus?.() ?? null, serverSnapshot);
14
+ }
@@ -3,6 +3,38 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ var _exportNames = {
7
+ FloatingDevTools: true,
8
+ createWebTool: true,
9
+ FloatingTools: true,
10
+ UserStatus: true,
11
+ Divider: true,
12
+ DialMenu: true,
13
+ SettingsModal: true,
14
+ AppHostProvider: true,
15
+ AppOverlay: true,
16
+ useAppHost: true,
17
+ autoDiscoverWebPresets: true,
18
+ autoDiscoverWithCustom: true,
19
+ getToolsBySlot: true,
20
+ getEnabledTools: true,
21
+ defaultToolPresets: true,
22
+ useSettings: true,
23
+ useFloatingTools: true,
24
+ getToolLabel: true,
25
+ getToolDescription: true,
26
+ getToolColor: true,
27
+ settingsColors: true,
28
+ settingsStyles: true,
29
+ dialColors: true,
30
+ dialStyles: true,
31
+ createWebTools: true,
32
+ useToolHost: true,
33
+ useToolHeader: true,
34
+ DevToolsVisibilityProvider: true,
35
+ useDevToolsVisibility: true,
36
+ appSyncAdapter: true
37
+ };
6
38
  Object.defineProperty(exports, "AppHostProvider", {
7
39
  enumerable: true,
8
40
  get: function () {
@@ -15,6 +47,12 @@ Object.defineProperty(exports, "AppOverlay", {
15
47
  return _AppHostWeb.AppOverlay;
16
48
  }
17
49
  });
50
+ Object.defineProperty(exports, "DevToolsVisibilityProvider", {
51
+ enumerable: true,
52
+ get: function () {
53
+ return _DevToolsVisibilityContext.DevToolsVisibilityProvider;
54
+ }
55
+ });
18
56
  Object.defineProperty(exports, "DialMenu", {
19
57
  enumerable: true,
20
58
  get: function () {
@@ -51,6 +89,12 @@ Object.defineProperty(exports, "UserStatus", {
51
89
  return _floatingToolsWeb.UserStatus;
52
90
  }
53
91
  });
92
+ Object.defineProperty(exports, "appSyncAdapter", {
93
+ enumerable: true,
94
+ get: function () {
95
+ return _appSyncAdapter.appSyncAdapter;
96
+ }
97
+ });
54
98
  Object.defineProperty(exports, "autoDiscoverWebPresets", {
55
99
  enumerable: true,
56
100
  get: function () {
@@ -63,6 +107,18 @@ Object.defineProperty(exports, "autoDiscoverWithCustom", {
63
107
  return _autoDiscoverPresetsWeb.autoDiscoverWithCustom;
64
108
  }
65
109
  });
110
+ Object.defineProperty(exports, "createWebTool", {
111
+ enumerable: true,
112
+ get: function () {
113
+ return _createWebTool.createWebTool;
114
+ }
115
+ });
116
+ Object.defineProperty(exports, "createWebTools", {
117
+ enumerable: true,
118
+ get: function () {
119
+ return _createWebTools.createWebTools;
120
+ }
121
+ });
66
122
  Object.defineProperty(exports, "defaultToolPresets", {
67
123
  enumerable: true,
68
124
  get: function () {
@@ -129,6 +185,12 @@ Object.defineProperty(exports, "useAppHost", {
129
185
  return _AppHostWeb.useAppHost;
130
186
  }
131
187
  });
188
+ Object.defineProperty(exports, "useDevToolsVisibility", {
189
+ enumerable: true,
190
+ get: function () {
191
+ return _DevToolsVisibilityContext.useDevToolsVisibility;
192
+ }
193
+ });
132
194
  Object.defineProperty(exports, "useFloatingTools", {
133
195
  enumerable: true,
134
196
  get: function () {
@@ -141,10 +203,39 @@ Object.defineProperty(exports, "useSettings", {
141
203
  return _floatingToolsReact.useSettings;
142
204
  }
143
205
  });
206
+ Object.defineProperty(exports, "useToolHeader", {
207
+ enumerable: true,
208
+ get: function () {
209
+ return _ToolHost.useToolHeader;
210
+ }
211
+ });
212
+ Object.defineProperty(exports, "useToolHost", {
213
+ enumerable: true,
214
+ get: function () {
215
+ return _ToolHost.useToolHost;
216
+ }
217
+ });
144
218
  var _FloatingDevToolsWeb = require("./floatingMenu/FloatingDevTools.web.js");
219
+ var _createWebTool = require("./utils/createWebTool.js");
145
220
  var _floatingToolsWeb = require("./floatingMenu/floatingTools.web.js");
146
221
  var _DialDevToolsWeb = require("./floatingMenu/dial/DialDevTools.web.js");
147
222
  var _DevToolsSettingsModalWeb = require("./floatingMenu/DevToolsSettingsModal.web.js");
148
223
  var _AppHostWeb = require("./floatingMenu/AppHost.web.js");
149
224
  var _autoDiscoverPresetsWeb = require("./utils/autoDiscoverPresets.web.js");
150
- var _floatingToolsReact = require("@buoy-gg/floating-tools-react");
225
+ var _floatingToolsReact = require("@buoy-gg/floating-tools-react");
226
+ var _createWebTools = require("./utils/createWebTools.js");
227
+ var _toolkit = require("./toolkit.js");
228
+ Object.keys(_toolkit).forEach(function (key) {
229
+ if (key === "default" || key === "__esModule") return;
230
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
231
+ if (key in exports && exports[key] === _toolkit[key]) return;
232
+ Object.defineProperty(exports, key, {
233
+ enumerable: true,
234
+ get: function () {
235
+ return _toolkit[key];
236
+ }
237
+ });
238
+ });
239
+ var _ToolHost = require("./floatingMenu/ToolHost.js");
240
+ var _DevToolsVisibilityContext = require("./floatingMenu/DevToolsVisibilityContext.js");
241
+ var _appSyncAdapter = require("./floatingMenu/sync/appSyncAdapter.js");
@@ -0,0 +1 @@
1
+ "use strict";