@buoy-gg/core 7.0.40 → 7.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/README.md +14 -85
  2. package/bin/buoy.js +20 -347
  3. package/lib/commonjs/Buoy.js +1 -107
  4. package/lib/commonjs/browserRegister.js +1 -0
  5. package/lib/commonjs/browserRegister.server.js +1 -0
  6. package/lib/commonjs/earlyHookScript.js +1 -0
  7. package/lib/commonjs/earlyNetwork.js +1 -0
  8. package/lib/commonjs/floatingMenu/AppHost.js +1 -460
  9. package/lib/commonjs/floatingMenu/AppHost.web.js +1 -364
  10. package/lib/commonjs/floatingMenu/AppHostLogic.js +1 -50
  11. package/lib/commonjs/floatingMenu/AppIcon.js +1 -91
  12. package/lib/commonjs/floatingMenu/AppIcon.web.js +1 -53
  13. package/lib/commonjs/floatingMenu/BrowserToolRuntime.js +1 -0
  14. package/lib/commonjs/floatingMenu/DefaultConfigContext.js +1 -45
  15. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.js +1 -1119
  16. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.shared.js +1 -0
  17. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.web.js +1 -1048
  18. package/lib/commonjs/floatingMenu/DevToolsVisibilityContext.js +1 -49
  19. package/lib/commonjs/floatingMenu/FloatingDevTools.js +1 -554
  20. package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +1 -401
  21. package/lib/commonjs/floatingMenu/FloatingMenu.js +1 -371
  22. package/lib/commonjs/floatingMenu/MinimizedToolsContext.js +1 -274
  23. package/lib/commonjs/floatingMenu/MinimizedToolsStack.js +1 -288
  24. package/lib/commonjs/floatingMenu/MinimizedToolsStack.web.js +1 -371
  25. package/lib/commonjs/floatingMenu/ToggleStateManager.js +1 -36
  26. package/lib/commonjs/floatingMenu/ToolHost.js +1 -281
  27. package/lib/commonjs/floatingMenu/ToolOpenerBridge.js +1 -41
  28. package/lib/commonjs/floatingMenu/autoDiscoverPresets.js +1 -461
  29. package/lib/commonjs/floatingMenu/autoExternalSync.js +1 -434
  30. package/lib/commonjs/floatingMenu/defaultConfig.js +1 -167
  31. package/lib/commonjs/floatingMenu/deviceIdentity.js +1 -173
  32. package/lib/commonjs/floatingMenu/dial/DialDevTools.js +1 -904
  33. package/lib/commonjs/floatingMenu/dial/DialDevTools.web.js +1 -821
  34. package/lib/commonjs/floatingMenu/dial/DialHyperspace.js +1 -177
  35. package/lib/commonjs/floatingMenu/dial/DialIcon.js +1 -302
  36. package/lib/commonjs/floatingMenu/dial/DialPagination.js +1 -165
  37. package/lib/commonjs/floatingMenu/dial/DialSnow.js +1 -92
  38. package/lib/commonjs/floatingMenu/dial/OnboardingTooltip.js +1 -246
  39. package/lib/commonjs/floatingMenu/dial/OnboardingTooltip.web.js +2 -147
  40. package/lib/commonjs/floatingMenu/dial/dialUsageStore.js +1 -93
  41. package/lib/commonjs/floatingMenu/dial/onboardingConstants.js +1 -42
  42. package/lib/commonjs/floatingMenu/dial/onboardingConstants.web.js +1 -42
  43. package/lib/commonjs/floatingMenu/externalSyncGate.js +1 -49
  44. package/lib/commonjs/floatingMenu/floatingTools.js +1 -42
  45. package/lib/commonjs/floatingMenu/floatingTools.web.js +1 -30
  46. package/lib/commonjs/floatingMenu/optionalRequire.js +1 -37
  47. package/lib/commonjs/floatingMenu/settingsBus.js +1 -23
  48. package/lib/commonjs/floatingMenu/sync/appSyncAdapter.js +1 -115
  49. package/lib/commonjs/floatingMenu/types.js +1 -5
  50. package/lib/commonjs/floatingMenu/useDesktopSyncStatus.js +1 -28
  51. package/lib/commonjs/floatingMenu/useDesktopSyncStatus.web.js +1 -0
  52. package/lib/commonjs/index.js +1 -291
  53. package/lib/commonjs/index.web.js +1 -150
  54. package/lib/commonjs/reactDevtoolsTypes.js +1 -0
  55. package/lib/commonjs/releaseOptIn.js +1 -0
  56. package/lib/commonjs/telemetry/installPing.js +1 -131
  57. package/lib/commonjs/toolkit.js +1 -584
  58. package/lib/commonjs/toolkitComponents.js +1 -241
  59. package/lib/commonjs/utils/autoDiscoverPresets.web.js +1 -219
  60. package/lib/commonjs/utils/createWebTool.js +1 -0
  61. package/lib/commonjs/utils/createWebTools.js +1 -0
  62. package/lib/commonjs/version.js +1 -18
  63. package/lib/module/Buoy.js +1 -102
  64. package/lib/module/browserRegister.js +1 -0
  65. package/lib/module/browserRegister.server.js +1 -0
  66. package/lib/module/earlyHookScript.js +1 -0
  67. package/lib/module/earlyNetwork.js +1 -0
  68. package/lib/module/floatingMenu/AppHost.js +1 -452
  69. package/lib/module/floatingMenu/AppHost.web.js +1 -356
  70. package/lib/module/floatingMenu/AppHostLogic.js +1 -45
  71. package/lib/module/floatingMenu/AppIcon.js +1 -84
  72. package/lib/module/floatingMenu/AppIcon.web.js +1 -47
  73. package/lib/module/floatingMenu/BrowserToolRuntime.js +1 -0
  74. package/lib/module/floatingMenu/DefaultConfigContext.js +1 -39
  75. package/lib/module/floatingMenu/DevToolsSettingsModal.js +1 -1115
  76. package/lib/module/floatingMenu/DevToolsSettingsModal.shared.js +1 -0
  77. package/lib/module/floatingMenu/DevToolsSettingsModal.web.js +1 -1055
  78. package/lib/module/floatingMenu/DevToolsVisibilityContext.js +1 -44
  79. package/lib/module/floatingMenu/FloatingDevTools.js +1 -551
  80. package/lib/module/floatingMenu/FloatingDevTools.web.js +1 -399
  81. package/lib/module/floatingMenu/FloatingMenu.js +1 -366
  82. package/lib/module/floatingMenu/MinimizedToolsContext.js +1 -266
  83. package/lib/module/floatingMenu/MinimizedToolsStack.js +1 -285
  84. package/lib/module/floatingMenu/MinimizedToolsStack.web.js +1 -368
  85. package/lib/module/floatingMenu/ToggleStateManager.js +1 -32
  86. package/lib/module/floatingMenu/ToolHost.js +1 -273
  87. package/lib/module/floatingMenu/ToolOpenerBridge.js +1 -37
  88. package/lib/module/floatingMenu/autoDiscoverPresets.js +1 -457
  89. package/lib/module/floatingMenu/autoExternalSync.js +1 -427
  90. package/lib/module/floatingMenu/defaultConfig.js +1 -158
  91. package/lib/module/floatingMenu/deviceIdentity.js +1 -163
  92. package/lib/module/floatingMenu/dial/DialDevTools.js +1 -900
  93. package/lib/module/floatingMenu/dial/DialDevTools.web.js +1 -818
  94. package/lib/module/floatingMenu/dial/DialHyperspace.js +1 -173
  95. package/lib/module/floatingMenu/dial/DialIcon.js +1 -299
  96. package/lib/module/floatingMenu/dial/DialPagination.js +1 -160
  97. package/lib/module/floatingMenu/dial/DialSnow.js +1 -90
  98. package/lib/module/floatingMenu/dial/OnboardingTooltip.js +1 -240
  99. package/lib/module/floatingMenu/dial/OnboardingTooltip.web.js +2 -142
  100. package/lib/module/floatingMenu/dial/dialUsageStore.js +1 -85
  101. package/lib/module/floatingMenu/dial/onboardingConstants.js +1 -3
  102. package/lib/module/floatingMenu/dial/onboardingConstants.web.js +1 -3
  103. package/lib/module/floatingMenu/externalSyncGate.js +1 -44
  104. package/lib/module/floatingMenu/floatingTools.js +1 -27
  105. package/lib/module/floatingMenu/floatingTools.web.js +1 -3
  106. package/lib/module/floatingMenu/optionalRequire.js +1 -33
  107. package/lib/module/floatingMenu/settingsBus.js +1 -19
  108. package/lib/module/floatingMenu/sync/appSyncAdapter.js +1 -112
  109. package/lib/module/floatingMenu/types.js +1 -3
  110. package/lib/module/floatingMenu/useDesktopSyncStatus.js +1 -25
  111. package/lib/module/floatingMenu/useDesktopSyncStatus.web.js +1 -0
  112. package/lib/module/index.js +1 -41
  113. package/lib/module/index.web.js +1 -29
  114. package/lib/module/reactDevtoolsTypes.js +1 -0
  115. package/lib/module/releaseOptIn.js +1 -0
  116. package/lib/module/telemetry/installPing.js +1 -127
  117. package/lib/module/toolkit.js +1 -62
  118. package/lib/module/toolkitComponents.js +1 -230
  119. package/lib/module/utils/autoDiscoverPresets.web.js +1 -213
  120. package/lib/module/utils/createWebTool.js +1 -0
  121. package/lib/module/utils/createWebTools.js +1 -0
  122. package/lib/module/version.js +1 -14
  123. package/lib/typescript/commonjs/browserRegister.d.ts +13 -0
  124. package/lib/typescript/commonjs/browserRegister.server.d.ts +6 -0
  125. package/lib/typescript/commonjs/earlyHookScript.d.ts +12 -0
  126. package/lib/typescript/commonjs/earlyNetwork.d.ts +52 -0
  127. package/lib/typescript/commonjs/floatingMenu/AppHost.web.d.ts +3 -3
  128. package/lib/typescript/commonjs/floatingMenu/BrowserToolRuntime.d.ts +14 -0
  129. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts +2 -67
  130. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.shared.d.ts +71 -0
  131. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.web.d.ts +3 -16
  132. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.web.d.ts +12 -6
  133. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts +1 -1
  134. package/lib/typescript/commonjs/floatingMenu/settingsBus.d.ts +1 -9
  135. package/lib/typescript/commonjs/floatingMenu/useDesktopSyncStatus.web.d.ts +3 -0
  136. package/lib/typescript/commonjs/index.web.d.ts +7 -0
  137. package/lib/typescript/commonjs/reactDevtoolsTypes.d.ts +8 -0
  138. package/lib/typescript/commonjs/releaseOptIn.d.ts +4 -0
  139. package/lib/typescript/commonjs/utils/autoDiscoverPresets.web.d.ts +3 -40
  140. package/lib/typescript/commonjs/utils/createWebTool.d.ts +6 -0
  141. package/lib/typescript/commonjs/utils/createWebTools.d.ts +4 -0
  142. package/lib/typescript/commonjs/version.d.ts +1 -1
  143. package/lib/typescript/module/browserRegister.d.ts +13 -0
  144. package/lib/typescript/module/browserRegister.server.d.ts +6 -0
  145. package/lib/typescript/module/earlyHookScript.d.ts +12 -0
  146. package/lib/typescript/module/earlyNetwork.d.ts +52 -0
  147. package/lib/typescript/module/floatingMenu/AppHost.web.d.ts +3 -3
  148. package/lib/typescript/module/floatingMenu/BrowserToolRuntime.d.ts +14 -0
  149. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts +2 -67
  150. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.shared.d.ts +71 -0
  151. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.web.d.ts +3 -16
  152. package/lib/typescript/module/floatingMenu/FloatingDevTools.web.d.ts +12 -6
  153. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts +1 -1
  154. package/lib/typescript/module/floatingMenu/settingsBus.d.ts +1 -9
  155. package/lib/typescript/module/floatingMenu/useDesktopSyncStatus.web.d.ts +3 -0
  156. package/lib/typescript/module/index.web.d.ts +7 -0
  157. package/lib/typescript/module/reactDevtoolsTypes.d.ts +8 -0
  158. package/lib/typescript/module/releaseOptIn.d.ts +4 -0
  159. package/lib/typescript/module/utils/autoDiscoverPresets.web.d.ts +3 -40
  160. package/lib/typescript/module/utils/createWebTool.d.ts +6 -0
  161. package/lib/typescript/module/utils/createWebTools.d.ts +4 -0
  162. package/lib/typescript/module/version.d.ts +1 -1
  163. package/lib/web/chunks/chunk-5SGL6QL4.mjs +1 -0
  164. package/lib/web/chunks/chunk-FROELTJH.mjs +1 -0
  165. package/lib/web/chunks/chunk-QZDVCMCT.mjs +1 -0
  166. package/lib/web/chunks/chunk-R7RGRTY5.mjs +1 -0
  167. package/lib/web/index.mjs +10 -0
  168. package/lib/web/register-server.mjs +1 -0
  169. package/lib/web/register.mjs +1 -0
  170. package/lib/web/toolkit.mjs +1 -0
  171. package/package.json +50 -12
  172. package/lib/typescript/commonjs/Buoy.d.ts.map +0 -1
  173. package/lib/typescript/commonjs/floatingMenu/AppHost.d.ts.map +0 -1
  174. package/lib/typescript/commonjs/floatingMenu/AppHost.web.d.ts.map +0 -1
  175. package/lib/typescript/commonjs/floatingMenu/AppHostLogic.d.ts.map +0 -1
  176. package/lib/typescript/commonjs/floatingMenu/AppIcon.d.ts.map +0 -1
  177. package/lib/typescript/commonjs/floatingMenu/AppIcon.web.d.ts.map +0 -1
  178. package/lib/typescript/commonjs/floatingMenu/DefaultConfigContext.d.ts.map +0 -1
  179. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts.map +0 -1
  180. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.web.d.ts.map +0 -1
  181. package/lib/typescript/commonjs/floatingMenu/DevToolsVisibilityContext.d.ts.map +0 -1
  182. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.d.ts.map +0 -1
  183. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.web.d.ts.map +0 -1
  184. package/lib/typescript/commonjs/floatingMenu/FloatingMenu.d.ts.map +0 -1
  185. package/lib/typescript/commonjs/floatingMenu/MinimizedToolsContext.d.ts.map +0 -1
  186. package/lib/typescript/commonjs/floatingMenu/MinimizedToolsStack.d.ts.map +0 -1
  187. package/lib/typescript/commonjs/floatingMenu/MinimizedToolsStack.web.d.ts.map +0 -1
  188. package/lib/typescript/commonjs/floatingMenu/ToggleStateManager.d.ts.map +0 -1
  189. package/lib/typescript/commonjs/floatingMenu/ToolHost.d.ts.map +0 -1
  190. package/lib/typescript/commonjs/floatingMenu/ToolOpenerBridge.d.ts.map +0 -1
  191. package/lib/typescript/commonjs/floatingMenu/autoDiscoverPresets.d.ts.map +0 -1
  192. package/lib/typescript/commonjs/floatingMenu/autoExternalSync.d.ts.map +0 -1
  193. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts.map +0 -1
  194. package/lib/typescript/commonjs/floatingMenu/deviceIdentity.d.ts.map +0 -1
  195. package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts.map +0 -1
  196. package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.web.d.ts.map +0 -1
  197. package/lib/typescript/commonjs/floatingMenu/dial/DialHyperspace.d.ts.map +0 -1
  198. package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts.map +0 -1
  199. package/lib/typescript/commonjs/floatingMenu/dial/DialPagination.d.ts.map +0 -1
  200. package/lib/typescript/commonjs/floatingMenu/dial/DialSnow.d.ts.map +0 -1
  201. package/lib/typescript/commonjs/floatingMenu/dial/OnboardingTooltip.d.ts.map +0 -1
  202. package/lib/typescript/commonjs/floatingMenu/dial/OnboardingTooltip.web.d.ts.map +0 -1
  203. package/lib/typescript/commonjs/floatingMenu/dial/dialUsageStore.d.ts.map +0 -1
  204. package/lib/typescript/commonjs/floatingMenu/dial/onboardingConstants.d.ts.map +0 -1
  205. package/lib/typescript/commonjs/floatingMenu/dial/onboardingConstants.web.d.ts.map +0 -1
  206. package/lib/typescript/commonjs/floatingMenu/externalSyncGate.d.ts.map +0 -1
  207. package/lib/typescript/commonjs/floatingMenu/floatingTools.d.ts.map +0 -1
  208. package/lib/typescript/commonjs/floatingMenu/floatingTools.web.d.ts.map +0 -1
  209. package/lib/typescript/commonjs/floatingMenu/optionalRequire.d.ts.map +0 -1
  210. package/lib/typescript/commonjs/floatingMenu/settingsBus.d.ts.map +0 -1
  211. package/lib/typescript/commonjs/floatingMenu/sync/appSyncAdapter.d.ts.map +0 -1
  212. package/lib/typescript/commonjs/floatingMenu/types.d.ts.map +0 -1
  213. package/lib/typescript/commonjs/floatingMenu/useDesktopSyncStatus.d.ts.map +0 -1
  214. package/lib/typescript/commonjs/index.d.ts.map +0 -1
  215. package/lib/typescript/commonjs/index.web.d.ts.map +0 -1
  216. package/lib/typescript/commonjs/telemetry/installPing.d.ts.map +0 -1
  217. package/lib/typescript/commonjs/toolkit.d.ts.map +0 -1
  218. package/lib/typescript/commonjs/toolkitComponents.d.ts.map +0 -1
  219. package/lib/typescript/commonjs/utils/autoDiscoverPresets.web.d.ts.map +0 -1
  220. package/lib/typescript/commonjs/version.d.ts.map +0 -1
  221. package/lib/typescript/module/Buoy.d.ts.map +0 -1
  222. package/lib/typescript/module/floatingMenu/AppHost.d.ts.map +0 -1
  223. package/lib/typescript/module/floatingMenu/AppHost.web.d.ts.map +0 -1
  224. package/lib/typescript/module/floatingMenu/AppHostLogic.d.ts.map +0 -1
  225. package/lib/typescript/module/floatingMenu/AppIcon.d.ts.map +0 -1
  226. package/lib/typescript/module/floatingMenu/AppIcon.web.d.ts.map +0 -1
  227. package/lib/typescript/module/floatingMenu/DefaultConfigContext.d.ts.map +0 -1
  228. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts.map +0 -1
  229. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.web.d.ts.map +0 -1
  230. package/lib/typescript/module/floatingMenu/DevToolsVisibilityContext.d.ts.map +0 -1
  231. package/lib/typescript/module/floatingMenu/FloatingDevTools.d.ts.map +0 -1
  232. package/lib/typescript/module/floatingMenu/FloatingDevTools.web.d.ts.map +0 -1
  233. package/lib/typescript/module/floatingMenu/FloatingMenu.d.ts.map +0 -1
  234. package/lib/typescript/module/floatingMenu/MinimizedToolsContext.d.ts.map +0 -1
  235. package/lib/typescript/module/floatingMenu/MinimizedToolsStack.d.ts.map +0 -1
  236. package/lib/typescript/module/floatingMenu/MinimizedToolsStack.web.d.ts.map +0 -1
  237. package/lib/typescript/module/floatingMenu/ToggleStateManager.d.ts.map +0 -1
  238. package/lib/typescript/module/floatingMenu/ToolHost.d.ts.map +0 -1
  239. package/lib/typescript/module/floatingMenu/ToolOpenerBridge.d.ts.map +0 -1
  240. package/lib/typescript/module/floatingMenu/autoDiscoverPresets.d.ts.map +0 -1
  241. package/lib/typescript/module/floatingMenu/autoExternalSync.d.ts.map +0 -1
  242. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts.map +0 -1
  243. package/lib/typescript/module/floatingMenu/deviceIdentity.d.ts.map +0 -1
  244. package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts.map +0 -1
  245. package/lib/typescript/module/floatingMenu/dial/DialDevTools.web.d.ts.map +0 -1
  246. package/lib/typescript/module/floatingMenu/dial/DialHyperspace.d.ts.map +0 -1
  247. package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts.map +0 -1
  248. package/lib/typescript/module/floatingMenu/dial/DialPagination.d.ts.map +0 -1
  249. package/lib/typescript/module/floatingMenu/dial/DialSnow.d.ts.map +0 -1
  250. package/lib/typescript/module/floatingMenu/dial/OnboardingTooltip.d.ts.map +0 -1
  251. package/lib/typescript/module/floatingMenu/dial/OnboardingTooltip.web.d.ts.map +0 -1
  252. package/lib/typescript/module/floatingMenu/dial/dialUsageStore.d.ts.map +0 -1
  253. package/lib/typescript/module/floatingMenu/dial/onboardingConstants.d.ts.map +0 -1
  254. package/lib/typescript/module/floatingMenu/dial/onboardingConstants.web.d.ts.map +0 -1
  255. package/lib/typescript/module/floatingMenu/externalSyncGate.d.ts.map +0 -1
  256. package/lib/typescript/module/floatingMenu/floatingTools.d.ts.map +0 -1
  257. package/lib/typescript/module/floatingMenu/floatingTools.web.d.ts.map +0 -1
  258. package/lib/typescript/module/floatingMenu/optionalRequire.d.ts.map +0 -1
  259. package/lib/typescript/module/floatingMenu/settingsBus.d.ts.map +0 -1
  260. package/lib/typescript/module/floatingMenu/sync/appSyncAdapter.d.ts.map +0 -1
  261. package/lib/typescript/module/floatingMenu/types.d.ts.map +0 -1
  262. package/lib/typescript/module/floatingMenu/useDesktopSyncStatus.d.ts.map +0 -1
  263. package/lib/typescript/module/index.d.ts.map +0 -1
  264. package/lib/typescript/module/index.web.d.ts.map +0 -1
  265. package/lib/typescript/module/telemetry/installPing.d.ts.map +0 -1
  266. package/lib/typescript/module/toolkit.d.ts.map +0 -1
  267. package/lib/typescript/module/toolkitComponents.d.ts.map +0 -1
  268. package/lib/typescript/module/utils/autoDiscoverPresets.web.d.ts.map +0 -1
  269. package/lib/typescript/module/version.d.ts.map +0 -1
@@ -1,399 +1 @@
1
- "use strict";
2
-
3
- import { FloatingToolHost } from "@buoy-gg/shared-ui/floating";
4
- import { LicenseManager, useLicense } from "@buoy-gg/license";
5
- import { AccountSetup } from "@buoy-gg/shared-ui";
6
- /**
7
- * FloatingDevTools - Unified dev tools component for React DOM Web.
8
- *
9
- * Matches the mobile FloatingDevTools API exactly:
10
- * - Self-contained (doesn't wrap your app)
11
- * - Auto-discovers installed tool packages
12
- * - Manages dial menu and settings modal state internally
13
- *
14
- * Usage (same as mobile):
15
- * ```tsx
16
- * <>
17
- * <YourApp />
18
- * <FloatingDevTools environment="qa" userRole="admin" />
19
- * </>
20
- * ```
21
- *
22
- * @platform React DOM Web (Vite, CRA, Next.js, Electron)
23
- */
24
-
25
- import { useState, useMemo, useCallback, useEffect, useRef } from 'react';
26
- import { useSettings, getToolLabel, getToolDescription, getToolColor } from '@buoy-gg/floating-tools-react';
27
- import { persistentStorage, devToolsStorageKeys, EnvironmentIndicator, EnvironmentSelectorInline } from '@buoy-gg/shared-ui';
28
- import { autoDiscoverWithCustom, getToolsBySlot } from "../utils/autoDiscoverPresets.web.js";
29
- import { FloatingTools, UserStatus } from "./floatingTools.web.js";
30
- import { DialMenu } from "./dial/DialDevTools.web.js";
31
- import { getRankedToolIds, recordToolUsage } from "./dial/dialUsageStore.js";
32
- import { OnboardingTooltip } from "./dial/OnboardingTooltip.web.js";
33
- import { SettingsModal } from "./DevToolsSettingsModal.web.js";
34
- import { AppHostProvider, AppOverlay, useAppHost } from "./AppHost.web.js";
35
- import { MinimizedToolsStack } from "./MinimizedToolsStack.web.js";
36
-
37
- // native FloatingMenu.tsx TOOLTIP_SHOWN_KEY
38
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
39
- const MENU_TOOLTIP_KEY = '@react_buoy_floating_menu_tooltip_shown';
40
-
41
- // Same localStorage adapter the settings modal uses — without it, useSettings
42
- // never loads persisted settings and this instance sits on defaults across
43
- // launches (live changes still arrive via the settings event bus).
44
- const webSettingsStorage = {
45
- getItem: key => localStorage.getItem(key),
46
- setItem: (key, value) => localStorage.setItem(key, value)
47
- };
48
-
49
- // =============================
50
- // Types
51
- // =============================
52
-
53
- // =============================
54
- // MenuLauncherIcon — native FloatingMenu.tsx:446-478: 3×3 dot grid rendered
55
- // when no userRole is set, so the dial/settings stay reachable.
56
- // =============================
57
- function MenuLauncherIcon({
58
- size = 14,
59
- color = '#20C997'
60
- }) {
61
- const dot = Math.max(2, size / 4);
62
- const gap = Math.max(1, size / 16);
63
- return /*#__PURE__*/_jsx("div", {
64
- style: {
65
- display: 'grid',
66
- gridTemplateColumns: `repeat(3, ${dot}px)`,
67
- gap,
68
- width: size,
69
- height: size,
70
- alignContent: 'center',
71
- justifyContent: 'center'
72
- },
73
- children: Array.from({
74
- length: 9
75
- }).map((_, i) => /*#__PURE__*/_jsx("div", {
76
- style: {
77
- width: dot,
78
- height: dot,
79
- borderRadius: dot / 2,
80
- backgroundColor: color
81
- }
82
- }, i))
83
- });
84
- }
85
-
86
- // =============================
87
- // Main Component
88
- // =============================
89
-
90
- function AdmittedFloatingDevTools(props) {
91
- // The tool host wraps everything so dial presses can open tool components
92
- // into the AppOverlay (web twin of the native AppHostProvider/AppOverlay).
93
- return /*#__PURE__*/_jsx(AppHostProvider, {
94
- children: /*#__PURE__*/_jsx(FloatingDevToolsInner, {
95
- ...props
96
- })
97
- });
98
- }
99
- function FloatingDevToolsInner({
100
- environment,
101
- userRole,
102
- availableEnvironments,
103
- onEnvironmentSwitch,
104
- apps,
105
- disableHints = false,
106
- headless = false
107
- }) {
108
- // Internal state for dial and settings
109
- const [isDialOpen, setIsDialOpen] = useState(false);
110
- const [isSettingsOpen, setIsSettingsOpen] = useState(false);
111
- const stateRestoredRef = useRef(false);
112
- const appHost = useAppHost();
113
-
114
- // Auto-discover tools and merge with custom apps
115
- const tools = useMemo(() => autoDiscoverWithCustom(apps), [apps]);
116
-
117
- // Let the host restore `@react_buoy_open_apps` from the previous session
118
- // once it knows which tools exist (native registerApps parity).
119
- const {
120
- registerApps
121
- } = appHost;
122
- useEffect(() => {
123
- registerApps(tools);
124
- }, [registerApps, tools]);
125
-
126
- // Convert to available tools config for settings
127
- const availableToolsConfig = useMemo(() => tools.map(tool => ({
128
- id: tool.id,
129
- name: tool.name,
130
- description: tool.description,
131
- slot: tool.slot
132
- })), [tools]);
133
-
134
- // Register available tools with the shared settings hook (used by the
135
- // settings modal and the bubble-row visibility gating).
136
- const {
137
- settings
138
- } = useSettings({
139
- availableTools: availableToolsConfig,
140
- storage: webSettingsStorage
141
- });
142
-
143
- // Dial/settings open-state persistence — native FloatingMenu.tsx:95-122 and
144
- // DialDevTools.tsx:136-164 restore these across reloads.
145
- useEffect(() => {
146
- let cancelled = false;
147
- const restore = async () => {
148
- const [dialOpen, settingsOpen] = await Promise.all([persistentStorage.getItem(devToolsStorageKeys.dial.isOpen()), persistentStorage.getItem(devToolsStorageKeys.settings.modalOpen())]);
149
- if (cancelled) return;
150
- if (dialOpen === 'true') setIsDialOpen(true);
151
- if (settingsOpen === 'true') {
152
- setIsDialOpen(true); // settings lives above the dial (native structure)
153
- setIsSettingsOpen(true);
154
- }
155
- stateRestoredRef.current = true;
156
- };
157
- void restore();
158
- return () => {
159
- cancelled = true;
160
- };
161
- }, []);
162
- useEffect(() => {
163
- if (!stateRestoredRef.current) return;
164
- void persistentStorage.setItem(devToolsStorageKeys.dial.isOpen(), isDialOpen ? 'true' : 'false');
165
- }, [isDialOpen]);
166
- useEffect(() => {
167
- if (!stateRestoredRef.current) return;
168
- void persistentStorage.setItem(devToolsStorageKeys.settings.modalOpen(), isSettingsOpen ? 'true' : 'false');
169
- }, [isSettingsOpen]);
170
-
171
- // Shared open path for dial + bubble-row tools.
172
- const openTool = useCallback(tool => {
173
- void recordToolUsage(tool.id);
174
- if (tool.component) {
175
- const dockIcon = typeof tool.icon === 'function' ? tool.icon(20) : tool.icon;
176
- appHost.open({
177
- id: tool.id,
178
- title: tool.name || getToolLabel(tool.id),
179
- component: tool.component,
180
- props: tool.props,
181
- launchMode: tool.launchMode || 'self-modal',
182
- singleton: tool.singleton ?? true,
183
- icon: dockIcon,
184
- color: tool.color || getToolColor(tool.id)
185
- });
186
- } else {
187
- tool.onPress?.();
188
- }
189
- }, [appHost]);
190
-
191
- // Build dial icons for every dial-eligible tool. The dial paginates and
192
- // ranks them by usage, so there is no per-tool show/hide setting.
193
- const dialIcons = useMemo(() => {
194
- const dialTools = getToolsBySlot(tools, 'dial');
195
- return dialTools.map(tool => {
196
- const color = tool.color || getToolColor(tool.id);
197
- // Handle icon - can be string (emoji) or function (size) => ReactNode
198
- let icon;
199
- if (typeof tool.icon === 'string') {
200
- icon = tool.icon;
201
- } else if (typeof tool.icon === 'function') {
202
- // It's a render function - call it with size
203
- icon = tool.icon(32);
204
- } else {
205
- icon = null;
206
- }
207
- return {
208
- id: tool.id,
209
- // The tool's own name wins (native parity); the registry label is
210
- // the fallback for preset tools that don't set one.
211
- name: tool.name || getToolLabel(tool.id),
212
- icon,
213
- // Preset tools with no component and no onPress can't do anything on
214
- // web — render them like native's uninstalled tools ("Unavailable"
215
- // caption, non-interactive) instead of a tile that silently no-ops.
216
- unavailable: !tool.component && !tool.onPress,
217
- color,
218
- onPress: () => {
219
- openTool(tool);
220
- setIsDialOpen(false);
221
- }
222
- };
223
- });
224
- }, [tools, openTool]);
225
-
226
- // Snapshot the usage-ranked order each time the dial opens. It stays stable
227
- // while open so icons don't jump positions mid-interaction.
228
- const rankedDialIcons = useMemo(() => {
229
- if (!isDialOpen) return dialIcons;
230
- const byId = new Map(dialIcons.map(i => [i.id, i]));
231
- return getRankedToolIds(dialIcons.map(i => i.id)).map(id => byId.get(id)).filter(i => Boolean(i));
232
- }, [isDialOpen, dialIcons]);
233
-
234
- // Bubble-row tools — native FloatingMenu.tsx:349-386: slot !== 'dial',
235
- // explicitly enabled in settings, rendered as small icon buttons.
236
- const rowTools = useMemo(() => getToolsBySlot(tools, 'row').filter(tool => settings.floatingTools[tool.id] === true && (tool.component || tool.onPress)), [tools, settings.floatingTools]);
237
-
238
- // Build available tools for settings modal
239
- const availableTools = useMemo(() => tools.map(tool => ({
240
- id: tool.id,
241
- name: tool.name || getToolLabel(tool.id),
242
- description: tool.description || getToolDescription(tool.id),
243
- slot: tool.slot,
244
- // Settings rows fall back to the tool's own icon when the modal has
245
- // no hardcoded glyph for it (mirrors native DialDevTools).
246
- icon: tool.icon,
247
- color: tool.color
248
- })), [tools]);
249
-
250
- // Welcome tooltip — native FloatingMenu.tsx:134-157: 1000ms after mount,
251
- // once ever, only while nothing else is open; the bubble centers under the
252
- // arrow while it shows.
253
- const [showWelcomeTooltip, setShowWelcomeTooltip] = useState(false);
254
- const isAnyToolOpen = appHost.openApps.some(app => !app.minimized);
255
- useEffect(() => {
256
- if (disableHints) return;
257
- let cancelled = false;
258
- const timer = setTimeout(async () => {
259
- const seen = await persistentStorage.getItem(MENU_TOOLTIP_KEY);
260
- if (!cancelled && !seen) setShowWelcomeTooltip(true);
261
- }, 1000);
262
- return () => {
263
- cancelled = true;
264
- clearTimeout(timer);
265
- };
266
- }, [disableHints]);
267
- const dismissWelcomeTooltip = useCallback(() => {
268
- setShowWelcomeTooltip(false);
269
- void persistentStorage.setItem(MENU_TOOLTIP_KEY, 'true');
270
- }, []);
271
-
272
- // Callbacks
273
- const handleOpenDial = useCallback(() => {
274
- // Opening the dial dismisses the welcome tooltip (native handleDialOpen).
275
- if (showWelcomeTooltip) dismissWelcomeTooltip();
276
- setIsDialOpen(true);
277
- }, [showWelcomeTooltip, dismissWelcomeTooltip]);
278
- const handleCloseDial = useCallback(() => {
279
- setIsDialOpen(false);
280
- setIsSettingsOpen(false); // settings lives above the dial
281
- }, []);
282
- // Center press toggles settings while the dial STAYS OPEN underneath —
283
- // the center label flips to CLOSE/SETTINGS (native DialDevTools behavior).
284
- const handleCenterPress = useCallback(() => {
285
- setIsSettingsOpen(open => !open);
286
- }, []);
287
- const handleCloseSettings = useCallback(() => setIsSettingsOpen(false), []);
288
- const showEnvironmentSelector = Boolean(availableEnvironments?.length && onEnvironmentSwitch);
289
- const environmentEnabled = settings.floatingTools.environment !== false;
290
- const welcomeActive = showWelcomeTooltip && !isDialOpen && !isAnyToolOpen;
291
- const hasMinimizedTools = appHost.openApps.some(app => app.minimized && app.launchMode !== 'toggle-only');
292
-
293
- // Headless: desktop sync is native-only, so there is nothing to mount on
294
- // web — accept the prop for API parity and render nothing. (After all
295
- // hooks so hook order is preserved.)
296
- if (headless) return null;
297
- return /*#__PURE__*/_jsxs(_Fragment, {
298
- children: [welcomeActive && /*#__PURE__*/_jsx("div", {
299
- style: {
300
- position: 'fixed',
301
- inset: 0,
302
- backgroundColor: 'rgba(0,0,0,0.85)',
303
- zIndex: 10000
304
- }
305
- }), /*#__PURE__*/_jsxs(FloatingTools, {
306
- enablePositionPersistence: !welcomeActive,
307
- pushToSide: isDialOpen || isAnyToolOpen,
308
- suspendPointerEvents: isDialOpen,
309
- centerOnboarding: welcomeActive,
310
- minimizedStack: hasMinimizedTools ? /*#__PURE__*/_jsx(MinimizedToolsStack, {}) : undefined,
311
- hasMinimizedStack: hasMinimizedTools,
312
- children: [environment && environmentEnabled && !showEnvironmentSelector && /*#__PURE__*/_jsx(EnvironmentIndicator, {
313
- environment: environment
314
- }), showEnvironmentSelector && environmentEnabled && /*#__PURE__*/_jsx(EnvironmentSelectorInline, {
315
- currentEnvironment: environment ?? 'local',
316
- availableEnvironments: availableEnvironments,
317
- onSelect: onEnvironmentSwitch
318
- }), userRole ? /*#__PURE__*/_jsx(UserStatus, {
319
- userRole: userRole,
320
- onPress: handleOpenDial
321
- }) :
322
- /*#__PURE__*/
323
- // native MenuLauncherIcon fallback: dial stays reachable without a
324
- // userRole pill.
325
- _jsx("button", {
326
- "aria-label": "Open dev tools",
327
- onClick: handleOpenDial,
328
- style: {
329
- display: 'flex',
330
- alignItems: 'center',
331
- justifyContent: 'center',
332
- padding: '6px 8px',
333
- background: 'none',
334
- border: 'none',
335
- cursor: 'pointer'
336
- },
337
- children: /*#__PURE__*/_jsx(MenuLauncherIcon, {})
338
- }), rowTools.map(tool =>
339
- /*#__PURE__*/
340
- // native FloatingMenu fab: paddingH 6, paddingV 4, r6, transparent
341
- _jsx("button", {
342
- "aria-label": tool.name || getToolLabel(tool.id),
343
- title: tool.description,
344
- onClick: () => openTool(tool),
345
- style: {
346
- display: 'flex',
347
- alignItems: 'center',
348
- justifyContent: 'center',
349
- padding: '4px 6px',
350
- borderRadius: 6,
351
- background: 'none',
352
- border: 'none',
353
- cursor: 'pointer'
354
- },
355
- children: typeof tool.icon === 'function' ? tool.icon(16) : tool.icon
356
- }, tool.id))]
357
- }), welcomeActive && /*#__PURE__*/_jsx(OnboardingTooltip, {
358
- title: "Welcome to Buoy!",
359
- message: "Grab and position this menu wherever you want, then tap the icon to open your tools.",
360
- onDismiss: dismissWelcomeTooltip
361
- }), isDialOpen && /*#__PURE__*/_jsx(DialMenu, {
362
- icons: rankedDialIcons,
363
- onClose: handleCloseDial,
364
- centerLabel: "BUOY",
365
- onCenterPress: handleCenterPress,
366
- settingsOpen: isSettingsOpen,
367
- hintsDisabled: disableHints
368
- }), /*#__PURE__*/_jsx(SettingsModal, {
369
- visible: isSettingsOpen,
370
- onClose: handleCloseSettings,
371
- availableTools: availableTools,
372
- onSettingsChange: _newSettings => {
373
- // Settings are already saved by the hook
374
- }
375
- }), /*#__PURE__*/_jsx(AppOverlay, {}), /*#__PURE__*/_jsx(FloatingToolHost, {})]
376
- });
377
- }
378
-
379
- // =============================
380
- // Re-exports for convenience
381
- // =============================
382
-
383
- export function FloatingDevTools(props) {
384
- const {
385
- access,
386
- isPro,
387
- licenseKey
388
- } = useLicense();
389
- useEffect(() => {
390
- void LicenseManager.configure(props.licenseKey);
391
- }, [props.licenseKey]);
392
- const matches = props.licenseKey === undefined || props.licenseKey.trim().toUpperCase() === (licenseKey ?? "");
393
- const dev = typeof __DEV__ !== "undefined" ? __DEV__ : process.env.NODE_ENV !== "production";
394
- if (!dev && !isPro) return null;
395
- if (!matches || access.status !== "admitted") return props.headless ? null : /*#__PURE__*/_jsx(AccountSetup, {});
396
- return /*#__PURE__*/_jsx(AdmittedFloatingDevTools, {
397
- ...props
398
- });
399
- }
1
+ "use strict";import{FloatingToolHost as oe}from"@buoy-gg/shared-ui/floating";import{LicenseManager as ie,useLicense as se}from"@buoy-gg/license";import{AccountSetup as re}from"@buoy-gg/shared-ui";import{useState as x,useMemo as h,useCallback as b,useEffect as c,useRef as ae}from"react";import{useSettings as ce,getToolLabel as E,getToolDescription as le,getToolColor as F}from"@buoy-gg/floating-tools-react";import{persistentStorage as d,devToolsStorageKeys as I,EnvironmentIndicator as de,EnvironmentSelectorInline as me}from"@buoy-gg/shared-ui";import{autoDiscoverWithCustom as pe,getToolsBySlot as N}from"../utils/autoDiscoverPresets.web.js";import{FloatingTools as ue,UserStatus as fe}from"./floatingTools.web.js";import{DialMenu as ge}from"./dial/DialDevTools.web.js";import{getRankedToolIds as ye,recordToolUsage as ve}from"./dial/dialUsageStore.js";import{OnboardingTooltip as Te}from"./dial/OnboardingTooltip.web.js";import{SettingsModal as he}from"./DevToolsSettingsModal.web.js";import{AppHostProvider as be,AppOverlay as Oe,useAppHost as Se}from"./AppHost.web.js";import{MinimizedToolsStack as Ce}from"./MinimizedToolsStack.web.js";import{createWebTools as De}from"../utils/createWebTools.js";import{BrowserToolRuntime as we}from"./BrowserToolRuntime.js";import{markReleaseOptIn as Ee}from"../releaseOptIn.js";import{DevToolsVisibilityProvider as Ie,useDevToolsVisibility as _e}from"./DevToolsVisibilityContext.js";import{jsx as t,jsxs as Y}from"react/jsx-runtime";const Me={};const G="@react_buoy_floating_menu_tooltip_shown";const Pe=d;function ke({size:o=14,color:m="#20C997"}){const s=Math.max(2,o/4);const p=Math.max(1,o/16);return t("div",{style:{display:"grid",gridTemplateColumns:`repeat(3, ${s}px)`,gap:p,width:o,height:o,alignContent:"center",justifyContent:"center"},children:Array.from({length:9}).map((u,l)=>t("div",{style:{width:s,height:s,borderRadius:s/2,backgroundColor:m}},l))})}function xe(o){return t(Ie,{children:t(be,{children:t(Ae,{...o})})})}function Ae({environment:o,userRole:m,availableEnvironments:s,onEnvironmentSwitch:p,apps:u,modules:l=Me,externalSync:O,requiredEnvVars:H,sentryGetClient:q,disableHints:_=false,headless:A=false}){const[r,S]=x(false);const[f,C]=x(false);const M=ae(false);const g=Se();const a=h(()=>pe([...De(l),...u??[]]),[u,l]);const D=_e();const L=g.openApps.some(e=>!e.minimized);c(()=>{D.setDialOpen(r)},[r,D.setDialOpen]);c(()=>{D.setToolOpen(L||f)},[L,f,D.setToolOpen]);const{registerApps:K}=g;c(()=>{K(a.map(e=>{const n=e.icon;return{...e,icon:typeof n==="function"?({size:i})=>n(i):n}}))},[K,a]);const $=h(()=>a.map(e=>({id:e.id,name:e.name,description:e.description,slot:e.slot})),[a]);const{settings:P}=ce({availableTools:$,storage:Pe});c(()=>{let e=false;const n=async()=>{const[i,T]=await Promise.all([d.getItem(I.dial.isOpen()),d.getItem(I.settings.modalOpen())]);if(e)return;if(i==="true")S(true);if(T==="true"){S(true);C(true)}M.current=true};void n();return()=>{e=true}},[]);c(()=>{if(!M.current)return;void d.setItem(I.dial.isOpen(),r?"true":"false")},[r]);c(()=>{if(!M.current)return;void d.setItem(I.settings.modalOpen(),f?"true":"false")},[f]);const k=b(e=>{void ve(e.id);if(e.launchMode==="toggle-only"){e.onPress?.();return}if(e.component){const n=typeof e.icon==="function"?e.icon(20):e.icon;g.open({id:e.id,title:e.name||E(e.id),component:e.component,props:e.props,modal:e.modal,launchMode:e.launchMode||"self-modal",singleton:e.singleton??true,icon:n,color:e.color||F(e.id)})}else{e.onPress?.()}},[g]);const w=h(()=>{const e=N(a,"dial");return e.map(n=>{const i=n.color||F(n.id);let T;if(typeof n.icon==="string"){T=n.icon}else if(typeof n.icon==="function"){T=n.icon(32)}else{T=null}return{id:n.id,name:n.name||E(n.id),icon:T,unavailable:!n.component&&!n.onPress,color:i,onPress:()=>{k(n);S(false)}}})},[a,k]);const J=h(()=>{if(!r)return w;const e=new Map(w.map(n=>[n.id,n]));return ye(w.map(n=>n.id)).map(n=>e.get(n)).filter(n=>Boolean(n))},[r,w]);const Q=h(()=>N(a,"row").filter(e=>P.floatingTools[e.id]===true&&(e.component||e.onPress)),[a,P.floatingTools]);const X=h(()=>a.map(e=>({id:e.id,name:e.name||E(e.id),description:e.description||le(e.id),slot:e.slot,icon:e.icon,color:e.color})),[a]);const[Z,R]=x(false);const j=g.openApps.some(e=>!e.minimized);c(()=>{if(_)return;let e=false;const n=setTimeout(async()=>{const i=await d.getItem(G);if(!e&&!i)R(true)},1e3);return()=>{e=true;clearTimeout(n)}},[_]);const y=b(()=>{R(false);void d.setItem(G,"true")},[]);const V=b(()=>{y();S(true)},[y]);const ee=b(()=>{S(false);C(false)},[]);const ne=b(()=>{C(e=>!e)},[]);const te=b(()=>C(false),[]);const B=Boolean(s?.length&&p);const U=P.floatingTools.environment!==false;const v=Z&&!r&&!j;c(()=>{if(!v)return;const e=i=>{if(!(i.target instanceof Element)||!i.target.closest("[data-buoy-root]"))y()};const n=i=>{if(i.key==="Escape")y()};document.addEventListener("pointerdown",e,true);document.addEventListener("keydown",n);return()=>{document.removeEventListener("pointerdown",e,true);document.removeEventListener("keydown",n)}},[v,y]);const W=g.openApps.some(e=>e.minimized&&e.launchMode!=="toggle-only");const z=t(we,{modules:l,apps:u,requiredEnvVars:H,externalSync:O,headless:A,sentryGetClient:q});if(A)return z;return Y("div",{"data-buoy-root":"",style:{display:"contents"},children:[z,v&&t("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.85)",zIndex:1e4,pointerEvents:"none"}}),Y(ue,{enablePositionPersistence:!v,pushToSide:r||j,suspendPointerEvents:r,centerOnboarding:v,minimizedStack:W?t(Ce,{}):void 0,hasMinimizedStack:W,children:[o&&U&&!B&&t(de,{environment:o}),B&&U&&t(me,{currentEnvironment:o??"local",availableEnvironments:s,onSelect:p}),m?t(fe,{userRole:m,onPress:V}):t("button",{"aria-label":"Open dev tools",onClick:V,style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"6px 8px",background:"none",border:"none",cursor:"pointer"},children:t(ke,{})}),Q.map(e=>t("button",{"aria-label":e.name||E(e.id),title:e.description,onClick:()=>k(e),style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"4px 6px",borderRadius:6,background:"none",border:"none",cursor:"pointer"},children:typeof e.icon==="function"?e.icon(16):e.icon},e.id))]}),v&&t(Te,{title:"Welcome to Buoy!",message:"Grab and position this menu wherever you want, then tap the icon to open your tools.",onDismiss:y}),r&&t(ge,{icons:J,onClose:ee,centerLabel:"BUOY",onCenterPress:ne,settingsOpen:f,hintsDisabled:_}),t(he,{visible:f,onClose:te,availableTools:X,onSettingsChange:e=>{}}),t(Oe,{}),t(oe,{})]})}export function FloatingDevTools(o){const{access:m,isPro:s,licenseKey:p}=se();c(()=>{void ie.configure(o.licenseKey)},[o.licenseKey]);const u=o.licenseKey===void 0||o.licenseKey.trim().toUpperCase()===(p??"");const l=typeof __DEV__!=="undefined"?__DEV__:process.env.NODE_ENV!=="production";const O=u&&m.status==="admitted";c(()=>{if(!l&&s&&O)Ee()},[l,s,O]);if(!l&&!s)return null;if(!O)return o.headless?null:t(re,{});return t(xe,{...o})}