@burdenoff/microfe-vibecontrols 2026.610.2 → 2026.610.4
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/dist/components/vibe/VibeEnvVarsPanel.js +192 -0
- package/dist/components/vibe/VibeEnvVarsPanel.js.map +1 -0
- package/dist/generated/wspace-operations.js +1104 -1038
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/pages/CatalogDetailPage.js +290 -262
- package/dist/pages/CatalogDetailPage.js.map +1 -1
- package/dist/pages/ComponentDetailPage.js +354 -326
- package/dist/pages/ComponentDetailPage.js.map +1 -1
- package/dist/pages/VibeDetailsPage.js +55 -76
- package/dist/pages/VibeDetailsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { useDeleteVibeEnvVarMutation as e, useGetVibeEnvVarsQuery as t, useSetVibeEnvVarMutation as n } from "../../generated/wspace-operations.js";
|
|
2
|
+
import { ConfirmDialog as r } from "../shared/ConfirmDialog.js";
|
|
3
|
+
import { LoadingState as i } from "../shared/LoadingState.js";
|
|
4
|
+
import { ErrorState as a } from "../shared/ErrorState.js";
|
|
5
|
+
import { Card as o } from "../shared/Card.js";
|
|
6
|
+
import "../shared/index.js";
|
|
7
|
+
import { VIBE_PERMISSIONS as s } from "../../constants/permissions.js";
|
|
8
|
+
import { notify as c } from "../../lib/toast.js";
|
|
9
|
+
import { useState as l } from "react";
|
|
10
|
+
import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
|
+
import { Eye as d, EyeOff as f, Lock as p, Pencil as m, Plus as h, Trash2 as g, Variable as _ } from "lucide-react";
|
|
12
|
+
import { usePermissions as v } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
13
|
+
import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
14
|
+
//#region src/components/vibe/VibeEnvVarsPanel.tsx
|
|
15
|
+
var S = /^[A-Za-z_]\w*$/, C = ({ vibeId: C }) => {
|
|
16
|
+
let { t: w } = u(), T = (e, t) => {
|
|
17
|
+
let n = w(e);
|
|
18
|
+
return n === e ? t : n;
|
|
19
|
+
}, { hasPermission: E } = v(), D = E(s.VIBE_UPDATE), { data: O, loading: k, error: A, refetch: j } = t({
|
|
20
|
+
variables: { vibeId: C },
|
|
21
|
+
fetchPolicy: "cache-and-network"
|
|
22
|
+
}), [M, { loading: N }] = n(), [P] = e(), [F, I] = l(""), [L, R] = l(""), [z, B] = l(!1), [V, H] = l(null), [U, W] = l(!1), [G, K] = l(null), q = O?.vibe?.envVars ?? [], J = () => {
|
|
23
|
+
I(""), R(""), B(!1), H(null), W(!1);
|
|
24
|
+
}, Y = (e, t, n) => {
|
|
25
|
+
H(e), I(e), R(n ?? ""), B(t), W(!1);
|
|
26
|
+
}, X = async (e) => {
|
|
27
|
+
e.preventDefault();
|
|
28
|
+
let t = F.trim();
|
|
29
|
+
if (!S.test(t)) {
|
|
30
|
+
c.error(T("vibeEnv.invalidKey", "Invalid name"), T("vibeEnv.invalidKeyDesc", "Use letters, digits and underscores; must not start with a digit."));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
await M({ variables: {
|
|
35
|
+
vibeId: C,
|
|
36
|
+
key: t,
|
|
37
|
+
value: L,
|
|
38
|
+
isSecret: z
|
|
39
|
+
} }), await j(), c.success(V ? T("vibeEnv.updated", "Variable updated") : T("vibeEnv.added", "Variable added"), `${t}${z ? " (secret)" : ""}`), J();
|
|
40
|
+
} catch (e) {
|
|
41
|
+
c.error(T("vibeEnv.saveFailed", "Could not save variable"), e.message);
|
|
42
|
+
}
|
|
43
|
+
}, Z = async (e) => {
|
|
44
|
+
try {
|
|
45
|
+
await P({ variables: {
|
|
46
|
+
vibeId: C,
|
|
47
|
+
key: e
|
|
48
|
+
} }), await j(), c.success(T("vibeEnv.deleted", "Variable removed"), e), V === e && J();
|
|
49
|
+
} catch (e) {
|
|
50
|
+
c.error(T("vibeEnv.deleteFailed", "Could not remove variable"), e.message);
|
|
51
|
+
} finally {
|
|
52
|
+
K(null);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
return /* @__PURE__ */ x(o, { children: [
|
|
56
|
+
/* @__PURE__ */ x("div", {
|
|
57
|
+
className: "p-4 border-b border-border-default flex items-center justify-between",
|
|
58
|
+
children: [/* @__PURE__ */ x("h3", {
|
|
59
|
+
className: "font-semibold text-text-primary flex items-center gap-2",
|
|
60
|
+
children: [/* @__PURE__ */ b(_, { className: "size-5" }), T("vibeDetails.environmentVariables", "Environment Variables")]
|
|
61
|
+
}), /* @__PURE__ */ b("span", {
|
|
62
|
+
className: "text-xs text-text-secondary",
|
|
63
|
+
children: T("vibeEnv.injectedHint", "Injected into every session started under this vibe")
|
|
64
|
+
})]
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ x("div", {
|
|
67
|
+
className: "p-4 space-y-4",
|
|
68
|
+
children: [k && q.length === 0 ? /* @__PURE__ */ b(i, {}) : A ? /* @__PURE__ */ b(a, {
|
|
69
|
+
message: A.message,
|
|
70
|
+
onRetry: () => void j()
|
|
71
|
+
}) : q.length === 0 ? /* @__PURE__ */ b("p", {
|
|
72
|
+
className: "text-text-secondary",
|
|
73
|
+
children: T("vibeDetails.noEnvironmentVariables", "No environment variables configured")
|
|
74
|
+
}) : /* @__PURE__ */ b("ul", {
|
|
75
|
+
className: "divide-y divide-border-default rounded-md border border-border-default",
|
|
76
|
+
children: q.map((e) => /* @__PURE__ */ x("li", {
|
|
77
|
+
className: "flex items-center gap-3 px-3 py-2",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ b("span", {
|
|
80
|
+
className: "font-mono text-sm text-text-primary shrink-0",
|
|
81
|
+
children: e.key
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ b("span", {
|
|
84
|
+
className: "text-text-tertiary",
|
|
85
|
+
children: "="
|
|
86
|
+
}),
|
|
87
|
+
/* @__PURE__ */ b("span", {
|
|
88
|
+
className: "font-mono text-sm text-text-secondary truncate flex items-center gap-1.5 flex-1",
|
|
89
|
+
children: e.isSecret ? /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(p, {
|
|
90
|
+
className: "size-3.5 text-text-tertiary",
|
|
91
|
+
"aria-hidden": !0
|
|
92
|
+
}), /* @__PURE__ */ b("span", {
|
|
93
|
+
"aria-label": T("vibeEnv.secretMasked", "Secret value (hidden)"),
|
|
94
|
+
children: "••••••••"
|
|
95
|
+
})] }) : /* @__PURE__ */ b("span", {
|
|
96
|
+
className: "truncate",
|
|
97
|
+
children: e.value
|
|
98
|
+
})
|
|
99
|
+
}),
|
|
100
|
+
D && /* @__PURE__ */ x("div", {
|
|
101
|
+
className: "flex items-center gap-1 shrink-0",
|
|
102
|
+
children: [/* @__PURE__ */ b("button", {
|
|
103
|
+
type: "button",
|
|
104
|
+
onClick: () => Y(e.key, e.isSecret, e.value),
|
|
105
|
+
className: "p-1.5 rounded text-text-secondary hover:text-text-primary hover:bg-bg-sunken",
|
|
106
|
+
"aria-label": T("common.edit", "Edit"),
|
|
107
|
+
children: /* @__PURE__ */ b(m, { className: "size-4" })
|
|
108
|
+
}), /* @__PURE__ */ b("button", {
|
|
109
|
+
type: "button",
|
|
110
|
+
onClick: () => K(e.key),
|
|
111
|
+
className: "p-1.5 rounded text-text-secondary hover:text-action-danger-text hover:bg-bg-sunken",
|
|
112
|
+
"aria-label": T("common.delete", "Delete"),
|
|
113
|
+
children: /* @__PURE__ */ b(g, { className: "size-4" })
|
|
114
|
+
})]
|
|
115
|
+
})
|
|
116
|
+
]
|
|
117
|
+
}, e.key))
|
|
118
|
+
}), D && /* @__PURE__ */ x("form", {
|
|
119
|
+
onSubmit: (e) => void X(e),
|
|
120
|
+
className: "space-y-3 pt-2",
|
|
121
|
+
children: [/* @__PURE__ */ x("div", {
|
|
122
|
+
className: "flex flex-col gap-2 sm:flex-row sm:items-center",
|
|
123
|
+
children: [/* @__PURE__ */ b("input", {
|
|
124
|
+
value: F,
|
|
125
|
+
onChange: (e) => I(e.target.value),
|
|
126
|
+
disabled: V !== null,
|
|
127
|
+
placeholder: T("vibeEnv.keyPlaceholder", "NAME"),
|
|
128
|
+
className: "font-mono text-sm px-3 py-2 rounded-md border border-border-default bg-bg-surface text-text-primary disabled:opacity-60 sm:w-48",
|
|
129
|
+
"aria-label": T("vibeEnv.keyLabel", "Variable name")
|
|
130
|
+
}), /* @__PURE__ */ x("div", {
|
|
131
|
+
className: "relative flex-1",
|
|
132
|
+
children: [/* @__PURE__ */ b("input", {
|
|
133
|
+
value: L,
|
|
134
|
+
onChange: (e) => R(e.target.value),
|
|
135
|
+
type: z && !U ? "password" : "text",
|
|
136
|
+
placeholder: V && z ? T("vibeEnv.secretReenter", "Enter a new secret value") : T("vibeEnv.valuePlaceholder", "value"),
|
|
137
|
+
className: "w-full font-mono text-sm px-3 py-2 rounded-md border border-border-default bg-bg-surface text-text-primary",
|
|
138
|
+
"aria-label": T("vibeEnv.valueLabel", "Variable value")
|
|
139
|
+
}), z && /* @__PURE__ */ b("button", {
|
|
140
|
+
type: "button",
|
|
141
|
+
onClick: () => W((e) => !e),
|
|
142
|
+
className: "absolute right-2 top-1/2 -translate-y-1/2 p-1 text-text-tertiary hover:text-text-primary",
|
|
143
|
+
"aria-label": U ? T("vibeEnv.hide", "Hide") : T("vibeEnv.reveal", "Reveal"),
|
|
144
|
+
children: b(U ? f : d, { className: "size-4" })
|
|
145
|
+
})]
|
|
146
|
+
})]
|
|
147
|
+
}), /* @__PURE__ */ x("div", {
|
|
148
|
+
className: "flex items-center justify-between",
|
|
149
|
+
children: [/* @__PURE__ */ x("label", {
|
|
150
|
+
className: "flex items-center gap-2 text-sm text-text-secondary cursor-pointer",
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ b("input", {
|
|
153
|
+
type: "checkbox",
|
|
154
|
+
checked: z,
|
|
155
|
+
onChange: (e) => B(e.target.checked),
|
|
156
|
+
className: "rounded border-border-default"
|
|
157
|
+
}),
|
|
158
|
+
/* @__PURE__ */ b(p, { className: "size-3.5" }),
|
|
159
|
+
T("vibeEnv.secretToggle", "Secret (encrypted at rest, never shown again)")
|
|
160
|
+
]
|
|
161
|
+
}), /* @__PURE__ */ x("div", {
|
|
162
|
+
className: "flex items-center gap-2",
|
|
163
|
+
children: [V && /* @__PURE__ */ b("button", {
|
|
164
|
+
type: "button",
|
|
165
|
+
onClick: J,
|
|
166
|
+
className: "px-3 py-2 text-sm rounded-md text-text-secondary hover:bg-bg-sunken",
|
|
167
|
+
children: T("common.cancel", "Cancel")
|
|
168
|
+
}), /* @__PURE__ */ x("button", {
|
|
169
|
+
type: "submit",
|
|
170
|
+
disabled: N || F.trim().length === 0,
|
|
171
|
+
className: "flex items-center gap-1.5 px-3 py-2 text-sm rounded-md bg-action-primary-bg text-action-primary-text hover:opacity-90 disabled:opacity-50",
|
|
172
|
+
children: [/* @__PURE__ */ b(h, { className: "size-4" }), V ? T("vibeEnv.save", "Save") : T("vibeEnv.add", "Add variable")]
|
|
173
|
+
})]
|
|
174
|
+
})]
|
|
175
|
+
})]
|
|
176
|
+
})]
|
|
177
|
+
}),
|
|
178
|
+
G && /* @__PURE__ */ b(r, {
|
|
179
|
+
isOpen: !0,
|
|
180
|
+
title: T("vibeEnv.deleteTitle", "Remove environment variable?"),
|
|
181
|
+
message: `"${G}" ${T("vibeEnv.deleteMessage", "will be removed from this vibe.")}`,
|
|
182
|
+
confirmLabel: T("common.delete", "Delete"),
|
|
183
|
+
variant: "danger",
|
|
184
|
+
onConfirm: () => void Z(G),
|
|
185
|
+
onClose: () => K(null)
|
|
186
|
+
})
|
|
187
|
+
] });
|
|
188
|
+
};
|
|
189
|
+
//#endregion
|
|
190
|
+
export { C as VibeEnvVarsPanel };
|
|
191
|
+
|
|
192
|
+
//# sourceMappingURL=VibeEnvVarsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VibeEnvVarsPanel.js","names":[],"sources":["../../../src/components/vibe/VibeEnvVarsPanel.tsx"],"sourcesContent":["import type { FC, FormEvent } from 'react';\nimport { useState } from 'react';\nimport { Variable, Lock, Trash2, Plus, Pencil, Eye, EyeOff } from 'lucide-react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\n\nimport { Card, LoadingState, ErrorState, ConfirmDialog } from '@/components/shared';\nimport { VIBE_PERMISSIONS } from '@/constants/permissions';\nimport { notify } from '@/lib/toast';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n useGetVibeEnvVarsQuery,\n useSetVibeEnvVarMutation,\n useDeleteVibeEnvVarMutation,\n type VibeEnvVarFieldsFragment,\n} from '@/generated/wspace-operations';\n\ninterface VibeEnvVarsPanelProps {\n vibeId: string;\n}\n\nconst KEY_PATTERN = /^[A-Za-z_]\\w*$/;\n\n/**\n * VibeEnvVarsPanel — full CRUD for a vibe's environment variables, with first-class secret support.\n * Secret values are stored AES-256-GCM-encrypted server-side and are never returned in plaintext\n * (`value` comes back null + `isSecret` true), so the UI renders them masked. Plain vars show their\n * value. Every var a session started under this vibe will automatically inherit.\n */\nexport const VibeEnvVarsPanel: FC<VibeEnvVarsPanelProps> = ({ vibeId }) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const v = t(key);\n return v === key ? fallback : v;\n };\n const { hasPermission } = usePermissions();\n const canEdit = hasPermission(VIBE_PERMISSIONS.VIBE_UPDATE);\n\n const { data, loading, error, refetch } = useGetVibeEnvVarsQuery({\n variables: { vibeId },\n fetchPolicy: 'cache-and-network',\n });\n const [setEnvVar, { loading: saving }] = useSetVibeEnvVarMutation();\n const [deleteEnvVar] = useDeleteVibeEnvVarMutation();\n\n const [formKey, setFormKey] = useState('');\n const [formValue, setFormValue] = useState('');\n const [formSecret, setFormSecret] = useState(false);\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [revealValue, setRevealValue] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<string | null>(null);\n\n const envVars: VibeEnvVarFieldsFragment[] = data?.vibe?.envVars ?? [];\n\n const resetForm = (): void => {\n setFormKey('');\n setFormValue('');\n setFormSecret(false);\n setEditingKey(null);\n setRevealValue(false);\n };\n\n const startEdit = (key: string, isSecret: boolean, value: string | null | undefined): void => {\n setEditingKey(key);\n setFormKey(key);\n setFormValue(value ?? '');\n setFormSecret(isSecret);\n setRevealValue(false);\n };\n\n const handleSubmit = async (e: FormEvent): Promise<void> => {\n e.preventDefault();\n const key = formKey.trim();\n if (!KEY_PATTERN.test(key)) {\n notify.error(\n tr('vibeEnv.invalidKey', 'Invalid name'),\n tr(\n 'vibeEnv.invalidKeyDesc',\n 'Use letters, digits and underscores; must not start with a digit.'\n )\n );\n return;\n }\n try {\n await setEnvVar({ variables: { vibeId, key, value: formValue, isSecret: formSecret } });\n await refetch();\n notify.success(\n editingKey\n ? tr('vibeEnv.updated', 'Variable updated')\n : tr('vibeEnv.added', 'Variable added'),\n `${key}${formSecret ? ' (secret)' : ''}`\n );\n resetForm();\n } catch (err) {\n notify.error(tr('vibeEnv.saveFailed', 'Could not save variable'), (err as Error).message);\n }\n };\n\n const handleDelete = async (key: string): Promise<void> => {\n try {\n await deleteEnvVar({ variables: { vibeId, key } });\n await refetch();\n notify.success(tr('vibeEnv.deleted', 'Variable removed'), key);\n if (editingKey === key) resetForm();\n } catch (err) {\n notify.error(tr('vibeEnv.deleteFailed', 'Could not remove variable'), (err as Error).message);\n } finally {\n setPendingDelete(null);\n }\n };\n\n return (\n <Card>\n <div className=\"p-4 border-b border-border-default flex items-center justify-between\">\n <h3 className=\"font-semibold text-text-primary flex items-center gap-2\">\n <Variable className=\"size-5\" />\n {tr('vibeDetails.environmentVariables', 'Environment Variables')}\n </h3>\n <span className=\"text-xs text-text-secondary\">\n {tr('vibeEnv.injectedHint', 'Injected into every session started under this vibe')}\n </span>\n </div>\n\n <div className=\"p-4 space-y-4\">\n {loading && envVars.length === 0 ? (\n <LoadingState />\n ) : error ? (\n <ErrorState message={error.message} onRetry={() => void refetch()} />\n ) : envVars.length === 0 ? (\n <p className=\"text-text-secondary\">\n {tr('vibeDetails.noEnvironmentVariables', 'No environment variables configured')}\n </p>\n ) : (\n <ul className=\"divide-y divide-border-default rounded-md border border-border-default\">\n {envVars.map((v) => (\n <li key={v.key} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"font-mono text-sm text-text-primary shrink-0\">{v.key}</span>\n <span className=\"text-text-tertiary\">=</span>\n <span className=\"font-mono text-sm text-text-secondary truncate flex items-center gap-1.5 flex-1\">\n {v.isSecret ? (\n <>\n <Lock className=\"size-3.5 text-text-tertiary\" aria-hidden />\n <span aria-label={tr('vibeEnv.secretMasked', 'Secret value (hidden)')}>\n ••••••••\n </span>\n </>\n ) : (\n <span className=\"truncate\">{v.value}</span>\n )}\n </span>\n {canEdit && (\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n type=\"button\"\n onClick={() => startEdit(v.key, v.isSecret, v.value)}\n className=\"p-1.5 rounded text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n aria-label={tr('common.edit', 'Edit')}\n >\n <Pencil className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setPendingDelete(v.key)}\n className=\"p-1.5 rounded text-text-secondary hover:text-action-danger-text hover:bg-bg-sunken\"\n aria-label={tr('common.delete', 'Delete')}\n >\n <Trash2 className=\"size-4\" />\n </button>\n </div>\n )}\n </li>\n ))}\n </ul>\n )}\n\n {canEdit && (\n <form onSubmit={(e) => void handleSubmit(e)} className=\"space-y-3 pt-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center\">\n <input\n value={formKey}\n onChange={(e) => setFormKey(e.target.value)}\n disabled={editingKey !== null}\n placeholder={tr('vibeEnv.keyPlaceholder', 'NAME')}\n className=\"font-mono text-sm px-3 py-2 rounded-md border border-border-default bg-bg-surface text-text-primary disabled:opacity-60 sm:w-48\"\n aria-label={tr('vibeEnv.keyLabel', 'Variable name')}\n />\n <div className=\"relative flex-1\">\n <input\n value={formValue}\n onChange={(e) => setFormValue(e.target.value)}\n type={formSecret && !revealValue ? 'password' : 'text'}\n placeholder={\n editingKey && formSecret\n ? tr('vibeEnv.secretReenter', 'Enter a new secret value')\n : tr('vibeEnv.valuePlaceholder', 'value')\n }\n className=\"w-full font-mono text-sm px-3 py-2 rounded-md border border-border-default bg-bg-surface text-text-primary\"\n aria-label={tr('vibeEnv.valueLabel', 'Variable value')}\n />\n {formSecret && (\n <button\n type=\"button\"\n onClick={() => setRevealValue((s) => !s)}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-text-tertiary hover:text-text-primary\"\n aria-label={\n revealValue ? tr('vibeEnv.hide', 'Hide') : tr('vibeEnv.reveal', 'Reveal')\n }\n >\n {revealValue ? <EyeOff className=\"size-4\" /> : <Eye className=\"size-4\" />}\n </button>\n )}\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <label className=\"flex items-center gap-2 text-sm text-text-secondary cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={formSecret}\n onChange={(e) => setFormSecret(e.target.checked)}\n className=\"rounded border-border-default\"\n />\n <Lock className=\"size-3.5\" />\n {tr('vibeEnv.secretToggle', 'Secret (encrypted at rest, never shown again)')}\n </label>\n <div className=\"flex items-center gap-2\">\n {editingKey && (\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"px-3 py-2 text-sm rounded-md text-text-secondary hover:bg-bg-sunken\"\n >\n {tr('common.cancel', 'Cancel')}\n </button>\n )}\n <button\n type=\"submit\"\n disabled={saving || formKey.trim().length === 0}\n className=\"flex items-center gap-1.5 px-3 py-2 text-sm rounded-md bg-action-primary-bg text-action-primary-text hover:opacity-90 disabled:opacity-50\"\n >\n <Plus className=\"size-4\" />\n {editingKey ? tr('vibeEnv.save', 'Save') : tr('vibeEnv.add', 'Add variable')}\n </button>\n </div>\n </div>\n </form>\n )}\n </div>\n\n {pendingDelete && (\n <ConfirmDialog\n isOpen\n title={tr('vibeEnv.deleteTitle', 'Remove environment variable?')}\n message={`\"${pendingDelete}\" ${tr('vibeEnv.deleteMessage', 'will be removed from this vibe.')}`}\n confirmLabel={tr('common.delete', 'Delete')}\n variant=\"danger\"\n onConfirm={() => void handleDelete(pendingDelete)}\n onClose={() => setPendingDelete(null)}\n />\n )}\n </Card>\n );\n};\n"],"mappings":"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"}
|