@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.
Files changed (55) hide show
  1. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.js +4 -34
  2. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.web.js +3 -25
  3. package/lib/commonjs/floatingMenu/FloatingDevTools.js +14 -1
  4. package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +19 -9
  5. package/lib/commonjs/floatingMenu/FloatingMenu.js +6 -6
  6. package/lib/commonjs/floatingMenu/defaultConfig.js +1 -1
  7. package/lib/commonjs/floatingMenu/dial/DialDevTools.js +206 -224
  8. package/lib/commonjs/floatingMenu/dial/DialDevTools.web.js +82 -7
  9. package/lib/commonjs/floatingMenu/dial/DialIcon.js +77 -71
  10. package/lib/commonjs/floatingMenu/dial/DialPagination.js +170 -0
  11. package/lib/commonjs/floatingMenu/dial/dialUsageStore.js +97 -0
  12. package/lib/module/floatingMenu/DevToolsSettingsModal.js +5 -35
  13. package/lib/module/floatingMenu/DevToolsSettingsModal.web.js +4 -28
  14. package/lib/module/floatingMenu/FloatingDevTools.js +14 -1
  15. package/lib/module/floatingMenu/FloatingDevTools.web.js +19 -9
  16. package/lib/module/floatingMenu/FloatingMenu.js +7 -7
  17. package/lib/module/floatingMenu/defaultConfig.js +1 -1
  18. package/lib/module/floatingMenu/dial/DialDevTools.js +209 -226
  19. package/lib/module/floatingMenu/dial/DialDevTools.web.js +82 -7
  20. package/lib/module/floatingMenu/dial/DialIcon.js +81 -74
  21. package/lib/module/floatingMenu/dial/DialPagination.js +165 -0
  22. package/lib/module/floatingMenu/dial/dialUsageStore.js +89 -0
  23. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
  24. package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.web.d.ts.map +1 -1
  25. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.d.ts.map +1 -1
  26. package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.web.d.ts.map +1 -1
  27. package/lib/typescript/commonjs/floatingMenu/FloatingMenu.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts +1 -1
  29. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts.map +1 -1
  30. package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts +0 -2
  31. package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
  32. package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.web.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts +7 -2
  34. package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/floatingMenu/dial/DialPagination.d.ts +22 -0
  36. package/lib/typescript/commonjs/floatingMenu/dial/DialPagination.d.ts.map +1 -0
  37. package/lib/typescript/commonjs/floatingMenu/dial/dialUsageStore.d.ts +34 -0
  38. package/lib/typescript/commonjs/floatingMenu/dial/dialUsageStore.d.ts.map +1 -0
  39. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts.map +1 -1
  40. package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.web.d.ts.map +1 -1
  41. package/lib/typescript/module/floatingMenu/FloatingDevTools.d.ts.map +1 -1
  42. package/lib/typescript/module/floatingMenu/FloatingDevTools.web.d.ts.map +1 -1
  43. package/lib/typescript/module/floatingMenu/FloatingMenu.d.ts.map +1 -1
  44. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts +1 -1
  45. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts.map +1 -1
  46. package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts +0 -2
  47. package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts.map +1 -1
  48. package/lib/typescript/module/floatingMenu/dial/DialDevTools.web.d.ts.map +1 -1
  49. package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts +7 -2
  50. package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts.map +1 -1
  51. package/lib/typescript/module/floatingMenu/dial/DialPagination.d.ts +22 -0
  52. package/lib/typescript/module/floatingMenu/dial/DialPagination.d.ts.map +1 -0
  53. package/lib/typescript/module/floatingMenu/dial/dialUsageStore.d.ts +34 -0
  54. package/lib/typescript/module/floatingMenu/dial/dialUsageStore.d.ts.map +1 -0
  55. 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 result = [...icons.slice(0, MAX_DIAL_SLOTS)];
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__*/_jsx("div", {
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
- }, icon.id)), /*#__PURE__*/_jsxs("div", {
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, 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");
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
- // Use shared layout calculation
12
- const layout = getDialLayout({
13
- screenWidth: SCREEN_WIDTH
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
- selectedIcon,
24
- totalIcons
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
- // Use shared stagger calculation from core
74
- const staggerInputRange = getIconStaggerInputRange(index, totalIcons);
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
- // 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
- });
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
- // 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
- });
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
- // Distance from center
90
- const distance = staggeredProgress.interpolate({
91
- inputRange: [0, 1],
92
- outputRange: [0, radius]
93
- });
89
+ // Distance from center
90
+ const distance = staggeredProgress.interpolate({
91
+ inputRange: [0, 1],
92
+ outputRange: [0, radius]
93
+ });
94
94
 
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
- }));
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
- // Opacity animation
112
- const itemOpacity = staggeredProgress.interpolate({
113
- inputRange: [0, 0.3, 1],
114
- outputRange: [0, 0.3, 1]
115
- });
116
-
117
- // Scale based on progress
118
- const progressScale = staggeredProgress;
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: CIRCLE_RADIUS - VIEW_SIZE / 2,
127
+ left: layout.circleRadius - VIEW_SIZE / 2,
124
128
  // Center position
125
- top: CIRCLE_RADIUS - VIEW_SIZE / 2,
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(index),
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;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,CAk/BhE,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsSettingsModal.web.d.ts","sourceRoot":"","sources":["../../../../src/floatingMenu/DevToolsSettingsModal.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAiBL,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,sCAiYpB"}
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,6BA4NvB,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;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;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
+ {"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;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
+ {"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;AAE9B;;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"}
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"}