@buoy-gg/env 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.
@@ -24,6 +24,9 @@ function EnvStatsOverview({
24
24
  statusSublabel: healthStatus.toLowerCase(),
25
25
  primaryText: "Environment Configuration",
26
26
  secondaryText: `${healthPercentage}% healthy`,
27
+ testID: "buoy-env-health",
28
+ statusSublabelTestID: "buoy-env-health-status",
29
+ accessibilityLabel: `Environment configuration ${healthStatus.toLowerCase()}, ${healthPercentage}% healthy`,
27
30
  customBadge: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
28
31
  style: [styles.percentBadge, {
29
32
  borderColor: healthColor + "40",
@@ -33,6 +36,7 @@ function EnvStatsOverview({
33
36
  style: [styles.percentText, {
34
37
  color: healthColor
35
38
  }],
39
+ testID: "buoy-env-health-percent",
36
40
  children: [healthPercentage, "%"]
37
41
  })
38
42
  })
@@ -42,8 +46,15 @@ function EnvStatsOverview({
42
46
  style: [styles.statCard, activeFilter === "all" && styles.statCardActive],
43
47
  onPress: () => onFilterChange?.("all"),
44
48
  activeOpacity: 0.8,
49
+ testID: "buoy-env-filter-all",
50
+ accessibilityRole: "button",
51
+ accessibilityLabel: "Show all variables",
52
+ accessibilityState: {
53
+ selected: activeFilter === "all"
54
+ },
45
55
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
46
56
  style: [styles.statValue, activeFilter === "all" && styles.statValueActive],
57
+ testID: "buoy-env-filter-all-count",
47
58
  children: stats.requiredCount + stats.optionalCount
48
59
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
49
60
  style: [styles.statLabel, activeFilter === "all" && styles.statLabelActive],
@@ -53,8 +64,15 @@ function EnvStatsOverview({
53
64
  style: [styles.statCard, activeFilter === "missing" && styles.statCardActive],
54
65
  onPress: () => onFilterChange?.("missing"),
55
66
  activeOpacity: 0.8,
67
+ testID: "buoy-env-filter-missing",
68
+ accessibilityRole: "button",
69
+ accessibilityLabel: "Show missing variables",
70
+ accessibilityState: {
71
+ selected: activeFilter === "missing"
72
+ },
56
73
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
57
74
  style: [styles.statValue, activeFilter === "missing" && styles.statValueActive],
75
+ testID: "buoy-env-filter-missing-count",
58
76
  children: stats.missingCount
59
77
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
60
78
  style: [styles.statLabel, activeFilter === "missing" && styles.statLabelActive],
@@ -64,8 +82,15 @@ function EnvStatsOverview({
64
82
  style: [styles.statCard, activeFilter === "issues" && styles.statCardActive],
65
83
  onPress: () => onFilterChange?.("issues"),
66
84
  activeOpacity: 0.8,
85
+ testID: "buoy-env-filter-issues",
86
+ accessibilityRole: "button",
87
+ accessibilityLabel: "Show variables with issues",
88
+ accessibilityState: {
89
+ selected: activeFilter === "issues"
90
+ },
67
91
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
68
92
  style: [styles.statValue, activeFilter === "issues" && styles.statValueActive],
93
+ testID: "buoy-env-filter-issues-count",
69
94
  children: issuesCount
70
95
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
71
96
  style: [styles.statLabel, activeFilter === "issues" && styles.statLabelActive],
@@ -66,6 +66,11 @@ function EnvVarRow({
66
66
  const keyParts = envVar.key.split("_");
67
67
  const primaryText = keyParts.map(part => part.toLowerCase()).join(" › ");
68
68
 
69
+ // The key is the row's identity everywhere a handle is needed. The visible
70
+ // primary text is the prettified "expo › public › api › url" form, which is
71
+ // no use to a test (or to VoiceOver) trying to find one specific variable.
72
+ const rowID = `buoy-env-row-${envVar.key}`;
73
+
69
74
  // Create expanded content for value and expected value
70
75
  const expandedContent = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
71
76
  style: styles.expandedContainer,
@@ -77,6 +82,7 @@ function EnvVarRow({
77
82
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
78
83
  style: styles.expandedValue,
79
84
  numberOfLines: 3,
85
+ testID: `${rowID}-value`,
80
86
  children: formatValue(envVar.value) || "undefined"
81
87
  })]
82
88
  }), envVar.status === "required_wrong_type" && envVar.expectedType && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
@@ -86,7 +92,8 @@ function EnvVarRow({
86
92
  style: styles.expandedLabel,
87
93
  children: "Type:"
88
94
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TypeBadge, {
89
- type: (0, _envTypeDetector.getEnvVarType)(envVar.value)
95
+ type: (0, _envTypeDetector.getEnvVarType)(envVar.value),
96
+ testID: `${rowID}-actual-type`
90
97
  })]
91
98
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
92
99
  style: styles.expandedRow,
@@ -94,7 +101,8 @@ function EnvVarRow({
94
101
  style: styles.expandedLabel,
95
102
  children: "Expected:"
96
103
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TypeBadge, {
97
- type: envVar.expectedType
104
+ type: envVar.expectedType,
105
+ testID: `${rowID}-expected-type`
98
106
  })]
99
107
  })]
100
108
  }), envVar.status === "required_wrong_value" && envVar.expectedValue && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
@@ -104,6 +112,7 @@ function EnvVarRow({
104
112
  children: "Expected:"
105
113
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
106
114
  style: styles.expandedExpected,
115
+ testID: `${rowID}-expected-value`,
107
116
  children: String(envVar.expectedValue)
108
117
  })]
109
118
  }), envVar.description && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
@@ -113,6 +122,7 @@ function EnvVarRow({
113
122
  children: "Info:"
114
123
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
115
124
  style: styles.expandedDescription,
125
+ testID: `${rowID}-description`,
116
126
  children: envVar.description
117
127
  })]
118
128
  })]
@@ -128,10 +138,19 @@ function EnvVarRow({
128
138
  isExpanded: isExpanded,
129
139
  expandedGlowColor: config.color,
130
140
  customBadge: envVar.expectedType ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TypeBadge, {
131
- type: envVar.expectedType
141
+ type: envVar.expectedType,
142
+ testID: `${rowID}-type-badge`
132
143
  }) : undefined,
133
144
  showChevron: true,
134
- onPress: onPress ? () => onPress(envVar) : undefined
145
+ onPress: onPress ? () => onPress(envVar) : undefined,
146
+ testID: rowID,
147
+ statusTestID: `${rowID}-status`,
148
+ statusSublabelTestID: `${rowID}-category`
149
+ // The status is carried by a coloured dot and a two-word label that the
150
+ // row's container merges away on Fabric — spelled out here so the verdict
151
+ // reaches assistive tech (and Maestro) with the key it belongs to.
152
+ ,
153
+ accessibilityLabel: `${envVar.key}, ${config.label}, ${config.sublabel}`
135
154
  });
136
155
  }
137
156
  const styles = _reactNative.StyleSheet.create({
@@ -140,7 +140,15 @@ function EnvVarsModal({
140
140
  title: isSearchActive ? "" : "Environment Variables",
141
141
  noMargin: isSearchActive,
142
142
  children: isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
143
- style: styles.headerSearchContainer,
143
+ style: styles.headerSearchContainer
144
+ // The field itself is a handle Detox can use but XCUITest
145
+ // cannot: on this RN version a TextInput's testID never
146
+ // reaches the XCUITest element tree — iOS folds the input
147
+ // into the header's accessibility container (the same is
148
+ // true of the network and storage search fields). This
149
+ // wrapper is the handle the a11y lane can actually see.
150
+ ,
151
+ testID: "buoy-env-search-field",
144
152
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
145
153
  size: 12,
146
154
  color: _sharedUi.night.color.textSecondary
@@ -152,13 +160,18 @@ function EnvVarsModal({
152
160
  value: searchQuery,
153
161
  onChangeText: setSearchQuery,
154
162
  autoCorrect: false,
155
- autoCapitalize: "none"
163
+ autoCapitalize: "none",
164
+ testID: "buoy-env-search",
165
+ accessibilityLabel: "Search env keys"
156
166
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
157
167
  onPress: () => {
158
168
  setIsSearchActive(false);
159
169
  setSearchQuery("");
160
170
  },
161
171
  style: styles.clearButton,
172
+ testID: "buoy-env-search-clear",
173
+ accessibilityRole: "button",
174
+ accessibilityLabel: "Clear search",
162
175
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
163
176
  size: 12,
164
177
  color: _sharedUi.night.color.textSecondary
@@ -167,7 +180,9 @@ function EnvVarsModal({
167
180
  })
168
181
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions, {
169
182
  children: !isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.HeaderSearchButton, {
170
- onPress: () => setIsSearchActive(true)
183
+ onPress: () => setIsSearchActive(true),
184
+ testID: "buoy-env-search-open",
185
+ accessibilityLabel: "Search env keys"
171
186
  })
172
187
  })]
173
188
  });
@@ -175,6 +190,7 @@ function EnvVarsModal({
175
190
  style: styles.scrollContainer,
176
191
  contentContainerStyle: styles.contentContainer,
177
192
  showsVerticalScrollIndicator: false,
193
+ testID: "buoy-env-scroll",
178
194
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_EnvStatsOverview.EnvStatsOverview, {
179
195
  stats: stats,
180
196
  healthPercentage: healthPercentage,
@@ -188,11 +204,13 @@ function EnvVarsModal({
188
204
  style: styles.sectionHeader,
189
205
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
190
206
  style: styles.sectionTitle,
207
+ testID: "buoy-env-section-title",
191
208
  children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
192
209
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
193
210
  style: styles.countBadge,
194
211
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
195
212
  style: styles.countText,
213
+ testID: "buoy-env-section-count",
196
214
  children: filteredVars.length
197
215
  })
198
216
  })]
@@ -204,14 +222,17 @@ function EnvVarsModal({
204
222
  })]
205
223
  }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
206
224
  style: styles.emptyState,
225
+ testID: "buoy-env-empty",
207
226
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
208
227
  size: 32,
209
228
  color: _sharedUi.night.color.textTertiary
210
229
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
211
230
  style: styles.emptyTitle,
231
+ testID: "buoy-env-empty-title",
212
232
  children: searchQuery ? "No results found" : "No variables"
213
233
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
214
234
  style: styles.emptySubtitle,
235
+ testID: "buoy-env-empty-subtitle",
215
236
  children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
216
237
  })]
217
238
  })]
@@ -274,7 +295,8 @@ const styles = _reactNative.StyleSheet.create({
274
295
  paddingVertical: 8,
275
296
  borderBottomWidth: 1,
276
297
  borderBottomColor: _sharedUi.buoyColors.border,
277
- backgroundColor: _sharedUi.buoyColors.card
298
+ // Clear, like Bench — the host's hoisted sky shows through the header.
299
+ backgroundColor: "transparent"
278
300
  },
279
301
  scrollContainer: {
280
302
  flex: 1,
@@ -20,6 +20,9 @@ export function EnvStatsOverview({
20
20
  statusSublabel: healthStatus.toLowerCase(),
21
21
  primaryText: "Environment Configuration",
22
22
  secondaryText: `${healthPercentage}% healthy`,
23
+ testID: "buoy-env-health",
24
+ statusSublabelTestID: "buoy-env-health-status",
25
+ accessibilityLabel: `Environment configuration ${healthStatus.toLowerCase()}, ${healthPercentage}% healthy`,
23
26
  customBadge: /*#__PURE__*/_jsx(View, {
24
27
  style: [styles.percentBadge, {
25
28
  borderColor: healthColor + "40",
@@ -29,6 +32,7 @@ export function EnvStatsOverview({
29
32
  style: [styles.percentText, {
30
33
  color: healthColor
31
34
  }],
35
+ testID: "buoy-env-health-percent",
32
36
  children: [healthPercentage, "%"]
33
37
  })
34
38
  })
@@ -38,8 +42,15 @@ export function EnvStatsOverview({
38
42
  style: [styles.statCard, activeFilter === "all" && styles.statCardActive],
39
43
  onPress: () => onFilterChange?.("all"),
40
44
  activeOpacity: 0.8,
45
+ testID: "buoy-env-filter-all",
46
+ accessibilityRole: "button",
47
+ accessibilityLabel: "Show all variables",
48
+ accessibilityState: {
49
+ selected: activeFilter === "all"
50
+ },
41
51
  children: [/*#__PURE__*/_jsx(Text, {
42
52
  style: [styles.statValue, activeFilter === "all" && styles.statValueActive],
53
+ testID: "buoy-env-filter-all-count",
43
54
  children: stats.requiredCount + stats.optionalCount
44
55
  }), /*#__PURE__*/_jsx(Text, {
45
56
  style: [styles.statLabel, activeFilter === "all" && styles.statLabelActive],
@@ -49,8 +60,15 @@ export function EnvStatsOverview({
49
60
  style: [styles.statCard, activeFilter === "missing" && styles.statCardActive],
50
61
  onPress: () => onFilterChange?.("missing"),
51
62
  activeOpacity: 0.8,
63
+ testID: "buoy-env-filter-missing",
64
+ accessibilityRole: "button",
65
+ accessibilityLabel: "Show missing variables",
66
+ accessibilityState: {
67
+ selected: activeFilter === "missing"
68
+ },
52
69
  children: [/*#__PURE__*/_jsx(Text, {
53
70
  style: [styles.statValue, activeFilter === "missing" && styles.statValueActive],
71
+ testID: "buoy-env-filter-missing-count",
54
72
  children: stats.missingCount
55
73
  }), /*#__PURE__*/_jsx(Text, {
56
74
  style: [styles.statLabel, activeFilter === "missing" && styles.statLabelActive],
@@ -60,8 +78,15 @@ export function EnvStatsOverview({
60
78
  style: [styles.statCard, activeFilter === "issues" && styles.statCardActive],
61
79
  onPress: () => onFilterChange?.("issues"),
62
80
  activeOpacity: 0.8,
81
+ testID: "buoy-env-filter-issues",
82
+ accessibilityRole: "button",
83
+ accessibilityLabel: "Show variables with issues",
84
+ accessibilityState: {
85
+ selected: activeFilter === "issues"
86
+ },
63
87
  children: [/*#__PURE__*/_jsx(Text, {
64
88
  style: [styles.statValue, activeFilter === "issues" && styles.statValueActive],
89
+ testID: "buoy-env-filter-issues-count",
65
90
  children: issuesCount
66
91
  }), /*#__PURE__*/_jsx(Text, {
67
92
  style: [styles.statLabel, activeFilter === "issues" && styles.statLabelActive],
@@ -62,6 +62,11 @@ export function EnvVarRow({
62
62
  const keyParts = envVar.key.split("_");
63
63
  const primaryText = keyParts.map(part => part.toLowerCase()).join(" › ");
64
64
 
65
+ // The key is the row's identity everywhere a handle is needed. The visible
66
+ // primary text is the prettified "expo › public › api › url" form, which is
67
+ // no use to a test (or to VoiceOver) trying to find one specific variable.
68
+ const rowID = `buoy-env-row-${envVar.key}`;
69
+
65
70
  // Create expanded content for value and expected value
66
71
  const expandedContent = /*#__PURE__*/_jsxs(View, {
67
72
  style: styles.expandedContainer,
@@ -73,6 +78,7 @@ export function EnvVarRow({
73
78
  }), /*#__PURE__*/_jsx(Text, {
74
79
  style: styles.expandedValue,
75
80
  numberOfLines: 3,
81
+ testID: `${rowID}-value`,
76
82
  children: formatValue(envVar.value) || "undefined"
77
83
  })]
78
84
  }), envVar.status === "required_wrong_type" && envVar.expectedType && /*#__PURE__*/_jsxs(_Fragment, {
@@ -82,7 +88,8 @@ export function EnvVarRow({
82
88
  style: styles.expandedLabel,
83
89
  children: "Type:"
84
90
  }), /*#__PURE__*/_jsx(TypeBadge, {
85
- type: getEnvVarType(envVar.value)
91
+ type: getEnvVarType(envVar.value),
92
+ testID: `${rowID}-actual-type`
86
93
  })]
87
94
  }), /*#__PURE__*/_jsxs(View, {
88
95
  style: styles.expandedRow,
@@ -90,7 +97,8 @@ export function EnvVarRow({
90
97
  style: styles.expandedLabel,
91
98
  children: "Expected:"
92
99
  }), /*#__PURE__*/_jsx(TypeBadge, {
93
- type: envVar.expectedType
100
+ type: envVar.expectedType,
101
+ testID: `${rowID}-expected-type`
94
102
  })]
95
103
  })]
96
104
  }), envVar.status === "required_wrong_value" && envVar.expectedValue && /*#__PURE__*/_jsxs(View, {
@@ -100,6 +108,7 @@ export function EnvVarRow({
100
108
  children: "Expected:"
101
109
  }), /*#__PURE__*/_jsx(Text, {
102
110
  style: styles.expandedExpected,
111
+ testID: `${rowID}-expected-value`,
103
112
  children: String(envVar.expectedValue)
104
113
  })]
105
114
  }), envVar.description && /*#__PURE__*/_jsxs(View, {
@@ -109,6 +118,7 @@ export function EnvVarRow({
109
118
  children: "Info:"
110
119
  }), /*#__PURE__*/_jsx(Text, {
111
120
  style: styles.expandedDescription,
121
+ testID: `${rowID}-description`,
112
122
  children: envVar.description
113
123
  })]
114
124
  })]
@@ -124,10 +134,19 @@ export function EnvVarRow({
124
134
  isExpanded: isExpanded,
125
135
  expandedGlowColor: config.color,
126
136
  customBadge: envVar.expectedType ? /*#__PURE__*/_jsx(TypeBadge, {
127
- type: envVar.expectedType
137
+ type: envVar.expectedType,
138
+ testID: `${rowID}-type-badge`
128
139
  }) : undefined,
129
140
  showChevron: true,
130
- onPress: onPress ? () => onPress(envVar) : undefined
141
+ onPress: onPress ? () => onPress(envVar) : undefined,
142
+ testID: rowID,
143
+ statusTestID: `${rowID}-status`,
144
+ statusSublabelTestID: `${rowID}-category`
145
+ // The status is carried by a coloured dot and a two-word label that the
146
+ // row's container merges away on Fabric — spelled out here so the verdict
147
+ // reaches assistive tech (and Maestro) with the key it belongs to.
148
+ ,
149
+ accessibilityLabel: `${envVar.key}, ${config.label}, ${config.sublabel}`
131
150
  });
132
151
  }
133
152
  const styles = StyleSheet.create({
@@ -135,7 +135,15 @@ export function EnvVarsModal({
135
135
  title: isSearchActive ? "" : "Environment Variables",
136
136
  noMargin: isSearchActive,
137
137
  children: isSearchActive && /*#__PURE__*/_jsxs(View, {
138
- style: styles.headerSearchContainer,
138
+ style: styles.headerSearchContainer
139
+ // The field itself is a handle Detox can use but XCUITest
140
+ // cannot: on this RN version a TextInput's testID never
141
+ // reaches the XCUITest element tree — iOS folds the input
142
+ // into the header's accessibility container (the same is
143
+ // true of the network and storage search fields). This
144
+ // wrapper is the handle the a11y lane can actually see.
145
+ ,
146
+ testID: "buoy-env-search-field",
139
147
  children: [/*#__PURE__*/_jsx(Search, {
140
148
  size: 12,
141
149
  color: night.color.textSecondary
@@ -147,13 +155,18 @@ export function EnvVarsModal({
147
155
  value: searchQuery,
148
156
  onChangeText: setSearchQuery,
149
157
  autoCorrect: false,
150
- autoCapitalize: "none"
158
+ autoCapitalize: "none",
159
+ testID: "buoy-env-search",
160
+ accessibilityLabel: "Search env keys"
151
161
  }), /*#__PURE__*/_jsx(TouchableOpacity, {
152
162
  onPress: () => {
153
163
  setIsSearchActive(false);
154
164
  setSearchQuery("");
155
165
  },
156
166
  style: styles.clearButton,
167
+ testID: "buoy-env-search-clear",
168
+ accessibilityRole: "button",
169
+ accessibilityLabel: "Clear search",
157
170
  children: /*#__PURE__*/_jsx(X, {
158
171
  size: 12,
159
172
  color: night.color.textSecondary
@@ -162,7 +175,9 @@ export function EnvVarsModal({
162
175
  })
163
176
  }), /*#__PURE__*/_jsx(ModalHeader.Actions, {
164
177
  children: !isSearchActive && /*#__PURE__*/_jsx(HeaderSearchButton, {
165
- onPress: () => setIsSearchActive(true)
178
+ onPress: () => setIsSearchActive(true),
179
+ testID: "buoy-env-search-open",
180
+ accessibilityLabel: "Search env keys"
166
181
  })
167
182
  })]
168
183
  });
@@ -170,6 +185,7 @@ export function EnvVarsModal({
170
185
  style: styles.scrollContainer,
171
186
  contentContainerStyle: styles.contentContainer,
172
187
  showsVerticalScrollIndicator: false,
188
+ testID: "buoy-env-scroll",
173
189
  children: [/*#__PURE__*/_jsx(EnvStatsOverview, {
174
190
  stats: stats,
175
191
  healthPercentage: healthPercentage,
@@ -183,11 +199,13 @@ export function EnvVarsModal({
183
199
  style: styles.sectionHeader,
184
200
  children: [/*#__PURE__*/_jsx(Text, {
185
201
  style: styles.sectionTitle,
202
+ testID: "buoy-env-section-title",
186
203
  children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
187
204
  }), /*#__PURE__*/_jsx(View, {
188
205
  style: styles.countBadge,
189
206
  children: /*#__PURE__*/_jsx(Text, {
190
207
  style: styles.countText,
208
+ testID: "buoy-env-section-count",
191
209
  children: filteredVars.length
192
210
  })
193
211
  })]
@@ -199,14 +217,17 @@ export function EnvVarsModal({
199
217
  })]
200
218
  }) : /*#__PURE__*/_jsxs(View, {
201
219
  style: styles.emptyState,
220
+ testID: "buoy-env-empty",
202
221
  children: [/*#__PURE__*/_jsx(Search, {
203
222
  size: 32,
204
223
  color: night.color.textTertiary
205
224
  }), /*#__PURE__*/_jsx(Text, {
206
225
  style: styles.emptyTitle,
226
+ testID: "buoy-env-empty-title",
207
227
  children: searchQuery ? "No results found" : "No variables"
208
228
  }), /*#__PURE__*/_jsx(Text, {
209
229
  style: styles.emptySubtitle,
230
+ testID: "buoy-env-empty-subtitle",
210
231
  children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
211
232
  })]
212
233
  })]
@@ -269,7 +290,8 @@ const styles = StyleSheet.create({
269
290
  paddingVertical: 8,
270
291
  borderBottomWidth: 1,
271
292
  borderBottomColor: buoyColors.border,
272
- backgroundColor: buoyColors.card
293
+ // Clear, like Bench — the host's hoisted sky shows through the header.
294
+ backgroundColor: "transparent"
273
295
  },
274
296
  scrollContainer: {
275
297
  flex: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"EnvStatsOverview.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvStatsOverview.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD,UAAU,qBAAqB;IAC7B,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAoB,EACpB,cAAc,GACf,EAAE,qBAAqB,+BA+GvB"}
1
+ {"version":3,"file":"EnvStatsOverview.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvStatsOverview.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD,UAAU,qBAAqB;IAC7B,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAoB,EACpB,cAAc,GACf,EAAE,qBAAqB,+BAoIvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnvVarRow.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarRow.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,UAAU,cAAc;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAkDD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,cAAc,+BAgExE"}
1
+ {"version":3,"file":"EnvVarRow.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarRow.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,UAAU,cAAc;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAkDD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,cAAc,+BAmGxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnvVarsModal.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarsModal.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAc,MAAM,UAAU,CAAC;AAUtD,UAAU,iBAAiB;IACzB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qFAAqF;IACrF,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,eAAe,EACf,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,MAAc,GACf,EAAE,iBAAiB,sCAmQnB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,eAAe,GAChB,EAAE;IACD,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC,+BASA"}
1
+ {"version":3,"file":"EnvVarsModal.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarsModal.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAc,MAAM,UAAU,CAAC;AAUtD,UAAU,iBAAiB;IACzB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qFAAqF;IACrF,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,eAAe,EACf,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,MAAc,GACf,EAAE,iBAAiB,sCAsRnB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,eAAe,GAChB,EAAE;IACD,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC,+BASA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/env",
3
- "version": "7.0.28",
3
+ "version": "7.0.29",
4
4
  "description": "Environment variable devtool for React Native — auto-discovers EXPO_PUBLIC_ vars, validates types, scores config health. Part of Buoy devtools.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -26,8 +26,8 @@
26
26
  ],
27
27
  "sideEffects": false,
28
28
  "dependencies": {
29
- "@buoy-gg/floating-tools-core": "^7.0.28",
30
- "@buoy-gg/shared-ui": "^7.0.28"
29
+ "@buoy-gg/floating-tools-core": "^7.0.29",
30
+ "@buoy-gg/shared-ui": "^7.0.29"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "react": "*",