@buoy-gg/env 7.0.4 → 7.0.5

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.
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.EnvToolView = EnvToolView;
6
7
  exports.EnvVarsModal = EnvVarsModal;
7
8
  var _sharedUi = require("@buoy-gg/shared-ui");
8
9
  var _react = require("react");
@@ -23,7 +24,8 @@ function EnvVarsModal({
23
24
  requiredEnvVars,
24
25
  onBack,
25
26
  onMinimize,
26
- enableSharedModalDimensions = false
27
+ enableSharedModalDimensions = false,
28
+ inline = false
27
29
  }) {
28
30
  const [activeFilter, setActiveFilter] = (0, _react.useState)("all");
29
31
  const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
@@ -131,50 +133,108 @@ function EnvVarsModal({
131
133
  const healthColor = healthPercentage === 100 ? _sharedUi.buoyColors.success : healthPercentage >= 75 ? _sharedUi.buoyColors.warning : healthPercentage >= 50 ? _sharedUi.buoyColors.error : _sharedUi.buoyColors.error;
132
134
  if (!visible) return null;
133
135
  const storagePrefix = enableSharedModalDimensions ? _sharedUi.devToolsStorageKeys.modal.root() : _sharedUi.devToolsStorageKeys.env.modal();
136
+ const header = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
137
+ children: [onBack && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
138
+ onBack: onBack
139
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
140
+ title: isSearchActive ? "" : "Environment Variables",
141
+ noMargin: isSearchActive,
142
+ children: isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
143
+ style: styles.headerSearchContainer,
144
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
145
+ size: 12,
146
+ color: _sharedUi.buoyColors.textSecondary
147
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
148
+ ref: searchInputRef,
149
+ style: styles.headerSearchInput,
150
+ placeholder: "Search env keys...",
151
+ placeholderTextColor: _sharedUi.buoyColors.textMuted,
152
+ value: searchQuery,
153
+ onChangeText: setSearchQuery,
154
+ autoCorrect: false,
155
+ autoCapitalize: "none"
156
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
157
+ onPress: () => {
158
+ setIsSearchActive(false);
159
+ setSearchQuery("");
160
+ },
161
+ style: styles.clearButton,
162
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
163
+ size: 12,
164
+ color: _sharedUi.buoyColors.textSecondary
165
+ })
166
+ })]
167
+ })
168
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions, {
169
+ children: !isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.HeaderSearchButton, {
170
+ onPress: () => setIsSearchActive(true)
171
+ })
172
+ })]
173
+ });
174
+ const body = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
175
+ style: styles.scrollContainer,
176
+ contentContainerStyle: styles.contentContainer,
177
+ showsVerticalScrollIndicator: false,
178
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_EnvStatsOverview.EnvStatsOverview, {
179
+ stats: stats,
180
+ healthPercentage: healthPercentage,
181
+ healthStatus: healthStatus,
182
+ healthColor: healthColor,
183
+ activeFilter: activeFilter,
184
+ onFilterChange: setActiveFilter
185
+ }), filteredVars.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
186
+ style: styles.varsSection,
187
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
188
+ style: styles.sectionHeader,
189
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
190
+ style: styles.sectionTitle,
191
+ children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
192
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
193
+ style: styles.countBadge,
194
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
195
+ style: styles.countText,
196
+ children: filteredVars.length
197
+ })
198
+ })]
199
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_EnvVarSection.EnvVarSection, {
200
+ title: "",
201
+ count: 0,
202
+ vars: filteredVars,
203
+ emptyMessage: ""
204
+ })]
205
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
206
+ style: styles.emptyState,
207
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
208
+ size: 32,
209
+ color: _sharedUi.buoyColors.textMuted
210
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
211
+ style: styles.emptyTitle,
212
+ children: searchQuery ? "No results found" : "No variables"
213
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
214
+ style: styles.emptySubtitle,
215
+ children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
216
+ })]
217
+ })]
218
+ });
219
+
220
+ // The ONLY difference between the phone and the desktop dashboard is which
221
+ // shell the header and body go in. Everything above this line is shared.
222
+ if (inline) {
223
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
224
+ style: styles.inlineRoot,
225
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
226
+ style: styles.inlineHeader,
227
+ children: header
228
+ }), body]
229
+ });
230
+ }
134
231
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
135
232
  visible: visible,
136
233
  onClose: onClose,
137
234
  onMinimize: onMinimize,
138
235
  persistenceKey: storagePrefix,
139
236
  header: {
140
- customContent: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
141
- children: [onBack && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
142
- onBack: onBack
143
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
144
- title: isSearchActive ? "" : "Environment Variables",
145
- noMargin: isSearchActive,
146
- children: isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
147
- style: styles.headerSearchContainer,
148
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
149
- size: 12,
150
- color: _sharedUi.buoyColors.textSecondary
151
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
152
- ref: searchInputRef,
153
- style: styles.headerSearchInput,
154
- placeholder: "Search env keys...",
155
- placeholderTextColor: _sharedUi.buoyColors.textMuted,
156
- value: searchQuery,
157
- onChangeText: setSearchQuery,
158
- autoCorrect: false,
159
- autoCapitalize: "none"
160
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
161
- onPress: () => {
162
- setIsSearchActive(false);
163
- setSearchQuery("");
164
- },
165
- style: styles.clearButton,
166
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
167
- size: 12,
168
- color: _sharedUi.buoyColors.textSecondary
169
- })
170
- })]
171
- })
172
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions, {
173
- children: !isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.HeaderSearchButton, {
174
- onPress: () => setIsSearchActive(true)
175
- })
176
- })]
177
- }),
237
+ customContent: header,
178
238
  showToggleButton: true
179
239
  },
180
240
  onModeChange: handleModeChange,
@@ -182,54 +242,38 @@ function EnvVarsModal({
182
242
  initialMode: "bottomSheet",
183
243
  enableGlitchEffects: true,
184
244
  styles: {},
185
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
186
- style: styles.scrollContainer,
187
- contentContainerStyle: styles.contentContainer,
188
- showsVerticalScrollIndicator: false,
189
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_EnvStatsOverview.EnvStatsOverview, {
190
- stats: stats,
191
- healthPercentage: healthPercentage,
192
- healthStatus: healthStatus,
193
- healthColor: healthColor,
194
- activeFilter: activeFilter,
195
- onFilterChange: setActiveFilter
196
- }), filteredVars.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
197
- style: styles.varsSection,
198
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
199
- style: styles.sectionHeader,
200
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
201
- style: styles.sectionTitle,
202
- children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
203
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
204
- style: styles.countBadge,
205
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
206
- style: styles.countText,
207
- children: filteredVars.length
208
- })
209
- })]
210
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_EnvVarSection.EnvVarSection, {
211
- title: "",
212
- count: 0,
213
- vars: filteredVars,
214
- emptyMessage: ""
215
- })]
216
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
217
- style: styles.emptyState,
218
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
219
- size: 32,
220
- color: _sharedUi.buoyColors.textMuted
221
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
222
- style: styles.emptyTitle,
223
- children: searchQuery ? "No results found" : "No variables"
224
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
225
- style: styles.emptySubtitle,
226
- children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
227
- })]
228
- })]
229
- })
245
+ children: body
246
+ });
247
+ }
248
+
249
+ /**
250
+ * The same env tool as `EnvVarsModal`, rendered INLINE for hosts that place
251
+ * tools in a panel. Exists so there is exactly one implementation — the desktop
252
+ * dashboard used to ship its own copy of this component's internals.
253
+ */
254
+ function EnvToolView({
255
+ requiredEnvVars
256
+ }) {
257
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(EnvVarsModal, {
258
+ inline: true,
259
+ visible: true,
260
+ requiredEnvVars: requiredEnvVars,
261
+ onClose: () => {}
230
262
  });
231
263
  }
232
264
  const styles = _reactNative.StyleSheet.create({
265
+ inlineRoot: {
266
+ flex: 1,
267
+ minHeight: 0,
268
+ backgroundColor: _sharedUi.buoyColors.base
269
+ },
270
+ inlineHeader: {
271
+ paddingHorizontal: 12,
272
+ paddingVertical: 8,
273
+ borderBottomWidth: 1,
274
+ borderBottomColor: _sharedUi.buoyColors.border,
275
+ backgroundColor: _sharedUi.buoyColors.card
276
+ },
233
277
  scrollContainer: {
234
278
  flex: 1,
235
279
  backgroundColor: _sharedUi.buoyColors.base
@@ -7,9 +7,16 @@ var _exportNames = {
7
7
  envToolPreset: true,
8
8
  createEnvTool: true,
9
9
  EnvVarsModal: true,
10
+ EnvToolView: true,
10
11
  createEnvSyncAdapter: true,
11
12
  setRemoteEnv: true
12
13
  };
14
+ Object.defineProperty(exports, "EnvToolView", {
15
+ enumerable: true,
16
+ get: function () {
17
+ return _EnvVarsModal.EnvToolView;
18
+ }
19
+ });
13
20
  Object.defineProperty(exports, "EnvVarsModal", {
14
21
  enumerable: true,
15
22
  get: function () {
@@ -19,7 +19,8 @@ export function EnvVarsModal({
19
19
  requiredEnvVars,
20
20
  onBack,
21
21
  onMinimize,
22
- enableSharedModalDimensions = false
22
+ enableSharedModalDimensions = false,
23
+ inline = false
23
24
  }) {
24
25
  const [activeFilter, setActiveFilter] = useState("all");
25
26
  const [isSearchActive, setIsSearchActive] = useState(false);
@@ -127,50 +128,108 @@ export function EnvVarsModal({
127
128
  const healthColor = healthPercentage === 100 ? buoyColors.success : healthPercentage >= 75 ? buoyColors.warning : healthPercentage >= 50 ? buoyColors.error : buoyColors.error;
128
129
  if (!visible) return null;
129
130
  const storagePrefix = enableSharedModalDimensions ? devToolsStorageKeys.modal.root() : devToolsStorageKeys.env.modal();
131
+ const header = /*#__PURE__*/_jsxs(ModalHeader, {
132
+ children: [onBack && /*#__PURE__*/_jsx(ModalHeader.Navigation, {
133
+ onBack: onBack
134
+ }), /*#__PURE__*/_jsx(ModalHeader.Content, {
135
+ title: isSearchActive ? "" : "Environment Variables",
136
+ noMargin: isSearchActive,
137
+ children: isSearchActive && /*#__PURE__*/_jsxs(View, {
138
+ style: styles.headerSearchContainer,
139
+ children: [/*#__PURE__*/_jsx(Search, {
140
+ size: 12,
141
+ color: buoyColors.textSecondary
142
+ }), /*#__PURE__*/_jsx(TextInput, {
143
+ ref: searchInputRef,
144
+ style: styles.headerSearchInput,
145
+ placeholder: "Search env keys...",
146
+ placeholderTextColor: buoyColors.textMuted,
147
+ value: searchQuery,
148
+ onChangeText: setSearchQuery,
149
+ autoCorrect: false,
150
+ autoCapitalize: "none"
151
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
152
+ onPress: () => {
153
+ setIsSearchActive(false);
154
+ setSearchQuery("");
155
+ },
156
+ style: styles.clearButton,
157
+ children: /*#__PURE__*/_jsx(X, {
158
+ size: 12,
159
+ color: buoyColors.textSecondary
160
+ })
161
+ })]
162
+ })
163
+ }), /*#__PURE__*/_jsx(ModalHeader.Actions, {
164
+ children: !isSearchActive && /*#__PURE__*/_jsx(HeaderSearchButton, {
165
+ onPress: () => setIsSearchActive(true)
166
+ })
167
+ })]
168
+ });
169
+ const body = /*#__PURE__*/_jsxs(ScrollView, {
170
+ style: styles.scrollContainer,
171
+ contentContainerStyle: styles.contentContainer,
172
+ showsVerticalScrollIndicator: false,
173
+ children: [/*#__PURE__*/_jsx(EnvStatsOverview, {
174
+ stats: stats,
175
+ healthPercentage: healthPercentage,
176
+ healthStatus: healthStatus,
177
+ healthColor: healthColor,
178
+ activeFilter: activeFilter,
179
+ onFilterChange: setActiveFilter
180
+ }), filteredVars.length > 0 ? /*#__PURE__*/_jsxs(View, {
181
+ style: styles.varsSection,
182
+ children: [/*#__PURE__*/_jsxs(View, {
183
+ style: styles.sectionHeader,
184
+ children: [/*#__PURE__*/_jsx(Text, {
185
+ style: styles.sectionTitle,
186
+ children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
187
+ }), /*#__PURE__*/_jsx(View, {
188
+ style: styles.countBadge,
189
+ children: /*#__PURE__*/_jsx(Text, {
190
+ style: styles.countText,
191
+ children: filteredVars.length
192
+ })
193
+ })]
194
+ }), /*#__PURE__*/_jsx(EnvVarSection, {
195
+ title: "",
196
+ count: 0,
197
+ vars: filteredVars,
198
+ emptyMessage: ""
199
+ })]
200
+ }) : /*#__PURE__*/_jsxs(View, {
201
+ style: styles.emptyState,
202
+ children: [/*#__PURE__*/_jsx(Search, {
203
+ size: 32,
204
+ color: buoyColors.textMuted
205
+ }), /*#__PURE__*/_jsx(Text, {
206
+ style: styles.emptyTitle,
207
+ children: searchQuery ? "No results found" : "No variables"
208
+ }), /*#__PURE__*/_jsx(Text, {
209
+ style: styles.emptySubtitle,
210
+ children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
211
+ })]
212
+ })]
213
+ });
214
+
215
+ // The ONLY difference between the phone and the desktop dashboard is which
216
+ // shell the header and body go in. Everything above this line is shared.
217
+ if (inline) {
218
+ return /*#__PURE__*/_jsxs(View, {
219
+ style: styles.inlineRoot,
220
+ children: [/*#__PURE__*/_jsx(View, {
221
+ style: styles.inlineHeader,
222
+ children: header
223
+ }), body]
224
+ });
225
+ }
130
226
  return /*#__PURE__*/_jsx(JsModal, {
131
227
  visible: visible,
132
228
  onClose: onClose,
133
229
  onMinimize: onMinimize,
134
230
  persistenceKey: storagePrefix,
135
231
  header: {
136
- customContent: /*#__PURE__*/_jsxs(ModalHeader, {
137
- children: [onBack && /*#__PURE__*/_jsx(ModalHeader.Navigation, {
138
- onBack: onBack
139
- }), /*#__PURE__*/_jsx(ModalHeader.Content, {
140
- title: isSearchActive ? "" : "Environment Variables",
141
- noMargin: isSearchActive,
142
- children: isSearchActive && /*#__PURE__*/_jsxs(View, {
143
- style: styles.headerSearchContainer,
144
- children: [/*#__PURE__*/_jsx(Search, {
145
- size: 12,
146
- color: buoyColors.textSecondary
147
- }), /*#__PURE__*/_jsx(TextInput, {
148
- ref: searchInputRef,
149
- style: styles.headerSearchInput,
150
- placeholder: "Search env keys...",
151
- placeholderTextColor: buoyColors.textMuted,
152
- value: searchQuery,
153
- onChangeText: setSearchQuery,
154
- autoCorrect: false,
155
- autoCapitalize: "none"
156
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
157
- onPress: () => {
158
- setIsSearchActive(false);
159
- setSearchQuery("");
160
- },
161
- style: styles.clearButton,
162
- children: /*#__PURE__*/_jsx(X, {
163
- size: 12,
164
- color: buoyColors.textSecondary
165
- })
166
- })]
167
- })
168
- }), /*#__PURE__*/_jsx(ModalHeader.Actions, {
169
- children: !isSearchActive && /*#__PURE__*/_jsx(HeaderSearchButton, {
170
- onPress: () => setIsSearchActive(true)
171
- })
172
- })]
173
- }),
232
+ customContent: header,
174
233
  showToggleButton: true
175
234
  },
176
235
  onModeChange: handleModeChange,
@@ -178,54 +237,38 @@ export function EnvVarsModal({
178
237
  initialMode: "bottomSheet",
179
238
  enableGlitchEffects: true,
180
239
  styles: {},
181
- children: /*#__PURE__*/_jsxs(ScrollView, {
182
- style: styles.scrollContainer,
183
- contentContainerStyle: styles.contentContainer,
184
- showsVerticalScrollIndicator: false,
185
- children: [/*#__PURE__*/_jsx(EnvStatsOverview, {
186
- stats: stats,
187
- healthPercentage: healthPercentage,
188
- healthStatus: healthStatus,
189
- healthColor: healthColor,
190
- activeFilter: activeFilter,
191
- onFilterChange: setActiveFilter
192
- }), filteredVars.length > 0 ? /*#__PURE__*/_jsxs(View, {
193
- style: styles.varsSection,
194
- children: [/*#__PURE__*/_jsxs(View, {
195
- style: styles.sectionHeader,
196
- children: [/*#__PURE__*/_jsx(Text, {
197
- style: styles.sectionTitle,
198
- children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
199
- }), /*#__PURE__*/_jsx(View, {
200
- style: styles.countBadge,
201
- children: /*#__PURE__*/_jsx(Text, {
202
- style: styles.countText,
203
- children: filteredVars.length
204
- })
205
- })]
206
- }), /*#__PURE__*/_jsx(EnvVarSection, {
207
- title: "",
208
- count: 0,
209
- vars: filteredVars,
210
- emptyMessage: ""
211
- })]
212
- }) : /*#__PURE__*/_jsxs(View, {
213
- style: styles.emptyState,
214
- children: [/*#__PURE__*/_jsx(Search, {
215
- size: 32,
216
- color: buoyColors.textMuted
217
- }), /*#__PURE__*/_jsx(Text, {
218
- style: styles.emptyTitle,
219
- children: searchQuery ? "No results found" : "No variables"
220
- }), /*#__PURE__*/_jsx(Text, {
221
- style: styles.emptySubtitle,
222
- children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
223
- })]
224
- })]
225
- })
240
+ children: body
241
+ });
242
+ }
243
+
244
+ /**
245
+ * The same env tool as `EnvVarsModal`, rendered INLINE for hosts that place
246
+ * tools in a panel. Exists so there is exactly one implementation — the desktop
247
+ * dashboard used to ship its own copy of this component's internals.
248
+ */
249
+ export function EnvToolView({
250
+ requiredEnvVars
251
+ }) {
252
+ return /*#__PURE__*/_jsx(EnvVarsModal, {
253
+ inline: true,
254
+ visible: true,
255
+ requiredEnvVars: requiredEnvVars,
256
+ onClose: () => {}
226
257
  });
227
258
  }
228
259
  const styles = StyleSheet.create({
260
+ inlineRoot: {
261
+ flex: 1,
262
+ minHeight: 0,
263
+ backgroundColor: buoyColors.base
264
+ },
265
+ inlineHeader: {
266
+ paddingHorizontal: 12,
267
+ paddingVertical: 8,
268
+ borderBottomWidth: 1,
269
+ borderBottomColor: buoyColors.border,
270
+ backgroundColor: buoyColors.card
271
+ },
229
272
  scrollContainer: {
230
273
  flex: 1,
231
274
  backgroundColor: buoyColors.base
@@ -4,7 +4,9 @@
4
4
  export { envToolPreset, createEnvTool } from "./preset";
5
5
 
6
6
  // Export main modal component
7
- export { EnvVarsModal } from "./env/components/EnvVarsModal";
7
+ // `EnvToolView` is the same tool rendered inline (header bar + body) instead
8
+ // of inside a JsModal — for hosts that show tools in a panel.
9
+ export { EnvVarsModal, EnvToolView } from "./env/components/EnvVarsModal";
8
10
 
9
11
  // External sync (adapter for @buoy-gg/external-sync's useExternalSync)
10
12
  export { createEnvSyncAdapter } from "./sync/envSyncAdapter";
@@ -10,6 +10,13 @@ interface EnvVarsModalProps {
10
10
  onBack?: () => void;
11
11
  /** Optional handler fired when the modal is minimized. */
12
12
  onMinimize?: (modalState: any) => void;
13
+ /**
14
+ * Render as a header-bar + body stack instead of inside `JsModal`, for hosts
15
+ * that place tools in a panel rather than a modal (Buoy Desktop). Only the
16
+ * shell differs — the header, the body and all state are shared, so the two
17
+ * surfaces cannot drift. See `EnvToolView` at the bottom of this file.
18
+ */
19
+ inline?: boolean;
13
20
  /**
14
21
  * When true, reuse the shared modal sizing keys so multiple dev tools can
15
22
  * persist their window dimensions in a single location.
@@ -21,6 +28,14 @@ interface EnvVarsModalProps {
21
28
  * discovery, validation, filtering, and rich search so teams can quickly spot missing
22
29
  * or misconfigured values during development sessions.
23
30
  */
24
- export declare function EnvVarsModal({ visible, onClose, requiredEnvVars, onBack, onMinimize, enableSharedModalDimensions, }: EnvVarsModalProps): import("react").JSX.Element | null;
31
+ export declare function EnvVarsModal({ visible, onClose, requiredEnvVars, onBack, onMinimize, enableSharedModalDimensions, inline, }: EnvVarsModalProps): import("react").JSX.Element | null;
32
+ /**
33
+ * The same env tool as `EnvVarsModal`, rendered INLINE for hosts that place
34
+ * tools in a panel. Exists so there is exactly one implementation — the desktop
35
+ * dashboard used to ship its own copy of this component's internals.
36
+ */
37
+ export declare function EnvToolView({ requiredEnvVars, }: {
38
+ requiredEnvVars: RequiredEnvVar[];
39
+ }): import("react").JSX.Element;
25
40
  export {};
26
41
  //# sourceMappingURL=EnvVarsModal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EnvVarsModal.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarsModal.tsx"],"names":[],"mappings":"AAWA,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;;;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,GACpC,EAAE,iBAAiB,sCAgPnB"}
1
+ {"version":3,"file":"EnvVarsModal.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarsModal.tsx"],"names":[],"mappings":"AAWA,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,5 +1,5 @@
1
1
  export { envToolPreset, createEnvTool } from "./preset";
2
- export { EnvVarsModal } from "./env/components/EnvVarsModal";
2
+ export { EnvVarsModal, EnvToolView } from "./env/components/EnvVarsModal";
3
3
  export { createEnvSyncAdapter } from "./sync/envSyncAdapter";
4
4
  /** @internal - Remote mirror mode only (desktop dashboard). */
5
5
  export { setRemoteEnv } from "./env/utils/remoteEnv";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,cAAc,aAAa,CAAC;AAG5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKxD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAG1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,cAAc,aAAa,CAAC;AAG5B,cAAc,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/env",
3
- "version": "7.0.4",
3
+ "version": "7.0.5",
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.4",
30
- "@buoy-gg/shared-ui": "7.0.4"
29
+ "@buoy-gg/floating-tools-core": "7.0.5",
30
+ "@buoy-gg/shared-ui": "7.0.5"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "react": "*",