@buoy-gg/shared-ui 7.0.28 → 7.0.29

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 (117) hide show
  1. package/lib/commonjs/JsModal.js +12 -2
  2. package/lib/commonjs/dataViewer/DataTreeActionDock.js +1 -0
  3. package/lib/commonjs/dataViewer/DataViewer.js +6 -3
  4. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +13 -4
  5. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  6. package/lib/commonjs/license/FeatureGate.js +9 -0
  7. package/lib/commonjs/ui/backgrounds/registry.js +3 -2
  8. package/lib/commonjs/ui/backgrounds/variants/meteors.js +222 -78
  9. package/lib/commonjs/ui/components/Badge.js +3 -1
  10. package/lib/commonjs/ui/components/CompactRow.js +10 -1
  11. package/lib/commonjs/ui/components/CopyButton.js +3 -1
  12. package/lib/commonjs/ui/components/DraggableHeader.js +5 -1
  13. package/lib/commonjs/ui/components/DynamicFilterView.js +23 -4
  14. package/lib/commonjs/ui/components/EventStepperFooter.js +8 -0
  15. package/lib/commonjs/ui/components/FilterComponents.js +18 -2
  16. package/lib/commonjs/ui/components/ModalHeader.js +12 -3
  17. package/lib/commonjs/ui/components/PowerToggleButton.js +2 -0
  18. package/lib/commonjs/ui/components/SearchBar.js +6 -1
  19. package/lib/commonjs/ui/components/SectionHeader.js +3 -1
  20. package/lib/commonjs/ui/components/TabSelector.js +15 -4
  21. package/lib/commonjs/ui/components/WindowControls.js +68 -96
  22. package/lib/commonjs/ui/gameUI/constants/gameUIColors.js +12 -8
  23. package/lib/module/JsModal.js +12 -2
  24. package/lib/module/dataViewer/DataTreeActionDock.js +1 -0
  25. package/lib/module/dataViewer/DataViewer.js +6 -3
  26. package/lib/module/dataViewer/VirtualizedDataExplorer.js +13 -4
  27. package/lib/module/hooks/safe-area-impl.js +1 -1
  28. package/lib/module/license/FeatureGate.js +9 -0
  29. package/lib/module/ui/backgrounds/registry.js +3 -2
  30. package/lib/module/ui/backgrounds/variants/meteors.js +224 -80
  31. package/lib/module/ui/components/Badge.js +3 -1
  32. package/lib/module/ui/components/CompactRow.js +10 -1
  33. package/lib/module/ui/components/CopyButton.js +3 -1
  34. package/lib/module/ui/components/DraggableHeader.js +5 -1
  35. package/lib/module/ui/components/DynamicFilterView.js +23 -4
  36. package/lib/module/ui/components/EventStepperFooter.js +8 -0
  37. package/lib/module/ui/components/FilterComponents.js +18 -2
  38. package/lib/module/ui/components/ModalHeader.js +12 -3
  39. package/lib/module/ui/components/PowerToggleButton.js +2 -0
  40. package/lib/module/ui/components/SearchBar.js +6 -1
  41. package/lib/module/ui/components/SectionHeader.js +3 -1
  42. package/lib/module/ui/components/TabSelector.js +15 -4
  43. package/lib/module/ui/components/WindowControls.js +69 -97
  44. package/lib/module/ui/gameUI/constants/gameUIColors.js +12 -8
  45. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/dataViewer/DataTreeActionDock.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/dataViewer/DataViewer.d.ts +2 -0
  48. package/lib/typescript/commonjs/dataViewer/DataViewer.d.ts.map +1 -1
  49. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts +9 -0
  50. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  51. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  52. package/lib/typescript/commonjs/license/FeatureGate.d.ts.map +1 -1
  53. package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts.map +1 -1
  54. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts +22 -6
  55. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/ui/components/Badge.d.ts +3 -1
  57. package/lib/typescript/commonjs/ui/components/Badge.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts +5 -1
  59. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
  60. package/lib/typescript/commonjs/ui/components/CopyButton.d.ts +5 -0
  61. package/lib/typescript/commonjs/ui/components/CopyButton.d.ts.map +1 -1
  62. package/lib/typescript/commonjs/ui/components/DraggableHeader.d.ts +2 -0
  63. package/lib/typescript/commonjs/ui/components/DraggableHeader.d.ts.map +1 -1
  64. package/lib/typescript/commonjs/ui/components/DynamicFilterView.d.ts.map +1 -1
  65. package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/ui/components/FilterComponents.d.ts +10 -2
  67. package/lib/typescript/commonjs/ui/components/FilterComponents.d.ts.map +1 -1
  68. package/lib/typescript/commonjs/ui/components/ModalHeader.d.ts +16 -2
  69. package/lib/typescript/commonjs/ui/components/ModalHeader.d.ts.map +1 -1
  70. package/lib/typescript/commonjs/ui/components/PowerToggleButton.d.ts +4 -1
  71. package/lib/typescript/commonjs/ui/components/PowerToggleButton.d.ts.map +1 -1
  72. package/lib/typescript/commonjs/ui/components/SearchBar.d.ts +7 -1
  73. package/lib/typescript/commonjs/ui/components/SearchBar.d.ts.map +1 -1
  74. package/lib/typescript/commonjs/ui/components/SectionHeader.d.ts +7 -1
  75. package/lib/typescript/commonjs/ui/components/SectionHeader.d.ts.map +1 -1
  76. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts +20 -1
  77. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts.map +1 -1
  78. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
  79. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts +5 -0
  80. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  81. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  82. package/lib/typescript/module/dataViewer/DataTreeActionDock.d.ts.map +1 -1
  83. package/lib/typescript/module/dataViewer/DataViewer.d.ts +2 -0
  84. package/lib/typescript/module/dataViewer/DataViewer.d.ts.map +1 -1
  85. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts +9 -0
  86. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  87. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  88. package/lib/typescript/module/license/FeatureGate.d.ts.map +1 -1
  89. package/lib/typescript/module/ui/backgrounds/registry.d.ts.map +1 -1
  90. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts +22 -6
  91. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts.map +1 -1
  92. package/lib/typescript/module/ui/components/Badge.d.ts +3 -1
  93. package/lib/typescript/module/ui/components/Badge.d.ts.map +1 -1
  94. package/lib/typescript/module/ui/components/CompactRow.d.ts +5 -1
  95. package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
  96. package/lib/typescript/module/ui/components/CopyButton.d.ts +5 -0
  97. package/lib/typescript/module/ui/components/CopyButton.d.ts.map +1 -1
  98. package/lib/typescript/module/ui/components/DraggableHeader.d.ts +2 -0
  99. package/lib/typescript/module/ui/components/DraggableHeader.d.ts.map +1 -1
  100. package/lib/typescript/module/ui/components/DynamicFilterView.d.ts.map +1 -1
  101. package/lib/typescript/module/ui/components/EventStepperFooter.d.ts.map +1 -1
  102. package/lib/typescript/module/ui/components/FilterComponents.d.ts +10 -2
  103. package/lib/typescript/module/ui/components/FilterComponents.d.ts.map +1 -1
  104. package/lib/typescript/module/ui/components/ModalHeader.d.ts +16 -2
  105. package/lib/typescript/module/ui/components/ModalHeader.d.ts.map +1 -1
  106. package/lib/typescript/module/ui/components/PowerToggleButton.d.ts +4 -1
  107. package/lib/typescript/module/ui/components/PowerToggleButton.d.ts.map +1 -1
  108. package/lib/typescript/module/ui/components/SearchBar.d.ts +7 -1
  109. package/lib/typescript/module/ui/components/SearchBar.d.ts.map +1 -1
  110. package/lib/typescript/module/ui/components/SectionHeader.d.ts +7 -1
  111. package/lib/typescript/module/ui/components/SectionHeader.d.ts.map +1 -1
  112. package/lib/typescript/module/ui/components/TabSelector.d.ts +20 -1
  113. package/lib/typescript/module/ui/components/TabSelector.d.ts.map +1 -1
  114. package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
  115. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts +5 -0
  116. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  117. package/package.json +4 -4
@@ -48,6 +48,9 @@ export const EventStepperFooter = /*#__PURE__*/memo(function EventStepperFooter(
48
48
  children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
49
49
  onPress: onPrevious,
50
50
  disabled: isFirstItem,
51
+ testID: "tool-stepper-previous",
52
+ accessibilityRole: "button",
53
+ accessibilityLabel: "Previous",
51
54
  style: [styles.navButton, isNight && styles.nightNavButton, isFirstItem && styles.navButtonDisabled],
52
55
  activeOpacity: 0.7,
53
56
  children: [/*#__PURE__*/_jsx(ChevronLeft, {
@@ -60,15 +63,20 @@ export const EventStepperFooter = /*#__PURE__*/memo(function EventStepperFooter(
60
63
  }), /*#__PURE__*/_jsxs(View, {
61
64
  style: styles.counterContainer,
62
65
  children: [/*#__PURE__*/_jsxs(Text, {
66
+ testID: "tool-stepper-counter",
63
67
  style: [styles.counterText, isNight && styles.nightCounterText],
64
68
  children: [itemLabel, " ", currentIndex + 1, " of ", totalItems]
65
69
  }), subtitle && /*#__PURE__*/_jsx(Text, {
70
+ testID: "tool-stepper-subtitle",
66
71
  style: [styles.subtitleText, isNight && styles.nightSubtitleText],
67
72
  children: subtitle
68
73
  })]
69
74
  }), /*#__PURE__*/_jsxs(TouchableOpacity, {
70
75
  onPress: onNext,
71
76
  disabled: isLastItem,
77
+ testID: "tool-stepper-next",
78
+ accessibilityRole: "button",
79
+ accessibilityLabel: "Next",
72
80
  style: [styles.navButton, isNight && styles.nightNavButton, isLastItem && styles.navButtonDisabled],
73
81
  activeOpacity: 0.7,
74
82
  children: [/*#__PURE__*/_jsx(Text, {
@@ -59,13 +59,16 @@ export function AddFilterInput({
59
59
  onSubmit,
60
60
  onCancel,
61
61
  placeholder = "Add filter...",
62
- color = "#E5E7EB"
62
+ color = "#E5E7EB",
63
+ testID = "buoy-filter-input"
63
64
  }) {
64
65
  return /*#__PURE__*/_jsxs(View, {
65
66
  style: [styles.inputContainer, {
66
67
  borderColor: `${color}40`
67
68
  }],
68
69
  children: [/*#__PURE__*/_jsx(TextInput, {
70
+ testID: testID,
71
+ accessibilityLabel: placeholder,
69
72
  value: value,
70
73
  onChangeText: onChange,
71
74
  onSubmitEditing: onSubmit,
@@ -84,6 +87,9 @@ export function AddFilterInput({
84
87
  style: styles.inputButtons,
85
88
  children: [value.trim() && /*#__PURE__*/_jsx(TouchableOpacity, {
86
89
  onPress: onSubmit,
90
+ testID: `${testID}-add`,
91
+ accessibilityLabel: "Add filter",
92
+ accessibilityRole: "button",
87
93
  style: [styles.inlineAddButton, {
88
94
  backgroundColor: `${color}15`,
89
95
  borderColor: `${color}40`
@@ -96,6 +102,9 @@ export function AddFilterInput({
96
102
  })
97
103
  }), /*#__PURE__*/_jsx(TouchableOpacity, {
98
104
  onPress: onCancel,
105
+ testID: `${testID}-cancel`,
106
+ accessibilityLabel: "Cancel adding filter",
107
+ accessibilityRole: "button",
99
108
  style: styles.cancelButton,
100
109
  children: /*#__PURE__*/_jsx(X, {
101
110
  size: 16,
@@ -111,13 +120,17 @@ export function AddFilterInput({
111
120
  export function AddFilterButton({
112
121
  onPress,
113
122
  color = "#E5E7EB",
114
- label = "Add Filter"
123
+ label = "Add Filter",
124
+ testID = "buoy-filter-add-open"
115
125
  }) {
116
126
  return /*#__PURE__*/_jsxs(TouchableOpacity, {
117
127
  style: [styles.addButton, {
118
128
  borderColor: `${color}40`
119
129
  }],
120
130
  onPress: onPress,
131
+ testID: testID,
132
+ accessibilityLabel: label,
133
+ accessibilityRole: "button",
121
134
  children: [/*#__PURE__*/_jsx(Plus, {
122
135
  size: 14,
123
136
  color: color
@@ -146,6 +159,9 @@ export function FilterList({
146
159
  style: styles.filterItemRow,
147
160
  onPress: () => onRemoveFilter?.(filter),
148
161
  activeOpacity: 0.8,
162
+ testID: `buoy-filter-active-${filter}`,
163
+ accessibilityLabel: `Remove filter ${filter}`,
164
+ accessibilityRole: "button",
149
165
  children: [/*#__PURE__*/_jsx(Text, {
150
166
  style: [styles.filterItemText, {
151
167
  color
@@ -86,7 +86,8 @@ export function Content({
86
86
  subtitle,
87
87
  children,
88
88
  centered,
89
- noMargin
89
+ noMargin,
90
+ testID
90
91
  }) {
91
92
  if (children) {
92
93
  return /*#__PURE__*/_jsx(View, {
@@ -99,10 +100,12 @@ export function Content({
99
100
  children: [title && /*#__PURE__*/_jsx(Text, {
100
101
  style: [styles.headerTitle, centered && styles.headerTitleCentered],
101
102
  numberOfLines: 1,
103
+ testID: testID,
102
104
  children: title
103
105
  }), subtitle && /*#__PURE__*/_jsx(Text, {
104
106
  style: [styles.headerSubtitle, centered && styles.headerSubtitleCentered],
105
107
  numberOfLines: 1,
108
+ testID: testID ? `${testID}-subtitle` : undefined,
106
109
  children: subtitle
107
110
  })]
108
111
  });
@@ -130,7 +133,8 @@ export function HeaderSearch({
130
133
  onChangeText,
131
134
  onCancel,
132
135
  placeholder = "Search...",
133
- autoFocus = true
136
+ autoFocus = true,
137
+ testID
134
138
  }) {
135
139
  const inputRef = useRef(null);
136
140
  useEffect(() => {
@@ -149,10 +153,15 @@ export function HeaderSearch({
149
153
  value: value,
150
154
  onChangeText: onChangeText,
151
155
  autoCorrect: false,
152
- autoCapitalize: "none"
156
+ autoCapitalize: "none",
157
+ testID: testID,
158
+ accessibilityLabel: placeholder
153
159
  }), /*#__PURE__*/_jsx(TouchableOpacity, {
154
160
  onPress: onCancel,
155
161
  style: styles.searchCancelButton,
162
+ accessibilityRole: "button",
163
+ accessibilityLabel: "Clear search",
164
+ testID: testID ? `${testID}-clear` : undefined,
156
165
  children: /*#__PURE__*/_jsx(X, {
157
166
  size: 12,
158
167
  color: night.color.textSecondary
@@ -28,6 +28,7 @@ export function PowerToggleButton({
28
28
  onToggle,
29
29
  size = "medium",
30
30
  accessibilityLabel,
31
+ testID,
31
32
  disabled = false
32
33
  }) {
33
34
  const buttonSize = size === "small" ? 28 : 32;
@@ -36,6 +37,7 @@ export function PowerToggleButton({
36
37
  onPress: onToggle,
37
38
  disabled: disabled,
38
39
  accessibilityLabel: accessibilityLabel,
40
+ testID: testID,
39
41
  accessibilityRole: "button",
40
42
  style: [styles.button, {
41
43
  width: buttonSize,
@@ -18,6 +18,7 @@ export function SearchBar({
18
18
  containerStyle,
19
19
  autoFocus = false,
20
20
  onSubmitEditing,
21
+ testID,
21
22
  returnKeyType
22
23
  }) {
23
24
  const [isFocused, setIsFocused] = useState(false);
@@ -75,10 +76,14 @@ export function SearchBar({
75
76
  autoCapitalize: "none",
76
77
  autoCorrect: false,
77
78
  onSubmitEditing: onSubmitEditing,
78
- returnKeyType: returnKeyType
79
+ returnKeyType: returnKeyType,
80
+ testID: testID
79
81
  }), value.length > 0 && /*#__PURE__*/_jsx(TouchableOpacity, {
80
82
  onPress: handleClear,
81
83
  style: styles.clearButton,
84
+ testID: testID ? `${testID}-clear` : undefined,
85
+ accessibilityLabel: "Clear search",
86
+ accessibilityRole: "button",
82
87
  children: /*#__PURE__*/_jsx(X, {
83
88
  size: 14,
84
89
  color: gameUIColors.secondary
@@ -50,7 +50,8 @@ function Title({
50
50
  function Badge({
51
51
  count,
52
52
  color = buoyColors.primary,
53
- children
53
+ children,
54
+ testID
54
55
  }) {
55
56
  const backgroundColor = `${color}15`;
56
57
  const borderColor = `${color}33`;
@@ -60,6 +61,7 @@ function Badge({
60
61
  borderColor
61
62
  }],
62
63
  children: count !== undefined ? /*#__PURE__*/_jsx(Text, {
64
+ testID: testID,
63
65
  style: [styles.badgeText, {
64
66
  color
65
67
  }],
@@ -15,24 +15,29 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
15
  export function TabSelector({
16
16
  tabs,
17
17
  activeTab,
18
- onTabChange
18
+ onTabChange,
19
+ testIDPrefix
19
20
  }) {
20
21
  return /*#__PURE__*/_jsx(View, {
21
22
  style: styles.container,
22
23
  children: tabs.map(tab => {
23
24
  const active = activeTab === tab.key;
25
+ const disabled = !!tab.disabled && !active;
24
26
  return /*#__PURE__*/_jsxs(TouchableOpacity, {
25
27
  "sentry-label": "ignore user interaction",
28
+ testID: testIDPrefix ? `${testIDPrefix}-${tab.key}` : undefined,
26
29
  accessibilityRole: "tab",
27
30
  accessibilityState: {
28
- selected: active
31
+ selected: active,
32
+ disabled
29
33
  },
30
34
  accessibilityLabel: tab.label,
31
35
  accessibilityHint: `View ${tab.label.toLowerCase()}`,
36
+ disabled: disabled,
32
37
  onPress: () => onTabChange(tab.key),
33
- style: [styles.tabButton, active && styles.tabButtonActive],
38
+ style: [styles.tabButton, active && styles.tabButtonActive, disabled && styles.tabButtonDisabled],
34
39
  children: [/*#__PURE__*/_jsx(Text, {
35
- style: [styles.tabButtonText, active && styles.tabButtonTextActive],
40
+ style: [styles.tabButtonText, active && styles.tabButtonTextActive, disabled && styles.tabButtonTextDisabled],
36
41
  children: tab.label
37
42
  }), active ? /*#__PURE__*/_jsx(View, {
38
43
  style: styles.underline
@@ -69,6 +74,12 @@ const styles = StyleSheet.create({
69
74
  fontWeight: "600",
70
75
  color: night.color.text
71
76
  },
77
+ tabButtonDisabled: {
78
+ opacity: 0.45
79
+ },
80
+ tabButtonTextDisabled: {
81
+ color: night.color.textTertiary
82
+ },
72
83
  underline: {
73
84
  position: "absolute",
74
85
  bottom: 1.5,
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { useState, useRef, useCallback, useEffect } from "react";
4
- import { View, TouchableOpacity, TouchableWithoutFeedback, StyleSheet, Animated, Modal, Platform } from "react-native";
4
+ import { View, TouchableOpacity, StyleSheet, Animated, Platform } from "react-native";
5
5
  import { X, Minus, DockBottom, FloatWindow } from "../../icons/index.js";
6
6
  import { buoyColors } from "../gameUI/constants/gameUIColors.js";
7
7
  import { night } from "../night/nightTheme.js";
@@ -108,6 +108,7 @@ export function WindowControls({
108
108
  style: [styles.dot, styles.closeDot],
109
109
  activeOpacity: 0.8,
110
110
  accessibilityLabel: "Close modal",
111
+ testID: "tool-window-close",
111
112
  accessibilityRole: "button",
112
113
  children: /*#__PURE__*/_jsx(X, {
113
114
  size: ICON_SIZE,
@@ -136,10 +137,8 @@ function ExpandableWindowControls({
136
137
  }) {
137
138
  const isNight = variant === "night";
138
139
  const [expanded, setExpanded] = useState(false);
139
- const [triggerLayout, setTriggerLayout] = useState(null);
140
140
  const expandAnim = useRef(new Animated.Value(0)).current;
141
141
  const dismissTimeout = useRef(null);
142
- const triggerRef = useRef(null);
143
142
  const ToggleModeIcon = mode === "floating" ? DockBottom : FloatWindow;
144
143
  const toggleModeLabel = mode === "floating" ? "Dock to bottom sheet" : "Make floating window";
145
144
  const clearDismissTimer = useCallback(() => {
@@ -148,38 +147,34 @@ function ExpandableWindowControls({
148
147
  dismissTimeout.current = null;
149
148
  }
150
149
  }, []);
150
+
151
+ // JS driver on purpose: native-driven animations on this node silently
152
+ // never run inside JsModal's subtree (the panel sat at opacity 0 forever,
153
+ // making the expanded controls unreachable). The popover is tiny and the
154
+ // animation is 150ms — the JS driver is fine.
151
155
  const collapse = useCallback(() => {
152
156
  clearDismissTimer();
153
157
  Animated.spring(expandAnim, {
154
158
  toValue: 0,
155
159
  tension: 200,
156
160
  friction: 20,
157
- useNativeDriver: true
161
+ useNativeDriver: false
158
162
  }).start(() => {
159
163
  setExpanded(false);
160
164
  });
161
165
  }, [expandAnim, clearDismissTimer]);
162
166
  const expand = useCallback(() => {
163
- // Measure trigger position on screen before expanding
164
- triggerRef.current?.measureInWindow((x, y, width, height) => {
165
- setTriggerLayout({
166
- x,
167
- y,
168
- width,
169
- height
170
- });
171
- setExpanded(true);
172
- Animated.spring(expandAnim, {
173
- toValue: 1,
174
- tension: 180,
175
- friction: 18,
176
- useNativeDriver: true
177
- }).start();
167
+ setExpanded(true);
168
+ Animated.spring(expandAnim, {
169
+ toValue: 1,
170
+ tension: 180,
171
+ friction: 18,
172
+ useNativeDriver: false
173
+ }).start();
178
174
 
179
- // Auto-dismiss
180
- clearDismissTimer();
181
- dismissTimeout.current = setTimeout(collapse, AUTO_DISMISS_MS);
182
- });
175
+ // Auto-dismiss
176
+ clearDismissTimer();
177
+ dismissTimeout.current = setTimeout(collapse, AUTO_DISMISS_MS);
183
178
  }, [expandAnim, collapse, clearDismissTimer]);
184
179
  useEffect(() => {
185
180
  return clearDismissTimer;
@@ -198,17 +193,12 @@ function ExpandableWindowControls({
198
193
  inputRange: [0, 0.5, 1],
199
194
  outputRange: [0, 0.8, 1]
200
195
  });
201
-
202
- // Count visible buttons for layout calculation
203
- const buttonCount = 1 + (onMinimize ? 1 : 0) + (onToggleMode ? 1 : 0);
204
- const expandedWidth = buttonCount * EXPANDED_BUTTON_SIZE + (buttonCount - 1) * EXPANDED_BUTTON_SPACING + EXPANDED_PADDING * 2;
205
- const expandedHeight = EXPANDED_BUTTON_SIZE + EXPANDED_PADDING * 2;
206
196
  return /*#__PURE__*/_jsxs(_Fragment, {
207
197
  children: [/*#__PURE__*/_jsx(TouchableOpacity, {
208
- ref: triggerRef,
209
198
  onPress: expand,
210
199
  activeOpacity: 0.7,
211
200
  accessibilityLabel: "Open window controls",
201
+ testID: "tool-window-controls",
212
202
  accessibilityRole: "button",
213
203
  style: styles.trigger,
214
204
  hitSlop: {
@@ -242,71 +232,52 @@ function ExpandableWindowControls({
242
232
  })
243
233
  })]
244
234
  })
245
- }), expanded && /*#__PURE__*/_jsx(Modal, {
246
- transparent: true,
247
- visible: true,
248
- statusBarTranslucent: true,
249
- children: /*#__PURE__*/_jsx(TouchableWithoutFeedback, {
250
- onPress: collapse,
251
- children: /*#__PURE__*/_jsx(View, {
252
- style: styles.overlay,
253
- children: /*#__PURE__*/_jsx(Animated.View, {
254
- style: [styles.expandedPanel, {
255
- transform: [{
256
- scale
257
- }],
258
- opacity,
259
- // Position the expanded panel anchored to trigger's top-right
260
- top: triggerLayout ? triggerLayout.y - EXPANDED_PADDING : 0,
261
- right: triggerLayout ? Math.max(4,
262
- // screen width minus trigger's right edge
263
- // We don't need Dimensions here since we use measureInWindow
264
- // which gives absolute coords. right = screenWidth - (x + width)
265
- 0) : 0,
266
- // Position using left instead, anchored to trigger's right edge
267
- left: triggerLayout ? triggerLayout.x + triggerLayout.width - expandedWidth : undefined
268
- }],
269
- children: /*#__PURE__*/_jsx(TouchableWithoutFeedback, {
270
- children: /*#__PURE__*/_jsxs(View, {
271
- style: [styles.expandedContainer, isNight && styles.nightExpandedContainer],
272
- children: [onMinimize && /*#__PURE__*/_jsx(TouchableOpacity, {
273
- onPress: () => handleAction(onMinimize),
274
- style: [styles.expandedButton, isNight ? styles.nightMinimizeButton : styles.minimizeButtonExpanded],
275
- activeOpacity: 0.7,
276
- accessibilityLabel: "Minimize modal",
277
- accessibilityRole: "button",
278
- children: /*#__PURE__*/_jsx(Minus, {
279
- size: EXPANDED_ICON_SIZE,
280
- color: isNight ? night.color.warning : "#7A5A00",
281
- strokeWidth: 2
282
- })
283
- }), onToggleMode && /*#__PURE__*/_jsx(TouchableOpacity, {
284
- onPress: () => handleAction(onToggleMode),
285
- style: [styles.expandedButton, isNight ? styles.nightToggleButton : styles.expandButtonExpanded],
286
- activeOpacity: 0.7,
287
- accessibilityLabel: toggleModeLabel,
288
- accessibilityRole: "button",
289
- children: /*#__PURE__*/_jsx(ToggleModeIcon, {
290
- size: EXPANDED_ICON_SIZE,
291
- color: isNight ? night.color.accent : "#004A1A",
292
- strokeWidth: 2
293
- })
294
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
295
- onPress: () => handleAction(onClose),
296
- style: [styles.expandedButton, isNight ? styles.nightCloseButton : styles.closeButtonExpanded],
297
- activeOpacity: 0.7,
298
- accessibilityLabel: "Close modal",
299
- accessibilityRole: "button",
300
- children: /*#__PURE__*/_jsx(X, {
301
- size: EXPANDED_ICON_SIZE,
302
- color: isNight ? night.color.danger : "#4A0000",
303
- strokeWidth: 2
304
- })
305
- })]
306
- })
307
- })
235
+ }), expanded && /*#__PURE__*/_jsx(Animated.View, {
236
+ style: [styles.expandedPanelInline, {
237
+ transform: [{
238
+ scale
239
+ }],
240
+ opacity
241
+ }],
242
+ children: /*#__PURE__*/_jsxs(View, {
243
+ style: [styles.expandedContainer, isNight && styles.nightExpandedContainer],
244
+ children: [onMinimize && /*#__PURE__*/_jsx(TouchableOpacity, {
245
+ onPress: () => handleAction(onMinimize),
246
+ style: [styles.expandedButton, isNight ? styles.nightMinimizeButton : styles.minimizeButtonExpanded],
247
+ activeOpacity: 0.7,
248
+ accessibilityLabel: "Minimize modal",
249
+ testID: "tool-window-minimize",
250
+ accessibilityRole: "button",
251
+ children: /*#__PURE__*/_jsx(Minus, {
252
+ size: EXPANDED_ICON_SIZE,
253
+ color: isNight ? night.color.warning : "#7A5A00",
254
+ strokeWidth: 2
308
255
  })
309
- })
256
+ }), onToggleMode && /*#__PURE__*/_jsx(TouchableOpacity, {
257
+ onPress: () => handleAction(onToggleMode),
258
+ style: [styles.expandedButton, isNight ? styles.nightToggleButton : styles.expandButtonExpanded],
259
+ activeOpacity: 0.7,
260
+ accessibilityLabel: toggleModeLabel,
261
+ testID: "tool-window-mode",
262
+ accessibilityRole: "button",
263
+ children: /*#__PURE__*/_jsx(ToggleModeIcon, {
264
+ size: EXPANDED_ICON_SIZE,
265
+ color: isNight ? night.color.accent : "#004A1A",
266
+ strokeWidth: 2
267
+ })
268
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
269
+ onPress: () => handleAction(onClose),
270
+ style: [styles.expandedButton, isNight ? styles.nightCloseButton : styles.closeButtonExpanded],
271
+ activeOpacity: 0.7,
272
+ accessibilityLabel: "Close modal",
273
+ testID: "tool-window-close",
274
+ accessibilityRole: "button",
275
+ children: /*#__PURE__*/_jsx(X, {
276
+ size: EXPANDED_ICON_SIZE,
277
+ color: isNight ? night.color.danger : "#4A0000",
278
+ strokeWidth: 2
279
+ })
280
+ })]
310
281
  })
311
282
  })]
312
283
  });
@@ -341,11 +312,12 @@ const styles = StyleSheet.create({
341
312
  expandDot: {
342
313
  backgroundColor: COLORS.toggleMode
343
314
  },
344
- overlay: {
345
- flex: 1
346
- },
347
- expandedPanel: {
315
+ // Anchored to the windowControlsContainer (absolute top-right of the
316
+ // modal chrome); grows leftward/downward over the header.
317
+ expandedPanelInline: {
348
318
  position: "absolute",
319
+ top: -EXPANDED_PADDING,
320
+ right: -EXPANDED_PADDING,
349
321
  zIndex: 9999
350
322
  },
351
323
  expandedContainer: {
@@ -202,13 +202,17 @@ export const buoyColors = {
202
202
  // Red
203
203
  info: "#00B8E6" // Cyan for info/devices
204
204
  };
205
- // Fixed dial colors for cyberpunk theme
205
+ /**
206
+ * LEGACY copy of the dial palette — the source of truth is `dialColors` in
207
+ * @buoy-gg/floating-tools-core (`src/dial.ts`); keep the two in sync.
208
+ * Values mirror the night theme (see `ui/night/nightTheme.ts`).
209
+ */
206
210
  export const dialColors = {
207
- dialBackground: gameUIColors.pureBlack,
208
- dialGradient1: `${gameUIColors.info}10`,
209
- dialGradient2: `${gameUIColors.info}08`,
210
- dialGradient3: `${gameUIColors.info}15`,
211
- dialBorder: `${gameUIColors.info}40`,
212
- dialShadow: gameUIColors.info,
213
- dialGridLine: `${gameUIColors.info}26`
211
+ dialBackground: "#050505",
212
+ dialGradient1: "rgba(255, 255, 255, 0.05)",
213
+ dialGradient2: "rgba(255, 255, 255, 0.03)",
214
+ dialGradient3: "rgba(255, 255, 255, 0.06)",
215
+ dialBorder: "rgba(255, 255, 255, 0.12)",
216
+ dialShadow: "#000000",
217
+ dialGridLine: "rgba(255, 255, 255, 0.08)"
214
218
  };
@@ -1 +1 @@
1
- {"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AA+GtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC;;;+BAG2B;IAC3B,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,CAAC;IACtE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AA8wDD,eAAO,MAAM,OAAO,oDAAyB,CAAC"}
1
+ {"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AA+GtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC;;;+BAG2B;IAC3B,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,CAAC;IACtE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAuxDD,eAAO,MAAM,OAAO,oDAAyB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataTreeActionDock.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/DataTreeActionDock.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAIL,KAAK,iBAAiB,EAGvB,MAAM,eAAe,CAAC;AAqCvB,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,IAAI,EAAE,OAAO,CAAC;IACd,+DAA+D;IAC/D,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,iCAAiC;IACjC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,sEAAsE;IACtE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvC,8DAA8D;IAC9D,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAoCD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,SAAS,EACT,MAAM,EACN,YAAY,EACZ,WAAW,EACX,kBAAyB,GAC1B,EAAE,uBAAuB,+BAwCzB"}
1
+ {"version":3,"file":"DataTreeActionDock.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/DataTreeActionDock.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAIL,KAAK,iBAAiB,EAGvB,MAAM,eAAe,CAAC;AAqCvB,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,IAAI,EAAE,OAAO,CAAC;IACd,+DAA+D;IAC/D,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,iCAAiC;IACjC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,sEAAsE;IACtE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvC,8DAA8D;IAC9D,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAqCD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,SAAS,EACT,MAAM,EACN,YAAY,EACZ,WAAW,EACX,kBAAyB,GAC1B,EAAE,uBAAuB,+BAwCzB"}
@@ -22,6 +22,8 @@ interface DataViewerProps {
22
22
  inlineEditPath?: string[] | null;
23
23
  renderInlineEditor?: (selection: DataTreeSelection) => ReactElement | null;
24
24
  selectPath?: string[] | null;
25
+ /** Root of each tree row's testID — see `VirtualizedDataExplorer`. */
26
+ testIDPrefix?: string;
25
27
  }
26
28
  /**
27
29
  * DataViewer component that combines VirtualizedDataExplorer with TypeLegend
@@ -1 +1 @@
1
- {"version":3,"file":"DataViewer.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/DataViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGtE,OAAO,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sFAAsF;IACtF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IAClE,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7D,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,YAAY,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA2J1C,CAAC"}
1
+ {"version":3,"file":"DataViewer.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/DataViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGtE,OAAO,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sFAAsF;IACtF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IAClE,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7D,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,YAAY,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA8J1C,CAAC"}
@@ -37,6 +37,15 @@ interface VirtualizedDataExplorerProps {
37
37
  * taps, and only re-syncs when this path CHANGES.
38
38
  */
39
39
  selectPath?: string[] | null;
40
+ /**
41
+ * Root of each row's testID: `${testIDPrefix}-${item.id}` (item.id is the
42
+ * dotted path from the root).
43
+ *
44
+ * Configurable because two trees can be on screen at once — the storage
45
+ * editor overlays the expanded card that opened it, and both render the same
46
+ * value — which would otherwise give every row a twin.
47
+ */
48
+ testIDPrefix?: string;
40
49
  }
41
50
  export declare const VirtualizedDataExplorer: FC<VirtualizedDataExplorerProps>;
42
51
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedDataExplorer.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/VirtualizedDataExplorer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAOL,EAAE,EACF,YAAY,EACb,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA2oC7D,UAAU,4BAA4B;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IAClE;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7D,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,YAAY,GAAG,IAAI,CAAC;IAC3E;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAqUpE,CAAC"}
1
+ {"version":3,"file":"VirtualizedDataExplorer.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/VirtualizedDataExplorer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAOL,EAAE,EACF,YAAY,EACb,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAmpC7D,UAAU,4BAA4B;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IAClE;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7D,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,YAAY,GAAG,IAAI,CAAC;IAC3E;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAuUpE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated safe area implementation
3
3
  * Detected: none
4
- * Generated at: 2026-08-21T15:43:18.203Z
4
+ * Generated at: 2026-08-24T19:34:02.929Z
5
5
  *
6
6
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureGate.d.ts","sourceRoot":"","sources":["../../../../src/license/FeatureGate.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,SAAS,EAAyB,MAAM,OAAO,CAAC;AAQhE,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAGjD;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,sBAUrD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,eAAO,MAAM,eAAe,GAAI,8CAK7B,oBAAoB,sBAiBtB,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,qDAK3B;IACD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB,sBA6FA,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,GAAI,mEAMzB,gBAAgB,sBAiClB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,IAAI;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAeA;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,GAAI,yCAI9B,qBAAqB,sBA+DvB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,qEAO1B,iBAAiB,6BAwInB,CAAC"}
1
+ {"version":3,"file":"FeatureGate.d.ts","sourceRoot":"","sources":["../../../../src/license/FeatureGate.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,SAAS,EAAyB,MAAM,OAAO,CAAC;AAQhE,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAGjD;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,sBAUrD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,eAAO,MAAM,eAAe,GAAI,8CAK7B,oBAAoB,sBAiBtB,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,qDAK3B;IACD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB,sBA6FA,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,GAAI,mEAMzB,gBAAgB,sBAiClB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,IAAI;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAeA;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,GAAI,yCAI9B,qBAAqB,sBA+DvB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,qEAO1B,iBAAiB,6BAiJnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../../src/ui/backgrounds/registry.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,EAAE,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,SAAS,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;CACzD;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EA0DhD,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,YAAoB,CAAC;AAEtD,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAGpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAGxD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,gBAAgB,CAE5D"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../../src/ui/backgrounds/registry.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,EAAE,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,SAAS,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;CACzD;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EA2DhD,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,YAAoB,CAAC;AAEtD,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAGpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAGxD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,gBAAgB,CAE5D"}
@@ -2,12 +2,28 @@
2
2
  * MeteorShower — shooting stars that slam into the walls.
3
3
  *
4
4
  * Each meteor streaks in from off-screen, hits an EDGE of the surface, and
5
- * bursts: a flash, an expanding shockwave ring (half-clipped by the wall,
6
- * which is what sells the impact), and a handful of sparks ricocheting back
7
- * into the room. The whole life cycle — parked invisible, streak, impact,
8
- * decay — is keyframed into interpolate stops on ONE plain native loop per
9
- * meteor; `Animated.sequence([timing, loop])` silently fails to drive
10
- * natively, so nothing here sequences.
5
+ * blows out like a firework: a flash, then a fan of streak RAYS that shoot
6
+ * back into the room — each ray grows out of the impact point while its tail
7
+ * chases the head, so it reads as a burning trail rather than a ring — with
8
+ * ember dots at the tips that decelerate, droop under gravity and gutter out.
9
+ * The whole life cycle — parked invisible, streak, impact, decay — is
10
+ * keyframed into interpolate stops on ONE plain native loop per meteor;
11
+ * `Animated.sequence([timing, loop])` silently fails to drive natively, so
12
+ * nothing here sequences.
13
+ *
14
+ * Each meteor also rolls WHAT IT'S MADE OF once per mount — a weighted draw
15
+ * over the real emission-line palette (sodium orange-yellow, iron yellow,
16
+ * magnesium blue-green, calcium violet, shocked atmospheric N₂/O₂ red,
17
+ * ionized-air blue-white) — and that mineral tints streak, trail, flash,
18
+ * rays and embers as one. See `MINERALS`.
19
+ *
20
+ * The ray trick, since there is no `transformOrigin`: a bar of full length
21
+ * `dist` is CENTERED on the impact point, rotated to its heading, then driven
22
+ * with `[{rotate}, {translateX}, {scaleX}]`. Rotate is outermost, so the
23
+ * translate runs along the ray's own axis; scaleX squashes about the bar's
24
+ * center, and translating by the midpoint of (head, tail) while scaling by
25
+ * (head − tail) puts the visible segment exactly between the two — a line
26
+ * growing out of the burst with both endpoints scripted.
11
27
  *
12
28
  * This used to be a standalone "Meteors" preset with its own 40-star sky;
13
29
  * that scene was folded into Deep Field (which supplies the far better sky),
@@ -1 +1 @@
1
- {"version":3,"file":"meteors.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/backgrounds/variants/meteors.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAsNvD;;;GAGG;AACH,eAAO,MAAM,YAAY,8DAQvB,CAAC"}
1
+ {"version":3,"file":"meteors.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/backgrounds/variants/meteors.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAOH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AA+YvD;;;GAGG;AACH,eAAO,MAAM,YAAY,8DAQvB,CAAC"}