@@ -169,154 +169,168 @@ watch(() => environmentVariables.value, (newVariables) => {
169169 </script >
170170
171171<template >
172- <div class =" space-y-6" >
173- <!-- No Environment Variables -->
174- <div v-if =" !environmentVariables.length" class =" text-center py-8" >
175- <Settings class =" h-12 w-12 text-gray-400 mx-auto mb-4" />
176- <h3 class =" text-lg font-medium text-gray-900 mb-2" >
177- {{ t('mcpInstallations.wizard.environment.noVariables') }}
178- </h3 >
179- <p class =" text-gray-600" >
180- {{ t('mcpInstallations.wizard.environment.noVariablesDescription') }}
181- </p >
182- </div >
183-
184- <!-- Environment Variables Form -->
185- <div v-else class =" space-y-6" >
186- <!-- Server Info -->
187- <Card v-if =" serverData" >
188- <CardHeader >
189- <CardTitle class =" flex items-center gap-2" >
190- <Settings class =" h-5 w-5" />
191- {{ serverData.name }}
192- </CardTitle >
193- <CardDescription >
194- {{ t('mcpInstallations.wizard.environment.configureFor', { name: serverData.name }) }}
195- </CardDescription >
196- </CardHeader >
197- </Card >
198-
199-
200- <!-- Required Variables -->
201- <div v-if =" hasRequiredVariables" class =" space-y-4" >
202- <h3 class =" text-lg font-medium text-gray-900" >
203- {{ t('mcpInstallations.wizard.environment.requiredVariables') }}
204- </h3 >
205-
206- <div class =" space-y-4" >
207- <div
208- v-for =" env in requiredVariables"
209- :key =" env.name"
210- class =" space-y-2"
211- >
212- <Label :for =" env.name" class =" text-sm font-medium" >
213- {{ env.name }}
214- </Label >
215-
216- <!-- Textarea for long values -->
217- <div v-if =" isTextarea(env)" class =" relative" >
218- <Textarea
219- :id =" env.name"
220- :value =" modelValue[env.name] || ''"
221- @input =" updateValue(env.name, ($event.target as HTMLTextAreaElement).value)"
222- :placeholder =" env.placeholder || `Enter ${env.name}`"
223- class =" min-h-[100px]"
224- :class =" { 'border-red-500': env.required && isPlaceholderValue(modelValue[env.name] || '', env) }"
225- />
226- </div >
227-
228- <!-- Regular input -->
229- <div v-else class =" relative" >
230- <Input
231- :id =" env.name"
232- :type =" getInputType(env)"
233- :value =" modelValue[env.name] || ''"
234- @input =" updateValue(env.name, ($event.target as HTMLInputElement).value)"
235- :placeholder =" env.placeholder || `Enter ${env.name}`"
236- :class =" { 'border-red-500': env.required && isPlaceholderValue(modelValue[env.name] || '', env) }"
237- />
238-
239- <!-- Password toggle -->
240- <Button
241- v-if =" env.type === 'password'"
242- type =" button"
243- variant =" ghost"
244- size =" sm"
245- class =" absolute right-2 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0"
246- @click =" togglePasswordVisibility(env.name)"
247- >
248- <Eye v-if =" !showPasswords[env.name]" class =" h-4 w-4" />
249- <EyeOff v-else class =" h-4 w-4" />
250- </Button >
251- </div >
252-
253- <!-- Validation message -->
254- <p v-if =" env.validation" class =" text-xs text-gray-600" >
255- {{ env.validation }}
172+ <div class =" bg-muted/50 sm:rounded-lg" >
173+ <div class =" py-16 sm:py-24" >
174+ <div class =" mx-auto max-w-7xl sm:px-2 lg:px-8" >
175+ <div class =" mx-auto max-w-2xl px-4 lg:max-w-4xl lg:px-0" >
176+ <!-- No Environment Variables -->
177+ <div v-if =" !environmentVariables.length" class =" text-center py-8" >
178+ <Settings class =" h-12 w-12 text-gray-400 mx-auto mb-4" />
179+ <h3 class =" text-lg font-medium text-gray-900 mb-2" >
180+ {{ t('mcpInstallations.wizard.environment.noVariables') }}
181+ </h3 >
182+ <p class =" text-gray-600" >
183+ {{ t('mcpInstallations.wizard.environment.noVariablesDescription') }}
256184 </p >
257185 </div >
258186 </div >
259187 </div >
260188
261- <!-- Optional Variables -->
262- <div v-if =" hasOptionalVariables" class =" space-y-4" >
263- <h3 class =" text-lg font-medium text-gray-900" >
264- {{ t('mcpInstallations.wizard.environment.optionalVariables') }}
265- </h3 >
266-
267- <div class =" space-y-4" >
268- <div
269- v-for =" env in optionalVariables"
270- :key =" env.name"
271- class =" space-y-2"
272- >
273- <Label :for =" env.name" class =" text-sm font-medium" >
274- {{ env.name }}
275- </Label >
276-
277- <!-- Textarea for long values -->
278- <div v-if =" isTextarea(env)" class =" relative" >
279- <Textarea
280- :id =" env.name"
281- :value =" modelValue[env.name] || ''"
282- @input =" updateValue(env.name, ($event.target as HTMLTextAreaElement).value)"
283- :placeholder =" env.placeholder || `Enter ${env.name} (optional)`"
284- class =" min-h-[100px]"
285- />
189+ <!-- Environment Variables Form -->
190+ <div v-if =" environmentVariables.length" >
191+ <div class =" mx-auto max-w-7xl sm:px-2 lg:px-8" >
192+ <div class =" mx-auto max-w-2xl space-y-8 sm:px-4 lg:max-w-4xl lg:px-0" >
193+ <!-- Server Info -->
194+ <Card v-if =" serverData" class =" border-t border-b border-gray-200 bg-white shadow-xs sm:rounded-lg sm:border" >
195+ <CardHeader >
196+ <CardTitle class =" flex items-center gap-2" >
197+ <Settings class =" h-5 w-5" />
198+ {{ serverData.name }}
199+ </CardTitle >
200+ <CardDescription >
201+ {{ t('mcpInstallations.wizard.environment.configureFor', { name: serverData.name }) }}
202+ </CardDescription >
203+ </CardHeader >
204+ </Card >
205+
206+ <!-- Required Variables -->
207+ <div v-if =" hasRequiredVariables" class =" border-t border-b border-gray-200 bg-white shadow-xs sm:rounded-lg sm:border" >
208+ <div class =" p-4 sm:p-6" >
209+ <h3 class =" text-lg font-medium text-gray-900 mb-4" >
210+ {{ t('mcpInstallations.wizard.environment.requiredVariables') }}
211+ </h3 >
212+
213+ <div class =" space-y-4" >
214+ <div
215+ v-for =" env in requiredVariables"
216+ :key =" env.name"
217+ class =" space-y-2"
218+ >
219+ <Label :for =" env.name" class =" text-sm font-medium" >
220+ {{ env.name }}
221+ </Label >
222+
223+ <!-- Textarea for long values -->
224+ <div v-if =" isTextarea(env)" class =" relative" >
225+ <Textarea
226+ :id =" env.name"
227+ :value =" modelValue[env.name] || ''"
228+ @input =" updateValue(env.name, ($event.target as HTMLTextAreaElement).value)"
229+ :placeholder =" env.placeholder || `Enter ${env.name}`"
230+ class =" min-h-[100px] bg-white"
231+ :class =" { 'border-red-500': env.required && isPlaceholderValue(modelValue[env.name] || '', env) }"
232+ />
233+ </div >
234+
235+ <!-- Regular input -->
236+ <div v-else class =" relative" >
237+ <Input
238+ :id =" env.name"
239+ :type =" getInputType(env)"
240+ :value =" modelValue[env.name] || ''"
241+ @input =" updateValue(env.name, ($event.target as HTMLInputElement).value)"
242+ :placeholder =" env.placeholder || `Enter ${env.name}`"
243+ class =" bg-white"
244+ :class =" { 'border-red-500': env.required && isPlaceholderValue(modelValue[env.name] || '', env) }"
245+ />
246+
247+ <!-- Password toggle -->
248+ <Button
249+ v-if =" env.type === 'password'"
250+ type =" button"
251+ variant =" ghost"
252+ size =" sm"
253+ class =" absolute right-2 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0"
254+ @click =" togglePasswordVisibility(env.name)"
255+ >
256+ <Eye v-if =" !showPasswords[env.name]" class =" h-4 w-4" />
257+ <EyeOff v-else class =" h-4 w-4" />
258+ </Button >
259+ </div >
260+
261+ <!-- Validation message -->
262+ <p v-if =" env.validation" class =" text-xs text-gray-600" >
263+ {{ env.validation }}
264+ </p >
265+ </div >
266+ </div >
267+ </div >
286268 </div >
287269
288- <!-- Regular input -->
289- <div v-else class =" relative" >
290- <Input
291- :id =" env.name"
292- :type =" getInputType(env)"
293- :value =" modelValue[env.name] || ''"
294- @input =" updateValue(env.name, ($event.target as HTMLInputElement).value)"
295- :placeholder =" env.placeholder || `Enter ${env.name} (optional)`"
296- />
297-
298- <!-- Password toggle -->
299- <Button
300- v-if =" env.type === 'password'"
301- type =" button"
302- variant =" ghost"
303- size =" sm"
304- class =" absolute right-2 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0"
305- @click =" togglePasswordVisibility(env.name)"
306- >
307- <Eye v-if =" !showPasswords[env.name]" class =" h-4 w-4" />
308- <EyeOff v-else class =" h-4 w-4" />
309- </Button >
270+ <!-- Optional Variables -->
271+ <div v-if =" hasOptionalVariables" class =" border-t border-b border-gray-200 bg-white shadow-xs sm:rounded-lg sm:border" >
272+ <div class =" p-4 sm:p-6" >
273+ <h3 class =" text-lg font-medium text-gray-900 mb-4" >
274+ {{ t('mcpInstallations.wizard.environment.optionalVariables') }}
275+ </h3 >
276+
277+ <div class =" space-y-4" >
278+ <div
279+ v-for =" env in optionalVariables"
280+ :key =" env.name"
281+ class =" space-y-2"
282+ >
283+ <Label :for =" env.name" class =" text-sm font-medium" >
284+ {{ env.name }}
285+ </Label >
286+
287+ <!-- Textarea for long values -->
288+ <div v-if =" isTextarea(env)" class =" relative" >
289+ <Textarea
290+ :id =" env.name"
291+ :value =" modelValue[env.name] || ''"
292+ @input =" updateValue(env.name, ($event.target as HTMLTextAreaElement).value)"
293+ :placeholder =" env.placeholder || `Enter ${env.name} (optional)`"
294+ class =" min-h-[100px] bg-white"
295+ />
296+ </div >
297+
298+ <!-- Regular input -->
299+ <div v-else class =" relative" >
300+ <Input
301+ :id =" env.name"
302+ :type =" getInputType(env)"
303+ :value =" modelValue[env.name] || ''"
304+ @input =" updateValue(env.name, ($event.target as HTMLInputElement).value)"
305+ :placeholder =" env.placeholder || `Enter ${env.name} (optional)`"
306+ class =" bg-white"
307+ />
308+
309+ <!-- Password toggle -->
310+ <Button
311+ v-if =" env.type === 'password'"
312+ type =" button"
313+ variant =" ghost"
314+ size =" sm"
315+ class =" absolute right-2 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0"
316+ @click =" togglePasswordVisibility(env.name)"
317+ >
318+ <Eye v-if =" !showPasswords[env.name]" class =" h-4 w-4" />
319+ <EyeOff v-else class =" h-4 w-4" />
320+ </Button >
321+ </div >
322+
323+ <!-- Validation message -->
324+ <p v-if =" env.validation" class =" text-xs text-gray-600" >
325+ {{ env.validation }}
326+ </p >
327+ </div >
328+ </div >
329+ </div >
310330 </div >
311-
312- <!-- Validation message -->
313- <p v-if =" env.validation" class =" text-xs text-gray-600" >
314- {{ env.validation }}
315- </p >
316331 </div >
317332 </div >
318333 </div >
319-
320334 </div >
321335 </div >
322336</template >
0 commit comments