@kispace-io/core 0.7.0

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.
Files changed (272) hide show
  1. package/dist/api/base-classes.d.ts +7 -0
  2. package/dist/api/base-classes.d.ts.map +1 -0
  3. package/dist/api/constants.d.ts +2 -0
  4. package/dist/api/constants.d.ts.map +1 -0
  5. package/dist/api/index.d.ts +6 -0
  6. package/dist/api/index.d.ts.map +1 -0
  7. package/dist/api/index.js +80 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/api/services.d.ts +27 -0
  10. package/dist/api/services.d.ts.map +1 -0
  11. package/dist/api/types.d.ts +11 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/commands/files.d.ts +2 -0
  14. package/dist/commands/files.d.ts.map +1 -0
  15. package/dist/commands/global.d.ts +1 -0
  16. package/dist/commands/global.d.ts.map +1 -0
  17. package/dist/commands/index.d.ts +1 -0
  18. package/dist/commands/index.d.ts.map +1 -0
  19. package/dist/commands/version-info.d.ts +2 -0
  20. package/dist/commands/version-info.d.ts.map +1 -0
  21. package/dist/components/index.d.ts +1 -0
  22. package/dist/components/index.d.ts.map +1 -0
  23. package/dist/components/k-app-selector.d.ts +17 -0
  24. package/dist/components/k-app-selector.d.ts.map +1 -0
  25. package/dist/components/k-app-switcher.d.ts +13 -0
  26. package/dist/components/k-app-switcher.d.ts.map +1 -0
  27. package/dist/components/k-command.d.ts +31 -0
  28. package/dist/components/k-command.d.ts.map +1 -0
  29. package/dist/components/k-extensions.d.ts +32 -0
  30. package/dist/components/k-extensions.d.ts.map +1 -0
  31. package/dist/components/k-fastviews.d.ts +34 -0
  32. package/dist/components/k-fastviews.d.ts.map +1 -0
  33. package/dist/components/k-filebrowser.d.ts +40 -0
  34. package/dist/components/k-filebrowser.d.ts.map +1 -0
  35. package/dist/components/k-language-selector.d.ts +12 -0
  36. package/dist/components/k-language-selector.d.ts.map +1 -0
  37. package/dist/components/k-log-terminal.d.ts +36 -0
  38. package/dist/components/k-log-terminal.d.ts.map +1 -0
  39. package/dist/components/k-part-name.d.ts +12 -0
  40. package/dist/components/k-part-name.d.ts.map +1 -0
  41. package/dist/components/k-tasks.d.ts +13 -0
  42. package/dist/components/k-tasks.d.ts.map +1 -0
  43. package/dist/components/k-workspace-name.d.ts +14 -0
  44. package/dist/components/k-workspace-name.d.ts.map +1 -0
  45. package/dist/contributions/default-ui-contributions.d.ts +2 -0
  46. package/dist/contributions/default-ui-contributions.d.ts.map +1 -0
  47. package/dist/contributions/index.d.ts +1 -0
  48. package/dist/contributions/index.d.ts.map +1 -0
  49. package/dist/contributions/marketplace-catalog-contributions.d.ts +2 -0
  50. package/dist/contributions/marketplace-catalog-contributions.d.ts.map +1 -0
  51. package/dist/core/app-host-config.d.ts +7 -0
  52. package/dist/core/app-host-config.d.ts.map +1 -0
  53. package/dist/core/apploader.d.ts +214 -0
  54. package/dist/core/apploader.d.ts.map +1 -0
  55. package/dist/core/appstate.d.ts +12 -0
  56. package/dist/core/appstate.d.ts.map +1 -0
  57. package/dist/core/commandregistry.d.ts +79 -0
  58. package/dist/core/commandregistry.d.ts.map +1 -0
  59. package/dist/core/config.d.ts +15 -0
  60. package/dist/core/config.d.ts.map +1 -0
  61. package/dist/core/constants.d.ts +21 -0
  62. package/dist/core/constants.d.ts.map +1 -0
  63. package/dist/core/contributionregistry.d.ts +49 -0
  64. package/dist/core/contributionregistry.d.ts.map +1 -0
  65. package/dist/core/di.d.ts +18 -0
  66. package/dist/core/di.d.ts.map +1 -0
  67. package/dist/core/dialogservice.d.ts +33 -0
  68. package/dist/core/dialogservice.d.ts.map +1 -0
  69. package/dist/core/editorregistry.d.ts +73 -0
  70. package/dist/core/editorregistry.d.ts.map +1 -0
  71. package/dist/core/esmsh-service.d.ts +40 -0
  72. package/dist/core/esmsh-service.d.ts.map +1 -0
  73. package/dist/core/events.d.ts +7 -0
  74. package/dist/core/events.d.ts.map +1 -0
  75. package/dist/core/events.js +63 -0
  76. package/dist/core/events.js.map +1 -0
  77. package/dist/core/extensionregistry.d.ts +98 -0
  78. package/dist/core/extensionregistry.d.ts.map +1 -0
  79. package/dist/core/filesys.d.ts +139 -0
  80. package/dist/core/filesys.d.ts.map +1 -0
  81. package/dist/core/i18n.d.ts +50 -0
  82. package/dist/core/i18n.d.ts.map +1 -0
  83. package/dist/core/index.d.ts +1 -0
  84. package/dist/core/index.d.ts.map +1 -0
  85. package/dist/core/k-utils.d.ts +2 -0
  86. package/dist/core/k-utils.d.ts.map +1 -0
  87. package/dist/core/keybindings.d.ts +67 -0
  88. package/dist/core/keybindings.d.ts.map +1 -0
  89. package/dist/core/logger.d.ts +44 -0
  90. package/dist/core/logger.d.ts.map +1 -0
  91. package/dist/core/marketplaceregistry.d.ts +25 -0
  92. package/dist/core/marketplaceregistry.d.ts.map +1 -0
  93. package/dist/core/packageinfoservice.d.ts +16 -0
  94. package/dist/core/packageinfoservice.d.ts.map +1 -0
  95. package/dist/core/persistenceservice.d.ts +6 -0
  96. package/dist/core/persistenceservice.d.ts.map +1 -0
  97. package/dist/core/settingsservice.d.ts +19 -0
  98. package/dist/core/settingsservice.d.ts.map +1 -0
  99. package/dist/core/signals.d.ts +3 -0
  100. package/dist/core/signals.d.ts.map +1 -0
  101. package/dist/core/taskservice.d.ts +20 -0
  102. package/dist/core/taskservice.d.ts.map +1 -0
  103. package/dist/core/toast.d.ts +4 -0
  104. package/dist/core/toast.d.ts.map +1 -0
  105. package/dist/core/tree-utils.d.ts +16 -0
  106. package/dist/core/tree-utils.d.ts.map +1 -0
  107. package/dist/dialogs/confirm-dialog.d.ts +14 -0
  108. package/dist/dialogs/confirm-dialog.d.ts.map +1 -0
  109. package/dist/dialogs/index.d.ts +5 -0
  110. package/dist/dialogs/index.d.ts.map +1 -0
  111. package/dist/dialogs/info-dialog.d.ts +13 -0
  112. package/dist/dialogs/info-dialog.d.ts.map +1 -0
  113. package/dist/dialogs/navigable-info-dialog.d.ts +33 -0
  114. package/dist/dialogs/navigable-info-dialog.d.ts.map +1 -0
  115. package/dist/dialogs/prompt-dialog.d.ts +21 -0
  116. package/dist/dialogs/prompt-dialog.d.ts.map +1 -0
  117. package/dist/externals/lit.d.ts +20 -0
  118. package/dist/externals/lit.d.ts.map +1 -0
  119. package/dist/externals/lit.js +15 -0
  120. package/dist/externals/lit.js.map +1 -0
  121. package/dist/externals/third-party.d.ts +7 -0
  122. package/dist/externals/third-party.d.ts.map +1 -0
  123. package/dist/externals/third-party.js +2 -0
  124. package/dist/externals/third-party.js.map +1 -0
  125. package/dist/externals/webawesome.d.ts +1 -0
  126. package/dist/externals/webawesome.d.ts.map +1 -0
  127. package/dist/externals/webawesome.js +52 -0
  128. package/dist/externals/webawesome.js.map +1 -0
  129. package/dist/i18n/extensions.json.d.ts +42 -0
  130. package/dist/i18n/fastviews.json.d.ts +13 -0
  131. package/dist/i18n/filebrowser.json.d.ts +35 -0
  132. package/dist/i18n/index.d.ts +2 -0
  133. package/dist/i18n/index.d.ts.map +1 -0
  134. package/dist/i18n/logterminal.json.d.ts +45 -0
  135. package/dist/i18n/partname.json.d.ts +15 -0
  136. package/dist/i18n/tasks.json.d.ts +15 -0
  137. package/dist/i18n/workspace.json.d.ts +15 -0
  138. package/dist/index.d.ts +2 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +80 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/k-icon-BZC7dQV0.js +492 -0
  143. package/dist/k-icon-BZC7dQV0.js.map +1 -0
  144. package/dist/k-nocontent-Bh_yToGh.js +48 -0
  145. package/dist/k-nocontent-Bh_yToGh.js.map +1 -0
  146. package/dist/k-resizable-grid-Ch3iWZaL.js +3157 -0
  147. package/dist/k-resizable-grid-Ch3iWZaL.js.map +1 -0
  148. package/dist/k-standard-layout-CQ1VZoxa.js +5011 -0
  149. package/dist/k-standard-layout-CQ1VZoxa.js.map +1 -0
  150. package/dist/layouts/k-standard-layout.d.ts +16 -0
  151. package/dist/layouts/k-standard-layout.d.ts.map +1 -0
  152. package/dist/parts/index.d.ts +1 -0
  153. package/dist/parts/index.d.ts.map +1 -0
  154. package/dist/parts/index.js +53 -0
  155. package/dist/parts/index.js.map +1 -0
  156. package/dist/parts/k-app.d.ts +11 -0
  157. package/dist/parts/k-app.d.ts.map +1 -0
  158. package/dist/parts/k-container.d.ts +4 -0
  159. package/dist/parts/k-container.d.ts.map +1 -0
  160. package/dist/parts/k-contextmenu.d.ts +38 -0
  161. package/dist/parts/k-contextmenu.d.ts.map +1 -0
  162. package/dist/parts/k-dialog-content.d.ts +9 -0
  163. package/dist/parts/k-dialog-content.d.ts.map +1 -0
  164. package/dist/parts/k-element.d.ts +36 -0
  165. package/dist/parts/k-element.d.ts.map +1 -0
  166. package/dist/parts/k-part.d.ts +96 -0
  167. package/dist/parts/k-part.d.ts.map +1 -0
  168. package/dist/parts/k-resizable-grid.d.ts +31 -0
  169. package/dist/parts/k-resizable-grid.d.ts.map +1 -0
  170. package/dist/parts/k-tabs.d.ts +74 -0
  171. package/dist/parts/k-tabs.d.ts.map +1 -0
  172. package/dist/parts/k-toolbar.d.ts +21 -0
  173. package/dist/parts/k-toolbar.d.ts.map +1 -0
  174. package/dist/widgets/index.d.ts +1 -0
  175. package/dist/widgets/index.d.ts.map +1 -0
  176. package/dist/widgets/index.js +3 -0
  177. package/dist/widgets/index.js.map +1 -0
  178. package/dist/widgets/k-icon.d.ts +10 -0
  179. package/dist/widgets/k-icon.d.ts.map +1 -0
  180. package/dist/widgets/k-nocontent.d.ts +13 -0
  181. package/dist/widgets/k-nocontent.d.ts.map +1 -0
  182. package/dist/widgets/k-widget.d.ts +25 -0
  183. package/dist/widgets/k-widget.d.ts.map +1 -0
  184. package/package.json +81 -0
  185. package/src/api/base-classes.ts +10 -0
  186. package/src/api/constants.ts +3 -0
  187. package/src/api/index.ts +31 -0
  188. package/src/api/services.ts +52 -0
  189. package/src/api/types.ts +46 -0
  190. package/src/commands/files.ts +829 -0
  191. package/src/commands/global.ts +225 -0
  192. package/src/commands/index.ts +4 -0
  193. package/src/commands/version-info.ts +214 -0
  194. package/src/components/index.ts +10 -0
  195. package/src/components/k-app-selector.ts +233 -0
  196. package/src/components/k-app-switcher.ts +126 -0
  197. package/src/components/k-command.ts +236 -0
  198. package/src/components/k-extensions.ts +615 -0
  199. package/src/components/k-fastviews.ts +314 -0
  200. package/src/components/k-filebrowser.ts +442 -0
  201. package/src/components/k-language-selector.ts +166 -0
  202. package/src/components/k-log-terminal.ts +337 -0
  203. package/src/components/k-part-name.ts +54 -0
  204. package/src/components/k-tasks.ts +267 -0
  205. package/src/components/k-workspace-name.ts +56 -0
  206. package/src/contributions/default-ui-contributions.ts +51 -0
  207. package/src/contributions/index.ts +3 -0
  208. package/src/contributions/marketplace-catalog-contributions.ts +6 -0
  209. package/src/core/app-host-config.ts +23 -0
  210. package/src/core/apploader.ts +630 -0
  211. package/src/core/appstate.ts +15 -0
  212. package/src/core/commandregistry.ts +210 -0
  213. package/src/core/config.ts +29 -0
  214. package/src/core/constants.ts +27 -0
  215. package/src/core/contributionregistry.ts +77 -0
  216. package/src/core/di.ts +54 -0
  217. package/src/core/dialogservice.ts +266 -0
  218. package/src/core/editorregistry.ts +303 -0
  219. package/src/core/esmsh-service.ts +404 -0
  220. package/src/core/events.ts +68 -0
  221. package/src/core/extensionregistry.ts +399 -0
  222. package/src/core/filesys.ts +618 -0
  223. package/src/core/i18n.ts +221 -0
  224. package/src/core/index.ts +51 -0
  225. package/src/core/k-utils.ts +11 -0
  226. package/src/core/keybindings.ts +274 -0
  227. package/src/core/logger.ts +187 -0
  228. package/src/core/marketplaceregistry.ts +197 -0
  229. package/src/core/packageinfoservice.ts +56 -0
  230. package/src/core/persistenceservice.ts +15 -0
  231. package/src/core/settingsservice.ts +70 -0
  232. package/src/core/signals.ts +18 -0
  233. package/src/core/taskservice.ts +72 -0
  234. package/src/core/toast.ts +11 -0
  235. package/src/core/tree-utils.ts +24 -0
  236. package/src/dialogs/confirm-dialog.ts +72 -0
  237. package/src/dialogs/index.ts +4 -0
  238. package/src/dialogs/info-dialog.ts +67 -0
  239. package/src/dialogs/navigable-info-dialog.ts +256 -0
  240. package/src/dialogs/prompt-dialog.ts +123 -0
  241. package/src/externals/lit.ts +26 -0
  242. package/src/externals/third-party.ts +9 -0
  243. package/src/externals/webawesome.ts +54 -0
  244. package/src/i18n/extensions.json +39 -0
  245. package/src/i18n/fastviews.json +10 -0
  246. package/src/i18n/filebrowser.json +33 -0
  247. package/src/i18n/index.ts +25 -0
  248. package/src/i18n/logterminal.json +42 -0
  249. package/src/i18n/partname.json +12 -0
  250. package/src/i18n/tasks.json +12 -0
  251. package/src/i18n/workspace.json +12 -0
  252. package/src/icons/icons.txt +3 -0
  253. package/src/icons/js.svg +6 -0
  254. package/src/icons/jupyter.svg +18 -0
  255. package/src/icons/python.svg +15 -0
  256. package/src/index.ts +3 -0
  257. package/src/layouts/k-standard-layout.ts +174 -0
  258. package/src/parts/index.ts +6 -0
  259. package/src/parts/k-app.ts +29 -0
  260. package/src/parts/k-container.ts +4 -0
  261. package/src/parts/k-contextmenu.ts +245 -0
  262. package/src/parts/k-dialog-content.ts +31 -0
  263. package/src/parts/k-element.ts +100 -0
  264. package/src/parts/k-part.ts +158 -0
  265. package/src/parts/k-resizable-grid.ts +366 -0
  266. package/src/parts/k-tabs.ts +574 -0
  267. package/src/parts/k-toolbar.ts +158 -0
  268. package/src/vite-env.d.ts +2 -0
  269. package/src/widgets/index.ts +2 -0
  270. package/src/widgets/k-icon.ts +39 -0
  271. package/src/widgets/k-nocontent.ts +40 -0
  272. package/src/widgets/k-widget.ts +90 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k-resizable-grid-Ch3iWZaL.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/parts/k-element.ts","../src/parts/k-dialog-content.ts","../src/core/dialogservice.ts","../src/parts/k-container.ts","../src/parts/k-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/k-app.ts","../src/parts/k-toolbar.ts","../src/parts/k-contextmenu.ts","../src/parts/k-tabs.ts","../src/parts/k-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\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 {get, set} from 'idb-keyval';\nimport {rootContext} from \"./di\";\n\nexport class PersistenceService {\n async persistObject(key: string, value: any) {\n return set(key, value);\n }\n\n async getObject(key: string): Promise<any> {\n return get(key)\n }\n}\n\nexport const persistenceService = new PersistenceService()\nrootContext.put(\"persistenceService\", persistenceService)","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\nclass SettingsService {\n\n private appSettings?: AppSettings;\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 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)","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., \"system.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: [\"system.pythonruntime\"]\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 system.pythonruntime first\n * await extensionRegistry.load('system.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');","import {KWidget} from \"../widgets/k-widget\";\nimport {appSettings} from \"../core/settingsservice\";\n\nexport abstract class KElement extends KWidget {\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 { KElement } from \"./k-element\";\n\nexport abstract class KDialogContent extends KElement {\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 { KDialogContent } from \"../parts/k-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) {\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: KDialogContent | 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 KDialogContent) {\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 {KElement} from \"./k-element\";\n\nexport abstract class KContainer extends KElement {\n}","import {KContainer} from \"./k-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 KPart extends KContainer {\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 (k-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 (k-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 KPart)\n partDirtySignal.set(this)\n activePartSignal.set(null as unknown as KPart)\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. \"k-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 k-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`<k-standard-layout></k-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 { KDialogContent } from \"../parts/k-dialog-content\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { DIALOG_CONTRIBUTION_TARGET, OK_BUTTON, CANCEL_BUTTON, DialogContribution, dialogService } from \"../core/dialogservice\";\n\n@customElement('k-prompt-dialog-content')\nexport class KPromptDialogContent extends KDialogContent {\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 ...KDialogContent.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 'k-prompt-dialog-content': KPromptDialogContent;\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 <k-prompt-dialog-content \n .message=\"${state.message}\"\n .defaultValue=\"${state.defaultValue}\"\n .markdown=\"${state.markdown}\"\n ></k-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 { KDialogContent } from \"../parts/k-dialog-content\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { DIALOG_CONTRIBUTION_TARGET, OK_BUTTON, DialogContribution, dialogService } from \"../core/dialogservice\";\n\n@customElement('k-info-dialog-content')\nexport class KInfoDialogContent extends KDialogContent {\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 'k-info-dialog-content': KInfoDialogContent;\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 <k-info-dialog-content \n .message=\"${state.message}\"\n .markdown=\"${state.markdown}\"\n ></k-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 { KDialogContent } from \"../parts/k-dialog-content\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { DIALOG_CONTRIBUTION_TARGET, OK_BUTTON, CANCEL_BUTTON, DialogContribution, dialogService } from \"../core/dialogservice\";\n\n@customElement('k-confirm-dialog-content')\nexport class KConfirmDialogContent extends KDialogContent {\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 'k-confirm-dialog-content': KConfirmDialogContent;\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 <k-confirm-dialog-content \n .message=\"${state.message}\"\n .markdown=\"${state.markdown}\"\n ></k-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 { KDialogContent } from \"../parts/k-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('k-navigable-info-dialog-content')\nexport class KNavigableInfoDialogContent extends KDialogContent {\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 ...KDialogContent.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 'k-navigable-info-dialog-content': KNavigableInfoDialogContent;\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 <k-navigable-info-dialog-content \n .title=\"${state.title}\"\n .message=\"${state.message}\"\n .markdown=\"${state.markdown}\"\n ></k-navigable-info-dialog-content>\n `;\n \n (async () => {\n const element = document.querySelector('k-navigable-info-dialog-content') as KNavigableInfoDialogContent;\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} from 'lit/decorators.js'\nimport {KElement} from \"./k-element\";\n\n@customElement('k-app')\nexport class KApp extends KElement {\n render() {\n return html`\n <slot></slot>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n width: 100%;\n box-sizing: border-box;\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-app': KApp\n }\n}\n","import {css, html} from 'lit'\nimport {customElement, property, state} from 'lit/decorators.js'\nimport {KElement} from \"./k-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\n@customElement('k-toolbar')\nexport class KToolbar extends KElement {\n @property()\n private position: \"start\" | \"center\" | \"end\" = \"start\";\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 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 contributionCreator(contribution: Contribution) {\n if (\"command\" in contribution) {\n const commandContribution = contribution as CommandContribution\n const showLabel = !!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=\"small\">\n <wa-icon name=${commandContribution.icon} label=\"${commandContribution.label}\"></wa-icon>\n ${showLabel ? commandContribution.label : ''}\n </wa-button>\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 } else {\n return html`<span>unknown contribution type: ${typeof contribution}</span>`\n }\n }\n\n render() {\n const partContent = this.partToolbarRenderer ? this.partToolbarRenderer() : \n (this.partToolbarContent ? this.partToolbarContent : '');\n \n return html`\n <div class=\"toolbar-items\" style=${styleMap({\"justify-content\": this.position})}>\n <slot name=\"start\">\n ${this.contributions.filter(c => c.slot === \"start\").map(this.contributionCreator.bind(this))}\n </slot>\n ${partContent}\n ${this.contributions.filter(c => c.slot === undefined).map(this.contributionCreator.bind(this))}\n <slot>\n </slot>\n <slot name=\"end\">\n ${this.contributions.filter(c => c.slot === \"end\").map(this.contributionCreator.bind(this))}\n </slot>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: row;\n }\n\n .toolbar-items {\n display: flex;\n flex: 1;\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-toolbar': KToolbar\n }\n}\n","import {css, html, nothing} from 'lit'\nimport {customElement, property, state} from 'lit/decorators.js'\nimport {KElement} from \"./k-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\";\n\n@customElement('k-contextmenu')\nexport class KContextMenu extends KElement {\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 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 // Trigger click before showing context menu to update selection\n if (mouseEvent) {\n this.triggerClickUnderCursor(mouseEvent);\n }\n \n this.position = position;\n this.isOpen = true;\n }\n\n private onClose() {\n this.isOpen = false;\n }\n\n private handleCommandClick(commandId: string, params?: Record<string, any>) {\n return async () => {\n this.executeCommand(commandId, params || {});\n };\n }\n\n private renderContribution(contribution: Contribution) {\n if (\"command\" in contribution) {\n const commandContribution = contribution as CommandContribution;\n return html`\n <wa-dropdown-item \n @click=${this.handleCommandClick(commandContribution.command, commandContribution.params)}\n ?disabled=\"${(commandContribution.disabled as Signal.Computed<boolean>)?.get()}\">\n ${commandContribution.icon ? html`<wa-icon slot=\"icon\" name=${commandContribution.icon}></wa-icon>` : ''}\n ${commandContribution.label}\n </wa-dropdown-item>\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 placement=\"bottom-start\"\n distance=\"0\">\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(panel) {\n min-width: 200px;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-contextmenu': KContextMenu\n }\n}\n\n","import {customElement, state} from \"lit/decorators.js\";\nimport {css, html, nothing} from \"lit\";\nimport {KContainer} from \"./k-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/k-icon';\nimport {createRef, ref} from \"lit/directives/ref.js\";\nimport {subscribe} from \"../core/events\";\nimport {KPart} from \"./k-part\";\nimport {KToolbar} from \"./k-toolbar\";\nimport {KContextMenu} from \"./k-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 * KTabs - 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('k-tabs')\nexport class KTabs extends KContainer {\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(\"k-tabs requires an 'id' attribute to function\");\n }\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 KPart) {\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 KPart) {\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('k-contextmenu') as KContextMenu;\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 KPart) {\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 KPart) {\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 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 KPart 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 KPart)) return;\n \n // Check if component has renderToolbar method\n if (!component['renderToolbar']) return;\n \n // Query for k-toolbar directly since there's only one per tab panel\n const toolbar = tabPanel.querySelector('k-toolbar') as KToolbar | 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 KPart 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 KPart)) return;\n \n // Check if component has renderContextMenu method\n if (!component['renderContextMenu']) return;\n \n // Query for k-contextmenu directly since there's only one per tab panel\n const contextMenu = tabPanel.querySelector('k-contextmenu') as KContextMenu | 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)}>\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 <k-icon name=\"${c.icon!}\"></k-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 <k-toolbar id=\"toolbar:${c.editorId ?? c.name}\" \n class=\"tab-toolbar\"\n ?is-editor=\"${this.containerId === EDITOR_AREA_MAIN}\"></k-toolbar>\n <wa-scroller class=\"tab-content\" orientation=\"vertical\">\n ${c.component ? c.component(c.name) : nothing}\n </wa-scroller>\n <k-contextmenu id=\"contextmenu:${c.name}\"\n ?is-editor=\"${this.containerId === EDITOR_AREA_MAIN}\"></k-contextmenu>\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 * KResizableGrid - 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 * <k-resizable-grid orientation=\"horizontal\" sizes=\"20%, 60%, 20%\">\n * <div>Left</div>\n * <div>Center</div>\n * <div>Right</div>\n * </k-resizable-grid>\n */\nimport {customElement, property, state} from \"lit/decorators.js\";\nimport {html, nothing} from \"lit\";\nimport {KElement} from \"./k-element\";\n\n@customElement('k-resizable-grid')\nexport class KResizableGrid extends KElement {\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, '4px'];\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 'k-resizable-grid': KResizableGrid\n }\n}\n\n"],"names":["MouseButton","logger","ref","state","__decorateClass","tabPanel","contentDiv"],"mappings":"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"}