@eclipse-lyra/core 0.0.0 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"resizable-grid-BRH3MyZK.js","sources":["../src/core/constants.ts","../src/core/persistenceservice.ts","../src/core/settingsservice.ts","../src/core/taskservice.ts","../src/core/esmsh-service.ts","../src/core/extensionregistry.ts","../src/core/keybindings.ts","../src/parts/element.ts","../src/parts/dialog-content.ts","../src/core/dialogservice.ts","../src/parts/container.ts","../src/parts/part.ts","../src/core/apploader.ts","../src/dialogs/prompt-dialog.ts","../src/dialogs/info-dialog.ts","../src/dialogs/confirm-dialog.ts","../src/dialogs/navigable-info-dialog.ts","../src/parts/toolbar.ts","../src/components/command.ts","../src/parts/contextmenu.ts","../src/parts/tabs.ts","../src/parts/resizable-grid.ts"],"sourcesContent":["// Toolbars\nexport const TOOLBAR_MAIN = \"app-toolbars-main\"\nexport const TOOLBAR_MAIN_RIGHT = \"app-toolbars-main-right\"\nexport const TOOLBAR_MAIN_CENTER = \"app-toolbars-main-center\"\nexport const TOOLBAR_BOTTOM = \"app-toolbars-bottom\"\nexport const TOOLBAR_BOTTOM_CENTER = \"app-toolbars-bottom-center\"\nexport const TOOLBAR_BOTTOM_END = \"app-toolbars-bottom-end\"\n\nexport const SYSTEM_VIEWS = \"system-views\"\n\n// VS Code-style layout containers\nexport const EDITOR_AREA_MAIN = \"editor-area-main\"\nexport const SIDEBAR_MAIN = \"sidebar-main\"\nexport const SIDEBAR_MAIN_BOTTOM = \"sidebar-main-bottom\"\nexport const SIDEBAR_AUXILIARY = \"sidebar-auxiliary\"\nexport const PANEL_BOTTOM = \"panel-bottom\"\n\nexport const COMMAND_SAVE = \"command-save\"\n\nexport const HIDE_DOT_RESOURCE = false\n\n// Mouse button constants\nexport enum MouseButton {\n LEFT = 0,\n MIDDLE = 1,\n RIGHT = 2,\n BACK = 3,\n FORWARD = 4\n}","import {rootContext} from \"./di\";\n\nconst DB_NAME = 'eclipse-lyra-persistence';\nconst STORE_NAME = 'keyval';\nconst DB_VERSION = 1;\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction getDB(): Promise<IDBDatabase> {\n if (!dbPromise) {\n dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n request.onupgradeneeded = (e) => {\n (e.target as IDBOpenDBRequest).result.createObjectStore(STORE_NAME);\n };\n });\n }\n return dbPromise;\n}\n\nexport class PersistenceService {\n async persistObject(key: string, value: unknown): Promise<void> {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const req = tx.objectStore(STORE_NAME).put(value, key);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n }\n\n async getObject(key: string): Promise<any> {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const req = tx.objectStore(STORE_NAME).get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n }\n}\n\nexport const persistenceService = new PersistenceService();\nrootContext.put(\"persistenceService\", persistenceService);\n","import {publish} from \"./events\";\nimport {persistenceService} from \"./persistenceservice\";\nimport {rootContext} from \"./di\";\n\nexport const SETTINGS_FILE_PATH = \".geospace/settings.json\"\n\nexport const DIALOG_SETTINGS_KEY = \"dialogSettings\"\n\nexport interface AppSettings {\n [key: string]: any;\n}\n\nexport const TOPIC_SETTINGS_CHANGED = \"events/settings/changed\"\n\n/**\n * Minimal JSON Schema subset for settings UI. Compatible with JSON Schema (e.g. from Zod via zod-to-json-schema).\n * Top-level properties = categories; nested properties = settings in that category.\n */\nexport interface SettingsJsonSchema {\n type?: 'object' | 'string' | 'number' | 'boolean' | 'array';\n title?: string;\n description?: string;\n default?: unknown;\n enum?: readonly unknown[] | unknown[];\n properties?: Record<string, SettingsJsonSchema>;\n /** Extension: category sort order (only meaningful on top-level property schemas). */\n order?: number;\n}\n\nexport interface SettingsCategoryInfo {\n id: string;\n label: string;\n order: number;\n schema: SettingsJsonSchema;\n}\n\nfunction mergeSchemaProperties(\n target: Record<string, SettingsJsonSchema>,\n source: Record<string, SettingsJsonSchema> | undefined\n): void {\n if (!source) return;\n for (const [key, value] of Object.entries(source)) {\n if (value && typeof value === 'object') {\n const existing = target[key];\n if (existing?.properties && value.properties) {\n mergeSchemaProperties(existing.properties, value.properties);\n } else {\n target[key] = { ...value, properties: value.properties ? { ...value.properties } : undefined };\n }\n }\n }\n}\n\nclass SettingsService {\n\n private appSettings?: AppSettings;\n\n private mergedSchema: SettingsJsonSchema = { type: 'object', properties: {} };\n\n private async checkSettings() {\n if (!this.appSettings) {\n this.appSettings = await persistenceService.getObject(SETTINGS_FILE_PATH)\n if (!this.appSettings) {\n this.appSettings = {}\n await persistenceService.persistObject(SETTINGS_FILE_PATH, this.appSettings)\n }\n publish(TOPIC_SETTINGS_CHANGED, this.appSettings)\n }\n }\n\n /**\n * Register a JSON Schema for settings. Top-level keys of `schema.properties` become categories.\n * Consumers can pass schemas produced by Zod (e.g. zod-to-json-schema) or hand-written JSON Schema.\n */\n public registerSchema(schema: SettingsJsonSchema): void {\n const props = schema.properties ?? (schema.type === 'object' ? {} : undefined);\n if (props) {\n if (!this.mergedSchema.properties) this.mergedSchema.properties = {};\n mergeSchemaProperties(this.mergedSchema.properties, props);\n }\n }\n\n public getCategories(): SettingsCategoryInfo[] {\n const props = this.mergedSchema.properties;\n if (!props) return [];\n return Object.entries(props)\n .filter(([, s]) => s && typeof s === 'object')\n .map(([id, schema]) => ({\n id,\n label: (schema.title as string) ?? id,\n order: typeof schema.order === 'number' ? schema.order : 0,\n schema,\n }))\n .sort((a, b) => a.order - b.order);\n }\n\n public getSchemaForCategory(categoryId: string): SettingsJsonSchema | undefined {\n return this.mergedSchema.properties?.[categoryId];\n }\n\n /**\n * Resolve a dotted key (e.g. \"editor.fontSize\") to the JSON Schema fragment for that path.\n */\n public getSchemaForSettingKey(dottedKey: string): SettingsJsonSchema | undefined {\n const parts = dottedKey.split('.').filter(Boolean);\n if (parts.length === 0) return this.mergedSchema;\n let current: SettingsJsonSchema | undefined = this.mergedSchema;\n for (const part of parts) {\n current = current?.properties?.[part];\n if (!current) return undefined;\n }\n return current;\n }\n\n private traversePath(obj: Record<string, any>, pathParts: string[], createIfMissing: boolean): { parent: Record<string, any>; key: string } | null {\n if (pathParts.length === 0) return null;\n let current: Record<string, any> = obj;\n const lastIndex = pathParts.length - 1;\n for (let i = 0; i < lastIndex; i++) {\n const part = pathParts[i];\n if (current[part] === undefined) {\n if (!createIfMissing) return null;\n current[part] = {};\n }\n if (current[part] === null || typeof current[part] !== 'object') return null;\n current = current[part];\n }\n return { parent: current, key: pathParts[lastIndex] };\n }\n\n public async getAt(path: string): Promise<unknown> {\n await this.checkSettings();\n const parts = path.split('.').filter(Boolean);\n if (parts.length === 0) return this.appSettings;\n const result = this.traversePath(this.appSettings!, parts, false);\n if (!result) return undefined;\n return result.parent[result.key];\n }\n\n public async setAt(path: string, value: unknown): Promise<void> {\n await this.checkSettings();\n const parts = path.split('.').filter(Boolean);\n if (parts.length === 0) return;\n const result = this.traversePath(this.appSettings!, parts, true);\n if (!result) return;\n result.parent[result.key] = value;\n await persistenceService.persistObject(SETTINGS_FILE_PATH, this.appSettings)\n publish(TOPIC_SETTINGS_CHANGED, this.appSettings)\n }\n\n public async get(key: string) {\n await this.checkSettings()\n return this.appSettings![key]\n }\n\n public async set(key: string, value: any) {\n await this.checkSettings()\n this.appSettings![key] = value\n await persistenceService.persistObject(SETTINGS_FILE_PATH, this.appSettings)\n publish(TOPIC_SETTINGS_CHANGED, this.appSettings)\n }\n\n public async getAll() {\n await this.checkSettings()\n return this.appSettings!;\n }\n\n public async setAll(settings: AppSettings) {\n this.appSettings = settings\n await persistenceService.persistObject(SETTINGS_FILE_PATH, this.appSettings)\n publish(TOPIC_SETTINGS_CHANGED, this.appSettings)\n }\n\n public async getDialogSetting(key: string) {\n await this.checkSettings()\n const dialogSettings = this.appSettings![DIALOG_SETTINGS_KEY] || {}\n return dialogSettings[key]\n }\n\n public async setDialogSetting(key: string, value: any) {\n await this.checkSettings()\n const dialogSettings = this.appSettings![DIALOG_SETTINGS_KEY] || {}\n dialogSettings[key] = value\n this.appSettings![DIALOG_SETTINGS_KEY] = dialogSettings\n await persistenceService.persistObject(SETTINGS_FILE_PATH, this.appSettings)\n publish(TOPIC_SETTINGS_CHANGED, this.appSettings)\n }\n}\n\nexport const appSettings = new SettingsService();\nrootContext.put(\"appSettings\", appSettings)\n","import {activeTasksSignal} from \"./appstate\";\nimport {rootContext} from \"./di\";\n\nexport interface ProgressMonitor {\n name: string\n message: string\n currentStep: number\n totalSteps: number\n progress: number // Manual progress percentage (0-100), overrides step-based calculation if >= 0\n}\n\nexport type Task = (progressMonitor: ProgressMonitor) => any\nexport type AsyncTask = (progressMonitor: ProgressMonitor) => Promise<any>\n\nexport class TaskService {\n private tasks: ProgressMonitor[] = []\n private updateCounter = 0\n\n private notifyUpdate() {\n // Always increment counter to ensure signal value changes and triggers re-render\n this.updateCounter++\n activeTasksSignal.set(this.updateCounter)\n }\n\n public run(name: string, task: Task) {\n const progressMonitor = this.createProgressMonitor(name)\n try {\n this.tasks.push(progressMonitor)\n this.notifyUpdate()\n task(progressMonitor)\n } finally {\n this.tasks.splice(this.tasks.indexOf(progressMonitor), 1)\n this.notifyUpdate()\n }\n }\n\n public async runAsync(name: string, task: AsyncTask) {\n const progressMonitor = this.createProgressMonitor(name)\n this.tasks.push(progressMonitor)\n this.notifyUpdate()\n return task(progressMonitor).finally(() => {\n this.tasks.splice(this.tasks.indexOf(progressMonitor), 1)\n this.notifyUpdate()\n })\n }\n\n private createProgressMonitor(name: string): ProgressMonitor {\n const monitor = {\n name: name,\n message: \"\",\n currentStep: 0,\n totalSteps: -1, // -1 indicates indefinite progress\n progress: -1 // -1 means use step-based calculation\n } as ProgressMonitor\n \n // Create a proxy to detect property changes and trigger UI updates\n return new Proxy(monitor, {\n set: (target, prop, value) => {\n (target as any)[prop] = value\n this.notifyUpdate()\n return true\n }\n })\n }\n\n getActiveTasks() {\n return this.tasks\n }\n}\n\nexport const taskService = new TaskService()\nrootContext.put(\"taskService\", taskService)","import { rootContext } from \"./di\";\nimport { i18nService } from \"./i18n\";\nimport { createLogger } from \"./logger\";\n\nconst logger = createLogger('EsmShService');\n\nexport interface EsmShSource {\n type: 'npm' | 'github' | 'jsr' | 'pr';\n package?: string;\n owner?: string;\n repo?: string;\n version?: string;\n path?: string;\n commit?: string;\n}\n\nexport interface EsmShOptions {\n deps?: Record<string, string>;\n target?: string;\n dev?: boolean;\n bundle?: boolean;\n external?: string[];\n externalAll?: boolean;\n}\n\nclass EsmShService {\n private static readonly ESM_SH_BASE = 'https://esm.sh';\n private static readonly GITHUB_PREFIX = 'gh/';\n private static readonly JSR_PREFIX = 'jsr/';\n private static readonly PR_PREFIX = 'pr/';\n\n isEsmShUrl(url: string): boolean {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname === 'esm.sh' || urlObj.hostname === 'raw.esm.sh';\n } catch {\n return false;\n }\n }\n\n isSourceIdentifier(source: string): boolean {\n if (this.isEsmShUrl(source)) {\n return false;\n }\n \n if (this.isHttpUrl(source)) {\n return false;\n }\n\n return this.parseSource(source) !== null;\n }\n\n private isHttpUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'http:' || parsed.protocol === 'https:';\n } catch {\n return false;\n }\n }\n\n parseSource(source: string): EsmShSource | null {\n if (!source || typeof source !== 'string') {\n return null;\n }\n\n source = source.trim();\n\n if (this.isHttpUrl(source)) {\n return null;\n }\n\n if (source.startsWith(EsmShService.GITHUB_PREFIX)) {\n return this.parseGitHubSource(source);\n }\n\n if (source.startsWith(EsmShService.JSR_PREFIX)) {\n return this.parseJsrSource(source);\n }\n\n if (source.startsWith(EsmShService.PR_PREFIX)) {\n return this.parsePrSource(source);\n }\n\n return this.parseNpmSource(source);\n }\n\n private parseGitHubSource(source: string): EsmShSource | null {\n const withoutPrefix = source.substring(EsmShService.GITHUB_PREFIX.length);\n const parts = withoutPrefix.split('/');\n \n if (parts.length < 2) {\n return null;\n }\n\n const owner = parts[0];\n const repoWithRef = parts[1];\n \n let repo: string;\n let version: string | undefined;\n let path: string | undefined;\n\n const refMatch = repoWithRef.match(/^(.+?)(@(.+))?$/);\n if (!refMatch) {\n return null;\n }\n\n repo = refMatch[1];\n version = refMatch[3];\n\n if (parts.length > 2) {\n path = parts.slice(2).join('/');\n }\n\n return {\n type: 'github',\n owner,\n repo,\n version,\n path\n };\n }\n\n private parseJsrSource(source: string): EsmShSource | null {\n const withoutPrefix = source.substring(EsmShService.JSR_PREFIX.length);\n \n if (!withoutPrefix.startsWith('@')) {\n return null;\n }\n\n const parts = withoutPrefix.split('/');\n if (parts.length < 2) {\n return null;\n }\n\n const scope = parts[0];\n const packageWithVersion = parts[1];\n \n let packageName: string;\n let version: string | undefined;\n let path: string | undefined;\n\n const versionMatch = packageWithVersion.match(/^(.+?)(@(.+))?$/);\n if (!versionMatch) {\n return null;\n }\n\n packageName = `${scope}/${versionMatch[1]}`;\n version = versionMatch[3];\n\n if (parts.length > 2) {\n path = parts.slice(2).join('/');\n }\n\n return {\n type: 'jsr',\n package: packageName,\n version,\n path\n };\n }\n\n private parsePrSource(source: string): EsmShSource | null {\n const withoutPrefix = source.substring(EsmShService.PR_PREFIX.length);\n const parts = withoutPrefix.split('/');\n \n if (parts.length < 2) {\n return null;\n }\n\n const owner = parts[0];\n const repoWithCommit = parts[1];\n \n let repo: string;\n let commit: string | undefined;\n\n const commitMatch = repoWithCommit.match(/^(.+?)@(.+)$/);\n if (commitMatch) {\n repo = commitMatch[1];\n commit = commitMatch[2];\n } else {\n repo = repoWithCommit;\n }\n\n return {\n type: 'pr',\n owner,\n repo,\n commit\n };\n }\n\n private parseNpmSource(source: string): EsmShSource | null {\n const parts = source.split('/');\n const firstPart = parts[0];\n \n let packageName: string;\n let version: string | undefined;\n let path: string | undefined;\n\n const versionMatch = firstPart.match(/^(.+?)(@(.+))?$/);\n if (!versionMatch) {\n return null;\n }\n\n packageName = versionMatch[1];\n version = versionMatch[3];\n\n if (parts.length > 1) {\n path = parts.slice(1).join('/');\n }\n\n return {\n type: 'npm',\n package: packageName,\n version,\n path\n };\n }\n\n buildEsmShUrl(source: EsmShSource, options?: EsmShOptions): string {\n let url = EsmShService.ESM_SH_BASE;\n\n switch (source.type) {\n case 'npm':\n url += `/${source.package}`;\n if (source.version) {\n url += `@${source.version}`;\n }\n if (source.path) {\n url += `/${source.path}`;\n }\n break;\n\n case 'github':\n url += `/${EsmShService.GITHUB_PREFIX}${source.owner}/${source.repo}`;\n if (source.version) {\n url += `@${source.version}`;\n }\n if (source.path) {\n url += `/${source.path}`;\n }\n break;\n\n case 'jsr':\n url += `/${EsmShService.JSR_PREFIX}${source.package}`;\n if (source.version) {\n url += `@${source.version}`;\n }\n if (source.path) {\n url += `/${source.path}`;\n }\n break;\n\n case 'pr':\n url += `/${EsmShService.PR_PREFIX}${source.owner}/${source.repo}`;\n if (source.commit) {\n url += `@${source.commit}`;\n }\n break;\n }\n\n const queryParams: string[] = [];\n\n if (options?.deps) {\n const depsString = Object.entries(options.deps)\n .map(([pkg, version]) => `${pkg}@${version}`)\n .join(',');\n queryParams.push(`deps=${encodeURIComponent(depsString)}`);\n }\n\n if (options?.target) {\n queryParams.push(`target=${encodeURIComponent(options.target)}`);\n }\n\n if (options?.dev) {\n queryParams.push('dev');\n }\n\n if (options?.bundle === false) {\n queryParams.push('bundle=false');\n } else if (options?.bundle === true) {\n queryParams.push('bundle');\n }\n\n if (queryParams.length > 0) {\n url += `?${queryParams.join('&')}`;\n }\n\n return url;\n }\n\n normalizeToEsmSh(source: string, options?: EsmShOptions): string {\n if (this.isEsmShUrl(source)) {\n return source;\n }\n\n if (this.isHttpUrl(source)) {\n return source;\n }\n\n const parsed = this.parseSource(source);\n if (!parsed) {\n logger.warn(`Could not parse source identifier: ${source}`);\n return source;\n }\n\n return this.buildEsmShUrl(parsed, options);\n }\n\n extractPackageName(source: string): string | null {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return null;\n }\n\n switch (parsed.type) {\n case 'npm':\n return parsed.package || null;\n case 'github':\n return `${parsed.owner}/${parsed.repo}`;\n case 'jsr':\n return parsed.package || null;\n case 'pr':\n return `${parsed.owner}/${parsed.repo}`;\n }\n }\n\n isGitHubUrl(url: string): boolean {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname === 'github.com' || urlObj.hostname === 'www.github.com';\n } catch {\n return url.startsWith('https://github.com/') || url.startsWith('http://github.com/');\n }\n }\n\n convertGitHubUrlToSource(githubUrl: string): string {\n try {\n const urlObj = new URL(githubUrl);\n const pathParts = urlObj.pathname.split('/').filter(p => p);\n \n if (pathParts.length < 2) {\n throw new Error('Invalid GitHub URL format');\n }\n \n const owner = pathParts[0];\n let repo = pathParts[1].replace(/\\.git$/, '');\n let ref: string | undefined;\n let filePath: string | undefined;\n \n if (pathParts.length > 2) {\n if (pathParts[2] === 'blob' || pathParts[2] === 'tree') {\n ref = pathParts[3] || 'main';\n if (pathParts[2] === 'blob' && pathParts.length > 4) {\n filePath = pathParts.slice(4).join('/');\n }\n } else if (pathParts[2] === 'commit') {\n ref = pathParts[3];\n } else {\n filePath = pathParts.slice(2).join('/');\n }\n }\n \n let ghUrl = `${EsmShService.GITHUB_PREFIX}${owner}/${repo}`;\n if (ref) {\n ghUrl += `@${ref}`;\n }\n if (filePath) {\n ghUrl += `/${filePath}`;\n }\n \n return ghUrl;\n } catch {\n const urlMatch = githubUrl.match(/github\\.com\\/([^\\/]+)\\/([^\\/]+)/);\n if (urlMatch) {\n return `${EsmShService.GITHUB_PREFIX}${urlMatch[1]}/${urlMatch[2].replace(/\\.git$/, '')}`;\n }\n return githubUrl;\n }\n }\n\n async fetchGitHubPackageJson(source: EsmShSource): Promise<any> {\n if (source.type !== 'github') {\n throw new Error('Source must be a GitHub source');\n }\n\n const owner = source.owner!;\n const repo = source.repo!;\n const ref = source.version || 'main';\n \n const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/package.json`;\n \n const response = await fetch(packageJsonUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch package.json: ${response.statusText}`);\n }\n \n return await response.json();\n }\n}\n\nexport const esmShService = new EsmShService();\nrootContext.put(\"esmShService\", esmShService);","import {appSettings, TOPIC_SETTINGS_CHANGED} from \"./settingsservice\";\nimport {publish, subscribe} from \"./events\";\nimport {toastError, toastInfo} from \"./toast\";\nimport {taskService} from \"./taskservice\";\nimport {rootContext, uiContext} from \"./di\";\nimport logger from \"./logger\";\nimport {esmShService} from \"./esmsh-service\";\n\nexport const TOPIC_EXTENSIONS_CHANGED = \"events/extensionsregistry/extensionsConfigChanged\"\nconst KEY_EXTENSIONS_CONFIG = \"extensions\"\nconst KEY_EXTERNAL_EXTENSIONS = \"extensions.external\"\n\n/**\n * Extension definition for the extension registry.\n * \n * @example\n * ```typescript\n * extensionRegistry.registerExtension({\n * id: \"system.myextension\",\n * name: \"My Extension\",\n * description: \"An example extension\",\n * loader: () => import(\"./my-extension.ts\"),\n * icon: \"puzzle-piece\",\n * dependencies: [\"system.dependency1\", \"system.dependency2\"]\n * })\n * ```\n */\nimport { UILabel } from \"./i18n\";\n\nexport interface Extension {\n /** Unique identifier for the extension (e.g., \"@eclipse-lyra/extension-notebook\") */\n id: string;\n \n /** Human-readable name of the extension */\n name: UILabel;\n \n /** Optional description of what the extension does */\n description?: UILabel;\n \n /** Optional URL to load the extension module from */\n url?: string;\n \n /** Function that dynamically imports the extension module */\n loader?: () => any;\n \n /** Optional icon identifier (FontAwesome or custom icon) */\n icon?: string;\n \n /** Whether this extension is marked as experimental */\n experimental?: boolean;\n \n /** Optional extension version */\n version?: string;\n \n /** Optional extension author */\n author?: string;\n \n /** Whether this extension is from an external source (marketplace) */\n external?: boolean;\n \n /**\n * Optional list of extension IDs that must be loaded before this extension.\n * Dependencies are loaded recursively and automatically when this extension is loaded.\n * The system includes circular dependency detection.\n * \n * @example\n * ```typescript\n * dependencies: [\"@eclipse-lyra/extension-python-runtime\"]\n * ```\n */\n dependencies?: string[];\n}\n\nexport interface ExtensionSetting {\n id: string;\n enabled: boolean;\n}\n\nexport type ExtensionsConfig = ExtensionSetting[]\n\nclass ExtensionRegistry {\n private extensionsSettings?: ExtensionsConfig;\n private extensions: { [key: string]: Extension } = {}\n private loadedExtensions: Set<string> = new Set()\n private loadingPromises: Map<string, Promise<void>> = new Map()\n\n constructor() {\n subscribe(TOPIC_SETTINGS_CHANGED, () => {\n this.extensionsSettings = undefined\n this.checkExtensionsConfig().then()\n })\n\n // Load persisted external extensions first, then load enabled extensions\n this.loadPersistedExternalExtensions().then(() => {\n this.checkExtensionsConfig().then(async () => {\n const loadPromises = this.extensionsSettings\n ?.filter(setting => this.isEnabled(setting.id))\n .map(setting => \n this.load(setting.id).catch(e => {\n toastError(\"Extension could not be loaded: \" + e.message)\n })\n ) || []\n \n await Promise.all(loadPromises)\n })\n })\n }\n\n private async loadPersistedExternalExtensions(): Promise<void> {\n try {\n const persisted = await appSettings.get(KEY_EXTERNAL_EXTENSIONS)\n if (persisted && Array.isArray(persisted)) {\n persisted.forEach((ext: Extension) => {\n this.extensions[ext.id] = ext\n })\n logger.debug(`Loaded ${persisted.length} persisted external extensions`)\n }\n } catch (error) {\n logger.error(`Failed to load persisted external extensions: ${error}`)\n }\n }\n\n private async savePersistedExternalExtensions(): Promise<void> {\n try {\n const externalExtensions = Object.values(this.extensions).filter(ext => ext.external)\n await appSettings.set(KEY_EXTERNAL_EXTENSIONS, externalExtensions)\n } catch (error) {\n logger.error(`Failed to save persisted external extensions: ${error}`)\n }\n }\n\n private async checkExtensionsConfig() {\n if (!this.extensionsSettings) {\n this.extensionsSettings = await appSettings.get(KEY_EXTENSIONS_CONFIG)\n if (!this.extensionsSettings) {\n await appSettings.set(KEY_EXTENSIONS_CONFIG, [])\n this.extensionsSettings = await appSettings.get(KEY_EXTENSIONS_CONFIG)\n }\n publish(TOPIC_EXTENSIONS_CHANGED, this.extensionsSettings)\n }\n }\n\n\n registerExtension(extension: Extension): void {\n this.extensions[extension.id] = extension;\n \n // Persist external extensions\n if (extension.external) {\n this.savePersistedExternalExtensions().catch(err => {\n logger.error(`Failed to persist external extension: ${err}`)\n })\n }\n \n publish(TOPIC_EXTENSIONS_CHANGED, this.extensionsSettings);\n }\n\n /**\n * Load an extension from a URL and register it.\n * The module at the URL must export a default function that receives uiContext.\n * The extension will register its contributions when loaded.\n * \n * Supports:\n * - Direct URLs (http/https)\n * - esm.sh URLs\n * - Source identifiers (npm packages, GitHub repos, JSR packages, PR packages)\n * Examples: 'react@18', 'gh/user/repo', 'jsr/@std/encoding@1.0.0', 'pr/owner/repo@commit'\n * \n * @param url - URL or source identifier to the extension module\n * @param extensionId - Optional extension ID. If not provided, generates one from the URL.\n * @returns Promise that resolves to the extension ID when the extension is loaded\n */\n async loadExtensionFromUrl(url: string, extensionId?: string): Promise<string> {\n logger.info(`Loading extension from URL: ${url}...`);\n \n try {\n let finalUrl = url;\n let extensionName = `Extension from ${url}`;\n\n if (esmShService.isSourceIdentifier(url)) {\n const packageName = esmShService.extractPackageName(url);\n if (packageName) {\n extensionName = `Extension: ${packageName}`;\n }\n finalUrl = esmShService.normalizeToEsmSh(url);\n logger.debug(`Converted source identifier to esm.sh URL: ${url} -> ${finalUrl}`);\n }\n \n const id = extensionId || `url:${finalUrl}`;\n \n if (this.isEnabled(id)) {\n logger.info(`Extension from URL ${finalUrl} is already enabled`);\n return id;\n }\n \n // Check if extension is already registered\n if (!this.extensions[id]) {\n const extension: Extension = {\n id: id,\n name: extensionName,\n description: `Extension loaded from: ${url}`,\n url: finalUrl\n };\n \n this.registerExtension(extension);\n logger.info(`Registered extension from URL: ${id}`);\n }\n \n this.enable(id, false);\n \n logger.info(`Successfully enabled extension from URL: ${finalUrl}`);\n return id;\n } catch (error) {\n logger.error(`Failed to load extension from URL ${url}: ${error}`);\n throw error;\n }\n }\n\n getExtensions(): Extension[] {\n return Object.values(this.extensions)\n }\n\n public isEnabled(extensionId: string) {\n this.checkExtensionsConfig()\n return !!this.extensionsSettings?.find((setting) => setting.id === extensionId && setting.enabled)\n }\n\n public isLoaded(extensionId: string) {\n return this.loadedExtensions.has(extensionId)\n }\n\n public enable(extensionId: string, informUser: boolean = false) {\n if (this.isEnabled(extensionId)) {\n return\n }\n logger.debug(`Loading extension: ${extensionId}`)\n this.load(extensionId).then(() => {\n this.updateEnablement(extensionId, true, informUser)\n }).catch(_e => {\n logger.error(`Could not load extension: ${extensionId}: ${_e}`)\n })\n }\n\n /**\n * Loads an extension and all its dependencies.\n * \n * Features:\n * - Automatically loads all dependencies recursively before loading the extension\n * - Ensures each extension is loaded only once (idempotent)\n * - Dependencies are loaded in the order they are declared\n * - If an extension is already being loaded, waits for that load to complete\n * - Detects circular dependencies in the dependency chain\n * \n * @param extensionId - The ID of the extension to load\n * @param loadingChain - Internal parameter to track the dependency chain for circular detection\n * @throws Error if the extension is not found or if a circular dependency is detected\n * \n * @example\n * ```typescript\n * // This will automatically load @eclipse-lyra/extension-python-runtime first\n * await extensionRegistry.load('@eclipse-lyra/extension-notebook')\n * ```\n */\n public async load(extensionId: string, loadingChain: string[] = []): Promise<void> {\n // Already loaded, return immediately\n if (this.loadedExtensions.has(extensionId)) {\n return\n }\n \n // Currently loading by another call chain, wait for that promise to complete\n const existingPromise = this.loadingPromises.get(extensionId)\n if (existingPromise) {\n return existingPromise\n }\n \n // Check for circular dependency\n if (loadingChain.includes(extensionId)) {\n const chain = [...loadingChain, extensionId].join(' → ')\n throw new Error(`Circular dependency detected: ${chain}`)\n }\n \n const extension = this.extensions[extensionId]\n if (!extension) {\n throw new Error(\"Extension not found: \" + extensionId)\n }\n \n // Create and track the loading promise\n const loadingPromise = (async () => {\n try {\n if (extension.dependencies && extension.dependencies.length > 0) {\n logger.debug(`Loading dependencies for ${extensionId}: ${extension.dependencies.join(', ')}`)\n const newChain = [...loadingChain, extensionId]\n for (const depId of extension.dependencies) {\n await this.load(depId, newChain)\n // Enable the dependency if it's not already enabled\n if (!this.isEnabled(depId)) {\n await this.updateEnablementAsync(depId, true, false)\n logger.debug(`Auto-enabled dependency: ${depId}`)\n }\n }\n }\n \n const module = await taskService.runAsync(\"Loading extension: \" + extension.name, async () => {\n if (extension.loader) {\n return extension.loader()\n } else if (extension.url) {\n let finalUrl = extension.url;\n if (esmShService.isSourceIdentifier(extension.url)) {\n finalUrl = esmShService.normalizeToEsmSh(extension.url);\n logger.debug(`Normalized extension URL: ${extension.url} -> ${finalUrl}`);\n }\n return import(/* @vite-ignore */ finalUrl)\n }\n })\n\n // Mark as loaded BEFORE executing the module\n this.loadedExtensions.add(extensionId)\n\n if (module?.default instanceof Function) {\n logger.debug(`Executing extension function for: ${extensionId}`)\n try {\n module?.default(uiContext.getProxy())\n logger.debug(`Extension function executed successfully: ${extensionId}`)\n } catch (error) {\n logger.error(`Error executing extension function for ${extensionId}: ${error}`)\n throw error\n }\n } else {\n logger.warn(`Extension ${extensionId} does not export a default function`)\n }\n \n logger.debug(`Extension loaded: ${extensionId}`)\n } catch (error) {\n // If loading failed, remove from loaded set\n this.loadedExtensions.delete(extensionId)\n throw error\n } finally {\n // Always clean up the promise\n this.loadingPromises.delete(extensionId)\n }\n })()\n \n this.loadingPromises.set(extensionId, loadingPromise)\n return loadingPromise\n }\n\n public disable(extensionId: string, informUser: boolean = false) {\n if (!this.isEnabled(extensionId)) {\n return\n }\n this.updateEnablement(extensionId, false, informUser)\n }\n\n private updateEnablement(extensionId: string, enabled: boolean, informUser: boolean) {\n this.checkExtensionsConfig().then(() => {\n const extension = this.extensionsSettings?.find(e => e.id == extensionId)\n if (extension) {\n extension.enabled = enabled\n } else {\n this.extensionsSettings?.push({id: extensionId, enabled: enabled})\n }\n appSettings.set(KEY_EXTENSIONS_CONFIG, this.extensionsSettings).then(() => {\n if (informUser) {\n const extObj = this.extensions[extensionId]\n if (enabled) {\n toastInfo(extObj.name + \" enabled.\")\n } else {\n toastInfo(extObj.name + \" disabled \" + \" - Please restart to take effect\")\n }\n }\n publish(TOPIC_EXTENSIONS_CHANGED, this.extensionsSettings)\n })\n })\n }\n\n private async updateEnablementAsync(extensionId: string, enabled: boolean, informUser: boolean) {\n await this.checkExtensionsConfig()\n const extension = this.extensionsSettings?.find(e => e.id == extensionId)\n if (extension) {\n extension.enabled = enabled\n } else {\n this.extensionsSettings?.push({id: extensionId, enabled: enabled})\n }\n await appSettings.set(KEY_EXTENSIONS_CONFIG, this.extensionsSettings)\n if (informUser) {\n const extObj = this.extensions[extensionId]\n if (enabled) {\n toastInfo(extObj.name + \" enabled.\")\n } else {\n toastInfo(extObj.name + \" disabled \" + \" - Please restart to take effect\")\n }\n }\n publish(TOPIC_EXTENSIONS_CHANGED, this.extensionsSettings)\n }\n}\n\nlogger.debug('ExtensionRegistry initializing...');\nexport const extensionRegistry = new ExtensionRegistry()\nrootContext.put(\"extensionRegistry\", extensionRegistry)\nlogger.debug('ExtensionRegistry initialized');","/**\n * Key Binding Manager for geo!space\n *\n * Handles keyboard shortcuts and binds them to commands.\n * Supports standard modifiers: CTRL, ALT, SHIFT, META (CMD on Mac)\n */\n\nimport logger from \"./logger\";\nimport { subscribe } from \"./events\";\nimport { commandRegistry, TOPIC_COMMAND_REGISTERED } from \"./commandregistry\";\nimport { rootContext } from \"./di\";\n\nimport type { Command } from \"./commandregistry\";\n\nexport type ModifierField = 'ctrl' | 'alt' | 'shift' | 'meta';\n\nexport interface KeyBinding {\n commandId: string;\n key: string;\n ctrl?: boolean;\n alt?: boolean;\n shift?: boolean;\n meta?: boolean;\n}\n\nconst MODIFIER_FIELDS: ModifierField[] = ['alt', 'ctrl', 'meta', 'shift'];\n\nconst MODIFIER_ALIASES: Record<string, ModifierField> = {\n CTRL: 'ctrl', CONTROL: 'ctrl',\n ALT: 'alt', OPTION: 'alt',\n SHIFT: 'shift',\n META: 'meta', CMD: 'meta', COMMAND: 'meta', WIN: 'meta', WINDOWS: 'meta',\n};\n\nconst MODIFIER_DISPLAY: Record<ModifierField, string> = {\n ctrl: 'Ctrl', alt: 'Alt', shift: 'Shift', meta: 'Cmd',\n};\n\nconst KEY_NORMALIZE: Record<string, string> = {\n SPACE: ' ', ESC: 'ESCAPE', RETURN: 'ENTER',\n LEFT: 'ARROWLEFT', RIGHT: 'ARROWRIGHT', UP: 'ARROWUP', DOWN: 'ARROWDOWN',\n DEL: 'DELETE', INS: 'INSERT', PAGEUP: 'PAGEUP', PAGEDOWN: 'PAGEDOWN',\n};\n\nconst KNOWN_MODIFIERS = new Set<string>(Object.keys(MODIFIER_ALIASES));\n\nfunction normalizeKey(key: string): string {\n return KEY_NORMALIZE[key] ?? key;\n}\n\nexport class KeyBindingManager {\n private bindings: Map<string, KeyBinding[]> = new Map();\n private enabled: boolean = true;\n\n constructor() {\n document.addEventListener('keydown', this.handleKeyDown.bind(this), true);\n this.registerExistingCommandBindings();\n subscribe(TOPIC_COMMAND_REGISTERED, (command: Command) => {\n if (command.keyBinding) {\n this.registerKeyBinding(command.id, command.keyBinding);\n }\n });\n }\n\n private registerExistingCommandBindings() {\n const commands = commandRegistry.listCommands();\n Object.values(commands).forEach((command: Command) => {\n if (command.keyBinding) {\n this.registerKeyBinding(command.id, command.keyBinding);\n }\n });\n }\n\n /**\n * Parse a key binding string like \"CTRL+SHIFT+P\" or \"ALT+S\"\n */\n parseKeyBinding(keyBindingString: string): KeyBinding | null {\n if (!keyBindingString || keyBindingString.trim() === '') {\n return null;\n }\n\n const parts = keyBindingString.toUpperCase().split('+').map(p => p.trim());\n if (parts.length === 0) {\n return null;\n }\n\n const key = parts[parts.length - 1];\n const modifiers = parts.slice(0, -1);\n if (parts.length === 1 && KNOWN_MODIFIERS.has(key)) {\n return null;\n }\n\n const binding: Partial<KeyBinding> = { ctrl: false, alt: false, shift: false, meta: false };\n for (const modifier of modifiers) {\n const field = MODIFIER_ALIASES[modifier];\n if (field === undefined) return null;\n binding[field] = true;\n }\n binding.key = normalizeKey(key);\n return binding as KeyBinding;\n }\n\n /**\n * Create a unique key for a binding\n */\n private getBindingKey(binding: KeyBinding): string {\n const parts = [...MODIFIER_FIELDS.filter(f => binding[f]), binding.key.toUpperCase()];\n return parts.join('+');\n }\n\n /**\n * Register a key binding for a command\n */\n registerKeyBinding(commandId: string, keyBindingString: string): boolean {\n const binding = this.parseKeyBinding(keyBindingString);\n \n if (!binding) {\n logger.error(`Invalid key binding: ${keyBindingString}`);\n return false;\n }\n\n binding.commandId = commandId;\n \n const bindingKey = this.getBindingKey(binding);\n \n if (!this.bindings.has(bindingKey)) {\n this.bindings.set(bindingKey, []);\n }\n \n const existing = this.bindings.get(bindingKey)!;\n const sameCommand = existing.find(b => b.commandId === commandId);\n if (sameCommand) {\n logger.error(`Key binding ${keyBindingString} already registered for command ${commandId}`);\n return false;\n }\n const otherCommand = existing.find(b => b.commandId !== commandId);\n if (otherCommand) {\n logger.warn(`Key binding ${keyBindingString} already used by command ${otherCommand.commandId}; refusing for ${commandId}`);\n return false;\n }\n\n existing.push(binding);\n logger.debug(`Key binding registered: ${keyBindingString} -> ${commandId}`);\n \n return true;\n }\n\n /**\n * Unregister a key binding\n */\n unregisterKeyBinding(commandId: string, keyBindingString?: string): void {\n if (keyBindingString) {\n const binding = this.parseKeyBinding(keyBindingString);\n if (binding) {\n const bindingKey = this.getBindingKey(binding);\n const bindings = this.bindings.get(bindingKey);\n if (bindings) {\n const filtered = bindings.filter(b => b.commandId !== commandId);\n if (filtered.length === 0) {\n this.bindings.delete(bindingKey);\n } else {\n this.bindings.set(bindingKey, filtered);\n }\n }\n }\n } else {\n // Remove all bindings for this command\n for (const [key, bindings] of this.bindings.entries()) {\n const filtered = bindings.filter(b => b.commandId !== commandId);\n if (filtered.length === 0) {\n this.bindings.delete(key);\n } else {\n this.bindings.set(key, filtered);\n }\n }\n }\n }\n\n /**\n * Get all key bindings for a command\n */\n getKeyBindingsForCommand(commandId: string): string[] {\n const result: string[] = [];\n for (const bindings of this.bindings.values()) {\n for (const binding of bindings) {\n if (binding.commandId === commandId) {\n result.push(this.formatKeyBinding(binding));\n }\n }\n }\n return result.sort();\n }\n\n /**\n * Format a key binding for display\n */\n formatKeyBinding(binding: KeyBinding): string {\n const parts = MODIFIER_FIELDS.filter(f => binding[f]).map(f => MODIFIER_DISPLAY[f]);\n const key = binding.key.length === 1\n ? binding.key.toUpperCase()\n : binding.key.charAt(0).toUpperCase() + binding.key.slice(1).toLowerCase();\n parts.push(key);\n return parts.join('+');\n }\n\n /**\n * Handle keyboard events\n */\n private handleKeyDown(event: KeyboardEvent): void {\n if (!this.enabled) {\n return;\n }\n // event.key can be empty or layout-specific with some IMEs or dead keys\n const eventBinding: KeyBinding = {\n commandId: '',\n key: normalizeKey(event.key.toUpperCase()),\n ctrl: event.ctrlKey,\n alt: event.altKey,\n shift: event.shiftKey,\n meta: event.metaKey\n };\n const bindingKey = this.getBindingKey(eventBinding);\n const bindings = this.bindings.get(bindingKey);\n\n if (bindings && bindings.length > 0) {\n const binding = bindings[0];\n try {\n event.preventDefault();\n event.stopPropagation();\n const context = commandRegistry.createExecutionContext({});\n commandRegistry.execute(binding.commandId, context);\n logger.debug(`Executed command via key binding: ${binding.commandId}`);\n } catch (error: any) {\n logger.error(`Failed to execute command ${binding.commandId}: ${error.message}`);\n }\n }\n }\n\n /**\n * Enable or disable key binding handling\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n /**\n * Check if key binding handling is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Get all registered key bindings\n */\n getAllBindings(): Map<string, KeyBinding[]> {\n const copy = new Map<string, KeyBinding[]>();\n for (const [key, bindings] of this.bindings) {\n copy.set(key, [...bindings]);\n }\n return copy;\n }\n\n /**\n * Clear all key bindings\n */\n clearAll(): void {\n this.bindings.clear();\n }\n}\n\nexport const keyBindingManager = new KeyBindingManager();\nrootContext.put(\"keyBindingManager\", keyBindingManager);\n\n","import {LyraWidget} from \"../widgets/widget\";\nimport {appSettings} from \"../core/settingsservice\";\n\nexport abstract class LyraElement extends LyraWidget {\n /**\n * Unique settings key for this element, used for persisting dialog settings.\n * Automatically initialized on first access via getDialogSetting() or setDialogSetting().\n */\n private settingsKey: string | null = null;\n\n /**\n * Builds a unique DOM tree path for this element.\n * Uses id attribute if available, otherwise builds a path based on tag names and indices.\n * Useful for generating unique settings keys.\n * \n * @returns A string representing the DOM path, or null if path cannot be determined\n */\n private buildDOMTreePath(): string | null {\n const pathParts: string[] = [];\n let current: HTMLElement | null = this;\n \n while (current && current !== document.body && current !== document.documentElement) {\n const id = current.getAttribute(\"id\");\n if (id) {\n pathParts.unshift(`#${id}`);\n break;\n }\n \n const tagName = current.tagName.toLowerCase();\n const parent: HTMLElement | null = current.parentElement;\n \n if (!parent) {\n break;\n }\n \n const siblings = Array.from(parent.children).filter(\n (child: Element) => child.tagName.toLowerCase() === tagName\n ) as HTMLElement[];\n const index = siblings.indexOf(current);\n \n if (index >= 0) {\n pathParts.unshift(`${tagName}:${index}`);\n } else {\n pathParts.unshift(tagName);\n }\n \n current = parent;\n }\n \n return pathParts.length > 0 ? pathParts.join(\" > \") : null;\n }\n\n /**\n * Initializes the settings key for this element using the element's tag name.\n * Called automatically on first access via getDialogSetting() or setDialogSetting().\n */\n private initializeSettingsKey(): void {\n if (!this.settingsKey) {\n const prefix = this.tagName.toLowerCase();\n const id = this.getAttribute(\"id\");\n if (id) {\n this.settingsKey = `${prefix}:${id}`;\n return;\n }\n \n const path = this.buildDOMTreePath();\n if (path) {\n this.settingsKey = `${prefix}:${path}`;\n }\n }\n }\n\n /**\n * Gets a dialog setting value for this element.\n * Automatically initializes the settings key on first access if not already set.\n * \n * @returns The persisted setting value, or undefined if not found\n */\n protected async getDialogSetting(): Promise<any> {\n this.initializeSettingsKey();\n if (!this.settingsKey) {\n return undefined;\n }\n return await appSettings.getDialogSetting(this.settingsKey);\n }\n\n /**\n * Saves a dialog setting value for this element.\n * Automatically initializes the settings key on first access if not already set.\n * \n * @param value - The value to persist\n */\n protected async setDialogSetting(value: any): Promise<void> {\n this.initializeSettingsKey();\n if (!this.settingsKey) {\n return;\n }\n await appSettings.setDialogSetting(this.settingsKey, value);\n }\n}","import { html, TemplateResult, css } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport { LyraElement } from \"./element\";\n\nexport abstract class LyraDialogContent extends LyraElement {\n static styles = [\n css`\n .dialog-message {\n margin-bottom: 0.5rem;\n color: var(--wa-color-text-normal);\n }\n `\n ];\n\n dispose(): void | Promise<void> {\n }\n\n getResult(): any {\n return undefined;\n }\n\n protected renderMessage(message: string, markdown: boolean = false): TemplateResult {\n if (markdown) {\n const htmlContent = marked.parse(message, { async: false }) as string;\n return html`<div class=\"dialog-message\" style=\"white-space: normal;\">${unsafeHTML(htmlContent)}</div>`;\n }\n return html`<div class=\"dialog-message\" style=\"white-space: pre-line;\">${message}</div>`;\n }\n}\n\n","import { html, render, TemplateResult } from \"lit\";\nimport { contributionRegistry, Contribution, TOPIC_CONTRIBUTEIONS_CHANGED } from \"./contributionregistry\";\nimport { subscribe } from \"./events\";\nimport { createLogger } from \"./logger\";\nimport { rootContext } from \"./di\";\nimport { LyraDialogContent } from \"../parts/dialog-content\";\n\nconst logger = createLogger('DialogService');\n\nexport const DIALOG_CONTRIBUTION_TARGET = \"dialogs\";\n\nexport interface DialogButton {\n id: string;\n label: string;\n variant?: 'default' | 'primary' | 'success' | 'neutral' | 'warning' | 'danger';\n disabled?: boolean;\n}\n\nexport const OK_BUTTON: DialogButton = {\n id: 'ok',\n label: 'OK',\n variant: 'primary'\n};\n\nexport const CANCEL_BUTTON: DialogButton = {\n id: 'cancel',\n label: 'Cancel',\n variant: 'default'\n};\n\nexport const YES_BUTTON: DialogButton = {\n id: 'yes',\n label: 'Yes',\n variant: 'primary'\n};\n\nexport const NO_BUTTON: DialogButton = {\n id: 'no',\n label: 'No',\n variant: 'default'\n};\n\nexport const CLOSE_BUTTON: DialogButton = {\n id: 'close',\n label: 'Close',\n variant: 'default'\n};\n\nexport const SAVE_BUTTON: DialogButton = {\n id: 'save',\n label: 'Save',\n variant: 'primary'\n};\n\nexport const DELETE_BUTTON: DialogButton = {\n id: 'delete',\n label: 'Delete',\n variant: 'danger'\n};\n\nexport interface DialogContribution extends Contribution {\n id: string;\n buttons?: DialogButton[];\n component: (state?: any) => TemplateResult;\n onButton: (id: string, result: any, state?: any) => boolean | Promise<boolean> | void | Promise<void>;\n}\n\nlet dialogContainer: HTMLElement | null = null;\n\nfunction getDialogContainer(): HTMLElement {\n if (!dialogContainer || !document.body.contains(dialogContainer)) {\n dialogContainer = document.createElement('div');\n dialogContainer.id = 'global-dialog-container';\n document.body.appendChild(dialogContainer);\n }\n return dialogContainer;\n}\n\nclass DialogService {\n private contributions: Map<string, DialogContribution> = new Map();\n\n constructor() {\n this.loadContributions();\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: any) => {\n if (event.target === DIALOG_CONTRIBUTION_TARGET) {\n this.loadContributions();\n }\n });\n }\n\n private loadContributions(): void {\n const contributions = contributionRegistry.getContributions<DialogContribution>(DIALOG_CONTRIBUTION_TARGET);\n \n this.contributions.clear();\n \n for (const contribution of contributions) {\n if (!contribution.id) {\n logger.warn('Dialog contribution missing id, skipping');\n continue;\n }\n\n\n if (!contribution.component) {\n logger.warn(`Dialog contribution \"${contribution.id}\" has no component function, skipping`);\n continue;\n }\n\n if (!contribution.onButton) {\n logger.warn(`Dialog contribution \"${contribution.id}\" has no onButton callback, skipping`);\n continue;\n }\n\n this.contributions.set(contribution.id, contribution);\n logger.debug(`Loaded dialog contribution: ${contribution.id}`);\n }\n\n logger.info(`Loaded ${this.contributions.size} dialog contributions`);\n }\n\n async open(dialogId: string, state?: any): Promise<void> {\n const contribution = this.contributions.get(dialogId);\n \n if (!contribution) {\n logger.error(`Dialog \"${dialogId}\" not found`);\n throw new Error(`Dialog \"${dialogId}\" not found`);\n }\n\n return new Promise((resolve) => {\n const container = getDialogContainer();\n let isOpen = true;\n let dialogContentElement: LyraDialogContent | null = null;\n\n const cleanup = async () => {\n if (!isOpen) return;\n isOpen = false;\n \n if (dialogContentElement) {\n try {\n await dialogContentElement.dispose();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error disposing dialog content for \"${dialogId}\": ${errorMessage}`);\n }\n }\n \n try {\n const result = dialogContentElement ? dialogContentElement.getResult() : undefined;\n await contribution.onButton('close', result, stateWithClose);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error executing close callback for dialog \"${dialogId}\": ${errorMessage}`);\n }\n \n render(html``, container);\n resolve();\n };\n\n const handleButtonClick = async (buttonId: string) => {\n try {\n const result = dialogContentElement ? dialogContentElement.getResult() : undefined;\n const shouldClose = await contribution.onButton(buttonId, result, stateWithClose);\n \n if (shouldClose !== false) {\n cleanup();\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error executing button callback for dialog \"${dialogId}\": ${errorMessage}`);\n cleanup();\n }\n };\n\n const buttons = contribution.buttons && contribution.buttons.length > 0 \n ? contribution.buttons \n : [OK_BUTTON];\n\n if (state && typeof state === 'object') {\n (state as any).close = cleanup;\n }\n const stateWithClose = { ...state, close: cleanup };\n\n const template = html`\n <wa-dialog label=\"${contribution.label || dialogId}\" open @wa-request-close=${cleanup}>\n <style>\n .dialog-service-content {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n min-width: 400px;\n }\n \n .dialog-service-footer {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n margin-top: 1rem;\n padding-top: 1rem;\n border-top: 1px solid var(--wa-color-neutral-20);\n }\n\n :host-context(.wa-light) .dialog-service-footer {\n border-top-color: var(--wa-color-neutral-80);\n }\n </style>\n \n <div class=\"dialog-service-content\" \n @dialog-ok=${() => {\n const okButton = buttons.find(b => b.id === 'ok');\n if (okButton) {\n handleButtonClick(okButton.id);\n }\n }}\n @dialog-cancel=${() => {\n const cancelButton = buttons.find(b => b.id === 'cancel');\n if (cancelButton) {\n handleButtonClick(cancelButton.id);\n } else {\n cleanup();\n }\n }}>\n ${contribution.component(state)}\n \n <div class=\"dialog-service-footer\">\n ${buttons.map(button => html`\n <wa-button \n variant=\"${button.variant || 'default'}\"\n ?disabled=${button.disabled}\n @click=${() => handleButtonClick(button.id)}\n >\n ${button.label}\n </wa-button>\n `)}\n </div>\n </div>\n </wa-dialog>\n `;\n\n render(template, container);\n \n (async () => {\n const allElements = Array.from(container.querySelectorAll('*'));\n for (const element of allElements) {\n if (element instanceof LyraDialogContent) {\n await element.updateComplete;\n dialogContentElement = element;\n break;\n }\n }\n })();\n });\n }\n\n getDialogIds(): string[] {\n return Array.from(this.contributions.keys());\n }\n\n hasDialog(dialogId: string): boolean {\n return this.contributions.has(dialogId);\n }\n}\n\nexport const dialogService = new DialogService();\nrootContext.put(\"dialogService\", dialogService);\n\n","import {LyraElement} from \"./element\";\n\nexport abstract class LyraContainer extends LyraElement {\n}","import { LyraContainer } from \"./container\";\nimport { property } from \"lit/decorators.js\";\nimport { PropertyValues, TemplateResult, nothing } from \"lit\";\nimport { partDirtySignal, activePartSignal } from \"../core/appstate\";\nimport { CommandStack } from \"../core/commandregistry\";\nimport { TabContribution } from \"../core/contributionregistry\";\n\nexport abstract class LyraPart extends LyraContainer {\n @property()\n private dirty: boolean = false\n\n public tabContribution?: TabContribution;\n \n public isEditor: boolean = false;\n\n protected commandStack?: CommandStack;\n\n public getCommandStack(): CommandStack | undefined {\n return this.commandStack;\n }\n\n /**\n * Override this method to provide toolbar content for this part.\n * This is a lightweight alternative to registering toolbar contributions\n * for actions that are scoped to this part instance.\n * \n * IMPORTANT: Event handlers MUST use arrow functions to preserve the component's 'this' context.\n * The toolbar template is rendered in a different component (lyra-toolbar), so direct method \n * references lose their binding.\n * \n * ✅ Correct:\n * @click=${() => this.myMethod()}\n * @click=${(e) => this.handleClick(e)}\n * \n * ❌ Wrong (this will be bound to the toolbar, not your component):\n * @click=${this.myMethod}\n * \n * Example:\n * ```typescript\n * protected renderToolbar() {\n * return html`\n * <wa-button @click=${() => this.save()} title=\"Save\">\n * <wa-icon name=\"save\"></wa-icon>\n * </wa-button>\n * `;\n * }\n * ```\n * \n * @returns TemplateResult with toolbar items, or nothing if no toolbar needed\n */\n protected renderToolbar(): TemplateResult | typeof nothing {\n return nothing;\n }\n\n /**\n * Call this method to update the toolbar when the component's state changes.\n * This triggers a re-render of the toolbar with the latest content from renderToolbar().\n */\n protected updateToolbar(): void {\n this.dispatchEvent(new CustomEvent('part-toolbar-changed', {\n bubbles: true,\n composed: true\n }));\n }\n\n /**\n * Override this method to provide context menu content for this part.\n * This is a lightweight alternative to registering context menu contributions\n * for actions that are scoped to this part instance.\n * \n * IMPORTANT: Event handlers MUST use arrow functions to preserve the component's 'this' context.\n * The context menu is rendered in a different component (contextmenu), so direct method \n * references lose their binding.\n * \n * ✅ Correct:\n * @click=${() => this.myMethod()}\n * @click=${(e) => this.handleClick(e)}\n * \n * ❌ Wrong (this will be bound to the context menu, not your component):\n * @click=${this.myMethod}\n * \n * Example:\n * ```typescript\n * protected renderContextMenu() {\n * return html`\n * <wa-dropdown-item @click=${() => this.open()}>\n * <wa-icon name=\"folder-open\"></wa-icon>\n * Open\n * </wa-dropdown-item>\n * <wa-divider></wa-divider>\n * <wa-dropdown-item @click=${() => this.delete()}>\n * <wa-icon name=\"trash\"></wa-icon>\n * Delete\n * </wa-dropdown-item>\n * `;\n * }\n * ```\n * \n * @returns TemplateResult with context menu items, or nothing if no context menu needed\n */\n protected renderContextMenu(): TemplateResult | typeof nothing {\n return nothing;\n }\n\n /**\n * Call this method to update the context menu when the component's state changes.\n * This triggers a re-render of the context menu with the latest content from renderContextMenu().\n */\n protected updateContextMenu(): void {\n this.dispatchEvent(new CustomEvent('part-contextmenu-changed', {\n bubbles: true,\n composed: true\n }));\n }\n\n protected updated(_changedProperties: PropertyValues) {\n super.updated(_changedProperties);\n\n if (_changedProperties.has(\"dirty\")) {\n const dirty = _changedProperties.get(\"dirty\")\n if (dirty !== undefined) {\n this.dispatchEvent(new CustomEvent(\"dirty\", {detail: this.dirty, bubbles: true}))\n }\n }\n }\n\n protected doClose() {\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n // Don't automatically close when disconnected - the element might just be moving\n // Call close() explicitly when actually closing the part\n }\n\n public close() {\n this.doClose()\n }\n\n connectedCallback() {\n super.connectedCallback();\n }\n\n save() {\n }\n\n public isDirty() {\n return this.dirty\n }\n\n public markDirty(dirty: boolean) {\n this.dirty = dirty\n partDirtySignal.set(null as unknown as LyraPart)\n partDirtySignal.set(this)\n activePartSignal.set(null as unknown as LyraPart)\n activePartSignal.set(this)\n }\n}","/**\n * App Loader Service\n * \n * Provides a clean separation between the framework and applications built on it.\n * This allows the framework (k-* components and core services) to be published\n * as a reusable npm package, while applications like geospace can be loaded\n * dynamically.\n * \n * Architecture:\n * - Framework: Core services, k-* components (publishable as npm package)\n * - Application: App-specific code, gs-* components, contributions\n * - App Loader: Bridge between framework and application\n */\n\nimport {render, TemplateResult, html} from \"lit\";\nimport {rootContext} from \"./di\";\nimport {createLogger} from \"./logger\";\nimport {extensionRegistry, Extension} from \"./extensionregistry\";\nimport {contributionRegistry, Contribution} from \"./contributionregistry\";\nimport {appSettings} from \"./settingsservice\";\n\n\nconst logger = createLogger('AppLoader');\n\n/**\n * Extracts error message from an error object.\n */\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Extracts the last path segment from a URL string.\n */\nfunction extractLastPathSegment(urlString: string): string | undefined {\n try {\n const url = new URL(urlString);\n const pathSegments = url.pathname.split('/').filter(Boolean);\n return pathSegments.length > 0 ? pathSegments[pathSegments.length - 1] : undefined;\n } catch {\n const pathSegments = urlString.split('/').filter(Boolean);\n return pathSegments.length > 0 ? pathSegments[pathSegments.length - 1] : undefined;\n }\n}\n\n/**\n * Extracts the first path segment from the current page URL.\n * This allows loading apps by path, e.g., /geospace loads the geospace app.\n */\nfunction extractAppIdFromPath(): string | undefined {\n const pathname = window.location.pathname;\n const pathSegments = pathname.split('/').filter(Boolean);\n \n if (pathSegments.length === 0) {\n return undefined;\n }\n \n const firstSegment = pathSegments[0];\n \n if (!firstSegment || firstSegment === 'index.html' || firstSegment.endsWith('.html')) {\n return undefined;\n }\n \n return firstSegment;\n}\n\n/**\n * Application contributions interface.\n * Declaratively defines all contributions for an application.\n */\nexport interface AppContributions {\n /** UI contributions (tabs, toolbars, commands, etc.) */\n ui?: Contribution[];\n \n /** App-specific extensions to register */\n extensions?: Extension[];\n}\n\n/**\n * Represents a single release entry in the release history.\n * Compatible with GitHub release format but with optional html_url.\n */\nexport interface ReleaseEntry {\n /** Release tag name (e.g., \"v1.0.0\") */\n tag_name: string;\n \n /** Human-readable release name */\n name: string;\n \n /** Release notes/description (markdown supported) */\n body: string;\n \n /** ISO 8601 timestamp when the release was published */\n published_at: string;\n \n /** Optional URL to the release page */\n html_url?: string;\n \n /** Whether this is a pre-release */\n prerelease?: boolean;\n \n /** Whether this release is a draft */\n draft?: boolean;\n}\n\n/**\n * Release history can be provided as:\n * - A static array of releases\n * - A function that returns releases asynchronously\n * This allows apps to either provide pre-loaded releases or fetch them dynamically.\n */\nexport type ReleaseHistory = ReleaseEntry[];\n\n/** Descriptor for rendering a single custom element as the app root (no lit required). */\nexport interface RenderDescriptor {\n tag: string;\n attributes?: Record<string, string>;\n}\n\n/**\n * Application definition interface.\n * Applications implement this interface to integrate with the framework.\n */\nexport interface AppDefinition {\n /** Unique application identifier */\n id: string;\n \n /** Human-readable application name */\n name: string;\n \n /** Application version */\n version: string;\n \n /** Optional application description */\n description?: string;\n \n /**\n * Custom application metadata (optional).\n * Apps can define any custom metadata here for their own use.\n * The framework may read certain metadata keys (e.g., `metadata.github` for release checking).\n */\n metadata?: Record<string, any>;\n \n /**\n * Core framework extensions required by the application.\n * The app loader will enable these extensions when loading the app\n * and disable them when unloading.\n */\n extensions?: string[];\n \n /**\n * Application contributions (tabs, toolbars, commands, app extensions).\n * The app loader will register these contributions automatically.\n */\n contributions?: AppContributions;\n \n /**\n * Application initialization function.\n * Called after extensions are enabled and contributions are registered.\n * Use this for custom initialization logic that can't be expressed declaratively.\n */\n initialize?: () => void | Promise<void>;\n \n /**\n * Optional release history for the application.\n * Can be a static array of releases or a callback function that returns releases (synchronously or asynchronously).\n * If not provided, the version-info command will attempt to fetch releases from GitHub\n * (if metadata.github is configured).\n */\n releaseHistory?: ReleaseHistory | (() => ReleaseHistory | Promise<ReleaseHistory>);\n \n /**\n * Root component to render. Can be:\n * - A tag name string (e.g. \"lyra-standard-layout\") for a single custom element with no attributes.\n * - A descriptor { tag, attributes? } for a single custom element with optional attributes.\n * - A function returning a Lit TemplateResult for custom templates (requires lit in the app).\n * If not provided, defaults to lyra-standard-layout.\n */\n render?: string | RenderDescriptor | (() => TemplateResult);\n\n /**\n * Optional cleanup function.\n * Called when the app is being unloaded, before extensions are disabled.\n */\n dispose?: () => void | Promise<void>;\n}\n\n/**\n * Options for registering an application with the apploader.\n */\nexport interface RegisterAppOptions {\n /** \n * Default app ID to load if no app URL parameter is provided.\n * If not specified, the first registered app will be loaded.\n */\n defaultAppId?: string;\n \n /** \n * Whether to automatically start the apploader after registration.\n * If true, the apploader will start immediately after the app is registered.\n * Defaults to false.\n */\n autoStart?: boolean;\n \n /** \n * DOM element to render the app into.\n * Defaults to document.body.\n */\n container?: HTMLElement;\n}\n\n/**\n * App Loader Service\n * \n * Manages application lifecycle:\n * 1. Register app definitions\n * 2. Initialize apps\n * 3. Render apps to DOM\n * 4. Manage app lifecycle\n */\nclass AppLoaderService {\n private apps: Map<string, AppDefinition> = new Map();\n private currentApp?: AppDefinition;\n private started: boolean = false;\n private defaultAppId?: string;\n private container: HTMLElement = document.body;\n private systemRequiredExtensions: Set<string> = new Set();\n private static readonly PREFERRED_APP_KEY = 'preferredAppId';\n \n /**\n * Register an application with the framework.\n * Optionally starts the apploader automatically after registration.\n * \n * @param app - Application definition\n * @param options - Optional configuration for registration and auto-starting\n */\n registerApp(app: AppDefinition, options?: RegisterAppOptions): void {\n if (this.apps.has(app.id)) {\n logger.warn(`App '${app.id}' is already registered. Overwriting.`);\n }\n \n this.apps.set(app.id, app);\n logger.info(`Registered app: ${app.name} (${app.id}) v${app.version}`);\n \n if (options?.defaultAppId) {\n this.defaultAppId = options.defaultAppId;\n }\n \n if (options?.container) {\n this.container = options.container;\n }\n \n if (options?.autoStart && !this.started) {\n this.start();\n }\n }\n\n registerSystemRequiredExtension(extensionId: string) {\n this.systemRequiredExtensions.add(extensionId);\n }\n \n\n /**\n * Load an application definition from a URL.\n * The module at the URL must export an AppDefinition as the default export.\n * \n * @param url - URL to the app definition module\n * @returns Promise that resolves to the loaded AppDefinition\n */\n async loadAppFromUrl(url: string): Promise<AppDefinition> {\n logger.info(`Loading app from URL: ${url}...`);\n \n try {\n const module = await import(/* @vite-ignore */ url);\n \n if (!module.default) {\n throw new Error(`Module at ${url} does not have a default export`);\n }\n \n const app = module.default as AppDefinition;\n \n if (!app.id || !app.name || !app.version) {\n throw new Error(`Module at ${url} does not export a valid AppDefinition`);\n }\n \n logger.info(`Successfully loaded app definition from URL: ${app.name} (${app.id})`);\n return app;\n } catch (error) {\n logger.error(`Failed to load app from URL ${url}: ${getErrorMessage(error)}`);\n throw error;\n }\n }\n\n /**\n * Start the application loader.\n * Checks URL parameters for app=URL, loads that extension or app if found.\n * URL parameter has higher precedence than defaultAppId.\n * Then loads the default app or first registered app.\n * This method is idempotent - calling it multiple times only starts once.\n */\n async start(): Promise<void> {\n if (this.started) {\n logger.debug('AppLoader already started');\n return;\n }\n \n this.started = true;\n logger.info('Starting AppLoader...');\n \n const urlParams = new URLSearchParams(window.location.search);\n const appUrl = urlParams.get('app');\n const appIdFromUrl = urlParams.get('appId');\n const appIdFromPath = extractAppIdFromPath();\n const appsBeforeExtension = this.apps.size;\n \n let appIdFromAppUrl: string | undefined;\n if (appUrl) {\n appIdFromAppUrl = extractLastPathSegment(appUrl);\n if (appIdFromAppUrl) {\n logger.info(`Extracted app ID from URL path: ${appIdFromAppUrl}`);\n }\n }\n \n if (appIdFromPath) {\n logger.info(`Extracted app ID from current page path: ${appIdFromPath}`);\n }\n \n if (appUrl) {\n try {\n logger.info(`URL parameter 'app' found: ${appUrl}, attempting to load extension or app`);\n \n try {\n await extensionRegistry.loadExtensionFromUrl(appUrl);\n logger.info(`Successfully loaded extension from URL: ${appUrl}`);\n } catch (extensionError) {\n logger.info(`Failed to load as extension, trying as app definition: ${getErrorMessage(extensionError)}`);\n \n try {\n const app = await this.loadAppFromUrl(appUrl);\n this.registerApp(app);\n await this.loadApp(app.id, this.container);\n logger.info(`Successfully loaded app from URL: ${appUrl}`);\n return;\n } catch (appError) {\n logger.error(`Failed to load from URL as both extension and app: ${getErrorMessage(appError)}`);\n throw appError;\n }\n }\n } catch (error) {\n logger.error(`Failed to load from URL parameter, falling back to default app: ${getErrorMessage(error)}`);\n }\n }\n \n const appToLoad = await this.selectAppToLoad({\n appIdFromUrl,\n appIdFromPath,\n appIdFromAppUrl,\n appsBeforeExtension\n });\n \n if (!appToLoad) {\n throw new Error('No apps registered');\n }\n \n await this.loadApp(appToLoad, this.container);\n }\n\n /**\n * Load and initialize an application.\n * \n * @param appId - Application identifier (must be already registered)\n * @param container - Optional DOM element to render into (if provided, auto-renders after loading)\n * @returns Promise that resolves when app is initialized and rendered\n */\n async loadApp(appId: string, container?: HTMLElement): Promise<void> {\n const app = this.apps.get(appId);\n if (!app) {\n throw new Error(`App '${appId}' not found. Make sure it's registered.`);\n }\n \n logger.info(`Loading app: ${app.name}...`);\n \n // Dispose current app if exists\n if (this.currentApp) {\n logger.info(`Disposing current app: ${this.currentApp.name}`);\n \n // Call app's dispose method\n if (this.currentApp.dispose) {\n await this.currentApp.dispose();\n }\n \n // Disable current app's extensions (but not system-required ones)\n if (this.currentApp.extensions && this.currentApp.extensions.length > 0) {\n logger.info(`Disabling ${this.currentApp.extensions.length} extensions...`);\n this.currentApp.extensions.forEach(extId => {\n extensionRegistry.disable(extId);\n });\n }\n }\n \n // Register app contributions\n if (app.contributions) {\n logger.info('Registering app contributions...');\n \n // Register UI contributions (tabs, toolbars, commands, etc.)\n if (app.contributions.ui) {\n app.contributions.ui.forEach(contribution => {\n const target = contribution.target;\n if (target) {\n contributionRegistry.registerContribution(target, contribution);\n }\n });\n logger.info(`Registered ${app.contributions.ui.length} UI contributions`);\n }\n \n // Register app-specific extensions\n if (app.contributions.extensions) {\n app.contributions.extensions.forEach(extension => {\n extensionRegistry.registerExtension(extension);\n });\n logger.info(`Registered ${app.contributions.extensions.length} app extensions`);\n }\n }\n \n const extensionsSet = new Set<string>(app.extensions || []);\n this.systemRequiredExtensions.forEach(extId => extensionsSet.add(extId));\n app.extensions = Array.from(extensionsSet);\n \n // Enable new app's extensions (after contributions are registered)\n if (app.extensions.length > 0) {\n logger.info(`Enabling ${app.extensions.length} extensions...`);\n app.extensions.forEach(extId => {\n extensionRegistry.enable(extId);\n });\n }\n \n // Initialize new app\n if (app.initialize) {\n logger.info(`Initializing ${app.name}...`);\n await app.initialize();\n }\n \n this.currentApp = app;\n logger.info(`App ${app.name} loaded successfully`);\n \n // Update document metadata from app\n this.updateDocumentMetadata(app);\n \n // Auto-render if container provided\n if (container) {\n this.renderApp(container);\n }\n \n // Dispatch event for components to react to app changes\n window.dispatchEvent(new CustomEvent('app-loaded', { detail: { appId: app.id } }));\n }\n \n /**\n * Updates document title and favicon from app metadata\n */\n private updateDocumentMetadata(app: AppDefinition): void {\n // Set document title\n document.title = app.name;\n \n // Set favicon if provided in metadata\n if (app.metadata?.favicon) {\n const faviconPath = app.metadata.favicon;\n let link = document.querySelector(\"link[rel*='icon']\") as HTMLLinkElement;\n if (!link) {\n link = document.createElement('link');\n link.rel = 'icon';\n document.head.appendChild(link);\n }\n link.type = 'image/svg+xml';\n link.href = faviconPath;\n }\n }\n \n /**\n * Render the current application to the DOM.\n * \n * @param container - DOM element to render into\n */\n renderApp(container: HTMLElement): void {\n if (!this.currentApp) {\n throw new Error('No app loaded. Call loadApp() first.');\n }\n\n const r = this.currentApp.render;\n if (typeof r === 'string') {\n const el = document.createElement(r);\n container.innerHTML = '';\n container.appendChild(el);\n } else if (r && typeof r === 'object' && 'tag' in r) {\n const el = document.createElement(r.tag);\n for (const [key, value] of Object.entries(r.attributes ?? {})) {\n el.setAttribute(key, value);\n }\n container.innerHTML = '';\n container.appendChild(el);\n } else if (typeof r === 'function') {\n const template = r();\n render(template, container);\n } else {\n render(html`<lyra-standard-layout></lyra-standard-layout>`, container);\n }\n logger.info(`Rendered ${this.currentApp.name}`);\n }\n \n /**\n * Get the currently loaded application.\n */\n getCurrentApp(): AppDefinition | undefined {\n return this.currentApp;\n }\n \n /**\n * Get all registered applications.\n */\n getRegisteredApps(): AppDefinition[] {\n return Array.from(this.apps.values());\n }\n \n /**\n * Get the preferred app ID from settings.\n */\n async getPreferredAppId(): Promise<string | undefined> {\n try {\n return await appSettings.get(AppLoaderService.PREFERRED_APP_KEY);\n } catch (error) {\n logger.debug(`Failed to get preferred app ID from settings: ${getErrorMessage(error)}`);\n return undefined;\n }\n }\n \n /**\n * Set the preferred app ID and persist it to settings.\n */\n async setPreferredAppId(appId: string): Promise<void> {\n if (!this.apps.has(appId)) {\n throw new Error(`App '${appId}' not found. Make sure it's registered.`);\n }\n \n try {\n await appSettings.set(AppLoaderService.PREFERRED_APP_KEY, appId);\n this.defaultAppId = appId;\n logger.info(`Set preferred app to: ${appId}`);\n } catch (error) {\n logger.error(`Failed to persist preferred app ID: ${getErrorMessage(error)}`);\n throw error;\n }\n }\n \n /**\n * Select which app to load based on priority:\n * 1. appId URL parameter (?appId=...)\n * 2. App ID from current page URL path (/geospace)\n * 3. App ID extracted from app URL parameter (?app=...)\n * 4. App registered by extension\n * 5. Preferred app ID from settings\n * 6. Default app ID\n * 7. First registered app\n */\n private async selectAppToLoad(options: {\n appIdFromUrl: string | null;\n appIdFromPath: string | undefined;\n appIdFromAppUrl: string | undefined;\n appsBeforeExtension: number;\n }): Promise<string | undefined> {\n const { appIdFromUrl, appIdFromPath, appIdFromAppUrl, appsBeforeExtension } = options;\n \n if (appIdFromUrl) {\n if (this.apps.has(appIdFromUrl)) {\n logger.info(`Loading app specified by URL parameter 'appId': ${appIdFromUrl}`);\n return appIdFromUrl;\n }\n logger.warn(`App ID '${appIdFromUrl}' from URL parameter not found`);\n }\n \n if (appIdFromPath) {\n if (this.apps.has(appIdFromPath)) {\n logger.info(`Loading app from URL path: ${appIdFromPath}`);\n return appIdFromPath;\n }\n logger.debug(`App ID '${appIdFromPath}' from URL path not found, continuing search`);\n }\n \n if (appIdFromAppUrl) {\n if (this.apps.has(appIdFromAppUrl)) {\n logger.info(`Loading app using ID extracted from app URL path: ${appIdFromAppUrl}`);\n return appIdFromAppUrl;\n }\n }\n \n if (this.apps.size > appsBeforeExtension) {\n const newlyRegisteredApps = Array.from(this.apps.values()).slice(appsBeforeExtension);\n if (newlyRegisteredApps.length > 0) {\n const app = newlyRegisteredApps[0];\n logger.info(`Loading app registered by extension: ${app.name} (${app.id})`);\n return app.id;\n }\n }\n \n const preferredAppId = await this.getPreferredAppId();\n if (preferredAppId && this.apps.has(preferredAppId)) {\n logger.info(`Loading preferred app from settings: ${preferredAppId}`);\n return preferredAppId;\n }\n \n if (this.defaultAppId) {\n if (this.apps.has(this.defaultAppId)) {\n return this.defaultAppId;\n }\n logger.warn(`Default app '${this.defaultAppId}' not found`);\n }\n \n const registeredApps = this.getRegisteredApps();\n if (registeredApps.length > 0) {\n const app = registeredApps[0];\n logger.info(`Loading first registered app: ${app.name} (${app.id})`);\n return app.id;\n }\n \n return undefined;\n }\n}\n\nexport const appLoaderService = new AppLoaderService();\nrootContext.put(\"appLoaderService\", appLoaderService);\n\n","import { html, css, PropertyValues } from \"lit\";\nimport { customElement, state, property } from \"lit/decorators.js\";\nimport { LyraDialogContent } from \"../parts/dialog-content\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { DIALOG_CONTRIBUTION_TARGET, OK_BUTTON, CANCEL_BUTTON, DialogContribution, dialogService } from \"../core/dialogservice\";\n\n@customElement('lyra-prompt-dialog-content')\nexport class LyraPromptDialogContent extends LyraDialogContent {\n @property({ type: String })\n message: string = '';\n\n @property({ type: String, attribute: 'default-value' })\n defaultValue: string = '';\n\n @property({ type: Boolean })\n markdown: boolean = false;\n\n @state()\n private inputValue: string = '';\n\n static styles = [\n ...LyraDialogContent.styles,\n css`\n wa-input {\n width: 100%;\n }\n `\n ];\n\n async firstUpdated(changedProperties: PropertyValues) {\n super.firstUpdated(changedProperties);\n this.inputValue = this.defaultValue;\n\n await this.updateComplete;\n const input = this.shadowRoot?.querySelector('wa-input');\n if (input) {\n const inputEl = (input as any).shadowRoot?.querySelector('input');\n if (inputEl) {\n inputEl.focus();\n inputEl.select();\n }\n }\n }\n\n getResult(): string | null {\n return this.inputValue;\n }\n\n private handleInput(e: Event) {\n this.inputValue = (e.target as any).value;\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.dispatchEvent(new CustomEvent('dialog-ok', { bubbles: true, composed: true }));\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this.dispatchEvent(new CustomEvent('dialog-cancel', { bubbles: true, composed: true }));\n }\n }\n\n render() {\n return html`\n ${this.renderMessage(this.message, this.markdown)}\n <wa-input\n value=\"${this.inputValue}\"\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n autofocus\n ></wa-input>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-prompt-dialog-content': LyraPromptDialogContent;\n }\n}\n\ncontributionRegistry.registerContribution(DIALOG_CONTRIBUTION_TARGET, {\n id: 'prompt',\n label: 'Input',\n buttons: [OK_BUTTON, CANCEL_BUTTON],\n component: (state?: any) => {\n if (!state) {\n return html`<div>Error: No prompt dialog state</div>`;\n }\n \n return html`\n <lyra-prompt-dialog-content \n .message=\"${state.message}\"\n .defaultValue=\"${state.defaultValue}\"\n .markdown=\"${state.markdown}\"\n ></lyra-prompt-dialog-content>\n `;\n },\n onButton: async (id: string, result: any, state?: any) => {\n if (!state) {\n return true;\n }\n \n if (id === 'ok') {\n state.resolve(result || '');\n } else {\n state.resolve(null);\n }\n \n return true;\n }\n});\n\nexport async function promptDialog(message: string, defaultValue: string = '', markdown: boolean = false): Promise<string | null> {\n return new Promise((resolve) => {\n dialogService.open('prompt', {\n message,\n defaultValue,\n markdown,\n resolve\n });\n });\n}","import { html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { LyraDialogContent } from \"../parts/dialog-content\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { DIALOG_CONTRIBUTION_TARGET, OK_BUTTON, DialogContribution, dialogService } from \"../core/dialogservice\";\n\n@customElement('lyra-info-dialog-content')\nexport class LyraInfoDialogContent extends LyraDialogContent {\n @property({ type: String })\n message: string = '';\n\n @property({ type: Boolean })\n markdown: boolean = false;\n\n render() {\n return html`\n ${this.renderMessage(this.message, this.markdown)}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-info-dialog-content': LyraInfoDialogContent;\n }\n}\n\ncontributionRegistry.registerContribution(DIALOG_CONTRIBUTION_TARGET, {\n id: 'info',\n label: 'Information',\n buttons: [OK_BUTTON],\n component: (state?: any) => {\n if (!state) {\n return html`<div>Error: No info dialog state</div>`;\n }\n \n return html`\n <lyra-info-dialog-content \n .message=\"${state.message}\"\n .markdown=\"${state.markdown}\"\n ></lyra-info-dialog-content>\n `;\n },\n onButton: async (id: string, result: any, state?: any) => {\n if (!state) {\n return true;\n }\n \n if (state.resolve) {\n state.resolve();\n }\n \n return true;\n }\n});\n\nexport async function infoDialog(title: string, message: string, markdown: boolean = false): Promise<void> {\n return new Promise((resolve) => {\n dialogService.open('info', {\n title,\n message,\n markdown,\n resolve\n });\n });\n}\n\n","import { html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { LyraDialogContent } from \"../parts/dialog-content\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { DIALOG_CONTRIBUTION_TARGET, OK_BUTTON, CANCEL_BUTTON, DialogContribution, dialogService } from \"../core/dialogservice\";\n\n@customElement('lyra-confirm-dialog-content')\nexport class LyraConfirmDialogContent extends LyraDialogContent {\n @property({ type: String })\n message: string = '';\n\n @property({ type: Boolean })\n markdown: boolean = false;\n\n getResult(): boolean {\n return false;\n }\n\n render() {\n return html`\n ${this.renderMessage(this.message, this.markdown)}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-confirm-dialog-content': LyraConfirmDialogContent;\n }\n}\n\ncontributionRegistry.registerContribution(DIALOG_CONTRIBUTION_TARGET, {\n id: 'confirm',\n label: 'Confirm',\n buttons: [OK_BUTTON, CANCEL_BUTTON],\n component: (state?: any) => {\n if (!state) {\n return html`<div>Error: No confirm dialog state</div>`;\n }\n \n return html`\n <lyra-confirm-dialog-content \n .message=\"${state.message}\"\n .markdown=\"${state.markdown}\"\n ></lyra-confirm-dialog-content>\n `;\n },\n onButton: async (id: string, result: any, state?: any) => {\n if (!state) {\n return true;\n }\n \n if (id === 'ok') {\n state.resolve(true);\n } else {\n state.resolve(false);\n }\n \n return true;\n }\n});\n\nexport async function confirmDialog(message: string, markdown: boolean = false): Promise<boolean> {\n return new Promise((resolve) => {\n dialogService.open('confirm', {\n message,\n markdown,\n resolve\n });\n });\n}\n\n","import { html, css, PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { LyraDialogContent } from \"../parts/dialog-content\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { DIALOG_CONTRIBUTION_TARGET, CLOSE_BUTTON, DialogContribution, dialogService } from \"../core/dialogservice\";\n\nexport interface NavigableDialogAction {\n label: string;\n variant?: 'default' | 'primary' | 'success' | 'neutral' | 'warning' | 'danger';\n disabled?: boolean;\n callback: () => void;\n}\n\n@customElement('lyra-navigable-info-dialog-content')\nexport class LyraNavigableInfoDialogContent extends LyraDialogContent {\n @property({ type: String })\n title: string = '';\n\n @property({ type: String })\n message: string = '';\n\n @property({ type: Boolean })\n markdown: boolean = false;\n\n @state()\n actions: NavigableDialogAction[] = [];\n\n @state()\n private currentTitle: string = '';\n\n @state()\n private currentMessage: string = '';\n\n resolveCallback?: () => void;\n private dialogElement: HTMLElement | null = null;\n\n async firstUpdated(changedProperties: PropertyValues) {\n super.firstUpdated(changedProperties);\n this.currentTitle = this.title;\n this.currentMessage = this.message;\n \n await this.updateComplete;\n const dialog = this.closest('wa-dialog');\n if (dialog) {\n this.dialogElement = dialog as HTMLElement;\n this.updateDialogLabel();\n }\n \n const contentContainer = this.closest('.dialog-service-content');\n if (contentContainer) {\n const footer = contentContainer.parentElement?.querySelector('.dialog-service-footer');\n if (footer) {\n (footer as HTMLElement).style.display = 'none';\n }\n }\n }\n\n updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n if (changedProperties.has('title')) {\n this.currentTitle = this.title;\n this.updateDialogLabel();\n }\n if (changedProperties.has('message')) {\n this.currentMessage = this.message;\n }\n }\n\n private updateDialogLabel() {\n if (this.dialogElement) {\n this.dialogElement.setAttribute('label', this.currentTitle);\n }\n }\n\n updateDialog(newTitle: string, newMessage: string, newActions: NavigableDialogAction[]) {\n this.currentTitle = newTitle;\n this.currentMessage = newMessage;\n this.actions = [...newActions];\n this.updateDialogLabel();\n this.requestUpdate();\n }\n\n private handleActionClick(action: NavigableDialogAction) {\n action.callback();\n }\n\n private handleClose() {\n const dialog = this.closest('wa-dialog');\n if (dialog && this.resolveCallback) {\n this.resolveCallback();\n }\n }\n\n static styles = [\n ...LyraDialogContent.styles,\n css`\n :host {\n display: block;\n }\n\n :host-context(.dialog-service-content) {\n padding: 0;\n }\n \n .dialog-content {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n min-width: 400px;\n max-width: 600px;\n height: 500px;\n padding: 1rem;\n }\n \n .dialog-scroller {\n flex: 1;\n overflow-y: auto;\n }\n \n .dialog-actions {\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n margin-top: 0.5rem;\n }\n \n .dialog-actions-left,\n .dialog-actions-right {\n display: flex;\n gap: 0.5rem;\n }\n `\n ];\n\n render() {\n const leftActions = this.actions.filter(a => a.label !== 'Close');\n const rightActions = this.actions.filter(a => a.label === 'Close');\n\n return html`\n <div class=\"dialog-content\">\n <wa-scroller class=\"dialog-scroller\">\n ${this.renderMessage(this.currentMessage, this.markdown)}\n </wa-scroller>\n \n <div class=\"dialog-actions\">\n <div class=\"dialog-actions-left\">\n ${leftActions.map(action => html`\n <wa-button \n variant=\"${action.variant || 'default'}\"\n ?disabled=${action.disabled}\n @click=${() => this.handleActionClick(action)}\n >\n ${action.label}\n </wa-button>\n `)}\n </div>\n <div class=\"dialog-actions-right\">\n ${rightActions.map(action => html`\n <wa-button \n variant=\"${action.variant || 'primary'}\"\n @click=${() => {\n this.handleActionClick(action);\n this.handleClose();\n }}\n >\n ${action.label}\n </wa-button>\n `)}\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-navigable-info-dialog-content': LyraNavigableInfoDialogContent;\n }\n}\n\ncontributionRegistry.registerContribution(DIALOG_CONTRIBUTION_TARGET, {\n id: 'navigable-info',\n label: 'Information',\n buttons: [CLOSE_BUTTON],\n component: (state?: any) => {\n if (!state) {\n return html`<div>Error: No navigable info dialog state</div>`;\n }\n \n const componentHtml = html`\n <lyra-navigable-info-dialog-content \n .title=\"${state.title}\"\n .message=\"${state.message}\"\n .markdown=\"${state.markdown}\"\n ></lyra-navigable-info-dialog-content>\n `;\n \n (async () => {\n const element = document.querySelector('lyra-navigable-info-dialog-content') as LyraNavigableInfoDialogContent;\n if (element) {\n await element.updateComplete;\n element.actions = state.actions || [];\n element.resolveCallback = state.resolve;\n if (state.updateDialogRef) {\n state.updateDialogRef.current = (newTitle: string, newMessage: string, newActions: NavigableDialogAction[]) => {\n element.updateDialog(newTitle, newMessage, newActions);\n };\n }\n }\n })();\n \n return componentHtml;\n },\n onButton: async (id: string, result: any, state?: any) => {\n if (!state) {\n return false;\n }\n \n if (id === 'close' && state.resolve) {\n state.resolve();\n return true;\n }\n \n return false;\n }\n});\n\nexport async function navigableInfoDialog(\n title: string,\n message: string,\n actions: NavigableDialogAction[],\n markdown: boolean = false\n): Promise<void> {\n return new Promise((resolve) => {\n const updateDialogRef: { current?: (title: string, message: string, actions: NavigableDialogAction[]) => void } = {};\n \n dialogService.open('navigable-info', {\n title,\n message,\n actions,\n markdown,\n resolve,\n updateDialogRef\n });\n\n const updateDialog = (newTitle: string, newMessage: string, newActions: NavigableDialogAction[]) => {\n if (updateDialogRef.current) {\n updateDialogRef.current(newTitle, newMessage, newActions);\n }\n };\n\n (actions as any).updateDialog = updateDialog;\n });\n}\n\n","import {css, html} from 'lit'\nimport {customElement, property, state} from 'lit/decorators.js'\nimport {LyraElement} from \"./element\";\nimport {styleMap} from 'lit/directives/style-map.js';\nimport {\n CommandContribution,\n Contribution,\n ContributionChangeEvent,\n contributionRegistry,\n HTMLContribution,\n TOPIC_CONTRIBUTEIONS_CHANGED\n} from \"../core/contributionregistry\";\nimport {Signal} from '@lit-labs/signals';\nimport {unsafeHTML} from \"lit/directives/unsafe-html.js\";\nimport {subscribe} from \"../core/events\";\n\nconst RESIZE_DEBOUNCE_MS = 150;\n\ntype ToolbarSlotName = 'start' | undefined | 'end';\n\nfunction renderButtonGroup(\n slotName: ToolbarSlotName,\n orientation: 'horizontal' | 'vertical',\n contributions: Contribution[],\n isToolbarItem: (c: Contribution) => boolean,\n contributionCreator: (c: Contribution) => unknown\n) {\n const slot = slotName ?? 'default';\n const label = `Toolbar ${slot}`;\n const items = contributions.filter(c => c.slot === slotName && isToolbarItem(c));\n const slotHtml = slotName === 'start'\n ? html`<slot name=\"start\"></slot>`\n : slotName === 'end'\n ? html`<slot name=\"end\"></slot>`\n : html`<slot></slot>`;\n return html`\n <wa-button-group orientation=${orientation} label=${label}>\n ${slotHtml}\n ${items.map(contributionCreator)}\n </wa-button-group>\n `;\n}\n\n@customElement('lyra-toolbar')\nexport class LyraToolbar extends LyraElement {\n @property()\n private position: \"start\" | \"center\" | \"end\" = \"start\";\n\n @property({reflect: true})\n orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\n\n @property({reflect: true})\n align: \"start\" | \"center\" | \"end\" = \"start\";\n\n @property({reflect: true})\n size: \"small\" | \"medium\" | \"large\" = \"small\";\n\n @property({type: Boolean, attribute: 'is-editor'})\n private isEditor: boolean = false;\n\n @property({attribute: false})\n public partToolbarContent?: any = undefined;\n\n @property({attribute: false})\n public partToolbarRenderer?: () => any = undefined;\n\n @state()\n private contributions: Contribution[] = [];\n\n @state()\n private compact = false;\n\n private resizeObserver: ResizeObserver | null = null;\n private resizeDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n private overflowCheckScheduled = false;\n\n private updateCompactFromSpace() {\n const toolbarItems = this.shadowRoot?.querySelector('.toolbar-items') as HTMLElement | null;\n if (!toolbarItems) return;\n const trimmed = toolbarItems.scrollWidth > toolbarItems.clientWidth;\n if (this.compact !== trimmed) {\n this.compact = trimmed;\n this.requestUpdate();\n }\n }\n\n private scheduleOverflowCheck() {\n if (this.overflowCheckScheduled) return;\n this.overflowCheckScheduled = true;\n requestAnimationFrame(() => {\n this.overflowCheckScheduled = false;\n this.updateCompactFromSpace();\n });\n }\n\n private onResize = () => {\n if (this.resizeDebounceTimer !== null) clearTimeout(this.resizeDebounceTimer);\n this.resizeDebounceTimer = setTimeout(() => {\n this.resizeDebounceTimer = null;\n this.updateCompactFromSpace();\n }, RESIZE_DEBOUNCE_MS);\n };\n\n connectedCallback() {\n super.connectedCallback();\n this.resizeObserver = new ResizeObserver(this.onResize);\n this.resizeObserver.observe(this);\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n if (this.resizeDebounceTimer !== null) {\n clearTimeout(this.resizeDebounceTimer);\n this.resizeDebounceTimer = null;\n }\n super.disconnectedCallback();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n super.updated?.(changedProperties);\n if (!this.compact) this.scheduleOverflowCheck();\n }\n\n protected doBeforeUI() {\n const id = this.getAttribute(\"id\");\n if (id) {\n this.loadContributions(id);\n }\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (!id) return;\n \n const shouldReload = this.matchesTarget(id, event.target);\n if (shouldReload) {\n this.loadContributions(id);\n this.requestUpdate()\n }\n })\n }\n\n\n private matchesTarget(id: string, target: string): boolean {\n if (target === id) return true;\n \n if (!id.includes(':')) return false;\n \n const [prefix] = id.split(':');\n if (target === `${prefix}:*`) return true;\n \n const targetParts = target.split(':');\n if (targetParts.length === 2) {\n const categoryToken = targetParts[1];\n if (categoryToken === 'system.editors' || categoryToken === '.system.editors') {\n return this.isEditor && id.startsWith(`${prefix}:`);\n }\n }\n \n return false;\n }\n\n private loadContributions(id: string) {\n const specific = contributionRegistry.getContributions(id);\n \n if (!id.includes(':')) {\n this.contributions = specific;\n return;\n }\n \n const [prefix] = id.split(':');\n const wildcardId = `${prefix}:*`;\n const wildcard = contributionRegistry.getContributions(wildcardId);\n \n const categoryMatches: Contribution[] = [];\n \n if (this.isEditor) {\n const allCategories = ['system.editors', '.system.editors'];\n for (const category of allCategories) {\n const categoryId = `${prefix}:${category}`;\n const matches = contributionRegistry.getContributions(categoryId);\n categoryMatches.push(...matches);\n }\n }\n \n this.contributions = [...wildcard, ...categoryMatches, ...specific];\n }\n\n private isToolbarItem(contribution: Contribution): boolean {\n return \"command\" in contribution || \"html\" in contribution;\n }\n\n contributionCreator(contribution: Contribution) {\n if (\"command\" in contribution) {\n const commandContribution = contribution as CommandContribution;\n const showLabel = !this.compact && !!commandContribution.showLabel;\n return html`\n <wa-button @click=${() => this.executeCommand(commandContribution.command, commandContribution.params || {})}\n title=${commandContribution.label}\n ?disabled=\"${(commandContribution.disabled as Signal.Computed<boolean>)?.get()}\"\n appearance=\"plain\" size=${this.size}>\n <wa-icon name=${commandContribution.icon} label=\"${commandContribution.label}\"></wa-icon>\n ${showLabel ? commandContribution.label : ''}\n </wa-button>\n `;\n }\n if (\"html\" in contribution) {\n const contents = (contribution as HTMLContribution).html\n if (contents instanceof Function) {\n return contents()\n }\n return unsafeHTML(contents)\n }\n return html`<span>unknown contribution type: ${typeof contribution}</span>`\n }\n\n render() {\n const partContent = this.partToolbarRenderer ? this.partToolbarRenderer() :\n (this.partToolbarContent ? this.partToolbarContent : '');\n const flexDir = this.orientation === \"vertical\" ? \"column\" : \"row\";\n const alignMap = { start: \"flex-start\", center: \"center\", end: \"flex-end\" } as const;\n const bindCreator = this.contributionCreator.bind(this);\n const bindIsItem = this.isToolbarItem.bind(this);\n return html`\n <div class=\"toolbar-items\" style=${styleMap({\n \"flex-direction\": flexDir,\n \"align-items\": alignMap[this.align],\n \"justify-content\": this.position\n })}>\n ${renderButtonGroup('start', this.orientation, this.contributions, bindIsItem, bindCreator)}\n ${partContent}\n ${renderButtonGroup(undefined, this.orientation, this.contributions, bindIsItem, bindCreator)}\n ${renderButtonGroup('end', this.orientation, this.contributions, bindIsItem, bindCreator)}\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: row;\n --wa-form-control-padding-inline: var(--wa-space-2xs);\n }\n\n :host([orientation=\"vertical\"]) {\n flex-direction: column;\n }\n\n .toolbar-items {\n display: flex;\n flex: 1;\n gap: var(--wa-space-2xs);\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-toolbar': LyraToolbar\n }\n}\n","import { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { LyraWidget } from '../widgets/widget'\nimport '../widgets/icon'\nimport { keyBindingManager } from '../core/keybindings'\nimport { contributionRegistry, Contribution, CommandContribution, HTMLContribution, ContributionChangeEvent, TOPIC_CONTRIBUTEIONS_CHANGED } from '../core/contributionregistry'\nimport { subscribe } from '../core/events'\nimport { Signal } from '@lit-labs/signals'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\n\n@customElement('lyra-command')\nexport class LyraCommand extends LyraWidget {\n @property()\n cmd: string = ''\n\n @property({ type: Object, attribute: false })\n action?: (event?: Event) => void\n\n @property()\n title: string = ''\n\n @property()\n label?: boolean = false\n\n @property()\n icon?: string\n\n @property({ type: Boolean })\n disabled: boolean = false\n\n @property()\n appearance: 'default' | 'plain' | 'outline' | 'accent' | 'filled-outlined' | 'filled' | 'outlined' = 'plain'\n\n @property()\n variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'\n\n @property()\n size: 'small' | 'medium' | 'large' = 'small'\n\n @property({ type: Object, attribute: false })\n params: Record<string, any> = {}\n\n @property()\n dropdown?: string\n\n @property()\n placement: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end' = 'bottom-start'\n\n @state()\n private dropdownContributions: Contribution[] = []\n\n private handleClick(event?: Event) {\n if (this.disabled) return\n\n if (event) {\n event.stopPropagation()\n }\n\n if (this.action) {\n this.action(event)\n return\n }\n\n if (this.cmd) {\n const dropdown = this.closest('wa-dropdown') as any;\n if (dropdown && dropdown.open !== undefined) {\n dropdown.open = false;\n }\n this.executeCommand(this.cmd, this.params);\n }\n }\n\n private handleSelect(event: CustomEvent) {\n // Close dropdown immediately when any item is selected\n // This ensures the dropdown is hidden before the command executes\n const dropdown = event.target as any;\n if (dropdown && dropdown.open !== undefined) {\n dropdown.open = false;\n }\n }\n\n private isInDropdown(): boolean {\n return !!this.closest('wa-dropdown, wa-dropdown-menu')\n }\n\n private getKeybinding(): string | null {\n if (!this.cmd || this.action) return null\n const keybindings = keyBindingManager.getKeyBindingsForCommand(this.cmd)\n return keybindings.length > 0 ? keybindings[0] : null\n }\n\n protected doBeforeUI() {\n if (this.dropdown) {\n this.loadDropdownContributions()\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (this.dropdown && event.target === this.dropdown) {\n this.dropdownContributions = event.contributions;\n this.requestUpdate();\n }\n })\n }\n }\n\n private loadDropdownContributions() {\n if (!this.dropdown) return\n this.dropdownContributions = contributionRegistry.getContributions(this.dropdown)\n this.requestUpdate()\n }\n\n private renderContribution(contribution: Contribution) {\n if ('command' in contribution) {\n const commandContribution = contribution as CommandContribution\n const disabled = (commandContribution.disabled as Signal.Computed<boolean>)?.get()\n return html`\n <lyra-command \n cmd=\"${commandContribution.command}\"\n icon=\"${commandContribution.icon || ''}\"\n .params=${commandContribution.params || {}}\n ?disabled=\"${disabled}\">\n ${commandContribution.label}\n </lyra-command>\n `\n }\n \n if ('html' in contribution) {\n const htmlContribution = contribution as HTMLContribution\n const contents = htmlContribution.html\n if (contents instanceof Function) {\n return contents()\n }\n return unsafeHTML(contents)\n }\n \n return nothing\n }\n\n render() {\n const keybinding = this.getKeybinding()\n\n if (this.isInDropdown()) {\n return html`\n <wa-dropdown-item \n ?disabled=${this.disabled}\n @click=${(e: Event) => this.handleClick(e)}>\n <lyra-icon name=\"${this.icon}\" label=\"${this.title}\" slot=\"icon\"></lyra-icon>\n <slot></slot>\n ${keybinding ? html`<span class=\"keybinding\">${keybinding}</span>` : ''}\n </wa-dropdown-item>\n `\n }\n\n if (this.dropdown) {\n return html`\n <wa-dropdown \n placement=${this.placement}\n @wa-select=${(e: CustomEvent) => this.handleSelect(e)}>\n <wa-button \n slot=\"trigger\"\n appearance=${this.appearance}\n variant=${this.variant}\n size=${this.size}\n ?disabled=${this.disabled}\n with-caret\n title=${keybinding ? `${this.title} (${keybinding})` : this.title}>\n <lyra-icon slot=\"start\" name=\"${this.icon}\" label=\"${this.title}\"></lyra-icon>\n <slot></slot>\n ${this.label ? this.title : nothing}\n </wa-button>\n \n ${this.title ? html`\n <h6 style=\"padding: var(--wa-space-xs) var(--wa-space-s); margin: 0; color: var(--wa-color-neutral-50); font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em;\">\n ${this.title}\n </h6>\n ` : nothing}\n \n ${this.dropdownContributions.map(c => this.renderContribution(c))}\n \n ${this.cmd ? html`\n <wa-divider></wa-divider>\n <lyra-command \n cmd=\"${this.cmd}\"\n icon=\"${this.icon || ''}\"\n .params=${this.params}\n ?disabled=${this.disabled}>\n <slot></slot>\n ${this.title}\n </lyra-command>\n ` : nothing}\n </wa-dropdown>\n `\n }\n\n return html`\n <wa-button\n appearance=${this.appearance}\n variant=${this.variant}\n size=${this.size}\n ?disabled=${this.disabled}\n title=${keybinding ? `${this.title} (${keybinding})` : this.title}\n @click=${(e: Event) => this.handleClick(e)}>\n <lyra-icon slot=\"start\" name=\"${this.icon}\" label=\"${this.title}\"></lyra-icon>\n <slot></slot>\n </wa-button>\n `\n }\n\n static styles = css`\n :host {\n display: inline-block;\n }\n\n .keybinding {\n margin-left: auto;\n padding: 2px 6px;\n background: var(--wa-color-neutral-15);\n border: 1px solid var(--wa-color-neutral-25);\n border-radius: 3px;\n font-size: 10px;\n font-family: monospace;\n opacity: 0.7;\n }\n\n :host-context(.wa-light) .keybinding {\n background: var(--wa-color-neutral-85);\n border: 1px solid var(--wa-color-neutral-75);\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-command': LyraCommand\n }\n}\n\n","import {css, html, nothing} from 'lit'\nimport {customElement, property, state} from 'lit/decorators.js'\nimport {LyraElement} from \"./element\";\nimport {\n CommandContribution,\n Contribution,\n ContributionChangeEvent,\n contributionRegistry,\n HTMLContribution,\n TOPIC_CONTRIBUTEIONS_CHANGED\n} from \"../core/contributionregistry\";\nimport {Signal} from '@lit-labs/signals';\nimport {unsafeHTML} from \"lit/directives/unsafe-html.js\";\nimport {subscribe} from \"../core/events\";\nimport {createRef, ref} from \"lit/directives/ref.js\";\nimport '../components/command';\n\n@customElement('lyra-contextmenu')\nexport class LyraContextMenu extends LyraElement {\n @property({type: Boolean, attribute: 'is-editor'})\n private isEditor: boolean = false;\n\n @property({attribute: false})\n public partContextMenuRenderer?: () => any = undefined;\n\n @state()\n private contributions: Contribution[] = [];\n\n @state()\n private isOpen: boolean = false;\n\n @state()\n private position: { x: number, y: number } = { x: 0, y: 0 };\n\n private anchorRef = createRef<HTMLElement>();\n private dropdownRef = createRef<HTMLElement>();\n\n private boundHandleDocumentPointerDown = this.handleDocumentPointerDown.bind(this);\n\n /**\n * \"Click outside to close\" runs in capture phase before the target's click.\n * We use composedPath() so hits inside the menu still count as inside:\n * - Clicks on items (e.g. command / wa-dropdown-item) or their icon/label\n * are inside shadow roots; contains(target) can miss those.\n * - composedPath() is the path from target to root crossing shadow boundaries,\n * so if the dropdown is in the path, the click was inside the menu and we\n * do not close (so the item's click can run). We only close when the click\n * is truly outside (dropdown not in path). Submenus: same idea, skip close\n * when any node in the path has part=\"submenu\".\n */\n private handleDocumentPointerDown(e: PointerEvent) {\n if (!this.isOpen) return;\n const path = e.composedPath() as Element[];\n if (\n this.dropdownRef.value &&\n path.includes(this.dropdownRef.value)\n ) return;\n if (path.some((el) => el.getAttribute?.('part') === 'submenu')) return;\n this.onClose();\n }\n\n protected doBeforeUI() {\n const id = this.getAttribute(\"id\");\n if (id) {\n this.loadContributions(id);\n }\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (!id) return;\n \n const shouldReload = this.matchesTarget(id, event.target);\n if (shouldReload) {\n this.loadContributions(id);\n this.requestUpdate();\n }\n });\n }\n\n\n private matchesTarget(id: string, target: string): boolean {\n if (target === id) return true;\n \n if (!id.includes(':')) return false;\n \n const [prefix] = id.split(':');\n if (target === `${prefix}:*`) return true;\n \n const targetParts = target.split(':');\n if (targetParts.length === 2) {\n const categoryToken = targetParts[1];\n if (categoryToken === 'system.editors' || categoryToken === '.system.editors') {\n return this.isEditor && id.startsWith(`${prefix}:`);\n }\n }\n \n return false;\n }\n\n private loadContributions(id: string) {\n const specific = contributionRegistry.getContributions(id);\n \n if (!id.includes(':')) {\n this.contributions = specific;\n return;\n }\n \n const [prefix] = id.split(':');\n const wildcardId = `${prefix}:*`;\n const wildcard = contributionRegistry.getContributions(wildcardId);\n \n const categoryMatches: Contribution[] = [];\n \n if (this.isEditor) {\n const allCategories = ['system.editors', '.system.editors'];\n for (const category of allCategories) {\n const categoryId = `${prefix}:${category}`;\n const matches = contributionRegistry.getContributions(categoryId);\n categoryMatches.push(...matches);\n }\n }\n \n this.contributions = [...wildcard, ...categoryMatches, ...specific];\n }\n\n /**\n * Gets the element at the given point, traversing shadow DOM boundaries recursively.\n * This is necessary because elementFromPoint() doesn't penetrate shadow roots.\n */\n private getElementFromPoint(x: number, y: number): Element | null {\n let element: Element | null = document.elementFromPoint(x, y);\n if (!element) return null;\n\n // Recursively traverse shadow DOM boundaries\n while (element) {\n const shadowRoot = (element as any).shadowRoot as ShadowRoot | undefined;\n if (shadowRoot) {\n const shadowElement: Element | null = shadowRoot.elementFromPoint(x, y);\n if (shadowElement && shadowElement !== element) {\n element = shadowElement;\n continue;\n }\n }\n break;\n }\n\n return element;\n }\n\n /**\n * Triggers a click on the element under the cursor to update selection before showing context menu.\n */\n private triggerClickUnderCursor(mouseEvent: MouseEvent): void {\n const elementUnderCursor = this.getElementFromPoint(mouseEvent.clientX, mouseEvent.clientY);\n if (elementUnderCursor) {\n const clickEvent = new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window,\n clientX: mouseEvent.clientX,\n clientY: mouseEvent.clientY,\n screenX: mouseEvent.screenX,\n screenY: mouseEvent.screenY,\n button: 0,\n buttons: 0,\n detail: 1,\n which: 1\n });\n elementUnderCursor.dispatchEvent(clickEvent);\n }\n }\n\n public show(position: { x: number, y: number }, mouseEvent?: MouseEvent) {\n if (mouseEvent) {\n this.triggerClickUnderCursor(mouseEvent);\n }\n this.position = position;\n this.isOpen = true;\n this.updateComplete.then(() => {\n document.addEventListener('pointerdown', this.boundHandleDocumentPointerDown, { capture: true });\n });\n }\n\n private onClose() {\n this.isOpen = false;\n document.removeEventListener('pointerdown', this.boundHandleDocumentPointerDown, { capture: true });\n }\n\n private renderContribution(contribution: Contribution) {\n if (\"command\" in contribution) {\n const commandContribution = contribution as CommandContribution;\n const disabled = (commandContribution.disabled as Signal.Computed<boolean>)?.get();\n return html`\n <lyra-command\n cmd=\"${commandContribution.command}\"\n icon=\"${commandContribution.icon ?? ''}\"\n .params=${commandContribution.params ?? {}}\n ?disabled=\"${disabled}\">\n ${commandContribution.label}\n </lyra-command>\n `;\n } else if (\"html\" in contribution) {\n const contents = (contribution as HTMLContribution).html;\n if (contents instanceof Function) {\n return contents();\n }\n return unsafeHTML(contents);\n }\n return nothing;\n }\n\n render() {\n if (!this.isOpen) return nothing;\n\n const partContent = this.partContextMenuRenderer ? this.partContextMenuRenderer() : nothing;\n\n return html`\n <wa-dropdown\n ${ref(this.dropdownRef)}\n ?open=${this.isOpen}\n @wa-after-hide=${this.onClose}>\n \n <div \n slot=\"trigger\"\n ${ref(this.anchorRef)}\n style=\"position: fixed; \n left: ${this.position.x}px; \n top: ${this.position.y}px; \n width: 1px; \n height: 1px; \n pointer-events: none;\">\n </div>\n \n ${partContent}\n ${this.contributions.map(c => this.renderContribution(c))}\n </wa-dropdown>\n `;\n }\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n z-index: 10000;\n }\n\n wa-dropdown {\n pointer-events: auto;\n min-width: 200px;\n }\n \n wa-dropdown::part(menu) {\n min-width: 200px;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-contextmenu': LyraContextMenu\n }\n}\n\n","import {customElement, property, state} from \"lit/decorators.js\";\nimport {css, html, nothing} from \"lit\";\nimport {LyraContainer} from \"./container\";\nimport {contributionRegistry, ContributionChangeEvent, TabContribution, TOPIC_CONTRIBUTEIONS_CHANGED} from \"../core/contributionregistry\";\nimport {when} from \"lit/directives/when.js\";\nimport {repeat} from \"lit/directives/repeat.js\";\nimport '../widgets/icon';\nimport {createRef, ref} from \"lit/directives/ref.js\";\nimport {subscribe} from \"../core/events\";\nimport { LyraPart } from \"./part\";\nimport { LyraToolbar } from \"./toolbar\";\nimport {LyraContextMenu} from \"./contextmenu\";\nimport {MouseButton, EDITOR_AREA_MAIN} from \"../core/constants\";\nimport {activePartSignal} from \"../core/appstate\";\nimport {confirmDialog} from \"../dialogs\";\nimport {appLoaderService} from \"../core/apploader\";\n\n/**\n * LyraTabs - A dynamic tab container component\n * \n * Architecture:\n * - Fixed layout (VS Code style) - each tab is registered to a specific container\n * - Tabs are created/destroyed as needed (no instance reuse)\n * - Support for both static (views) and dynamic (editors) tabs\n * \n * Lifecycle:\n * 1. doInitUI(): Load contributions, activate first tab\n * 2. render(): Create tab UI from contributions\n * 3. open/closeTab(): Dynamic tab operations\n */\n@customElement('lyra-tabs')\nexport class LyraTabs extends LyraContainer {\n @property({reflect: true})\n placement: \"top\" | \"bottom\" | \"start\" | \"end\" = \"top\";\n\n /** Tab contributions for this container */\n @state()\n private contributions: TabContribution[] = [];\n\n /** Reference to the underlying wa-tab-group element */\n private tabGroup = createRef()\n\n /** Cached container ID (this element's 'id' attribute) */\n private containerId: string | null = null;\n\n /** Map to track ResizeObservers for cleanup */\n private resizeObservers = new WeakMap<HTMLElement, ResizeObserver>();\n\n // ============= Lifecycle Methods =============\n\n protected doBeforeUI() {\n this.containerId = this.getAttribute(\"id\");\n if (!this.containerId) {\n throw new Error(\"lyra-tabs requires an 'id' attribute to function\");\n }\n this.loadAndResolveContributions();\n }\n\n protected doInitUI() {\n this.updateComplete.then(() => {\n this.activateNextAvailableTab();\n \n if (!this.tabGroup.value) return;\n \n // @ts-ignore\n this.tabGroup.value.addEventListener(\"wa-tab-show\", (event: CustomEvent) => {\n const tabPanel = this.getTabPanel(event.detail.name);\n if (tabPanel) {\n // Update toolbar from component's renderToolbar() method\n this.updateToolbarFromComponent(tabPanel);\n // Update toolbar height variable for calc() positioning\n requestAnimationFrame(() => {\n this.updateToolbarHeightVariable(tabPanel);\n this.setupToolbarResizeObserver(tabPanel);\n });\n this.dispatchEvent(new CustomEvent('tab-shown', {detail: tabPanel}));\n }\n });\n\n // Listen for toolbar update requests from components\n this.tabGroup.value.addEventListener(\"part-toolbar-changed\", (event: Event) => {\n const component = event.target as HTMLElement;\n const tabPanel = component.closest('wa-tab-panel') as HTMLElement | null;\n if (tabPanel) {\n this.updateToolbarFromComponent(tabPanel);\n // Update toolbar height variable for calc() positioning\n requestAnimationFrame(() => this.updateToolbarHeightVariable(tabPanel));\n }\n });\n\n // Listen for context menu update requests from components\n this.tabGroup.value.addEventListener(\"part-contextmenu-changed\", (event: Event) => {\n const component = event.target as HTMLElement;\n const tabPanel = component.closest('wa-tab-panel') as HTMLElement | null;\n if (tabPanel) {\n this.updateContextMenuFromComponent(tabPanel);\n }\n });\n\n // Update active part signal when clicking anywhere in tab content or tab title\n this.tabGroup.value.addEventListener('click', (event: Event) => {\n const target = event.target as HTMLElement;\n \n // Handle clicks on tab titles\n const tab = target.closest('wa-tab');\n if (tab) {\n const panelName = tab.getAttribute('panel');\n if (panelName) {\n const tabPanel = this.getTabPanel(panelName);\n if (tabPanel) {\n const contentDiv = tabPanel.querySelector('.tab-content');\n if (contentDiv && contentDiv.firstElementChild) {\n const part = contentDiv.firstElementChild;\n if (part instanceof LyraPart) {\n activePartSignal.set(part);\n }\n }\n }\n }\n return;\n }\n \n // Handle clicks on tab content\n const scroller = target.closest('wa-scroller.tab-content');\n if (!scroller) return;\n \n const tabPanel = scroller.closest('wa-tab-panel') as HTMLElement;\n if (!tabPanel) return;\n \n const contentDiv = tabPanel.querySelector('.tab-content');\n if (contentDiv && contentDiv.firstElementChild) {\n const part = contentDiv.firstElementChild;\n if (part instanceof LyraPart) {\n activePartSignal.set(part);\n }\n }\n });\n\n // Automatically wire up context menus for all tab content\n this.tabGroup.value.addEventListener('contextmenu', (event: Event) => {\n const mouseEvent = event as MouseEvent;\n const scroller = (mouseEvent.target as HTMLElement).closest('wa-scroller.tab-content');\n if (!scroller) return;\n \n mouseEvent.preventDefault();\n \n const tabPanel = scroller.closest('wa-tab-panel') as HTMLElement;\n if (!tabPanel) return;\n \n // Wait for selection to update before showing context menu\n requestAnimationFrame(() => {\n this.updateContextMenuFromComponent(tabPanel);\n \n const contextMenu = tabPanel.querySelector('lyra-contextmenu') as LyraContextMenu;\n if (contextMenu) {\n contextMenu.show({ x: mouseEvent.clientX, y: mouseEvent.clientY }, mouseEvent);\n }\n });\n });\n });\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (!this.containerId || event.target !== this.containerId) return;\n \n this.loadAndResolveContributions();\n this.requestUpdate();\n \n this.updateComplete.then(() => {\n this.activateNextAvailableTab();\n });\n });\n }\n\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n \n if (changedProperties.has('contributions')) {\n const isEditorArea = this.containerId === EDITOR_AREA_MAIN;\n this.contributions.forEach(contribution => {\n const tabPanel = this.getTabPanel(contribution.name);\n if (!tabPanel) return;\n \n const contentDiv = tabPanel.querySelector('.tab-content');\n if (contentDiv && contentDiv.firstElementChild) {\n const part = contentDiv.firstElementChild;\n if (part instanceof LyraPart) {\n part.tabContribution = contribution;\n part.isEditor = isEditorArea;\n }\n }\n \n requestAnimationFrame(() => this.updateToolbarHeightVariable(tabPanel));\n });\n }\n }\n\n // ============= Public API Methods =============\n \n has(key: string): boolean {\n if (!this.tabGroup.value) return false;\n return !!this.getTabPanel(key);\n }\n\n activate(key: string): void {\n if (!this.tabGroup.value) return;\n this.tabGroup.value.setAttribute(\"active\", key);\n }\n\n public getActiveEditor(): string | null {\n if (!this.tabGroup.value) return null;\n return this.tabGroup.value.getAttribute(\"active\");\n }\n\n open(contribution: TabContribution): void {\n // Check if contribution already exists, if so just activate it\n const existing = this.contributions.find(c => c.name === contribution.name);\n if (existing) {\n this.activate(contribution.name);\n return;\n }\n \n this.contributions.push(contribution);\n this.requestUpdate();\n \n this.updateComplete.then(() => {\n this.activate(contribution.name);\n // Update toolbar after component is rendered\n const tabPanel = this.getTabPanel(contribution.name);\n if (tabPanel) {\n const contentDiv = tabPanel.querySelector('.tab-content');\n if (contentDiv && contentDiv.firstElementChild) {\n const part = contentDiv.firstElementChild;\n if (part instanceof LyraPart) {\n part.tabContribution = contribution;\n part.isEditor = this.containerId === EDITOR_AREA_MAIN;\n }\n }\n \n // Give component time to initialize\n requestAnimationFrame(() => {\n this.updateToolbarFromComponent(tabPanel);\n this.updateToolbarHeightVariable(tabPanel);\n this.setupToolbarResizeObserver(tabPanel);\n });\n }\n });\n }\n\n handleTabAuxClick(event: MouseEvent, contribution: TabContribution): void {\n if (event.button === MouseButton.MIDDLE && contribution.closable) {\n this.closeTab(event, contribution.name);\n }\n }\n\n async closeTab(event: Event, tabName: string): Promise<void> {\n event.stopPropagation();\n \n if (this.isDirty(tabName) && !await confirmDialog(\"Unsaved changes will be lost: Do you really want to close?\")) {\n return;\n }\n \n const tabPanel = this.getTabPanel(tabName);\n if (!tabPanel) return;\n \n const contribution = this.contributions.find(c => c.name === tabName);\n if (!contribution) return;\n \n this.cleanupTabInstance(tabPanel);\n \n const index = this.contributions.indexOf(contribution);\n if (index > -1) {\n this.contributions.splice(index, 1);\n }\n \n this.dispatchEvent(new CustomEvent('tab-closed', {detail: tabPanel}));\n \n this.requestUpdate();\n \n this.updateComplete.then(() => {\n this.activateNextAvailableTab();\n });\n }\n\n markDirty(name: string, dirty: boolean): void {\n const tab = this.getTab(name);\n tab!.classList.toggle(\"part-dirty\", dirty);\n }\n\n isDirty(name: string): boolean {\n const tab = this.getTab(name);\n return tab!.classList.contains(\"part-dirty\");\n }\n\n // ============= Private Helper Methods =============\n \n /**\n * Loads tab contributions from the registry.\n */\n private loadAndResolveContributions(): void {\n if (!this.containerId) return;\n this.contributions = contributionRegistry.getContributions(this.containerId) as TabContribution[];\n this.requestUpdate();\n }\n\n /**\n * Cleans up a tab instance when the tab is closed.\n * \n * Cleanup Process:\n * 1. Disconnect ResizeObserver if one exists\n * 2. Call component's close() method if available (disposes resources)\n * 3. DOM element is removed by caller (closeTab method)\n */\n private cleanupTabInstance(tabPanel: HTMLElement): void {\n // Clean up ResizeObserver\n const observer = this.resizeObservers.get(tabPanel);\n if (observer) {\n observer.disconnect();\n this.resizeObservers.delete(tabPanel);\n }\n \n // Explicitly close the component inside the tab before removing\n // This allows components to dispose resources (e.g., Monaco editor models, event listeners)\n const contentDiv = tabPanel.querySelector('.tab-content');\n if (contentDiv && contentDiv.firstElementChild) {\n const component = contentDiv.firstElementChild;\n if ('close' in component && typeof component.close === 'function') {\n component.close();\n }\n }\n }\n\n private activateNextAvailableTab(): void {\n // Guard: Component might not be fully initialized yet\n if (!this.tabGroup.value) return;\n \n const allRemainingTabs = this.tabGroup.value.querySelectorAll(\"wa-tab\");\n if (allRemainingTabs.length > 0) {\n const newActive = allRemainingTabs.item(0).getAttribute(\"panel\");\n if (newActive) {\n this.tabGroup.value.setAttribute(\"active\", newActive);\n }\n } else {\n this.tabGroup.value.removeAttribute(\"active\");\n }\n }\n\n private getTabPanel(name: string): HTMLElement | null {\n if (!this.tabGroup.value) return null;\n return this.tabGroup.value.querySelector(`wa-tab-panel[name='${name}']`) as HTMLElement | null;\n }\n\n private getTab(name: string): HTMLElement | null {\n if (!this.tabGroup.value) return null;\n return this.tabGroup.value.querySelector(`wa-tab[panel='${name}']`) as HTMLElement | null;\n }\n\n /**\n * Updates the toolbar for a tab panel by querying the component for its toolbar content.\n * This allows LyraPart components to provide their own toolbar items directly.\n */\n private updateToolbarFromComponent(tabPanel: HTMLElement): void {\n const contentDiv = tabPanel.querySelector('.tab-content');\n if (!contentDiv || !contentDiv.firstElementChild) return;\n \n const component = contentDiv.firstElementChild;\n if (!(component instanceof LyraPart)) return;\n \n // Check if component has renderToolbar method\n if (!component['renderToolbar']) return;\n \n // Query for lyra-toolbar directly since there's only one per tab panel\n const toolbar = tabPanel.querySelector('lyra-toolbar') as LyraToolbar | null;\n if (toolbar) {\n // Pass a bound render function to maintain component context\n toolbar.partToolbarRenderer = () => component['renderToolbar']();\n toolbar.requestUpdate();\n }\n }\n\n /**\n * Updates the context menu for a tab panel by querying the component for its context menu content.\n * This allows LyraPart components to provide their own context menu items directly.\n */\n private updateContextMenuFromComponent(tabPanel: HTMLElement): void {\n const contentDiv = tabPanel.querySelector('.tab-content');\n if (!contentDiv || !contentDiv.firstElementChild) return;\n \n const component = contentDiv.firstElementChild;\n if (!(component instanceof LyraPart)) return;\n \n // Check if component has renderContextMenu method\n if (!component['renderContextMenu']) return;\n \n // Query for contextmenu directly since there's only one per tab panel\n const contextMenu = tabPanel.querySelector('lyra-contextmenu') as LyraContextMenu | null;\n if (contextMenu) {\n // Pass a bound render function to maintain component context\n contextMenu.partContextMenuRenderer = () => component['renderContextMenu']();\n contextMenu.requestUpdate();\n }\n }\n\n /**\n * Updates the toolbar height CSS variable for calc() positioning.\n */\n private updateToolbarHeightVariable(tabPanel: HTMLElement): void {\n const toolbar = tabPanel.querySelector('.tab-toolbar') as HTMLElement | null;\n if (!toolbar) return;\n \n const toolbarHeight = toolbar.offsetHeight;\n tabPanel.style.setProperty('--toolbar-height', `${toolbarHeight}px`);\n }\n\n /**\n * Sets up a ResizeObserver to update toolbar height variable when toolbar size changes.\n * Reuses existing observer if one already exists for this tab panel.\n */\n private setupToolbarResizeObserver(tabPanel: HTMLElement): void {\n // Check if observer already exists\n if (this.resizeObservers.has(tabPanel)) return;\n \n const toolbar = tabPanel.querySelector('.tab-toolbar') as HTMLElement | null;\n if (!toolbar) return;\n\n const observer = new ResizeObserver(() => {\n this.updateToolbarHeightVariable(tabPanel);\n });\n observer.observe(toolbar);\n this.resizeObservers.set(tabPanel, observer);\n }\n\n // ============= Render Method =============\n\n render() {\n const currentApp = appLoaderService.getCurrentApp();\n \n return html`\n <wa-tab-group ${ref(this.tabGroup)} placement=${this.placement}>\n ${when(\n this.contributions.length === 0,\n () => html`\n <div class=\"empty-state\">\n ${when(\n currentApp,\n () => html`\n <div class=\"empty-content\">\n <h2 class=\"empty-title\">${currentApp!.name}</h2>\n ${when(\n currentApp!.description,\n () => html`<p class=\"empty-description\">${currentApp!.description}</p>`\n )}\n </div>\n `,\n () => html`\n <wa-icon name=\"folder-open\" class=\"empty-icon\"></wa-icon>\n `\n )}\n </div>\n `,\n () => repeat(\n this.contributions,\n (c) => c.name,\n (c) => html`\n <wa-tab panel=\"${c.name}\"\n @auxclick=\"${(e: MouseEvent) => this.handleTabAuxClick(e, c)}\">\n <lyra-icon name=\"${c.icon!}\"></lyra-icon>\n ${c.label}\n ${when(c.closable, () => html`\n <wa-icon name=\"xmark\" label=\"Close\" @click=\"${(e: Event) => this.closeTab(e, c.name)}\"></wa-icon>\n `)}\n </wa-tab>\n <wa-tab-panel name=\"${c.name}\">\n ${when(c.toolbar !== false, () => html`\n <lyra-toolbar id=\"toolbar:${c.editorId ?? c.name}\"\n class=\"tab-toolbar\"\n ?is-editor=\"${this.containerId === EDITOR_AREA_MAIN}\"></lyra-toolbar>\n `)}\n <wa-scroller class=\"tab-content\" orientation=\"vertical\">\n ${c.component ? c.component(c.name) : nothing}\n </wa-scroller>\n ${when(c.contextMenu !== false, () => html`\n <lyra-contextmenu id=\"contextmenu:${c.name}\"\n ?is-editor=\"${this.containerId === EDITOR_AREA_MAIN}\"></lyra-contextmenu>\n `)}\n </wa-tab-panel>\n `\n )\n )}\n </wa-tab-group>\n `;\n }\n\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n }\n\n wa-tab-group {\n height: 100%;\n width: 100%;\n }\n\n wa-tab-group::part(base) {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n height: 100%;\n width: 100%;\n }\n\n wa-tab-panel[active] {\n display: grid;\n grid-template-rows: minmax(0, 1fr);\n height: 100%;\n width: 100%;\n overflow: hidden;\n position: relative;\n }\n\n .tab-content {\n position: absolute;\n top: calc(var(--toolbar-height, 0px));\n right: 0;\n left: 0;\n height: calc(100% - var(--toolbar-height, 0px));\n }\n\n wa-tab::part(base) {\n padding: 3px 0.5rem;\n }\n\n wa-tab-panel {\n --padding: 0px;\n }\n\n .part-dirty::part(base) {\n font-style: italic;\n color: var(--wa-color-danger-fill-loud)\n }\n\n .empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n grid-row: 2;\n }\n\n .empty-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 2rem;\n gap: 0.75rem;\n opacity: 0.3;\n }\n\n .empty-title {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 500;\n color: var(--wa-color-text-quiet);\n }\n\n .empty-description {\n margin: 0;\n font-size: 1rem;\n color: var(--wa-color-text-quiet);\n max-width: 500px;\n }\n\n .empty-icon {\n font-size: 6rem;\n opacity: 0.2;\n color: var(--wa-color-text-quiet);\n }\n `\n}\n","/**\n * LyraResizableGrid - A simple resizable grid layout component\n * \n * Uses CSS Grid with explicit column/row templates and manual resize handles.\n * Much simpler and more predictable than flex-based layouts.\n * \n * Features:\n * - Horizontal or vertical orientation\n * - Custom size distribution via 'sizes' attribute\n * - Interactive resize handles between children\n * - Min size constraints (5% of container)\n * \n * Example usage:\n * <lyra-resizable-grid orientation=\"horizontal\" sizes=\"20%, 60%, 20%\">\n * <div>Left</div>\n * <div>Center</div>\n * <div>Right</div>\n * </lyra-resizable-grid>\n */\nimport {customElement, property, state} from \"lit/decorators.js\";\nimport {html, nothing} from \"lit\";\nimport {LyraElement} from \"./element\";\n\n@customElement('lyra-resizable-grid')\nexport class LyraResizableGrid extends LyraElement {\n @property()\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n @property()\n sizes?: string; // e.g., \"20%, 60%, 20%\"\n\n @state()\n private gridSizes: string[] = [];\n\n @state()\n private gridChildren: HTMLElement[] = [];\n\n private resizing: {\n handleIndex: number;\n startPos: number;\n startSizes: number[];\n currentSizes?: number[];\n } | null = null;\n \n private resizeOverlay: HTMLDivElement | null = null;\n private childrenLoaded = false;\n private childStylesApplied = false;\n private mutationObserver?: MutationObserver;\n private settingsLoaded = false;\n\n createRenderRoot() {\n // intentionally disabling shadow DOM for the resizable grid\n return this;\n }\n\n // ============= Lifecycle Methods =============\n\n protected doBeforeUI() {\n // Only set up observer if children not yet loaded\n if (!this.childrenLoaded) {\n // Use MutationObserver to detect when children are added\n this.mutationObserver = new MutationObserver(() => {\n if (!this.childrenLoaded) {\n this.loadChildren();\n }\n });\n \n this.mutationObserver.observe(this, { childList: true, subtree: false });\n \n // Also try to load immediately\n this.loadChildren();\n }\n }\n\n private async loadChildren() {\n const potentialChildren = Array.from(this.children).filter(\n child => child.tagName !== 'STYLE' && \n child.tagName !== 'SCRIPT' && \n !child.classList.contains('resize-handle')\n ) as HTMLElement[];\n\n if (potentialChildren.length === 0) {\n return;\n }\n\n // Mark as loaded and disconnect observer\n this.childrenLoaded = true;\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = undefined;\n }\n\n // Store children references\n this.gridChildren = potentialChildren;\n\n // Load persisted sizes once if available\n if (!this.settingsLoaded) {\n this.settingsLoaded = true;\n const persisted = await this.getDialogSetting();\n if (persisted && Array.isArray(persisted.sizes) && persisted.sizes.length === this.gridChildren.length) {\n this.gridSizes = persisted.sizes;\n this.requestUpdate();\n return;\n }\n }\n\n // Use sizes attribute or equal distribution (only if not restored from settings)\n if (this.sizes) {\n this.gridSizes = this.sizes.split(',').map(s => s.trim());\n } else {\n const equalSize = `${100 / this.gridChildren.length}%`;\n this.gridSizes = this.gridChildren.map(() => equalSize);\n }\n\n this.requestUpdate();\n }\n\n private async saveSizes() {\n if (this.gridSizes.length === 0) {\n return;\n }\n\n await this.setDialogSetting({\n sizes: this.gridSizes,\n orientation: this.orientation\n });\n }\n\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n \n // Only apply child styles once when children are first loaded\n // This prevents interfering with nested resizable grids during resize operations\n if (changedProperties.has('gridChildren') && !this.childStylesApplied && this.gridChildren.length > 0) {\n this.childStylesApplied = true;\n \n /**\n * Direct style manipulation is intentionally used here.\n * \n * Reasoning:\n * - Grid positioning (gridColumn/gridRow) must be computed dynamically based on\n * the number of children and orientation at runtime\n * - Shadow DOM is disabled (see createRenderRoot), so we cannot use ::slotted()\n * or scoped CSS selectors to style children\n * - CSS classes alone cannot express the dynamic grid positioning logic\n * (e.g., child at index 0 → column 1, index 1 → column 3, etc.)\n * - This is a layout container whose primary job is to programmatically position\n * its children within a CSS grid system\n */\n this.gridChildren.forEach((child, index) => {\n child.style.overflow = 'hidden';\n child.style.height = '100%';\n child.style.width = '100%';\n child.style.gridColumn = this.orientation === 'horizontal' ? `${index * 2 + 1}` : '1';\n child.style.gridRow = this.orientation === 'vertical' ? `${index * 2 + 1}` : '1';\n child.style.display = 'flex';\n child.style.flexDirection = 'column';\n });\n }\n }\n\n // ============= Resize Handling Methods =============\n\n private startResize(e: MouseEvent, handleIndex: number) {\n e.preventDefault();\n \n if (handleIndex >= this.gridChildren.length - 1) return;\n\n const startPos = this.orientation === 'horizontal' ? e.clientX : e.clientY;\n \n // Convert all sizes to pixels at the start of resize\n const containerSize = this.orientation === 'horizontal' \n ? this.offsetWidth \n : this.offsetHeight;\n \n const startSizes = this.gridSizes.map(size => {\n if (size.endsWith('%')) {\n return (parseFloat(size) / 100) * containerSize;\n } else if (size.endsWith('px')) {\n return parseFloat(size);\n } else {\n return parseFloat(size);\n }\n });\n\n this.resizing = {\n handleIndex,\n startPos,\n startSizes\n };\n\n // Create overlay to prevent iframes from capturing mouse events\n this.resizeOverlay = document.createElement('div');\n this.resizeOverlay.style.position = 'fixed';\n this.resizeOverlay.style.top = '0';\n this.resizeOverlay.style.left = '0';\n this.resizeOverlay.style.width = '100%';\n this.resizeOverlay.style.height = '100%';\n this.resizeOverlay.style.zIndex = '9999';\n this.resizeOverlay.style.cursor = this.orientation === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.appendChild(this.resizeOverlay);\n\n document.addEventListener('mousemove', this.handleResize);\n document.addEventListener('mouseup', this.stopResize);\n \n document.body.style.cursor = this.orientation === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }\n\n private handleResize = (e: MouseEvent) => {\n if (!this.resizing) return;\n\n const currentPos = this.orientation === 'horizontal' ? e.clientX : e.clientY;\n const delta = currentPos - this.resizing.startPos;\n\n const newSizes = [...this.resizing.startSizes];\n newSizes[this.resizing.handleIndex] += delta;\n newSizes[this.resizing.handleIndex + 1] -= delta;\n\n // Apply min constraints (5% of container)\n const containerSize = this.orientation === 'horizontal' \n ? this.offsetWidth \n : this.offsetHeight;\n const minSize = containerSize * 0.05;\n\n if (newSizes[this.resizing.handleIndex] >= minSize && \n newSizes[this.resizing.handleIndex + 1] >= minSize) {\n this.resizing.currentSizes = newSizes;\n \n // Update visual preview directly without triggering requestUpdate()\n const gridTemplate = newSizes.map((size, index) => {\n const percent = (size / containerSize) * 100;\n const sizeStr = `${percent.toFixed(2)}%`;\n if (index === newSizes.length - 1) {\n return sizeStr;\n }\n return `${sizeStr} 4px`;\n }).join(' ');\n \n if (this.orientation === 'horizontal') {\n this.style.gridTemplateColumns = gridTemplate;\n } else {\n this.style.gridTemplateRows = gridTemplate;\n }\n }\n }\n\n private stopResize = async () => {\n if (this.resizing?.currentSizes) {\n const containerSize = this.orientation === 'horizontal' \n ? this.offsetWidth \n : this.offsetHeight;\n \n this.gridSizes = this.resizing.currentSizes.map(size => {\n const percent = (size / containerSize) * 100;\n return `${percent.toFixed(2)}%`;\n });\n \n await this.saveSizes();\n this.requestUpdate();\n }\n \n // Remove overlay\n if (this.resizeOverlay) {\n document.body.removeChild(this.resizeOverlay);\n this.resizeOverlay = null;\n }\n \n this.resizing = null;\n document.removeEventListener('mousemove', this.handleResize);\n document.removeEventListener('mouseup', this.stopResize);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n\n // ============= Render Methods =============\n\n render() {\n if (this.gridChildren.length === 0 || this.gridSizes.length === 0) {\n // Show children with default styling while grid is initializing\n return nothing;\n }\n\n // Build grid template with resize handles\n // For 3 children: \"size1 4px size2 4px size3\"\n const gridTemplate = this.gridSizes.flatMap((size, index) => {\n if (index === this.gridSizes.length - 1) {\n return [size];\n }\n return [size, '1px'];\n }).join(' ');\n\n // Apply grid layout to the custom element itself\n this.style.display = 'grid';\n if (this.orientation === 'horizontal') {\n this.style.gridTemplateColumns = gridTemplate;\n this.style.gridTemplateRows = '100%';\n } else {\n this.style.gridTemplateColumns = '100%';\n this.style.gridTemplateRows = gridTemplate;\n }\n this.style.overflow = 'hidden';\n\n // Render resize handles\n // Child styling is applied in updated() when gridChildren/gridSizes change\n return html`\n <style>\n .resize-handle {\n position: relative;\n z-index: 10;\n background-color: var(--wa-color-neutral-border-quiet);\n transition: background-color var(--wa-transition-fast);\n }\n \n .resize-handle:hover {\n background-color: var(--wa-color-brand-fill-normal);\n }\n </style>\n \n ${this.gridChildren.map((_, index) => {\n if (index < this.gridChildren.length - 1) {\n const gridCol = this.orientation === 'horizontal' ? `${index * 2 + 2}` : '1';\n const gridRow = this.orientation === 'vertical' ? `${index * 2 + 2}` : '1';\n return html`\n <div \n class=\"resize-handle\"\n style=\"\n cursor: ${this.orientation === 'horizontal' ? 'col-resize' : 'row-resize'};\n grid-column: ${gridCol};\n grid-row: ${gridRow};\n \"\n @mousedown=${(e: MouseEvent) => this.startResize(e, index)}\n ></div>\n `;\n }\n return nothing;\n })}\n `;\n }\n\n // ============= Cleanup Methods =============\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this.resizing) {\n this.stopResize();\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = undefined;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.style.height = '100%';\n this.style.width = '100%';\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-resizable-grid': LyraResizableGrid\n }\n}\n\n"],"names":["MouseButton","logger","ref","state","__decorateClass","tabPanel","contentDiv"],"mappings":"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"}