@buoy-gg/core 2.1.15 → 3.0.0
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/DevToolsSettingsModal.js +4 -34
- package/lib/commonjs/floatingMenu/DevToolsSettingsModal.web.js +3 -25
- package/lib/commonjs/floatingMenu/FloatingDevTools.js +14 -1
- package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +19 -9
- package/lib/commonjs/floatingMenu/FloatingMenu.js +6 -6
- package/lib/commonjs/floatingMenu/defaultConfig.js +1 -1
- package/lib/commonjs/floatingMenu/dial/DialDevTools.js +206 -224
- package/lib/commonjs/floatingMenu/dial/DialDevTools.web.js +82 -7
- package/lib/commonjs/floatingMenu/dial/DialIcon.js +77 -71
- package/lib/commonjs/floatingMenu/dial/DialPagination.js +170 -0
- package/lib/commonjs/floatingMenu/dial/dialUsageStore.js +97 -0
- package/lib/module/floatingMenu/DevToolsSettingsModal.js +5 -35
- package/lib/module/floatingMenu/DevToolsSettingsModal.web.js +4 -28
- package/lib/module/floatingMenu/FloatingDevTools.js +14 -1
- package/lib/module/floatingMenu/FloatingDevTools.web.js +19 -9
- package/lib/module/floatingMenu/FloatingMenu.js +7 -7
- package/lib/module/floatingMenu/defaultConfig.js +1 -1
- package/lib/module/floatingMenu/dial/DialDevTools.js +209 -226
- package/lib/module/floatingMenu/dial/DialDevTools.web.js +82 -7
- package/lib/module/floatingMenu/dial/DialIcon.js +81 -74
- package/lib/module/floatingMenu/dial/DialPagination.js +165 -0
- package/lib/module/floatingMenu/dial/dialUsageStore.js +89 -0
- package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.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/defaultConfig.d.ts +1 -1
- package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts +0 -2
- package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts +7 -2
- package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts.map +1 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialPagination.d.ts +22 -0
- package/lib/typescript/commonjs/floatingMenu/dial/DialPagination.d.ts.map +1 -0
- package/lib/typescript/commonjs/floatingMenu/dial/dialUsageStore.d.ts +34 -0
- package/lib/typescript/commonjs/floatingMenu/dial/dialUsageStore.d.ts.map +1 -0
- package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.web.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/FloatingDevTools.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/defaultConfig.d.ts +1 -1
- package/lib/typescript/module/floatingMenu/defaultConfig.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts +0 -2
- package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/dial/DialDevTools.web.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts +7 -2
- package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts.map +1 -1
- package/lib/typescript/module/floatingMenu/dial/DialPagination.d.ts +22 -0
- package/lib/typescript/module/floatingMenu/dial/DialPagination.d.ts.map +1 -0
- package/lib/typescript/module/floatingMenu/dial/dialUsageStore.d.ts +34 -0
- package/lib/typescript/module/floatingMenu/dial/dialUsageStore.d.ts.map +1 -0
- package/package.json +5 -5
|
@@ -211,8 +211,14 @@ export function DialMenu({
|
|
|
211
211
|
}), []);
|
|
212
212
|
const gridRotations = useMemo(() => getGridLineRotations(), []);
|
|
213
213
|
const positions = useMemo(() => getAllIconPositions(MAX_DIAL_SLOTS, layout.iconRadius), [layout.iconRadius]);
|
|
214
|
+
|
|
215
|
+
// Pagination: tools are split across pages of MAX_DIAL_SLOTS.
|
|
216
|
+
const [currentPage, setCurrentPage] = useState(0);
|
|
217
|
+
const pageCount = Math.max(1, Math.ceil(icons.length / MAX_DIAL_SLOTS));
|
|
218
|
+
const safePage = Math.min(currentPage, pageCount - 1);
|
|
214
219
|
const paddedIcons = useMemo(() => {
|
|
215
|
-
const
|
|
220
|
+
const start = safePage * MAX_DIAL_SLOTS;
|
|
221
|
+
const result = [...icons.slice(start, start + MAX_DIAL_SLOTS)];
|
|
216
222
|
while (result.length < MAX_DIAL_SLOTS) {
|
|
217
223
|
result.push({
|
|
218
224
|
id: `empty-${result.length}`,
|
|
@@ -222,7 +228,7 @@ export function DialMenu({
|
|
|
222
228
|
});
|
|
223
229
|
}
|
|
224
230
|
return result;
|
|
225
|
-
}, [icons]);
|
|
231
|
+
}, [icons, safePage]);
|
|
226
232
|
|
|
227
233
|
// Inject keyframes
|
|
228
234
|
useEffect(() => {
|
|
@@ -399,10 +405,37 @@ export function DialMenu({
|
|
|
399
405
|
}, interaction.iconSelect.actionDelay);
|
|
400
406
|
}, [interaction.iconSelect, handleClose]);
|
|
401
407
|
|
|
408
|
+
// Page navigation - icons are keyed by slot index, so this only swaps
|
|
409
|
+
// their content in place (no remount, no re-animation) for an instant page
|
|
410
|
+
// change.
|
|
411
|
+
const handlePageChange = useCallback(next => {
|
|
412
|
+
if (isClosingRef.current) return;
|
|
413
|
+
const clamped = Math.max(0, Math.min(next, pageCount - 1));
|
|
414
|
+
if (clamped !== safePage) setCurrentPage(clamped);
|
|
415
|
+
}, [pageCount, safePage]);
|
|
416
|
+
|
|
402
417
|
// Computed values
|
|
403
418
|
const buttonContainerSize = layout.buttonSize * dialStyles.centerButton.containerRatio;
|
|
404
419
|
const buttonBorderSize = layout.buttonSize * dialStyles.centerButton.borderRatio;
|
|
405
420
|
const isAnimating = entranceComplete && !isExiting;
|
|
421
|
+
const pagerButtonStyle = disabled => ({
|
|
422
|
+
display: 'flex',
|
|
423
|
+
alignItems: 'center',
|
|
424
|
+
gap: 4,
|
|
425
|
+
padding: '8px 16px',
|
|
426
|
+
borderRadius: 10,
|
|
427
|
+
border: `1px solid ${dialColors.dialBorder}`,
|
|
428
|
+
backgroundColor: dialColors.dialBackground,
|
|
429
|
+
color: disabled ? dialColors.emptyDotBorder : dialColors.dialShadow,
|
|
430
|
+
fontSize: 12,
|
|
431
|
+
fontWeight: 900,
|
|
432
|
+
fontFamily: 'monospace',
|
|
433
|
+
letterSpacing: 1.5,
|
|
434
|
+
textTransform: 'uppercase',
|
|
435
|
+
cursor: disabled ? 'default' : 'pointer',
|
|
436
|
+
opacity: disabled ? 0.4 : 1,
|
|
437
|
+
boxShadow: disabled ? 'none' : `0 0 8px ${dialColors.dialShadow}66`
|
|
438
|
+
});
|
|
406
439
|
return /*#__PURE__*/_jsxs("div", {
|
|
407
440
|
role: "dialog",
|
|
408
441
|
"aria-label": "Dial Menu",
|
|
@@ -427,11 +460,15 @@ export function DialMenu({
|
|
|
427
460
|
backgroundColor: dialColors.dialBackdrop,
|
|
428
461
|
opacity: backdropOpacity
|
|
429
462
|
}
|
|
430
|
-
}), /*#__PURE__*/
|
|
463
|
+
}), /*#__PURE__*/_jsxs("div", {
|
|
431
464
|
style: {
|
|
432
|
-
animation: isAnimating ? cssAnimations.floating : 'none'
|
|
465
|
+
animation: isAnimating ? cssAnimations.floating : 'none',
|
|
466
|
+
display: 'flex',
|
|
467
|
+
flexDirection: 'column',
|
|
468
|
+
alignItems: 'center',
|
|
469
|
+
gap: 16
|
|
433
470
|
},
|
|
434
|
-
children: /*#__PURE__*/_jsx("div", {
|
|
471
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
435
472
|
style: {
|
|
436
473
|
animation: triggerGlitch > 0 && isAnimating ? cssAnimations.glitch : 'none'
|
|
437
474
|
},
|
|
@@ -494,7 +531,7 @@ export function DialMenu({
|
|
|
494
531
|
position: positions[index],
|
|
495
532
|
progress: iconProgress,
|
|
496
533
|
onPress: () => handleIconPress(icon)
|
|
497
|
-
},
|
|
534
|
+
}, index)), /*#__PURE__*/_jsxs("div", {
|
|
498
535
|
style: {
|
|
499
536
|
position: 'absolute',
|
|
500
537
|
left: '50%',
|
|
@@ -584,7 +621,45 @@ export function DialMenu({
|
|
|
584
621
|
})]
|
|
585
622
|
})]
|
|
586
623
|
})
|
|
587
|
-
}, triggerGlitch)
|
|
624
|
+
}, triggerGlitch), pageCount > 1 && /*#__PURE__*/_jsxs("div", {
|
|
625
|
+
style: {
|
|
626
|
+
display: 'flex',
|
|
627
|
+
alignItems: 'center',
|
|
628
|
+
gap: 12,
|
|
629
|
+
opacity: Math.min(1, dialScale)
|
|
630
|
+
},
|
|
631
|
+
children: [/*#__PURE__*/_jsx("button", {
|
|
632
|
+
type: "button",
|
|
633
|
+
"aria-label": "Previous dial page",
|
|
634
|
+
disabled: safePage <= 0,
|
|
635
|
+
onClick: () => handlePageChange(safePage - 1),
|
|
636
|
+
style: pagerButtonStyle(safePage <= 0),
|
|
637
|
+
children: "\u2039 PREV"
|
|
638
|
+
}), /*#__PURE__*/_jsxs("span", {
|
|
639
|
+
style: {
|
|
640
|
+
fontSize: 13,
|
|
641
|
+
fontWeight: 900,
|
|
642
|
+
fontFamily: 'monospace',
|
|
643
|
+
letterSpacing: 2,
|
|
644
|
+
color: '#FFFFFF',
|
|
645
|
+
textShadow: `0 0 6px ${dialColors.dialShadow}`
|
|
646
|
+
},
|
|
647
|
+
children: [String(safePage + 1).padStart(2, '0'), /*#__PURE__*/_jsxs("span", {
|
|
648
|
+
style: {
|
|
649
|
+
color: dialColors.iconLabel,
|
|
650
|
+
textShadow: 'none'
|
|
651
|
+
},
|
|
652
|
+
children: [' / ', String(pageCount).padStart(2, '0')]
|
|
653
|
+
})]
|
|
654
|
+
}), /*#__PURE__*/_jsx("button", {
|
|
655
|
+
type: "button",
|
|
656
|
+
"aria-label": "Next dial page",
|
|
657
|
+
disabled: safePage >= pageCount - 1,
|
|
658
|
+
onClick: () => handlePageChange(safePage + 1),
|
|
659
|
+
style: pagerButtonStyle(safePage >= pageCount - 1),
|
|
660
|
+
children: "NEXT \u203A"
|
|
661
|
+
})]
|
|
662
|
+
})]
|
|
588
663
|
})]
|
|
589
664
|
});
|
|
590
665
|
}
|
|
@@ -1,39 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { useRef } from "react";
|
|
4
|
-
import { StyleSheet, Pressable, View, Text,
|
|
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");
|
|
3
|
+
import { useMemo, useRef } from "react";
|
|
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
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const VIEW_SIZE = layout.iconSize;
|
|
16
|
-
const CIRCLE_SIZE = layout.circleSize;
|
|
17
|
-
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;
|
|
18
11
|
export const DialIcon = ({
|
|
19
12
|
index,
|
|
20
13
|
icon,
|
|
21
14
|
iconsProgress,
|
|
22
15
|
onPress,
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
totalIcons,
|
|
17
|
+
active
|
|
25
18
|
}) => {
|
|
26
|
-
// Use shared position calculation from core
|
|
27
|
-
const iconPosition = getIconPosition(index, totalIcons, layout.iconRadius, DIAL_START_ANGLE);
|
|
28
|
-
const {
|
|
29
|
-
x: finalX,
|
|
30
|
-
y: finalY,
|
|
31
|
-
angle
|
|
32
|
-
} = iconPosition;
|
|
33
|
-
const radius = layout.iconRadius;
|
|
34
|
-
|
|
35
19
|
// Animation values - using interpolation for better performance
|
|
36
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]);
|
|
37
27
|
|
|
38
28
|
// Hover animation on press in/out - using shared config
|
|
39
29
|
// Fallback values in case dialAnimationConfig hasn't loaded yet
|
|
@@ -70,78 +60,92 @@ export const DialIcon = ({
|
|
|
70
60
|
}).start();
|
|
71
61
|
};
|
|
72
62
|
|
|
73
|
-
//
|
|
74
|
-
|
|
63
|
+
// Position + spiral-entrance interpolations depend only on the (fixed) slot
|
|
64
|
+
// index, so compute them once. This keeps re-renders — which happen on every
|
|
65
|
+
// page change as `active` toggles — cheap.
|
|
66
|
+
const motion = useMemo(() => {
|
|
67
|
+
const iconPosition = getIconPosition(index, totalIcons, layout.iconRadius, DIAL_START_ANGLE);
|
|
68
|
+
const {
|
|
69
|
+
x: finalX,
|
|
70
|
+
y: finalY,
|
|
71
|
+
angle
|
|
72
|
+
} = iconPosition;
|
|
73
|
+
const radius = layout.iconRadius;
|
|
74
|
+
const staggerInputRange = getIconStaggerInputRange(index, totalIcons);
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
// Use interpolation for smooth animation that works both directions
|
|
77
|
+
const staggeredProgress = iconsProgress.interpolate({
|
|
78
|
+
inputRange: staggerInputRange,
|
|
79
|
+
outputRange: [0, 0, 1, 1],
|
|
80
|
+
extrapolate: "clamp"
|
|
81
|
+
});
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
// Spiral animation with interpolation
|
|
84
|
+
const spiralRotation = staggeredProgress.interpolate({
|
|
85
|
+
inputRange: [0, 1],
|
|
86
|
+
outputRange: [Math.PI * 2, 0] // Spiral from 2π to 0
|
|
87
|
+
});
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
89
|
+
// Distance from center
|
|
90
|
+
const distance = staggeredProgress.interpolate({
|
|
91
|
+
inputRange: [0, 1],
|
|
92
|
+
outputRange: [0, radius]
|
|
93
|
+
});
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
95
|
+
// Calculate X and Y positions using Animated operations
|
|
96
|
+
const translateX = Animated.add(Animated.multiply(distance, spiralRotation.interpolate({
|
|
97
|
+
inputRange: [0, Math.PI * 2],
|
|
98
|
+
outputRange: [Math.cos(angle), Math.cos(angle + Math.PI * 2)]
|
|
99
|
+
})), staggeredProgress.interpolate({
|
|
100
|
+
inputRange: [0, 1],
|
|
101
|
+
outputRange: [0, finalX - radius * Math.cos(angle + Math.PI * 2)]
|
|
102
|
+
}));
|
|
103
|
+
const translateY = Animated.add(Animated.multiply(distance, spiralRotation.interpolate({
|
|
104
|
+
inputRange: [0, Math.PI * 2],
|
|
105
|
+
outputRange: [Math.sin(angle), Math.sin(angle + Math.PI * 2)]
|
|
106
|
+
})), staggeredProgress.interpolate({
|
|
107
|
+
inputRange: [0, 1],
|
|
108
|
+
outputRange: [0, finalY - radius * Math.sin(angle + Math.PI * 2)]
|
|
109
|
+
}));
|
|
110
110
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
111
|
+
// Opacity animation
|
|
112
|
+
const itemOpacity = staggeredProgress.interpolate({
|
|
113
|
+
inputRange: [0, 0.3, 1],
|
|
114
|
+
outputRange: [0, 0.3, 1]
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
translateX,
|
|
118
|
+
translateY,
|
|
119
|
+
itemOpacity,
|
|
120
|
+
progressScale: staggeredProgress
|
|
121
|
+
};
|
|
122
|
+
}, [index, totalIcons, iconsProgress, layout]);
|
|
119
123
|
|
|
120
124
|
// Main animated style for position and appearance
|
|
121
125
|
const animatedStyle = {
|
|
122
126
|
position: "absolute",
|
|
123
|
-
left:
|
|
127
|
+
left: layout.circleRadius - VIEW_SIZE / 2,
|
|
124
128
|
// Center position
|
|
125
|
-
top:
|
|
129
|
+
top: layout.circleRadius - VIEW_SIZE / 2,
|
|
126
130
|
// Center position
|
|
127
|
-
opacity: itemOpacity,
|
|
131
|
+
opacity: motion.itemOpacity,
|
|
128
132
|
transform: [{
|
|
129
|
-
translateX
|
|
133
|
+
translateX: motion.translateX
|
|
130
134
|
},
|
|
131
135
|
// Apply translation from center
|
|
132
136
|
{
|
|
133
|
-
translateY
|
|
137
|
+
translateY: motion.translateY
|
|
134
138
|
},
|
|
135
139
|
// Apply translation from center
|
|
136
140
|
{
|
|
137
|
-
scale: Animated.multiply(scale, progressScale)
|
|
141
|
+
scale: Animated.multiply(scale, motion.progressScale)
|
|
138
142
|
}]
|
|
139
143
|
};
|
|
140
144
|
|
|
141
145
|
// Check if this is an empty spot (no icon and no iconComponent)
|
|
142
146
|
const isEmpty = icon.icon === null && !icon.iconComponent;
|
|
143
147
|
return /*#__PURE__*/_jsx(Animated.View, {
|
|
144
|
-
style: [styles.view, animatedStyle],
|
|
148
|
+
style: [styles.view, animatedStyle, !active && styles.hidden],
|
|
145
149
|
children: isEmpty ?
|
|
146
150
|
/*#__PURE__*/
|
|
147
151
|
// Empty spot - just show a subtle circle
|
|
@@ -151,7 +155,7 @@ export const DialIcon = ({
|
|
|
151
155
|
style: styles.emptyDot
|
|
152
156
|
})
|
|
153
157
|
}) : /*#__PURE__*/_jsxs(Pressable, {
|
|
154
|
-
onPress: () => onPress(
|
|
158
|
+
onPress: () => onPress(icon),
|
|
155
159
|
onPressIn: handlePressIn,
|
|
156
160
|
onPressOut: handlePressOut,
|
|
157
161
|
style: styles.pressable,
|
|
@@ -189,6 +193,9 @@ const styles = StyleSheet.create({
|
|
|
189
193
|
justifyContent: "center",
|
|
190
194
|
alignItems: "center"
|
|
191
195
|
},
|
|
196
|
+
hidden: {
|
|
197
|
+
display: "none"
|
|
198
|
+
},
|
|
192
199
|
pressable: {
|
|
193
200
|
width: "100%",
|
|
194
201
|
height: "100%",
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useRef } from "react";
|
|
4
|
+
import { Animated, Pressable, StyleSheet, Text, View } from "react-native";
|
|
5
|
+
import { ChevronLeft, ChevronRight, buoyColors } from "@buoy-gg/shared-ui";
|
|
6
|
+
import { dialColors } from "@buoy-gg/floating-tools-core";
|
|
7
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
|
+
/** Pad a 1-based page number to two digits, e.g. 3 -> "03". */
|
|
9
|
+
const pad = n => String(n).padStart(2, "0");
|
|
10
|
+
/**
|
|
11
|
+
* A single pager button. Press feedback is driven by a native-driver
|
|
12
|
+
* `Animated` value via `onPressIn`/`onPressOut` — so the scale reacts
|
|
13
|
+
* instantly on the UI thread, with no JS re-render in the press path.
|
|
14
|
+
*/
|
|
15
|
+
const PagerButton = ({
|
|
16
|
+
side,
|
|
17
|
+
label,
|
|
18
|
+
disabled,
|
|
19
|
+
onPress
|
|
20
|
+
}) => {
|
|
21
|
+
const scale = useRef(new Animated.Value(1)).current;
|
|
22
|
+
const springTo = toValue => {
|
|
23
|
+
Animated.spring(scale, {
|
|
24
|
+
toValue,
|
|
25
|
+
damping: 15,
|
|
26
|
+
stiffness: 400,
|
|
27
|
+
useNativeDriver: true
|
|
28
|
+
}).start();
|
|
29
|
+
};
|
|
30
|
+
const accent = disabled ? dialColors.emptyDotBorder : buoyColors.primary;
|
|
31
|
+
return /*#__PURE__*/_jsx(Animated.View, {
|
|
32
|
+
style: {
|
|
33
|
+
transform: [{
|
|
34
|
+
scale
|
|
35
|
+
}]
|
|
36
|
+
},
|
|
37
|
+
children: /*#__PURE__*/_jsxs(Pressable, {
|
|
38
|
+
accessibilityRole: "button",
|
|
39
|
+
accessibilityLabel: `${side === "prev" ? "Previous" : "Next"} dial page`,
|
|
40
|
+
accessibilityState: {
|
|
41
|
+
disabled
|
|
42
|
+
},
|
|
43
|
+
disabled: disabled,
|
|
44
|
+
onPress: onPress,
|
|
45
|
+
onPressIn: () => !disabled && springTo(0.92),
|
|
46
|
+
onPressOut: () => springTo(1),
|
|
47
|
+
style: [styles.button, disabled && styles.buttonDisabled],
|
|
48
|
+
children: [side === "prev" && /*#__PURE__*/_jsx(ChevronLeft, {
|
|
49
|
+
size: 18,
|
|
50
|
+
color: accent
|
|
51
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
52
|
+
style: [styles.buttonText, disabled && styles.buttonTextDisabled],
|
|
53
|
+
children: label
|
|
54
|
+
}), side === "next" && /*#__PURE__*/_jsx(ChevronRight, {
|
|
55
|
+
size: 18,
|
|
56
|
+
color: accent
|
|
57
|
+
})]
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Prev/Next pager shown below the dial when there are more dial tools than
|
|
64
|
+
* fit on a single page. Tools are ranked by usage, so paging walks from the
|
|
65
|
+
* most-used tools toward the least-used.
|
|
66
|
+
*/
|
|
67
|
+
export const DialPagination = ({
|
|
68
|
+
page,
|
|
69
|
+
pageCount,
|
|
70
|
+
onPrev,
|
|
71
|
+
onNext,
|
|
72
|
+
animatedStyle
|
|
73
|
+
}) => {
|
|
74
|
+
return /*#__PURE__*/_jsxs(Animated.View, {
|
|
75
|
+
style: [styles.container, animatedStyle],
|
|
76
|
+
pointerEvents: "box-none",
|
|
77
|
+
children: [/*#__PURE__*/_jsx(PagerButton, {
|
|
78
|
+
side: "prev",
|
|
79
|
+
label: "PREV",
|
|
80
|
+
disabled: page <= 0,
|
|
81
|
+
onPress: onPrev
|
|
82
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
83
|
+
style: styles.indicator,
|
|
84
|
+
children: /*#__PURE__*/_jsxs(Text, {
|
|
85
|
+
style: styles.indicatorText,
|
|
86
|
+
children: [pad(page + 1), /*#__PURE__*/_jsxs(Text, {
|
|
87
|
+
style: styles.indicatorTextDim,
|
|
88
|
+
children: [" / ", pad(pageCount)]
|
|
89
|
+
})]
|
|
90
|
+
})
|
|
91
|
+
}), /*#__PURE__*/_jsx(PagerButton, {
|
|
92
|
+
side: "next",
|
|
93
|
+
label: "NEXT",
|
|
94
|
+
disabled: page >= pageCount - 1,
|
|
95
|
+
onPress: onNext
|
|
96
|
+
})]
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const styles = StyleSheet.create({
|
|
100
|
+
container: {
|
|
101
|
+
flexDirection: "row",
|
|
102
|
+
alignItems: "center",
|
|
103
|
+
justifyContent: "space-between"
|
|
104
|
+
},
|
|
105
|
+
button: {
|
|
106
|
+
flexDirection: "row",
|
|
107
|
+
alignItems: "center",
|
|
108
|
+
gap: 4,
|
|
109
|
+
paddingHorizontal: 16,
|
|
110
|
+
paddingVertical: 10,
|
|
111
|
+
borderRadius: 10,
|
|
112
|
+
borderWidth: 1,
|
|
113
|
+
borderColor: dialColors.dialBorder,
|
|
114
|
+
backgroundColor: dialColors.dialBackground,
|
|
115
|
+
shadowColor: dialColors.dialShadow,
|
|
116
|
+
shadowOffset: {
|
|
117
|
+
width: 0,
|
|
118
|
+
height: 0
|
|
119
|
+
},
|
|
120
|
+
shadowOpacity: 0.4,
|
|
121
|
+
shadowRadius: 8,
|
|
122
|
+
elevation: 6
|
|
123
|
+
},
|
|
124
|
+
buttonDisabled: {
|
|
125
|
+
opacity: 0.4
|
|
126
|
+
},
|
|
127
|
+
buttonText: {
|
|
128
|
+
color: buoyColors.primary,
|
|
129
|
+
fontSize: 12,
|
|
130
|
+
fontWeight: "900",
|
|
131
|
+
fontFamily: "monospace",
|
|
132
|
+
letterSpacing: 1.5,
|
|
133
|
+
textShadowColor: buoyColors.primary,
|
|
134
|
+
textShadowOffset: {
|
|
135
|
+
width: 0,
|
|
136
|
+
height: 0
|
|
137
|
+
},
|
|
138
|
+
textShadowRadius: 4
|
|
139
|
+
},
|
|
140
|
+
buttonTextDisabled: {
|
|
141
|
+
color: dialColors.emptyDotBorder,
|
|
142
|
+
textShadowRadius: 0
|
|
143
|
+
},
|
|
144
|
+
indicator: {
|
|
145
|
+
paddingHorizontal: 12,
|
|
146
|
+
paddingVertical: 6
|
|
147
|
+
},
|
|
148
|
+
indicatorText: {
|
|
149
|
+
color: "#FFFFFF",
|
|
150
|
+
fontSize: 13,
|
|
151
|
+
fontWeight: "900",
|
|
152
|
+
fontFamily: "monospace",
|
|
153
|
+
letterSpacing: 2,
|
|
154
|
+
textShadowColor: dialColors.dialShadow,
|
|
155
|
+
textShadowOffset: {
|
|
156
|
+
width: 0,
|
|
157
|
+
height: 0
|
|
158
|
+
},
|
|
159
|
+
textShadowRadius: 6
|
|
160
|
+
},
|
|
161
|
+
indicatorTextDim: {
|
|
162
|
+
color: dialColors.iconLabel,
|
|
163
|
+
textShadowRadius: 0
|
|
164
|
+
}
|
|
165
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Dial Usage Store - persists and ranks dial tool usage.
|
|
5
|
+
*
|
|
6
|
+
* Wraps the pure scoring logic from `@buoy-gg/floating-tools-core` with a
|
|
7
|
+
* persisted, in-memory cache. The dial menu uses this to order tools by how
|
|
8
|
+
* recently/frequently they are used, so the most-used tools land on page 1.
|
|
9
|
+
*
|
|
10
|
+
* The cache is loaded eagerly on import so `getRankedToolIds` can run
|
|
11
|
+
* synchronously by the time the dial opens.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { persistentStorage, devToolsStorageKeys } from "@buoy-gg/shared-ui";
|
|
15
|
+
import { rankToolIds, recordUsage, pruneUsage } from "@buoy-gg/floating-tools-core";
|
|
16
|
+
const STORAGE_KEY = devToolsStorageKeys.dial.usage();
|
|
17
|
+
let cache = {};
|
|
18
|
+
let loaded = false;
|
|
19
|
+
let loadPromise = null;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Load persisted usage data into the in-memory cache. Safe to call multiple
|
|
23
|
+
* times — the underlying read happens only once.
|
|
24
|
+
*/
|
|
25
|
+
export function loadDialUsage() {
|
|
26
|
+
if (loadPromise) return loadPromise;
|
|
27
|
+
loadPromise = (async () => {
|
|
28
|
+
try {
|
|
29
|
+
const raw = await persistentStorage.getItem(STORAGE_KEY);
|
|
30
|
+
if (raw) {
|
|
31
|
+
const parsed = JSON.parse(raw);
|
|
32
|
+
if (parsed && typeof parsed === "object") {
|
|
33
|
+
cache = parsed;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} catch {
|
|
37
|
+
// Ignore — start with an empty usage map.
|
|
38
|
+
} finally {
|
|
39
|
+
loaded = true;
|
|
40
|
+
}
|
|
41
|
+
})();
|
|
42
|
+
return loadPromise;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Kick off the load as soon as this module is imported.
|
|
46
|
+
void loadDialUsage();
|
|
47
|
+
|
|
48
|
+
/** Whether the usage cache has finished loading from storage. */
|
|
49
|
+
export function isDialUsageLoaded() {
|
|
50
|
+
return loaded;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Rank tool ids by recency-weighted usage, highest first. Synchronous —
|
|
55
|
+
* operates against the in-memory cache. Never-used tools keep their original
|
|
56
|
+
* order as a tie-breaker.
|
|
57
|
+
*
|
|
58
|
+
* @param orderedIds - Tool ids in their default/registration order
|
|
59
|
+
*/
|
|
60
|
+
export function getRankedToolIds(orderedIds) {
|
|
61
|
+
return rankToolIds(orderedIds, cache, Date.now());
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Record a single press of a tool and persist the updated usage map.
|
|
66
|
+
*
|
|
67
|
+
* @param id - Tool id that was pressed
|
|
68
|
+
*/
|
|
69
|
+
export async function recordToolUsage(id) {
|
|
70
|
+
if (!id) return;
|
|
71
|
+
if (!loaded) await loadDialUsage();
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
cache = pruneUsage(recordUsage(cache, id, now), now);
|
|
74
|
+
try {
|
|
75
|
+
await persistentStorage.setItem(STORAGE_KEY, JSON.stringify(cache));
|
|
76
|
+
} catch {
|
|
77
|
+
// Ignore persistence failure — the in-memory cache is still updated.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Clear all usage data (in-memory and persisted). */
|
|
82
|
+
export async function resetDialUsage() {
|
|
83
|
+
cache = {};
|
|
84
|
+
try {
|
|
85
|
+
await persistentStorage.removeItem(STORAGE_KEY);
|
|
86
|
+
} catch {
|
|
87
|
+
// Ignore — the in-memory cache is already cleared.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -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;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevToolsSettingsModal.web.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/DevToolsSettingsModal.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"DevToolsSettingsModal.web.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/DevToolsSettingsModal.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAeL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAEpB,MAAM,+BAA+B,CAAC;AAOvC,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACzD;AAoQD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,OAAO,EACP,cAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,OAA2B,EAC3B,gBAAgB,GACjB,EAAE,kBAAkB,sCAkWpB"}
|
|
@@ -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,
|
|
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 +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;
|
|
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;AAWvC,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,+BAuHvB;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;
|
|
1
|
+
{"version":3,"file":"FloatingMenu.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/FloatingMenu.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAqD,MAAM,OAAO,CAAC;AAQrF,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"}
|
|
@@ -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
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/defaultConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,SAAS,GACT,SAAS,GACT,OAAO,GACP,mBAAmB,GACnB,cAAc,GACd,eAAe,GACf,mBAAmB,GACnB,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/defaultConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,SAAS,GACT,SAAS,GACT,OAAO,GACP,mBAAmB,GACnB,cAAc,GACd,eAAe,GACf,mBAAmB,GACnB,yBAAyB,GACzB,OAAO,GACP,SAAS,GACT,OAAO,GACP,QAAQ,GACR,eAAe,GACf,cAAc,GACd,oBAAoB,CAAC;AAEzB;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAE/C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,EAAE,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,EAAE,CAAC;AAE7C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAW9E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,cAAc,EAAE,EAC1B,CAAC,SAAS,UAAU,EAAE,EACtB,MAAM,EAAE;IACR,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,IAAI,CAAC,EAAE,CAAC,CAAC;CACV,GAAG;IACF,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;CACrB,CAUA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,cAAc,CAcjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,UAAU,CAazD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,GAAG,EAAE,CAAC,EAAE,EACR,cAAc,EAAE,CAAC,EAAE,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB"}
|