@buoy-gg/core 1.7.8 → 2.1.1
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.
- package/lib/commonjs/floatingMenu/AppHost.js +2 -2
- package/lib/commonjs/floatingMenu/DevToolsSettingsModal.js +5 -5
- package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +1 -2
- package/lib/commonjs/floatingMenu/FloatingMenu.js +4 -4
- package/lib/commonjs/floatingMenu/MinimizedToolsContext.js +2 -2
- package/lib/commonjs/floatingMenu/autoDiscoverPresets.js +15 -0
- package/lib/commonjs/floatingMenu/dial/DialDevTools.js +4 -4
- package/lib/commonjs/floatingMenu/floatingTools.js +218 -38
- package/lib/module/floatingMenu/AppHost.js +3 -3
- package/lib/module/floatingMenu/DevToolsSettingsModal.js +7 -7
- package/lib/module/floatingMenu/FloatingDevTools.web.js +1 -2
- package/lib/module/floatingMenu/FloatingMenu.js +5 -5
- package/lib/module/floatingMenu/MinimizedToolsContext.js +3 -3
- package/lib/module/floatingMenu/autoDiscoverPresets.js +15 -0
- package/lib/module/floatingMenu/dial/DialDevTools.js +5 -5
- package/lib/module/floatingMenu/floatingTools.js +219 -39
- package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/FloatingMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/autoDiscoverPresets.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/floatingTools.d.ts +1 -1
- package/lib/typescript/commonjs/floatingMenu/floatingTools.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/FloatingDevTools.web.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/FloatingMenu.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/autoDiscoverPresets.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/floatingTools.d.ts +1 -1
- package/lib/typescript/module/floatingMenu/floatingTools.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -4,7 +4,7 @@ import React, { useEffect, useMemo, useRef, useState } from "react";
|
|
|
4
4
|
import { TouchableOpacity, StyleSheet, View, Dimensions } from "react-native";
|
|
5
5
|
import { FloatingTools, UserStatus } from "./floatingTools";
|
|
6
6
|
import { DialDevTools } from "./dial/DialDevTools";
|
|
7
|
-
import { EnvironmentIndicator,
|
|
7
|
+
import { EnvironmentIndicator, persistentStorage, useHintsDisabled, devToolsStorageKeys, buoyColors } from "@buoy-gg/shared-ui";
|
|
8
8
|
import { useDevToolsSettings } from "./DevToolsSettingsModal";
|
|
9
9
|
import { useAppHost } from "./AppHost.js";
|
|
10
10
|
import { useDevToolsVisibility } from "./DevToolsVisibilityContext.js";
|
|
@@ -48,7 +48,7 @@ export const FloatingMenu = ({
|
|
|
48
48
|
useEffect(() => {
|
|
49
49
|
const loadDialState = async () => {
|
|
50
50
|
try {
|
|
51
|
-
const savedDialOpen = await
|
|
51
|
+
const savedDialOpen = await persistentStorage.getItem(devToolsStorageKeys.dial.isOpen());
|
|
52
52
|
if (savedDialOpen === "true") {
|
|
53
53
|
setShowDial(true);
|
|
54
54
|
}
|
|
@@ -65,7 +65,7 @@ export const FloatingMenu = ({
|
|
|
65
65
|
useEffect(() => {
|
|
66
66
|
// Only persist after initial state is loaded to avoid overwriting with default
|
|
67
67
|
if (!dialStateLoaded) return;
|
|
68
|
-
|
|
68
|
+
persistentStorage.setItem(devToolsStorageKeys.dial.isOpen(), showDial ? "true" : "false").catch(error => {
|
|
69
69
|
// Failed to save dial state - continue without persistence
|
|
70
70
|
console.warn("Failed to save dial state:", error);
|
|
71
71
|
});
|
|
@@ -92,7 +92,7 @@ export const FloatingMenu = ({
|
|
|
92
92
|
}
|
|
93
93
|
const checkOnboarding = async () => {
|
|
94
94
|
try {
|
|
95
|
-
const hasSeenOnboarding = await
|
|
95
|
+
const hasSeenOnboarding = await persistentStorage.getItem(FLOATING_MENU_ONBOARDING_KEY);
|
|
96
96
|
if (!hasSeenOnboarding) {
|
|
97
97
|
// Small delay to let the UI settle before showing tooltip
|
|
98
98
|
setTimeout(() => {
|
|
@@ -197,7 +197,7 @@ export const FloatingMenu = ({
|
|
|
197
197
|
setOnboardingStep(null);
|
|
198
198
|
|
|
199
199
|
// Save to storage asynchronously in the background
|
|
200
|
-
|
|
200
|
+
persistentStorage.setItem(FLOATING_MENU_ONBOARDING_KEY, "true").catch(error => {
|
|
201
201
|
// Silently fail - user already saw onboarding, just won't persist
|
|
202
202
|
console.warn("Failed to save onboarding state:", error);
|
|
203
203
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import React, { createContext, useContext, useState, useCallback, useEffect, useRef, useMemo } from "react";
|
|
4
4
|
import { Dimensions } from "react-native";
|
|
5
|
-
import {
|
|
5
|
+
import { persistentStorage, getSafeAreaInsets } from "@buoy-gg/shared-ui";
|
|
6
6
|
|
|
7
7
|
// ============================================================================
|
|
8
8
|
// Types
|
|
@@ -107,7 +107,7 @@ export function MinimizedToolsProvider({
|
|
|
107
107
|
useEffect(() => {
|
|
108
108
|
const restoreMinimizedTools = async () => {
|
|
109
109
|
try {
|
|
110
|
-
const saved = await
|
|
110
|
+
const saved = await persistentStorage.getItem(STORAGE_KEY);
|
|
111
111
|
if (saved) {
|
|
112
112
|
const serialized = JSON.parse(saved);
|
|
113
113
|
// Reconstruct tools with icons
|
|
@@ -137,7 +137,7 @@ export function MinimizedToolsProvider({
|
|
|
137
137
|
icon,
|
|
138
138
|
...rest
|
|
139
139
|
}) => rest);
|
|
140
|
-
|
|
140
|
+
persistentStorage.setItem(STORAGE_KEY, JSON.stringify(serialized));
|
|
141
141
|
}, PERSISTENCE_DELAY);
|
|
142
142
|
return () => {
|
|
143
143
|
if (persistenceTimeoutRef.current) {
|
|
@@ -189,6 +189,21 @@ export function autoDiscoverPresets() {
|
|
|
189
189
|
return null;
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
+
},
|
|
193
|
+
// Events Timeline
|
|
194
|
+
{
|
|
195
|
+
name: "@buoy-gg/events",
|
|
196
|
+
loader: () => {
|
|
197
|
+
try {
|
|
198
|
+
// @ts-ignore - Dynamic import that may not exist
|
|
199
|
+
const {
|
|
200
|
+
eventsToolPreset
|
|
201
|
+
} = require("@buoy-gg/events");
|
|
202
|
+
return eventsToolPreset;
|
|
203
|
+
} catch {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
192
207
|
}];
|
|
193
208
|
|
|
194
209
|
// Attempt to load each preset
|
|
@@ -4,7 +4,7 @@ import { useEffect, useMemo, useRef, useState } from "react";
|
|
|
4
4
|
import { Pressable, StyleSheet, View, Dimensions, Text, Animated, Easing } from "react-native";
|
|
5
5
|
// Icons are provided by installedApps; no direct icon imports here.
|
|
6
6
|
import { DialIcon } from "./DialIcon.js";
|
|
7
|
-
import {
|
|
7
|
+
import { persistentStorage, useHintsDisabled, devToolsStorageKeys, buoyColors } from "@buoy-gg/shared-ui";
|
|
8
8
|
import { DevToolsSettingsModal, useDevToolsSettings } from "../DevToolsSettingsModal";
|
|
9
9
|
import { useIsPro } from "@buoy-gg/license";
|
|
10
10
|
import { useAppHost } from "../AppHost.js";
|
|
@@ -55,7 +55,7 @@ export const DialDevTools = ({
|
|
|
55
55
|
useEffect(() => {
|
|
56
56
|
const loadSettingsModalState = async () => {
|
|
57
57
|
try {
|
|
58
|
-
const savedModalOpen = await
|
|
58
|
+
const savedModalOpen = await persistentStorage.getItem(devToolsStorageKeys.settings.modalOpen());
|
|
59
59
|
if (savedModalOpen === "true") {
|
|
60
60
|
setIsSettingsModalOpen(true);
|
|
61
61
|
}
|
|
@@ -72,7 +72,7 @@ export const DialDevTools = ({
|
|
|
72
72
|
useEffect(() => {
|
|
73
73
|
// Only persist after initial state is loaded to avoid overwriting with default
|
|
74
74
|
if (!settingsModalStateLoaded) return;
|
|
75
|
-
|
|
75
|
+
persistentStorage.setItem(devToolsStorageKeys.settings.modalOpen(), isSettingsModalOpen ? "true" : "false").catch(error => {
|
|
76
76
|
// Failed to save settings modal state - continue without persistence
|
|
77
77
|
console.warn("Failed to save settings modal state:", error);
|
|
78
78
|
});
|
|
@@ -107,7 +107,7 @@ export const DialDevTools = ({
|
|
|
107
107
|
}
|
|
108
108
|
const checkOnboarding = async () => {
|
|
109
109
|
try {
|
|
110
|
-
const hasSeenTooltip = await
|
|
110
|
+
const hasSeenTooltip = await persistentStorage.getItem(ONBOARDING_STORAGE_KEY);
|
|
111
111
|
if (!hasSeenTooltip) {
|
|
112
112
|
// Small delay to let the entrance animations play first
|
|
113
113
|
setTimeout(() => {
|
|
@@ -406,7 +406,7 @@ export const DialDevTools = ({
|
|
|
406
406
|
setShowOnboardingTooltip(false);
|
|
407
407
|
|
|
408
408
|
// Save to storage asynchronously in the background
|
|
409
|
-
|
|
409
|
+
persistentStorage.setItem(ONBOARDING_STORAGE_KEY, "true").catch(error => {
|
|
410
410
|
// Silently fail - user already saw onboarding, just won't persist
|
|
411
411
|
console.warn("Failed to save dial onboarding state:", error);
|
|
412
412
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect, useMemo, useRef, useState, useContext, createContext, useCallback, Children } from "react";
|
|
4
4
|
import { Animated, Dimensions, View, Text, TouchableOpacity } from "react-native";
|
|
5
|
-
import { getSafeAreaInsets,
|
|
5
|
+
import { getSafeAreaInsets, persistentStorage, buoyColors } from "@buoy-gg/shared-ui";
|
|
6
6
|
import { DraggableHeader } from "./DraggableHeader.js";
|
|
7
7
|
import { useSafeAreaInsets } from "@buoy-gg/shared-ui";
|
|
8
8
|
import { calculateTargetPosition } from "./dial/onboardingConstants.js";
|
|
@@ -100,8 +100,9 @@ const STORAGE_KEYS = {
|
|
|
100
100
|
* @param props.enabled - Whether position persistence is enabled
|
|
101
101
|
* @param props.visibleHandleWidth - Width of visible handle when bubble is hidden
|
|
102
102
|
* @param props.listenersSuspended - Pause automatic listeners without disabling manual saves
|
|
103
|
+
* @param props.onPositionLoaded - Callback fired once position is loaded and set
|
|
103
104
|
*
|
|
104
|
-
* @returns Object containing position management functions
|
|
105
|
+
* @returns Object containing position management functions and loading state
|
|
105
106
|
*
|
|
106
107
|
* @performance Uses debounced saving to avoid excessive storage operations
|
|
107
108
|
* @performance Validates positions against screen boundaries and safe areas
|
|
@@ -112,26 +113,57 @@ function useFloatingToolsPosition({
|
|
|
112
113
|
bubbleHeight = 32,
|
|
113
114
|
enabled = true,
|
|
114
115
|
visibleHandleWidth = 32,
|
|
115
|
-
listenersSuspended = false
|
|
116
|
+
listenersSuspended = false,
|
|
117
|
+
onPositionLoaded
|
|
116
118
|
}) {
|
|
117
|
-
|
|
119
|
+
// Use state instead of ref so we can react to changes and prevent races
|
|
120
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
118
121
|
const saveTimeoutRef = useRef(undefined);
|
|
122
|
+
// Track if component is mounted to prevent state updates after unmount
|
|
123
|
+
const isMountedRef = useRef(true);
|
|
124
|
+
|
|
125
|
+
// Cleanup on unmount - cancel any pending saves
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
isMountedRef.current = true;
|
|
128
|
+
return () => {
|
|
129
|
+
isMountedRef.current = false;
|
|
130
|
+
// Clear any pending debounced saves on unmount to prevent saving stale/invalid positions
|
|
131
|
+
if (saveTimeoutRef.current) {
|
|
132
|
+
clearTimeout(saveTimeoutRef.current);
|
|
133
|
+
saveTimeoutRef.current = undefined;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
}, []);
|
|
119
137
|
const savePosition = useCallback(async (x, y) => {
|
|
120
138
|
if (!enabled) return;
|
|
139
|
+
// Don't save if component unmounted or position is clearly invalid
|
|
140
|
+
if (!isMountedRef.current) return;
|
|
141
|
+
// Guard against saving invalid positions (e.g., during HMR with stale dimensions)
|
|
142
|
+
const {
|
|
143
|
+
width: screenWidth
|
|
144
|
+
} = Dimensions.get("window");
|
|
145
|
+
if (screenWidth <= 0 || x < 0 || y < 0) return;
|
|
121
146
|
try {
|
|
122
|
-
await Promise.all([
|
|
147
|
+
await Promise.all([persistentStorage.setItem(STORAGE_KEYS.BUBBLE_POSITION_X, x.toString()), persistentStorage.setItem(STORAGE_KEYS.BUBBLE_POSITION_Y, y.toString())]);
|
|
123
148
|
} catch (error) {
|
|
124
149
|
// Failed to save position - continue without persistence
|
|
125
150
|
}
|
|
126
151
|
}, [enabled]);
|
|
127
152
|
const debouncedSavePosition = useCallback((x, y) => {
|
|
153
|
+
// Don't schedule saves if unmounted
|
|
154
|
+
if (!isMountedRef.current) return;
|
|
128
155
|
if (saveTimeoutRef.current) clearTimeout(saveTimeoutRef.current);
|
|
129
|
-
saveTimeoutRef.current = setTimeout(() =>
|
|
156
|
+
saveTimeoutRef.current = setTimeout(() => {
|
|
157
|
+
// Double-check mount status before saving
|
|
158
|
+
if (isMountedRef.current) {
|
|
159
|
+
savePosition(x, y);
|
|
160
|
+
}
|
|
161
|
+
}, 500);
|
|
130
162
|
}, [savePosition]);
|
|
131
163
|
const loadPosition = useCallback(async () => {
|
|
132
164
|
if (!enabled) return null;
|
|
133
165
|
try {
|
|
134
|
-
const [xStr, yStr] = await Promise.all([
|
|
166
|
+
const [xStr, yStr] = await Promise.all([persistentStorage.getItem(STORAGE_KEYS.BUBBLE_POSITION_X), persistentStorage.getItem(STORAGE_KEYS.BUBBLE_POSITION_Y)]);
|
|
135
167
|
if (xStr !== null && yStr !== null) {
|
|
136
168
|
const x = parseFloat(xStr);
|
|
137
169
|
const y = parseFloat(yStr);
|
|
@@ -151,6 +183,16 @@ function useFloatingToolsPosition({
|
|
|
151
183
|
height: screenHeight
|
|
152
184
|
} = Dimensions.get("window");
|
|
153
185
|
const safeArea = getSafeAreaInsets();
|
|
186
|
+
|
|
187
|
+
// Guard against invalid screen dimensions (can happen during HMR)
|
|
188
|
+
// Return the position as-is but mark as invalid so caller knows not to trust it
|
|
189
|
+
if (screenWidth <= 0 || screenHeight <= 0) {
|
|
190
|
+
return {
|
|
191
|
+
...position,
|
|
192
|
+
isValid: false
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
154
196
|
// Prevent going off left, top, and bottom edges with safe area
|
|
155
197
|
// Allow pushing off-screen to the right so only the grab handle remains visible
|
|
156
198
|
const minX = safeArea.left; // Respect safe area left
|
|
@@ -160,53 +202,103 @@ function useFloatingToolsPosition({
|
|
|
160
202
|
const maxY = screenHeight - bubbleHeight - safeArea.bottom; // Respect safe area bottom
|
|
161
203
|
const clamped = {
|
|
162
204
|
x: Math.max(minX, Math.min(position.x, maxX)),
|
|
163
|
-
y: Math.max(minY, Math.min(position.y, maxY))
|
|
205
|
+
y: Math.max(minY, Math.min(position.y, maxY)),
|
|
206
|
+
isValid: true
|
|
164
207
|
};
|
|
165
208
|
return clamped;
|
|
166
209
|
}, [visibleHandleWidth, bubbleHeight]);
|
|
167
210
|
useEffect(() => {
|
|
168
|
-
if (!enabled || isInitialized
|
|
211
|
+
if (!enabled || isInitialized) return;
|
|
212
|
+
let cancelled = false;
|
|
169
213
|
const restore = async () => {
|
|
170
214
|
const saved = await loadPosition();
|
|
215
|
+
|
|
216
|
+
// Check if cancelled or unmounted before updating state
|
|
217
|
+
if (cancelled || !isMountedRef.current) return;
|
|
218
|
+
const {
|
|
219
|
+
width: screenWidth,
|
|
220
|
+
height: screenHeight
|
|
221
|
+
} = Dimensions.get("window");
|
|
222
|
+
const safeArea = getSafeAreaInsets();
|
|
223
|
+
|
|
224
|
+
// If dimensions are invalid (HMR scenario), wait and retry
|
|
225
|
+
if (screenWidth <= 0 || screenHeight <= 0) {
|
|
226
|
+
// Schedule a retry after a short delay
|
|
227
|
+
setTimeout(() => {
|
|
228
|
+
if (isMountedRef.current && !cancelled) {
|
|
229
|
+
restore();
|
|
230
|
+
}
|
|
231
|
+
}, 100);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
let finalPosition;
|
|
235
|
+
let wasHidden = false;
|
|
171
236
|
if (saved) {
|
|
172
237
|
const validated = validatePosition(saved);
|
|
238
|
+
|
|
239
|
+
// If validation returned invalid, retry later
|
|
240
|
+
if (!validated.isValid) {
|
|
241
|
+
setTimeout(() => {
|
|
242
|
+
if (isMountedRef.current && !cancelled) {
|
|
243
|
+
restore();
|
|
244
|
+
}
|
|
245
|
+
}, 100);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
173
249
|
// Check if the saved position is out of bounds
|
|
174
250
|
const wasOutOfBounds = Math.abs(saved.x - validated.x) > 5 || Math.abs(saved.y - validated.y) > 5;
|
|
175
251
|
if (wasOutOfBounds) {
|
|
176
252
|
// Save the corrected position
|
|
177
253
|
await savePosition(validated.x, validated.y);
|
|
178
254
|
}
|
|
179
|
-
|
|
255
|
+
finalPosition = {
|
|
256
|
+
x: validated.x,
|
|
257
|
+
y: validated.y
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
// Check if loaded in hidden state (bubble pushed to right edge)
|
|
261
|
+
wasHidden = validated.x >= screenWidth - visibleHandleWidth - 5;
|
|
180
262
|
} else {
|
|
181
|
-
const {
|
|
182
|
-
width: screenWidth,
|
|
183
|
-
height: screenHeight
|
|
184
|
-
} = Dimensions.get("window");
|
|
185
|
-
const safeArea = getSafeAreaInsets();
|
|
186
263
|
const defaultY = Math.max(safeArea.top + 20, Math.min(100, screenHeight - bubbleHeight - safeArea.bottom));
|
|
187
|
-
|
|
264
|
+
finalPosition = {
|
|
188
265
|
x: screenWidth - bubbleWidth - 20,
|
|
189
|
-
y: defaultY
|
|
190
|
-
}
|
|
266
|
+
y: defaultY
|
|
267
|
+
};
|
|
191
268
|
}
|
|
192
|
-
|
|
269
|
+
|
|
270
|
+
// Final mount check before updating
|
|
271
|
+
if (cancelled || !isMountedRef.current) return;
|
|
272
|
+
animatedPosition.setValue(finalPosition);
|
|
273
|
+
setIsInitialized(true);
|
|
274
|
+
onPositionLoaded?.(finalPosition, wasHidden);
|
|
193
275
|
};
|
|
194
276
|
restore();
|
|
195
|
-
|
|
277
|
+
return () => {
|
|
278
|
+
cancelled = true;
|
|
279
|
+
};
|
|
280
|
+
}, [enabled, isInitialized, animatedPosition, loadPosition, validatePosition, savePosition, bubbleWidth, bubbleHeight, visibleHandleWidth, onPositionLoaded]);
|
|
281
|
+
|
|
282
|
+
// Listener effect - now properly depends on isInitialized state
|
|
196
283
|
useEffect(() => {
|
|
197
|
-
|
|
284
|
+
// Don't attach listener until position is loaded
|
|
285
|
+
if (!enabled || !isInitialized || listenersSuspended) return;
|
|
198
286
|
const listener = animatedPosition.addListener(value => {
|
|
199
287
|
debouncedSavePosition(value.x, value.y);
|
|
200
288
|
});
|
|
201
289
|
return () => {
|
|
202
290
|
animatedPosition.removeListener(listener);
|
|
203
|
-
|
|
291
|
+
// Clear debounce timer when listener is removed
|
|
292
|
+
if (saveTimeoutRef.current) {
|
|
293
|
+
clearTimeout(saveTimeoutRef.current);
|
|
294
|
+
saveTimeoutRef.current = undefined;
|
|
295
|
+
}
|
|
204
296
|
};
|
|
205
|
-
}, [enabled, listenersSuspended, animatedPosition, debouncedSavePosition]);
|
|
297
|
+
}, [enabled, isInitialized, listenersSuspended, animatedPosition, debouncedSavePosition]);
|
|
206
298
|
return {
|
|
207
299
|
savePosition,
|
|
208
300
|
loadPosition,
|
|
209
|
-
isInitialized
|
|
301
|
+
isInitialized
|
|
210
302
|
};
|
|
211
303
|
}
|
|
212
304
|
|
|
@@ -387,26 +479,41 @@ export function FloatingTools({
|
|
|
387
479
|
|
|
388
480
|
// Track previous pushToSide value to detect transitions
|
|
389
481
|
const prevPushToSideRef = useRef(pushToSide);
|
|
482
|
+
|
|
483
|
+
// Track previous bubble width for auto-adjustment when tools are added/removed
|
|
484
|
+
const prevBubbleWidthRef = useRef(null);
|
|
390
485
|
const safeAreaInsets = useSafeAreaInsets();
|
|
391
486
|
const {
|
|
392
487
|
width: screenWidth,
|
|
393
488
|
height: screenHeight
|
|
394
489
|
} = Dimensions.get("window");
|
|
395
490
|
|
|
491
|
+
// Callback when position is loaded - sets hidden state properly without racing
|
|
492
|
+
const handlePositionLoaded = useCallback((position, wasHidden) => {
|
|
493
|
+
if (wasHidden) {
|
|
494
|
+
setIsHidden(true);
|
|
495
|
+
}
|
|
496
|
+
}, []);
|
|
497
|
+
|
|
396
498
|
// Position persistence (state/IO extracted to hook)
|
|
397
499
|
const {
|
|
398
|
-
savePosition
|
|
500
|
+
savePosition,
|
|
501
|
+
isInitialized: isPositionInitialized
|
|
399
502
|
} = useFloatingToolsPosition({
|
|
400
503
|
animatedPosition,
|
|
401
504
|
bubbleWidth: bubbleSize.width,
|
|
402
505
|
bubbleHeight: bubbleSize.height,
|
|
403
506
|
enabled: enablePositionPersistence,
|
|
404
507
|
visibleHandleWidth: 32,
|
|
405
|
-
listenersSuspended: isDragging
|
|
508
|
+
listenersSuspended: isDragging,
|
|
509
|
+
onPositionLoaded: handlePositionLoaded
|
|
406
510
|
});
|
|
407
511
|
|
|
408
512
|
// Effect to handle pushToSide prop changes
|
|
409
513
|
useEffect(() => {
|
|
514
|
+
// Don't process pushToSide until position is initialized (when persistence enabled)
|
|
515
|
+
if (enablePositionPersistence && !isPositionInitialized) return;
|
|
516
|
+
|
|
410
517
|
// Reset user override when pushToSide becomes true (dial/modal opens)
|
|
411
518
|
// This allows auto-hide to work after user manually showed the menu
|
|
412
519
|
if (!prevPushToSideRef.current && pushToSide) {
|
|
@@ -464,22 +571,77 @@ export function FloatingTools({
|
|
|
464
571
|
});
|
|
465
572
|
}
|
|
466
573
|
}
|
|
467
|
-
}, [pushToSide, isHidden, isDragging, screenWidth, animatedPosition, savePosition]);
|
|
574
|
+
}, [enablePositionPersistence, isPositionInitialized, pushToSide, isHidden, isDragging, screenWidth, animatedPosition, savePosition]);
|
|
575
|
+
|
|
576
|
+
// Hidden state is now set via onPositionLoaded callback - no racing effect needed
|
|
468
577
|
|
|
469
|
-
//
|
|
578
|
+
// Auto-adjust position when bubble width changes (tools added/removed)
|
|
579
|
+
// This keeps the bubble's right edge in the same relative position
|
|
470
580
|
useEffect(() => {
|
|
471
|
-
if
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
581
|
+
// Skip if not initialized or first measurement
|
|
582
|
+
if (!isPositionInitialized || prevBubbleWidthRef.current === null) {
|
|
583
|
+
prevBubbleWidthRef.current = bubbleSize.width;
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// Skip if currently dragging - let drag handle position
|
|
588
|
+
if (isDragging) {
|
|
589
|
+
prevBubbleWidthRef.current = bubbleSize.width;
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
const prevWidth = prevBubbleWidthRef.current;
|
|
593
|
+
const newWidth = bubbleSize.width;
|
|
594
|
+
const widthDelta = newWidth - prevWidth;
|
|
595
|
+
|
|
596
|
+
// Skip if no significant change (avoid jitter)
|
|
597
|
+
if (Math.abs(widthDelta) < 2) {
|
|
598
|
+
return;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// Update ref first
|
|
602
|
+
prevBubbleWidthRef.current = newWidth;
|
|
603
|
+
|
|
604
|
+
// If hidden, only adjust the saved position (not the current animated position)
|
|
605
|
+
if (isHidden) {
|
|
606
|
+
if (savedPositionRef.current) {
|
|
607
|
+
const adjustedX = savedPositionRef.current.x - widthDelta;
|
|
608
|
+
// Clamp to valid bounds
|
|
609
|
+
savedPositionRef.current.x = Math.max(safeAreaInsets.left, Math.min(adjustedX, screenWidth - newWidth - 20));
|
|
477
610
|
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// Get current position
|
|
615
|
+
const currentX = animatedPosition.x.__getValue();
|
|
616
|
+
const currentY = animatedPosition.y.__getValue();
|
|
617
|
+
|
|
618
|
+
// Calculate new X position
|
|
619
|
+
// If bubble grew (positive delta), move left (decrease X)
|
|
620
|
+
// If bubble shrunk (negative delta), move right (increase X)
|
|
621
|
+
const newX = currentX - widthDelta;
|
|
622
|
+
|
|
623
|
+
// Validate new position is within bounds
|
|
624
|
+
const clampedX = Math.max(safeAreaInsets.left, Math.min(newX, screenWidth - 32) // Ensure handle still visible
|
|
625
|
+
);
|
|
626
|
+
|
|
627
|
+
// Only animate if position actually changed
|
|
628
|
+
if (Math.abs(clampedX - currentX) > 1) {
|
|
629
|
+
Animated.timing(animatedPosition, {
|
|
630
|
+
toValue: {
|
|
631
|
+
x: clampedX,
|
|
632
|
+
y: currentY
|
|
633
|
+
},
|
|
634
|
+
duration: 150,
|
|
635
|
+
useNativeDriver: false
|
|
636
|
+
}).start(() => {
|
|
637
|
+
savePosition(clampedX, currentY);
|
|
638
|
+
// Update savedPositionRef so show/hide works correctly
|
|
639
|
+
if (savedPositionRef.current) {
|
|
640
|
+
savedPositionRef.current.x = clampedX;
|
|
641
|
+
}
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
}, [bubbleSize.width, isPositionInitialized, isDragging, isHidden, animatedPosition, screenWidth, safeAreaInsets.left, savePosition]);
|
|
483
645
|
|
|
484
646
|
// Default position when persistence disabled or during onboarding
|
|
485
647
|
useEffect(() => {
|
|
@@ -590,6 +752,18 @@ export function FloatingTools({
|
|
|
590
752
|
// Animate to hidden position (only grabber visible)
|
|
591
753
|
const hiddenX = screenWidth - 32; // Only show the 32px grabber
|
|
592
754
|
setIsHidden(true);
|
|
755
|
+
|
|
756
|
+
// Update savedPositionRef to preserve the Y position when dragging while hidden
|
|
757
|
+
// This ensures that when showing, the bubble restores to the new Y position
|
|
758
|
+
if (savedPositionRef.current) {
|
|
759
|
+
savedPositionRef.current.y = currentY;
|
|
760
|
+
} else {
|
|
761
|
+
// If no saved position exists, create one with default visible X
|
|
762
|
+
savedPositionRef.current = {
|
|
763
|
+
x: screenWidth - bubbleSize.width - 20,
|
|
764
|
+
y: currentY
|
|
765
|
+
};
|
|
766
|
+
}
|
|
593
767
|
Animated.timing(animatedPosition, {
|
|
594
768
|
toValue: {
|
|
595
769
|
x: hiddenX,
|
|
@@ -690,6 +864,12 @@ export function FloatingTools({
|
|
|
690
864
|
|
|
691
865
|
// Width for the minimized tools stack - match the drag handle width
|
|
692
866
|
const minimizedStackWidth = 32;
|
|
867
|
+
|
|
868
|
+
// Don't render until position is initialized (when persistence enabled)
|
|
869
|
+
// This prevents the bubble from appearing at {0,0} before position loads
|
|
870
|
+
if (enablePositionPersistence && !isPositionInitialized) {
|
|
871
|
+
return null;
|
|
872
|
+
}
|
|
693
873
|
return /*#__PURE__*/_jsx(Animated.View, {
|
|
694
874
|
style: bubbleStyle,
|
|
695
875
|
children: /*#__PURE__*/_jsxs(View, {
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"DevToolsSettingsModal.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/DevToolsSettingsModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,EAAE,EAAE,MAAM,OAAO,CAAC;AA4MtE;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;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;AA0DD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAkrChE,CAAC;AAwDF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;CAuD/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingDevTools.web.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingDevTools.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,QAAQ,EAId,MAAM,+BAA+B,CAAC;AAUvC,MAAM,WAAW,qBAAqB;IAEpC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAGjD,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IAGvB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EAAE,YAAY,EACzB,QAAQ,EACR,qBAAqB,EAAE,sBAAsB,EAC7C,mBAAmB,EAAE,oBAAoB,EACzC,IAAI,EACJ,YAAY,EAAE,aAAa,GAC5B,EAAE,qBAAqB,+
|
|
1
|
+
{"version":3,"file":"FloatingDevTools.web.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingDevTools.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,QAAQ,EAId,MAAM,+BAA+B,CAAC;AAUvC,MAAM,WAAW,qBAAqB;IAEpC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAGjD,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IAGvB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EAAE,YAAY,EACzB,QAAQ,EACR,qBAAqB,EAAE,sBAAsB,EAC7C,mBAAmB,EAAE,oBAAoB,EACzC,IAAI,EACJ,YAAY,EAAE,aAAa,GAC5B,EAAE,qBAAqB,+BA8GvB;AAMD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,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;
|
|
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,CAqU9C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoDiscoverPresets.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/autoDiscoverPresets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"autoDiscoverPresets.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/autoDiscoverPresets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,EAAE,CAoKpD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,YAAY,EAAE,GAC1B,YAAY,EAAE,CAahB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialDevTools.d.ts","sourceRoot":"","sources":["../../../../../src/floatingMenu/dial/DialDevTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DialDevTools.d.ts","sourceRoot":"","sources":["../../../../../src/floatingMenu/dial/DialDevTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAkB5E,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAqBlB,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;QAAC,OAAO,CAAC,EAAE,mBAAmB,CAAA;KAAE,KAAK,SAAS,CAAC;IAC/H,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAupB9C,CAAC"}
|
|
@@ -52,5 +52,5 @@ export type FloatingToolsProps = {
|
|
|
52
52
|
* @performance Implements efficient boundary checking and position validation
|
|
53
53
|
* @performance Includes debounced position saving for optimal storage performance
|
|
54
54
|
*/
|
|
55
|
-
export declare function FloatingTools({ enablePositionPersistence, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolsProps): import("react").JSX.Element;
|
|
55
|
+
export declare function FloatingTools({ enablePositionPersistence, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolsProps): import("react").JSX.Element | null;
|
|
56
56
|
//# sourceMappingURL=floatingTools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floatingTools.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/floatingTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,SAAS,EACV,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"floatingTools.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/floatingTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,SAAS,EACV,MAAM,OAAO,CAAC;AAqBf,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjF,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EAAE,QAAQ,EAAE,CAAC;AAkVzB,wBAAgB,OAAO,gCAQtB;AAuBD,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,+BA8CA;AAmBD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uDAAuD;IACvD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,mDAAmD;IACnD,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,aAAa,CAAC,EAC5B,yBAAgC,EAChC,UAAkB,EAClB,gBAAwB,EACxB,QAAQ,EACR,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,uBAA+B,GAChC,EAAE,kBAAkB,sCAsgBpB"}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"DevToolsSettingsModal.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/DevToolsSettingsModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,EAAE,EAAE,MAAM,OAAO,CAAC;AA4MtE;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;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;AA0DD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAkrChE,CAAC;AAwDF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;CAuD/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingDevTools.web.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingDevTools.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,QAAQ,EAId,MAAM,+BAA+B,CAAC;AAUvC,MAAM,WAAW,qBAAqB;IAEpC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAGjD,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IAGvB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EAAE,YAAY,EACzB,QAAQ,EACR,qBAAqB,EAAE,sBAAsB,EAC7C,mBAAmB,EAAE,oBAAoB,EACzC,IAAI,EACJ,YAAY,EAAE,aAAa,GAC5B,EAAE,qBAAqB,+
|
|
1
|
+
{"version":3,"file":"FloatingDevTools.web.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingDevTools.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,QAAQ,EAId,MAAM,+BAA+B,CAAC;AAUvC,MAAM,WAAW,qBAAqB;IAEpC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAGjD,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IAGvB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EAAE,YAAY,EACzB,QAAQ,EACR,qBAAqB,EAAE,sBAAsB,EAC7C,mBAAmB,EAAE,oBAAoB,EACzC,IAAI,EACJ,YAAY,EAAE,aAAa,GAC5B,EAAE,qBAAqB,+BA8GvB;AAMD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,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;
|
|
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,CAqU9C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoDiscoverPresets.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/autoDiscoverPresets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"autoDiscoverPresets.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/autoDiscoverPresets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,EAAE,CAoKpD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,YAAY,EAAE,GAC1B,YAAY,EAAE,CAahB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialDevTools.d.ts","sourceRoot":"","sources":["../../../../../src/floatingMenu/dial/DialDevTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DialDevTools.d.ts","sourceRoot":"","sources":["../../../../../src/floatingMenu/dial/DialDevTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAkB5E,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAqBlB,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;QAAC,OAAO,CAAC,EAAE,mBAAmB,CAAA;KAAE,KAAK,SAAS,CAAC;IAC/H,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAupB9C,CAAC"}
|
|
@@ -52,5 +52,5 @@ export type FloatingToolsProps = {
|
|
|
52
52
|
* @performance Implements efficient boundary checking and position validation
|
|
53
53
|
* @performance Includes debounced position saving for optimal storage performance
|
|
54
54
|
*/
|
|
55
|
-
export declare function FloatingTools({ enablePositionPersistence, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolsProps): import("react").JSX.Element;
|
|
55
|
+
export declare function FloatingTools({ enablePositionPersistence, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolsProps): import("react").JSX.Element | null;
|
|
56
56
|
//# sourceMappingURL=floatingTools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floatingTools.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/floatingTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,SAAS,EACV,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"floatingTools.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/floatingTools.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,SAAS,EACV,MAAM,OAAO,CAAC;AAqBf,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjF,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EAAE,QAAQ,EAAE,CAAC;AAkVzB,wBAAgB,OAAO,gCAQtB;AAuBD,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,+BA8CA;AAmBD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uDAAuD;IACvD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,mDAAmD;IACnD,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,aAAa,CAAC,EAC5B,yBAAgC,EAChC,UAAkB,EAClB,gBAAwB,EACxB,QAAQ,EACR,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,uBAA+B,GAChC,EAAE,kBAAkB,sCAsgBpB"}
|