@buoy-gg/core 3.0.1 → 3.0.2

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 (43) hide show
  1. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.js +1 -1
  2. package/lib/commonjs/floatingMenu/FloatingDevTools.js +6 -1
  3. package/lib/commonjs/floatingMenu/FloatingMenu.js +3 -7
  4. package/lib/commonjs/floatingMenu/autoExternalSync.js +215 -0
  5. package/lib/commonjs/floatingMenu/defaultConfig.js +1 -1
  6. package/lib/commonjs/floatingMenu/dial/DialDevTools.js +59 -47
  7. package/lib/commonjs/floatingMenu/dial/DialIcon.js +12 -13
  8. package/lib/commonjs/floatingMenu/dial/OnboardingTooltip.js +1 -1
  9. package/lib/module/floatingMenu/DevToolsSettingsModal.js +2 -2
  10. package/lib/module/floatingMenu/FloatingDevTools.js +6 -1
  11. package/lib/module/floatingMenu/FloatingMenu.js +4 -7
  12. package/lib/module/floatingMenu/autoExternalSync.js +209 -0
  13. package/lib/module/floatingMenu/defaultConfig.js +1 -1
  14. package/lib/module/floatingMenu/dial/DialDevTools.js +62 -48
  15. package/lib/module/floatingMenu/dial/DialIcon.js +15 -15
  16. package/lib/module/floatingMenu/dial/OnboardingTooltip.js +2 -1
  17. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
  18. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.d.ts +19 -1
  19. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.d.ts.map +1 -1
  20. package/lib/typescript/commonjs/floatingMenu/FloatingMenu.d.ts.map +1 -1
  21. package/lib/typescript/commonjs/floatingMenu/autoExternalSync.d.ts +21 -0
  22. package/lib/typescript/commonjs/floatingMenu/autoExternalSync.d.ts.map +1 -0
  23. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts +1 -1
  24. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts.map +1 -1
  25. package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
  26. package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts.map +1 -1
  27. package/lib/typescript/commonjs/floatingMenu/dial/OnboardingTooltip.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/index.d.ts +1 -0
  29. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  30. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
  31. package/lib/typescript/module/floatingMenu/FloatingDevTools.d.ts +19 -1
  32. package/lib/typescript/module/floatingMenu/FloatingDevTools.d.ts.map +1 -1
  33. package/lib/typescript/module/floatingMenu/FloatingMenu.d.ts.map +1 -1
  34. package/lib/typescript/module/floatingMenu/autoExternalSync.d.ts +21 -0
  35. package/lib/typescript/module/floatingMenu/autoExternalSync.d.ts.map +1 -0
  36. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts +1 -1
  37. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts.map +1 -1
  38. package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
  39. package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts.map +1 -1
  40. package/lib/typescript/module/floatingMenu/dial/OnboardingTooltip.d.ts.map +1 -1
  41. package/lib/typescript/module/index.d.ts +1 -0
  42. package/lib/typescript/module/index.d.ts.map +1 -1
  43. package/package.json +5 -5
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  import React, { useEffect, useMemo, useRef, useState } from "react";
4
- import { TouchableOpacity, StyleSheet, View, Dimensions } from "react-native";
4
+ import { TouchableOpacity, StyleSheet, View } from "react-native";
5
+ import { absoluteFill } from "@buoy-gg/shared-ui";
5
6
  import { FloatingTools, UserStatus } from "./floatingTools";
6
7
  import { DialDevTools } from "./dial/DialDevTools";
7
8
  import { EnvironmentIndicator, persistentStorage, useHintsDisabled, devToolsStorageKeys, buoyColors } from "@buoy-gg/shared-ui";
@@ -22,10 +23,6 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
22
23
  */
23
24
  const FLOATING_MENU_ONBOARDING_KEY = "@react_buoy_floating_menu_tooltip_shown";
24
25
  const ONBOARDING_STEP_KEY = "@react_buoy_onboarding_step";
25
- const {
26
- width: SCREEN_WIDTH,
27
- height: SCREEN_HEIGHT
28
- } = Dimensions.get("window");
29
26
  export const FloatingMenu = ({
30
27
  apps,
31
28
  state,
@@ -322,11 +319,11 @@ const styles = StyleSheet.create({
322
319
  fontWeight: "900"
323
320
  },
324
321
  onboardingContainer: {
325
- ...StyleSheet.absoluteFillObject,
322
+ ...absoluteFill,
326
323
  zIndex: 10000
327
324
  },
328
325
  onboardingBackdrop: {
329
- ...StyleSheet.absoluteFillObject,
326
+ ...absoluteFill,
330
327
  backgroundColor: "rgba(0, 0, 0, 0.85)"
331
328
  }
332
329
  });
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Zero-config device→desktop sync for FloatingDevTools.
5
+ *
6
+ * When @buoy-gg/external-sync is installed, FloatingDevTools renders
7
+ * <AutoExternalSync /> in dev builds: it connects to the Buoy Desktop broker
8
+ * (localhost:42831 — a silent no-op when the desktop app isn't running) and
9
+ * registers a sync adapter for every installed tool package, discovered with
10
+ * the same guarded-require pattern as autoDiscoverPresets. No <DevToolsSync>
11
+ * wiring needed in the app.
12
+ *
13
+ * Identity defaults come from expo-constants when available (app name →
14
+ * "MyApp (ios)" / "myapp-ios"), overridable via the `externalSync` prop.
15
+ */
16
+ import { useMemo } from "react";
17
+ import { Platform } from "react-native";
18
+ /* eslint-disable @typescript-eslint/no-var-requires */
19
+
20
+ // Module-level guarded requires: presence is constant for the app lifetime,
21
+ // so hooks pulled from these modules keep a stable call order.
22
+ //
23
+ // IMPORTANT: each require() must sit LEXICALLY inside its own try block
24
+ // (same pattern as autoDiscoverPresets) — Metro only marks a dependency as
25
+ // optional when the require is directly inside a try statement. Wrapping it
26
+ // in a helper/arrow makes Metro hard-fail the bundle for apps that don't
27
+ // install that package.
28
+ let externalSyncModule = null;
29
+ let storageModule = null;
30
+ let networkModule = null;
31
+ let reactQueryModule = null;
32
+ let routeEventsModule = null;
33
+ let reduxModule = null;
34
+ let zustandModule = null;
35
+ let jotaiModule = null;
36
+ let eventsModule = null;
37
+ let envModule = null;
38
+ let highlightUpdatesModule = null;
39
+ let debugBordersModule = null;
40
+ let impersonateModule = null;
41
+ let perfMonitorModule = null;
42
+ let expoConstantsModule = null;
43
+ try {
44
+ externalSyncModule = require("@buoy-gg/external-sync");
45
+ } catch {
46
+ // not installed
47
+ }
48
+ try {
49
+ storageModule = require("@buoy-gg/storage");
50
+ } catch {
51
+ // not installed
52
+ }
53
+ try {
54
+ networkModule = require("@buoy-gg/network");
55
+ } catch {
56
+ // not installed
57
+ }
58
+ try {
59
+ reactQueryModule = require("@buoy-gg/react-query");
60
+ } catch {
61
+ // not installed
62
+ }
63
+ try {
64
+ routeEventsModule = require("@buoy-gg/route-events");
65
+ } catch {
66
+ // not installed
67
+ }
68
+ try {
69
+ reduxModule = require("@buoy-gg/redux");
70
+ } catch {
71
+ // not installed
72
+ }
73
+ try {
74
+ zustandModule = require("@buoy-gg/zustand");
75
+ } catch {
76
+ // not installed
77
+ }
78
+ try {
79
+ jotaiModule = require("@buoy-gg/jotai");
80
+ } catch {
81
+ // not installed
82
+ }
83
+ try {
84
+ eventsModule = require("@buoy-gg/events");
85
+ } catch {
86
+ // not installed
87
+ }
88
+ try {
89
+ envModule = require("@buoy-gg/env");
90
+ } catch {
91
+ // not installed
92
+ }
93
+ try {
94
+ highlightUpdatesModule = require("@buoy-gg/highlight-updates");
95
+ } catch {
96
+ // not installed
97
+ }
98
+ try {
99
+ debugBordersModule = require("@buoy-gg/debug-borders");
100
+ } catch {
101
+ // not installed
102
+ }
103
+ try {
104
+ impersonateModule = require("@buoy-gg/impersonate");
105
+ } catch {
106
+ // not installed
107
+ }
108
+ try {
109
+ perfMonitorModule = require("@buoy-gg/perf-monitor");
110
+ } catch {
111
+ // not installed
112
+ }
113
+ try {
114
+ expoConstantsModule = require("expo-constants");
115
+ } catch {
116
+ // not installed (RN CLI apps)
117
+ }
118
+
119
+ /** Whether zero-config sync can run (the external-sync package is installed). */
120
+ export function isExternalSyncAvailable() {
121
+ return !!externalSyncModule?.useExternalSyncSocket;
122
+ }
123
+ function getAppName() {
124
+ const constants = expoConstantsModule?.default ?? expoConstantsModule;
125
+ return constants?.expoConfig?.name ?? constants?.manifest2?.extra?.expoClient?.name ?? null;
126
+ }
127
+ function defaultIdentity() {
128
+ const appName = getAppName();
129
+ const slug = (appName ?? "buoy").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
130
+ return {
131
+ deviceName: `${appName ?? "Buoy Device"} (${Platform.OS})`,
132
+ deviceId: `${slug || "buoy"}-${Platform.OS}`
133
+ };
134
+ }
135
+ export function AutoExternalSync({
136
+ options,
137
+ requiredEnvVars
138
+ }) {
139
+ const {
140
+ useExternalSyncSocket,
141
+ useExternalSync
142
+ } = externalSyncModule;
143
+
144
+ // Context-based query adapter; null when there is no QueryClientProvider
145
+ // above FloatingDevTools (or the installed @buoy-gg/react-query predates
146
+ // the hook).
147
+ const queryAdapter = reactQueryModule?.useReactQuerySyncAdapter ? reactQueryModule.useReactQuerySyncAdapter() : null;
148
+ const identity = useMemo(defaultIdentity, []);
149
+ const deviceId = options?.deviceId ?? identity.deviceId;
150
+ const {
151
+ socket
152
+ } = useExternalSyncSocket({
153
+ deviceName: options?.deviceName ?? identity.deviceName,
154
+ socketURL: options?.socketURL ?? "http://localhost:42831",
155
+ persistentDeviceId: deviceId,
156
+ platform: Platform.OS,
157
+ enableLogs: options?.enableLogs
158
+ });
159
+ const tools = useMemo(() => {
160
+ const map = {};
161
+ if (storageModule?.storageSyncAdapter) {
162
+ map.storage = storageModule.storageSyncAdapter;
163
+ }
164
+ if (networkModule?.networkSyncAdapter) {
165
+ map.network = networkModule.networkSyncAdapter;
166
+ }
167
+ if (queryAdapter) {
168
+ map.query = queryAdapter;
169
+ }
170
+ if (routeEventsModule?.routeEventsSyncAdapter) {
171
+ map["route-events"] = routeEventsModule.routeEventsSyncAdapter;
172
+ }
173
+ if (reduxModule?.reduxSyncAdapter) {
174
+ map.redux = reduxModule.reduxSyncAdapter;
175
+ }
176
+ if (zustandModule?.zustandSyncAdapter) {
177
+ map.zustand = zustandModule.zustandSyncAdapter;
178
+ }
179
+ if (jotaiModule?.jotaiSyncAdapter) {
180
+ map.jotai = jotaiModule.jotaiSyncAdapter;
181
+ }
182
+ if (eventsModule?.eventsSyncAdapter) {
183
+ map.events = eventsModule.eventsSyncAdapter;
184
+ }
185
+ if (envModule?.createEnvSyncAdapter) {
186
+ map.env = envModule.createEnvSyncAdapter(requiredEnvVars ?? []);
187
+ }
188
+ if (highlightUpdatesModule?.highlightUpdatesSyncAdapter) {
189
+ map["highlight-updates"] = highlightUpdatesModule.highlightUpdatesSyncAdapter;
190
+ }
191
+ if (debugBordersModule?.debugBordersSyncAdapter) {
192
+ map["debug-borders"] = debugBordersModule.debugBordersSyncAdapter;
193
+ }
194
+ if (impersonateModule?.impersonateSyncAdapter) {
195
+ map.impersonate = impersonateModule.impersonateSyncAdapter;
196
+ }
197
+ if (perfMonitorModule?.perfMonitorSyncAdapter) {
198
+ map["perf-monitor"] = perfMonitorModule.perfMonitorSyncAdapter;
199
+ }
200
+ return map;
201
+ }, [queryAdapter, requiredEnvVars]);
202
+ useExternalSync({
203
+ tools,
204
+ socket,
205
+ deviceId,
206
+ enableLogs: options?.enableLogs
207
+ });
208
+ return null;
209
+ }
@@ -23,7 +23,7 @@
23
23
  * This is a union type of all auto-discovered tool IDs.
24
24
  */
25
25
 
26
- // Render count analysis modal (@buoy-gg/highlight-updates)
26
+ // Benchmark recording modal (@buoy-gg/perf-monitor)
27
27
 
28
28
  /**
29
29
  * Special floating-only tool IDs that only appear in the floating bubble row.
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  import { useEffect, useMemo, useRef, useState } from "react";
4
- import { Pressable, StyleSheet, View, Dimensions, Text, Animated, Easing } from "react-native";
4
+ import { Pressable, StyleSheet, View, useWindowDimensions, Text, Animated, Easing } from "react-native";
5
+ import { absoluteFill } from "@buoy-gg/shared-ui";
5
6
  // Icons are provided by installedApps; no direct icon imports here.
6
7
  import { DialIcon } from "./DialIcon.js";
7
8
  import { DialPagination } from "./DialPagination.js";
@@ -11,19 +12,13 @@ import { DevToolsSettingsModal, useDevToolsSettings } from "../DevToolsSettingsM
11
12
  import { useIsPro } from "@buoy-gg/license";
12
13
  import { useAppHost } from "../AppHost.js";
13
14
  import { OnboardingTooltip } from "./OnboardingTooltip.js";
14
- import { getDialLayout, MAX_DIAL_SLOTS, dialAnimationConfig, dialColors } from "@buoy-gg/floating-tools-core";
15
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
16
- const {
17
- width: SCREEN_WIDTH,
18
- height: SCREEN_HEIGHT
19
- } = Dimensions.get("window");
15
+ import { getDialLayout, MAX_DIAL_SLOTS, DIAL_BUTTON_SIZE, dialAnimationConfig, dialColors } from "@buoy-gg/floating-tools-core";
20
16
 
21
- // Use shared layout calculation from core
22
- const layout = getDialLayout({
23
- screenWidth: SCREEN_WIDTH
24
- });
25
- const CIRCLE_SIZE = layout.circleSize;
26
- const BUTTON_SIZE = layout.buttonSize;
17
+ // The circle size depends on the live window width, so it's computed inside
18
+ // the component via useWindowDimensions — a module-scope Dimensions.get
19
+ // snapshot goes stale when the window resizes after load (web/desktop).
20
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
21
+ const BUTTON_SIZE = DIAL_BUTTON_SIZE;
27
22
  const ONBOARDING_STORAGE_KEY = "@react_buoy_settings_tooltip_shown";
28
23
  /** A non-interactive placeholder used to fill out the last dial page. */
29
24
  const createEmptySlot = slotIndex => ({
@@ -55,6 +50,33 @@ export const DialDevTools = ({
55
50
  } = useAppHost();
56
51
  const isPro = useIsPro();
57
52
 
53
+ // Live window size — keeps the dial centered and sized correctly when the
54
+ // window resizes (Electron/web) or the device rotates.
55
+ const {
56
+ width: screenWidth,
57
+ height: screenHeight
58
+ } = useWindowDimensions();
59
+ const circleSize = getDialLayout({
60
+ screenWidth
61
+ }).circleSize;
62
+ const sizeStyles = useMemo(() => ({
63
+ parent: {
64
+ width: circleSize,
65
+ height: circleSize
66
+ },
67
+ circle: {
68
+ width: circleSize,
69
+ height: circleSize,
70
+ borderRadius: circleSize / 2
71
+ },
72
+ rounded: {
73
+ borderRadius: circleSize / 2
74
+ },
75
+ gridLine: {
76
+ width: circleSize
77
+ }
78
+ }), [circleSize]);
79
+
58
80
  // Load persisted settings modal state on mount
59
81
  useEffect(() => {
60
82
  const loadSettingsModalState = async () => {
@@ -480,13 +502,13 @@ export const DialDevTools = ({
480
502
  children: [/*#__PURE__*/_jsx(Animated.View, {
481
503
  style: [styles.backdrop, backdropAnimatedStyle],
482
504
  children: /*#__PURE__*/_jsx(Pressable, {
483
- style: StyleSheet.absoluteFillObject,
505
+ style: absoluteFill,
484
506
  onPress: handleClose
485
507
  })
486
508
  }), /*#__PURE__*/_jsxs(Animated.View, {
487
- style: [styles.parent, {
509
+ style: [styles.parent, sizeStyles.parent, {
488
510
  position: "absolute",
489
- left: (SCREEN_WIDTH - CIRCLE_SIZE) / 2,
511
+ left: (screenWidth - circleSize) / 2,
490
512
  bottom: 80,
491
513
  transform: [{
492
514
  scale: dialScale
@@ -498,21 +520,21 @@ export const DialDevTools = ({
498
520
  }]
499
521
  }],
500
522
  children: [/*#__PURE__*/_jsxs(Animated.View, {
501
- style: styles.circle,
523
+ style: [styles.circle, sizeStyles.circle],
502
524
  children: [/*#__PURE__*/_jsxs(View, {
503
- style: styles.gradientBackground,
525
+ style: [styles.gradientBackground, sizeStyles.rounded],
504
526
  children: [/*#__PURE__*/_jsx(View, {
505
- style: styles.gradientLayer1
527
+ style: [styles.gradientLayer1, sizeStyles.rounded]
506
528
  }), /*#__PURE__*/_jsx(View, {
507
- style: styles.gradientLayer2
529
+ style: [styles.gradientLayer2, sizeStyles.rounded]
508
530
  }), /*#__PURE__*/_jsx(View, {
509
- style: styles.gradientLayer3
531
+ style: [styles.gradientLayer3, sizeStyles.rounded]
510
532
  }), /*#__PURE__*/_jsx(View, {
511
533
  style: styles.gridPattern,
512
534
  children: Array.from({
513
535
  length: 6
514
536
  }).map((_, i) => /*#__PURE__*/_jsx(View, {
515
- style: [styles.gridLine, {
537
+ style: [styles.gridLine, sizeStyles.gridLine, {
516
538
  transform: [{
517
539
  rotate: `${i * 60}deg`
518
540
  }]
@@ -603,11 +625,11 @@ export const DialDevTools = ({
603
625
  onNext: () => handlePageChange(safePage + 1),
604
626
  animatedStyle: {
605
627
  position: "absolute",
606
- left: (SCREEN_WIDTH - CIRCLE_SIZE) / 2,
607
- // Circle's bottom edge sits at bottom: 80 -> SCREEN_HEIGHT - 80
628
+ left: (screenWidth - circleSize) / 2,
629
+ // Circle's bottom edge sits at bottom: 80 -> screenHeight - 80
608
630
  // from the top. Place the pager 16px below that edge.
609
- top: SCREEN_HEIGHT - 80 + 16,
610
- width: CIRCLE_SIZE,
631
+ top: screenHeight - 80 + 16,
632
+ width: circleSize,
611
633
  opacity: dialScale,
612
634
  transform: [{
613
635
  scale: dialScale
@@ -628,23 +650,20 @@ export const DialDevTools = ({
628
650
  };
629
651
  const styles = StyleSheet.create({
630
652
  container: {
631
- ...StyleSheet.absoluteFillObject,
653
+ ...absoluteFill,
632
654
  zIndex: 9999
633
655
  },
634
656
  backdrop: {
635
- ...StyleSheet.absoluteFillObject,
657
+ ...absoluteFill,
636
658
  backgroundColor: dialColors.dialBackdrop
637
659
  },
660
+ // width/height/borderRadius for the circle pieces come from sizeStyles —
661
+ // they track the live window width.
638
662
  parent: {
639
- width: CIRCLE_SIZE,
640
- height: CIRCLE_SIZE,
641
663
  alignItems: "center",
642
664
  justifyContent: "center"
643
665
  },
644
666
  circle: {
645
- width: CIRCLE_SIZE,
646
- height: CIRCLE_SIZE,
647
- borderRadius: CIRCLE_SIZE / 2,
648
667
  position: "absolute",
649
668
  backgroundColor: "transparent",
650
669
  borderWidth: 1,
@@ -661,41 +680,36 @@ const styles = StyleSheet.create({
661
680
  gradientBackground: {
662
681
  width: "100%",
663
682
  height: "100%",
664
- borderRadius: CIRCLE_SIZE / 2,
665
683
  position: "relative",
666
684
  backgroundColor: dialColors.dialBackground,
667
685
  overflow: "hidden"
668
686
  },
669
687
  gradientLayer1: {
670
- ...StyleSheet.absoluteFillObject,
688
+ ...absoluteFill,
671
689
  backgroundColor: dialColors.dialGradient1,
672
- opacity: 0.6,
673
- borderRadius: CIRCLE_SIZE / 2
690
+ opacity: 0.6
674
691
  },
675
692
  gradientLayer2: {
676
- ...StyleSheet.absoluteFillObject,
693
+ ...absoluteFill,
677
694
  backgroundColor: dialColors.dialGradient2,
678
695
  opacity: 0.4,
679
696
  top: "30%",
680
- left: "30%",
681
- borderRadius: CIRCLE_SIZE / 2
697
+ left: "30%"
682
698
  },
683
699
  gradientLayer3: {
684
- ...StyleSheet.absoluteFillObject,
700
+ ...absoluteFill,
685
701
  backgroundColor: dialColors.dialGradient3,
686
702
  opacity: 0.3,
687
703
  top: "50%",
688
- left: "50%",
689
- borderRadius: CIRCLE_SIZE / 2
704
+ left: "50%"
690
705
  },
691
706
  gridPattern: {
692
- ...StyleSheet.absoluteFillObject,
707
+ ...absoluteFill,
693
708
  alignItems: "center",
694
709
  justifyContent: "center"
695
710
  },
696
711
  gridLine: {
697
712
  position: "absolute",
698
- width: CIRCLE_SIZE,
699
713
  height: 1,
700
714
  backgroundColor: dialColors.dialGridLine
701
715
  },
@@ -721,13 +735,13 @@ const styles = StyleSheet.create({
721
735
  overflow: "hidden"
722
736
  },
723
737
  buttonGradientLayer1: {
724
- ...StyleSheet.absoluteFillObject,
738
+ ...absoluteFill,
725
739
  backgroundColor: dialColors.dialGradient1,
726
740
  opacity: 0.5,
727
741
  borderRadius: BUTTON_SIZE
728
742
  },
729
743
  buttonGradientLayer2: {
730
- ...StyleSheet.absoluteFillObject,
744
+ ...absoluteFill,
731
745
  backgroundColor: dialColors.dialGradient2,
732
746
  opacity: 0.3,
733
747
  top: "20%",
@@ -735,7 +749,7 @@ const styles = StyleSheet.create({
735
749
  borderRadius: BUTTON_SIZE
736
750
  },
737
751
  buttonGradientLayer3: {
738
- ...StyleSheet.absoluteFillObject,
752
+ ...absoluteFill,
739
753
  backgroundColor: dialColors.dialGradient3,
740
754
  opacity: 0.2,
741
755
  top: "40%",
@@ -1,19 +1,13 @@
1
1
  "use strict";
2
2
 
3
3
  import { useMemo, useRef } from "react";
4
- import { StyleSheet, Pressable, View, Text, Dimensions, Animated } from "react-native";
5
- import { getDialLayout, getIconPosition, getIconStaggerInputRange, DIAL_START_ANGLE, dialColors, dialStyles, dialAnimationConfig } from "@buoy-gg/floating-tools-core";
6
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
- const {
8
- width: SCREEN_WIDTH
9
- } = Dimensions.get("window");
4
+ import { StyleSheet, Pressable, View, Text, useWindowDimensions, Animated } from "react-native";
5
+ import { getDialLayout, getIconPosition, getIconStaggerInputRange, DIAL_START_ANGLE, DIAL_ICON_SIZE, dialColors, dialStyles, dialAnimationConfig } from "@buoy-gg/floating-tools-core";
10
6
 
11
- // Use shared layout calculation
12
- const layout = getDialLayout({
13
- screenWidth: SCREEN_WIDTH
14
- });
15
- const VIEW_SIZE = layout.iconSize;
16
- const CIRCLE_RADIUS = layout.circleRadius;
7
+ // The circle radius depends on the live window width and is computed inside
8
+ // the component (must match DialDevTools' circle, which does the same).
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ const VIEW_SIZE = DIAL_ICON_SIZE;
17
11
  export const DialIcon = ({
18
12
  index,
19
13
  icon,
@@ -24,6 +18,12 @@ export const DialIcon = ({
24
18
  }) => {
25
19
  // Animation values - using interpolation for better performance
26
20
  const scale = useRef(new Animated.Value(1)).current;
21
+ const {
22
+ width: screenWidth
23
+ } = useWindowDimensions();
24
+ const layout = useMemo(() => getDialLayout({
25
+ screenWidth
26
+ }), [screenWidth]);
27
27
 
28
28
  // Hover animation on press in/out - using shared config
29
29
  // Fallback values in case dialAnimationConfig hasn't loaded yet
@@ -119,14 +119,14 @@ export const DialIcon = ({
119
119
  itemOpacity,
120
120
  progressScale: staggeredProgress
121
121
  };
122
- }, [index, totalIcons, iconsProgress]);
122
+ }, [index, totalIcons, iconsProgress, layout]);
123
123
 
124
124
  // Main animated style for position and appearance
125
125
  const animatedStyle = {
126
126
  position: "absolute",
127
- left: CIRCLE_RADIUS - VIEW_SIZE / 2,
127
+ left: layout.circleRadius - VIEW_SIZE / 2,
128
128
  // Center position
129
- top: CIRCLE_RADIUS - VIEW_SIZE / 2,
129
+ top: layout.circleRadius - VIEW_SIZE / 2,
130
130
  // Center position
131
131
  opacity: motion.itemOpacity,
132
132
  transform: [{
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useEffect, useRef } from "react";
4
4
  import { Animated, Pressable, StyleSheet, Text, View, Easing } from "react-native";
5
+ import { absoluteFill } from "@buoy-gg/shared-ui";
5
6
  import { dialColors, buoyColors } from "@buoy-gg/shared-ui";
6
7
  import { calculateTooltipPosition, ARROW_BOTTOM_OFFSET, ARROW_HEIGHT } from "./onboardingConstants.js";
7
8
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -128,7 +129,7 @@ export const OnboardingTooltip = ({
128
129
  };
129
130
  const styles = StyleSheet.create({
130
131
  container: {
131
- ...StyleSheet.absoluteFillObject,
132
+ ...absoluteFill,
132
133
  alignItems: "center",
133
134
  justifyContent: "center",
134
135
  pointerEvents: "box-none"
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsSettingsModal.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/DevToolsSettingsModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,EAAE,EAAE,MAAM,OAAO,CAAC;AAqJtE;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,uFAAuF;IACvF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACvC,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,kDAAkD;IAClD,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACzC;AAED,UAAU,0BAA0B;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,aAAa,CAAC,EAAE;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;KAChC,EAAE,CAAC;CACL;AA2DD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CA28BhE,CAAC;AAwDF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;CAuD/B,CAAC"}
1
+ {"version":3,"file":"DevToolsSettingsModal.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/DevToolsSettingsModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,EAAE,EAAE,MAAM,OAAO,CAAC;AAsJtE;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,uFAAuF;IACvF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACvC,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,kDAAkD;IAClD,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACzC;AAED,UAAU,0BAA0B;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,aAAa,CAAC,EAAE;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;KAChC,EAAE,CAAC;CACL;AA2DD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CA+8BhE,CAAC;AAwDF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;CAuD/B,CAAC"}
@@ -2,6 +2,7 @@ import React from "react";
2
2
  import { type FloatingMenuProps } from "./FloatingMenu";
3
3
  import type { InstalledApp } from "./types";
4
4
  import { type DefaultFloatingConfig, type DefaultDialConfig } from "./defaultConfig";
5
+ import { type ExternalSyncOptions } from "./autoExternalSync";
5
6
  /**
6
7
  * Environment variable configuration
7
8
  *
@@ -229,6 +230,23 @@ export interface FloatingDevToolsProps extends Omit<FloatingMenuProps, "apps"> {
229
230
  * ```
230
231
  */
231
232
  zustandStores?: Record<string, any>;
233
+ /**
234
+ * Zero-config sync to the Buoy Desktop dashboard.
235
+ *
236
+ * Enabled by default in dev builds whenever @buoy-gg/external-sync is
237
+ * installed: connects to the desktop broker (localhost:42831 — a silent
238
+ * no-op when the desktop app isn't running) and registers a sync adapter
239
+ * for every installed tool automatically. Nothing else to render.
240
+ *
241
+ * Pass `false` to disable, or options to customize the device identity /
242
+ * broker URL:
243
+ *
244
+ * @example
245
+ * ```tsx
246
+ * <FloatingDevTools externalSync={{ deviceName: "My App (ios)" }} />
247
+ * ```
248
+ */
249
+ externalSync?: boolean | ExternalSyncOptions;
232
250
  }
233
251
  /**
234
252
  * Unified floating development tools component with automatic preset discovery.
@@ -284,5 +302,5 @@ export interface FloatingDevToolsProps extends Omit<FloatingMenuProps, "apps"> {
284
302
  *
285
303
  * @param props - FloatingDevTools props
286
304
  */
287
- export declare const FloatingDevTools: ({ apps, requiredEnvVars, requiredStorageKeys, children, disableHints, defaultFloatingTools, defaultDialTools, requireLicense, licenseKey: licenseKeyProp, zustandStores, environment, ...props }: FloatingDevToolsProps) => React.JSX.Element | null;
305
+ export declare const FloatingDevTools: ({ apps, requiredEnvVars, requiredStorageKeys, children, disableHints, defaultFloatingTools, defaultDialTools, requireLicense, licenseKey: licenseKeyProp, zustandStores, environment, externalSync, ...props }: FloatingDevToolsProps) => React.JSX.Element | null;
288
306
  //# sourceMappingURL=FloatingDevTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingDevTools.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingDevTools.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+D,MAAM,OAAO,CAAC;AAGpF,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAIzB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACD;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,KAAK,CAAC;IACV,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAC5E;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;IAEtB;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,EAAE,YAAY,EAAE,CAAC;IAEjC;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAEzC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAE7C;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IAErC;;;;;;;;;;;;;;;;OAgBG;IACH,qBAAqB,CAAC,EAAE,OAAO,oBAAoB,EAAE,WAAW,EAAE,CAAC;IAEnE;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,oBAAoB,EAAE,WAAW,KAAK,IAAI,CAAC;IAEtF;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,eAAO,MAAM,gBAAgB,GAAI,kMAa9B,qBAAqB,6BAwOvB,CAAC"}
1
+ {"version":3,"file":"FloatingDevTools.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingDevTools.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+D,MAAM,OAAO,CAAC;AAGpF,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACD;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,KAAK,CAAC;IACV,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAC5E;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;IAEtB;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,EAAE,YAAY,EAAE,CAAC;IAEjC;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAEzC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAE7C;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IAErC;;;;;;;;;;;;;;;;OAgBG;IACH,qBAAqB,CAAC,EAAE,OAAO,oBAAoB,EAAE,WAAW,EAAE,CAAC;IAEnE;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,oBAAoB,EAAE,WAAW,KAAK,IAAI,CAAC;IAEtF;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,eAAO,MAAM,gBAAgB,GAAI,gNAc9B,qBAAqB,6BAqPvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingMenu.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingMenu.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAqD,MAAM,OAAO,CAAC;AASrF,OAAO,EAAiB,QAAQ,EAAc,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AActD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,sFAAsF;IACtF,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uFAAuF;IACvF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAC7C,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1D;AAYD,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAwU9C,CAAC"}
1
+ {"version":3,"file":"FloatingMenu.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingMenu.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAqD,MAAM,OAAO,CAAC;AASrF,OAAO,EAAiB,QAAQ,EAAc,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AActD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,sFAAsF;IACtF,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uFAAuF;IACvF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAC7C,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1D;AAWD,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAwU9C,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { EnvVarConfig } from "./FloatingDevTools";
2
+ /** Whether zero-config sync can run (the external-sync package is installed). */
3
+ export declare function isExternalSyncAvailable(): boolean;
4
+ export interface ExternalSyncOptions {
5
+ /** Broker URL. @default "http://localhost:42831" (the Buoy Desktop app) */
6
+ socketURL?: string;
7
+ /** Shown in the desktop device list. @default "<app name> (<platform>)" */
8
+ deviceName?: string;
9
+ /** Stable device identity across restarts. @default "<app-slug>-<platform>" */
10
+ deviceId?: string;
11
+ /** @default false */
12
+ enableLogs?: boolean;
13
+ }
14
+ interface AutoExternalSyncProps {
15
+ options?: ExternalSyncOptions;
16
+ /** FloatingDevTools' requiredEnvVars — reused for the env tool's adapter. */
17
+ requiredEnvVars?: EnvVarConfig[];
18
+ }
19
+ export declare function AutoExternalSync({ options, requiredEnvVars, }: AutoExternalSyncProps): null;
20
+ export {};
21
+ //# sourceMappingURL=autoExternalSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoExternalSync.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/autoExternalSync.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAwGvD,iFAAiF;AACjF,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAuBD,UAAU,qBAAqB;IAC7B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,6EAA6E;IAC7E,eAAe,CAAC,EAAE,YAAY,EAAE,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,eAAe,GAChB,EAAE,qBAAqB,QA4EvB"}
@@ -19,7 +19,7 @@
19
19
  * All known tool IDs that can appear in the floating menu or dial menu.
20
20
  * This is a union type of all auto-discovered tool IDs.
21
21
  */
22
- export type BuiltInToolId = 'env' | 'network' | 'storage' | 'query' | 'query-wifi-toggle' | 'route-events' | 'debug-borders' | 'highlight-updates' | 'highlight-updates-modal';
22
+ export type BuiltInToolId = 'env' | 'network' | 'storage' | 'query' | 'query-wifi-toggle' | 'route-events' | 'debug-borders' | 'highlight-updates' | 'highlight-updates-modal' | 'redux' | 'zustand' | 'jotai' | 'events' | 'image-overlay' | 'perf-monitor' | 'perf-monitor-modal';
23
23
  /**
24
24
  * Special floating-only tool IDs that only appear in the floating bubble row.
25
25
  */