@buoy-gg/env 7.0.4 → 7.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/env/components/EnvVarsModal.js +128 -84
- package/lib/commonjs/index.js +7 -0
- package/lib/module/env/components/EnvVarsModal.js +127 -84
- package/lib/module/index.js +3 -1
- package/lib/typescript/env/components/EnvVarsModal.d.ts +16 -1
- package/lib/typescript/env/components/EnvVarsModal.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -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:
|
|
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:
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
package/lib/commonjs/index.js
CHANGED
|
@@ -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:
|
|
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:
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
package/lib/module/index.js
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
export { envToolPreset, createEnvTool } from "./preset";
|
|
5
5
|
|
|
6
6
|
// Export main modal component
|
|
7
|
-
|
|
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,
|
|
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;
|
|
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.
|
|
3
|
+
"version": "7.0.6",
|
|
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.
|
|
30
|
-
"@buoy-gg/shared-ui": "7.0.
|
|
29
|
+
"@buoy-gg/floating-tools-core": "7.0.6",
|
|
30
|
+
"@buoy-gg/shared-ui": "7.0.6"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"react": "*",
|