@ojolowoblue/lamba 1.0.1 → 1.0.3

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # lamba ⚡
2
2
 
3
- **`lamba`** is a universal, lightweight developer tool and browser widget for viewing, overriding, and swapping environment variables live in web applications (React, Vue, Next.js, Vite, Astro, Svelte, or Vanilla HTML/JS)—**without touching source code, restarting dev servers, or editing `.env` files.**
3
+ **`lamba`** is a universal, lightweight developer tool and browser widget for viewing, overriding, and swapping environment variables live in web applications—supporting **all framework prefixes** (`VITE_`, `NEXT_PUBLIC_`, `REACT_APP_`, `VUE_APP_`, `PUBLIC_`, `EXPO_PUBLIC_`, `NUXT_`, `GATSBY_`, or unprefixed keys) across React, Vue, Next.js, Vite, Create React App, Astro, Nuxt, Svelte, or Vanilla HTML/JS—**without touching source code, restarting dev servers, or editing `.env` files.**
4
4
 
5
5
  Deployed via CDN or installed via NPM, `lamba` injects a non-intrusive floating UI powered by **Shadow DOM encapsulation**. Devs, QA engineers, and project managers can test multiple API environments, toggle feature flags, switch authentication tokens, and swap backend clusters on the fly directly in the browser.
6
6
 
@@ -9,6 +9,7 @@ Deployed via CDN or installed via NPM, `lamba` injects a non-intrusive floating
9
9
  ## 🌟 Key Features
10
10
 
11
11
  - ⚡ **Zero-Setup CDN & NPM Support**: Add a single `<script>` tag or install via NPM/Yarn/PNPM.
12
+ - 🌐 **Universal Framework & Prefix Support**: Works out of the box with any env variable prefix (`VITE_`, `NEXT_PUBLIC_`, `REACT_APP_`, `VUE_APP_`, `PUBLIC_`, `EXPO_PUBLIC_`, `NUXT_`, `GATSBY_`) or unprefixed variables.
12
13
  - 🛡️ **Shadow DOM Encapsulation**: Modern glassmorphism UI rendered inside a Custom Element (`<lamba-widget>`), ensuring zero CSS style leakage into or out of your app.
13
14
  - 🌐 **Automatic Network Interception**: Automatically intercepts outbound `fetch()` and `XMLHttpRequest` calls hitting default base URLs and redirects them to your live active environment overrides on the fly.
14
15
  - 🎛️ **Preset Profile Manager**: Save named environment snapshots (e.g., *Staging API*, *Local Mock Server*, *QA Test Suite*, *Production Read-Only*) and switch between them with one click.
@@ -51,9 +52,11 @@ import lamba from '@ojolowoblue/lamba';
51
52
  lamba.init({
52
53
  position: 'bottom-right',
53
54
  env: {
54
- VITE_API_BASE_URL: 'https://api.dev.example.com',
55
- VITE_FEATURE_NEW_CHECKOUT: 'false',
55
+ // Supports any env prefix (VITE_, NEXT_PUBLIC_, REACT_APP_, VUE_APP_, PUBLIC_) or custom keys:
56
+ NEXT_PUBLIC_API_URL: 'https://api.dev.example.com',
57
+ REACT_APP_FEATURE_FLAG: 'false',
56
58
  VITE_ENABLE_ANALYTICS: 'true',
59
+ API_BASE_URL: 'https://api.dev.example.com',
57
60
  },
58
61
  });
59
62
  ```
@@ -174,6 +177,7 @@ Initializes the lamba manager, hydrates saved overrides from `localStorage`, ena
174
177
  | `secretKeysPattern` | `RegExp` | `/(KEY\|SECRET\|TOKEN\|PASSWORD\|AUTH\|PRIVATE)/i` | Regular expression to automatically obscure sensitive keys in the UI. |
175
178
  | `autoFetchEnvFile` | `boolean` | `false` | Whether to attempt fetching root `/.env` file during local development. |
176
179
  | `interceptNetworkRequests` | `boolean` | `true` | Whether to implicitly intercept `fetch` & `XHR` calls matching original base URLs. |
180
+ | `allowedPrefixes` | `string \| string[] \| RegExp \| null` | `null` | Optional prefix filter (e.g. `['VITE_', 'NEXT_PUBLIC_']`). Omitting allows ALL keys regardless of prefix. |
177
181
 
178
182
  ---
179
183
 
package/dist/index.d.mts CHANGED
@@ -41,6 +41,11 @@ interface LambaOptions {
41
41
  * Defaults to true.
42
42
  */
43
43
  interceptNetworkRequests?: boolean;
44
+ /**
45
+ * Optional prefix filter or array of prefixes to include (e.g. ['VITE_', 'NEXT_PUBLIC_', 'REACT_APP_']).
46
+ * If omitted, null, or empty, ALL environment variable keys are allowed and supported regardless of prefix.
47
+ */
48
+ allowedPrefixes?: string | string[] | RegExp | null;
44
49
  }
45
50
  type EnvChangeListener = (key: string, value: string, isOverridden: boolean) => void;
46
51
  type StoreChangeListener = (variables: Record<string, EnvVariable>, presets: PresetProfile[], activePresetId: string | null) => void;
package/dist/index.d.ts CHANGED
@@ -41,6 +41,11 @@ interface LambaOptions {
41
41
  * Defaults to true.
42
42
  */
43
43
  interceptNetworkRequests?: boolean;
44
+ /**
45
+ * Optional prefix filter or array of prefixes to include (e.g. ['VITE_', 'NEXT_PUBLIC_', 'REACT_APP_']).
46
+ * If omitted, null, or empty, ALL environment variable keys are allowed and supported regardless of prefix.
47
+ */
48
+ allowedPrefixes?: string | string[] | RegExp | null;
44
49
  }
45
50
  type EnvChangeListener = (key: string, value: string, isOverridden: boolean) => void;
46
51
  type StoreChangeListener = (variables: Record<string, EnvVariable>, presets: PresetProfile[], activePresetId: string | null) => void;
package/dist/index.js CHANGED
@@ -136,25 +136,41 @@ function stringifyEnv(env) {
136
136
  function autoDiscoverBrowserEnv() {
137
137
  const discovered = {};
138
138
  if (typeof window === "undefined") return discovered;
139
+ const extractPrimitiveProps = (obj) => {
140
+ if (!obj || typeof obj !== "object") return;
141
+ for (const [k, v] of Object.entries(obj)) {
142
+ if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") {
143
+ discovered[k] = String(v);
144
+ }
145
+ }
146
+ };
139
147
  try {
140
148
  const winProcess = window.process;
141
149
  if (winProcess && winProcess.env && typeof winProcess.env === "object") {
142
- for (const [k, v] of Object.entries(winProcess.env)) {
143
- if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") {
144
- discovered[k] = String(v);
145
- }
146
- }
150
+ extractPrimitiveProps(winProcess.env);
147
151
  }
148
152
  } catch (e) {
149
153
  }
150
154
  try {
151
- const customEnv = window.__ENV__ || window.ENV;
152
- if (customEnv && typeof customEnv === "object") {
153
- for (const [k, v] of Object.entries(customEnv)) {
154
- if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") {
155
- discovered[k] = String(v);
156
- }
157
- }
155
+ const nextData = window.__NEXT_DATA__;
156
+ if (nextData) {
157
+ if (nextData.env) extractPrimitiveProps(nextData.env);
158
+ if (nextData.runtimeConfig?.public) extractPrimitiveProps(nextData.runtimeConfig.public);
159
+ }
160
+ } catch (e) {
161
+ }
162
+ try {
163
+ const nuxtData = window.__NUXT__;
164
+ if (nuxtData?.config?.public) {
165
+ extractPrimitiveProps(nuxtData.config.public);
166
+ }
167
+ } catch (e) {
168
+ }
169
+ try {
170
+ const win = window;
171
+ const customEnv = win.__ENV__ || win.ENV || win.PUBLIC_ENV || win.__LAMBA_ENV__;
172
+ if (customEnv) {
173
+ extractPrimitiveProps(customEnv);
158
174
  }
159
175
  } catch (e) {
160
176
  }
@@ -205,6 +221,7 @@ var EnvStore = class {
205
221
  this.envChangeListeners = /* @__PURE__ */ new Set();
206
222
  this.storeChangeListeners = /* @__PURE__ */ new Set();
207
223
  this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;
224
+ this.allowedPrefixes = options.allowedPrefixes;
208
225
  this.presetManager = new PresetManager();
209
226
  this.loadOverridesFromStorage();
210
227
  if (options.env) {
@@ -241,7 +258,6 @@ var EnvStore = class {
241
258
  }
242
259
  }
243
260
  /**
244
- * Monkey-patches window.process.env to reactively return overridden values.
245
261
  */
246
262
  patchProcessEnv() {
247
263
  if (typeof window === "undefined") return;
@@ -270,9 +286,27 @@ var EnvStore = class {
270
286
  } catch (e) {
271
287
  }
272
288
  }
289
+ /**
290
+ * Checks if an environment variable key satisfies the allowedPrefixes option.
291
+ */
292
+ isAllowedKey(key) {
293
+ if (!this.allowedPrefixes) return true;
294
+ if (typeof this.allowedPrefixes === "string") {
295
+ return key.startsWith(this.allowedPrefixes);
296
+ }
297
+ if (Array.isArray(this.allowedPrefixes)) {
298
+ if (this.allowedPrefixes.length === 0) return true;
299
+ return this.allowedPrefixes.some((p) => key.startsWith(p));
300
+ }
301
+ if (this.allowedPrefixes instanceof RegExp) {
302
+ return this.allowedPrefixes.test(key);
303
+ }
304
+ return true;
305
+ }
273
306
  mergeDefaults(env) {
274
307
  let changed = false;
275
308
  for (const [key, defaultValue] of Object.entries(env)) {
309
+ if (!this.isAllowedKey(key)) continue;
276
310
  const isOverridden = key in this.overrides;
277
311
  const currentValue = isOverridden ? this.overrides[key] : defaultValue;
278
312
  const isSecret = this.secretPattern.test(key);
@@ -1154,7 +1188,7 @@ var ModalUI = class {
1154
1188
  </div>
1155
1189
  `;
1156
1190
  footer.querySelector(".lamba-add-var-btn")?.addEventListener("click", () => {
1157
- const key = prompt("Enter new environment variable key name (e.g. VITE_API_URL):");
1191
+ const key = prompt("Enter new environment variable key name (e.g. API_URL, NEXT_PUBLIC_API_URL, REACT_APP_API_URL, VITE_API_URL):");
1158
1192
  if (key) {
1159
1193
  const value = prompt(`Enter value for ${key}:`) || "";
1160
1194
  this.store.setOverride(key, value);
@@ -1372,6 +1406,23 @@ var LambaManager = class {
1372
1406
  * in a dynamic proxy that implicitly resolves live overrides from lamba.
1373
1407
  */
1374
1408
  wrap(targetEnv) {
1409
+ if (!this.store) {
1410
+ this.init();
1411
+ }
1412
+ if (targetEnv && typeof targetEnv === "object" && this.store) {
1413
+ try {
1414
+ const defaultObj = {};
1415
+ for (const [k, v] of Object.entries(targetEnv)) {
1416
+ if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") {
1417
+ defaultObj[k] = String(v);
1418
+ }
1419
+ }
1420
+ if (Object.keys(defaultObj).length > 0) {
1421
+ this.store.mergeDefaults(defaultObj);
1422
+ }
1423
+ } catch (e) {
1424
+ }
1425
+ }
1375
1426
  const self = this;
1376
1427
  return new Proxy(targetEnv, {
1377
1428
  get(target, prop) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/preset-manager.ts","../src/core/env-parser.ts","../src/core/store.ts","../src/core/network-interceptor.ts","../src/ui/styles.ts","../src/ui/shadow-dom.ts","../src/ui/launcher.ts","../src/ui/modal.ts"],"sourcesContent":["import { LambaOptions, EnvChangeListener } from './core/types';\nimport { EnvStore } from './core/store';\nimport { NetworkInterceptor } from './core/network-interceptor';\nimport { createShadowHost } from './ui/shadow-dom';\nimport { LauncherUI } from './ui/launcher';\nimport { ModalUI } from './ui/modal';\n\nexport class LambaManager {\n private store: EnvStore | null = null;\n private launcher: LauncherUI | null = null;\n private modal: ModalUI | null = null;\n private networkInterceptor: NetworkInterceptor | null = null;\n private options: LambaOptions = {};\n private isInitialized: boolean = false;\n\n /**\n * Implicit ES Proxy object where properties like `lamba.env.VITE_API_BASE_URL`\n * return the live active overridden value automatically.\n */\n public env: Record<string, string>;\n\n constructor() {\n const self = this;\n\n // Create implicit Proxy for lamba.env\n this.env = new Proxy({}, {\n get(_target, prop: string) {\n if (typeof prop === 'string') {\n return self.get(prop);\n }\n return undefined;\n },\n set(_target, prop: string, value: string) {\n if (typeof prop === 'string') {\n self.set(prop, String(value));\n return true;\n }\n return false;\n }\n });\n }\n\n /**\n * Wraps any environment object (such as `import.meta.env` or `process.env`)\n * in a dynamic proxy that implicitly resolves live overrides from lamba.\n */\n public wrap<T extends object>(targetEnv: T): T {\n const self = this;\n return new Proxy(targetEnv, {\n get(target, prop: string | symbol) {\n if (typeof prop === 'string') {\n const overrideVal = self.get(prop);\n if (overrideVal !== undefined && overrideVal !== '') {\n return overrideVal;\n }\n }\n return Reflect.get(target, prop);\n }\n });\n }\n\n /**\n * Initializes lamba with custom options and mounts the floating UI.\n */\n public init(options: LambaOptions = {}): this {\n if (typeof window === 'undefined') return this;\n if (this.isInitialized) return this;\n\n this.options = {\n enabled: true,\n position: 'bottom-right',\n autoFetchEnvFile: false,\n interceptNetworkRequests: true,\n ...options,\n };\n\n\n if (this.options.enabled === false) return this;\n\n // 1. Initialize Store\n this.store = new EnvStore(this.options);\n\n // 2. Initialize Network Interceptor if enabled\n if (this.options.interceptNetworkRequests !== false) {\n this.networkInterceptor = new NetworkInterceptor(this.store);\n this.networkInterceptor.enable();\n }\n\n // 3. Mount UI in Shadow DOM\n const mountUI = () => {\n if (this.launcher || !this.store) return;\n\n const { shadowRoot } = createShadowHost();\n\n this.modal = new ModalUI(shadowRoot, this.store, () => {\n // Modal closed callback\n });\n\n this.launcher = new LauncherUI(shadowRoot, this.options.position, () => {\n this.modal?.toggle();\n });\n\n // Sync badge count with initial store overrides count\n const initialOverridesCount = Object.keys(this.store.getOverrides()).length;\n this.launcher.updateBadgeCount(initialOverridesCount);\n\n // Subscribe launcher badge to store changes\n this.store.subscribeStoreChange(() => {\n const count = Object.keys(this.store!.getOverrides()).length;\n this.launcher?.updateBadgeCount(count);\n });\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mountUI);\n } else {\n mountUI();\n }\n\n this.isInitialized = true;\n return this;\n }\n\n /**\n * Gets the active value of an environment variable (returns overridden value if active, otherwise default).\n */\n public get(key: string, fallback?: string): string {\n if (!this.store) {\n // Lazy init store if called before explicit init\n this.init();\n }\n return this.store?.get(key, fallback) ?? fallback ?? '';\n }\n\n /**\n * Overrides an environment variable live at runtime.\n */\n public set(key: string, value: string): void {\n if (!this.store) this.init();\n this.store?.setOverride(key, value);\n }\n\n /**\n * Removes an override for a specific environment variable key.\n */\n public remove(key: string): void {\n this.store?.removeOverride(key);\n }\n\n /**\n * Resets all environment variable overrides.\n */\n public reset(): void {\n this.store?.resetAllOverrides();\n }\n\n /**\n * Subscribes to environment variable changes.\n */\n public onChange(listener: EnvChangeListener): () => void {\n if (!this.store) this.init();\n return this.store?.subscribeEnvChange(listener) ?? (() => {});\n }\n\n /**\n * Programmatically opens the lamba floating modal.\n */\n public open(): void {\n this.modal?.open();\n }\n\n /**\n * Programmatically closes the lamba floating modal.\n */\n public close(): void {\n this.modal?.close();\n }\n\n /**\n * Programmatically toggles the lamba floating modal.\n */\n public toggle(): void {\n this.modal?.toggle();\n }\n}\n\n// Global Singleton Instance\nexport const lamba = new LambaManager();\n\n// Auto-initialize when included as a CDN script tag in browser\nif (typeof window !== 'undefined') {\n (window as any).lamba = lamba;\n\n // Auto init if script loaded directly via CDN script tag\n const isCdnScript = document.currentScript !== null || !!document.querySelector('script[src*=\"lamba\"]');\n if (isCdnScript) {\n lamba.init();\n }\n}\n\nexport default lamba;\nexport * from './core/types';\nexport { parseEnvString, stringifyEnv } from './core/env-parser';\n","import { PresetProfile } from './types';\n\nconst STORAGE_PRESETS_KEY = '__lamba_presets__';\nconst STORAGE_ACTIVE_PRESET_KEY = '__lamba_active_preset__';\n\nexport class PresetManager {\n private presets: PresetProfile[] = [];\n private activePresetId: string | null = null;\n\n constructor() {\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from localStorage', e);\n }\n }\n\n private saveToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to localStorage', e);\n }\n }\n\n public getPresets(): PresetProfile[] {\n return [...this.presets];\n }\n\n public getActivePresetId(): string | null {\n return this.activePresetId;\n }\n\n public createPreset(name: string, overrides: Record<string, string>): PresetProfile {\n const newPreset: PresetProfile = {\n id: 'preset_' + Math.random().toString(36).substring(2, 9),\n name: name.trim() || 'Untitled Preset',\n overrides: { ...overrides },\n createdAt: Date.now(),\n };\n\n this.presets.push(newPreset);\n this.saveToStorage();\n return newPreset;\n }\n\n public deletePreset(id: string): void {\n this.presets = this.presets.filter((p) => p.id !== id);\n if (this.activePresetId === id) {\n this.activePresetId = null;\n }\n this.saveToStorage();\n }\n\n public setActivePreset(id: string | null): PresetProfile | null {\n if (!id) {\n this.activePresetId = null;\n this.saveToStorage();\n return null;\n }\n\n const preset = this.presets.find((p) => p.id === id);\n if (preset) {\n this.activePresetId = id;\n this.saveToStorage();\n return preset;\n }\n return null;\n }\n}\n","/**\n * Parses raw .env string into a key-value Record.\n */\nexport function parseEnvString(rawText: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = rawText.split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line || line.startsWith('#')) continue;\n\n if (line.startsWith('export ')) {\n line = line.slice(7).trim();\n }\n\n const equalsIdx = line.indexOf('=');\n if (equalsIdx === -1) continue;\n\n const key = line.slice(0, equalsIdx).trim();\n let val = line.slice(equalsIdx + 1).trim();\n\n // Remove quotes if wrapped in single or double quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n\n // Replace escaped newlines\n val = val.replace(/\\\\n/g, '\\n');\n\n if (key) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Stringifies a Record<string, string> into standard .env format.\n */\nexport function stringifyEnv(env: Record<string, string>): string {\n return Object.entries(env)\n .map(([key, val]) => {\n const needsQuotes = val.includes(' ') || val.includes('\\n') || val.includes('#');\n const formattedVal = needsQuotes ? `\"${val.replace(/\"/g, '\\\\\"')}\"` : val;\n return `${key}=${formattedVal}`;\n })\n .join('\\n');\n}\n\n/**\n * Auto-discovers environment variables available in the current browser runtime.\n */\nexport function autoDiscoverBrowserEnv(): Record<string, string> {\n const discovered: Record<string, string> = {};\n\n if (typeof window === 'undefined') return discovered;\n\n // 1. Inspect window.process.env\n try {\n const winProcess = (window as any).process;\n if (winProcess && winProcess.env && typeof winProcess.env === 'object') {\n for (const [k, v] of Object.entries(winProcess.env)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n discovered[k] = String(v);\n }\n }\n }\n } catch (e) {}\n\n // 2. Inspect window.__ENV__ or window.ENV\n try {\n const customEnv = (window as any).__ENV__ || (window as any).ENV;\n if (customEnv && typeof customEnv === 'object') {\n for (const [k, v] of Object.entries(customEnv)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n discovered[k] = String(v);\n }\n }\n }\n } catch (e) {}\n\n // 3. Inspect HTML meta tags (e.g. <meta name=\"env:API_KEY\" content=\"xyz\"> or <meta name=\"lamba-env\" content=\"API_KEY=xyz&MODE=dev\">)\n try {\n const metaTags = document.querySelectorAll('meta');\n metaTags.forEach((meta) => {\n const name = meta.getAttribute('name');\n const content = meta.getAttribute('content');\n if (!name || content === null) return;\n\n if (name.startsWith('env:')) {\n const key = name.slice(4);\n discovered[key] = content;\n } else if (name === 'lamba-env') {\n const parsed = new URLSearchParams(content);\n parsed.forEach((val, key) => {\n discovered[key] = val;\n });\n }\n });\n } catch (e) {}\n\n return discovered;\n}\n\n/**\n * Attempts to fetch /.env or /.env.example from root URL if hosted in dev mode.\n */\nexport async function tryFetchRootEnvFile(): Promise<Record<string, string>> {\n const paths = ['/.env', '/.env.local', '/.env.example'];\n for (const path of paths) {\n try {\n const res = await fetch(path, { headers: { Accept: 'text/plain' } });\n if (res.ok) {\n const text = await res.text();\n if (text && text.includes('=')) {\n return parseEnvString(text);\n }\n }\n } catch (e) {\n // Ignore network errors in production or non-accessible env files\n }\n }\n return {};\n}\n","import {\n EnvVariable,\n EnvChangeListener,\n StoreChangeListener,\n LambaOptions,\n PresetProfile,\n} from './types';\nimport { PresetManager } from './preset-manager';\nimport { autoDiscoverBrowserEnv, tryFetchRootEnvFile } from './env-parser';\n\nconst STORAGE_OVERRIDES_KEY = '__lamba_overrides__';\nconst DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;\n\nexport class EnvStore {\n private variables: Map<string, EnvVariable> = new Map();\n private overrides: Record<string, string> = {};\n private secretPattern: RegExp;\n private envChangeListeners: Set<EnvChangeListener> = new Set();\n private storeChangeListeners: Set<StoreChangeListener> = new Set();\n public presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.presetManager = new PresetManager();\n\n // 1. Load initial overrides from localStorage\n this.loadOverridesFromStorage();\n\n // 2. Register initial options.env if provided\n if (options.env) {\n this.mergeDefaults(options.env);\n }\n\n // 3. Auto-discover from browser runtime\n const autoDiscovered = autoDiscoverBrowserEnv();\n this.mergeDefaults(autoDiscovered);\n\n // 4. Try fetching root /.env file if explicitly enabled\n if (options.autoFetchEnvFile === true && typeof window !== 'undefined') {\n tryFetchRootEnvFile().then((fileEnv) => {\n if (Object.keys(fileEnv).length > 0) {\n this.mergeDefaults(fileEnv);\n }\n });\n }\n\n\n // 5. Patch window.process.env\n this.patchProcessEnv();\n }\n\n private loadOverridesFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);\n if (stored) {\n this.overrides = JSON.parse(stored);\n }\n } catch (e) {\n console.warn('[lamba] Failed to parse overrides from localStorage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to localStorage', e);\n }\n }\n\n /**\n * Monkey-patches window.process.env to reactively return overridden values.\n */\n private patchProcessEnv(): void {\n if (typeof window === 'undefined') return;\n\n const win = window as any;\n if (!win.process) {\n win.process = { env: {} };\n } else if (!win.process.env) {\n win.process.env = {};\n }\n\n const self = this;\n const targetEnv = win.process.env;\n\n // Use Proxy if supported\n try {\n win.process.env = new Proxy(targetEnv, {\n get(target, prop: string) {\n if (typeof prop === 'string') {\n const val = self.get(prop);\n if (val !== undefined) return val;\n }\n return target[prop];\n },\n set(target, prop: string, value: any) {\n target[prop] = value;\n return true;\n },\n });\n } catch (e) {\n // Fallback for environment where Proxy is restricted\n }\n }\n\n public mergeDefaults(env: Record<string, string>): void {\n let changed = false;\n for (const [key, defaultValue] of Object.entries(env)) {\n const isOverridden = key in this.overrides;\n const currentValue = isOverridden ? this.overrides[key] : defaultValue;\n const isSecret = this.secretPattern.test(key);\n\n const existing = this.variables.get(key);\n if (!existing) {\n this.variables.set(key, {\n key,\n value: currentValue,\n defaultValue,\n isOverridden,\n isSecret,\n });\n changed = true;\n } else {\n // Update default value if changed\n if (existing.defaultValue !== defaultValue) {\n existing.defaultValue = defaultValue;\n if (!existing.isOverridden) {\n existing.value = defaultValue;\n }\n changed = true;\n }\n }\n }\n\n if (changed) {\n this.notifyStoreChanged();\n }\n }\n\n public get(key: string, fallback?: string): string | undefined {\n if (key in this.overrides) {\n return this.overrides[key];\n }\n const item = this.variables.get(key);\n if (item) return item.value;\n return fallback;\n }\n\n public getAll(): Record<string, EnvVariable> {\n const result: Record<string, EnvVariable> = {};\n this.variables.forEach((varObj, key) => {\n result[key] = { ...varObj };\n });\n return result;\n }\n\n public getOverrides(): Record<string, string> {\n return { ...this.overrides };\n }\n\n public setOverride(key: string, value: string): void {\n const trimmedKey = key.trim();\n if (!trimmedKey) return;\n\n this.overrides[trimmedKey] = value;\n this.saveOverridesToStorage();\n\n let item = this.variables.get(trimmedKey);\n if (!item) {\n item = {\n key: trimmedKey,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(trimmedKey),\n };\n this.variables.set(trimmedKey, item);\n } else {\n item.value = value;\n item.isOverridden = true;\n }\n\n this.emitEnvChange(trimmedKey, value, true);\n this.notifyStoreChanged();\n }\n\n public removeOverride(key: string): void {\n if (key in this.overrides) {\n delete this.overrides[key];\n this.saveOverridesToStorage();\n\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n\n this.notifyStoreChanged();\n }\n }\n\n public resetAllOverrides(): void {\n const keys = Object.keys(this.overrides);\n this.overrides = {};\n this.saveOverridesToStorage();\n this.presetManager.setActivePreset(null);\n\n keys.forEach((key) => {\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n });\n\n this.notifyStoreChanged();\n }\n\n public applyPreset(presetId: string | null): void {\n const preset = this.presetManager.setActivePreset(presetId);\n this.overrides = preset ? { ...preset.overrides } : {};\n this.saveOverridesToStorage();\n\n // Re-evaluate all variables\n this.variables.forEach((item, key) => {\n if (key in this.overrides) {\n item.value = this.overrides[key];\n item.isOverridden = true;\n } else {\n item.value = item.defaultValue;\n item.isOverridden = false;\n }\n this.emitEnvChange(key, item.value, item.isOverridden);\n });\n\n // Also include extra override keys from preset that weren't in variables\n if (preset) {\n for (const [key, value] of Object.entries(preset.overrides)) {\n if (!this.variables.has(key)) {\n this.variables.set(key, {\n key,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(key),\n });\n this.emitEnvChange(key, value, true);\n }\n }\n }\n\n this.notifyStoreChanged();\n }\n\n public subscribeEnvChange(listener: EnvChangeListener): () => void {\n this.envChangeListeners.add(listener);\n return () => this.envChangeListeners.delete(listener);\n }\n\n public subscribeStoreChange(listener: StoreChangeListener): () => void {\n this.storeChangeListeners.add(listener);\n return () => this.storeChangeListeners.delete(listener);\n }\n\n private emitEnvChange(key: string, value: string, isOverridden: boolean): void {\n this.envChangeListeners.forEach((fn) => fn(key, value, isOverridden));\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lamba:env-change', {\n detail: { key, value, isOverridden },\n })\n );\n }\n }\n\n private notifyStoreChanged(): void {\n const varsObj = this.getAll();\n const presets = this.presetManager.getPresets();\n const activePresetId = this.presetManager.getActivePresetId();\n this.storeChangeListeners.forEach((fn) => fn(varsObj, presets, activePresetId));\n }\n}\n","import { EnvStore } from './store';\n\nexport class NetworkInterceptor {\n private store: EnvStore;\n private originalFetch: typeof window.fetch | null = null;\n private originalXHRPost: typeof XMLHttpRequest.prototype.open | null = null;\n private isIntercepting: boolean = false;\n\n constructor(store: EnvStore) {\n this.store = store;\n }\n\n public enable(): void {\n if (typeof window === 'undefined' || this.isIntercepting) return;\n\n this.patchFetch();\n this.patchXHR();\n this.isIntercepting = true;\n }\n\n public disable(): void {\n if (typeof window === 'undefined' || !this.isIntercepting) return;\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n if (this.originalXHRPost) {\n XMLHttpRequest.prototype.open = this.originalXHRPost;\n this.originalXHRPost = null;\n }\n this.isIntercepting = false;\n }\n\n /**\n * Rewrite a given URL by checking if any default env variable URL value matches\n * and replacing it with the active overridden value.\n */\n public rewriteUrl(url: string | URL | Request): string | URL | Request {\n if (typeof url !== 'string') return url;\n\n const allVars = this.store.getAll();\n let resultUrl = url;\n\n for (const varObj of Object.values(allVars)) {\n if (varObj.isOverridden && varObj.defaultValue && varObj.value) {\n // Trim trailing slashes for accurate matching\n const defaultBase = varObj.defaultValue.replace(/\\/+$/, '');\n const overrideBase = varObj.value.replace(/\\/+$/, '');\n\n if (defaultBase && resultUrl.includes(defaultBase)) {\n resultUrl = resultUrl.replace(defaultBase, overrideBase);\n }\n }\n }\n\n return resultUrl;\n }\n\n private patchFetch(): void {\n if (!window.fetch) return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n let finalInput = input;\n\n if (typeof input === 'string') {\n finalInput = self.rewriteUrl(input) as string;\n } else if (input instanceof URL) {\n const rewritten = self.rewriteUrl(input.toString()) as string;\n finalInput = new URL(rewritten);\n } else if (input instanceof Request) {\n const rewrittenUrl = self.rewriteUrl(input.url) as string;\n if (rewrittenUrl !== input.url) {\n finalInput = new Request(rewrittenUrl, input);\n }\n }\n\n return self.originalFetch!.call(this, finalInput, init);\n };\n }\n\n private patchXHR(): void {\n if (!window.XMLHttpRequest) return;\n\n this.originalXHRPost = XMLHttpRequest.prototype.open;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ): void {\n const stringUrl = typeof url === 'string' ? url : url.toString();\n const rewrittenUrl = self.rewriteUrl(stringUrl) as string;\n\n return self.originalXHRPost!.call(\n this,\n method,\n rewrittenUrl,\n async,\n username ?? null,\n password ?? null\n );\n };\n }\n}\n","export const LAMBA_STYLES = `\n:host {\n --lamba-bg-main: #0f172a;\n --lamba-bg-card: #1e293b;\n --lamba-bg-hover: #334155;\n --lamba-border: rgba(255, 255, 255, 0.1);\n --lamba-text-primary: #f8fafc;\n --lamba-text-secondary: #94a3b8;\n --lamba-primary: #6366f1;\n --lamba-primary-hover: #4f46e5;\n --lamba-accent: #06b6d4;\n --lamba-success: #10b981;\n --lamba-danger: #ef4444;\n --lamba-warning: #f59e0b;\n --lamba-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --lamba-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4);\n\n font-family: var(--lamba-font);\n font-size: 14px;\n line-height: 1.5;\n color: var(--lamba-text-primary);\n box-sizing: border-box;\n z-index: 999999;\n}\n\n*, *:before, *:after {\n box-sizing: border-box;\n}\n\n/* Floating Launcher Button */\n.lamba-launcher {\n position: fixed;\n z-index: 999999;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.4), 0 4px 6px -4px rgba(99, 102, 241, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.2);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n user-select: none;\n}\n\n.lamba-launcher:hover {\n transform: scale(1.08);\n box-shadow: 0 14px 20px -3px rgba(99, 102, 241, 0.6), 0 6px 8px -4px rgba(99, 102, 241, 0.3);\n}\n\n.lamba-launcher:active {\n transform: scale(0.95);\n}\n\n.lamba-launcher-bottom-right { bottom: 24px; right: 24px; }\n.lamba-launcher-bottom-left { bottom: 24px; left: 24px; }\n.lamba-launcher-top-right { top: 24px; right: 24px; }\n.lamba-launcher-top-left { top: 24px; left: 24px; }\n\n.lamba-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--lamba-accent);\n color: #000;\n font-size: 11px;\n font-weight: 700;\n min-width: 20px;\n height: 20px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 5px;\n border: 2px solid var(--lamba-bg-main);\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n animation: pulse-scale 2s infinite;\n}\n\n@keyframes pulse-scale {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.15); }\n}\n\n/* Modal Overlay */\n.lamba-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.7);\n backdrop-filter: blur(8px);\n z-index: 999998;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.25s ease, visibility 0.25s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.lamba-overlay.active {\n opacity: 1;\n visibility: visible;\n}\n\n/* Main Modal Panel */\n.lamba-modal {\n width: 100%;\n max-width: 820px;\n max-height: 85vh;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n border-radius: 16px;\n box-shadow: var(--lamba-shadow);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform: translateY(20px) scale(0.96);\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.lamba-overlay.active .lamba-modal {\n transform: translateY(0) scale(1);\n}\n\n/* Header */\n.lamba-header {\n padding: 20px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: rgba(30, 41, 59, 0.4);\n}\n\n.lamba-brand {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.lamba-logo {\n font-size: 18px;\n font-weight: 800;\n letter-spacing: -0.5px;\n background: linear-gradient(135deg, #a5b4fc 0%, #6366f1 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-tag {\n background: rgba(99, 102, 241, 0.15);\n color: #a5b4fc;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 6px;\n font-weight: 600;\n border: 1px solid rgba(99, 102, 241, 0.3);\n}\n\n.lamba-close-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 6px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-close-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n/* Controls Bar (Search & Filters) */\n.lamba-controls {\n padding: 16px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n background: var(--lamba-bg-main);\n}\n\n.lamba-search-box {\n flex: 1;\n min-width: 220px;\n position: relative;\n}\n\n.lamba-search-input {\n width: 100%;\n padding: 10px 14px 10px 38px;\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 8px;\n color: var(--lamba-text-primary);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.lamba-search-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--lamba-text-secondary);\n pointer-events: none;\n}\n\n.lamba-tabs {\n display: flex;\n gap: 4px;\n background: var(--lamba-bg-card);\n padding: 4px;\n border-radius: 8px;\n border: 1px solid var(--lamba-border);\n}\n\n.lamba-tab {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.lamba-tab.active {\n background: var(--lamba-primary);\n color: #ffffff;\n}\n\n/* Preset Bar */\n.lamba-presets-bar {\n padding: 12px 24px;\n background: rgba(30, 41, 59, 0.3);\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.lamba-preset-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.lamba-select {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 6px 12px;\n border-radius: 6px;\n outline: none;\n font-size: 13px;\n cursor: pointer;\n}\n\n/* List Content */\n.lamba-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.lamba-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.lamba-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.lamba-content::-webkit-scrollbar-thumb {\n background: var(--lamba-bg-hover);\n border-radius: 3px;\n}\n\n/* Variable Row Card */\n.lamba-var-card {\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 10px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color 0.15s ease;\n}\n\n.lamba-var-card.is-overridden {\n border-color: rgba(99, 102, 241, 0.5);\n background: linear-gradient(180deg, var(--lamba-bg-card) 0%, rgba(99, 102, 241, 0.05) 100%);\n}\n\n.lamba-var-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.lamba-var-key {\n font-weight: 700;\n font-family: monospace;\n color: #a5b4fc;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-modified-pill {\n font-size: 10px;\n font-weight: 700;\n background: rgba(16, 185, 129, 0.2);\n color: #34d399;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid rgba(16, 185, 129, 0.4);\n}\n\n.lamba-var-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.lamba-icon-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-icon-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n.lamba-var-input-group {\n display: flex;\n gap: 8px;\n}\n\n.lamba-input {\n flex: 1;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n color: var(--lamba-text-primary);\n padding: 8px 12px;\n border-radius: 6px;\n font-family: monospace;\n font-size: 13px;\n outline: none;\n}\n\n.lamba-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-diff {\n font-size: 11px;\n color: var(--lamba-text-secondary);\n font-family: monospace;\n padding-left: 2px;\n}\n\n.lamba-diff-val {\n color: var(--lamba-warning);\n}\n\n/* Empty State */\n.lamba-empty {\n padding: 40px 20px;\n text-align: center;\n color: var(--lamba-text-secondary);\n}\n\n/* Footer Actions Bar */\n.lamba-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--lamba-border);\n background: rgba(30, 41, 59, 0.4);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.lamba-btn {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 8px 14px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n}\n\n.lamba-btn:hover {\n background: var(--lamba-bg-hover);\n}\n\n.lamba-btn-primary {\n background: var(--lamba-primary);\n border-color: var(--lamba-primary);\n color: #ffffff;\n}\n\n.lamba-btn-primary:hover {\n background: var(--lamba-primary-hover);\n}\n\n.lamba-btn-danger {\n background: rgba(239, 68, 68, 0.15);\n color: #fca5a5;\n border-color: rgba(239, 68, 68, 0.3);\n}\n\n.lamba-btn-danger:hover {\n background: rgba(239, 68, 68, 0.3);\n}\n`;\n","import { LAMBA_STYLES } from './styles';\n\nexport function createShadowHost(): { host: HTMLElement; shadowRoot: ShadowRoot } {\n if (typeof document === 'undefined') {\n throw new Error('[lamba] Document object not available.');\n }\n\n let host = document.getElementById('lamba-root') as HTMLElement;\n if (!host) {\n host = document.createElement('lamba-widget');\n host.id = 'lamba-root';\n document.body.appendChild(host);\n }\n\n let shadowRoot = host.shadowRoot;\n if (!shadowRoot) {\n shadowRoot = host.attachShadow({ mode: 'open' });\n\n // Inject styles\n const styleEl = document.createElement('style');\n styleEl.textContent = LAMBA_STYLES;\n shadowRoot.appendChild(styleEl);\n }\n\n return { host, shadowRoot };\n}\n","export class LauncherUI {\n private element: HTMLElement;\n private badgeElement: HTMLElement;\n private onClickCallback: () => void;\n\n constructor(\n container: ShadowRoot,\n position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' = 'bottom-right',\n onClick: () => void\n ) {\n this.onClickCallback = onClick;\n\n this.element = document.createElement('div');\n this.element.className = `lamba-launcher lamba-launcher-${position}`;\n this.element.title = 'Open lamba Environment Controls';\n\n // SVG Settings Icon\n this.element.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n `;\n\n // Counter Badge\n this.badgeElement = document.createElement('div');\n this.badgeElement.className = 'lamba-badge';\n this.badgeElement.style.display = 'none';\n this.element.appendChild(this.badgeElement);\n\n this.element.addEventListener('click', () => this.onClickCallback());\n container.appendChild(this.element);\n }\n\n public updateBadgeCount(count: number): void {\n if (count > 0) {\n this.badgeElement.textContent = String(count);\n this.badgeElement.style.display = 'flex';\n } else {\n this.badgeElement.style.display = 'none';\n }\n }\n\n public setVisible(visible: boolean): void {\n this.element.style.display = visible ? 'flex' : 'none';\n }\n}\n","import { EnvStore } from '../core/store';\nimport { EnvVariable, PresetProfile } from '../core/types';\nimport { parseEnvString, stringifyEnv } from '../core/env-parser';\n\nexport class ModalUI {\n private overlay: HTMLElement;\n private modal: HTMLElement;\n private contentList: HTMLElement;\n private searchInput: HTMLInputElement;\n private tabAllBtn: HTMLElement;\n private tabOverriddenBtn: HTMLElement;\n private tabSecretsBtn: HTMLElement;\n private presetSelect: HTMLSelectElement;\n private savePresetBtn: HTMLElement;\n private activeTab: 'all' | 'overridden' | 'secrets' = 'all';\n private searchQuery: string = '';\n private store: EnvStore;\n private secretVisibilityMap: Map<string, boolean> = new Map();\n private isOpen: boolean = false;\n\n constructor(container: ShadowRoot, store: EnvStore, onClose: () => void) {\n this.store = store;\n\n // Build DOM layout\n this.overlay = document.createElement('div');\n this.overlay.className = 'lamba-overlay';\n\n this.modal = document.createElement('div');\n this.modal.className = 'lamba-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'lamba-header';\n header.innerHTML = `\n <div class=\"lamba-brand\">\n <div class=\"lamba-logo\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\"/>\n </svg>\n lamba\n </div>\n <span class=\"lamba-tag\">Dev Environment Override</span>\n </div>\n <button class=\"lamba-close-btn\" title=\"Close modal\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n `;\n header.querySelector('.lamba-close-btn')?.addEventListener('click', () => {\n this.close();\n onClose();\n });\n\n // Controls Bar (Search & Filter Tabs)\n const controls = document.createElement('div');\n controls.className = 'lamba-controls';\n\n const searchBox = document.createElement('div');\n searchBox.className = 'lamba-search-box';\n searchBox.innerHTML = `\n <svg class=\"lamba-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n <input type=\"text\" class=\"lamba-search-input\" placeholder=\"Search environment keys or values...\" />\n `;\n this.searchInput = searchBox.querySelector('.lamba-search-input') as HTMLInputElement;\n this.searchInput.addEventListener('input', (e) => {\n this.searchQuery = (e.target as HTMLInputElement).value.toLowerCase();\n this.render();\n });\n\n const tabs = document.createElement('div');\n tabs.className = 'lamba-tabs';\n tabs.innerHTML = `\n <button class=\"lamba-tab active\" data-tab=\"all\">All</button>\n <button class=\"lamba-tab\" data-tab=\"overridden\">Modified</button>\n <button class=\"lamba-tab\" data-tab=\"secrets\">Secrets</button>\n `;\n\n this.tabAllBtn = tabs.querySelector('[data-tab=\"all\"]') as HTMLElement;\n this.tabOverriddenBtn = tabs.querySelector('[data-tab=\"overridden\"]') as HTMLElement;\n this.tabSecretsBtn = tabs.querySelector('[data-tab=\"secrets\"]') as HTMLElement;\n\n tabs.querySelectorAll('.lamba-tab').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n tabs.querySelectorAll('.lamba-tab').forEach((t) => t.classList.remove('active'));\n const target = e.currentTarget as HTMLElement;\n target.classList.add('active');\n this.activeTab = target.getAttribute('data-tab') as any;\n this.render();\n });\n });\n\n controls.appendChild(searchBox);\n controls.appendChild(tabs);\n\n // Presets Bar\n const presetsBar = document.createElement('div');\n presetsBar.className = 'lamba-presets-bar';\n presetsBar.innerHTML = `\n <div class=\"lamba-preset-selector\">\n <span style=\"color: var(--lamba-text-secondary); font-weight: 600;\">Preset Profile:</span>\n <select class=\"lamba-select lamba-preset-dropdown\">\n <option value=\"\">Default (Current Overrides)</option>\n </select>\n </div>\n <button class=\"lamba-btn lamba-save-preset-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"></path>\n <polyline points=\"17 21 17 13 7 13 7 21\"></polyline>\n <polyline points=\"7 3 7 8 15 8\"></polyline>\n </svg>\n Save as Preset\n </button>\n `;\n\n this.presetSelect = presetsBar.querySelector('.lamba-preset-dropdown') as HTMLSelectElement;\n this.presetSelect.addEventListener('change', () => {\n const selectedId = this.presetSelect.value || null;\n this.store.applyPreset(selectedId);\n });\n\n this.savePresetBtn = presetsBar.querySelector('.lamba-save-preset-btn') as HTMLElement;\n this.savePresetBtn.addEventListener('click', () => {\n const name = prompt('Enter a name for this Environment Preset Profile:', 'Staging Environment');\n if (name) {\n const overrides = this.store.getOverrides();\n this.store.presetManager.createPreset(name, overrides);\n this.updatePresetDropdown();\n }\n });\n\n // Content List Container\n this.contentList = document.createElement('div');\n this.contentList.className = 'lamba-content';\n\n // Footer Bar\n const footer = document.createElement('div');\n footer.className = 'lamba-footer';\n footer.innerHTML = `\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-add-var-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Add Variable\n </button>\n <button class=\"lamba-btn lamba-import-btn\">Import .env</button>\n <button class=\"lamba-btn lamba-export-btn\">Export .env</button>\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-btn-danger lamba-reset-all-btn\">Reset All</button>\n <button class=\"lamba-btn lamba-btn-primary lamba-reload-btn\">Reload Page</button>\n </div>\n `;\n\n footer.querySelector('.lamba-add-var-btn')?.addEventListener('click', () => {\n const key = prompt('Enter new environment variable key name (e.g. VITE_API_URL):');\n if (key) {\n const value = prompt(`Enter value for ${key}:`) || '';\n this.store.setOverride(key, value);\n }\n });\n\n footer.querySelector('.lamba-import-btn')?.addEventListener('click', () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.env,.txt';\n input.onchange = (e: any) => {\n const file = e.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n const parsed = parseEnvString(content);\n for (const [k, v] of Object.entries(parsed)) {\n this.store.setOverride(k, v);\n }\n }\n };\n reader.readAsText(file);\n }\n };\n input.click();\n });\n\n footer.querySelector('.lamba-export-btn')?.addEventListener('click', () => {\n const allVars = this.store.getAll();\n const exportObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(allVars)) {\n exportObj[k] = v.value;\n }\n const envText = stringifyEnv(exportObj);\n const blob = new Blob([envText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = '.env';\n a.click();\n URL.revokeObjectURL(url);\n });\n\n footer.querySelector('.lamba-reset-all-btn')?.addEventListener('click', () => {\n if (confirm('Are you sure you want to reset all overridden environment variables?')) {\n this.store.resetAllOverrides();\n }\n });\n\n footer.querySelector('.lamba-reload-btn')?.addEventListener('click', () => {\n window.location.reload();\n });\n\n // Assemble modal structure\n this.modal.appendChild(header);\n this.modal.appendChild(controls);\n this.modal.appendChild(presetsBar);\n this.modal.appendChild(this.contentList);\n this.modal.appendChild(footer);\n this.overlay.appendChild(this.modal);\n\n // Close on overlay background click\n this.overlay.addEventListener('click', (e) => {\n if (e.target === this.overlay) {\n this.close();\n onClose();\n }\n });\n\n container.appendChild(this.overlay);\n\n // Subscribe to store updates\n this.store.subscribeStoreChange(() => {\n if (this.isOpen) {\n this.updatePresetDropdown();\n this.render();\n }\n });\n }\n\n public open(): void {\n this.isOpen = true;\n this.updatePresetDropdown();\n this.render();\n this.overlay.classList.add('active');\n }\n\n public close(): void {\n this.isOpen = false;\n this.overlay.classList.remove('active');\n }\n\n public toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private updatePresetDropdown(): void {\n const presets = this.store.presetManager.getPresets();\n const activeId = this.store.presetManager.getActivePresetId();\n\n this.presetSelect.innerHTML = `<option value=\"\">Default (Custom Overrides)</option>`;\n presets.forEach((p) => {\n const opt = document.createElement('option');\n opt.value = p.id;\n opt.textContent = p.name;\n if (p.id === activeId) opt.selected = true;\n this.presetSelect.appendChild(opt);\n });\n }\n\n public render(): void {\n const allVarsMap = this.store.getAll();\n let varList = Object.values(allVarsMap);\n\n // Filter by Tab\n if (this.activeTab === 'overridden') {\n varList = varList.filter((v) => v.isOverridden);\n } else if (this.activeTab === 'secrets') {\n varList = varList.filter((v) => v.isSecret);\n }\n\n // Filter by Search Query\n if (this.searchQuery) {\n varList = varList.filter(\n (v) =>\n v.key.toLowerCase().includes(this.searchQuery) ||\n v.value.toLowerCase().includes(this.searchQuery)\n );\n }\n\n // Sort by overridden first, then alphabetically\n varList.sort((a, b) => {\n if (a.isOverridden !== b.isOverridden) {\n return a.isOverridden ? -1 : 1;\n }\n return a.key.localeCompare(b.key);\n });\n\n this.contentList.innerHTML = '';\n\n if (varList.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'lamba-empty';\n empty.textContent =\n this.searchQuery || this.activeTab !== 'all'\n ? 'No environment variables match your current filter.'\n : 'No environment variables found or registered. Click \"+ Add Variable\" or \"Import .env\" to get started.';\n this.contentList.appendChild(empty);\n return;\n }\n\n varList.forEach((varItem) => {\n const card = this.createVarCard(varItem);\n this.contentList.appendChild(card);\n });\n }\n\n private createVarCard(varItem: EnvVariable): HTMLElement {\n const card = document.createElement('div');\n card.className = `lamba-var-card ${varItem.isOverridden ? 'is-overridden' : ''}`;\n\n const isVisible = this.secretVisibilityMap.get(varItem.key) ?? !varItem.isSecret;\n\n card.innerHTML = `\n <div class=\"lamba-var-meta\">\n <div class=\"lamba-var-key\">\n ${varItem.key}\n ${varItem.isOverridden ? '<span class=\"lamba-modified-pill\">MODIFIED</span>' : ''}\n ${varItem.isSecret ? '<span style=\"font-size:10px; color:var(--lamba-warning); font-weight:600;\">SECRET</span>' : ''}\n </div>\n <div class=\"lamba-var-actions\">\n ${\n varItem.isSecret\n ? `<button class=\"lamba-icon-btn toggle-secret-btn\" title=\"${isVisible ? 'Hide secret' : 'Show secret'}\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n ${\n isVisible\n ? '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>'\n : '<path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>'\n }\n </svg>\n </button>`\n : ''\n }\n ${\n varItem.isOverridden\n ? `<button class=\"lamba-icon-btn reset-var-btn\" title=\"Reset to default\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n <path d=\"M3 3v5h5\"/>\n </svg>\n </button>`\n : ''\n }\n </div>\n </div>\n <div class=\"lamba-var-input-group\">\n <input \n type=\"${isVisible ? 'text' : 'password'}\" \n class=\"lamba-input var-input\" \n value=\"${this.escapeHtml(varItem.value)}\" \n placeholder=\"Value...\"\n />\n </div>\n ${\n varItem.isOverridden && varItem.defaultValue\n ? `<div class=\"lamba-diff\">Original default: <span class=\"lamba-diff-val\">${this.escapeHtml(\n varItem.defaultValue\n )}</span></div>`\n : ''\n }\n `;\n\n const inputEl = card.querySelector('.var-input') as HTMLInputElement;\n inputEl.addEventListener('change', () => {\n this.store.setOverride(varItem.key, inputEl.value);\n });\n\n card.querySelector('.toggle-secret-btn')?.addEventListener('click', () => {\n this.secretVisibilityMap.set(varItem.key, !isVisible);\n this.render();\n });\n\n card.querySelector('.reset-var-btn')?.addEventListener('click', () => {\n this.store.removeOverride(varItem.key);\n });\n\n return card;\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACErB,SAAS,mBAAkE;AAChF,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,MAAI,OAAO,SAAS,eAAe,YAAY;AAC/C,MAAI,CAAC,MAAM;AACT,WAAO,SAAS,cAAc,cAAc;AAC5C,SAAK,KAAK;AACV,aAAS,KAAK,YAAY,IAAI;AAAA,EAChC;AAEA,MAAI,aAAa,KAAK;AACtB,MAAI,CAAC,YAAY;AACf,iBAAa,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAG/C,UAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,YAAQ,cAAc;AACtB,eAAW,YAAY,OAAO;AAAA,EAChC;AAEA,SAAO,EAAE,MAAM,WAAW;AAC5B;;;ACzBO,IAAM,aAAN,MAAiB;AAAA,EAKtB,YACE,WACA,WAAsE,gBACtE,SACA;AACA,SAAK,kBAAkB;AAEvB,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY,iCAAiC,QAAQ;AAClE,SAAK,QAAQ,QAAQ;AAGrB,SAAK,QAAQ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAQzB,SAAK,eAAe,SAAS,cAAc,KAAK;AAChD,SAAK,aAAa,YAAY;AAC9B,SAAK,aAAa,MAAM,UAAU;AAClC,SAAK,QAAQ,YAAY,KAAK,YAAY;AAE1C,SAAK,QAAQ,iBAAiB,SAAS,MAAM,KAAK,gBAAgB,CAAC;AACnE,cAAU,YAAY,KAAK,OAAO;AAAA,EACpC;AAAA,EAEO,iBAAiB,OAAqB;AAC3C,QAAI,QAAQ,GAAG;AACb,WAAK,aAAa,cAAc,OAAO,KAAK;AAC5C,WAAK,aAAa,MAAM,UAAU;AAAA,IACpC,OAAO;AACL,WAAK,aAAa,MAAM,UAAU;AAAA,IACpC;AAAA,EACF;AAAA,EAEO,WAAW,SAAwB;AACxC,SAAK,QAAQ,MAAM,UAAU,UAAU,SAAS;AAAA,EAClD;AACF;;;AC1CO,IAAM,UAAN,MAAc;AAAA,EAgBnB,YAAY,WAAuB,OAAiB,SAAqB;AANzE,SAAQ,YAA8C;AACtD,SAAQ,cAAsB;AAE9B,SAAQ,sBAA4C,oBAAI,IAAI;AAC5D,SAAQ,SAAkB;AAGxB,SAAK,QAAQ;AAGb,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY;AAEzB,SAAK,QAAQ,SAAS,cAAc,KAAK;AACzC,SAAK,MAAM,YAAY;AAGvB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBnB,WAAO,cAAc,kBAAkB,GAAG,iBAAiB,SAAS,MAAM;AACxE,WAAK,MAAM;AACX,cAAQ;AAAA,IACV,CAAC;AAGD,UAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,aAAS,YAAY;AAErB,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AACtB,cAAU,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOtB,SAAK,cAAc,UAAU,cAAc,qBAAqB;AAChE,SAAK,YAAY,iBAAiB,SAAS,CAAC,MAAM;AAChD,WAAK,cAAe,EAAE,OAA4B,MAAM,YAAY;AACpE,WAAK,OAAO;AAAA,IACd,CAAC;AAED,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAMjB,SAAK,YAAY,KAAK,cAAc,kBAAkB;AACtD,SAAK,mBAAmB,KAAK,cAAc,yBAAyB;AACpE,SAAK,gBAAgB,KAAK,cAAc,sBAAsB;AAE9D,SAAK,iBAAiB,YAAY,EAAE,QAAQ,CAAC,QAAQ;AACnD,UAAI,iBAAiB,SAAS,CAAC,MAAM;AACnC,aAAK,iBAAiB,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,OAAO,QAAQ,CAAC;AAC/E,cAAM,SAAS,EAAE;AACjB,eAAO,UAAU,IAAI,QAAQ;AAC7B,aAAK,YAAY,OAAO,aAAa,UAAU;AAC/C,aAAK,OAAO;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAED,aAAS,YAAY,SAAS;AAC9B,aAAS,YAAY,IAAI;AAGzB,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAW,YAAY;AACvB,eAAW,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBvB,SAAK,eAAe,WAAW,cAAc,wBAAwB;AACrE,SAAK,aAAa,iBAAiB,UAAU,MAAM;AACjD,YAAM,aAAa,KAAK,aAAa,SAAS;AAC9C,WAAK,MAAM,YAAY,UAAU;AAAA,IACnC,CAAC;AAED,SAAK,gBAAgB,WAAW,cAAc,wBAAwB;AACtE,SAAK,cAAc,iBAAiB,SAAS,MAAM;AACjD,YAAM,OAAO,OAAO,qDAAqD,qBAAqB;AAC9F,UAAI,MAAM;AACR,cAAM,YAAY,KAAK,MAAM,aAAa;AAC1C,aAAK,MAAM,cAAc,aAAa,MAAM,SAAS;AACrD,aAAK,qBAAqB;AAAA,MAC5B;AAAA,IACF,CAAC;AAGD,SAAK,cAAc,SAAS,cAAc,KAAK;AAC/C,SAAK,YAAY,YAAY;AAG7B,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBnB,WAAO,cAAc,oBAAoB,GAAG,iBAAiB,SAAS,MAAM;AAC1E,YAAM,MAAM,OAAO,8DAA8D;AACjF,UAAI,KAAK;AACP,cAAM,QAAQ,OAAO,mBAAmB,GAAG,GAAG,KAAK;AACnD,aAAK,MAAM,YAAY,KAAK,KAAK;AAAA,MACnC;AAAA,IACF,CAAC;AAED,WAAO,cAAc,mBAAmB,GAAG,iBAAiB,SAAS,MAAM;AACzE,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,OAAO;AACb,YAAM,SAAS;AACf,YAAM,WAAW,CAAC,MAAW;AAC3B,cAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AAC7B,YAAI,MAAM;AACR,gBAAM,SAAS,IAAI,WAAW;AAC9B,iBAAO,SAAS,CAAC,UAAU;AACzB,kBAAM,UAAU,MAAM,QAAQ;AAC9B,gBAAI,SAAS;AACX,oBAAM,SAAS,eAAe,OAAO;AACrC,yBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,qBAAK,MAAM,YAAY,GAAG,CAAC;AAAA,cAC7B;AAAA,YACF;AAAA,UACF;AACA,iBAAO,WAAW,IAAI;AAAA,QACxB;AAAA,MACF;AACA,YAAM,MAAM;AAAA,IACd,CAAC;AAED,WAAO,cAAc,mBAAmB,GAAG,iBAAiB,SAAS,MAAM;AACzE,YAAM,UAAU,KAAK,MAAM,OAAO;AAClC,YAAM,YAAoC,CAAC;AAC3C,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC5C,kBAAU,CAAC,IAAI,EAAE;AAAA,MACnB;AACA,YAAM,UAAU,aAAa,SAAS;AACtC,YAAM,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,aAAa,CAAC;AACvD,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,WAAW;AACb,QAAE,MAAM;AACR,UAAI,gBAAgB,GAAG;AAAA,IACzB,CAAC;AAED,WAAO,cAAc,sBAAsB,GAAG,iBAAiB,SAAS,MAAM;AAC5E,UAAI,QAAQ,sEAAsE,GAAG;AACnF,aAAK,MAAM,kBAAkB;AAAA,MAC/B;AAAA,IACF,CAAC;AAED,WAAO,cAAc,mBAAmB,GAAG,iBAAiB,SAAS,MAAM;AACzE,aAAO,SAAS,OAAO;AAAA,IACzB,CAAC;AAGD,SAAK,MAAM,YAAY,MAAM;AAC7B,SAAK,MAAM,YAAY,QAAQ;AAC/B,SAAK,MAAM,YAAY,UAAU;AACjC,SAAK,MAAM,YAAY,KAAK,WAAW;AACvC,SAAK,MAAM,YAAY,MAAM;AAC7B,SAAK,QAAQ,YAAY,KAAK,KAAK;AAGnC,SAAK,QAAQ,iBAAiB,SAAS,CAAC,MAAM;AAC5C,UAAI,EAAE,WAAW,KAAK,SAAS;AAC7B,aAAK,MAAM;AACX,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,cAAU,YAAY,KAAK,OAAO;AAGlC,SAAK,MAAM,qBAAqB,MAAM;AACpC,UAAI,KAAK,QAAQ;AACf,aAAK,qBAAqB;AAC1B,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,OAAa;AAClB,SAAK,SAAS;AACd,SAAK,qBAAqB;AAC1B,SAAK,OAAO;AACZ,SAAK,QAAQ,UAAU,IAAI,QAAQ;AAAA,EACrC;AAAA,EAEO,QAAc;AACnB,SAAK,SAAS;AACd,SAAK,QAAQ,UAAU,OAAO,QAAQ;AAAA,EACxC;AAAA,EAEO,SAAe;AACpB,QAAI,KAAK,QAAQ;AACf,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,UAAM,UAAU,KAAK,MAAM,cAAc,WAAW;AACpD,UAAM,WAAW,KAAK,MAAM,cAAc,kBAAkB;AAE5D,SAAK,aAAa,YAAY;AAC9B,YAAQ,QAAQ,CAAC,MAAM;AACrB,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,QAAQ,EAAE;AACd,UAAI,cAAc,EAAE;AACpB,UAAI,EAAE,OAAO,SAAU,KAAI,WAAW;AACtC,WAAK,aAAa,YAAY,GAAG;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEO,SAAe;AACpB,UAAM,aAAa,KAAK,MAAM,OAAO;AACrC,QAAI,UAAU,OAAO,OAAO,UAAU;AAGtC,QAAI,KAAK,cAAc,cAAc;AACnC,gBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY;AAAA,IAChD,WAAW,KAAK,cAAc,WAAW;AACvC,gBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ;AAAA,IAC5C;AAGA,QAAI,KAAK,aAAa;AACpB,gBAAU,QAAQ;AAAA,QAChB,CAAC,MACC,EAAE,IAAI,YAAY,EAAE,SAAS,KAAK,WAAW,KAC7C,EAAE,MAAM,YAAY,EAAE,SAAS,KAAK,WAAW;AAAA,MACnD;AAAA,IACF;AAGA,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,UAAI,EAAE,iBAAiB,EAAE,cAAc;AACrC,eAAO,EAAE,eAAe,KAAK;AAAA,MAC/B;AACA,aAAO,EAAE,IAAI,cAAc,EAAE,GAAG;AAAA,IAClC,CAAC;AAED,SAAK,YAAY,YAAY;AAE7B,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,cACJ,KAAK,eAAe,KAAK,cAAc,QACnC,wDACA;AACN,WAAK,YAAY,YAAY,KAAK;AAClC;AAAA,IACF;AAEA,YAAQ,QAAQ,CAAC,YAAY;AAC3B,YAAM,OAAO,KAAK,cAAc,OAAO;AACvC,WAAK,YAAY,YAAY,IAAI;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEQ,cAAc,SAAmC;AACvD,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY,kBAAkB,QAAQ,eAAe,kBAAkB,EAAE;AAE9E,UAAM,YAAY,KAAK,oBAAoB,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ;AAExE,SAAK,YAAY;AAAA;AAAA;AAAA,YAGT,QAAQ,GAAG;AAAA,YACX,QAAQ,eAAe,sDAAsD,EAAE;AAAA,YAC/E,QAAQ,WAAW,6FAA6F,EAAE;AAAA;AAAA;AAAA,YAIlH,QAAQ,WACJ,2DAA2D,YAAY,gBAAgB,aAAa;AAAA;AAAA,sBAG9F,YACI,4FACA,uOACN;AAAA;AAAA,6BAGJ,EACN;AAAA,YAEE,QAAQ,eACJ;AAAA;AAAA;AAAA;AAAA;AAAA,6BAMA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKQ,YAAY,SAAS,UAAU;AAAA;AAAA,mBAE9B,KAAK,WAAW,QAAQ,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,QAKzC,QAAQ,gBAAgB,QAAQ,eAC5B,0EAA0E,KAAK;AAAA,MAC7E,QAAQ;AAAA,IACV,CAAC,kBACD,EACN;AAAA;AAGF,UAAM,UAAU,KAAK,cAAc,YAAY;AAC/C,YAAQ,iBAAiB,UAAU,MAAM;AACvC,WAAK,MAAM,YAAY,QAAQ,KAAK,QAAQ,KAAK;AAAA,IACnD,CAAC;AAED,SAAK,cAAc,oBAAoB,GAAG,iBAAiB,SAAS,MAAM;AACxE,WAAK,oBAAoB,IAAI,QAAQ,KAAK,CAAC,SAAS;AACpD,WAAK,OAAO;AAAA,IACd,CAAC;AAED,SAAK,cAAc,gBAAgB,GAAG,iBAAiB,SAAS,MAAM;AACpE,WAAK,MAAM,eAAe,QAAQ,GAAG;AAAA,IACvC,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,KAAqB;AACtC,WAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAAA,EAC3B;AACF;;;AR/YO,IAAM,eAAN,MAAmB;AAAA,EAcxB,cAAc;AAbd,SAAQ,QAAyB;AACjC,SAAQ,WAA8B;AACtC,SAAQ,QAAwB;AAChC,SAAQ,qBAAgD;AACxD,SAAQ,UAAwB,CAAC;AACjC,SAAQ,gBAAyB;AAS/B,UAAM,OAAO;AAGb,SAAK,MAAM,IAAI,MAAM,CAAC,GAAG;AAAA,MACvB,IAAI,SAAS,MAAc;AACzB,YAAI,OAAO,SAAS,UAAU;AAC5B,iBAAO,KAAK,IAAI,IAAI;AAAA,QACtB;AACA,eAAO;AAAA,MACT;AAAA,MACA,IAAI,SAAS,MAAc,OAAe;AACxC,YAAI,OAAO,SAAS,UAAU;AAC5B,eAAK,IAAI,MAAM,OAAO,KAAK,CAAC;AAC5B,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,KAAuB,WAAiB;AAC7C,UAAM,OAAO;AACb,WAAO,IAAI,MAAM,WAAW;AAAA,MAC1B,IAAI,QAAQ,MAAuB;AACjC,YAAI,OAAO,SAAS,UAAU;AAC5B,gBAAM,cAAc,KAAK,IAAI,IAAI;AACjC,cAAI,gBAAgB,UAAa,gBAAgB,IAAI;AACnD,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO,QAAQ,IAAI,QAAQ,IAAI;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,KAAK,UAAwB,CAAC,GAAS;AAC5C,QAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAI,KAAK,cAAe,QAAO;AAE/B,SAAK,UAAU;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,0BAA0B;AAAA,MAC1B,GAAG;AAAA,IACL;AAGA,QAAI,KAAK,QAAQ,YAAY,MAAO,QAAO;AAG3C,SAAK,QAAQ,IAAI,SAAS,KAAK,OAAO;AAGtC,QAAI,KAAK,QAAQ,6BAA6B,OAAO;AACnD,WAAK,qBAAqB,IAAI,mBAAmB,KAAK,KAAK;AAC3D,WAAK,mBAAmB,OAAO;AAAA,IACjC;AAGA,UAAM,UAAU,MAAM;AACpB,UAAI,KAAK,YAAY,CAAC,KAAK,MAAO;AAElC,YAAM,EAAE,WAAW,IAAI,iBAAiB;AAExC,WAAK,QAAQ,IAAI,QAAQ,YAAY,KAAK,OAAO,MAAM;AAAA,MAEvD,CAAC;AAED,WAAK,WAAW,IAAI,WAAW,YAAY,KAAK,QAAQ,UAAU,MAAM;AACtE,aAAK,OAAO,OAAO;AAAA,MACrB,CAAC;AAGD,YAAM,wBAAwB,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC,EAAE;AACrE,WAAK,SAAS,iBAAiB,qBAAqB;AAGpD,WAAK,MAAM,qBAAqB,MAAM;AACpC,cAAM,QAAQ,OAAO,KAAK,KAAK,MAAO,aAAa,CAAC,EAAE;AACtD,aAAK,UAAU,iBAAiB,KAAK;AAAA,MACvC,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,eAAe,WAAW;AACrC,eAAS,iBAAiB,oBAAoB,OAAO;AAAA,IACvD,OAAO;AACL,cAAQ;AAAA,IACV;AAEA,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,IAAI,KAAa,UAA2B;AACjD,QAAI,CAAC,KAAK,OAAO;AAEf,WAAK,KAAK;AAAA,IACZ;AACA,WAAO,KAAK,OAAO,IAAI,KAAK,QAAQ,KAAK,YAAY;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKO,IAAI,KAAa,OAAqB;AAC3C,QAAI,CAAC,KAAK,MAAO,MAAK,KAAK;AAC3B,SAAK,OAAO,YAAY,KAAK,KAAK;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,KAAmB;AAC/B,SAAK,OAAO,eAAe,GAAG;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACnB,SAAK,OAAO,kBAAkB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,SAAS,UAAyC;AACvD,QAAI,CAAC,KAAK,MAAO,MAAK,KAAK;AAC3B,WAAO,KAAK,OAAO,mBAAmB,QAAQ,MAAM,MAAM;AAAA,IAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKO,OAAa;AAClB,SAAK,OAAO,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACnB,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKO,SAAe;AACpB,SAAK,OAAO,OAAO;AAAA,EACrB;AACF;AAGO,IAAM,QAAQ,IAAI,aAAa;AAGtC,IAAI,OAAO,WAAW,aAAa;AACjC,EAAC,OAAe,QAAQ;AAGxB,QAAM,cAAc,SAAS,kBAAkB,QAAQ,CAAC,CAAC,SAAS,cAAc,sBAAsB;AACtG,MAAI,aAAa;AACf,UAAM,KAAK;AAAA,EACb;AACF;AAEA,IAAO,gBAAQ;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/preset-manager.ts","../src/core/env-parser.ts","../src/core/store.ts","../src/core/network-interceptor.ts","../src/ui/styles.ts","../src/ui/shadow-dom.ts","../src/ui/launcher.ts","../src/ui/modal.ts"],"sourcesContent":["import { LambaOptions, EnvChangeListener } from './core/types';\nimport { EnvStore } from './core/store';\nimport { NetworkInterceptor } from './core/network-interceptor';\nimport { createShadowHost } from './ui/shadow-dom';\nimport { LauncherUI } from './ui/launcher';\nimport { ModalUI } from './ui/modal';\n\nexport class LambaManager {\n private store: EnvStore | null = null;\n private launcher: LauncherUI | null = null;\n private modal: ModalUI | null = null;\n private networkInterceptor: NetworkInterceptor | null = null;\n private options: LambaOptions = {};\n private isInitialized: boolean = false;\n\n /**\n * Implicit ES Proxy object where properties like `lamba.env.VITE_API_BASE_URL`\n * return the live active overridden value automatically.\n */\n public env: Record<string, string>;\n\n constructor() {\n const self = this;\n\n // Create implicit Proxy for lamba.env\n this.env = new Proxy({}, {\n get(_target, prop: string) {\n if (typeof prop === 'string') {\n return self.get(prop);\n }\n return undefined;\n },\n set(_target, prop: string, value: string) {\n if (typeof prop === 'string') {\n self.set(prop, String(value));\n return true;\n }\n return false;\n }\n });\n }\n\n /**\n * Wraps any environment object (such as `import.meta.env` or `process.env`)\n * in a dynamic proxy that implicitly resolves live overrides from lamba.\n */\n public wrap<T extends object>(targetEnv: T): T {\n if (!this.store) {\n this.init();\n }\n\n if (targetEnv && typeof targetEnv === 'object' && this.store) {\n try {\n const defaultObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(targetEnv)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n defaultObj[k] = String(v);\n }\n }\n if (Object.keys(defaultObj).length > 0) {\n this.store.mergeDefaults(defaultObj);\n }\n } catch (e) {\n // Ignore un-enumerable or restricted environment targets\n }\n }\n\n const self = this;\n return new Proxy(targetEnv, {\n get(target, prop: string | symbol) {\n if (typeof prop === 'string') {\n const overrideVal = self.get(prop);\n if (overrideVal !== undefined && overrideVal !== '') {\n return overrideVal;\n }\n }\n return Reflect.get(target, prop);\n }\n });\n }\n\n /**\n * Initializes lamba with custom options and mounts the floating UI.\n */\n public init(options: LambaOptions = {}): this {\n if (typeof window === 'undefined') return this;\n if (this.isInitialized) return this;\n\n this.options = {\n enabled: true,\n position: 'bottom-right',\n autoFetchEnvFile: false,\n interceptNetworkRequests: true,\n ...options,\n };\n\n\n if (this.options.enabled === false) return this;\n\n // 1. Initialize Store\n this.store = new EnvStore(this.options);\n\n // 2. Initialize Network Interceptor if enabled\n if (this.options.interceptNetworkRequests !== false) {\n this.networkInterceptor = new NetworkInterceptor(this.store);\n this.networkInterceptor.enable();\n }\n\n // 3. Mount UI in Shadow DOM\n const mountUI = () => {\n if (this.launcher || !this.store) return;\n\n const { shadowRoot } = createShadowHost();\n\n this.modal = new ModalUI(shadowRoot, this.store, () => {\n // Modal closed callback\n });\n\n this.launcher = new LauncherUI(shadowRoot, this.options.position, () => {\n this.modal?.toggle();\n });\n\n // Sync badge count with initial store overrides count\n const initialOverridesCount = Object.keys(this.store.getOverrides()).length;\n this.launcher.updateBadgeCount(initialOverridesCount);\n\n // Subscribe launcher badge to store changes\n this.store.subscribeStoreChange(() => {\n const count = Object.keys(this.store!.getOverrides()).length;\n this.launcher?.updateBadgeCount(count);\n });\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mountUI);\n } else {\n mountUI();\n }\n\n this.isInitialized = true;\n return this;\n }\n\n /**\n * Gets the active value of an environment variable (returns overridden value if active, otherwise default).\n */\n public get(key: string, fallback?: string): string {\n if (!this.store) {\n // Lazy init store if called before explicit init\n this.init();\n }\n return this.store?.get(key, fallback) ?? fallback ?? '';\n }\n\n /**\n * Overrides an environment variable live at runtime.\n */\n public set(key: string, value: string): void {\n if (!this.store) this.init();\n this.store?.setOverride(key, value);\n }\n\n /**\n * Removes an override for a specific environment variable key.\n */\n public remove(key: string): void {\n this.store?.removeOverride(key);\n }\n\n /**\n * Resets all environment variable overrides.\n */\n public reset(): void {\n this.store?.resetAllOverrides();\n }\n\n /**\n * Subscribes to environment variable changes.\n */\n public onChange(listener: EnvChangeListener): () => void {\n if (!this.store) this.init();\n return this.store?.subscribeEnvChange(listener) ?? (() => {});\n }\n\n /**\n * Programmatically opens the lamba floating modal.\n */\n public open(): void {\n this.modal?.open();\n }\n\n /**\n * Programmatically closes the lamba floating modal.\n */\n public close(): void {\n this.modal?.close();\n }\n\n /**\n * Programmatically toggles the lamba floating modal.\n */\n public toggle(): void {\n this.modal?.toggle();\n }\n}\n\n// Global Singleton Instance\nexport const lamba = new LambaManager();\n\n// Auto-initialize when included as a CDN script tag in browser\nif (typeof window !== 'undefined') {\n (window as any).lamba = lamba;\n\n // Auto init if script loaded directly via CDN script tag\n const isCdnScript = document.currentScript !== null || !!document.querySelector('script[src*=\"lamba\"]');\n if (isCdnScript) {\n lamba.init();\n }\n}\n\nexport default lamba;\nexport * from './core/types';\nexport { parseEnvString, stringifyEnv } from './core/env-parser';\n","import { PresetProfile } from './types';\n\nconst STORAGE_PRESETS_KEY = '__lamba_presets__';\nconst STORAGE_ACTIVE_PRESET_KEY = '__lamba_active_preset__';\n\nexport class PresetManager {\n private presets: PresetProfile[] = [];\n private activePresetId: string | null = null;\n\n constructor() {\n this.loadFromStorage();\n }\n\n private loadFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n const rawPresets = localStorage.getItem(STORAGE_PRESETS_KEY);\n if (rawPresets) {\n this.presets = JSON.parse(rawPresets);\n }\n this.activePresetId = localStorage.getItem(STORAGE_ACTIVE_PRESET_KEY);\n } catch (e) {\n console.warn('[lamba] Failed to parse presets from localStorage', e);\n }\n }\n\n private saveToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_PRESETS_KEY, JSON.stringify(this.presets));\n if (this.activePresetId) {\n localStorage.setItem(STORAGE_ACTIVE_PRESET_KEY, this.activePresetId);\n } else {\n localStorage.removeItem(STORAGE_ACTIVE_PRESET_KEY);\n }\n } catch (e) {\n console.warn('[lamba] Failed to save presets to localStorage', e);\n }\n }\n\n public getPresets(): PresetProfile[] {\n return [...this.presets];\n }\n\n public getActivePresetId(): string | null {\n return this.activePresetId;\n }\n\n public createPreset(name: string, overrides: Record<string, string>): PresetProfile {\n const newPreset: PresetProfile = {\n id: 'preset_' + Math.random().toString(36).substring(2, 9),\n name: name.trim() || 'Untitled Preset',\n overrides: { ...overrides },\n createdAt: Date.now(),\n };\n\n this.presets.push(newPreset);\n this.saveToStorage();\n return newPreset;\n }\n\n public deletePreset(id: string): void {\n this.presets = this.presets.filter((p) => p.id !== id);\n if (this.activePresetId === id) {\n this.activePresetId = null;\n }\n this.saveToStorage();\n }\n\n public setActivePreset(id: string | null): PresetProfile | null {\n if (!id) {\n this.activePresetId = null;\n this.saveToStorage();\n return null;\n }\n\n const preset = this.presets.find((p) => p.id === id);\n if (preset) {\n this.activePresetId = id;\n this.saveToStorage();\n return preset;\n }\n return null;\n }\n}\n","/**\n * Parses raw .env string into a key-value Record.\n */\nexport function parseEnvString(rawText: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = rawText.split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line || line.startsWith('#')) continue;\n\n if (line.startsWith('export ')) {\n line = line.slice(7).trim();\n }\n\n const equalsIdx = line.indexOf('=');\n if (equalsIdx === -1) continue;\n\n const key = line.slice(0, equalsIdx).trim();\n let val = line.slice(equalsIdx + 1).trim();\n\n // Remove quotes if wrapped in single or double quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n\n // Replace escaped newlines\n val = val.replace(/\\\\n/g, '\\n');\n\n if (key) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Stringifies a Record<string, string> into standard .env format.\n */\nexport function stringifyEnv(env: Record<string, string>): string {\n return Object.entries(env)\n .map(([key, val]) => {\n const needsQuotes = val.includes(' ') || val.includes('\\n') || val.includes('#');\n const formattedVal = needsQuotes ? `\"${val.replace(/\"/g, '\\\\\"')}\"` : val;\n return `${key}=${formattedVal}`;\n })\n .join('\\n');\n}\n\n/**\n * Auto-discovers environment variables available in the current browser runtime.\n */\nexport function autoDiscoverBrowserEnv(): Record<string, string> {\n const discovered: Record<string, string> = {};\n\n if (typeof window === 'undefined') return discovered;\n\n const extractPrimitiveProps = (obj: any) => {\n if (!obj || typeof obj !== 'object') return;\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n discovered[k] = String(v);\n }\n }\n };\n\n // 1. Inspect window.process.env\n try {\n const winProcess = (window as any).process;\n if (winProcess && winProcess.env && typeof winProcess.env === 'object') {\n extractPrimitiveProps(winProcess.env);\n }\n } catch (e) {}\n\n // 2. Inspect Next.js __NEXT_DATA__ env & runtimeConfig\n try {\n const nextData = (window as any).__NEXT_DATA__;\n if (nextData) {\n if (nextData.env) extractPrimitiveProps(nextData.env);\n if (nextData.runtimeConfig?.public) extractPrimitiveProps(nextData.runtimeConfig.public);\n }\n } catch (e) {}\n\n // 3. Inspect Nuxt __NUXT__ public runtime config\n try {\n const nuxtData = (window as any).__NUXT__;\n if (nuxtData?.config?.public) {\n extractPrimitiveProps(nuxtData.config.public);\n }\n } catch (e) {}\n\n // 4. Inspect window.__ENV__ or window.ENV or window.PUBLIC_ENV\n try {\n const win = window as any;\n const customEnv = win.__ENV__ || win.ENV || win.PUBLIC_ENV || win.__LAMBA_ENV__;\n if (customEnv) {\n extractPrimitiveProps(customEnv);\n }\n } catch (e) {}\n\n // 5. Inspect HTML meta tags (e.g. <meta name=\"env:API_KEY\" content=\"xyz\"> or <meta name=\"lamba-env\" content=\"API_KEY=xyz&MODE=dev\">)\n try {\n const metaTags = document.querySelectorAll('meta');\n metaTags.forEach((meta) => {\n const name = meta.getAttribute('name');\n const content = meta.getAttribute('content');\n if (!name || content === null) return;\n\n if (name.startsWith('env:')) {\n const key = name.slice(4);\n discovered[key] = content;\n } else if (name === 'lamba-env') {\n const parsed = new URLSearchParams(content);\n parsed.forEach((val, key) => {\n discovered[key] = val;\n });\n }\n });\n } catch (e) {}\n\n return discovered;\n}\n\n/**\n * Attempts to fetch /.env or /.env.example from root URL if hosted in dev mode.\n */\nexport async function tryFetchRootEnvFile(): Promise<Record<string, string>> {\n const paths = ['/.env', '/.env.local', '/.env.example'];\n for (const path of paths) {\n try {\n const res = await fetch(path, { headers: { Accept: 'text/plain' } });\n if (res.ok) {\n const text = await res.text();\n if (text && text.includes('=')) {\n return parseEnvString(text);\n }\n }\n } catch (e) {\n // Ignore network errors in production or non-accessible env files\n }\n }\n return {};\n}\n","import {\n EnvVariable,\n EnvChangeListener,\n StoreChangeListener,\n LambaOptions,\n PresetProfile,\n} from './types';\nimport { PresetManager } from './preset-manager';\nimport { autoDiscoverBrowserEnv, tryFetchRootEnvFile } from './env-parser';\n\nconst STORAGE_OVERRIDES_KEY = '__lamba_overrides__';\nconst DEFAULT_SECRET_PATTERN = /(KEY|SECRET|TOKEN|PASSWORD|AUTH|PRIVATE|CREDENTIAL|SIGNATURE)/i;\n\nexport class EnvStore {\n private variables: Map<string, EnvVariable> = new Map();\n private overrides: Record<string, string> = {};\n private secretPattern: RegExp;\n private allowedPrefixes?: string | string[] | RegExp | null;\n private envChangeListeners: Set<EnvChangeListener> = new Set();\n private storeChangeListeners: Set<StoreChangeListener> = new Set();\n public presetManager: PresetManager;\n\n constructor(options: LambaOptions = {}) {\n this.secretPattern = options.secretKeysPattern || DEFAULT_SECRET_PATTERN;\n this.allowedPrefixes = options.allowedPrefixes;\n this.presetManager = new PresetManager();\n\n // 1. Load initial overrides from localStorage\n this.loadOverridesFromStorage();\n\n // 2. Register initial options.env if provided\n if (options.env) {\n this.mergeDefaults(options.env);\n }\n\n // 3. Auto-discover from browser runtime\n const autoDiscovered = autoDiscoverBrowserEnv();\n this.mergeDefaults(autoDiscovered);\n\n // 4. Try fetching root /.env file if explicitly enabled\n if (options.autoFetchEnvFile === true && typeof window !== 'undefined') {\n tryFetchRootEnvFile().then((fileEnv) => {\n if (Object.keys(fileEnv).length > 0) {\n this.mergeDefaults(fileEnv);\n }\n });\n }\n\n\n // 5. Patch window.process.env\n this.patchProcessEnv();\n }\n\n private loadOverridesFromStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const stored = localStorage.getItem(STORAGE_OVERRIDES_KEY);\n if (stored) {\n this.overrides = JSON.parse(stored);\n }\n } catch (e) {\n console.warn('[lamba] Failed to parse overrides from localStorage', e);\n }\n }\n\n private saveOverridesToStorage(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_OVERRIDES_KEY, JSON.stringify(this.overrides));\n } catch (e) {\n console.warn('[lamba] Failed to save overrides to localStorage', e);\n }\n }\n\n /**\n */\n private patchProcessEnv(): void {\n if (typeof window === 'undefined') return;\n\n const win = window as any;\n if (!win.process) {\n win.process = { env: {} };\n } else if (!win.process.env) {\n win.process.env = {};\n }\n\n const self = this;\n const targetEnv = win.process.env;\n\n // Use Proxy if supported\n try {\n win.process.env = new Proxy(targetEnv, {\n get(target, prop: string) {\n if (typeof prop === 'string') {\n const val = self.get(prop);\n if (val !== undefined) return val;\n }\n return target[prop];\n },\n set(target, prop: string, value: any) {\n target[prop] = value;\n return true;\n },\n });\n } catch (e) {\n // Fallback for environment where Proxy is restricted\n }\n }\n\n /**\n * Checks if an environment variable key satisfies the allowedPrefixes option.\n */\n public isAllowedKey(key: string): boolean {\n if (!this.allowedPrefixes) return true;\n\n if (typeof this.allowedPrefixes === 'string') {\n return key.startsWith(this.allowedPrefixes);\n }\n\n if (Array.isArray(this.allowedPrefixes)) {\n if (this.allowedPrefixes.length === 0) return true;\n return this.allowedPrefixes.some((p) => key.startsWith(p));\n }\n\n if (this.allowedPrefixes instanceof RegExp) {\n return this.allowedPrefixes.test(key);\n }\n\n return true;\n }\n\n public mergeDefaults(env: Record<string, string>): void {\n let changed = false;\n for (const [key, defaultValue] of Object.entries(env)) {\n if (!this.isAllowedKey(key)) continue;\n\n const isOverridden = key in this.overrides;\n const currentValue = isOverridden ? this.overrides[key] : defaultValue;\n const isSecret = this.secretPattern.test(key);\n\n const existing = this.variables.get(key);\n if (!existing) {\n this.variables.set(key, {\n key,\n value: currentValue,\n defaultValue,\n isOverridden,\n isSecret,\n });\n changed = true;\n } else {\n // Update default value if changed\n if (existing.defaultValue !== defaultValue) {\n existing.defaultValue = defaultValue;\n if (!existing.isOverridden) {\n existing.value = defaultValue;\n }\n changed = true;\n }\n }\n }\n\n if (changed) {\n this.notifyStoreChanged();\n }\n }\n\n public get(key: string, fallback?: string): string | undefined {\n if (key in this.overrides) {\n return this.overrides[key];\n }\n const item = this.variables.get(key);\n if (item) return item.value;\n return fallback;\n }\n\n public getAll(): Record<string, EnvVariable> {\n const result: Record<string, EnvVariable> = {};\n this.variables.forEach((varObj, key) => {\n result[key] = { ...varObj };\n });\n return result;\n }\n\n public getOverrides(): Record<string, string> {\n return { ...this.overrides };\n }\n\n public setOverride(key: string, value: string): void {\n const trimmedKey = key.trim();\n if (!trimmedKey) return;\n\n this.overrides[trimmedKey] = value;\n this.saveOverridesToStorage();\n\n let item = this.variables.get(trimmedKey);\n if (!item) {\n item = {\n key: trimmedKey,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(trimmedKey),\n };\n this.variables.set(trimmedKey, item);\n } else {\n item.value = value;\n item.isOverridden = true;\n }\n\n this.emitEnvChange(trimmedKey, value, true);\n this.notifyStoreChanged();\n }\n\n public removeOverride(key: string): void {\n if (key in this.overrides) {\n delete this.overrides[key];\n this.saveOverridesToStorage();\n\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n\n this.notifyStoreChanged();\n }\n }\n\n public resetAllOverrides(): void {\n const keys = Object.keys(this.overrides);\n this.overrides = {};\n this.saveOverridesToStorage();\n this.presetManager.setActivePreset(null);\n\n keys.forEach((key) => {\n const item = this.variables.get(key);\n if (item) {\n item.value = item.defaultValue;\n item.isOverridden = false;\n this.emitEnvChange(key, item.value, false);\n }\n });\n\n this.notifyStoreChanged();\n }\n\n public applyPreset(presetId: string | null): void {\n const preset = this.presetManager.setActivePreset(presetId);\n this.overrides = preset ? { ...preset.overrides } : {};\n this.saveOverridesToStorage();\n\n // Re-evaluate all variables\n this.variables.forEach((item, key) => {\n if (key in this.overrides) {\n item.value = this.overrides[key];\n item.isOverridden = true;\n } else {\n item.value = item.defaultValue;\n item.isOverridden = false;\n }\n this.emitEnvChange(key, item.value, item.isOverridden);\n });\n\n // Also include extra override keys from preset that weren't in variables\n if (preset) {\n for (const [key, value] of Object.entries(preset.overrides)) {\n if (!this.variables.has(key)) {\n this.variables.set(key, {\n key,\n value,\n defaultValue: '',\n isOverridden: true,\n isSecret: this.secretPattern.test(key),\n });\n this.emitEnvChange(key, value, true);\n }\n }\n }\n\n this.notifyStoreChanged();\n }\n\n public subscribeEnvChange(listener: EnvChangeListener): () => void {\n this.envChangeListeners.add(listener);\n return () => this.envChangeListeners.delete(listener);\n }\n\n public subscribeStoreChange(listener: StoreChangeListener): () => void {\n this.storeChangeListeners.add(listener);\n return () => this.storeChangeListeners.delete(listener);\n }\n\n private emitEnvChange(key: string, value: string, isOverridden: boolean): void {\n this.envChangeListeners.forEach((fn) => fn(key, value, isOverridden));\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lamba:env-change', {\n detail: { key, value, isOverridden },\n })\n );\n }\n }\n\n private notifyStoreChanged(): void {\n const varsObj = this.getAll();\n const presets = this.presetManager.getPresets();\n const activePresetId = this.presetManager.getActivePresetId();\n this.storeChangeListeners.forEach((fn) => fn(varsObj, presets, activePresetId));\n }\n}\n","import { EnvStore } from './store';\n\nexport class NetworkInterceptor {\n private store: EnvStore;\n private originalFetch: typeof window.fetch | null = null;\n private originalXHRPost: typeof XMLHttpRequest.prototype.open | null = null;\n private isIntercepting: boolean = false;\n\n constructor(store: EnvStore) {\n this.store = store;\n }\n\n public enable(): void {\n if (typeof window === 'undefined' || this.isIntercepting) return;\n\n this.patchFetch();\n this.patchXHR();\n this.isIntercepting = true;\n }\n\n public disable(): void {\n if (typeof window === 'undefined' || !this.isIntercepting) return;\n\n if (this.originalFetch) {\n window.fetch = this.originalFetch;\n this.originalFetch = null;\n }\n if (this.originalXHRPost) {\n XMLHttpRequest.prototype.open = this.originalXHRPost;\n this.originalXHRPost = null;\n }\n this.isIntercepting = false;\n }\n\n /**\n * Rewrite a given URL by checking if any default env variable URL value matches\n * and replacing it with the active overridden value.\n */\n public rewriteUrl(url: string | URL | Request): string | URL | Request {\n if (typeof url !== 'string') return url;\n\n const allVars = this.store.getAll();\n let resultUrl = url;\n\n for (const varObj of Object.values(allVars)) {\n if (varObj.isOverridden && varObj.defaultValue && varObj.value) {\n // Trim trailing slashes for accurate matching\n const defaultBase = varObj.defaultValue.replace(/\\/+$/, '');\n const overrideBase = varObj.value.replace(/\\/+$/, '');\n\n if (defaultBase && resultUrl.includes(defaultBase)) {\n resultUrl = resultUrl.replace(defaultBase, overrideBase);\n }\n }\n }\n\n return resultUrl;\n }\n\n private patchFetch(): void {\n if (!window.fetch) return;\n\n this.originalFetch = window.fetch;\n const self = this;\n\n window.fetch = function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n let finalInput = input;\n\n if (typeof input === 'string') {\n finalInput = self.rewriteUrl(input) as string;\n } else if (input instanceof URL) {\n const rewritten = self.rewriteUrl(input.toString()) as string;\n finalInput = new URL(rewritten);\n } else if (input instanceof Request) {\n const rewrittenUrl = self.rewriteUrl(input.url) as string;\n if (rewrittenUrl !== input.url) {\n finalInput = new Request(rewrittenUrl, input);\n }\n }\n\n return self.originalFetch!.call(this, finalInput, init);\n };\n }\n\n private patchXHR(): void {\n if (!window.XMLHttpRequest) return;\n\n this.originalXHRPost = XMLHttpRequest.prototype.open;\n const self = this;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ): void {\n const stringUrl = typeof url === 'string' ? url : url.toString();\n const rewrittenUrl = self.rewriteUrl(stringUrl) as string;\n\n return self.originalXHRPost!.call(\n this,\n method,\n rewrittenUrl,\n async,\n username ?? null,\n password ?? null\n );\n };\n }\n}\n","export const LAMBA_STYLES = `\n:host {\n --lamba-bg-main: #0f172a;\n --lamba-bg-card: #1e293b;\n --lamba-bg-hover: #334155;\n --lamba-border: rgba(255, 255, 255, 0.1);\n --lamba-text-primary: #f8fafc;\n --lamba-text-secondary: #94a3b8;\n --lamba-primary: #6366f1;\n --lamba-primary-hover: #4f46e5;\n --lamba-accent: #06b6d4;\n --lamba-success: #10b981;\n --lamba-danger: #ef4444;\n --lamba-warning: #f59e0b;\n --lamba-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --lamba-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4);\n\n font-family: var(--lamba-font);\n font-size: 14px;\n line-height: 1.5;\n color: var(--lamba-text-primary);\n box-sizing: border-box;\n z-index: 999999;\n}\n\n*, *:before, *:after {\n box-sizing: border-box;\n}\n\n/* Floating Launcher Button */\n.lamba-launcher {\n position: fixed;\n z-index: 999999;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.4), 0 4px 6px -4px rgba(99, 102, 241, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.2);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n user-select: none;\n}\n\n.lamba-launcher:hover {\n transform: scale(1.08);\n box-shadow: 0 14px 20px -3px rgba(99, 102, 241, 0.6), 0 6px 8px -4px rgba(99, 102, 241, 0.3);\n}\n\n.lamba-launcher:active {\n transform: scale(0.95);\n}\n\n.lamba-launcher-bottom-right { bottom: 24px; right: 24px; }\n.lamba-launcher-bottom-left { bottom: 24px; left: 24px; }\n.lamba-launcher-top-right { top: 24px; right: 24px; }\n.lamba-launcher-top-left { top: 24px; left: 24px; }\n\n.lamba-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: var(--lamba-accent);\n color: #000;\n font-size: 11px;\n font-weight: 700;\n min-width: 20px;\n height: 20px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 5px;\n border: 2px solid var(--lamba-bg-main);\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n animation: pulse-scale 2s infinite;\n}\n\n@keyframes pulse-scale {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.15); }\n}\n\n/* Modal Overlay */\n.lamba-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(15, 23, 42, 0.7);\n backdrop-filter: blur(8px);\n z-index: 999998;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.25s ease, visibility 0.25s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.lamba-overlay.active {\n opacity: 1;\n visibility: visible;\n}\n\n/* Main Modal Panel */\n.lamba-modal {\n width: 100%;\n max-width: 820px;\n max-height: 85vh;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n border-radius: 16px;\n box-shadow: var(--lamba-shadow);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform: translateY(20px) scale(0.96);\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.lamba-overlay.active .lamba-modal {\n transform: translateY(0) scale(1);\n}\n\n/* Header */\n.lamba-header {\n padding: 20px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: rgba(30, 41, 59, 0.4);\n}\n\n.lamba-brand {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.lamba-logo {\n font-size: 18px;\n font-weight: 800;\n letter-spacing: -0.5px;\n background: linear-gradient(135deg, #a5b4fc 0%, #6366f1 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-tag {\n background: rgba(99, 102, 241, 0.15);\n color: #a5b4fc;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 6px;\n font-weight: 600;\n border: 1px solid rgba(99, 102, 241, 0.3);\n}\n\n.lamba-close-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 6px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-close-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n/* Controls Bar (Search & Filters) */\n.lamba-controls {\n padding: 16px 24px;\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n background: var(--lamba-bg-main);\n}\n\n.lamba-search-box {\n flex: 1;\n min-width: 220px;\n position: relative;\n}\n\n.lamba-search-input {\n width: 100%;\n padding: 10px 14px 10px 38px;\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 8px;\n color: var(--lamba-text-primary);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.lamba-search-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--lamba-text-secondary);\n pointer-events: none;\n}\n\n.lamba-tabs {\n display: flex;\n gap: 4px;\n background: var(--lamba-bg-card);\n padding: 4px;\n border-radius: 8px;\n border: 1px solid var(--lamba-border);\n}\n\n.lamba-tab {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.lamba-tab.active {\n background: var(--lamba-primary);\n color: #ffffff;\n}\n\n/* Preset Bar */\n.lamba-presets-bar {\n padding: 12px 24px;\n background: rgba(30, 41, 59, 0.3);\n border-bottom: 1px solid var(--lamba-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.lamba-preset-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n}\n\n.lamba-select {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 6px 12px;\n border-radius: 6px;\n outline: none;\n font-size: 13px;\n cursor: pointer;\n}\n\n/* List Content */\n.lamba-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.lamba-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.lamba-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.lamba-content::-webkit-scrollbar-thumb {\n background: var(--lamba-bg-hover);\n border-radius: 3px;\n}\n\n/* Variable Row Card */\n.lamba-var-card {\n background: var(--lamba-bg-card);\n border: 1px solid var(--lamba-border);\n border-radius: 10px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color 0.15s ease;\n}\n\n.lamba-var-card.is-overridden {\n border-color: rgba(99, 102, 241, 0.5);\n background: linear-gradient(180deg, var(--lamba-bg-card) 0%, rgba(99, 102, 241, 0.05) 100%);\n}\n\n.lamba-var-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.lamba-var-key {\n font-weight: 700;\n font-family: monospace;\n color: #a5b4fc;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.lamba-modified-pill {\n font-size: 10px;\n font-weight: 700;\n background: rgba(16, 185, 129, 0.2);\n color: #34d399;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid rgba(16, 185, 129, 0.4);\n}\n\n.lamba-var-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.lamba-icon-btn {\n background: transparent;\n border: none;\n color: var(--lamba-text-secondary);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.lamba-icon-btn:hover {\n background: var(--lamba-bg-hover);\n color: var(--lamba-text-primary);\n}\n\n.lamba-var-input-group {\n display: flex;\n gap: 8px;\n}\n\n.lamba-input {\n flex: 1;\n background: var(--lamba-bg-main);\n border: 1px solid var(--lamba-border);\n color: var(--lamba-text-primary);\n padding: 8px 12px;\n border-radius: 6px;\n font-family: monospace;\n font-size: 13px;\n outline: none;\n}\n\n.lamba-input:focus {\n border-color: var(--lamba-primary);\n}\n\n.lamba-diff {\n font-size: 11px;\n color: var(--lamba-text-secondary);\n font-family: monospace;\n padding-left: 2px;\n}\n\n.lamba-diff-val {\n color: var(--lamba-warning);\n}\n\n/* Empty State */\n.lamba-empty {\n padding: 40px 20px;\n text-align: center;\n color: var(--lamba-text-secondary);\n}\n\n/* Footer Actions Bar */\n.lamba-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--lamba-border);\n background: rgba(30, 41, 59, 0.4);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.lamba-btn {\n background: var(--lamba-bg-card);\n color: var(--lamba-text-primary);\n border: 1px solid var(--lamba-border);\n padding: 8px 14px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n}\n\n.lamba-btn:hover {\n background: var(--lamba-bg-hover);\n}\n\n.lamba-btn-primary {\n background: var(--lamba-primary);\n border-color: var(--lamba-primary);\n color: #ffffff;\n}\n\n.lamba-btn-primary:hover {\n background: var(--lamba-primary-hover);\n}\n\n.lamba-btn-danger {\n background: rgba(239, 68, 68, 0.15);\n color: #fca5a5;\n border-color: rgba(239, 68, 68, 0.3);\n}\n\n.lamba-btn-danger:hover {\n background: rgba(239, 68, 68, 0.3);\n}\n`;\n","import { LAMBA_STYLES } from './styles';\n\nexport function createShadowHost(): { host: HTMLElement; shadowRoot: ShadowRoot } {\n if (typeof document === 'undefined') {\n throw new Error('[lamba] Document object not available.');\n }\n\n let host = document.getElementById('lamba-root') as HTMLElement;\n if (!host) {\n host = document.createElement('lamba-widget');\n host.id = 'lamba-root';\n document.body.appendChild(host);\n }\n\n let shadowRoot = host.shadowRoot;\n if (!shadowRoot) {\n shadowRoot = host.attachShadow({ mode: 'open' });\n\n // Inject styles\n const styleEl = document.createElement('style');\n styleEl.textContent = LAMBA_STYLES;\n shadowRoot.appendChild(styleEl);\n }\n\n return { host, shadowRoot };\n}\n","export class LauncherUI {\n private element: HTMLElement;\n private badgeElement: HTMLElement;\n private onClickCallback: () => void;\n\n constructor(\n container: ShadowRoot,\n position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' = 'bottom-right',\n onClick: () => void\n ) {\n this.onClickCallback = onClick;\n\n this.element = document.createElement('div');\n this.element.className = `lamba-launcher lamba-launcher-${position}`;\n this.element.title = 'Open lamba Environment Controls';\n\n // SVG Settings Icon\n this.element.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n `;\n\n // Counter Badge\n this.badgeElement = document.createElement('div');\n this.badgeElement.className = 'lamba-badge';\n this.badgeElement.style.display = 'none';\n this.element.appendChild(this.badgeElement);\n\n this.element.addEventListener('click', () => this.onClickCallback());\n container.appendChild(this.element);\n }\n\n public updateBadgeCount(count: number): void {\n if (count > 0) {\n this.badgeElement.textContent = String(count);\n this.badgeElement.style.display = 'flex';\n } else {\n this.badgeElement.style.display = 'none';\n }\n }\n\n public setVisible(visible: boolean): void {\n this.element.style.display = visible ? 'flex' : 'none';\n }\n}\n","import { EnvStore } from '../core/store';\nimport { EnvVariable, PresetProfile } from '../core/types';\nimport { parseEnvString, stringifyEnv } from '../core/env-parser';\n\nexport class ModalUI {\n private overlay: HTMLElement;\n private modal: HTMLElement;\n private contentList: HTMLElement;\n private searchInput: HTMLInputElement;\n private tabAllBtn: HTMLElement;\n private tabOverriddenBtn: HTMLElement;\n private tabSecretsBtn: HTMLElement;\n private presetSelect: HTMLSelectElement;\n private savePresetBtn: HTMLElement;\n private activeTab: 'all' | 'overridden' | 'secrets' = 'all';\n private searchQuery: string = '';\n private store: EnvStore;\n private secretVisibilityMap: Map<string, boolean> = new Map();\n private isOpen: boolean = false;\n\n constructor(container: ShadowRoot, store: EnvStore, onClose: () => void) {\n this.store = store;\n\n // Build DOM layout\n this.overlay = document.createElement('div');\n this.overlay.className = 'lamba-overlay';\n\n this.modal = document.createElement('div');\n this.modal.className = 'lamba-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'lamba-header';\n header.innerHTML = `\n <div class=\"lamba-brand\">\n <div class=\"lamba-logo\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\"/>\n </svg>\n lamba\n </div>\n <span class=\"lamba-tag\">Dev Environment Override</span>\n </div>\n <button class=\"lamba-close-btn\" title=\"Close modal\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n `;\n header.querySelector('.lamba-close-btn')?.addEventListener('click', () => {\n this.close();\n onClose();\n });\n\n // Controls Bar (Search & Filter Tabs)\n const controls = document.createElement('div');\n controls.className = 'lamba-controls';\n\n const searchBox = document.createElement('div');\n searchBox.className = 'lamba-search-box';\n searchBox.innerHTML = `\n <svg class=\"lamba-search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n <input type=\"text\" class=\"lamba-search-input\" placeholder=\"Search environment keys or values...\" />\n `;\n this.searchInput = searchBox.querySelector('.lamba-search-input') as HTMLInputElement;\n this.searchInput.addEventListener('input', (e) => {\n this.searchQuery = (e.target as HTMLInputElement).value.toLowerCase();\n this.render();\n });\n\n const tabs = document.createElement('div');\n tabs.className = 'lamba-tabs';\n tabs.innerHTML = `\n <button class=\"lamba-tab active\" data-tab=\"all\">All</button>\n <button class=\"lamba-tab\" data-tab=\"overridden\">Modified</button>\n <button class=\"lamba-tab\" data-tab=\"secrets\">Secrets</button>\n `;\n\n this.tabAllBtn = tabs.querySelector('[data-tab=\"all\"]') as HTMLElement;\n this.tabOverriddenBtn = tabs.querySelector('[data-tab=\"overridden\"]') as HTMLElement;\n this.tabSecretsBtn = tabs.querySelector('[data-tab=\"secrets\"]') as HTMLElement;\n\n tabs.querySelectorAll('.lamba-tab').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n tabs.querySelectorAll('.lamba-tab').forEach((t) => t.classList.remove('active'));\n const target = e.currentTarget as HTMLElement;\n target.classList.add('active');\n this.activeTab = target.getAttribute('data-tab') as any;\n this.render();\n });\n });\n\n controls.appendChild(searchBox);\n controls.appendChild(tabs);\n\n // Presets Bar\n const presetsBar = document.createElement('div');\n presetsBar.className = 'lamba-presets-bar';\n presetsBar.innerHTML = `\n <div class=\"lamba-preset-selector\">\n <span style=\"color: var(--lamba-text-secondary); font-weight: 600;\">Preset Profile:</span>\n <select class=\"lamba-select lamba-preset-dropdown\">\n <option value=\"\">Default (Current Overrides)</option>\n </select>\n </div>\n <button class=\"lamba-btn lamba-save-preset-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"></path>\n <polyline points=\"17 21 17 13 7 13 7 21\"></polyline>\n <polyline points=\"7 3 7 8 15 8\"></polyline>\n </svg>\n Save as Preset\n </button>\n `;\n\n this.presetSelect = presetsBar.querySelector('.lamba-preset-dropdown') as HTMLSelectElement;\n this.presetSelect.addEventListener('change', () => {\n const selectedId = this.presetSelect.value || null;\n this.store.applyPreset(selectedId);\n });\n\n this.savePresetBtn = presetsBar.querySelector('.lamba-save-preset-btn') as HTMLElement;\n this.savePresetBtn.addEventListener('click', () => {\n const name = prompt('Enter a name for this Environment Preset Profile:', 'Staging Environment');\n if (name) {\n const overrides = this.store.getOverrides();\n this.store.presetManager.createPreset(name, overrides);\n this.updatePresetDropdown();\n }\n });\n\n // Content List Container\n this.contentList = document.createElement('div');\n this.contentList.className = 'lamba-content';\n\n // Footer Bar\n const footer = document.createElement('div');\n footer.className = 'lamba-footer';\n footer.innerHTML = `\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-add-var-btn\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Add Variable\n </button>\n <button class=\"lamba-btn lamba-import-btn\">Import .env</button>\n <button class=\"lamba-btn lamba-export-btn\">Export .env</button>\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"lamba-btn lamba-btn-danger lamba-reset-all-btn\">Reset All</button>\n <button class=\"lamba-btn lamba-btn-primary lamba-reload-btn\">Reload Page</button>\n </div>\n `;\n\n footer.querySelector('.lamba-add-var-btn')?.addEventListener('click', () => {\n const key = prompt('Enter new environment variable key name (e.g. API_URL, NEXT_PUBLIC_API_URL, REACT_APP_API_URL, VITE_API_URL):');\n if (key) {\n const value = prompt(`Enter value for ${key}:`) || '';\n this.store.setOverride(key, value);\n }\n });\n\n footer.querySelector('.lamba-import-btn')?.addEventListener('click', () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.env,.txt';\n input.onchange = (e: any) => {\n const file = e.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n const parsed = parseEnvString(content);\n for (const [k, v] of Object.entries(parsed)) {\n this.store.setOverride(k, v);\n }\n }\n };\n reader.readAsText(file);\n }\n };\n input.click();\n });\n\n footer.querySelector('.lamba-export-btn')?.addEventListener('click', () => {\n const allVars = this.store.getAll();\n const exportObj: Record<string, string> = {};\n for (const [k, v] of Object.entries(allVars)) {\n exportObj[k] = v.value;\n }\n const envText = stringifyEnv(exportObj);\n const blob = new Blob([envText], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = '.env';\n a.click();\n URL.revokeObjectURL(url);\n });\n\n footer.querySelector('.lamba-reset-all-btn')?.addEventListener('click', () => {\n if (confirm('Are you sure you want to reset all overridden environment variables?')) {\n this.store.resetAllOverrides();\n }\n });\n\n footer.querySelector('.lamba-reload-btn')?.addEventListener('click', () => {\n window.location.reload();\n });\n\n // Assemble modal structure\n this.modal.appendChild(header);\n this.modal.appendChild(controls);\n this.modal.appendChild(presetsBar);\n this.modal.appendChild(this.contentList);\n this.modal.appendChild(footer);\n this.overlay.appendChild(this.modal);\n\n // Close on overlay background click\n this.overlay.addEventListener('click', (e) => {\n if (e.target === this.overlay) {\n this.close();\n onClose();\n }\n });\n\n container.appendChild(this.overlay);\n\n // Subscribe to store updates\n this.store.subscribeStoreChange(() => {\n if (this.isOpen) {\n this.updatePresetDropdown();\n this.render();\n }\n });\n }\n\n public open(): void {\n this.isOpen = true;\n this.updatePresetDropdown();\n this.render();\n this.overlay.classList.add('active');\n }\n\n public close(): void {\n this.isOpen = false;\n this.overlay.classList.remove('active');\n }\n\n public toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private updatePresetDropdown(): void {\n const presets = this.store.presetManager.getPresets();\n const activeId = this.store.presetManager.getActivePresetId();\n\n this.presetSelect.innerHTML = `<option value=\"\">Default (Custom Overrides)</option>`;\n presets.forEach((p) => {\n const opt = document.createElement('option');\n opt.value = p.id;\n opt.textContent = p.name;\n if (p.id === activeId) opt.selected = true;\n this.presetSelect.appendChild(opt);\n });\n }\n\n public render(): void {\n const allVarsMap = this.store.getAll();\n let varList = Object.values(allVarsMap);\n\n // Filter by Tab\n if (this.activeTab === 'overridden') {\n varList = varList.filter((v) => v.isOverridden);\n } else if (this.activeTab === 'secrets') {\n varList = varList.filter((v) => v.isSecret);\n }\n\n // Filter by Search Query\n if (this.searchQuery) {\n varList = varList.filter(\n (v) =>\n v.key.toLowerCase().includes(this.searchQuery) ||\n v.value.toLowerCase().includes(this.searchQuery)\n );\n }\n\n // Sort by overridden first, then alphabetically\n varList.sort((a, b) => {\n if (a.isOverridden !== b.isOverridden) {\n return a.isOverridden ? -1 : 1;\n }\n return a.key.localeCompare(b.key);\n });\n\n this.contentList.innerHTML = '';\n\n if (varList.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'lamba-empty';\n empty.textContent =\n this.searchQuery || this.activeTab !== 'all'\n ? 'No environment variables match your current filter.'\n : 'No environment variables found or registered. Click \"+ Add Variable\" or \"Import .env\" to get started.';\n this.contentList.appendChild(empty);\n return;\n }\n\n varList.forEach((varItem) => {\n const card = this.createVarCard(varItem);\n this.contentList.appendChild(card);\n });\n }\n\n private createVarCard(varItem: EnvVariable): HTMLElement {\n const card = document.createElement('div');\n card.className = `lamba-var-card ${varItem.isOverridden ? 'is-overridden' : ''}`;\n\n const isVisible = this.secretVisibilityMap.get(varItem.key) ?? !varItem.isSecret;\n\n card.innerHTML = `\n <div class=\"lamba-var-meta\">\n <div class=\"lamba-var-key\">\n ${varItem.key}\n ${varItem.isOverridden ? '<span class=\"lamba-modified-pill\">MODIFIED</span>' : ''}\n ${varItem.isSecret ? '<span style=\"font-size:10px; color:var(--lamba-warning); font-weight:600;\">SECRET</span>' : ''}\n </div>\n <div class=\"lamba-var-actions\">\n ${\n varItem.isSecret\n ? `<button class=\"lamba-icon-btn toggle-secret-btn\" title=\"${isVisible ? 'Hide secret' : 'Show secret'}\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n ${\n isVisible\n ? '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>'\n : '<path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>'\n }\n </svg>\n </button>`\n : ''\n }\n ${\n varItem.isOverridden\n ? `<button class=\"lamba-icon-btn reset-var-btn\" title=\"Reset to default\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n <path d=\"M3 3v5h5\"/>\n </svg>\n </button>`\n : ''\n }\n </div>\n </div>\n <div class=\"lamba-var-input-group\">\n <input \n type=\"${isVisible ? 'text' : 'password'}\" \n class=\"lamba-input var-input\" \n value=\"${this.escapeHtml(varItem.value)}\" \n placeholder=\"Value...\"\n />\n </div>\n ${\n varItem.isOverridden && varItem.defaultValue\n ? `<div class=\"lamba-diff\">Original default: <span class=\"lamba-diff-val\">${this.escapeHtml(\n varItem.defaultValue\n )}</span></div>`\n : ''\n }\n `;\n\n const inputEl = card.querySelector('.var-input') as HTMLInputElement;\n inputEl.addEventListener('change', () => {\n this.store.setOverride(varItem.key, inputEl.value);\n });\n\n card.querySelector('.toggle-secret-btn')?.addEventListener('click', () => {\n this.secretVisibilityMap.set(varItem.key, !isVisible);\n this.render();\n });\n\n card.querySelector('.reset-var-btn')?.addEventListener('click', () => {\n this.store.removeOverride(varItem.key);\n });\n\n return card;\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":[]}